本帖最后由 Mars.CN 于 2020-11-21 19:05 编辑
之前一直用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这个名字。 2. 添加开发板对应的头文件复制imclude/config/mx6ullevk.h,改名为,mx6ull_embedfire_emmc.h 把文件内的定义头改了。 这个文件里面主要是U-Boot的一些基本配置宏定义和i.MX6ULL的配置项,如果想打开或者禁用某些功能,在这里面进行修改即可。里面涉及内容比较多,有三四百行,我文章后面会附带已经修改好的U-Boot源码,把注释都写到里面了,有兴趣的朋友可以自己看,源码就不在这里贴了。 3. 添加开发板对应的板级文件夹U-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 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的屏,启动的时候正常应该显示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卡中,重新烧录不会擦除。 5. 修改自己的LOGO终于到了我最喜欢的环节,修改LOGO。我们自己的开发板怎么能用NXP的LOGO呢?必须换掉丫的! 首先制作一个8位色深的BMP图像,就是256色的,其他的不用考虑了,无法读取。 把图片放在/tools/logos下面,修改/tools/Makefile文件,在LOGO_BMP设置的最后一行加上我们自己的LOGO地址就可,大概就是在212行左右。 虽然很简单,但是,不知道是U-Boot的原因,还是野火板子的问题,LOGO显示的颜色非常差劲! 凑合看吧。 6. 网络驱动修改其实到这里一切都搞定了,但是我接入后发现网络死活就是不同,野火的原理图研究了好几个小时依然没有头绪,我看野火和官方用都是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
|