示例#1
0
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;
	}

}
示例#2
0
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 1
    if((dev->name) != 0) {  //suik_Check

#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 // # if 1

#endif // CONFIG_KERNEL_DEBUG_SEC

#ifdef DISCARD_SMILE_KEY
    if((dev->name) != 0) {  //suik_Check

        if(strcmp(dev->name,"s3c-keypad")==0)
        {
    
            //discard a key
            if(input_chk_discard(code, value)){
                return;
            }
        }
    }
#endif

#ifdef USE_PSEUDO_HARD_RESET
    if((dev->name) != 0) {  

        if(strcmp(dev->name,"s3c-keypad")==0)
        {
    
           //Checking Hard Reset Condition
           input_chk_hardreset(code, value);
        }
    }
#endif

	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);
	}
}
示例#3
0
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);
	}
}