硬件信息
- 开发板版本:正点原子阿尔法开发板V2.4(EMMC)
- CPU型号:I.MX6ULL
- 内存:512MB DDR3
- 外存(相当于磁盘):8G EMMC
系统移植
1. BootLoader
uboot(Universal Boot Loader, 通用BootLoader)是一款开源的BootLoader软件,没有适配具体芯片。
官方的原始uboot -> 原厂适配的uboot -> 开发板厂商适配的uboot
- 查看新插入的块设备:
shell
ls /dev/sd*
/dev/sdb是块设备, /dev/sdb1是块设备的第一个分区。
uboot命令
- 基础命令
shell
# 查看当前uboot支持所有的命令
help
# 查看uboot版本
version
# 查看板子信息
bdinfo
# 查看环境变量,环境变量都是字符串
printenv
# 新建/修改/删除环境变量
setenv # 新建/修改/删除DDR中的环境变量值
saveenv # 把DDR中的环境变量值写到Flash里
# e.g. 修改
setenv bootdelay 5
saveenv
# e.g. 新建
setenv myvar 1
saveenv
# e.g. 删除
setenv myvar
saveenv
- 网络相关命令
shell
# 基础网络参数
setenv ipaddr 192.168.183.100
setenv ethaddr b8:ae:1d:01:00:00
setenv gatewayip 192.168.183.1
setenv netmask 255.255.255.0
setenv serverip 192.168.183.128
saveenv
# nfs/tftp下载内核镜像
nfs 80800000 192.168.1.128:/home/mazy/nfs/zImage # 内存地址 内核镜像Pathname
tftp 80800000 zImage # 内存地址 内核镜像名字
- 启动命令
shell
# bootz, boot zImage
bootz 80800000 - 83000000 # zImage地址 initrd地址(没有用-表示) 设备树地址
# boot会直接读取环境变量bootcmd来启动Linux
# bootargs指定:
# Linux终端ttymxc0,波特率115200;
# root=指定根文件系统挂载位置/dev/mmcblk1p2,即mmc设备1,分区2;
# rootwait,表示等待mmc设备初始化完成以后再挂载
# rw表示根文件系统可以读写
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs rw nfsroot=192.168.1.128:/home/mazy/nfs/ rootfs ip=192.168.1.50:192.168.1.128:192.168.1.1:255.255.255.0::eth0:off'
setenv bootargs 'console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw'
setenv bootcmd 'tftp 80800000 zImage; tftp 83000000 my.dtb; bootz 80800000 - 83000000'
saveenv
boot
- 复位命令
shell
reset
2. Linux内核移植
- 搭建开发环境
- 安装交叉编译工具链
- 获取内核源码
- 芯片厂商提供(
推荐) - 开发板厂商提供(移植过的)
- 主线内核(kernel.org)
- 芯片厂商提供(
- 配置内核
- 复制一份芯片厂商板子默认配置进行修改(my_defconfig)
- 配置内核选项make menuconfig
- 编写设备树文件
- 复制一份芯片厂商板子设备树文件进行修改(my.dts)
- 在设备树Makefile编译选项中添加此设备树
- 编译内核
- 启动内核
2.1 内核源码
shell
# 内核源码路径:
# NXP官方原版Linux内核:开发板光盘/1、例程源码/4、NXP官方原版Uboot和Linux/linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
# I.MX6U-ALPHA开发板移植好的Linux内核:开发板光盘/1、例程源码/3、正点原子Uboot和 Linux出厂源码/linux-imx-4.1.15-2.1.0-g8a006db.tar.bz2
2.2 芯片厂商板子默认配置:
shell
# 芯片厂商板子默认配置:arch/arm/configs/
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make clean
make imx_v7_mfg_defconfig
make -j16
# 编译生成:
# arch/arm/boot/zImage
# arch/arm/boot/dts/imx6ull-14x14-evk.dtb
2.2 修改芯片厂商板子默认配置:
shell
# 芯片厂商板子默认配置:arch/arm/configs/
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
cp imx_v7_mfg_defconfig my_defconfig
vim my_defconfig # 注释掉 CONFIG_ARCH_MULTI_V6=y
make clean
make my_defconfig
make -j16
# 编译生成:
# arch/arm/boot/zImage
# arch/arm/boot/dts/imx6ull-14x14-evk.dtb
2.3 设备树
shell
cd arch/arm/boot/dts
cp imx6ull-14x14-evk.dts my.dts
# 在arch/arm/boot/dts/Makefile中添加新的设备树文件进行编译,dtb-$(CONFIG_SOC_IMX6ULL) += my.dtb
2.4 编译内核
shell
make distclean
make my_defconfig
make menuconfig
make all -j16
# 编译生成的内核镜像zImage和设备树.dtb路径:
# arch/arm/boot/zImage
# arch/arm/boot/dts/xxx.dtb
vmLinux、zImage、Image、uImage有什么区别?
- vmLinux(virtual memory Linux, 支持虚拟内存的Linux)是原始的未压缩的内核可执行文件(ELF格式),主要用于内核调试。
- Image是从vmLinux提取的二进制代码段,去掉了ELF头部和调试信息,是未压缩的。
- zImage(zipped Image, 压缩的Image)是经过gzip压缩后的Image。
- uImage(uboot zImage)是加了uboot引导内核信息头的zImage,老版本的uboot使用的内核镜像。
总结:使用的内核镜像是去掉调试信息的、压缩后的内核文件zImage。
2.5 启动内核
shell
# 把内核镜像和设备树文件复制到tftp服务器文件夹下
cp arch/arm/boot/zImage ~/tftp/
cp arch/arm/boot/dts/my.dtb ~/tftp/
# tftp把内核镜像和设备树下载到DDR内存里,启动
tftp 80800000 zImage
tftp 83000000 my.dtb
bootz 80800000 - 83000000