【ARM】imx6ul移植u-boot记录,恩智浦github提供的最新uboot(2023年7月31)

68 篇文章 20 订阅
34 篇文章 8 订阅

❤️作者主页:凉开水白菜
❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步!
❤️专栏目录:
❤️专栏资料:https://gitee.com/stylle/linux_code
❤️点赞 👍 收藏 ⭐再看,养成习惯

订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑!



一、简介

本文使用的芯片是imx6ul,移植目标完成对恩智浦github提供的最新uboot(2023年7月31)

二、源码下载

github:https://github.com/nxp-imx/uboot-imx

百度云链接:https://pan.baidu.com/s/1wpWcMYb1tRFIMP0ZQcFGuA?pwd=rmtp

tar xvf  uboot-imx.tar.gz

三、官方配置编译

修改Makefile在源码大概275行左右添加下面的代码给ARCH变量和CROSS_*COMPILE变量赋值,ARCH表示架构如果为32位这里填写arm如果是64位这里填写arm64,CROSS_COMPILE 表示编译器前缀,我这里使用的是arm-linux-gnueabihf- ,如果是使用其他编译器例如aarch64-linux-gnu-等
在这里插入图片描述

ARCH = arm
CROSS_COMPILE = arm-linux-gnueabihf-

然后我们需要在官方的配置文件中找一个配置文件来测试编译,最好是找该板子的evk配置也就是官方出的板子的配置文件,所有的配置文件存在与uboot/configs中,我们这里使用的是emmc所以选择mx6ul_14x14_evk_emmc_defconfig文件,然后我们执行make 函数生成.config文件,然后就可以执行make进行uboot的编译了
在这里插入图片描述

// 先清除配置文件
make distclean
make mx6ul_14x14_evk_emmc_defconfig
make -j8

我这里在执行make mx6ul_14x14_evk_emmc_defconfig时候报错

错误 sh: 1: ./scripts/gcc-version.sh: Permission denied

sh xxxx表示程序想执行xxxx这个文件,但是不被允许,出现报错Permission denied

// 因为后面还会遇到该文件夹中其他文件所以我们直接赋予全部文件使用权
sudo chmod +777 ./scripts/* 

错误 include/ctype.h:1:1: error: expected identifier or ‘(’ before numeric constant linux/ctype.h

在这里插入图片描述
我们打开文件可以看到该信息不符合头文件的定义我们修改为如下

#include <linux/ctype.h>

执行make过后出现以下信息表示我们的uboot编译成功
在这里插入图片描述
这里的u-boot-dtb.imx就是我们的uboot文件-dtb也就是说我们的uboot支持设备树,后面移植我们就可以通过设备树来修改我们的uboot驱动

四、官方配置uboot测试

烧录到sd卡

sudo dd if=u-boot-dtb.imx of=/dev/sdb bs=1K seek=1 && sync

dd命令可从标准输入或文件中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出。详细命令解释参见:https://www.runoob.com/linux/linux-comm-dd.html

  • if=文件名:输入文件名,默认为标准输入。即指定源文件。
  • of=文件名:输出文件名,默认为标准输出。即指定目的文件。
  • bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
  • conv=<关键字>,关键字可以有以下11种:
    • conversion:用指定的参数转换文件。
    • ascii:转换ebcdic为ascii
    • ebcdic:转换ascii为ebcdic
    • ibm:转换ascii为alternate ebcdic
    • block:把每一行转换为长度为cbs,不足部分用空格填充
    • unblock:使每一行的长度都为cbs,不足部分用空格填充
    • lcase:把大写字符转换为小写字符
    • ucase:把小写字符转换为大写字符
    • swap:交换输入的每对字节
    • noerror:出错时不停止
    • notrunc:不截短输出文件
  • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

存储设备检查

在这里插入图片描述
根据自己板子存储信息进行核对这里我的emmc驱动正常

网络设备检查

uboot 启动的时候提示“Board Net Initialization Failed”和“No ethernet found.”这两行,说明网络驱动也有问题
在这里插入图片描述

五、添加自己的Board配置文件

其实我们移植uboot和kernel的根本就是在官方提供的官方的配置板子上修改出我们自己的板子,所以前面的配置编译测试也是非常重要的,我们需要找到自己板子能使用的最多驱动的那个配置,然后在那个配置上进行修改,下面开始我们的板子移植;

拷贝我们开始使用的默认配置为我们自己的配置 mx6ul_boardv1_defconfig这个名字需要记住

cp mx6ul_14x14_evk_emmc_defconfig mx6ul_boardv1_defconfig

拷贝官方提供的公共头文件

cp include/configs/mx6ul_14x14_evk.h include/configs/mx6ul_boardv1.h

添加我们的板子文件夹

cp -r board/freescale/mx6ul_14x14_evk/ board/freescale/mx6ul_boardv1/
mv board/freescale/mx6ul_boardv1/mx6ul_14x14_evk.c board/freescale/mx6ul_boardv1/mx6ul_boardv1.c

创建设备树文件

// 拷贝我们的设备树
cp arch/arm/dts/imx6ul-14x14-evk-emmc.dts arch/arm/dts/imx6ul-boardv1-emmc.dts
cp arch/arm/dts/imx6ul-14x14-evk.dts arch/arm/dts/imx6ul-boardv1.dts
cp arch/arm/dts/imx6ul-14x14-evk.dtsi arch/arm/dts/imx6ul-boardv1.dtsi

修改imx6ul-boardv1-emmc.dts设备树的包含设备树

#include "imx6ul-boardv1.dts"

修改imx6ul-boardv1.dts

#include "imx6ul-boardv1.dtsi"

具体的关系对应如下

  • imx6ul-14x14-evk.dts -> imx6ul-boardv1.dts 修改 #include “imx6ul-boardv1.dtsi”
  • imx6ul-14x14-evk.dtsi -> imx6ul-boardv1.dtsi
  • imx6ul-14x14-evk-emmc.dts -> imx6ul-boardv1-emmc.dts 修改#include “imx6ul-boardv1.dts”

修改配置文件

vim configs/mx6ul_boardv1_defconfig
// CONFIG_TARGET_MX6ULL_14X14_EVK=y ->  目标板
CONFIG_TARGET_MX6UL_BOARDV1
// CONFIG_DEFAULT_DEVICE_TREE="imx6ul-boardv1-emmc" 设备树修改
CONFIG_DEFAULT_DEVICE_TREE="imx6ul-14x14-evk-emmc"
// CONFIG_IMX_CONFIG="board/freescale/mx6ul_14x14_evk/imximage.cfg" 配置文件修改
CONFIG_IMX_CONFIG="board/freescale/mx6ul_boardv1/imximage.cfg"
// CONFIG_DM_74X164=y  io扩展模块 我们自己的板子基本都没做这个相应的使用的软件spi也需要注释掉
# CONFIG_DM_74X164=y
# CONFIG_SOFT_SPI=y

修改board中的文件imximage.cfg修改

vim board/freescale/mx6ul_boardv1/imximage.cfg
// PLUGIN  board/freescale/mx6ul_14x14_evk/plugin.bin 0x00907000
PLUGIN  board/freescale/mx6ul_boardv1/plugin.bin 0x00907000

修改Kconfig文件,修改前

if TARGET_MX6UL_14X14_EVK || TARGET_MX6UL_9X9_EVK

config SYS_BOARD
        default "mx6ul_14x14_evk"

config SYS_VENDOR
        default "freescale"

config SYS_CONFIG_NAME
        default "mx6ul_14x14_evk"

config SYS_TEXT_BASE
        default 0x87800000
endif

修改后

// 对应defconfig文件中的CONFIG_TARGET_MX6UL_BOARDV1
if TARGET_MX6UL_BOARDV1 || TARGET_MX6UL_9X9_EVK

// 目标板
config SYS_BOARD
        default "mx6ul_boardv1"

config SYS_VENDOR
        default "freescale"
// 板子名称
config SYS_CONFIG_NAME
        default "mx6ul_boardv1"

config SYS_TEXT_BASE
        default 0x87800000
endif

Makefile的修改

// obj-y  := mx6ul_14x14_evk.o 输出目标文件改为我们的.c文件
obj-y  := mx6ul_14x14_boardv1.o

MAINTAINERS的修改

MX6ULEVK BOARD
M:      Peng Fan <peng.fan@nxp.com>
S:      Maintained
// board/freescale/mx6ul_14x14_evk/ 板子文件夹
F:      board/freescale/mx6ul_boardv1/
//  include/configs/mx6ul_14x14_evk.h板子头文件
F:      include/configs/mx6ul_boardv1.h
// configs/mx6ul_14x14_evk_defconfig 板子配置文件
F:      configs/mx6ul_boardv1_defconfig
F:      configs/mx6ul_9x9_evk_defconfig

头文件的修改bootcmd指令

vim include/configs/mx6ul_boardv1.h

配置我们的设备树文件名字

"findtee="\
                        "if test $tee_file = undefined; then " \
                                "if test $board_name = EVK && test $board_rev = 9X9; then " \
                                        "setenv tee_file uTee-6ul9x9evk; fi; " \
                                "if test $board_name = EVK && test $board_rev = 14X14; then " \
                                        "setenv tee_file uTee-6ulevk; fi; " \
                                "if test $board_name = BOARDV1 && test $board_rev = 14X14; then " \
                                        "setenv tee_file uTee-6ulevk; fi; " \
                                "if test $fdt_file = undefined; then " \
                                        "echo WARNING: Could not determine tee to use; fi; " \
                        "fi;\0" \
                "findfdt="\
                        "if test $fdt_file = undefined; then " \
                                "if test $board_name = EVK && test $board_rev = 9X9; then " \
                                        "setenv fdt_file imx6ul-9x9-evk.dtb; fi; " \
                                "if test $board_name = EVK && test $board_rev = 14X14; then " \
                                        "setenv fdt_file imx6ul-14x14-evk.dtb; fi; " \
                                "if test $board_name = BOARDV1 && test $board_rev = 14X14; then " \
                                        "setenv fdt_file imx6ul-boardv1.dtb; fi; " \
                                "if test $fdt_file = undefined; then " \
                                        "echo WARNING: Could not determine dtb to use; " \
                                "fi; " \
                        "fi;\0" \

mx6ul_boardv1.c文件修改

// env_set("board_name", "EVK"); 对应我们头文件中修改的名字board_name 
env_set("board_name", "BOARDV1");

// 在该函数添加我们的板子的打印信息
int checkboard(void)
{
        if (is_mx6ul_9x9_evk())
                puts("Board: MX6UL 9x9 EVK\n");
        else if (is_cpu_type(MXC_CPU_MX6ULZ))
                puts("Board: MX6UL 14x14 EVK\n");
        else
                puts("BOard: MX6UL 14X14 BOARDV1\n");

        return 0;
}

修改设备树

vim arch/arm/dts/imx6ul-boardv1.dts


/ {
        model = "Freescale i.MX6 UltraLite 14x14 EVK Board";
        compatible = "fsl,imx6ul-14x14-evk", "fsl,imx6ul";
};


/ {
        model = "Freescale i.MX6 UltraLite 14x14 BOARDV1 Board";
        compatible = "fsl,imx6ul-boardv1", "fsl,imx6ul";
};

修改设备树Makefile文件arch/arm/dts/Makefile,添加自己的开设备树

dtb-$(CONFIG_MX6UL) += \
        imx6ul-geam.dtb \
        imx6ul-isiot-emmc.dtb \
        imx6ul-isiot-nand.dtb \
        imx6ul-opos6uldev.dtb \
        imx6ul-14x14-ddr3-val.dtb \
        imx6ul-14x14-ddr3-val-emmc.dtb \
        imx6ul-14x14-ddr3-val-gpmi-weim.dtb \
        imx6ul-14x14-lpddr2-val.dtb \
        imx6ul-14x14-evk.dtb \
        imx6ul-14x14-evk-emmc.dtb \
        imx6ul-14x14-evk-gpmi-weim.dtb \
        imx6ul-9x9-evk.dtb \
        imx6ul-liteboard.dtb \
        imx6ul-phytec-segin-ff-rdk-nand.dtb \
        imx6ul-pico-hobbit.dtb \
        imx6ul-pico-pi.dtb \
        imx6ul-kontron-n631x-s.dtb \
        imx6ull-kontron-n641x-s.dtb \
        // 添加我们的设备树,这样才会编译设备树
        imx6ul-boardv1.dtb

设备树文件夹Kconfig修改,添加我们的板子

config TARGET_MX6UL_BOARDV1
        bool "mx6ul_boardv1"
        depends on MX6UL
        select BOARD_LATE_INIT
        select DM
        select DM_THERMAL
        select SUPPORT_SPL
        select IMX_MODULE_FUSE
        select OF_SYSTEM_SETUP
        imply CMD_DM
        select FSL_CAAM
        select FSL_BLOB
        select ARCH_MISC_INIT

// 添加Kconfig路径
source "board/freescale/mx6ul_boardv1/Kconfig"

到这里我们就可以开始编译我们自己的板子的配置文件了

make distclean
make mx6ul_boardv1_defconfig
make -j8

然后就是烧录测试

六、驱动修改

网络驱动

在这里插入图片描述

Error: ethernet@20b4000 address not set.

uboot启动错误Error: ethernet@20b4000 address not set. 这是没有设置mac地址的原因我们在配置文件中使能生成随机mac地址(mx6ul_boardv1_defconfig)

CONFIG_NET_RANDOM_ETHADDR=y

该问题解决后可能还会出现,我们手动设置配置到emmc中保存就可以消除该警告了

Warning: ethernet@20b4000 (eth1) using random MAC address - 5a:49:f1:d9:07:cd
=> setenv ethaddr ca:38:29:c3:28:30
=> setenv eth1addr 76:7d:33:a8:f0:e7
=> saveenv

Could not get PHY for FEC0:addr x

设置了address地址后还可能遇到的问题是Could not get PHY for FEC0:addr 2,这要根据我们板子的原理图来进行排查,可能的原因:

  • 原因1:网络芯片不同
  • 原因2:网络芯片地址不对
  • 原因3:复位管脚未设置,复位时间未设置

这几个原因可能会都一起出现所以我们根据板子一个个修改;
在这里插入图片描述
我这里板子芯片用的是LAN8720A芯片地址为1接在eth2总线上,我这里只有一个网口所以我会屏蔽一个网口,并设置uboot 的默认网卡

修改配置文件默认网卡

// include/configs/mx6ul_boardv1.h
 #define CONFIG_ETHPRIME			"eth1"

排查网络启动流程从网络初始化入口initr_net函数开始,在common/board_r.c文件中找到initr_net函数,该函数首先调用eth的初始化然后对phy进行复位;

#ifdef CONFIG_CMD_NET
static int initr_net(void)
{
        puts("Net:   ");
        eth_initialize();
#if defined(CONFIG_RESET_PHY_R)
        debug("Reset Ethernet PHY\n");
        reset_phy();
#endif
        return 0;
}
#endif

然后我们在drivers/net/phy.c中找到phy_init函数,这里面只调用了phy_micrel_ksz8xxx_init,而我们这里使用的是SMSC 公司生产的LAN8720A,因此修改为调用phy_smsc_init初始化phy芯片LAN8720A,

在这里插入图片描述

int phy_init(void)
{
#ifdef CONFIG_NEEDS_MANUAL_RELOC
	/*
	 * The pointers inside phy_drivers also needs to be updated incase of
	 * manual reloc, without which these points to some invalid
	 * pre reloc address and leads to invalid accesses, hangs.
	 */
	struct list_head *head = &phy_drivers;

	head->next = (void *)head->next + gd->reloc_off;
	head->prev = (void *)head->prev + gd->reloc_off;
#endif

#ifdef CONFIG_B53_SWITCH
	phy_b53_init();
#endif
#ifdef CONFIG_MV88E61XX_SWITCH
	phy_mv88e61xx_init();
#endif
#ifdef CONFIG_PHY_AQUANTIA
	phy_aquantia_init();
#endif
#ifdef CONFIG_PHY_ATHEROS
	phy_atheros_init();
#endif
#ifdef CONFIG_PHY_BROADCOM
	phy_broadcom_init();
#endif
#ifdef CONFIG_PHY_CORTINA
	phy_cortina_init();
#endif
#ifdef CONFIG_PHY_CORTINA_ACCESS
	phy_cortina_access_init();
#endif
#ifdef CONFIG_PHY_DAVICOM
	phy_davicom_init();
#endif
#ifdef CONFIG_PHY_ET1011C
	phy_et1011c_init();
#endif
#ifdef CONFIG_PHY_INPHI
	phy_in112525_init();
#endif
#ifdef CONFIG_PHY_LXT
	phy_lxt_init();
#endif
#ifdef CONFIG_PHY_MARVELL
	phy_marvell_init();
#endif
#ifdef CONFIG_PHY_MICREL_KSZ8XXX
	phy_micrel_ksz8xxx_init();
#endif
#ifdef CONFIG_PHY_MICREL_KSZ90X1
	phy_micrel_ksz90x1_init();
#endif
#ifdef CONFIG_PHY_MESON_GXL
	phy_meson_gxl_init();
#endif
#ifdef CONFIG_PHY_NATSEMI
	phy_natsemi_init();
#endif
#ifdef CONFIG_NXP_C45_TJA11XX_PHY
	phy_nxp_tja11xx_init();
#endif
#ifdef CONFIG_PHY_REALTEK
	phy_realtek_init();
#endif
#ifdef CONFIG_PHY_SMSC
	phy_smsc_init();
#endif
#ifdef CONFIG_PHY_TERANETICS
	phy_teranetics_init();
#endif
#ifdef CONFIG_PHY_TI
	phy_ti_init();
#endif
#ifdef CONFIG_PHY_VITESSE
	phy_vitesse_init();
#endif
#ifdef CONFIG_PHY_XILINX
	phy_xilinx_init();
#endif
#ifdef CONFIG_PHY_MSCC
	phy_mscc_init();
#endif
#ifdef CONFIG_PHY_FIXED
	phy_fixed_init();
#endif
#ifdef CONFIG_PHY_NCSI
	phy_ncsi_init();
#endif
#ifdef CONFIG_PHY_XILINX_GMII2RGMII
	phy_xilinx_gmii2rgmii_init();
#endif
	genphy_init();

	return 0;
}

然后修改我们的配置文件mx6ul_boardv1_defconfig

CONFIG_PHY_SMSC=y;
CONFIG_PHY_MICREL=y
CONFIG_PHY_MICREL_KSZ8XXX=y

在这里插入图片描述复位相关的引脚和配置在文件drivers/net/fec_mxc.c会用到具体函数fecmxc_of_to_plat,所以我们在设备树中的phy节点需要添加phy-reset-gpios、phy-reset-duration、phy-reset-post-delay三个参数,当然还是根据板子的复位引脚来设置

在这里插入图片描述这里的SNVS_TAMPER8是被spi4这个节点使用了所以我们还需要屏蔽这个节点
在这里插入图片描述

aliases {
                // spi5 = &{/spi4}; 这个取别名会用到这个节点所以我们需要取消掉
        };
/*
        spi4 {
                compatible = "spi-gpio";
                pinctrl-names = "default";
                pinctrl-0 = <&pinctrl_spi4>;
                status = "okay";
                pinctrl-assert-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
                gpio-sck = <&gpio5 11 0>;
                gpio-mosi = <&gpio5 10 0>;
                cs-gpios = <&gpio5 7 0>;
                num-chipselects = <1>;
                #address-cells = <1>;
                #size-cells = <0>;

                gpio_spi: gpio@0 {
                        compatible = "fairchild,74hc595";
                        gpio-controller;
                        #gpio-cells = <2>;
                        reg = <0>;
                        registers-number = <1>;
                        registers-default = /bits/ 8 <0x57>;
                        spi-max-frequency = <100000>;
                };
        };
*/

&fec2 {
        pinctrl-names = "default";
        pinctrl-0 = <&pinctrl_enet2>;
        phy-mode = "rmii";
        phy-handle = <&ethphy1>;
        status = "okay";

        mdio {
                #address-cells = <1>;
                #size-cells = <0>;

/*
                ethphy0: ethernet-phy@2 {
                        reg = <0>;
                        micrel,led-mode = <1>;
                        clocks = <&clks IMX6UL_CLK_ENET_REF>;
                        clock-names = "rmii-ref";
                        phy-reset-gpios = <&gpio5 7 GPIO_ACTIVE_LOW>;
                        phy-reset-duration = <10>;
                        phy-reset-post-delay = <100>;
                }; // 这里我没使用phy0所以直接屏蔽了该节点
*/
                ethphy1: ethernet-phy@1 {
                        reg = <1>;
                        micrel,led-mode = <1>;
                        clocks = <&clks IMX6UL_CLK_ENET2_REF>;
                        clock-names = "rmii-ref";
                        // 下面这三个参数就是我们前面说的复位引脚和复位时间的属性
                        phy-reset-gpios = <&gpio5 8 GPIO_ACTIVE_LOW>;
                        phy-reset-duration = <10>;
                        phy-reset-post-delay = <100>;
                };
/*      pinctrl_enet1: enet1grp {
                fsl,pins = <
                        MX6UL_PAD_ENET1_RX_EN__ENET1_RX_EN      0x1b0b0
                        MX6UL_PAD_ENET1_RX_ER__ENET1_RX_ER      0x1b0b0
                        MX6UL_PAD_ENET1_RX_DATA0__ENET1_RDATA00 0x1b0b0
                        MX6UL_PAD_ENET1_RX_DATA1__ENET1_RDATA01 0x1b0b0
                        MX6UL_PAD_ENET1_TX_EN__ENET1_TX_EN      0x1b0b0
                        MX6UL_PAD_ENET1_TX_DATA0__ENET1_TDATA00 0x1b0b0
                        MX6UL_PAD_ENET1_TX_DATA1__ENET1_TDATA01 0x1b0b0
                        MX6UL_PAD_ENET1_TX_CLK__ENET1_REF_CLK1  0x4001b031
                >;
        };// 对应的pinctrl也屏蔽一下节省端口
*/
        pinctrl_enet2: enet2grp {
                fsl,pins = <
                        MX6UL_PAD_GPIO1_IO07__ENET2_MDC         0x1b0b0
                        MX6UL_PAD_GPIO1_IO06__ENET2_MDIO        0x1b0b0
                        MX6UL_PAD_ENET2_RX_EN__ENET2_RX_EN      0x1b0b0
                        MX6UL_PAD_ENET2_RX_ER__ENET2_RX_ER      0x1b0b0
                        MX6UL_PAD_ENET2_RX_DATA0__ENET2_RDATA00 0x1b0b0
                        MX6UL_PAD_ENET2_RX_DATA1__ENET2_RDATA01 0x1b0b0
                        MX6UL_PAD_ENET2_TX_EN__ENET2_TX_EN      0x1b0b0
                        MX6UL_PAD_ENET2_TX_DATA0__ENET2_TDATA00 0x1b0b0
                        MX6UL_PAD_ENET2_TX_DATA1__ENET2_TDATA01 0x1b0b0
                        MX6UL_PAD_ENET2_TX_CLK__ENET2_REF_CLK2  0x4001b031
                >; // 需要注意这里的端口需要跟板子对应,一般没问题
        };

设置网络配置

setenv ipaddr 192.168.1.55 //开发板 IP 地址
setenv ethaddr b8:ae:1d:01:00:00 //开发板网卡 MAC 地址
setenv gatewayip 192.168.1.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.1.78 //服务器地址,也就是 Ubuntu 地址
saveenv //保存环境变量

在这里插入图片描述

ping failed; host 192.168.1.1 is not alive

板子无法ping主机

  • 原因1:可能是windows的防火墙没有关,
  • 原因2:LAN8720初始化需要复位,修改SMSC驱动。

我这边的原因就是uboot LAN8720初始化没有进行复位
在 drivers/net/phy/phy.c 文件中修改:

int genphy_config_aneg(struct phy_device *phydev)
{
    int result;
 
    /* SOFT RESET */
    phy_reset(phydev);
 
    if (phydev->autoneg != AUTONEG_ENABLE)
        return genphy_setup_forced(phydev);
 
    result = genphy_config_advert(phydev);
    ...
    ...
}

再次测试

=> ping 192.168.1.78
Using ethernet@20b4000 device
host 192.168.1.78 is alive
=> 

到这里网络驱动就这样了

LCD驱动

目前的lcd显示如下
在这里插入图片描述我们还是先根据原理图修改设备树pinctrl管脚
在这里插入图片描述

![在这里插入图片描述](https://img-blog.csdnimg.cn/7cd83d5d76424e2e92d15ecb75e8e78c.png)

在这里插入图片描述

clock-frequency:LCD时钟,在无设备树时是采用像素时钟 (VSPW+VBP+LINE+VFP) * (HSPW + HBP + HOZVAL + HFP)可以得到一帧像素的时钟,如果屏幕按30帧计算就x30就是我们的lcd时钟,如果是像素时钟(1/clock-frequency)*10^12=pixclock

hactive、vactive:x轴像素点 y轴像素点
hback-porch:HBP,水平同步后肩。
hfront-porch:HFP,水平同步前肩。
vback-porch:VBP,垂直同步后肩。
vfront-porch:VFP,垂直同步前肩。
hsync-len:HSPW,行同步脉宽。
vsync-len:VSPW,垂直同步脉宽。

到这里uboot的移植就告一段落了,uboot的主要作用还是启动kernel所以我们的重心还是放在kernel中去;


七、结尾

我是凉开水白菜,我们下文见~

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凉开水白菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值