平台:MTK6592,KK
修改文件路径:
alps\bird\custom\1481G\kernel\touchpanel\GT9158\gt9xx_driver.c
代码分析:
kpd.c: flip代码分析
1.
#if KPD_HAS_FLIP_FUN
#define GET_KPD_FLIP_KEY _IOR('k', 35, int)
#endif
2.
#if KPD_HAS_FLIP_FUN
static void kpd_flip_handler(unsigned long data);
static DECLARE_TASKLET(kpd_flip_tasklet, kpd_flip_handler, 0);
static bool kpd_flip_state = true;
#endif
3.
#if KPD_HAS_FLIP_FUN
#ifdef BIRD_HALL_CHANGE_TP_PARAM
extern void gtp_change_param(int Mhall_key_level);
#endif
4.
在probe函数里加入
#if KPD_HAS_FLIP_FUN
__set_bit(KEY_FLIP_OPEN, kpd_input_dev->keybit);
__set_bit(KEY_FLIP_CLOSE, kpd_input_dev->keybit);
#endif
#if KPD_HAS_FLIP_FUN
mt_set_gpio_mode(GPIO_MHALL_EINT_PIN, GPIO_MHALL_EINT_PIN_M_EINT);
mt_set_gpio_dir(GPIO_MHALL_EINT_PIN, GPIO_DIR_IN);
mt_set_gpio_pull_enable(GPIO_MHALL_EINT_PIN, GPIO_PULL_ENABLE);
mt_set_gpio_pull_select(GPIO_MHALL_EINT_PIN, GPIO_PULL_UP);
mt_eint_set_hw_debounce(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_DEBOUNCE_CN);
mt_eint_registration(CUST_EINT_MHALL_NUM, CUST_EINT_MHALL_TYPE, kpd_flip_eint_handler, false);
mt_eint_unmask(CUST_EINT_MHALL_NUM);
#endif
5.
static void kpd_flip_handler(unsigned long data)
{
bool old_state = kpd_flip_state;
int Mhall_key_level;
kpd_flip_state = !kpd_flip_state;
Mhall_key_level = mt_get_gpio_in(GPIO_MHALL_EINT_PIN);
#if 1
if (kpd_flip_state)
{
input_report_key(kpd_input_dev, KEY_FLIP_OPEN, 1);
input_report_key(kpd_input_dev, KEY_FLIP_OPEN, 0);
kpd_print("\n report KEY_FLIP=%d, flip state= %d\n", KEY_FLIP_OPEN,old_state);
}
else
{
input_report_key(kpd_input_dev, KEY_FLIP_CLOSE, 1);
input_report_key(kpd_input_dev, KEY_FLIP_CLOSE, 0);
kpd_print("\n report KEY_FLIP=%d, flip state= %d\n", KEY_FLIP_CLOSE,old_state);
}
#endif
input_sync(kpd_input_dev);
printk("flip Mhall_key_level = %d", Mhall_key_level);
printk("MYCAT flip key handler:%d,%d\n",old_state,kpd_flip_state);
#ifdef BIRD_HALL_CHANGE_TP_PARAM
gtp_change_param(Mhall_key_level);
#endif
if (old_state){
mt_eint_registration(CUST_EINT_MHALL_NUM, CUST_EINTF_TRIGGER_HIGH, kpd_flip_eint_handler, false);
}else{
mt_eint_registration(CUST_EINT_MHALL_NUM, CUST_EINTF_TRIGGER_LOW, kpd_flip_eint_handler, false);
}
mt_eint_unmask(CUST_EINT_MHALL_NUM);
}
static void kpd_flip_eint_handler(void)
{
tasklet_schedule(&kpd_flip_tasklet);
}
gt9xx_driver.c:
1.
#ifdef BIRD_HALL_CHANGE_TP_PARAM
int hall_level = 1;
int hall_level_old = 1;
#endif
定义霍尔的状态,以及前一次的状态
2.
#ifdef BIRD_HALL_CHANGE_TP_PARAM
static DECLARE_WAIT_QUEUE_HEAD(waiter2);
#endif
3.
#ifdef BIRD_HALL_CHANGE_TP_PARAM
static int touch_hall_handler(void *unused);
#endif
4.
#ifdef BIRD_HALL_CHANGE_TP_PARAM
thread = kthread_run(touch_hall_handler, 0, TPD_DEVICE);
if (IS_ERR(thread))
{
err = PTR_ERR(thread);
GTP_INFO(TPD_DEVICE " failed to create kernel thread: %d\n", err);
}
#endif
5.
#ifdef BIRD_HALL_CHANGE_TP_PARAM
static int touch_hall_handler(void *unused) //dxc
{
struct sched_param param = { .sched_priority = RTPM_PRIO_TPD };
u8 oldconfig[] = {0x52,0x1C,0x02,0xC0,0x03,0x0A,0x05,0x05,0x01,0x0A,0x28,0x0F,0x50,0x3C,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x84,0x00,0x00,0x00,0x00,0x8C,0x0B,0x0C,0x25,0x00,0x0C,0x08,0x0C,0x08,0x00,0x02,0x33,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x14,0x50,0x94,0xC0,0x02,0x02,0x00,0x00,0x04,0xC8,0x17,0x00,0x9B,0x1E,0xFF,0x77,0x28,0x00,0x5C,0x35,0x00,0x49,0x46,0x00,0x49,0x18,0x30,0x50,0x00,0xF0,0x50,0x40,0xFF,0xFF,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x46,0x00,0x00,0x00,0x00,0x32,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x12,0x10,0x0F,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0x14,0x16,0x18,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x24,0x26,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x01};
u8 newconfig[] = {0x52,0x1C,0x02,0xC0,0x03,0x01,0x05,0x05,0x01,0x0A,0x14,0x0F,0x50,0x3C,0x03,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x8C,0x0B,0x0C,0x21,0x00,0x0C,0x08,0x0C,0x08,0x00,0x03,0x34,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA2,0x14,0x50,0x94,0xC0,0x02,0x02,0x00,0x00,0x04,0xC8,0x17,0x00,0x9B,0x1E,0x00,0x77,0x28,0x00,0x5C,0x35,0x00,0x49,0x46,0x00,0x49,0x18,0x30,0x50,0x00,0xF0,0x50,0x40,0xFF,0xFF,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x06,0x00,0x00,0x00,0x00,0x32,0x02,0x04,0x06,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x12,0x10,0x0F,0x0C,0x0A,0x08,0x06,0x04,0x02,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC7,0x01};
sched_setscheduler(current, SCHED_RR, ¶m);
do{
set_current_state(TASK_INTERRUPTIBLE);
while (tpd_halt)
{
#if GTP_GESTURE_WAKEUP
if (DOZE_ENABLED == doze_status)
{
break;
}
#endif
//hall_level_old = hall_level;;
msleep(20);
}
wait_event_interruptible(waiter2, hall_level!=hall_level_old);
hall_level_old = hall_level;
//int Mhall_key_level = mt_get_gpio_in(GPIO_MHALL_EINT_PIN);
memset(&config[GTP_ADDR_LENGTH], 0, GTP_CONFIG_MAX_LENGTH);
if(hall_level == 0)
{
memcpy(&config[GTP_ADDR_LENGTH], newconfig, (sizeof(newconfig) / sizeof(newconfig[0])));
}
else{
memcpy(&config[GTP_ADDR_LENGTH], oldconfig, (sizeof(oldconfig) / sizeof(oldconfig[0])));
}
gtp_send_cfg(i2c_client_point);
printk("\nmycat dxc thread test...\n");
msleep(500);
//schedule();
set_current_state(TASK_RUNNING);
}while (!kthread_should_stop());
return 0;
}
#endif
6.
#ifdef BIRD_HALL_CHANGE_TP_PARAM
void gtp_change_param(int Mhall_key_level) //dxc
{
hall_level = Mhall_key_level;
wake_up_interruptible(&waiter2);
}
#endif