《TP驱动里添加工作队列》
日期:2015.12.15 星期二 一、引言 前天有个TP的FAE说要实现这么一个功能:“在检测到当前是在充电状态时,就在寄存器0x8b里写1;当检测到当前已断开充电时,寄存器0x8b就写0.”。那么该如何去实现呢?
二、实现方法 1,第一种方法,就是在TP驱动里做一个工作队列。即是在一个定时时间里都会去调用一次功能函数,每进去一次功能函数里就检测一次是否有在充电状况;如果有变化,即对这个寄存器写入相应的值。 2,第二种方法,就是将检测充电动作交给上层来处理。在底层驱动里只创建一个设备节点来给上层来IO_Ctrl,即底层只实现机制。这个方法我以前有用过,但这个需要上层来配合完成。 结论:采用第一种方法,这个我们驱动人员就可以完成了。 三、具体实现 1,定义和声明相关的变量、函数; #ifdef GTP_CHARGER_DETECTstatic 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 }
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
