初学者如何移植linux驱动

本文面向Linux驱动开发初学者,介绍如何移植Linux驱动,特别是摄像头驱动。首先从搭建框架开始,如V4L2,然后通过模拟调试确保框架运行。接着,深入理解硬件特性,根据芯片手册填充硬件相关代码,并进行硬件调试。最后强调了阅读英文文档的重要性以及在没有硬件条件下的调试技巧。

刚刚接触到linux驱动开发,一定要先亲自移植几个驱动,才能及时发现问题。通过查找资料解决,可以逐步提高自己的能力。那么刚刚移植驱动需要如何下手呢?

 

1.搭建好框架

linux设备驱动开发,基本都是在框架基础上进行的。框架本身并不依赖特定的外部设备,而是提供了若干个抽象的接口。复杂一点的框架有V4L2和Framebuffer等。在移植这类驱动,由于涉及到的知识点比较多,所以先从框架入手。还是像原来文章中提到过的一样,做驱动就像是做英语的完型填空,先保证框架跑通。而框架本身在没有实际的硬件设备的条件下,也可以调试。例如在移植摄像头的驱动时,会涉及到V4L2框架。这里就先以V4L2驱动移植作为例子。

CMOS芯片的采集到的图像通过并行的CAM IF进行传输。系统对CMOS的设置是通过I2C来完成。I2C实际是作为V4L2的一个子设备。这样驱动就分为两部分,一部分是对图像采集的处理,另外一部分就是对CMOS本身的控制处理,例如设置图像采集格式,图像尺寸等信息。首先移植图像采集部分驱动,实际就是按部就班的去做。通过platform device/driver 或者其他类型的device/driver来实现。在移植过程中,可以先不考虑CMOS的硬件细节,只保留驱动的probe的部分以及v4l2的相关操作部分代码。保证编译通过,同时驱动可以正常加载。之后调试V4L2的接口,在V4L2相关的文件操作接口中加入打印信息,观察调用顺序。同时增加测试代码,模拟CMOS采集每一帧图像,在用户空间程序中观察是否能获取到数据。如果内核开启kgdb支持,也可以通过gdb对驱动进行调试。如果一切都正常,接下来调试V4L2子设备接口。一般V4L2的子设备是在主驱动中建立的,也可以单独建立,这根据驱动的架构来定。V4L2子设备调试的套路也是一致,先保证I2C driver可以正常加载,probe函数可以执行到。之后也是不考虑和硬件相关的代码,进行fake调试。保证V4L2的子设备文件操作接口可以调用到。

2.做好完型填空

框架调试完毕,由于对每个接口都调试到了,这时对框架也有了深入了解。接下来就是要熟读外设的芯片手册,了解时序特点,以及寄存器的用法。做驱动开发,当然需要一定的硬件知识储备,自己可以不断去积累,同时English也至少得说的过去。唠叨一下,其实英文没那么麻烦,只把它作为一个符号就好了。专业术语即使翻译成中文,还是一样的不懂,那还不如直接读英文。比如magic number,翻译成了幻数,你依然还是不明觉厉。接下来就疯狂的把硬件相关的操作代码填到正确的位置,当然你要自己自己恢复的代码代表啥意思,移植驱动时可以不用去了解太多细节,但是心里要有概况。硬件相关代码移植好后,就是调试工作。硬件调试需要真正的连接硬件设备,进行操作,由于不是很直观,可以通过一些辅助手段完成。在没有示波器的情况下,可以通过LED调试。比如采集好N帧图像,闪烁LED。要尽可能的利用硬件本身的资源去让它告诉你已经做了什么。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值