---- 01 背景介绍 Fixmap机制是kernel在启动过程中(start_kernel)临时的映射机制,目的是在真正页表建立之前用于完成对io设备的访问、device-tree的解析以及paging_init 02 环境说明 2.1 硬件环境 某SOC芯片,CPU为8核cortex-A53,其DDR物理地址为0x800000000,device-tree存放的物理地址为0x843000000。 FIX_FDT~FIX_HOLE不属于该entry,即不可以用bm_pte做pte映射,也为后面device-tree的映射做了一个铺垫。 3.4 fixmap在device-tree应用介绍 3.4.1 映射过程分析 Device-tree的映射和early-console、early-ioremap的映射原理有所不同,主要区别在于FIX_FDT 通过分析kernel代码可知对于device-tree的映射需要建立一个2M的block entry即可,即在bm_pmd建立一个block entry。
# Remove existing partial dtbo echo -e "Remove existing partial dtbo:" rm -f /configfs/device-tree /overlays/*PR* rmdir /configfs/device-tree/overlays/*PR* rm -f /configfs/device-tree/overlays /*partial* rmdir /configfs/device-tree/overlays/*partial* mkdir /configfs/device-tree/overlays /overlays/* rmdir /configfs/device-tree/overlays/* mkdir /configfs/device-tree/overlays/fpga_full /overlays/fpga_partial/path else echo -n "$2" > /configfs/device-tree/overlays/fpga_full/path fi
2.3 加载设备树插件 首先在/sys/kernel/config/device-tree/overlays/下创建一个新目录。 mkdir /sys/kernel/config/device-tree/overlays/rgb_led 将rgb.dtbo文件拷贝到开发板的/sys/kernel/config/device-tree cat rgb.dtbo > /sys/kernel/config/device-tree/overlays/rgb_led/dtbo 和设备树相同,加载成功后就可以在“/proc/device-tree
petalinux-build -x package //To regenerate the image.ub, Image and rootfs.cpio.gz petalinux-build -c device-tree -x mrproper petalinux-build -c device-tree petalinux-build -c arm-trusted-firmware petalinux-build - c bootloader petalinux-build -c kernel petalinux-build -c u-boot petalinux-build -c device-tree -x mrproper
system_wrapper.bitTarget# mount -t configfs none /sys/kernel/configTarget# mkdir /sys/kernel/config/device-tree /overlays/full //创建full目录,可根据实际情况修改Target# echo pl.dtbo > /sys/kernel/config/device-tree/overlays/full Target# rmdir /sys/kernel/config/device-tree/overlays/fullTarget# mkdir /sys/kernel/config/device-tree /overlays/fullTarget# echo pl.dtbo > /sys/kernel/config/device-tree/overlays/full/path查看"/sys/class/gpio
system_wrapper.bitTarget# mount -t configfs none /sys/kernel/configTarget# mkdir /sys/kernel/config/device-tree /overlays/full //创建full目录,可根据实际情况修改Target# echo pl.dtbo > /sys/kernel/config/device-tree/overlays/full
devicetree/base, root@Linux:~ >ls -al /proc/device-treelrwxrwxrwx 1 root root 29 Mar 1 07:54 /proc/device-tree */of_core_init();proc_symlink("device-tree", NULL, "/sys/firmware/devicetree/base");platform_bus_init
Target# mount -t configfs configfs /configfsTarget# mkdir /configfs/device-tree/overlays/lcdTarget# echo Target# mkdir /configfs/device-tree/overlays/touch-screenTarget# echo touch-screen-ads7846.dtbo > /configfs /device-tree/overlays/touch-screen/path图 75命令执行后,可看到设备节点"/dev/fb0"与"/dev/input/touchscreen0"设备节点。 Target# mount -t configfs configfs /configfsTarget# mkdir /configfs/device-tree/overlays/lvdsTarget# echo axi-video-display-1080p.dtbo > /configfs/device-tree/overlays/lvds/path图 83加载完成后,文件系统将会生成"/dev/fb0
system_wrapper.bitTarget# mount -t configfs none /sys/kernel/configTarget# mkdir /sys/kernel/config/device-tree /overlays/full //创建full目录,可根据实际情况修改Target# echo pl.dtbo > /sys/kernel/config/device-tree/overlays/full
Target# mkdir /configfs Target# mount -t configfs configfs /configfs Target# mkdir /configfs/device-tree /overlays/full Target# echo -n zynq-zc706-overlay.dtbo > /configfs/device-tree/overlays/full/path ? Target# mkdir /configfs/device-tree/overlays/cameralink Target# echo -n "pl.dtbo" > /configfs/device-tree
PetaLinux建议在文件“project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi”里更改DTS。 比如PetaLinux在文件“components/plnx_workspace/device-tree/device-tree/zynqmp.dtsi”里定义了如下以太网的节点: gem3: ethernet
答:你可以检查/proc/device-tree/下的每个属性。 比如你想查看i2c@7000c000的状态,那么 nvidia@nvidia-desktop:/proc/device-tree$ xxd i2c@7000c000/status 00000000:
三、设备树在系统中的体现Linux 内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的 /proc/device-tree 目录下根据节点名字创建不同文件夹/proc/device-tree (1)输入以下命令,会进入/sys/firmware/devicetree/base : cd proc/device-tree/AI写代码如图,为根节点“/”的所有属性和子节点: 根节点的属性#address-cells 进入 /proc/device-tree/chosen 目录查看:bootargs 环境变量的值是在uboot 中设置的,而 uboot 中的 fdt_chosen 函数在设备树的 chosen 节点中加入了 调用关系如下:四、Linux 内核解析 DTB 文件流程Linux 内核在启动的时候会解析 DTB 文件,然后在/proc/device-tree 目录下生成相应的设备树节点文件。
四、修改dts,实现index的固定 在 project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi 中增加:
/proc/device-tree 三、问题 四、查看修改驱动 参考链接:MSM8937-MSM8953 UART配置调试指南 uart驱动是使用内核驱动,无需自己编写,一般只需修改设备树。 /proc/device-tree 是链接文件, 指向 /sys/firmware/devicetree/base 查看dump的fdt文件,发现里面是有uart6的配置信息,且配置是正确的。
用附件里的 system-user.dtsi 把 project-spec/meta-user/recipes-bsp/device-tree/files 里的同名文件覆盖掉,这是因为默认生成的 device
note:/proc/device-tree 是链接文件, 指向 /sys/firmware/devicetree/base 以上是 Linux 原生的节点,可以供我们使用。
U-Boot> fdt save ${fdt_addr_r} # 检查设备树完整性 U-Boot> fdt checks Linux 内核中的设备树查看: # 查看系统中的设备树 $ ls /proc/device-tree / # 查看特定设备属性 $ cat /proc/device-tree/soc/mmc@fe330000/compatible # 使用dtc工具反编译DTB $ dtc -I dtb -O dts
Target# mount -t configfs configfs /configfsTarget# mkdir /configfs/device-tree/overlays/fullTarget# echo pl.dtbo > /configfs/device-tree/overlays/full/path图 4由上图可知PL端实现的GPIO控制器为905。 Target# mount -t configfs configfs /configfsTarget# mkdir /configfs/device-tree/overlays/fullTarget# echo pl.dtbo > /configfs/device-tree/overlays/full/path图 27此时可在"/dev/"目录下看到串口设备节点ttyUL0。
Target# mount -t configfs configfs /configfsTarget# mkdir /configfs/device-tree/overlays/ethernetTarget # echo pl.dtbo > /configfs/device-tree/overlays/ethernet/path图 194执行如下命令关闭PS端网口eth0,并使PL端网口eth1自动获取IP class/fpga_manager/fpga0/firmwareTarget# mount -t configfs configfs /configfsTarget# mkdir /configfs/device-tree /overlays/emio_emacTarget# echo emio-emac-demo-overlay.dtbo > /configfs/device-tree/overlays/emio_emac