刚刚结束对传感器HMC5883L的驱动书写及调试工作,虽然之前对相关的各种知识点都有接触,但是在真正从头书写驱动的时候还是遇到了很多不大不小的麻烦,在这里自行总结一下,也是作为以后驱动书写的一个经验教训,更是对以往所学内核驱动相关知识的复习和总结。事实证明,看了多少书,也不如亲自动手实践学的快,记得牢。
关于I2C
因为手头有几个传感器,都需要用到I2C接口,所以在之前就将I2C子系统复习并深入研究了一番。以下我所提到的或贴出的部分代码也许不适合真正的板级驱动,因为是以模块化形式做测试的。- 在此模块化驱动中,不仅要注册驱动(i2c_driver),同时也要对设备信息进行注册(i2c_client),我认为在这里不分前后顺序(就像“先有鸡还是先有蛋”的问题一样没有意义)。在前边分析i2c子系统的时候提到过,对于在i2c适配器注册后再添加的新的设备不能再用i2c_register_board_info了,这会导致设备完全不能被激活,而需要用的是i2c_new_device才能将设备动态的注册到系统中
- 在使用i2c_new_device时候不仅需要设备的i2c_board_info结构体,还需要其所依附的I2C适配器总线号。首先,关于总线号,可以通过i2cdetect命令进行查看:
root@arm:/home/debian# i2cdetect -l
i2c-0 i2c OMAP I2C adapter I2C adapter
i2c-1 i2c OMAP I2C adapter I2C adapter
然后,在代码中可以这样使用:
struct i2c_adapter *adap;
int adap_nr = 1; // 总线号为1
adap = i2c_get_adapter(adap_nr);
这样就获取了指定总线号的i2c_adapter指针,之后就可以利用这个指针给i2c_new_device用了。最后需要注意,在注册完设备信息后,要使用i2c_put_adapter(adap)将指针释放掉。
<