记录一下之前烧ARM板的经历,本人第一次烧ARM板,欢迎大家评论探讨
刚毕业,一进公司就被安排的明明白白。望着手中崭新的板子,慢慢摸索呗
首先说一个惨痛的经历,由于没有经验,对Linux内核、系统等不熟悉,一开始就是自己在PC上装了一个虚拟机,分配了1G内存和50G硬盘(好吧,在学校的时候这种配置够我用了),然而多次耗时耗力的编译失败,让我开始怀疑人生。。。
重点!保证基本的软硬件环境要求:
强烈建议内存要2G以上(注意不包括2G,因为内存太小编译可能有问题),磁盘空间至少要80G以上,推荐120G,CPU至少双核。强烈不推荐虚拟机方式,直接在硬盘上安装Ubuntu,除非你的磁盘性能很高。
最后,我是在公司的服务器上编译完成的(分配了8G内存和足够的磁盘空间)
参照开发手册《MYS-6ULX-LinuxDevelopmentGuide_zh.pdf》
新开一个窗口,安装必备软件包
sudo apt-get install build-essential git-core libncurses5-dev flex bison texinfo zip unzip zlib1g-dev gettext u-boot-tools g++ xz-utils mtd-utils gawk diffstat gcc-multilib python git make gcc g++ diffstat bzip2 gawk chrpath wget cpio texinfo
建立工作目录,方便设置统一的环境变量路径。下载源码到工作目录下,同时设置DEV_ROOT变量,方便后续步骤的路径访问。
mkdir -p ~/MYS6ULx-devel
export DEV_ROOT=~/MYS6ULx-devel //配置到/etc/profile文件中,使永久生效
在当前目录下解压文件,得到四个文件夹,并复制到工作目录下。
cp -r 01-Document $DEV_ROOT
cp -r 02-Images $DEV_ROOT
cp -r 03-Tools $DEV_ROOT
cp -r 04-Source $DEV_ROOT
cd $DEV_ROOT
tar -xvf 03-Tools/Toolchain/gcc-linaro-4.9-2014.11-x86_64_arm-linux-gnueabihf.tar.xz
在/etc/profile文件中添加如下换环境
执行完上述命令后输入"arm-linux-gnueabihf-gcc -v",若有输出版本信息如下图,说明设置成功,以上设置只对当前终端有效。
Yocto提供的工具链有两种,一种是底层开发的meta-toolchain,另一种是用于应用开发的工具链。前者和Linaro类似,后者包含应用开发中的相关库,可以直接使用pkg-config工具来解决头文件或库文件的依赖关系。MYS-6ULX的资源包中有提供两种工具链。
包含Qt5相关库的应用工具链:
myir-imx-fb-glibc-x86_64-fsl-image-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.1.sh
不包含Qt5的应用工具链:
myir-imx-fb-glibc-x86_64-core-image-base-cortexa7hf-neon-toolchain-4.1.15-2.0.1.sh
meta-toolchain:
myir-imx-fb-glibc-x86_64-meta-toolchain-cortexa7hf-neon-toolchain-4.1.15-2.0.1.sh
Yocto编译器是以SDK工具包方式来提供,需要先安装SDK包后,才可以使用。安装方法如下:
以普通用户权限执行shell脚本,运行中会提示安装路径,默认在/opt目录下(自行建立目录,如下图),同时会提示输入用户密码以便有写入目录的权限。安装完成后,可以使用"source"或"."命令加载工具链环境到当前终端。
此处应先执行:
chmod +x myir-imx-fb-glibc-x86_64-fsl-image-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.1.sh
chmod +x myir-imx-fb-glibc-x86_64-meta-toolchain-cortexa7hf-neon-toolchain-4.1.15-2.0.1.sh
使两个文件拥有可执行权限。
验证SDK工具链是否安装正确,先使用"source"命令加载Yocto的环境配置文件,然后查看编译器版本。
source /opt/myir-imx6ulx-fb/4.1.15-2.0.1/environment-setup-cortexa7hf-neon-poky-linux-gnueabi //加载环境
arm-poky-linux-gnueabi-gcc –v //显示版本如下图
同样方法安装底层开发的工具链meta-toolchain。安装两个工具链,需指定不同目录,请勿使用相同目录,出现文件相互覆盖情形。
执行:
source /opt/myir-imx6ulx-fb/meta-toolchain/environment-setup-cortexa7hf-neon-poky-linux-gnueabi //加载环境
arm-poky-linux-gnueabi-gcc –v //显示版本如下图
主要介绍MYS-6ULX开发板上, Linux操作系统相关部件的编译和使用。MYS-6ULX的Linux系统包含以下部件:
U-Boot: 引导程序,支持不同方式启动内核。
Linux Kernel: 适用于MYS-6ULX开发板的Linux 4.1.15内核,同时包含支持板载外设的驱动。
Yocto: 一个开源协作项目,提供丰富的模板、工具和方法来支持构建出面向嵌入式产品的自定义Linux系统。
本部分中用到的代码存放在资源包04-Source目录下,部分软件包的文件名中有标识号。
编前u-boot和Linux内核代码前,请先安装meta-toolchain并加载环境变量到当前shell。
进入Bootloader目录,解压U-boot源码:
cd $DEV_ROOT/04-Source/
tar -xvf MYiR-iMX-uboot.tar.gz
cd MYiR-iMX-uboot
开始编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
这里的是配置选项名称,不同的启动模式需使用不同的配置选项,MYS-6ULX开发板四种选项:
启动模式 编译选项
MYS-6ULX-IND NAND Flash mys_imx6ul_14x14_nand_defconfig
MYS-6ULX-IND eMMC Flash mys_imx6ul_14x14_emmc_defconfig
MYS-6ULX-IoT NAND Flash mys_imx6ull_14x14_nand_defconfig
MYS-6ULX-IoT eMMC Flash mys_imx6ull_14x14_emmc_defconfig
此处选择mys_imx6ul_14x14_nand_defconfig。
mkimage工具是在u-boot的tools目录下,u-boot编译完成后,mkimage也会被编译出来,直接使用即可。
进入04-Source目录,解压内核源码:
cd $DEV_ROOT/ 04-Source
tar -xvf MYiR-iMX-Linux.tar.gz
cd MYiR-iMX-Linux
开始编译:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mys_imx6_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage dtbs modules
编译完成后在"arch/arm/boot"目录会生成内核镜像文件zImage,在"arch/arm/boot/dts"目录会生成DTB文件。
mys-imx6ul-14x14-evk-emmc.dtb
mys-imx6ul-14x14-evk-gpmi-weim.dtb
mys-imx6ul-14x14-evk-emmc-myb6ulx.dtb
mys-imx6ul-14x14-evk-gpmi-weim-myb6ulx.dtb
mys-imx6ull-14x14-evk-emmc.dtb
mys-imx6ull-14x14-evk-gpmi-weim.dtb
mys-imx6ull-14x14-evk-emmc-myb6ulx.dtb
mys-imx6ull-14x14-evk-gpmi-weim-myb6ulx.dtb
Linux系统平台上有许多开源的系统构建框架,这些框架方便了开发者进行嵌入式系统的构建和定制化开发,目前比较常见的有Buildroot, Yocto,OpenEmbedded等等。其中Yocto项目使用更强大和系统化的方法,来构建出适合嵌入式产品的Linux系统。
Yocto不仅仅是一个制做文件系统工具,同时提供整套的基于Linux的开发和维护工作流程,使底层嵌入式开发者和上层应用开发者在统一的框架下开发,解决了传统开发方式下零散和无管理的开发形态。
Yocto是一个开源的“umbrella”项目,意指它下面有很多个子项目,Yocto只是把所有的项目整合在一起,同时提供一个参考构建项目Poky,来指导开发人员如何应用这些项目,构建出嵌入式Linux系统。它包含Bitbake,OpenEmbedded-Core, 板级支持包,各种软件包的配置文件。通过Poky,可以构建出不同类需求的系统,如最小的系统core-image-minimal、带GUI的图形系统fsl-image-gui、带Qt5图形库的fsl-image-qt5。
NXP i.MX6UL/i.MX6ULL芯片提供符合Yocto的构建配置文件,通过这些文件可以构建出NXP定制的镜像文件。我们提供了符合MYS-6ULX的配置文件,帮助开发者构建出可烧写在MYS-6ULX板上的Linux系统镜像。
本节适合需要对文件系统进行深度定制的开发者,希望从Yocto构建出符合MYS-6ULX系列开发板的文件系统,同时基于它的定制需求。初次体验使用或无特殊需要的开发者可以直接使用MYS-6ULX已经提供的文件系统。
由于Yocto构建前需要下载文件系统中所有软件包到本地,为了快速构建,MYS-6ULX已经把相关的软件打包好,可以直接解压使用,减少重复下载的时间。
这里提供了两种方式使用Yocto:
使用由MYS-6ULX资源包中的Yocto和相关文件
从NXP官网下载Yocto
初次使用Yocto的用户,推荐使用第一种方式。
MYS-6ULX提供的Yocto:
解压Yocto源码包,同时解压Yocto-downloads.tar.xz软件包至Yocto目录下。
cd $DEV_ROOT
tar xvf 04-Source/fsl-release-yocto.tar.gz
tar xvf 04-Source/Yocto-downloads.tar.xz -C fsl-release-bsp
cd fsl-release-bsp
还需要将Linux内核和U-Boot代码放在用户家目录下,方便开发和Yocto编译。
cd $DEV_ROOT
tar xvf $DEV_ROOT/04-Source/ MYiR-iMX-Linux.tar.gz -C ~/
tar xvf $DEV_ROOT/04-Source/ MYiR-iMX-uboot.tar.gz -C ~/
进入/home/ieslab-ubuntu/MYS6ULx-devel/fsl-release-yocto目录,使用NXP提供的fsl-setup-release.sh脚本,会创建一个工作空间,然后在此空间下构建镜像。执行脚本后会先要求阅读并同意版权声明后才会进入构盡过目录。同时,脚本会默认创建并进入build目录。如果需要特定目录名称,可以使用-b参数,如"-b myir"。 这里的MACHINE参数有两种设备,"mys6ull14x14"对应于MYS-6ULX-IoT和"mys6ul14x14"对应于MYS-6ULX-IND版本。
DISTRO=myir-imx-fb MACHINE=mys6ul14x14 source fsl-setup-release.sh -b build
tree conf/
build/conf目录下是当前构建的配置文件。
在build目录下执行:
bitbake fsl-image-qt5
第一次构建时,会需要很长时间,而且一般会有几十个警告,请耐心等待。8G的内存大概花了6小时。
构建完成后会在"tmp/deploy/images/mys6ul14x14/"目录下生成不同的文件。
此处不做描述。
Yocto提供可构建出SDK工具的功能,用于底层或上层应用开发者使用的工具链和相关的头文件或库文件,免去用户手动制做或编译依赖库。SDK工具有两种,一种是适合底层开发的工具链,用于编译u-boot和linux内核代码,另外一种是应用开发工具链,附带目标系统的头文件和库文件,方便应用开发者移植应用在目标设备上。两种SDK工具都是shell自解压文件,执行后,默认安装在/opt目录下。
bitbake meta-toolchain
构建完成后,在"tmp/deploy/sdk"目录下有三个文件:
这里有两个manifest文件,host.manifest是工具链中包含主机端的软件包的列表,target.manifest是包含目标设备端的软件包列表。
应用层工具链是和Image名称是统一的,这里可以使用"fsl-image-qt5"和"core-iamge-base"两种参数。
bitbake -c populate_sdk
构建完成后,同样在"tmp/deploy/sdk/"目录下有三个文件:
".host.manifest"文件表示工具链中包含主机端的软件包列表,".target.manifest"表示工具链中包含目标设德端的软件包列表。"myir-imx6ulx-fb-glibc-x86_64-fsl-image-qt5-cortexa7hf-neon-toolchain-4.1.15-2.0.1.sh"文件是构建出的SDK工具链,可以直接安装在其他Linux系统中,开发和编译目标端设备的二进制程序。
到此,所需要烧写的Uboot、Linux内核、基于QT的文件系统、设备树以及交叉开发的工具链均完成了。
一定要注意环境的加载
欢迎探讨指正