编写linux设备驱动的注意事项之一

编写linux设备驱动的注意事项之一

当然写驱动,你得清楚上层调用是否导致存在函数重入、
什么执行context下*(1. 中断、2. 软中断、3. tasklet(软中断的一种)、 4. timer(基于软中断实现)、5. hrtimer (软中断或硬中断环境下执行) 、6. workqueue(也是kernel thread)、7. kernel thread、8. 普通thread的内核态下)*会访问此函数和此资源,需要什么样的“同步机制”保护。

你利用子系统(例如input子系统)的去实现驱动需要实现功能。你利用总线的api函数去访问设备硬件,例如i2c_transfer、spi_sync等
注意probe函数传入的device,是bus_type实现的,在module_init时注册了驱动到对应总线上,在.machine_init时,会通过board板级代码把此bus的设备加入到对应的总线上(无论是否需要device tree方式)。无论是谁创建的设备(bus函数或者machine_init的函数),加入bus后,match成功后,就传入到驱动的probe函数上了,所以probe函数传入的就是对应bus的device结构,例如i2c是struct i2c_client *, spi总线是struct spi_device *,platform虚拟总线传入的是struct platform_device *。 具体参见我的《linux device driver model_2018_02_03(必读).pptx》

像手机的touch driver比较复杂(例如cypress或者synaptics厂家),他还自己创建了一条虚拟的bus来实现动态支持不同的子function的添加。

需要考虑一个驱动如何支持多个设备,避免全局和静态变量,而采用基于xxx_priv_dev的结构体成员变量代替,一个xxx_priv_dev 对应一个device。

关于具体的写linux驱动的方法、技巧和注意事项,欢迎观看我的《如何编写linux设备驱动》的视频:
https://edu.51cto.com/course/17132.html

另外我的相关培训视频请看:
欢迎观看我发布的各个课程: https://edu.51cto.com/lecturer/8896847.html https://blog.csdn.net/gaoneil

另外我的免费的linux各种驱动开发课程如下:
https://edu.51cto.com/course/17138.html

猜你喜欢

转载自blog.csdn.net/gaoneil/article/details/88318791