目前在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函数中实现,此方法可用在需要用中断口实现实时监控的地方,注意向上层上报的接口配套实现。