前言
经过之前的学习。串口驱动的跟在于设备树。所以必须把设备树的使用有深入了解。
设备树历史
过去ARM Linux中,充斥着大量的垃圾代码,这些设备代码与对应公司单板启动或运行细节强绑定,无法复用和移植。同时内核中没有规范来引导,导致代码越来越臃肿。最终因为Tony Lindgren,内核OMAP development tree的维护者,发送了一个邮件给Linus,请求提交OMAP平台代码修改,并附带修改以及如何解决merge conficts,让linus发出怒吼“Gaah.Guys, this whole ARM thing is a f*cking pain in the ass.”(linus对arm这样代码肯定深恶痛绝已久)。
这一骂引出了对设备文件信息的思考,原有的linux内核里面大部分对硬件资源的描述做了硬编码,当然这个邮件还是值得一看的,linus大佬还是摆事实,讲道理的,现在做一次合并,arm架构下的变动都超过60%。
邮件原文如下:
linux源代码的庞大,不仅仅学习linux的感觉到头大,看来维护人员也头大。
最终经过讨论,对ARM平台相关code做出相关规范:
1.ARM的核心代码仍然保存在arch/arm目录下;
2. ARM SoC core architecture code保存在arch/arm目录下;
3. ARM SOC的周边外设模块的驱动保存在drivers目录下;
4. ARM SOC的特定代码在arch/arm/mach-xxx目录下;
5. ARM SOC board specific的代码被移除,由DeviceTree机制来负责传递硬件拓扑和硬件资源信息。
本质上,Device Tree改变了原来用hardcode方式将硬件设备配置信息嵌入到内核代码的方法,改用bootloader传递一个DB的形式。
本质上,Device Tree改变了原来用code方式将HW配置信息嵌入到内核代码的方法,改用bootloader传递一个DB的形式。对于嵌入式系统,在系统启动阶段,bootloader会加载内核并将控制权转交给内核,此外,还需要把上述的三个参数信息传递给kernel,以便kernel可以有较大的灵活性。在linux kernel中,Device Tree的设计目标就是如此。
在devie tree中,可描述的信息包括:
1、CPU的数量和类别
2、内存基地址和大小
3、总线和桥
4、外设连接
5、中断控制器和中断的使用情况
6、GPIO控制器和GPIO使用情况
7、clock控制器和clock使用情况
它基本就是一棵电路板上的CPU、总线、设备组成的树,Bootloader会将这棵树传递给内核,然后内核来识别这棵树,并根据它展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、IRQ等资源,也被传递给内核,内核会将这些资源绑定给展开的相应设备