linux i2c驱动总结

最近几天一直在看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

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

你可能感兴趣的:(linux i2c驱动总结)