10. 配置文件&设备树&设备树插件

10.1. 设备树

Linux内核从3.x开始引入设备树的概念,实现驱动代码与设备信息相分离。 设备树用于描述一个硬件平台的硬件资源。这个“设备树”可以被bootloader(uboot)传递到内核, 内核可以从设备树中获取硬件信息。 相当于使用定制的设备树就可以操作不一样的硬件资源, 比如i2c,spi,mipi,mini-pcie,i2s等接口,都是通过设备树去配置使能才能去正常操作它们。

未找到图片

设备树以“树状”结构描述硬件资源。例如本地总线为树的“主干”在设备树里面称为“根节点”, 挂载到本地总线的spi总线为树的“枝干”在设备树里称为“根节点的子节点”, spi总线下的spi设备不止一个,这些“枝干”又可以再分。

10.1.1. 设备树的使用

在LubanCat-RK系列的板子中,每块板子都有自己的主设备树,位于 /boot/dtb 里,如下:

1
2
ls /boot/dtb/
overlay  rk3576-lubancat-3.dtb  rk3576-lubancat-generic.dtb

由于我们的通用镜像需要支持很多不同的板子,因此,我们通过开机读取设备id改变设备树,从而适配不同的板子

LubanCat-RK系列的板子的设备树由一个文件来指定,它是 /boot/rk-kernel.dtb

LubanCat-3如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
ls -l /boot/
-rw-rw-r-- 1 root root     1703 Jan  6 07:19 boot.cmd
-rw-rw-r-- 1 root root     1775 Jan  6 07:19 boot.scr
-rw-rw-r-- 1 root root   216700 Jan  6 07:19 config-6.1.99-rk3576
drwxrwxr-x 3 root root     1024 Jan  6 07:19 dtb
drwxrwxr-x 2 root root     1024 Jan  6 07:19 extlinux
-rw-rw-r-- 1 root root 38857216 Jan  6 07:19 Image-6.1.99-rk3576
-rw-rw-r-- 1 root root  8436090 Jan  6 07:19 initrd-6.1.99-rk3576
drwxrwxr-x 2 root root     1024 Jan  6 07:19 kerneldeb
-rw-rw-r-- 1 root root  1215954 Jan  6 07:19 logo.bmp
-rw-rw-r-- 1 root root  1215954 Jan  6 07:19 logo_kernel.bmp
drwx------ 2 root root    12288 Jan  6 07:19 lost+found
-rw-rw-r-- 1 root root   267616 Jan  6 07:19 rk-kernel.dtb -> dtb/rk3576-lubancat-3.dtb
-rw-rw-r-- 1 root root  5957993 Jan  6 07:19 System.map-6.1.99-rk3576
drwxrwxr-x 2 root root     1024 Jan  6 07:19 uEnv

rk-kernel.dtb 是通过软链接的方式链接到 dtb/rk3576-lubancat-3.dtb 这个设备树上的, 所以在系统启动时会使用该设备树进行启动。

如果想要切换设备树

1
2
3
4
5
#进入/boot目录下
cd /boot

#切换rk3576-lubancat-generic.dtb设备树启动
ln -sf dtb/rk3576-lubancat-generic.dtb rk-kernel.dtb

注意

使用ln命令时,一定要使用相对路径,不能使用绝对路径。

LubanCat各设备的设备树

板子名称

配置文件名称

说明

LubanCat-RK

rk3576-lubancat-generic.dtb

通用板卡的配置文件,用于第一次启动配置系统

Lubancat-3

rk3576-lubancat-3.dtb

适用于EBF410513

10.2. 配置文件

在LubanCat-RK系列的板子中,配置文件是一个十分重要的功能,配置文件可以配置设备树插件的开启与关闭, 内核的启动参数,选择启动的内核。配置文件所在的位置为 /boot/uEnv

1
2
ls /boot/uEnv/
uEnvLubanCat3.txt  uEnvLubanCat.txt  uEnv.txt
  • 可以看到有多种配置文件

LubanCat各设备的配置文件

板子名称

配置文件名称

说明

当前使用的板卡

uEnv.txt

系统会自动把板卡的配置文件链接到该文件

LubanCat-RK

uEnvLubanCat.txt

通用板卡的配置文件,用于第一次启动配置系统

Lubancat-3

uEnvLubanCat3.txt

适用于EBF410513

注解

uEnv.txt在新版本镜像中会自动软链接到对应板卡的配置文件,可以使用ls -l /boot/uEnv/uEnv.txt 或者 ls -l /boot/uEnv 查看实际链接的配置文件

LubanCat-3如下所示:

1
2
3
-rw-rw-r-- 1 root root 323 Jan  6 07:19 uEnvLubanCat3.txt
-rw-rw-r-- 1 root root 209 Jan  6 07:19 uEnvLubanCat.txt
-rw-rw-r-- 1 root root 311 Jan  6 07:19 uEnv.txt -> uEnvLubanCat3.txt
  • 配置文件解析

LubanCat-3如下图所示:

未找到图片
  • 修改 uname_r 的参数,可以让LubanCat在uboot阶段去加载Image-${uname_r}的内核和initrd-${uname_r}

  • 修改 cmdline 可以配置内核启动的参数,该选项自行配置,这里就不过多赘述了

  • 设备树插件前面没有 # 表示为设备树插件没有被注释掉,这时候设备树插件是属于开启的状态

  • 设备树插件前面有 # 表示为设备树插件被注释掉了,这时候设备树插件是属于关闭的状态

  • dtoverlay=dtb/overlay/xxx.dtbo dtoverlay=后面接的就是设备树插件的路径和设备树插件,直接查看该路径是没有该文件夹的, 需要插入基地址 /boot 即需要访问 /boot/dtb/overlay/,设备树插件的访问区域 仅限于/boot/路径下,如果需要自己添加设备树插件,请把设备树插件放到/boot目录下, 并配置正确的设备树插件的路径。

注意

修改完配置文件后,需要重启才能使配置文件生效, 请不要通过拔插电作为重启的方式, 因为你的拔插上下电可能会导致文件没有完全写进到存储介质中, 会导致上电后发现配置文件没有修改成功。 如果真的需要通过拔插电作为重启, 需要在拔插前运行 sync 的命令, 让配置文件写进存储介质中。

10.3. 设备树插件

Linux4.4以后引入了动态设备树(Dynamic DeviceTree)。 设备树插件可以理解为主设备树的“补丁”它动态的加载到系统中,并被内核识别。

我们可以这样理解设备树插件:主设备树为一颗大树,设备树插件就相当于园丁, 园丁不仅可以修剪枝叶,还可以给大树进行稼接操作。

  • 修剪:把一部分不需要的设备禁止使能

  • 嫁接:添加新的东西到主设备里,例如:创建新的设备节点

10.3.1. 设备树插件的使用

LubanCat-RK系列的板子的设备树插件位于 /boot/dtb/overlay

1
2
3
4
5
6
root@lubancat:/boot/dtb/overlay# ls
rk3576-lubancat-i2c7-m1-overlay.dtbo
rk3576-lubancat-pwm1-ch0-m3-overlay.dtbo
....

#集合了LubanCat-rk3576系列的所有的板子的设备树插件

而配置设备树插件的方法是修改设备树插件的配置文件,配置文件位于 /boot/uEnv 内,如上一小节的内容

10.3.1.1. 修改配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#修改你的板子的配置文件
sudo vi /boot/uEnv/uEnv.txt

#或者(xxx为板卡实际的配置文件)
sudo vi /boot/uEnv/uEnvxxx.txt

#下列为vim打开配置文件的内容
uname_r=6.1.99-rk3576
size=0x1000000
cmdline="earlyprintk console=ttyFIQ0 console=tty1 consoleblank=0 loglevel=7 rootwait rw rootfstype=ext4"

enable_uboot_overlays=1
#overlay_start

dtoverlay=/dtb/overlay/rk3576-lubancat-i2c7-m1-overlay.dtbo
#dtoverlay=/dtb/overlay/rk3576-lubancat-pwm1-ch0-m3-overlay.dtbo

#overlay_end
  • 打开设备树插件的方法就是把相应的设备树插件的注释删除掉,即删除 ‘#’

  • 关闭设备树插件的方法是把相应的设备树插件注释掉,即行首添加 ‘#’

  • 由上面的配置文件中可以看出 i2c7-m1 是没有被注释的, 所以目前他们是开启的状态。

  • pwm1-ch0-m3 是被注释掉的,所以目前他们是关闭的状态。

更多关于设备树以及设备树插件的内容,可以去访问LubanCat-RK系列的系统构建的手册。