《TP驱动里添加工作队列》

日期:2015.12.15    星期二 一、引言         前天有个TP的FAE说要实现这么一个功能:“在检测到当前是在充电状态时,就在寄存器0x8b里写1;当检测到当前已断开充电时,寄存器0x8b就写0.”。那么该如何去实现呢?

二、实现方法     1,第一种方法,就是在TP驱动里做一个工作队列。即是在一个定时时间里都会去调用一次功能函数,每进去一次功能函数里就检测一次是否有在充电状况;如果有变化,即对这个寄存器写入相应的值。     2,第二种方法,就是将检测充电动作交给上层来处理。在底层驱动里只创建一个设备节点来给上层来IO_Ctrl,即底层只实现机制。这个方法我以前有用过,但这个需要上层来配合完成。              结论:采用第一种方法,这个我们驱动人员就可以完成了。

三、具体实现     1,定义和声明相关的变量、函数; #ifdef GTP_CHARGER_DETECT
static int get_charger_detect_status(void);//检测充电状态函数 #define TPD_CHARGER_CHECK_CIRCLE    50 //chenjun add static struct delayed_work gtp_charger_check_work; static struct workqueue_struct *gtp_charger_check_workqueue = NULL; static void gtp_charger_check_func(struct work_struct *); static u8 gtp_charger_mode = 0;
#endif     2,在proble函数里创建并初始化延时工作队列 #ifdef GTP_CHARGER_DETECT    INIT_DELAYED_WORK(>p_charger_check_work, gtp_charger_check_func);    gtp_charger_check_workqueue = create_workqueue("gtp_charger_check");    queue_delayed_work(gtp_charger_check_workqueue, >p_charger_check_work, TPD_CHARGER_CHECK_CIRCLE); #endif     3,实现功能函数 #ifdef GTP_CHARGER_DETECT     static void gtp_charger_check_func(struct work_struct *work)     {         int cur_charger_state;         int wr_buf[1];         s32 ret = 0;         cur_charger_state=get_charger_detect_status();         //upmu_is_chr_det();         //upmu_get_pchr_chrdet();         printk("=====TP Charger mode = %d=======\n", cur_charger_state);         printk("=====gtp_charger_mode = %d=======\n", gtp_charger_mode);         if (gtp_charger_mode != cur_charger_state)         {                 printk("Charger state change detected~!\n");                 printk("Charger mode = %d\n", cur_charger_state);                 gtp_charger_mode = cur_charger_state;                  //gtp_send_cfg(i2c_client_point);                 if(cur_charger_state == 0)                 {                         //is not in chargering                         wr_buf[0] = 0x00;                         ret = fts_write_reg(i2c_client, 0x8b, 0);                         if (ret < 0) {                                 printk("==I2C error to write 0x8b-> 0x00. ======\n");                                 return FAIL;                         }                         printk("====I2C to write 0x8b->0x00 is OK !!!. =====\n");                         fts_read_reg(i2c_client, 0x8b, wr_buf);                         printk("====I2C to read 0x8b = %d ===\n",wr_buf[0]);                 }                 else if (cur_charger_state == 1)                 {                         //is in chargering                         wr_buf[0] = 0x01;                         ret = fts_write_reg(i2c_client, 0x8b, 1);                         if (ret < 0)                         {                                 printk("=====I2C error to write 0x8b-> 0x01. =====\n");                                  return FAIL;                         }                         printk("=====I2C to write 0x8b->0x01 is OK !!!. =====\n");                         wr_buf[0] = 0x00;                         fts_read_reg(i2c_client, 0x8b, wr_buf);                         printk("=====I2C to read 0x8b = %d =====\n",wr_buf[0]);                 }         }         if (!tpd_halt)         {                 queue_delayed_work(gtp_charger_check_workqueue, >p_charger_check_work, TPD_CHARGER_CHECK_CIRCLE);         }                  return;     }     //检测是否充电函数     //当然,要记得包含相关的头文件     static int get_charger_detect_status(void)     {             bool chr_status;             battery_charging_control(CHARGING_CMD_GET_CHARGER_DET_STATUS, &chr_status);             return chr_status;     } #endif     4,在TP的休眠函数里把工作队列停止     static void tpd_suspend( struct early_suspend *h )     {         …………         #ifdef GTP_CHARGER_DETECT                  cancel_delayed_work_sync(>p_charger_check_work);         #endif     }     5,在TP的唤醒函数里再次开启工作队列     static void tpd_resume( struct early_suspend *h )     {         ................         #ifdef GTP_CHARGER_DETECT                 gtp_charger_mode = 0;                 queue_delayed_work(gtp_charger_check_workqueue, >p_charger_check_work, TPD_CHARGER_CHECK_CIRCLE);         #endif     }


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部