IMX6ULL 这两年算是很火的一款linux入门级的芯片了,有用过nxp rt10xx系列的小伙伴,上手这款芯片,应该会很快(rt10xx是cortex-m7架构,为一种跨界处理器,它集成了cortex-A 和 传统的mcu优点。。。额,再讲下去就讲偏了)。下面笔者就简述一下如何快速上手这IMX6ULL吧(细节留到其他篇幅)。
前期准备:
IMX6ULL开发板
网线,SD卡+读卡器,能连接串口的数据线(具体看用的什么接口)
终端工具软件 -- MobaXterm(试了几种工具,还是觉得这个最好用,其他相似的还有:secureCRT,Putty等等)
vscode:笔者一直用它来编辑代码,感觉在linux下使用也特别方便,在某些方面用起来比vim方便一些(注意 vscode 终端窗口调大一点,不然编译uboot、内核这些的menucofig功能容易出错)。
安装ubuntu系统(ubuntu 的安装分两类:虚拟机下安装;非虚拟机安装),网上教程很多,这里就不作介绍了,另外笔者装的版本是16.04。
搭建好 tftp、nfs (这里先不介绍)
1、在Ubuntu中安装交叉编译工具链
什么叫交叉编译?简单理解就是在x86平台编译好的代码,必须要烧录到目标机器(ARM平台)上运行。
因为该工具链是在linux上运行的,这里下载的工具链是:arm-linux-gnueabihf (GNU embedded application binary interface),下载地址可登录Linaro官网:
Linaro Releaseshttps://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/这里笔者用的4.9版本,高版本用起来有问题,还是参考别家都常用的版本吧,至少问题不多。
安装路径在:/usr/local/arm
sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
配置环境变量:vi /etc/profile 文件中输入:
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
保存生效:source /etc/profile
另外工具链还需要 libstdc ++6 以及 lib32stdc ++6库的支持
sudo apt-get install lsb-core lib32stdc++6
2、u-boot 移植
u-boot 实际是个通用的 bootloader,我们没必要去u-boot官网去下载,可以直接使用芯片厂商或者第三方开发板提供的u-boot
解压u-boot:
tar -vxjf uboot-imx-2016.03-2.1.0-gd3f0479-v1.4.tar.bz2
编译u-boot前安装依赖库:
sudo apt-get install libncurses5-dev
解压完u-boot 后,这里需要特别注意configs文件夹,为u-boot配置文件夹,主要用来配置评估板和目标版差异性参数的文件,移植的时候需要用的,目前可以先不管这一块。
为了今后编译方便,我们在u-boot目录下,写个脚本:
#!/bin/bash
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr512_emmc_defconfig
make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12
然后直接执行即可:
./脚本文件名称xxxx.sh
将编译生成的 u-boot.bin文件,烧录到SD卡中(当然也可以用MfgTool工具,烧录到emmc 或者nand启动,这里忽略,原理都差不多,只是启动方式区别而已)。这里我们就直接用正点原子写好的工具烧写吧。
注意自己U盘的名称:sda..sdb..?,不要烧错了
dmesg 命令可查看挂载的SD卡信息
//烧录方法1:用原子的执行文件
./imxdownload u-boot.bin /dev/sdb
//烧录方法2:
sudo dd if=u-boot.imx of=/dev/sdb bs=1k seek=1 conv=fsync
上电打印,看看u-boot运行情况:
U-Boot 2016.03 (Oct 24 2021 - 12:27:05 +0800)
CPU: Freescale i.MX6ULL rev1.1 792 MHz (running at 396 MHz)
CPU: Industrial temperature grade (-40C to 105C) at 41C
Reset cause: POR
Board: I.MX6U ALPHA|MINI
I2C: ready
DRAM: 512 MiB
MMC: FSL_SDHC: 0, FSL_SDHC: 1
Display: ATK-LCD-4.3-800x480 (800x480)
Video: 800x480x24
In: serial
Out: serial
Err: serial
switch to partitions #0, OK
mmc0 is current device
Net: FEC1
Normal Boot
Hit any key to stop autoboot: 0
3、u-boot 关键命令修改
网络命令:
setenv ipaddr 192.168.0.50 //开发板ip
setenv ethaddr 00:04:9f:04:d2:35 //MAC
setenv gatewayip 192.168.0.1 //网关
setenv netmask 255.255.255.0 //子网
setenv serverip 192.168.0.67 //服务器ip
saveenv
ping 服务器:
bootargs 、bootcmd 命令修改(主要目的是控制接下来内核和文件系统的启动方式):
//文件系统启动于emmc
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
//linux内核启动于 emmc 注意 zImage 和 dtb文件,对应自己硬件
setenv bootcmd 'mmc dev 1; fatload mmc 1:1 80800000 zImage; fatload mmc 1:1 83000000
imx6ull-xxxx.dtb; bootz 80800000 - 83000000;'
//文件系统启动于nfs 注意搭建nfs的路径
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.0.67:/home/l17/linux/nfs/rootfs,proto=tcp rw
ip=192.168.0.50:192.168.0.67:192.168.0.1:255.255.255.0::eth0:off'
//linux内核启动于 tftp 注意 zImage 和 dtb文件,对应自己硬件
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 imx6ull-xxxx.dtb; bootz
80800000 - 83000000;'
//保存当前环境变量
saveenv
4、linux内核编译和移植
笔者这里也不大篇幅介绍linux内核,毕竟菜鸟不好意思讲,同u-boot一样,linux内核我们可以从linux官网下载,不过呢,我们还是直接从nxp官网下载芯片厂商测试过的内核吧。网址为:
https://www.nxp.com/search?keyword=imx6ull&start=0&category=software&filter=typeTax%3E%3Et749https://www.nxp.com/search?keyword=imx6ull&start=0&category=software&filter=typeTax%3E%3Et749https://www.nxp.com/search?keyword=imx6ull&start=0&category=software&filter=typeTax%3E%3Et749或者从第三方开发板商下载。
解压linux内核:
tar -vxjf linux-imx-rel-imx_4.1.15_2.1.0_ga.tar.bz2
为了今后编译方便,我们在内核目录下,写个脚本:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16
建议构建一个自己的defconfig文件(脚本里面暂时用的官方的),另外dts文件可以从官方evk里面拷贝一个,用于后期驱动搭建。执行脚本,编译内核,大概要几分钟(具体看电脑配置,笔者直接用一台电脑装的ubuntu,非虚拟机,速度还挺快的):
./mx6ull_xxxx.sh //具体看脚本起的啥名字
提取输出文件:zImage 和 dtb文件。文件路劲在 arch/arm/boot 和 arch/arm/boot/dts
然后将文件通过tftp启动,上文u-boot bootargs 、bootcmd 命令修改有讲解。
5、文件系统搭建
文件系统搭建工具有很多,busybox、buildroot(内含busybox,功能更丰富,但是编译时间更长)、Yocto(适合更专业的人员,小白可以先熟悉前两个,依次来摸索)。
busybox下载地址:BusyBox
buildroot下载地址:Buildroot - Making Embedded Linux Easy
大致操作套路都差不多:
解压构建工具:
tar -vxjf busybox-xxx.tar.bz2
tar -vxjf buildroot-xxx.tar.bz2
打开图形化配置:
make menuconfig
配置内容省略,网上资料很多可以自行搜索。
然后将输出的rootfs.tar压缩包解压到nfs,用于网路调试。