首先,在i2c总线或者smbus总线对应的platform_driver和platform_device注册之前,需要先将设备对应的i2c外设的信息通过i2c_register_board_info函数接口将busnum和对应的devinfo保存在__i2c_board_list链表中,设备信息结构如下:
struct i2c_board_info {
char type[];//为字符串,需要i2c_driver结构体中的id_table中的name对应
unsigned short flags;
unsigned short addr;//为i2c总线访问设备的地址一般为write address
........
};
之后,可以注册i2c总线对应的platform_driver和platform_device,通过name找到对方后,自动调用platform_driver对应的probe函数,此函数实现两个功能:
1,通过platform_device提供的io_resource信息完成对相应i2c总线io资源(寄存器寻址空间和中断号等)的申请
2,完成对i2c_adapter结构体的初始化,algo表示读写的接口函数,nr代表busnum(必须和i2c_board_info中的busnum对应)
3,调用i2c_add_numbered_adapter,此函数主要实现函数为i2c_register_adapter(),此函数首先生成/dev/i2c-xx设备,然后调用i2c_scan_satic_board_info函数,通过检查之前添加在__i2c_board_list上总线号一致的设备,如果一致则生成对应的i2c_client结构,然后注册对应的device到i2c_bus_type的总线上
最后,i2c子设备驱动(如rtc,gps等)编写者通过初始化i2c_driver结构体,并调用i2c_add_driver注册i2c_driver,此函数初始化对应的device_driver的bus为i2c_bus_type,在driver_register中通过回调i2c_bus_type的i2c_device_match,通过i2c_driver的id_table中的name和在i2c_bus_type上的device对应的client的name做匹配,如果匹配则成功,之后会回调i2c_driver对应的probe函数,此函数由驱动开发者自己提供(如注册rtc设备驱动)
阅读(559) | 评论(0) | 转发(0) |