linux|SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem


Ubuntu18.04下对SD卡分区,并烧写uboot,kernel,DTB及filesystem

  • 一、对于U-Boot启动内核的小知识
    • 1、对于启动文件的理解
    • 2、对于存储介质的理解
    • 3、对于启动的理解
    • 4、对于文件类型的理解
  • 二、Ubuntu18.04下对SD卡分区
    • 1、将读卡器挂接到虚拟机,使用如下指令之一找到自己盘符
    • 2、对SD卡进行分区[^3]
    • 3、格式化分区
  • 三、烧写uboot,kernel,DTB及filesystem
    • 1、烧写uboot
    • 2、复制kernel和DTB
    • 3、复制fs
  • 四、启动exynos4412

一、对于U-Boot启动内核的小知识 1、对于启动文件的理解 有了设备树之后(Kernel-3.x加入设备树),嵌入式Linux开发一般需要四个文件:Bootloader(Uboot)、Kernel(uImage)、设备树(DTB)、根文件系统(rootfs)。
2、对于存储介质的理解 一般开发板上有多个存储介质,如:内存(NorFlash、SDRAM),大容量Flash(Nand Flash、SD卡等),网络也算特殊的一种。
Bootloader(Uboot)、Kernel(uImage)、设备树(DTB)、根文件系统(rootfs)这四个文件,理论上可以放在板上的任一存储介质里面。但由于一些特殊原因,往往有所限制。比如,Nor Flash比较小,一般只放Uboot,放不下rootfs。
因此,一般常见的方式是把Uboot放在Nor Flash或者SDRAM,其它的放在Nand Flash,就像JZ2440;或者全都放在SD卡,就像Ti的AM437X;又或者都放在emmc,像Tiny4412;总之就是以上的存储介质组合,根据实际情况而定。1
3、对于启动的理解 开发板上电后,先执行内部ROM中的固化代码,初始化时钟、总线等一些必要的东西。然后根据启动引脚的电平,读取相应的存储介质上的Uboot到RAM。接着,启动Uboot。U-Boot再根据用户传的参数加载内核、设备树、根文件系统。
4、对于文件类型的理解 Linux支持的文件系统以不同的介质来分类,如下所示2:
? 磁盘
FAT16、 FAT16、FAT32、NTFS、ext、ext2 、ext3、ext4
? 光盘
ISO9660、
? Flash
jffs2, yaffs, yaffs2、cramfs, romfs
? 内存
Ramdisk、tmpfs & ramfs
? 虚拟
rootfs、proc、sysfs、usbfs、devpts、NFS
所以,在移植跟文件系统的时候要考虑存储介质的类型。
二、Ubuntu18.04下对SD卡分区 1、将读卡器挂接到虚拟机,使用如下指令之一找到自己盘符
ls /dev/sd* sudo fdisk -l |grep sd cat /proc/partitions df -h

我的盘符是/dev/sdb
2、对SD卡进行分区3 sudo fdisk /dev/sdb,回车输入n,p,1。其中,p是指主分区,1是指第一个分区。输入起始扇区2048和结束扇区22528,完成了添加第一个分区,该分区占用的空间为SD卡第2048~22528扇区共10M,用来存放kernel image和DTB。这里要说明一下,实际当中我是采用u-boot的TFTP命令下载kernel image和DTB,然后挂载SD卡上的根文件系统。从原理上分析,应该是可以用u-boot的mmc或者fatload命令下载kernel image和DTB,但是我用SD卡启动Linux内核没有成功。可能是u-boot命令使用方法不正确,也可能是内核烧写不正确。如果有看客留言提供思路或者资料链接,不胜感激!
继续按照上述步骤,回车输入n,p,2。输入起始扇区24576和结束扇区1253376,添加第二个分区。该分区占用的空间为SD卡第24576~1253376扇区共600M,用来存放rootfs。
继续按照上述步骤,回车输入n,p,3。把剩下的存储空间分为一个区。
添加完成后执行w保存退出fdisk。
分区结束后,输入命令cat /proc/partitions,可以看到三个sdb,分别是/dev/sdb,/dev/sdb1,/dev/sdb2,/dev/sdb3
3、格式化分区 输入mkfs.vfat /dev/sdb1将第1个分区格式化成fat。
输入mkfs -t ext4 /dev/sdb2将第二个分区格式化成ext2,ext3或者ext4。
sudo mkfs.vfat /dev/sdb1 sudo mkfs.ext4 /dev/sdb2 sudo mkfs.ext4 /dev/sdb3

三、烧写uboot,kernel,DTB及filesystem 1、烧写uboot 本质上用dd命令烧写。我是用Samsung提供的烧写脚本,自动烧写的。不会影响其他分区里的文件。原理请参考以下博文:
Ubuntu18.04烧录U-Boot时格式化SD卡的文件类型(RAW 格式)
这里要说明的是,u-boot是烧写在SD卡第一个分区之前的0~1047扇区的位置。
2、复制kernel和DTB 思路是在/mnt目录下新建2个文件夹/mnt/sd1和/mnt/sd2,然后挂载分别挂载/dev/sdb1和/dev/sdb2。再分别把uImage、DTB和rootfs分别复制到/mnt/sd1和/mnt/sd2中。最后解挂。
这里只是说明复制kernel和DTB的方法,实际中是用TFTP命令下载的。各位看官勿喷。
sudo mkdir /mnt/sd1 /mnt/sd2 sudo chmod 776 /mnt/sd1 /mnt/sd2 sudo mount /dev/sdb1 /mnt/sd1 sudo mount /dev/sdb2 /mnt/sd2 sudo cp arch/arm/boot/uImage /mnt/sd1 sudo cp arch/arm/boot/dts/exynos4412-cbt4412.dtb /mnt/sd1 sudo cp ~/rootfs/rootfs.img /mnt/sd2 sudo umount /mnt/sd1 /mnt/sd2

3、复制fs 思路是利用在/mnt目录下的文件夹/mnt/sd1,然后挂载SD卡设备。
先查看SD卡分区的设备名称,然后挂载,再复制,最后解挂。
我对SD卡做了3个分区,用cat /proc/partitions,可以看到三个sdb,分别是/dev/sdb,/dev/sdb1,/dev/sdb2,/dev/sdb3。看官根据自己的实际情况,也可能是/dev/sdc、/dev/sdd等。
sudo mount -t /dev/sdb3 /mnt/sd1 sudo cp ~/rootfs/rootfs/* -a /mnt/sd1 ls /mnt/sd1 cd sudo umount /mnt/sd1

ls /mnt/sd1就可以看到根文件系统中的目录了。
四、启动exynos4412 把SD卡插入exyno4412开发板,设置启动引脚为SD卡启动。上电以后,就可以启动u-boot。通过cuteCom串口助手,输入u-boot命令,设置u-boot的环境变量从SD卡挂载根文件系统,然后tftp下载Linux内核和设备树,最后bootm命令启动内核。
setenv bootargs root=/dev/mmcblk0p3rootfstype=ext4 init=/linuxrc console=ttySAC0,115200n8 earlyprintk tftp 50000000 uImage; tftp 52000000 exynos4412-cbt4412.dtb; bootm 50000000 - 52000000

各位看官根据自己的实际情况修改bootargs参数中的root=/dev/mmcblk0p3
  1. Exynos4412——SD卡启动 ??
  2. 嵌入式Linux系统移植的四大步骤 ??
  3. 【linux|SD卡烧写Linux kernel——SD卡分区,并烧写uboot,kernel,DTB及filesystem】在Exynos4412上使用SD卡烧写Linux ??

    推荐阅读