admin管理员组文章数量:1543716
❤️作者主页:凉开水白菜
❤️作者简介:共同学习,互相监督,热于分享,多加讨论,一起进步!
❤️专栏目录:
❤️专栏资料:https://gitee/stylle/linux_code
❤️点赞 👍 收藏 ⭐再看,养成习惯
订阅的粉丝可通过PC端文末加我微信,可对文章的内容进行一对一答疑!
文章目录
- 一、简介
- 二、源码下载
- 三、官方配置编译
- 错误 sh: 1: ./scripts/gcc-version.sh: Permission denied
- 错误 include/ctype.h:1:1: error: expected identifier or ‘(’ before numeric constant linux/ctype.h
- 四、官方配置uboot测试
- 存储设备检查
- 网络设备检查
- 五、添加自己的Board配置文件
- 六、驱动修改
- 网络驱动
- Error: ethernet@20b4000 address not set.
- Could not get PHY for FEC0:addr x
- ping failed; host 192.168.1.1 is not alive
- LCD驱动
- 七、结尾
一、简介
本文使用的芯片是imx6ul,移植目标完成对恩智浦github提供的最新uboot(2023年7月31)
二、源码下载
github:https://github/nxp-imx/uboot-imx
百度云链接:https://pan.baidu/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/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>
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 = <ðphy1>;
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管脚
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中去;
七、结尾
我是凉开水白菜,我们下文见~
版权声明:本文标题:【ARM】imx6ul移植u-boot记录,恩智浦github提供的最新uboot(2023年7月31) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/xitong/1727111308a1098209.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论