MTK手机皮套驱动实现驱动代码分析

平台: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, &param);
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





















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值