1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 野火i.MX6ULL Pro开发板U-Boot移植

野火i.MX6ULL Pro开发板U-Boot移植

时间:2022-06-20 17:23:07

相关推荐

野火i.MX6ULL Pro开发板U-Boot移植

之前一直用STM32跑RTT,最近想做一台游戏机,主屏采用960*640,但是发现STM32的运存实在着急,2M根本不够用,64M勉勉强强,但是看了看价格就呵呵了。于是在网上搜了搜发现i.MX6ULL这东西还行,就买了块野火i.MX6ULL Pro的开发板,因为之前一直用火哥家产品,所以这次就爱了。

入手之后才发现,i.MX6ULL的开发模式跟STM32完全两个概念,官方文档两千多页,而且纯英文,读起来那个费劲啊!勉勉强强把RTT搞上去跑了跑,发现写驱动真的太感动了,要啥没啥,自己写可费老鼻子劲了。所以经过一番思想斗争之后,决定该换Linux。

之前在三星的S3C2440上跑过Linux(天嵌的板子,话说已经十年前的事了),有些年头没玩了,上手就废啊!!!

而且火哥家的教程真心“给力”,虽然i.MX6ULL裸奔没问题了,但是关于Linux的教程真的云山雾罩,野火论坛中也没有相关详细的移植资料,直接从内核编程开始,搞的我完全没有头绪。所以不得不看隔壁家的资料,历经两周的时间,终于把U-Boot和Linux移植成功。不知道现在野火论坛中是否已经有了这两个移植的相关资料,如果没有的话,我这算个补齐吧。

计划把U-Boot移植、Linux内核移植、Linux根文件系统移植这三块都整理出来给大家填坑,看情况吧,因为还要辅导孩子作业,尽量不留坑。

捞干的讲,闲言少叙,上手吧!

NXP官方U-Boot烧录

野火的开发板基本上是参考了NXP官方的EVK开发板,差别不大,所以直接从NXP官方网站下载U-Boot源码基本上也可以直接用,后面我们需要针对屏幕进行一些修改,做自己的开发板烧录镜像。

当然也可以到U-Boot的官网下载最新镜像自己改,但不建议这样操作,因为要改的东西实在太多太多太多太多了……

拿到NXP的U-Boot镜像之后,先对其进行编译:

打开configs文件夹,能看到所有的开发板配置文件,这里我们只关心mx6ull开头的即可,NXP的i.MX6ULL芯片有两种型号,9×9和14×14的,野火开发板用的是14×14的,又分为eMMC和Nand两种,我买的是eMMC的,所以就按照eMMC的配置,Nand的基本差不多,如果你用Nand移植过程中遇到什么问题,而火哥的资料中又找不到,建议去隔壁看看。

按照官方开发板,使用的是mx6ull_14x14_evk_emmc_defconfig。

使用以下命令编译:

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_emmc_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

第一行命令用于清理工程。

第二行命令设置配置文件,当出现“configuration written to .config”表示配置成功,否则检查你的配置文件名是否写对了。

第三行开始正式编译。

这里面有几个地方需要注意:

首先安装ARM的交叉编译工具链,具体怎么装去问度娘吧。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 .03 (Nov 21 - 17:19:39 +0800)CPU: Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)CPU: Industrial temperature grade (-40C to 105C) at 42CReset cause: PORBoard: MX6ULL 14x14 EVKI2C: readyDRAM: 512 MiBMMC: FSL_SDHC: 0, FSL_SDHC: 1*** Warning - bad CRC, using default environmentDisplay: TFT43AB (480x272)Video: 480x272x24In: serialOut: serialErr: serialswitch to partitions #0, OKmmc0 is current deviceNet: FEC1Error: FEC1 address not set.Normal BootHit any key to stop autoboot: 3

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

针对自己的开发板编写U-Boot烧入脚本

在上面的程序打印中,输出的都是MX6ULL 14x14 EVK的官方信息,这些对于我这个有强迫症的人来说是很不爽的,所以涅,需要给丫改造一下,做一个自己的烧录脚本。我们就针对mx6ull_14x14_evk_emmc_defconfig进行修改

添加配置文件

进入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=yCONFIG_ARCH_MX6=yCONFIG_TARGET_MX6ULL_EMBEDFIRE_EMMC=yCONFIG_CMD_GPIO=y

主要是第一行和第四行做了修改,设个可以随性发挥,但和后面保持一致就行了。我统一用mx6ull_embedfire_emmc这个名字。

添加开发板对应的头文件

复制imclude/config/mx6ullevk.h,改名为,mx6ull_embedfire_emmc.h

把文件内的定义头改了。

这个文件里面主要是U-Boot的一些基本配置宏定义和i.MX6ULL的配置项,如果想打开或者禁用某些功能,在这里面进行修改即可。里面涉及内容比较多,有三四百行,我文章后面会附带已经修改好的U-Boot源码,把注释都写到里面了,有兴趣的朋友可以自己看,源码就不在这里贴了。

添加开发板对应的板级文件夹Boot中,每个开发板都对应一个文件夹来存放板级文件,NXP的I.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_EMMCconfig SYS_BOARDdefault "mx6ull_embedfire_emmc"config SYS_VENDORdefault "freescale"config SYS_CONFIG_NAMEdefault "mx6ull_embedfire_emmc"endif

最后,修改MAINTAINERS文件,这里面主要是一些配置信息,内容如下:

MX6ULL_EMBEDFIRE_EMMC BOARDM: <suolong123@>S: MaintainedF: board/freescale/mx6ull_embedfire_emmc/F: include/configs/mx6ull_embedfire_emmc.hF: configs/mx6ull_embedfire_emmc_defconfigmars

主要是第一行和后三行,其他随意吧。

最后,修改U-Boot的图形化配置界面,找到文件arch/arm/cpu/armv7/mk6/Kconfig这个文件,这里顺便提一句,如果用的是i.MX6UL的芯片,就修改arch/arm/Kconfig,找NXP官方主板,到最后面添加几行,大概在207行左右吧:

config TARGET_MX6ULL_EMBEDFIRE_EMMCbool "Support mx6ull_embedfire_emmc"select MX6ULLselect DMselect DM_THERMAL

注意缩进,在最后面,endif之前,加入一行内容

source “board/freescale/mx6ull_embedfire_emmc/Kconfig”

到此为止,我们自己的开发板已经搞好了,编译一下看看效果吧。

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distcleanmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_embedfire_emmc_defconfigmake ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12./imxdownload u-boot.bin /dev/sdb

效果如下:

U-Boot .03 (Nov 21 - 17:57:05 +0800)CPU: Freescale i.MX6ULL rev1.1 69 MHz (running at 396 MHz)CPU: Industrial temperature grade (-40C to 105C) at 47CReset cause: PORBoard: MX6ULL EmbedFire eMMCI2C: readyDRAM: 512 MiBMMC: FSL_SDHC: 0, FSL_SDHC: 1*** Warning - bad CRC, using default environmentDisplay: TFT43AB (480x272)Video: 480x272x24In: serialOut: serialErr: serialswitch to partitions #0, OKmmc0 is current deviceNet: FEC1Error: FEC1 address not set.Normal BootHit any key to stop autoboot: 3

Board的信息已经改过来了,但是屏幕上啥都木有,可以看到Display显示的还是TFT43AB这个设备,下一步我们需要修改屏幕显示,并加入自己的LOGO。

上面信息中输出一行“*** Warning - bad CRC, using default environment”,不要慌,是因为U-Boot没有找到SD卡上的配置信息,直接输入saveenv重启就消失了。

修改LCD配置

NXP官方用的是480×272的屏,启动的时候正常应该显示NXP的LOGO信息,但是我们的板子启动后屏幕一片黢黑,连个毛都没有。

一般U-Boot的驱动信息都写在mx6ull_embedfire_emmc.h和mx6ull_embedfire_emmc.c两个文件中,找到屏幕信息写进去进行。

对于野火的板子,改起来还是挺省事的,动不了几行。

首先找到LCD对应的参数文档,这个去野火官网下载就行了,我用的是7寸屏,就按7寸屏给大家介绍,其他型号的屏雷同。

在野火GT911的屏幕中,能找打如下一张表:

在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,我们用的是24位888格式的屏幕。其中还有个mode成员变量,存放的是时钟信号,这里面挑几个重要的值说一下:

name:LCD的名字,随便写什么都成,但是要和环境变量中的panel一样(后面说)。

xres、yres:LCDX轴和Y轴的像素数,也就是分辨率。

pixclock:像素之中,也就是每个像素时钟周期的长度,单位皮秒,计算公式为:pixclock=(1/DCLK Frequency)*10^12,针对于我们的7寸屏幕,计算公式为(1/33300000)*10^12=30030。

left_margin:HBP,水平同步后肩

right_margin:HFP,水平同步前肩

upper_margin:VBP,垂直同步后肩

lower_margin:VFP,垂直同步前肩

hsync_len:HSPW,行同步脉宽

vsync_len:VSPW,垂直同步脉宽

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的名字,改成一样的就行了

完成,重新编译烧录,运行发现,NXP的LOGO已经显示,控制台打印的panle=GT911正确。

如果烧录后依然有问题,建议重新格式化一下SD卡,用量产工具彻底格式化,因为有些参数写在SD卡中,重新烧录不会擦除。

修改自己的LOGO

终于到了我最喜欢的环节,修改LOGO。我们自己的开发板怎么能用NXP的LOGO呢?必须换掉丫的!

首先制作一个8位色深的BMP图像,就是256色的,其他的不用考虑了,无法读取。

把图片放在/tools/logos下面,修改/tools/Makefile文件,在LOGO_BMP设置的最后一行加上我们自己的LOGO地址就可,大概就是在212行左右。

虽然很简单,但是,不知道是U-Boot的原因,还是野火板子的问题,LOGO显示的颜色非常差劲!

凑合看吧。

网络驱动修改

其实到这里一切都搞定了,但是我接入后发现网络死活就是不同,野火的原理图研究了好几个小时依然没有头绪,我看野火和官方用都是KSZ8081的PHY芯片,电路图基本也是一致的,代码肯定是不用改的。

最后,我发现自己没插网线……

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的移植。

下载地址:/download/suolong123/13134948

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。