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

Linux 专栏收录该内容
4 篇文章 0 订阅

之前一直用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- 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这个名字。

  1. 添加开发板对应的头文件

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

把文件内的定义头改了。

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

  1. 添加开发板对应的板级文件夹
  1. 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_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重启就消失了。

  1. 修改LCD配置

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

一般U-Boot的驱动信息都写在mx6ull_embedfire_emmc.h和mx6ull_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,我们用的是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卡中,重新烧录不会擦除。

  1. 修改自己的LOGO

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

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

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

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

凑合看吧。

  1. 网络驱动修改

其实到这里一切都搞定了,但是我接入后发现网络死活就是不同,野火的原理图研究了好几个小时依然没有头绪,我看野火和官方用都是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的移植。

 

下载地址:https://download.csdn.net/download/suolong123/13134948

  • 5
    点赞
  • 7
    评论
  • 17
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值