大家好我是石斑鱼,
本文适合正在找Linux驱动相关工作的新手开发者,大佬们可以跳过了。
阅读本文之前,建议先大概了解一下IIC的物理电路时序,这个在面试中可能也会被问到,由于我目前主要关注驱动,所以先略过,后面有机会再补上。
Linux面试中,面试官会常问 IIC设备驱动常规写法,因为IIC子系统算经常修改调试的驱动,之前也只是会怎么抄。这里针对口语化理解总结,细节部分没有写出来,细节可以再搜一下其他大佬的文章。
本文大概写下主干框架,方便自己回忆结构,也方便兄弟姐妹们面试口语回答这个问题时候参考,如果哪里写错了,请尽情骂我吧,骂完我马上改。(我个人觉得,要在一大片知识里面总结关键架构,讨好面试官并口语化回答到要点还是挺难的)
如果还有其他IIC相关的面试问题,也欢迎评论,后面增加上来。
面试官:说说IIC驱动怎么写?
口语简答版:
嵌入式Linux驱动中IIC驱动开发大致有三个步骤:
- 1、在设备树中描述好IIC设备信息
- 2、实现
i2c_driver
结构体并通过i2c_add_driver()
添加到IIC总线 - 3、实现
probe()
等函数- 使用
register_chrdev()
申请设备号并注册一个字符设备,实现file_operations
- 使用
class_create()
、device_create()
创建设备节点文件 - 通过IIC的相关接口如
i2c_transfer()
去初始化IIC从设备
- 使用
虽然上面的口语回答覆盖了面试官的问题答案,但也要了解相关代码:
1. 在设备树中描述好IIC设备信息,挂在哪个IIC总线下,设备寄存器地址。
i2c@138B0000{
/*i2c adapter信息*/
#address-cells = <0>;
#size-cells = <0>;
samsung,i2c-sda-delay = <100>;
samsung,i2c-max-bus-freq = <20000>;
pinctrl-0 = <&i2c5_bus>;
pinctrl-names = "default";
status = "okay";
mpu6050@68{/*i2c client信息*/
compatible = "invensense,m