野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1313|回复: 5

[经验\资料] [干货]野火i.MX6ULL Pro开发板U-Boot移植

[复制链接]
发表于 2020-11-21 18:55:03 | 显示全部楼层 |阅读模式
本帖最后由 Mars.CN 于 2020-11-21 19:05 编辑

之前一直用STM32RTT,最近想做一台游戏机,主屏采用960*640,但是发现STM32的运存实在着急,2M根本不够用,64M勉勉强强,但是看了看价格就呵呵了。于是在网上搜了搜发现i.MX6ULL这东西还行,就买了块野火i.MX6ULL Pro的开发板,因为之前一直用火哥家产品,所以这次就爱了。
入手之后才发现,i.MX6ULL的开发模式跟STM32完全两个概念,官方文档两千多页,而且纯英文,读起来那个费劲啊!勉勉强强把RTT搞上去跑了跑,发现写驱动真的太感动了,要啥没啥,自己写可费老鼻子劲了。所以经过一番思想斗争之后,决定该换Linux
之前在三星的S3C2440上跑过Linux(天嵌的板子,话说已经十年前的事了),有些年头没玩了,上手就废啊!!!
而且火哥家的教程真心“给力”,虽然i.MX6ULL裸奔没问题了,但是关于Linux的教程真的云山雾罩,野火论坛中也没有相关详细的移植资料,直接从内核编程开始,搞的我完全没有头绪。所以不得不看隔壁家的资料,历经两周的时间,终于把U-BootLinux移植成功。不知道现在野火论坛中是否已经有了这两个移植的相关资料,如果没有的话,我这算个补齐吧。
计划把U-Boot移植、Linux内核移植、Linux根文件系统移植这三块都整理出来给大家填坑,看情况吧,因为还要辅导孩子作业,尽量不留坑。
捞干的讲,闲言少叙,上手吧!

一、NXP官方U-Boot烧录
野火的开发板基本上是参考了NXP官方的EVK开发板,差别不大,所以直接从NXP官方网站下载U-Boot源码基本上也可以直接用,后面我们需要针对屏幕进行一些修改,做自己的开发板烧录镜像。
当然也可以到U-Boot的官网下载最新镜像自己改,但不建议这样操作,因为要改的东西实在太多太多太多太多了……
拿到NXPU-Boot镜像之后,先对其进行编译:
打开configs文件夹,能看到所有的开发板配置文件,这里我们只关心mx6ull开头的即可,NXPi.MX6ULL芯片有两种型号,9×914×14的,野火开发板用的是14×14的,又分为eMMCNand两种,我买的是eMMC的,所以就按照eMMC的配置,Nand的基本差不多,如果你用Nand移植过程中遇到什么问题,而火哥的资料中又找不到,建议去隔壁看看。
按照官方开发板,使用的是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 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
第一行命令用于清理工程。
第二行命令设置配置文件,当出现configuration written to .config”表示配置成功,否则检查你的配置文件名是否写对了。
第三行开始正式编译。
这里面有几个地方需要注意:
1. 首先安装ARM的交叉编译工具链,具体怎么装去问度娘吧。
2. CROSS_COMPILE=arm-linux-gnueabihf- 后面有个空格,千万要看清。
编译完成之后就会得到u-boot.bin的二进制文件,这就是我们要烧入到开发板的U-Boot程序。
接下来就是烧入到SD卡中测试,在测试之前建议先用U盘量产工具把SD卡彻底格式化一遍,否则你会遇到各种奇葩问题,我用的是SDFormatter这个软件。
烧入SD卡用的是隔壁提供的程序,野火自己也提供了烧入程序,但是感觉隔壁的比野火的好用,就直接借鉴过来了,带源码,自己可以修改。
SD卡接入到Linux上,查看映射的是哪个盘,然后直接调用烧入工具烧写:
./imxdownload u-boot.bin /dev/sdb
最后把SD卡插入到开发板,拨码开关调整SD卡启动,开发板串口连接到PC,打开串口调试助手看打印信息。
U-Boot 2016 .03  (Nov 21 2020 - 17:19:39 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 42C
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:   FEC1
Error: FEC1 address not set.

Normal Boot
Hit any key to stop autoboot:  3
出现以上表示成功,基本上这时候就可以正常用了,隔壁家除了修改屏幕还要修改网卡,野火的板子只需要修改个屏幕信息就完美了。

二、针对自己的开发板编写U-Boot烧入脚本
在上面的程序打印中,输出的都是MX6ULL 14x14 EVK的官方信息,这些对于我这个有强迫症的人来说是很不爽的,所以涅,需要给丫改造一下,做一个自己的烧录脚本。我们就针对mx6ull_14x14_evk_emmc_defconfig进行修改
1. 添加配置文件
进入configs文件夹,将mx6ull_14x14_evk_emmc_defconfig复制一份,改名为mx6ull_embedfire_emmc_defconfig
打开文件,编辑如下:
CONFIG_SYS_EXTRA_OPTIONS="EMMIMX_CONFIG=board/freescale/mx6ull_embedfire_emmc/imximage.cfg,MX6ULL_EVK_C_REWORK"
CONFIG_ARM=y
CONFIG_ARCH_MX6=y
CONFIG_TARGET_MX6ULL_EMBEDFIRE_EMMC=y
CONFIG_CMD_GPIO=y
主要是第一行和第四行做了修改,设个可以随性发挥,但和后面保持一致就行了。我统一用mx6ull_embedfire_emmc这个名字。
2. 添加开发板对应的头文件
复制imclude/config/mx6ullevk.h,改名为,mx6ull_embedfire_emmc.h
把文件内的定义头改了。
这个文件里面主要是U-Boot的一些基本配置宏定义和i.MX6ULL的配置项,如果想打开或者禁用某些功能,在这里面进行修改即可。里面涉及内容比较多,有三四百行,我文章后面会附带已经修改好的U-Boot源码,把注释都写到里面了,有兴趣的朋友可以自己看,源码就不在这里贴了。
3. 添加开发板对应的板级文件夹
U-Boot中,每个开发板都对应一个文件夹来存放板级文件,NXPI.MX系列芯片的所有板级文件夹都存放在board/freescale目录下,这个目录有个名为mx6ullevk的文件夹,这就是NPX官方开发板的板级文件夹,我们就 针对这个我文件夹内容进行修改
复制mx6ullevk文件夹,改名为mx6ull_embedfire_emmc
打开文件夹,将里面的mx6ullevk.c重命名为mx6ull_embedfire_emmc.c
mx6ull_embedfire_emmc.c中找到checkboard这个函数,其中有判断板子类型的输出,else部分改为 puts("Board: MX6ULL EmbedFire eMMC\n");(对于强迫症来说,舒坦了……)
然后打开这个文件夹下面的Makefile文件,第一行改为
obj-y  := mx6ull_embedfire_emmc.o
修改Kconfig文件,内容如下:
if TARGET_MX6ULL_EMBEDFIRE_EMMC
config SYS_BOARD
        default "mx6ull_embedfire_emmc"

config SYS_VENDOR
        default "freescale"

config SYS_CONFIG_NAME
        default "mx6ull_embedfire_emmc"
endif
最后,修改MAINTAINERS文件,这里面主要是一些配置信息,内容如下:
MX6ULL_EMBEDFIRE_EMMC BOARD
M:        Mars.CN <suolong123@126.com>
S:        Maintained
F:        board/freescale/mx6ull_embedfire_emmc/
F:        include/configs/mx6ull_embedfire_emmc.h
F:        configs/mx6ull_embedfire_emmc_defconfigmars
主要是第一行和后三行,其他随意吧。
最后,修改U-Boot的图形化配置界面,找到文件arch/arm/cpu/armv7/mk6/Kconfig这个文件,这里顺便提一句,如果用的是i.MX6UL的芯片,就修改arch/arm/Kconfig,找NXP官方主板,到最后面添加几行,大概在207行左右吧:
config TARGET_MX6ULL_EMBEDFIRE_EMMC
    bool "Support mx6ull_embedfire_emmc"
    select MX6ULL
    select DM
    select DM_THERMAL
注意缩进,在最后面,endif之前,加入一行内容
source “board/freescale/mx6ull_embedfire_emmc/Kconfig”
到此为止,我们自己的开发板已经搞好了,编译一下看看效果吧。
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_embedfire_emmc_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
./imxdownload u-boot.bin /dev/sdb
效果如下:
U-Boot 2016 .03  (Nov 21 2020 - 17:57:05 +0800)

CPU:   Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)
CPU:   Industrial temperature grade (-40C to 105C) at 47C
Reset cause: POR
Board: MX6ULL EmbedFire eMMC
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:   FEC1
Error: FEC1 address not set.

Normal Boot
Hit any key to stop autoboot:  3
Board的信息已经改过来了,但是屏幕上啥都木有,可以看到Display显示的还是TFT43AB这个设备,下一步我们需要修改屏幕显示,并加入自己的LOGO
上面信息中输出一行“*** Warning - bad CRC, using default environment”,不要慌,是因为U-Boot没有找到SD卡上的配置信息,直接输入saveenv重启就消失了。
4. 修改LCD配置
NXP官方用的是480×272的屏,启动的时候正常应该显示NXPLOGO信息,但是我们的板子启动后屏幕一片黢黑,连个毛都没有。
一般U-Boot的驱动信息都写在mx6ull_embedfire_emmc.hmx6ull_embedfire_emmc.c两个文件中,找到屏幕信息写进去进行。
对于野火的板子,改起来还是挺省事的,动不了几行。
首先找到LCD对应的参数文档,这个去野火官网下载就行了,我用的是7寸屏,就按7寸屏给大家介绍,其他型号的屏雷同。
在野火GT911的屏幕中,能找打如下一张表:
Item
Symbol
Values
Unit
Remark
Min.
Typ.
Max.
Horizontal Display Area
thd
-
800
-
DCLK

DCLK Frequency
fclk
26.4
33.3
46.8
MHz

One Horizontal Line
th
862
1056
1200
DCLK

HS pulse width
thpw
1
-
40
DCLK

HS Blanking
thb
46
46
46
DCLK

Vertical Display Area
tvd
-
480
-
TH

VS period time
tv
510
525
650
TH

VS pulse width
tvpw
1
-
20
TH

VS Blanking
tvb
23
23
23
TH

VS Front Porch
tvfp
7
22
147


mx6ull_embedfire_emmc.c文件中,找到struct display_info_t const displays[] 的定义,display_info_t这个结构体存放了LCD的信息,包括LCD的分辨率、像素格式、时钟信号等等,display_info_t结构体在arch/arm/include/asm/imx-common/video.h中,有兴趣的可以看看。其中pixfmt是像素格式,如果使用RGB565的屏,该变量值为16,如果采用RGB888格式的屏,该变量值为24,我们用的是24888格式的屏幕。其中还有个mode成员变量,存放的是时钟信号,这里面挑几个重要的值说一下:
nameLCD的名字,随便写什么都成,但是要和环境变量中的panel一样(后面说)。
xresyresLCDX轴和Y轴的像素数,也就是分辨率。
pixclock:像素之中,也就是每个像素时钟周期的长度,单位皮秒,计算公式为:pixclock=(1/DCLK Frequency)*10^12,针对于我们的7寸屏幕,计算公式为(1/33300000)*10^12=30030
left_marginHBP,水平同步后肩
right_marginHFP,水平同步前肩
upper_marginVBP,垂直同步后肩
lower_marginVFP,垂直同步前肩
hsync_lenHSPW,行同步脉宽
vsync_lenVSPW,垂直同步脉宽
vmode:是否隔行扫描
根据以上参数,得出 displays的配置如下:
struct display_info_t const displays[] = {{
        .bus = MX6UL_LCDIF1_BASE_ADDR,
        .addr = 0,
        .pixfmt = 24,
        .detect = NULL,
        .enable        = do_enable_parallel_lcd,
        .mode        = {
                .name                        = "GT911",
                .xres           = 800,
                .yres           = 480,
                .pixclock       = 30030,
                .left_margin    = 46,
                .right_margin   = 210,        
                .upper_margin   = 23,
                .lower_margin   = 22,        
                .hsync_len      = 1,
                .vsync_len      = 1,
                .sync           = 0,
                .vmode          = FB_VMODE_NONINTERLACED
} } };
(具体注释已经在源码中了)
最后找到static iomux_v3_cfg_t const lcd_pads[]的定义,最下面LCD_RST部分用不到,注释掉,下面do_enable_parallel_lcd函数的复位指令屏蔽掉。
最后,在mx6ull_embed_emmc.h文件中找到:panel=TFT43AB,改为panel=GT911,这个就是上面参数.name的名字,改成一样的就行了
完成,重新编译烧录,运行发现,NXPLOGO已经显示,控制台打印的panle=GT911正确。
如果烧录后依然有问题,建议重新格式化一下SD卡,用量产工具彻底格式化,因为有些参数写在SD卡中,重新烧录不会擦除。
5. 修改自己的LOGO
终于到了我最喜欢的环节,修改LOGO。我们自己的开发板怎么能用NXPLOGO呢?必须换掉丫的!
首先制作一个8位色深的BMP图像,就是256色的,其他的不用考虑了,无法读取。
把图片放在/tools/logos下面,修改/tools/Makefile文件,在LOGO_BMP设置的最后一行加上我们自己的LOGO地址就可,大概就是在212行左右。
虽然很简单,但是,不知道是U-Boot的原因,还是野火板子的问题,LOGO显示的颜色非常差劲!
凑合看吧。
6. 网络驱动修改
其实到这里一切都搞定了,但是我接入后发现网络死活就是不同,野火的原理图研究了好几个小时依然没有头绪,我看野火和官方用都是KSZ8081PHY芯片,电路图基本也是一致的,代码肯定是不用改的。
最后,我发现自己没插网线……
U-Boot中设置环境变量:
setenv ipaddr 192.168.1.55 //开发板IP地址
setenv ethaddr 00:04:9f:04:d2:35 //开发板网卡MAC地址
setenv gatewayip 192.168.1.1 //开发板默认网关
setenv netmask 255.255.255.0 //开发板子网掩码
setenv serverip 192.168.1.250 //服务器地址,也就是Ubuntu地址
saveenv //保存环境变量
然后ping你的linux主机,如果提示“host 192.168.31.128 is alive”,恭喜你,已经完全搞定。

哎,写的脖子疼,休息会,下周写Linux的移植。


不让上传附件
https://download.csdn.net/download/suolong123/13134948
回复

使用道具 举报

发表于 2020-11-23 16:51:44 | 显示全部楼层
顶起,大佬在修改logo那里可以补充写细节吗,我也很感兴趣
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-23 17:45:33 | 显示全部楼层
STM小学徒 发表于 2020-11-23 16:51
顶起,大佬在修改logo那里可以补充写细节吗,我也很感兴趣

那个很简单,就是改一行代码的事,你试试先,或者看看我改的源码,没啥理论性的东西
回复 支持 反对

使用道具 举报

发表于 2020-11-25 11:48:54 | 显示全部楼层
顶!!!向大佬看齐!
回复 支持 反对

使用道具 举报

发表于 2021-1-29 15:05:16 | 显示全部楼层
看到大神啦
回复 支持 反对

使用道具 举报

发表于 2021-2-18 20:14:49 | 显示全部楼层
顶!!!向大佬看齐!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|站点地图|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号-2 ) 大学生ARM嵌入式2群

GMT+8, 2021-3-4 11:07 , Processed in 0.275111 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表