android 通过中断口增加电池充电检测功能的方法

目前在samsung exnosy 4412平台上,开发板的参考方案中,采用了max17040电量计和max8903电源管理IC,但在实际方案中取消了max8903的部分,所以AC充电的插拔检测,需另外实现,现采用一个中断脚来实现,软件上实现步骤如下:
static struct workqueue_struct *max17040_workqueue;
static struct work_struct work17040_work;

static void changer_work_func(void)
{
u32 cok;

cok=gpio_get_value(EXYNOS4_GPX3(7));
if(!cok)
s5p_cable_check_status(1);//ac
else 
s5p_cable_check_status(0);//battery

}


static irqreturn_t irq_handler(int irqno, void *param)
{

printk("max17040 irq_handler\n");

queue_work(max17040_workqueue, &work17040_work);

return IRQ_HANDLED; 

}

static int __init max17040_init(void)
{
int err,ret;
ret= gpio_is_valid(EXYNOS4_GPX3(7));
if(!ret){
printk("gpio is not valid for max17040");
// goto done;
}
//uok 
 ret=gpio_request(EXYNOS4_GPX3(7), "cok pin");
if(ret<0){
printk("gpio requst fail for max17040: cok pin!! ");
// goto done;
}
s3c_gpio_setpull(EXYNOS4_GPX3(1), S3C_GPIO_PULL_NONE);
gpio_direction_input(EXYNOS4_GPX3(7));


//init woekqueue 
 INIT_WORK(&work17040_work, changer_work_func);
printk("INIT_WORK(&work17040_work, changer_work_func)\n");
 max17040_workqueue = create_singlethread_workqueue("max17040_workqueue");
//scan before enable irq  
queue_work(max17040_workqueue, &work17040_work);
 //set  irq
ret = request_irq(gpio_to_irq(EXYNOS4_GPX3(7)), irq_handler,
IRQF_SAMPLE_RANDOM|IRQF_TRIGGER_FALLING|IRQF_TRIGGER_RISING,
"uok_int",NULL);

if (ret < 0)
{
printk("request_irq(uok_irq_handler) failed due to %d !!!\n",ret);
free_irq(gpio_to_irq(EXYNOS4_GPX3(7)),NULL);
// goto done;
}
enable_irq_wake(gpio_to_irq(EXYNOS4_GPX3(7)));

return i2c_add_driver(&max17040_i2c_driver);
// done:

}

此AC插拔检测功能是放在max17040_init函数中实现,此方法可用在需要用中断口实现实时监控的地方,注意向上层上报的接口配套实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值