嵌入式开发记录-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
View Code

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?
View Code

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系统,不会用到,不做介绍;

 

posted @ 2020-09-05 18:06  笑不出花的旦旦  阅读(242)  评论(0)    收藏  举报