static void input_chk_hardreset(unsigned int code, int value) { static int key1=0, key2=0, key3=0; if(value) { if(code==KERNEL_SEC_HARDRESET_KEY1) key1 = 1; else if(code==KERNEL_SEC_HARDRESET_KEY2) key2 = 1; else if(code==KERNEL_SEC_HARDRESET_KEY3) key3 = 1; if(key1 && key2 && key3){ kernel_sec_hw_reset(true); //reboot(LINUX_REBOOT_CMD_RESTART); } } else { if(code==KERNEL_SEC_HARDRESET_KEY1) key1 = 0; else if(code==KERNEL_SEC_HARDRESET_KEY2) key2 = 0; else if(code==KERNEL_SEC_HARDRESET_KEY3) key3 = 0; } }
void enter_upload_mode(unsigned long val) { bool uploadmode = true; int i; // not to enter forced upload mode in boot PARAM_LOW if( KERNEL_SEC_DEBUG_LEVEL_LOW == kernel_sec_get_debug_level() ) return; for (i = 0; i < g_pdata->nbuttons; i++) { struct gpio_keys_button *button = &g_pdata->buttons[i]; if(gpio_get_value(button->gpio)) { uploadmode = false; break; } } if(uploadmode) { if (kernel_sec_viraddr_wdt_reset_reg) { //dump_debug_info_forced_ramd_dump(); #ifdef CONFIG_KERNEL_DEBUG_SEC #ifdef CONFIG_TARGET_LOCALE_KOR local_irq_disable(); local_fiq_disable(); #endif /* CONFIG_TARGET_LOCALE_KOR */ #endif /* CONFIG_KERNEL_DEBUG_SEC */ kernel_sec_set_cp_upload(); kernel_sec_save_final_context(); // Save theh final context. kernel_sec_set_upload_cause(UPLOAD_CAUSE_FORCED_UPLOAD); kernel_sec_hw_reset(false); // Reboot. } } }
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { unsigned long flags; /* * Forced upload mode key string (tkhwang) */ #ifdef CONFIG_KERNEL_DEBUG_SEC static bool first=0, second=0, third = 0; #if defined (CONFIG_KEYPAD_S3C) if(strcmp(dev->name,"s3c-keypad")==0) { if(value) { if(code==KERNEL_SEC_FORCED_UPLOAD_1ST_KEY) { first =1; } if(first==1 && code==KERNEL_SEC_FORCED_UPLOAD_2ND_KEY) { if ( (KERNEL_SEC_DEBUG_LEVEL_MID == kernel_sec_get_debug_level()) || KERNEL_SEC_DEBUG_LEVEL_HIGH == kernel_sec_get_debug_level() ) { // Display the working callstack for the debugging. dump_stack(); if (kernel_sec_viraddr_wdt_reset_reg) { kernel_sec_set_cp_upload(); kernel_sec_save_final_context(); // Save theh final context. kernel_sec_set_upload_cause(UPLOAD_CAUSE_FORCED_UPLOAD); kernel_sec_hw_reset(false); // Reboot. } } } } else { if(code==KERNEL_SEC_FORCED_UPLOAD_1ST_KEY) { first = 0; } } } #endif //CONFIG_KEYPAD_S3C #if defined (CONFIG_KEYBOARD_GPIO) if(strcmp(dev->name,"gpio-keys")==0) { if(value) { if(code == KEY_VOLUMEUP) first = true; if(code == KEY_POWER) second = true; if(code == KEY_VOLUMEDOWN) third = true; if(first&&second&&third) { if (kernel_sec_viraddr_wdt_reset_reg) { printk("[%s][line:%d]\n",__func__, __LINE__); kernel_sec_set_cp_upload(); kernel_sec_save_final_context(); // Save theh final context. kernel_sec_set_upload_cause(UPLOAD_CAUSE_FORCED_UPLOAD); kernel_sec_hw_reset(false); // Reboot. } } } else { if(code == KEY_VOLUMEUP) first = false; if(code == KEY_POWER) second = false; if(code == KEY_VOLUMEDOWN) third = false; } } #endif //CONFIG_KEYBOARD_GPIO #endif // CONFIG_KERNEL_DEBUG_SEC if (is_event_supported(type, dev->evbit, EV_MAX)) { spin_lock_irqsave(&dev->event_lock, flags); add_input_randomness(type, code, value); input_handle_event(dev, type, code, value); spin_unlock_irqrestore(&dev->event_lock, flags); } }
void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value) { unsigned long flags; /* * Forced upload mode key string (tkhwang) */ #ifdef CONFIG_KERNEL_DEBUG_SEC static int first=0, second=0; if(strcmp(dev->name,"s3c-keypad")==0) { if(value) { if(code==KERNEL_SEC_FORCED_UPLOAD_1ST_KEY) { first =1; } if(first==1 && code==KERNEL_SEC_FORCED_UPLOAD_2ND_KEY) { printk(KERN_ERR"level %d reg %x \n",kernel_sec_get_debug_level(), kernel_sec_viraddr_wdt_reset_reg); if ( (KERNEL_SEC_DEBUG_LEVEL_MID == kernel_sec_get_debug_level()) || KERNEL_SEC_DEBUG_LEVEL_HIGH == kernel_sec_get_debug_level() ) { printk(KERN_ERR" USER Press volume key + Power key ==> Force RAM DUMP \n"); #if 0 // Display the working callstack for the debugging. dump_stack(); if (kernel_sec_viraddr_wdt_reset_reg) { kernel_sec_set_cp_upload(); kernel_sec_save_final_context(); // Save theh final context. kernel_sec_set_upload_cause(UPLOAD_CAUSE_FORCED_UPLOAD); kernel_sec_hw_reset(false); // Reboot. } #endif } } } else { if(code==KERNEL_SEC_FORCED_UPLOAD_1ST_KEY) { first = 0; } } } #endif // CONFIG_KERNEL_DEBUG_SEC if (is_event_supported(type, dev->evbit, EV_MAX)) { spin_lock_irqsave(&dev->event_lock, flags); add_input_randomness(type, code, value); input_handle_event(dev, type, code, value); spin_unlock_irqrestore(&dev->event_lock, flags); } }
static void keypad_timer_handler(unsigned long data) { u32 press_mask; u32 release_mask; u32 restart_timer = 0; int i,col; struct s3c_keypad *pdata = (struct s3c_keypad *)data; struct input_dev *dev = pdata->dev; keypad_scan(); for(col=0; col < KEYPAD_COLUMNS; col++) { press_mask = ((keymask[col] ^ prevmask[col]) & keymask[col]); release_mask = ((keymask[col] ^ prevmask[col]) & prevmask[col]); #ifdef CONFIG_CPU_FREQ #if USE_PERF_LEVEL_KEYPAD if (press_mask || release_mask) set_dvfs_target_level(LEV_400MHZ); #endif #endif i = col * KEYPAD_ROWS; while (press_mask) { if (press_mask & 1) { if(s3ckeypad_evt_enable_status){ //NAGSM_Android_SEL_Kernel_Aakash_20100319 #if defined(CONFIG_KEPLER_VER_B2) || defined(CONFIG_KEPLER_VER_B4) || defined(CONFIG_T959_VER_B5)|| defined (CONFIG_S5PC110_VIBRANTPLUS_BOARD) if((i != 1) && (i !=2)){ input_report_key(dev,pdata->keycodes[i],1); printk("\nkey Pressed : key %d map %d\n",i, pdata->keycodes[i]); } #elif defined(CONFIG_HAWK_VER_B0) if((i != 0) && (i !=1) && (i != 2) && (i !=3) ){ input_report_key(dev,pdata->keycodes[i],1); printk("\nkey Pressed : key %d map %d\n",i, pdata->keycodes[i]); } #else input_report_key(dev,pdata->keycodes[i],1); printk("\nkey Pressed : key %d map %d\n",i, pdata->keycodes[i]); #endif } } press_mask >>= 1; i++; } i = col * KEYPAD_ROWS; while (release_mask) { if (release_mask & 1) { if(s3ckeypad_evt_enable_status){ //NAGSM_Android_SEL_Kernel_Aakash_20100319 #if defined(CONFIG_KEPLER_VER_B2) || defined(CONFIG_KEPLER_VER_B4) || defined(CONFIG_T959_VER_B5) || defined(CONFIG_HAWK_VER_B0)|| defined (CONFIG_S5PC110_VIBRANTPLUS_BOARD) if((i != 1) && (i !=2)){ input_report_key(dev,pdata->keycodes[i],0); printk("\nkey Released : %d map %d\n",i,pdata->keycodes[i]); } #else input_report_key(dev,pdata->keycodes[i],0); printk("\nkey Released : %d map %d\n",i,pdata->keycodes[i]); #endif } #ifdef CONFIG_KERNEL_DEBUG_SEC #if defined(CONFIG_S5PC110_KEPLER_BOARD) || defined(CONFIG_S5PC110_FLEMING_BOARD) || defined(CONFIG_T959_VER_B5) || defined(CONFIG_HAWK_VER_B0) || defined (CONFIG_S5PC110_VIBRANTPLUS_BOARD) #if defined(CONFIG_KEPLER_VER_B2) || defined(CONFIG_KEPLER_VER_B4) || defined(CONFIG_T959_VER_B5) || defined(CONFIG_HAWK_VER_B0) || defined (CONFIG_S5PC110_VIBRANTPLUS_BOARD) if((i != 1) && (i !=2)){ dump_mode_key_sequence[dump_mode_key_count%DUMP_SEQUENCE_COUNT] = i; dump_mode_key_count++; } #endif #if defined(CONFIG_KEPLER_VER_B0) dump_mode_key_sequence[dump_mode_key_count%DUMP_SEQUENCE_COUNT] = i; dump_mode_key_count++; #endif { // check time inverval between force upload key sequence input int this_cpu; this_cpu = smp_processor_id(); unsigned long nanosec_rem; dump_mode_key_pressed = cpu_clock(this_cpu); nanosec_rem = do_div(dump_mode_key_pressed, 1000000000); if ((dump_mode_key_pressed-dump_mode_key_pressed_prev>=2) && dump_mode_key_pressed_prev!=0) { forced_dump_time_limit=1; printk("force upload long time : %ul\n ", dump_mode_key_pressed-dump_mode_key_pressed_prev); } dump_mode_key_pressed_prev=dump_mode_key_pressed; } if(i == PRESSED_DOWN){ if(is_first_key_down == 1) { // when down key is pressed twice, will check whether pressed keys are same as dump seqence is_dump_sequence = 0; //for(dump_compare_count=0; dump_compare_count<DUMP_SEQUENCE_COUNT; dump_compare_count++) //printk("dump_mode_key_sequence[%d] : %d\n",(dump_mode_key_count + dump_compare_count)%DUMP_SEQUENCE_COUNT, dump_mode_key_sequence[(dump_mode_key_count + dump_compare_count)%DUMP_SEQUENCE_COUNT]); for(dump_compare_count=0; dump_compare_count<DUMP_SEQUENCE_COUNT; dump_compare_count++) { //printk("forced_dump_sequence[%d] : %d, dump_mode_key_sequence[%d] : %d\n",dump_compare_count, forced_dump_sequence[dump_compare_count],(dump_mode_key_count + dump_compare_count)%DUMP_SEQUENCE_COUNT, dump_mode_key_sequence[(dump_mode_key_count + dump_compare_count)%DUMP_SEQUENCE_COUNT]); if(forced_dump_sequence[dump_compare_count] == dump_mode_key_sequence[((dump_mode_key_count + dump_compare_count) % DUMP_SEQUENCE_COUNT)]){ is_dump_sequence++; continue; }else { //printk("This is not dump sequence.\n"); is_dump_sequence = 0; break; } } if(is_dump_sequence == DUMP_SEQUENCE_COUNT) { if (forced_dump_time_limit==1) { // case of long time between force upload key sequence forced_dump_time_limit=0; is_dump_sequence=0; dump_mode_key_pressed_prev=0; printk("Dump Mode Fail\n"); } else { if( (KERNEL_SEC_DEBUG_LEVEL_MID == kernel_sec_get_debug_level()) || (KERNEL_SEC_DEBUG_LEVEL_HIGH == kernel_sec_get_debug_level()) ) { printk("Now going to Dump Mode\n"); if (kernel_sec_viraddr_wdt_reset_reg) { kernel_sec_set_cp_upload(); kernel_sec_save_final_context(); // Save theh final context. kernel_sec_set_upload_cause(UPLOAD_CAUSE_FORCED_UPLOAD); kernel_sec_hw_reset(FALSE); // Reboot. } } } } }else{ is_first_key_down = 1; } }else{ #if defined(CONFIG_KEPLER_VER_B2) || defined(CONFIG_KEPLER_VER_B4) || defined(CONFIG_T959_VER_B5) || defined(CONFIG_HAWK_VER_B0)|| defined (CONFIG_S5PC110_VIBRANTPLUS_BOARD) if((i != 1) && (i !=2)){ is_first_key_down = 0; } #endif #if defined(CONFIG_KEPLER_VER_B0) is_first_key_down = 0; #endif } #endif #endif } release_mask >>= 1; i++; } prevmask[col] = keymask[col]; restart_timer |= keymask[col]; } if (restart_timer) { mod_timer(&keypad_timer,jiffies + HZ/10); } else { writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON); is_timer_on = FALSE; } }
static void keypad_timer_handler(unsigned long data) { struct s3c_keypad *s3c_keypad = (struct s3c_keypad *)data; u32 keymask_low = 0, keymask_high = 0; keypad_scan(&keymask_low, &keymask_high); process_special_key(s3c_keypad, keymask_low, keymask_high); #ifdef CONFIG_KERNEL_DEBUG_SEC // DPRINTK("%s L(0x%x) H(0x%x)\n", __func__, keymask_low, keymask_high); #if defined (CONFIG_MACH_MAX) if(keymask_low == 0x10202) // vol down key + ok key + camera Key #elif defined (CONFIG_MACH_VITAL) if(keymask_high == 0x1000100) // vol down key (0x1000000) + voice key (0x100) #else /* CONFIG_MACH_VINSQ */ if((keymask_low == 0x1) && (keymask_high == 0x100)) // vol down key + ok key #endif { #if defined (DEVELOPE_RELEASE) if (kernel_sec_viraddr_wdt_reset_reg) { kernel_sec_save_final_context(); // Save the final context. kernel_sec_set_upload_cause(UPLOAD_CAUSE_FORCED_UPLOAD); kernel_sec_hw_reset(FALSE); // Reboot. } #endif } else #endif #if defined (CONFIG_MACH_MAX) // Requested by QA // CAM_FULL : keymask_low = 0x30000 // VOLUME_UP : keymask_low = 0x100 // VOLUME_DOWN : keymask_low = 0x200 if((keymask_low == 0x30300) && power_key_pressed) #elif defined (CONFIG_MACH_VITAL) // CAM_FULL : keymask_low = 0x1010000 // VOLUME_UP : keymask_low = 0x1 if((keymask_low == 0x1010001) && power_key_pressed) #else /* CONFIG_MACH_VINSQ */ // CAM_FULL : keymask_low = 0x1010000 // VOLUME_UP : keymask_high = 0x1000000 if((keymask_low == 0x1010000) && (keymask_high == 0x1000000) && power_key_pressed) #endif { kernel_sec_set_upload_cause(UPLOAD_CAUSE_INIT); kernel_sec_hw_reset(FALSE); // Reboot. } if (keymask_low != prevmask_low) { process_input_report (s3c_keypad, prevmask_low, keymask_low, 0); prevmask_low = keymask_low; } #if (KEYPAD_COLUMNS>4) if (keymask_high != prevmask_high) { process_input_report (s3c_keypad, prevmask_high, keymask_high, 32); prevmask_high = keymask_high; } #endif if (keymask_low | keymask_high) { mod_timer(&keypad_timer,jiffies + SCAN_INTERVAL); } else { writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON); } }