嵌入式开发记录-day39 设备树准备工作
1、设备树:字面意思就是设备以树的结构、形式组织排列起来;
期初设备所有的设备都放在平台文件上,主要为了节约空间、方便管理,将设备以树的形式组织起来;
2、设备树环境搭建:讯为在这里已经做了很多,简单先按照步骤使用起来;
1、将目录下itop4412_kernel_4_14_2_bsp-20190225.tar.gz 拷贝至Ubuntu下,并解压,
2、将压缩表编译器gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12.tar.gz拷贝至/usr/local/arm/目录下,并解压
3、切换到/root目录下,设置环境变量vim .bashrc ,并添加
export PATH=$PATH:/usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin
soucre .bashrc // 使配置文件生效
切换到/home/topeet下,设置环境变量vim .bashrc,最后一行添加
export PATH=$PATH:/usr/local/arm/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin
source .bashrc // 配置文件生效
4、进入内核源码linux-4.14.2_iTop-4412_scp
修改编译器vim Makefile ,搜索 /ARCH,修改编译器如下:
CROSS_COMPILE := arm-fsl-linux-gnueabi-
5、编译设备树
./build_all.sh
6、生成的镜像
生成的镜像--注意是SCP的核心板,不能支持POP的。
uboot镜像:
u-boot-2017.11/u-boot/u-boot-iTOP-4412.bin
内核镜像:
linux-4.14.2_iTop-4412_scp/arch/arm/boot/uImage
设备树镜像:
linux-4.14.2_iTop-4412_scp/arch/arm/boot/dts/exynos4412-itop-elite.dtb
3、烧写镜像
1、烧写镜像
fastboot.exe flash bootloader u-boot-iTOP-4412.bin
fastboot.exe flash kernel uImage
fastboot.exe flash dtb exynos4412-itop-elite.dtb
fastboot.exe flash system system.img(文件系统用系统编程中,搭建好的最小linux系统)
fastboot reboot(可以直接断电重启)
完成后,会有问题,开发板启动之后,会发现文件系统挂载不了,不能进入控制台提示找不到root device
使用少写了支持设备树的镜像后,不能再使用SD卡烧写镜像;
2、修改配置文件arch/arm/configs/iTop-4412_scp_defconfig:
将CONFIG_CMDLINE="root=/dev/mmcblk0p2 console=ttySAC2,115200 init=/linuxrc rootwait"
改为:CONFIG_CMDLINE="root=/dev/mmcblk1p2 console=ttySAC2,115200 init=/linuxrc rootwait"
重新烧写,可以挂载,但是控制台一直有pid报错的信息打印。需要处理最小linux系统。
3、发现新的问题,文件系统上无法新建文件夹: 在root=/dev/mmcblk1p2 后面添加 rw,表示文件系统可读可写,否则只能读,就不能新建文件夹和文件。
4、 再次烧写。
测试下tf卡(tf卡挂载OK) TF卡可以怪了,但是U盘还是不能挂在。
mkdir /mnt/udisk1
mount /dev/mmcblk0p1 /mnt/udisk1(mmcblk0p1根据系统系统真实识别情况来选择)
完成到这一步,后面就可以开始正式学习设备树的主体知识了。
4、设备树文件组成
1 设备树文件分为dts和bindings bindings设备树用到的所有宏定义,都放到bindings目录下 dts分为dts和dtsi文件,dts是板级文件,dtsi是“平台文件” 另外还有使用文档在Documentation/devicetree/下 4412开发板的设备树文件: arch/arm/boot/dts/exynos4412-itop-elite.dts 2 设备树文件之间的关系 从dts板级文件出发,到dtsi和dt-bindings文件。从头文件调用的关系来分析。 #include <dt-bindings/sound/samsung-i2s.h> #include <dt-bindings/pwm/pwm.h> #include <dt-bindings/gpio/gpio.h> #include <dt-bindings/input/input.h> #include "exynos4412-itop-scp-core.dtsi" --exynos4.dtsi ----dt-bindings/clock/exynos4.h ----dt-bindings/clock/exynos-audss-clk.h ----dt-bindings/interrupt-controller/arm-gic.h ----dt-bindings/interrupt-controller/irq.h ----exynos-syscon-restart.dtsi --exynos4412-pinctrl.dtsi ----dt-bindings/pinctrl/samsung.h --exynos4-cpu-thermal.dtsi ----include <dt-bindings/thermal/thermal.h> 3 dt-bindings会放所有需要用到的宏定义 4 以exynos4d的设备树文档和GPIO为例,简单介绍官方文档 Documentation/devicetree/usage-model.txt Documentation/devicetree/bindings/gpio/gpio-samsung.txt
5、设备树的文件的一些点
1、节点与根节点(树根节点和节点): 在节点中可以包含属性和子节点。
{} 框起来的结构,称为节点:节点的标准结构是xxx@yyy{…},xxx是节点的名字,yyy则不是必须的,其值为节点的地址(寄存器地址或其他地址)。
/{} 在dts中最开头的,称为根节点:
2、设备树学习的主要部分:设备树文件中属性的配置,驱动文件中调用设备树中的属性。
compatible--类似设备名称,这个参量很重要
reg,label,gpios,pwms,status等等
3、设备树的一些例子:设备与驱动通过compatible参量关联起来
3 设备树套路--带大家看下官方的设备树介绍文档 (Documentation/devicetree/usage-model.txt 106行) 设备树的三个主要目标: 1) platform identification, 2) runtime configuration, and 3) device population. 3.1 platform identification--确认平台 通过根节点的compatible属性 例如: compatible = "ti,omap3-beagleboard", "ti,omap3450", "ti,omap3"; compatible = "ti,omap3-beagleboard-xm", "ti,omap3450", "ti,omap3"; 4412的例子: compatible = "topeet,itop4412-elite", "samsung,exynos4412", "samsung,exynos4"; 3.2 runtime configuration--运行环境配置 大多数通过chosen节点 例如: chosen { bootargs = "console=ttyS0,115200 loglevel=8"; initrd-start = <0xc8000000>; initrd-end = <0xc8200000>; }; 4412的例子: chosen { bootargs = "root=/dev/mmcblk0p2 rw rootfstype=ext4 rootdelay=1 rootwait"; stdout-path = "serial2:115200n8"; }; 4 设备树例子: (Documentation/devicetree/usage-model.txt 256行) /{ compatible = "nvidia,harmony", "nvidia,tegra20"; #address-cells = <1>; #size-cells = <1>; interrupt-parent = <&intc>; chosen { }; aliases { }; memory { device_type = "memory"; reg = <0x00000000 0x40000000>; }; soc { compatible = "nvidia,tegra20-soc", "simple-bus"; #address-cells = <1>; #size-cells = <1>; ranges; intc: interrupt-controller@50041000 { compatible = "nvidia,tegra20-gic"; interrupt-controller; #interrupt-cells = <1>; reg = <0x50041000 0x1000>, < 0x50040100 0x0100 >; }; serial@70006300 { compatible = "nvidia,tegra20-uart"; reg = <0x70006300 0x100>; interrupts = <122>; }; i2s1: i2s@70002800 { compatible = "nvidia,tegra20-i2s"; reg = <0x70002800 0x100>; interrupts = <77>; codec = <&wm8903>; }; i2c@7000c000 { compatible = "nvidia,tegra20-i2c"; #address-cells = <1>; #size-cells = <0>; reg = <0x7000c000 0x100>; interrupts = <70>; wm8903: codec@1a { compatible = "wlf,wm8903"; reg = <0x1a>; interrupts = <347>; }; }; }; sound { compatible = "nvidia,harmony-sound"; i2s-controller = <&i2s1>; i2s-codec = <&wm8903>; }; }; 5 驱动获取设备树属性的例子 of_platform_populate(NULL, NULL, NULL, NULL) static void __init harmony_init_machine(void) { /* ... */ of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); } 使用设备树的原因: 1 省地方 2 safe assumption 3 Easy, right?
6、USB-HUB驱动和网卡驱动(直接使用提供的镜像,烧写进开发板就可以了)
1、USB-hub -usb3503A
驱动默认自带“3503A”的驱动源码
配置:默认已经配置,已经编译
运行状态:没有打印信息
供电什么的都是正常的。
我做这部分,思路是怎么样的?
1.1 如果没有usb3503A的驱动,直接先放弃做!
--一般不会出现这种情况,这个方案是三星的,肯定会提供的
1.2 有了驱动,配置驱动,测试!--不行--找设备树的配置
1.3 找到配置,可能需要修改gpio的管脚。
有驱动 + 默认配置 +
给大家提供配置好的设备树文件。
2、 网卡DM9621A ---- Linux中带了这个驱动
usb的设备驱动,不需要平台文件,在设备树中也不需要在设备树文件中添加任何代码!
在usb主控制器等驱动的情况下,只需要有驱动就成。
vi etc/eth0-setting 配置网络的ip等,重启开发板,ping的通就成
3、在设备树下增加了代码
usb3503A: 在设备树的根节点下增加以下配置代码 usbphy:usbphy@125B0000{ #address-cells=<1>; #size-cells=<1>; compatible="samsung,exynos4x12-usb2phy"; reg=<0x125B0000 0x100>; ranges; clocks=<&clock 2>,<&clock 305>; clock-names="xusbxti","otg"; usbphy-sys{ reg=<0x10020704 0x8 0x1001021c 0x4>; }; }; ehci@12580000{ status="okay"; usbphy=<&usbphy>; }; usb3503@08{ compatible="smsc,usb3503"; reg=<0x08 0x4>; connect-gpios=<&gpm3 3 1>; intn-gpios=<&gpx2 3 1>; reset-gpios=<&gpm2 4 1>; initial-mode=<1>; };
7、测试
U盘可以正常挂在,讯为还演示了NFS系统,不会用到,不做介绍;

浙公网安备 33010602011771号