• DA9034驱动程序阅读笔记(1)


    DA9034驱动程序阅读笔记(1)

    转载时请注明出处和作者联系方式
    文章出处:http://www.limodev.cn/blog
    作者联系方式:李先静 <xianjimli at hotmail dot com>

    DA9034是一个集成了电源管理、音频设备、触摸屏控制器和能用A/D|D/A转换的多功能芯片。最近读了一下相关驱动程序,这里记些笔记,不成体系,作为备忘而已。有兴趣的朋友可以一起讨论。

    在Broncho A1中DA9034与CPU PXA300/PXA310之间用I2C连接。

    o 在littleton.c里定义了DA9034的设备信息:

    #if defined(CONFIG_I2C_BOARDINFO)
    static struct i2c_board_info littleton_i2c_board_info[] = {
    #if defined(CONFIG_PXA3xx_MICCO) || defined(CONFIG_PXA3xx_MICCO_MODULE)
        {
            .type   = "micco",
            .addr       = 0x34,
            .platform_data  = &micco_data,
            .irq        = IRQ_GPIO(mfp_to_gpio(MFP_CFG_PIN(MFP_PMIC_INT))),
        },
    #endif

    DA9034的nIRQ引脚连接到CPU的GPIO MFP_PMIC_INT上,DA9034有事件发生时,会通过这个引脚上报给CPU。

    o 驱动程序在i2c/chips/micco.c里。

    static const struct i2c_device_id micco_id[] = {
        { "micco", 0 },
        { }
    };
     
    static struct i2c_driver micco_driver = {
        .driver = {
            .name   = "micco",
        },
        .probe      = micco_probe,
        .remove     = micco_remove,
        .id_table   = micco_id,
        .suspend    = micco_suspend,
        .resume     = micco_resume,
    };

    id_table 主要用来匹配设备与驱动程序的。

    对于I2C驱动程序来说,只是比较它们的名字是否相同。

    static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id,
                            const struct i2c_client *client)
    {
        while (id->name[0]) {
            if (strcmp(client->name, id->name) == 0)
                return id;
            id++;
        }
        return NULL;
    }
     
    static int i2c_device_match(struct device *dev, struct device_driver *drv)
    {
        struct i2c_client   *client = to_i2c_client(dev);
        struct i2c_driver   *driver = to_i2c_driver(drv);
     
        /* make legacy i2c drivers bypass driver model probing entirely;
         * such drivers scan each i2c adapter/bus themselves.
         */
        if (!is_newstyle_driver(driver))
            return 0;
     
        /* match on an id table if there is one */
        if (driver->id_table)
            return i2c_match_id(driver->id_table, client) != NULL;
     
        return 0;
    }

    一旦匹配上之后,就会调用micco_probe。在micco_probe函数中。这个函数:

    初始化:

    ret = micco_initchip();
    pdata->init_irq();

    micco_initchip主要是初始驱动程序的一些全局变量和寄存器MICCO_SYSCTRL_A。
    init_irq是在micco_data里定义,即函数micco_init_irq,里面把GPIO MFP_PMIC_INT设置为输入模式。

    注册GPIO的中断:

    ret = request_irq(client->irq, micco_irq_handler, IRQF_TRIGGER_FALLING,
                "Micco", client);

    micco_irq_handler是比较重要的,它先调用pdata->ack_irq(即micco_ack_irq),其实什么都没有做。

    然后调用schedule_work(&pdata->work);,导步去处理中断事件。这个work会执行函数micco_worker,micco_worker做了两件事:

    1.调用micco_event_change去查询MICCO_EVENT_A、MICCO_EVENT_B、MICCO_EVENT_C和MICCO_EVENT_D几个寄存器的内容,并记录下来。

    2.调用pmic_event_handle去分发事件,我们说过DA9034是一个多功能设备,每个设备都有自己的驱动程序,这里只是一个总的入口。所以这里只是调用各个实际驱动程序的回调函数:

        list_for_each_entry(pmic_cb, &pxa3xx_pmic_ops->list, list) {
            spin_unlock_irqrestore(&pxa3xx_pmic_ops->cb_lock, flags);
            /* event is bit-wise parameter, need bit AND here as filter */
            if ((pmic_cb->event & event) && (pmic_cb->func))
                pmic_cb->func(event);
            spin_lock_irqsave(&pxa3xx_pmic_ops->cb_lock, flags);
        }

    在注册后中断处理函数之后,micco_probe然后调用平台初始化函数pdata->platform_init(即littleton_micco_init),这里对DA9034芯片做了实际的初始化。

    最后micco_probe注册了电源管理的回调函数:

        pmic_set_ops(&micco_pmic_ops);

    这里对i2c的读写函数做了包装,提供用于读写寄存器的函数:micco_read/micco_write。

    这里也对基本操作提供了包装函数,如:

    int micco_tsi_enable_tsi(int tsi_en)
    {
        int status;
        u8 val;
     
        status = micco_read(MICCO_ADC_AUTO_CONTROL_2, &val);
        if (status)
            return -EIO;
     
        if (tsi_en)
            val |= MICCO_ADC_AUTO_2_TSI_EN;
        else
            val &= ~MICCO_ADC_AUTO_2_TSI_EN;
     
        status = micco_write(MICCO_ADC_AUTO_CONTROL_2, val);
        if (status)
            return -EIO;
     
        return 0;
    }

    这些函数会在实际的驱动程序中被调用,后面看了其它代码再分析吧。

  • 相关阅读:
    入门命令13-字符串查找增强:findstr
    NAMESPACE_ERR: An attempt is made to create or change an object in a way which is incorrect with regard to namespaces.
    docker: "build" requires 1 argument. See 'docker build --help'.
    Mac 下 docker安装
    eclipse导入maven web 项目 但是不显示成web 项目
    @QueryParam和@PathParam比较
    JVM--详解类加载机制
    JVM--Class类文件结构
    mysql left join中where和on条件的区别
    JAVA线程锁---Synchronized
  • 原文地址:https://www.cnblogs.com/zhangyunlin/p/6167468.html
Copyright © 2020-2023  润新知