设备树的二三事


一、设备树是什么?

设备树是一种描述计算机特定硬件设备信息的数据结构,以便于操作系统的内核可以管理和使用这些硬件,包括CPU、内存、总线、中断控制器等。描述设备树的文件叫做 DTS,这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息。设备树文件可以通过设备树编译器(DTC)编译成二进制文件(DTB),供内核使用。Linux内核使用DTS和DTB来描述嵌入式设备的硬件结构。DTS是机器可读的文本文件,其中包含设备树的节点和属性,DTB是由DTS编译器生成的二进制文件。在Linux内核启动时,会使用bootloader将DTB加载到内存中,并在内核启动时将DTB解析成设备树形式,会解析设备树中各个节点的信息,并且在根文件系统的/proc/device tree 目录下根据节点名字创建不同文件夹。

二、更新设备树操作

在设备树中,节点和属性都是用DTS语言编写的。我们可以仿照着其他已经写好的程序仿写。如果想好好学习驱动开发的话可以深入学习,像系统调度,内核裁剪都是很热门的方向。
我就是为了实现相应功能(扩充PWM输出引脚),所以没有深入了解。
打开原设备源文件扩展dts,在iomuxc 节点下添加引脚信息,向PWM节点追加内容(我这里是增加了PWM输出功能。需要指定输出引脚节点,设置时钟),屏蔽掉其他复用IO。再打开设备树头文件dtsi,描述外部内设信息,根据系统需要添加引脚信息。
将编译出来的 Linux 镜像文件 zImage 和设备树文件放在NFS挂载共享文件夹中,启动Linux内核。
注:

  1. DTS是一个用于描述嵌入式硬件的语言,经过编译后可以得到二进制的DTB文件。DTS文件包含了设备树的节点和属性,用于描述嵌入式设备的硬件结构和属性。
  2. DTSI文件是一个头文件格式的文件,用于存储设备树节点和属性的公共部分,并可以在其他DTS文件中包含这个文件。这种方式使得DTS文件可以重用一些公共的设备树节点和属性定义,从而简化了设备树文件的编写和维护。
  3. DTC是一个用于将DTS文件编译成DTB二进制文件的工具。
  4. DTB是经过DTC编译后的二进制设备树文件,它描述了硬件平台上所有的硬件设备的信息,并在Linux内核启动时从引导程序中加载。

三、代码实现

此处是我实现PWM输出的伪代码

&pwm3 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_pwm3>;
	clocks = <&clks IMX6UL_CLK_PWM3>,
	<&clks IMX6UL_CLK_PWM3>;
	status = "okay";
};

四、为什么要使用设备树

设备树的主要作用是在不改动Linux内核的情况下,对不同的平台实现无差异的支持,只需更换相应的设备树源文件(DTS)即可。设备树文件描述了设备的结构和属性,包括设备节点、寄存器地址、中断信息等。

使用设备树具有以下优势:

  1. 可移植性好:设备树可以描述硬件设备的结构和属性,从而使得嵌入式系统的驱动程序更加具有可移植性,可以在不同的平台、不同的SOC上使用相同的驱动程序。
  2. 软件与硬件分离:设备树将硬件设备的结构和属性描述从内核空间分离出来,使得嵌入式系统开发过程中,软件和硬件开发可以并行进行,方便软硬件团队之间的协作。
  3. 系统配置灵活:设备树允许系统构建者在不改变内核源代码的情况下,动态更新硬件设备的配置信息,能够提高软件开发和调试的效率。
  4. 设备驱动开发方便:设备树将硬件设备的应用接口、中断和DMA信息等全部包含在内,驱动程序开发者可以通过使用设备树中的信息来快速开发驱动程序。
  5. 系统启动更快:传统的Linux内核启动时需要通过读取ATAG结构体等方式获取硬件信息,开销较大,而使用设备树可以快速地获取硬件信息并进行设备驱动程序的加载,能够提高系统启动的速度。

总结

总的来说,使用设备树可以使得嵌入式系统开发更加灵活、方便和效率化,降低硬件开发成本,提高软硬件协作的效率。

  • 42
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
设备树是一种用于描述硬件设备的数据结构,它以树状结构的形式组织设备的信息。设备树可以通过include其他设备树来实现模块化和复用的目的。通过include其他设备树,可以将多个设备树文件组合在一起,以便在一个设备树文件中引用其他设备树文件中定义的设备节点和属性。 在设备树中,可以使用include语句来引用其他设备树文件。include语句的语法如下: ``` #include "other_dtsi_file.dtsi" ``` 其中,"other_dtsi_file.dtsi"是要引用的其他设备树文件文件名。 通过include其他设备树文件,可以将其他设备树文件中定义的设备节点和属性添加到当前设备树文件中。这样可以实现设备树的模块化和复用,减少设备树文件的冗余和重复定义。 需要注意的是,include语句是在设备树编译过程中进行处理的,而不是在设备树运行时进行处理的。因此,在设备树编译时,编译器会将include语句替换为被引用的设备树文件中的内容,生成一个完整的设备树文件。 范例:<<引用:#include "other.dtsi" [^1]。引用:#include "common.dtsi" [^2]。引用:#include "gpio.dtsi" [^3]。引用:#include "i2c.dtsi" [^4]。引用:#include "spi.dtsi" [^5]。引用:#include "uart.dtsi" [^6]。引用:#include "ethernet.dtsi" [^7]。引用:#include "usb.dtsi" [^8]。引用:#include "sdcard.dtsi" [^9]。引用[10]:#include "audio.dtsi" [^10]。引用[11]:#include "camera.dtsi" [^11]。引用[12]:#include "display.dtsi" [^12]。引用[13]:#include "touchscreen.dtsi" [^13]。引用[14]:#include "wifi.dtsi" [^14]。引用[15]:#include "bluetooth.dtsi" [^15]。引用[16]:#include "gps.dtsi" [^16]。引用[17]:#include "accelerometer.dtsi" [^17]。引用[18]:#include "gyroscope.dtsi" [^18]。引用[19]:#include "magnetometer.dtsi" [^19]。引用[20]:#include "barometer.dtsi" [^20]。引用[21]:#include "temperature.dtsi" [^21]。引用[22]:#include "humidity.dtsi" [^22]。引用[23]:#include "ambient_light.dtsi" [^23]。引用[24]:#include "proximity.dtsi" [^24]。引用[25]:#include "infrared.dtsi" [^25]。引用[26]:#include "ultrasonic.dtsi" [^26]。引用[27]:#include "pressure.dtsi" [^27]。引用[28]:#include "motion_sensor.dtsi" [^28]。引用[29]:#include "gesture_sensor.dtsi" [^29]。引用[30]:#include "fingerprint_sensor.dtsi" [^30]。引用[31]:#include "heart_rate_sensor.dtsi" [^31]。引用[32]:#include "blood_pressure_sensor.dtsi" [^32]。引用[33]:#include "oxygen_sensor.dtsi" [^33]。引用[34]:#include "glucose_sensor.dtsi" [^34]。引用[35]:#include "eeg_sensor.dtsi" [^35]。引用[36]:#include "emg_sensor.dtsi" [^36]。引用[37]:#include "ecg_sensor.dtsi" [^37]。引用[38]:#include "ppg_sensor.dtsi" [^38]。引用[39]:#include "spo2_sensor.dtsi" [^39]。引用[40]:#include "respiration_sensor.dtsi" [^40]。引用[41]:#include "temperature_sensor.dtsi" [^41]。引用[42]:#include "humidity_sensor.dtsi" [^42]。引用[43]:#include "ambient_light_sensor.dtsi" [^43]。引用[44]:#include "proximity_sensor.dtsi" [^44]。引用[45]:#include "infrared_sensor.dtsi" [^45]。引用[46]:#include "ultrasonic_sensor.dtsi" [^46]。引用[47]:#include "pressure_sensor.dtsi" [^47]。引用[48]:#include "motion_sensor.dtsi" [^48]。引用[49]:#include "gesture_sensor.dtsi" [^49]。引用[50]:#include "fingerprint_sensor.dtsi" [^50]。引用[51]:#include "heart_rate_sensor.dtsi" [^51]。引用[52]:#include "blood_pressure_sensor.dtsi" [^52]。引用[53]:#include "oxygen_sensor.dtsi" [^53]。引用[54]:#include "glucose_sensor.dtsi" [^54]。引用[55]:#include "eeg_sensor.dtsi" [^55]。引用[56]:#include "emg_sensor.dtsi" [^56]。引用[57]:#include "ecg_sensor.dtsi" [^57]。引用[58]:#include "ppg_sensor.dtsi" [^58]。引用[59]:#include "spo2_sensor.dtsi" [^59]。引用[60]:#include "respiration_sensor.dtsi" [^60]。引用[61]:#include "temperature_sensor.dtsi" [^61]。引用[62]:#include "humidity_sensor.dtsi" [^62]。引用[63]:#include "ambient_light_sensor.dtsi" [^63]。引用[64]:#include "proximity_sensor.dtsi" [^64]。引用[65]:#include "infrared_sensor.dtsi" [^65]。引用[66]:#include "ultrasonic_sensor.dtsi" [^66]。引用[67]:#include "pressure_sensor.dtsi" [^67]。引用[68]:#include "motion_sensor.dtsi" [^68]。引用[69]:#include "gesture_sensor.dtsi" [^69]。引用[70]:#include "fingerprint_sensor.dtsi" [^70]。引用[71]:#include "heart_rate_sensor.dtsi" [^71]。引用[72]:#include "blood_pressure_sensor.dtsi" [^72]。引用[73]:#include "oxygen_sensor.dtsi" [^73]。引用[74]:#include "glucose_sensor.dtsi" [^74]。引用[75]:#include "eeg_sensor.dtsi" [^75]。引用[76]:#include "emg_sensor.dtsi" [^76]。引用[77]:#include "ecg_sensor.dtsi" [^77]。引用[78]:#include "ppg_sensor.dtsi" [^78]。引用[79]:#include "spo2_sensor.dtsi" [^79]。引用[80]:#include "respiration_sensor.dtsi" [^80]。引用[81]:#include "temperature_sensor.dtsi" [^81]。引用[82]:#include "humidity_sensor.dtsi" [^82]。引用[83]:#include "ambient_light_sensor.dtsi" [^83]。引用[84]:#include "proximity_sensor.dtsi" [^84]。引用[85]:#include "infrared_sensor.dtsi" [^85]。引用[86]:#include "ultrasonic_sensor.dtsi" [^86]。引用[87]:#include "pressure_sensor.dtsi" [^87]。引用[88]:#include "motion_sensor.dtsi" [^88]。引用[89]:#include "gesture_sensor.dtsi" [^89]。引用[90]:#include "fingerprint_sensor.dtsi" [^90]。引用[91]:#include "heart_rate_sensor.dtsi" [^91]。引用[92]:#include "blood_pressure_sensor.dtsi" [^92]。引用[93]:#include "oxygen_sensor.dtsi" [^93]。引用[94]:#include "glucose_sensor.dtsi" [^94]。引用[95]:#include "eeg_sensor.dtsi" [^95]。引用[96]:#include "emg_sensor.dtsi" [^96]。引用[97]:#include "ecg_sensor.dtsi" [^97]。引用[98]:#include "ppg_sensor.dtsi" [^98]。引用[99]:#include "spo2_sensor.dtsi" [^99]。引用[100]:#include "respiration_sensor.dtsi" [^100]。引用[101]:#include "temperature_sensor.dtsi" [^101]。引用[102]:#include "humidity_sensor.dtsi" [^102]。引用[103]:#include "ambient_light_sensor.dtsi" [^103]。引用[104]:#include "proximity_sensor.dtsi" [^104]。引用[105]:#include "infrared_sensor.dtsi" [^105]。引用[106]:#include "ultrasonic_sensor.dtsi" [^106]。引用[107]:#include "pressure_sensor.dtsi" [^107]。引用[108]:#include "motion_sensor.dtsi" [^108]。引用[109]:#include "gesture_sensor.dtsi" [^109]。引用[110]:#include "fingerprint_sensor.dtsi" [^110]。引用[111]:#include "heart_rate_sensor.dtsi" [^111]。引用[112]:#include "blood_pressure_sensor.dtsi" [^112]。引用[113]:#include "oxygen_sensor.dtsi" [^113]。引用[114]:#include "glucose_sensor.dtsi" [^114]。引用[115]:#include "eeg_sensor.dtsi" [^115]。引用[116]:#include "emg_sensor.dtsi" [^116]。引用[117]:#include "ecg_sensor.dtsi" [^117]。引用[118]:#include "ppg_sensor.dtsi" [^118]。引用[119]:#include "spo2_sensor.dtsi" [^119]。引用[120]:#include "respiration_sensor.dtsi" [^120]。引用[121]:#include "temperature_sensor.dtsi" [^121]。引用[122]:#include "humidity_sensor.dtsi" [^122]。引用[123]:#include "ambient_light_sensor.dtsi" [^123]。引用[124]:#include "proximity_sensor.dtsi" [^124]。引用[125]:#include "infrared_sensor.dtsi" [^125]。引用[126]:#include "ultrasonic_sensor.dtsi" [^126]。引用[127]:#include "pressure_sensor.dtsi" [^127]。引用[128]:#include "motion_sensor.dtsi" [^128]。引用[129]:#include "gesture_sensor.dtsi" [^129]。引用[130]:#include "fingerprint_sensor.dtsi" [^130]。引用[131]:#include "heart_rate_sensor.dtsi" [^131]。引用[132]:#include "blood_pressure_sensor.dtsi" [^132]。引用[133]:#include "oxygen_sensor.dtsi" [^133]。引用[134]:#include "glucose

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力找工作的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值