dtb文件放在哪里内核才能调用|如何在ARM Linux上使用FDT和initrd

『壹』 dtb是什么文件怎么打开

dtb是可以减少linux内核版本数量的文件,打开方式如下:

1、首先,网络搜索框中输入UltraEdit,然后单击网络一下,如下图所示,然后进入下一步。

『贰』 linux怎么调用dts生成dtb

dtb文件作用的描述是,使用dtb可以减少linux内核版本的数量。同一份linux 内核代码可以在多个板卡上运行,每个板卡可以使用自己的dtb文件。1,在linux内核启动过程中会解析dtb文件,根据dtb文件中设备列表进行加注各个外设的驱动模块。2,PC机在启动时会自动扫描外设,而在嵌入式中,linux内核启动过程中只是解析dtb文件,从而加载对应的模块。3,编译linux内核时必须选择某外设模块,并且dtb中包括该外设的信息。在linux内核启动过程中才能自动加载该模块。要使用dtb,需要uboot启动内核时,在bootm命令中指定dtb的位置,格式为:bootm uImage_addr ramdisk_addr dtb_addr如果没有ramdisk,就需要写成bootm uImage_addr – dtb_addr,用“-”表示没有ramdisk

『叁』 如何在ARM Linux上使用FDT和initrd

这文章算是最近工作的备忘。FDT是ARM Linux最新的设备驱动程序信息表,使用FDT的内核,就不用像过去的内核那样,一个板子加一个mach的C文件,所有的设备信息可以记录在一个树状信息文件里面。目前这方面资料比较少,我以AM335x处理器为例概括一下FDT的使用:FDT仅仅是一个信息的目录和参数表,要使用某个功能内核中还必须有相应的驱动程序代码FDT的源文件位置在:arch/arm/boot/dts,例如,TI的Beagle bone black,源文件是arch/arm/boot/dts/am335x_boneblack.dtsFDT在make ARCH=arm的时候就会自动生成,也可用make ARCH=arm dtbs来生成,例如TI的Beagle bone black生成的文件是arch/arm/boot/dts/am335x_boneblack.dtb,这是一个二进制文件要想新增你自定义的FDT,请修改arch/arm/boot/dts/Makefile,并在相应的Kconfig中增加config选项,例如,TI的Beagle bone black,Kconfig的位置在arch/arm/mach-omap2/KconfigFDT的dtb文件由u-boot传递给内核,u-boot必须把这个文件拷贝到内核解压地址之后的某个位置,确保内核解压的时候不会覆盖,然后使用“bootm [内核地址] – [dtb地址]”来启动内核如果dtb文件不正确,对于3.10以上的内核,可能什么显示都没有,3.8内核,可能就显示到Uncompressing kernel……doneFDT的编写规则说明在Documentation/devicetree/bindings,不同的设备有相应的txt文件说明,其中的“compatible”可以作为关键字搜索驱动程序的源文件,例如,AM335x的GPIO,用“ti,omap4-gpio”为关键字,可以找到其代码位于drivers/gpio/gpio-omap.cFDT可以包含子文件,比如am335x_boneblack.dts就包含了am33xx.dtsi,am335x-bone-common.dtsi以一个例子来说明编写规则,我的板子上,I2C0上挂了一个音频CODEC,其地址是0x18,型号是TLV320AIC3104IRHBT。先找到i2c0节点的位置,这在arch/arm/boot/dts/am33xx.dtsi中:i2c0: [email protected] {compatible = "ti,omap4-i2c";#address-cells = <1>;#size-cells = <0>;ti,hwmods = "i2c1";reg = <0x44e0b000 0x1000>;interrupts = <70>;status = "disabled";};要在这个节点上挂东西,可以直接在am33xx.dtsi中挂,可以写成这样:i2c0: [email protected] {compatible = "ti,omap4-i2c";#address-cells = <1>;#size-cells = <0>;ti,hwmods = "i2c1";reg = <0x44e0b000 0x1000>;interrupts = <70>;status = "okay";tlv320aic3x: tlv320aic3[email protected] {compatible = "ti,tlv320aic3x";reg = <0x18>;status = "okay";AVDD-supply = <&ldo4_reg>;IOVDD-supply = <&ldo4_reg>;DRVDD-supply = <&ldo4_reg>;DVDD-supply = <&ldo4_reg>;};};其中compatible字串“ti,tlv320aic3x”是在Documentation/devicetree/bindings里面全文搜索“tlv320aic”获得的,“tlv320aic3x: [email protected]”遵循的是“标识符:名称@地址”的格式,前面的“i2c0: [email protected]”也是这个格式。这里的标识符可以在包含这个文件的文件或这个文件的其他位置引用,因此,可以使用arch/arm/boot/dts/am335x-boneblack.dts包含arch/arm/boot/dts/am33xx.dtsi,然后在am335x-boneblack.dts里写:&i2c0 {status = "okay";tlv320aic3x: [email protected] {compatible = "ti,tlv320aic3x";reg = <0x18>;status = "okay";AVDD-supply = <&ldo4_reg>;IOVDD-supply = <&ldo4_reg>;DRVDD-supply = <&ldo4_reg>;DVDD-supply = <&ldo4_reg>;};};&i2c0表示引用了i2c0这个标识符,然后把括号里的内容挂载到标识符下,如果属性的名字相同,例如status出现两次,前面是“disabled”后面是“okay”,以后面的为准,引用标识符的次数不受限制。也许一开始会觉得FDT的工作过程很神秘,但你只要用compatible的字串去全文搜索一下C文件,然后仔细阅读一下,就会发现很简单,没过几分钟你就可以自定义FDT节点的属性了。反倒是这些操作过程我没找到什么文档说,比较头痛,所以我把这些写出来,希望能给大家帮助。下面说说initrd,initrd的用处是给内核一个初始的基本文件系统,用来加载内核模块之类的东西。很多人觉得嵌入式系统不需要initrd,也可以把initrd作为最终的根文件系统。我用initrd是用来校验真正的根文件系统,因为在嵌入式设备上,无法预测用户到底什么时候关机,可能会造成文件系统问题。initrd可以用buildroot,像制作正常文件系统一样做,最后把根下的linuxrc换成一个例如下面这样的文件:#!/bin/sh/bin/echo Now Check SD Card/sbin/fsck.ext4 /dev/mmcblk0p5虽然Documentation/initrd.txt里面说,内核会执行initrd里面的/sbin/init,但在我用的linux-3.8.13上,init/do_mounts_initrd.c里面,执行的是/linuxrc,不知道是不是文档没有更新过来。具体的调用顺序是,kernel_init(init/main.c) > kernel_init_freeable(init/main.c) > prepare_namespace(init/do_mounts.c) > initrd_load(init/do_mounts_initrd.c) > handle_initrd (init/do_mounts_initrd.c)。在使用initrd的时候有几点需要注意的:不建议在initrd上挂载别的东西,会引起未知的问题,貌似看到个文章说这个,找不到了因为上面的这条,而且在initrd的时候,内核还没有挂载devtmpfs,因此建议使用静态设备节点,以AM335x为例(内核参数console=/dev/ttyO0,115200n8),必须的节点有:/dev/null/dev/console/dev/ttyO0这些节点可以用fakeroot之后mknod在buildroot的output/target/dev里创建,除了/dev/console,buildroot会自己创建,其他也可以写到buildroot的system/device_table.txt里面让buildroot自动创建:# /dev/null c 666 0 0 1 3 – – -/dev/ttyO0 c 600 0 0 250 0 – – -如果你用的是Atmel的处理器,上面的ttyO0可能是ttyS0,如果是三星的,可能是ttySAC0,而且major和minor也会不一样,请自行解决。如果你像我一样要检验SD卡,那就还必须加上SD卡的分区对应的节点。/linuxrc可以是个程序也可以是个脚本,脚本的话,命令写绝对路径,而且记得把/linuxrc的mode改为755使用initrd只需要用u-boot把buildroot制作的文件系统映像拷贝到内存里,然后传递initrd=[地址],[容量]这样的参数给内核,例如initrd=0x81300000,8M,最终的root参数可以不变,例如root=/dev/mmcblk0p5,这表示最终的root是SD卡上扩展分区中的第一个逻辑分区。给两个内核参数的例子:console=ttyO0,115200n8 root=/dev/mmcblk0p5 initrd=0x81300000,8M vram=16M consoleblank=0console=ttyO0,115200n8 initrd=0x81300000,8M root=/dev/nfs rw nfsroot=192.168.5.226:/home/c/nfsroot ip=192.168.5.222:192.168.5.226:192.168.5.1:255.255.255.0:core335x:eth0:off vram=16M consoleblank=0第一个不解释了,第二个表示使用initrd,同时使用nfsroot。最后啰嗦一句,使用initrd需要在内核配置里打开支持,这个网上的资料太多了,我就不说在哪里了。


赞 (0)