【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
linux里面的代码很多,要全部说完,那是不现实的。在实际工作中,我们基本上需要什么驱动,就移植什么驱动。linux系统下bus-host-device模式一直没有变过,大家只要抓住这个基本原则就可以了。
1、其他还有什么重要的驱动
gpio驱动,位于drivers/gpio,主要用作键盘输入
leds驱动,位于drivers/leds,常用做开机显示或者是网口显示
uart驱动,位于drivers/tty/serial,这是最基础的驱动,可以没有lcd屏幕,但是不能没有串口
rtc驱动, 位于drivers/rtc,主要用于定时时钟
crypto驱动,位于drivers/crypto,常用于加密、校验或者纠错的驱动框架
i2c驱动,位于drivers/i2c,可用于pmu、时钟等设备
spi驱动,位于drivers/spi,可用于flash设备等
ps:
早期调试的时候,gpio和uart特别重要,除了jtag之外,基本上就剩gpio和uart这两种调试方法了。
如果是总线协议,一般直接到对应drivers/[bus]即可完成适配。
如果是device,一般用对应总线的函数注册一下也行,比如module_platform_driver,module_spi_driver等等。
当然,有的时候也会写成platform_register_driver、scsi_register_driver这种形式。
当然最简单的方法还是 module_init 和 module_exit这两个函数。
2、如果驱动不稳定,应该保存在哪个目录
drivers/staging
3、android特有的一些驱动,放在什么地方
drivers/android
4、一般如何写驱动
a、找相同目录下的一个近似文件
b、删除框架外的一切代码
c、自定义数据结构、注意包含class设备结构体
d、根据芯片手册,填充寄存器内容
e、在驱动中添加打印信息
f、调试驱动,可能使用到示波器和万用表、协议分析仪等等
g、使用第三方软件工具对驱动做压力测试
5、如何阅读驱动代码
a、结合Kconfig和Makefile一起阅读
b、分清驱动和协议,比如v4l2和media设备、alsa和asoc设备等等
c、大多数设备按照bus-host-device都可以快速厘清关系
d、快速寻找设备的接口注册信息
e、找到设备中断信息,搞定中断和接口如何互动
f、注意readl和writel函数,这部分参考spec手册
g、可以利用platform机制编写很多虚拟设备驱动,验证自己的想法
6、复杂的驱动怎么阅读
部分设备驱动的理解不依赖驱动本身,而是依赖于协议,比如
usb就要搞懂drivers/usb/core下面的代码,
media设备就要搞懂drivers/media/v4l2的代码,
sd卡就要搞懂drivers/mmc/core里面的代码,
声卡部分就要搞懂sound/core里面的代码,
搞gpu既要弄懂drivers/gpu/drm里面的通用代码等等。
如果要精通这些驱动的话,那了解这些框架或者协议都是少不了的工作。
7、ko文件是什么文件
就是一个elf文件,如果对驱动有怀疑,直接objdump反汇编好了
8、驱动编译在内核和外面有什么区别
没有区别
9、驱动实在看不懂,怎么办
放在一边,过几个星期再看好了
10、编写驱动的优缺点
优点就是可以接触到soc、os、协议和硬件,缺点就是驱动本身就是八股文,在提高个人软件架构能力方面作用有限