这是哈工大嵌入式软硬件设计上机实验教程第二期U-Boot、Linux 内核的系统移植实验。
DC
哈工大嵌入式软硬件设计上机实验教程(一)-ARM裸机程序开发实验-按键控制LED
哈工大嵌入式软硬件设计上机实验教程(二)-U-Boot、Linux 内核的系统移植实验
哈工大嵌入式软硬件设计上机实验教程(三)-按键驱动实验
设置环境变量
export ARCH=arm
export CROSS_COMPILE=/usr/local/arm/4.6.2/bin/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-linux-
# 这是上节课安装交叉编译链的目录
上述设置环境变量是一次性的,终端窗口关闭之后再次打开需要重新输入。
将uboot源码解压缩到某个目录下,运行
make distclean
make smart210_config
make all
在当前目录下生成u-boot.bin,在spl目录下生成u-boot-spl.bin
上面这句是错的,实际生成的是smart210-uboot.bin
在windows上使用MiniTools运行u-boot.bin (smart210-uboot.bin)引导程序,观察是否正常工作。
将Linux源码解压缩到某个目录下,运行
将mini210_linux_defconfig复制到arch/arm/configs
make mini210_linux_defconfig
上述两句不用了。
安装ncurses
sudo apt-get install ncurses-dev
安装u-boot-tools
sudo apt-get install u-boot-tools
运行
rm .config
mv config-file .config
修改内核配置文件(打印信息、驱动模块等)
make menuconfig
把下图所示选项取消
编译内核映像,这一步会相当漫长,一般大于10分钟
make uImage
如果上面这句报错,请修改顶层Makefile,搜索找到
CROSS_COMPILE ?= $(CONFIG_CROSS_COMPILE:"%"=%)
将其更改为
CROSS_COMPILE ?=/usr/local/arm/4.6.2/bin/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-linux-
# 后面的是交叉编译链的地址
如果编译内核出现以下错误
Can’t use ‘defined(@array)’ (Maybe you should just omit the
defined()?) at kernel/timeconst.pl line 373.
/root/working/Hi3520D_SDK_V2.0.3.0/osdrv/kernel/linux-3.0.y/kernel/Makefile:140:
recipe for target ‘kernel/timeconst.h’ failed make[1]: ***
[kernel/timeconst.h] Error 255 Makefile:945: recipe for target
‘kernel’ failed make: *** [kernel] Error 2
解决办法:
将kernel/timeconst.pl中第373行的defined()去掉只留下@val就可以了
前面!也不要删掉呀~
下一步编译驱动模块(生成.ko文件,位于drivers/的各个子目录中)
make modules
这个文件夹需要自己建好
/home/ubuntu/WorkSpace/qemu-rootfs
将编译好的模块安装到指定位置
make modules_install INSTALL_MOD_PATH=/home/ubuntu/WorkSpace/qemu-rootfs
这里报错请参考这个
https://blog.csdn.net/lzasw_sss/article/details/38704827
下面将编译成功的u-boot.bin和uImage烧写到SD卡的特定位置。
将SD卡通过读卡器插入到电脑,并且被虚拟机的Ubuntu系统识别。
用mount –l命令查看此卡被挂载的分区,用umount命令卸载。
mount命令我运行不出来,查看分区有很多方法,例如
cat /proc/partitions
sudo fdisk -l
可参考这篇博客。
https://blog.csdn.net/camlot_/article/details/78543075
这里遇到几个问题,如果插卡之后虚拟机读不出卡,建议换一个不同型号读卡器。
USB3.0的读卡器可能有问题,可能需要安装USB3.0的驱动,我不会。
3.1格式化sd卡成fat32格式
sudo mkfs.vfat -I /dev/sdb1
3.2清空sd卡的分区表
sudo dd if=/dev/zero of=/dev/sdb1 bs=512 count=1
3.3烧写u-boot.bin:(在uboot的当前目录下执行)
sudo dd iflag=dsync oflag=dsync if=smart210-uboot.bin of=/dev/sdb seek=1
这里seek=1,跳过sd卡第一个block,因为sd卡开始的512个字节用来存放分区表。
请注意,这里的地址/dev/sdb是SD卡的地址,不是SD卡上某个分区的地址,如/dev/sdb1
如果烧写的是u-boot.bin和u-boot-spl.bin,则
sudo dd iflag=sync oflag=sync if=spl/u-boot-spl.bin of=/dev/sdb1 seek=1
sudo dd iflag=sync oflag=sync if=u-boot.bin of=/dev/sdb1 seek=32
3.4分两个区分别用于烧写uImage和根文件系统
sudo fdisk /dev/sdb1
命令(输入 m 获取帮助): p
# p代表查看当前分区
命令(输入 m 获取帮助): n
#n代表new创建新分区
**加粗样式**Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
#p代表建立的是主分区
分区号 (1-4,默认为 1): 1
#1代表新建分区号为1
起始 sector (2048-15523839,默认为 2048): 268288
#268288这个数我不知道有啥用,我用的是默认值
Last sector, +扇区 or +size{
K,M,G} (268288-15523839,默认为 15523839): +100M
#+100M代表新建分区大小为100Mb
命令(输入 m 获取帮助): t
#t表示设置这个分区的类型
Selected partition 1
#1代表要操作第1个分区
Hex code (type L to list codes): b
#b代表新建分区格式为W95 FAT32格式
Changed system type of partition 1 to b (W95 FAT32)
命令(输入 m 获取帮助): w
#w代表将刚才的操作正式写入SD卡
The partition table has been altered!
到了这里可能会报错,我的方法是直接reboot重启虚拟机系统。
对分区进行格式化,格式化成fat32
sudo mkfs -t vfat /dev/sdb1
增加文件系统分区,格式为ext3,创建过程和第一个分区类似
sudo fdisk /dev/sdb1
命令(输入 m 获取帮助): p
设备 启动 起点 终点 块数 Id 系统
/dev/sdb1 268288 473087 102400 b W95 FAT32
命令(输入 m 获取帮助): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
分区号 (1-4,默认为 2): 2
起始 sector (2048-15523839,默认为 2048): 473088
Last sector, +扇区 or +size{
K,M,G} (473088-15523839,默认为 15523839): +2G
命令(输入 m 获取帮助): t
分区号 (1-4): 2
Hex code (type L to list codes): 83
命令(输入 m 获取帮助): w
The partition table has been altered!
格式化成ext4格式
sudo mkfs -t ext4 /dev/sdb2
3.5挂载sd fat分区,复制uImage到sd卡
这里需要在uImage的目录,即
/home/work/桌面/2021嵌入式系统课程资源/tiny210/linux-smart210/arch/arm/boot
挂载SD卡分区/dev/sdb1到/mnt
sudo mount /dev/sdb1 /mnt
复制uImage到挂载在/mnt的SD卡分区/dev/sdb1
sudo cp uImage /mnt
卸载挂载
sudo umount /mnt -l
3.6挂载sd ext4分区,拷贝文件到sd卡
sudo mount /dev/sdb2 /mnt
cd rootfs_rtm_210/
sudo cp ./* /mnt -rf
卸载挂载
sudo umount /mnt -l
3.7将SD卡插入到开发板
在这里先挖一个坑,上电之后如何调试有多种办法,例如在Windows里使用PuTTY,也可以在Ubuntu里使用终端。
设置开发板启动模块为SD卡引导,上电启动后按q键进入命令行模式,执行
setenv bootcmd "mmc part; fatload mmc 0:1 0x21000000 uImage; bootm 0x21000000"
设置bootcmd参数,从sd卡读取kernel并启动。
3.8设置bootargs参数,支持从sd卡启动
setenv bootargs "console=ttySAC0,115200n8 noinitrd root=/dev/mmcblk0p2 rw rootfstype=ext4 init=/linuxrc lcd=H43 ctp=2"
设置bootcmd参数,从sd卡读取kernel并启动
setenv bootcmd "mmc part; fatload mmc 0:1 0x21000000 uImage; bootm 0x21000000"
输入
saveenv
点击开发板复位键,即可进入Linux系统。
DC