Beispiel #1
0
static irqreturn_t s3c_keygpio_isr(int irq, void *dev_id)
{
	unsigned int key_status;
	static unsigned int prev_key_status = (1 << 6);
	struct s3c_keypad *pdata = (struct s3c_keypad *)dev_id;
	struct input_dev *dev = pdata->dev;
	#define KEY_POWER_EVT       116

	// Beware that we may not obtain exact key up/down status at
	// this point.
	key_status = (readl(S5PV210_GPH2DAT)) & (1 << 6);

	// If ISR is called and up/down status remains the same, we
	// must have lost one and should report that first with
	// upside/down.
	if(in_sleep)
	{
	    if (key_status == prev_key_status)
		{
    		INPUT_REPORT_KEY(dev, KEY_POWER_EVT, key_status ? 1 : 0);
		}
		in_sleep = 0;
	}

	INPUT_REPORT_KEY(dev, KEY_POWER_EVT, key_status ? 0 : 1);
   
   	keyled_timer_start(); /* keypad_led */

	prev_key_status = key_status;
	printk(KERN_DEBUG "s3c_keygpio_isr pwr key_status =%d,\n", key_status);

	return IRQ_HANDLED;
}
Beispiel #2
0
static irqreturn_t s3c_keygpio_keysense_isr(int irq, void *dev_id)
{
	struct s3c_keypad *pdata = (struct s3c_keypad *)dev_id;
	struct input_dev *dev = pdata->dev;

	#define KEY_POWER_EVT       116

	//Report Pressed key event
	INPUT_REPORT_KEY(dev, KEY_POWER_EVT,  1);
	// If ISR is called when wny any key is pressed while Target is call and in sleep mode.
	
	//Report released key event
    	INPUT_REPORT_KEY(dev, KEY_POWER_EVT,  0);

	#if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_MACH_TREBON)
   	keyled_timer_start(); /* keypad_led */
	#endif

	return IRQ_HANDLED;
}
Beispiel #3
0
void keyled_lcd_on_Ext(void){ keyled_lcdOn = 1;  if(keypad_clock) keyled_timer_start(); }
Beispiel #4
0
static void s3c_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;
	struct timer_list * timer = &pdata->keypad_timer;
#if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON)
	int skipcol=0;
#endif

	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 defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON)
				/* 
				 *  when camera & focus key press is detected simultaneously,
				 *  report focus first and camera second, so that platform
				 *  detects camera key repeat event (for key long press)
				 */
				if ( col==2 && ((keymask[3] ^ prevmask[3]) & keymask[3])) {
					input_report_key(dev,pdata->keycodes[3],1);
#ifdef DEBUG_LOG_ENABLE
					printk(KERN_DEBUG"[KEYPAD] key Pressed  : key %d map %d\n",3, pdata->keycodes[3]);
#else
					printk(KERN_DEBUG"[KEYPAD] key Pressed\n");
#endif
					skipcol = 1;
				}
#endif
				input_report_key(dev,pdata->keycodes[i],1);
#if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON)
                keyled_timer_start(); /* keypad_led */
#endif				
/* #ifdef CONFIG_KERNEL_DEBUG_SEC */
#ifdef DEBUG_LOG_ENABLE
				printk(KERN_DEBUG"[KEYPAD] key Pressed  : key %d map %d\n",i, pdata->keycodes[i]);
#else
				printk(KERN_DEBUG"[KEYPAD] key Pressed\n");
#endif
						}
			press_mask >>= 1;
			i++;
#if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON)
			if (skipcol) {
				press_mask >>= 1;
				i++;
			}
#endif
		}

		i = col * KEYPAD_ROWS;

		while (release_mask) {
			if (release_mask & 1) {
				input_report_key(dev,pdata->keycodes[i],0);
#if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON)
		   keyled_timer_start(); /* keypad_led */
#endif				
/* #ifdef CONFIG_KERNEL_DEBUG_SEC */
#ifdef DEBUG_LOG_ENABLE
				printk(KERN_DEBUG"[KEYPAD] key Released : %d  map %d\n",i,pdata->keycodes[i]);
#else
				printk(KERN_DEBUG"[KEYPAD] key Released\n");
#endif

            }
			release_mask >>= 1;
			i++;
		}
		prevmask[col] = keymask[col];

		restart_timer |= keymask[col];

#if defined(CONFIG_MACH_CHIEF) && !defined(CONFIG_TIKAL_MPCS) && !defined(CONFIG_MACH_TREBON)
		/* skip next column, we've already proccessed this*/
		if (skipcol) {
			col++;
			skipcol = 0;
		}
#endif
	}
	
	if (restart_timer) {
#if defined(CONFIG_MACH_CHIEF)
		 mod_timer(timer,jiffies + (5*HZ/100));
#else
		mod_timer(timer, timer->expires);
#endif
	} else {
		writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON);
		pdata->keypad_timer_on = FALSE;
	}

}
Beispiel #5
0
static void s3c_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;
	struct timer_list * timer = &pdata->keypad_timer;

	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) {
				input_report_key(dev,pdata->keycodes[i],1);
#ifdef CONFIG_MACH_CHIEF				
                keyled_timer_start(); /* keypad_led */
#endif				
/* #ifdef CONFIG_KERNEL_DEBUG_SEC */
#ifdef DEBUG_LOG_ENABLE
				printk(KERN_DEBUG"[KEYPAD] key Pressed  : key %d map %d\n",i, pdata->keycodes[i]);
#else
				printk(KERN_DEBUG"[KEYPAD] key Pressed\n");
#endif
						}
			press_mask >>= 1;
			i++;
		}

		i = col * KEYPAD_ROWS;

		while (release_mask) {
			if (release_mask & 1) {
				input_report_key(dev,pdata->keycodes[i],0);
#ifdef CONFIG_MACH_CHIEF				
                keyled_timer_start(); /* keypad_led */
#endif				
/* #ifdef CONFIG_KERNEL_DEBUG_SEC */
#ifdef DEBUG_LOG_ENABLE
				printk(KERN_DEBUG"[KEYPAD] key Released : %d  map %d\n",i,pdata->keycodes[i]);
#else
				printk(KERN_DEBUG"[KEYPAD] key Released\n");
#endif

            }
			release_mask >>= 1;
			i++;
		}
		prevmask[col] = keymask[col];

		restart_timer |= keymask[col];
	}


	if (restart_timer) {
		mod_timer(timer, timer->expires);
	} else {
		writel(KEYIFCON_INIT, key_base+S3C_KEYIFCON);
		pdata->keypad_timer_on = FALSE;
	}

}