参考芯片厂商的 SDK。
厂商 SDK 的 uboot 测试
首先编译一下。
NXP 的配置,mx6ull_14x14_evk_emmc_defconfig
复制 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfig
make V= 1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j16
同样的,也可以把上面的命令写进一个脚本。
也可以在顶层 Makefile 里直接给传入的参数赋值。
对于一个开发板,要运行 uboot ,必须要支持的东西
这些设备东西如果和官方的一样,那么芯片原厂的 uboot 是能在自己的开发板上跑起来的。只是有些地方会提示有问题。
烧写 uboot 到 SD 卡
可以看到,屏幕背点亮了,但是有些异常。NXP 配的屏幕是 480x272 的屏幕。
此外,查看 uboot 日志,首先能看到日志说明串口驱动没问题。
复制 U-Boot 2016.03 (Jul 06 2023 - 20:10:53 +0800)
CPU: Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 37C
Reset cause: POR
Board: MX6ULL 14x14 EVK
I2C: ready
DRAM: 512 MiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
*** Warning - bad CRC, using default environment
Display: TFT43AB (480x272)
Video: 480x272x24
In: serial
Out: serial
Err: serial
switch to partitions #0, OK
mmc0 is current device
Net: Board Net Initialization Failed
No ethernet found.
Normal Boot
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc0 is current device
switch to partitions #0, OK
mmc0 is current device
reading boot.scr
** Unable to read file boot.scr **
reading zImage
** Unable to read file zImage **
Booting from net ...
No ethernet found.
No ethernet found.
Bad Linux ARM zImage magic!
=>
可以看到,DRAM 识别出来了,Net 初始化失败,mmc 通过命令测试驱动正常,SD 必然正常。
所以,接下来移植这套代码,要把不正常的驱动改正常。即在官方开发板修改使得支持自己的开发板。
适配自己的开发板
1.开发板 config 文件
configs
中都是已经有的板的配置文件,在这里以官方板为基础添加一个新的。
基于 mx6ull_14x14_evk_emmc_defconfig
来修改,可以改成自己的开发板的名字。这里改成 mx6ull_14x14_mini_emmc_defconfig
,对此文件要做一些修改。
复制 CONFIG_SYS_EXTRA_OPTIONS="IMX_CONFIG=board/freescale/mx6ullevk/imximage.cfg,MX6ULL_EVK_EMMC_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_14X14_EVK=y
CONFIG_CMD_GPIO=y
这个配置文件使用了一些配置文件。整个复制一份,进行适配,
修改配置文件为
2.配置头文件
3.板级配置文件
4.Kconfig
编译测试
LCD 适配
1.LCD IO
2.LCD 参数
ATK4384 显示屏参数
修改 mx6ull_mini.c
复制 struct display_info_t const displays[] = {
{
.bus = MX6UL_LCDIF1_BASE_ADDR,
.addr = 0,
.pixfmt = 24,
.detect = NULL,
.enable = do_enable_parallel_lcd,
.mode = {
.name = "TFT4384",
.xres = 800,
.yres = 480,
.pixclock = 32258,
.left_margin = 88, //HBPD
.right_margin = 40, //HFPD
.upper_margin = 32, //VBPD
.lower_margin = 13, //VFBD
.hsync_len = 48, //HSPW
.vsync_len = 13, //VSPW
.sync = 0,
.vmode = FB_VMODE_NONINTERLACED
}
}
};
3.uboot环境变量
修改 include/configs/mx6ull_mini.h
里的 panel
环境变量为 TFT4384
编译烧录测试。
网络驱动修改
网络方案。
IMX6ULL 内部有以太网 MAC 外设,需要外接一个 PHY 芯片。
在内部无 MAC 的芯片中,使用外接的 MAC+PHY ,如 DM9000 有一个类似 SRAM 的接口。W5500 使用 SPI 接口实现通信。
内部 MAC 的速度会快相当多,内部 MAC 会集成 DMA。具体的可以取看手册。
NXP EVK 使用的 PHY 为 KSZ8081,我手里这块板为 SR8201F,所以 uboot 启动会提示网络初始化失败。
MDIO 作为 PHY 的管理接口,用两根线实现与芯片通信,SDIO 和 SDC。
1.引脚
ENET2_RESET
2.器件ID
boot 测试
uboot 最终目的,启动 kernel,
从 EMMC 启动
现在的 uboot 在 SD 卡中。要去启动 MMC 中的 kernel,kernel 已经烧写在 mmc 了,要确定这里有内核。
先确定mmc 中有内核 fatls mmc 1:1
复制 mmc dev 1 #切换当前设备为 mmc
fatls mmc 1:1 #查看此分区的文件
fatload mmc 1:1 80800000 zImage
fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb
bootz 80800000 - 83000000
启动后,内核可以启动起来,但是有点小问题,还需要设置环境变量,指定根文件系统的位置。
复制 setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000
imx6ull-alientek-emmc.dtb; bootz 80800000 - 83000000;'
可以把这个命令设置为自动运行的启动命令。
复制 setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb; bootz 80800000 - 83000000;'
此外,还可以在屏幕上也启动一个控制台。
setenv bootargs 'console=tty1 console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
网络启动
复制 tftp 80800000 zImage
tftp 83000000 imx6ull-14x14-emmc-4.3-800x480-c.dtb
tftp 83000000 imx6ull.dtb
bootz 80800000 - 83000000
复制 tftp 80800000 zImage
tftp 83000000 imx6ull-mini.dtb
bootz 80800000 - 83000000
复制 setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-mini.dtb; bootz 80800000 - 83000000;'