Linux驱动开发 ---- 4.3_设备树配置与查看
目录
在 Linux 中,设备树(Device Tree)是一种描述硬件设备的结构化数据格式,用于告诉内核硬件的拓扑和配置,尤其是针对嵌入式平台。设备树通常用于 ARM、PowerPC 和其他一些架构的硬件配置中。它使得 Linux 内核能够识别硬件设备而不依赖于硬编码。
1. 查看设备树文件并理解设备节点的定义
设备树文件通常位于 /boot/dtbs/
目录下,或者在内核源代码的 arch/arm/boot/dts/
目录下。文件的扩展名通常是 .dts
,并且它是纯文本格式,描述了硬件设备的拓扑和配置。常见的设备树文件名格式为 <platform>.dts
或 <platform>-<board>.dts
。
示例:查看设备树文件
# 查看设备树目录
ls /boot/dtbs/$(uname -r)/
通过这个命令,你可以查看当前内核版本的设备树文件。如果你正在编译自己的内核,也可以在内核源代码目录下找到设备树源文件。
设备树文件中的内容通常会包括以下几部分:
- CPU 节点:描述处理器的类型、数量和配置。
- 内存节点:描述系统内存的大小和位置。
- 外设节点:描述各种硬件外设(如 UART、SPI、I2C 控制器等)的配置。
- 中断节点:描述设备使用的中断资源。
设备树节点示例:
/ {
model = "Custom Board";
compatible = "manufacturer,board";
memory {
name = "memory";
reg = <0x80000000 0x10000000>; // 内存地址和大小
};
uart0: serial@101f1000 {
compatible = "arm,pl011";
reg = <0x101f1000 0x1000>;
interrupt = <0 29 4>;
clock-frequency = <1843200>;
};
};
在这个例子中,设备树描述了一个名为 uart0
的串口设备,使用 pl011
兼容的串口控制器。
2. 在设备树中增加自定义设备节点
在设备树中增加自定义设备节点,通常是为了描述一个新的硬件设备或配置。例如,我们要在设备树中增加一个新的 GPIO 设备节点。假设我们希望将设备的 GPIO 引脚配置为控制一个简单的 LED 灯。
操作步骤:
- 编辑设备树源文件(.dts):
打开设备树源文件(通常位于 /arch/arm/boot/dts/
,具体路径取决于你的硬件平台),找到适合你新增设备的部分。
sudo vim /path/to/your/device/tree.dts
- 在设备树中增加节点:
假设我们要添加一个自定义的 LED 设备,配置一个 GPIO 控制器来控制它:
led_gpio: led_gpio@0 {
compatible = "gpio-leds";
gpios = <&gpio1 22 GPIO_ACTIVE_HIGH>; // GPIO 控制器和引脚配置
led-name = "my_led";
default-state = "off";
};
gpio-leds
是一个 LED 控制器,使用 GPIO 控制。gpios
描述了该 LED 所连接的 GPIO 引脚的编号和状态(这里假设是 GPIO1 号引脚,编号为 22)。led-name
是该 LED 的名字。default-state
设置 LED 的默认状态为关闭。
- 编译设备树文件:
在对设备树源文件进行修改后,需要将其编译为内核可以加载的设备树二进制文件(.dtb
)。这可以通过以下命令完成:
# 进入设备树目录,编译设备树
cd /path/to/kernel/source/
make ARCH=arm dtbs
对于大多数 Linux 系统,dtb
文件将在 arch/arm/boot/dts/
目录下生成。
- 将设备树文件拷贝到 /boot 目录:
编译完成后,将生成的设备树文件(*.dtb
)拷贝到 /boot
目录下。你可以使用如下命令:
sudo cp arch/arm/boot/dts/<your_device>.dtb /boot/dtbs/$(uname -r)/
- 加载设备树文件并重新启动系统:
设备树文件会在系统启动时被加载。你可以通过修改引导加载器(如 U-Boot 或 GRUB)来指定设备树文件,或者直接在系统启动时加载新的设备树文件。
sudo reboot
设备树加载完成后,新的设备节点就可以在 /sys
或 /dev
等路径下看到。
3. 查看新增的设备节点
一旦设备树文件加载并注册了设备,你可以通过 sysfs
来检查是否成功添加了新设备。比如,可以通过以下命令查看:
# 查看是否能找到新添加的 GPIO 控制器
ls /sys/class/gpio/
如果设备树配置正确,你应该能够在该路径下看到与 led_gpio
相关的文件或设备。
总结:
通过设备树,Linux 内核可以方便地识别和配置硬件设备。添加自定义设备节点需要:
- 编辑设备树源文件(.dts),描述设备及其配置。
- 编译设备树文件,生成
.dtb
文件。 - 将
.dtb
文件加载到内核,通常是在引导时加载。 - 使用
sysfs
或devfs
来访问和操作新添加的设备。
这是设备树的一个简单示例,实际的设备树文件根据硬件平台和设备类型可能会有不同的配置方法和复杂性。