哈工大嵌入式软硬件设计上机实验教程(二)-U-Boot、Linux 内核的系统移植实验

前言

这是哈工大嵌入式软硬件设计上机实验教程第二期U-Boot、Linux 内核的系统移植实验。

DC

点击这里查看往期教程

哈工大嵌入式软硬件设计上机实验教程(一)-ARM裸机程序开发实验-按键控制LED
哈工大嵌入式软硬件设计上机实验教程(二)-U-Boot、Linux 内核的系统移植实验
哈工大嵌入式软硬件设计上机实验教程(三)-按键驱动实验

目录

  • 前言
    • 点击这里查看往期教程
  • U-Boot、Linux 内核的系统移植实验
    • 1.编译uboot
    • 2.编译Linux内核
    • 3.烧录SD卡

U-Boot、Linux 内核的系统移植实验

1.编译uboot

设置环境变量

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)引导程序,观察是否正常工作。

2.编译Linux内核

将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

把下图所示选项取消
哈工大嵌入式软硬件设计上机实验教程(二)-U-Boot、Linux 内核的系统移植实验_第1张图片
编译内核映像,这一步会相当漫长,一般大于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

3.烧录SD卡

下面将编译成功的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

你可能感兴趣的:(实验教程,arm,嵌入式,linux,ubuntu)