linux i2c驱动总结

    技术2022-05-20  35

    最近几天一直在看I2C的驱动架构,看到目前的感觉是说明白吧又不是很透彻,说不明白吧又知道点,总之有点不明白。

    明白的:

    1)adapter驱动,I2C控制器驱动,如果要开发I2C控制器的,这部分是要实现的。这部分要填充struct i2c_adapter

         结构图和struct alogrithm结构体.

    2)设备驱动,I2C从设备驱动,主要填充struct i2c_driver结构体;还要根据从设备的类型,实现从设备的驱动函数(eg:

         char device实现struct file_operations结构体)

    3)数据传输的过程:应用层的read()/write()->驱动层的read()/write()->i2c_core.c的i2c_transfer()->adapter驱动

         algo->master_xfer()函数。这中间有一个struct i2c_msg结构体,是非常重要的。

     

    不明白的地方:

    1)在struct i2c_adapter,struct i2c_client,struct i2c_driver是如果关联起来的,他们的数据结构在内核中的联系是什么

         样的?在注册adapter的过程中,相对的不明白的代码为i2c_core.c文件中的i2c_register_adpter()函数中的:

         if (adap->nr < __i2c_first_dynamic_bus_num)                  i2c_scan_static_board_info(adap);

         dummy = bus_for_each_drv(&i2c_bus_type, NULL, adap,                     i2c_do_add_adapter);                                           

        //对上面的理解是adapter已注册进内核,adapter注册后在总线上寻找此adapter所支持的struct i2c_driver

    2)在注册struct i2c_driver的过程中,相对不明白的是i2c_core.c文件中的i2c_register_driver()函数中的:

         class_for_each_device(&i2c_adapter_class, NULL, driver,                                          __attach_adapter);

      //对上面的理解是在struct i2c_driver注册后,在内核中寻找与struct i2c_driver匹配的adapter

    3)对于struct i2c_adapter和struct i2c_driver的注册次序会影响i2c_do_add_adapter()和__attach_adapter()函数

        中i2c_detect()的执行。具体没有分析明白,只是猜测。

     

    分析的体会:

    1)分析i2c架构分两步,第一步:内核已注册了adapter,当前注册struct i2c_driver。第二步:内核已注册了struct i2c_driver,

         当前注册adapter

    2)对linux内核的基本知识还是比较薄弱的,例如driver_register()函数,大概知道此函数是什么意思,但不知道它到底在内核中

         干了些什么事,它注册进内核后到底有什么用处呢。

    3)感觉厌倦的时候,干什么事都是没有精神的。没办法改变现实,那就改变自己的心态。

    4)在分析i2c架构的过程中参考了两篇非常好的文章:

         http://chxxxyg.blog.163.com/blog/static/1502811932010635818167/

         http://www.linuxidc.com/Linux/2011-02/32496p3.htm

        分析的非常透彻,敬仰两位楼主的精神!


    最新回复(0)