此教程是从WebHome < Linux4SAM < TWiki 及一些官方英文视频教程归纳总结而来,如果急得看不进去英文,就来看看我这篇教程吧。
本教程会以一块atsama5d27的开发板,sd卡启动为例,介绍怎么编译linux启动相关文件。
在芯片上电后,固化在芯片内部的一小段程序会在各存储介质(sd卡 ,nand flash,spi flash)中查找并将bootloader调出来运行。
1.bootloader使用microchip公司自己编写的at91bootstrap项目编译而成。功能是对芯片进行初始化,设置时钟外设、设置周围连接的PMIC和DDR芯片等。根据编译时的设置,在初始化完成后,会从存储介质中将uboot或linux内核加载出来运行。
2.知名项目uboot。很多芯片都采用uboot来完成at91bootstrap所做的初始化内容。但在这时加载uboot出来,是贪他自带的一些实用的功能。比如用他可以方便的修改一些启动linux时的附加参数,通过网络下载linux内核文件并替换,开机时从串口控制台进入uboot调试模式等。
当然, uboot最后也是要把linux内核文件找出来,将rootfs的位置及一些参数告诉它,最后芯片控制权交由linux内核。
3.linux内核,使用最伟大的开源项目linux编译而成,microchip没有搞出什么自己魔改过的系统,老老实实的适配着最伟大的Linux。
4.rootfs根文件系统,linux的“c盘”,是指一堆文件夹与文件的集合体,所以linux内要使用的软件都要编译后存进rootfs内。目前较常用的是buildroot项目来编译,microchip公司也有提供使用buildroot进行一站式编译的示例配置,可以从bootloader到rootfs一键编译并生成可烧录镜像。
如果使用的是sd卡来存储,则只需要编译好这4个项目,将相关文件改好名后直接放进sd卡。
如果使用nand flash或emmc 来存储,则需要去下载microchip的烧录工具sam-ba进行烧录,将相关文件用sam-ba烧录到指定地址。
安装一些在后续可能会使用到的软件。如果编译时遇到报错xxx命令not found,那就是对应的程序没安装,用apt指令安装即可。
sudo apt-get install net-tools ssh sed make binutils build-essential apt-utils gcc g++ ncurses-base libncurses5-dev python git bison flex nfs-kernel-server libssl-dev chrpath gawk texinfo minicom nano cvs file cpio w3m asciidoc dblatex asciidoc-dblatex graphviz python-matplotlib
安装一些电脑中可能会缺少的库, 如果编译时遇到报错xxx.h文件不能打开,那就是缺少lib库文件,用apt指令安装即可。
sudo apt-get install diffstat libsdl1.2-dev libc6-i386 lib32stdc++6 lib32z1 libssl-dev libncurses5-dev -y
安装交叉编译器
sudo apt-get install gcc-arm-linux-gnueabi gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf –y
要操作sd卡,需要先找到其在/dev路径下的节点名称。这里我通过插拔sd卡,查看插入后多出哪个sd*节点的方式来找
查找到这个/dev/sdb即是我的sd卡,只分了一个区,所以有个sdb1。
使用fdisk对/dev/sdb进行操作,按m可以查看所有可用操作命令
sudo fdisk /dev/sdb
这里我先输入d,删除sd卡内原有的分区
然后将sd卡分为两个区,分区1为fat格式,20M, 设置为启动分区。分区2为默认的linux ext4格式,100M。
mkfs.vfat /dev/sdb1
mkfs.ext4 /dev/sdb2
sudo fdisk –l
git clone https://github.com/linux4sam/at91bootstrap.git
位于at91bootstrap /configs路径下,这些配置都是基于microchip官方开发板的。
配置文件的名称由3个信息组成:开发板名称,所用存储介质,接下来引导谁
存储介质:
qspi表示qspi flash
sd表示sd卡
nf表示nand flash
引导:
uboot表示下一步要引导uboot
linux_image_dt 表示下一步要引导linux内核和设备树
特殊:
名称带bkptnone的是用于裸机开发的
比如我用的开发板是sama5d2_xplained,我使用sd卡,接下来需要引导uboot。所对应的配置文件是sama5d2_xplainedsd_uboot_defconfig。
下面命令要在at91bootstrap目录下运行。因为make命令后带的参数具体对应什么操作,是由当前目录下的makefile文件来解析控制的。
首先,清除旧的目标文件和配置
make mrproper
然后加载configs路径下的配置文件sama5d2_xplainedsd_uboot_defconfig
make sama5d2_xplainedsd_uboot_defconfig
输入以下指令就可以进入配置界面,但我用的是官方开发板,什么都不需要改,只是进来看一眼有啥。
make menuconfig
本界面的操作方法与后面linux、buildroot的menuconfig界面的操作方法相同:
上下方向键,在列表中上下移动
左右方向键,会在下面的select exit help三个选项中移动
按回车,会执行下方3个选项中所选择的功能
按两下esc返回
遇到前面有[ ]的选项,按空格可以选择是否启用
这里能设置很多硬件相关东西,比如时钟频率,配套pmic的控制,外接什么存储介质在哪个接口上等。讲两个与初始化完下一步操作有关的。
Next Software Type可以设置当芯片初始化完了,下一个要调谁出来运行
Next Software Image File Name选项设置了下一个要启动的程序的文件名称,在sd卡内查找文件是以文件名而不是地址。 这里默认被设置为u-boot.bin。
首先运行下面指令,以声明要使用的交叉编译器。
由于交叉编译器有多种类型,很多项目(后面编译linux和uboot时也是)都会在编译脚本通过CROSS_COMPILE这个环境变量来控制要调用哪个交叉编译器。在编译脚本内会将CROSS_COMPILE的内容和”gcc”这个字符串相拼接,作为最终使用的编译器。
我们这里使用最基本的嵌入式交叉编译器arm-linux-gnueabi-gcc ,命令如下
export CROSS_COMPILE=arm-linux-gnueabi-
然后运行以下命令即可开始编译
make
题外话:注意一下电脑的用户权限问题,比如本目录下有用管理员权限创建修改过的文件,make时使用普通用户权限,因权限问题导致编译失败。
在上一步make编译,完成后会提示最后编译出的文件名称。位于build/binaries/路径下
这里我的文件名称是sama5d2-sdcardboot-uboot-4.0.0.bin。这个文件要改名为boot.bin放进sd卡分区1内。
mount /dev/sdb1 /mnt/
cp build/binaries/sama5d2-sdcardboot-uboot-4.0.0.bin /mnt/boot.bin
umount /mnt/
uboot比较有名,网上使用教程较多,所以这里只展示一下怎么编译microchip的配置。
这里我们下载存储在microchip公司的GitHub账号的uboot项目,其实下载uboot官方的也可以,相关配置都贡献进去了。
git clone https://github.com/linux4sam/u-boot-at91.git
自带的配置文件位于configs/路径下,由于有非常多的芯片都在使用uboot,所以这个路径下的配置文件极多
这里我们使用ls configs/*sama5d2* 命令来查看有哪些和sama5d2相关的配置文件
配置文件的命名是以开发板名+存储介质的方式,我的开发板是sama5d2_xplained,sd卡在这里被命名为mmc(很多芯片负责驱动sd卡的外设就命名为mmc)。所以我们要使用的配置文件是sama5d2_xplained_mmc_defconfig
使用以下命令调用对应配置文件
make sama5d2_xplained_mmc_defconfig
配置文件内已经写好了bootcmd和bootargs的参数:
bootcmd=fatload mmc 1:1 0x21000000 at91-sama5d2_xplained.dtb; fatload mmc 1:1 0x22000000 zImage; bootz 0x22000000 - 0x21000000
bootargs=console=ttyS0,115200 earlyprintk root=/dev/mmcblk1p2 rw rootwait
bootcmd设置了下一步要从sd卡中查找名为at91-sama5d2_xplained.dtb与zImage的文件。
bootargs设置了控制台是串口0,rootfs位置是sd卡分区2。
当然这两个参数可以随便改,uboot的相关教程网上很多,都是通用的,这里不解释了。
export CROSS_COMPILE=arm-linux-gnueabi-
make
5目标文件
在当前目录下会生成一个u-boot.bin,这个就是我们要的目标文件了。刚好和在at91bootstrap内设定的文件名相同。只要存放到sd卡分区1内即可。
mount /dev/sdb1 /mnt/
cp u-boot.bin /mnt/
umount /mnt/
只简单走一遍编译流程,编译linux内核的教程都是通用的
这里我们下载存储在microchip公司的GitHub账号的linux内核项目。
git clone https://github.com/linux4sam/linux-at91.git
microchip只提供了两个配置文件,都位于arch/arm/configs。
at91_dt_defconfig: 适用于内核为ARM926的SAM9 系列芯片,,
sama5_defconfig:用于内核为Cortex-A5的SAMA5系列芯片,
我使用的芯片是sama5d2所以使用后面这个配置
make ARCH=arm sama5_defconfig
export CROSS_COMPILE=arm-linux-gnueabi-
make ARCH=arm
位于arch/arm/boot/路径下的zImage文件
位于arch/arm/boot/dts的at91-sama5d2_xplained.dtb设备树文件
将这两个文件存放到sd卡分区1即可,上一步uboot内的bootcmd参数设置的文件名刚好跟这俩相同。
mount /dev/sdb1 /mnt/
cp arch/arm/boot/zImage /mnt/
cp arch/arm/boot/dts/at91-sama5d2_xplained.dtb /mnt/
umount /mnt/
这里我们直接下载buildroot官方项目
git clone https://github.com/buildroot/buildroot.git
由于rootfs的通用性较强,只需要编译时配置的处理器架构类型相同即可使用。这里我就不载入microchip提供的示例配置,从一个空工程开始,展示一遍怎么修改那部分不通用的部分。
首先运行命令进入menuconfig配置功能
make menuconfig
3.修改关于处理器架构部分
进入Target options选项
关于处理器架构的部分就只有下面这几个必选的
Target Architecture 设置为ARM(littile endian) ,ARM小端模式
Target Architecture Variant 设置选A5,sama5系列都是cortex-A5内核
Enable VFP extension support 启用,VFP指硬件浮点计算单元,sama5系列都带
Target ABI 选择EABIhf,带浮点计算的
设置完成后按两下esc退出,提示是否保存时记得选yes
make
这个步骤耗时较长,编译过程中还会上github下载大量东西,最少半小时起步。
位于output/images/路径下的rootfs.tar。我们要将其解压至sd卡分区2
mount /dev/sdb2 /mnt/
tar -xvf output/images/rootfs.tar -C /mnt/
umount /mnt/
至此,将sd卡插到嵌入式开发板上,即可启动