实现Tiny4412从SD卡的启动内核与根文件系统。

前面启动开发板时,需要从SD卡启动Uboot,然后从DNW下载内核和根文件系统到RAM,或者NFS挂载根文件系统。
Uboot应该是支持SD卡的,可以从SD卡读取内核。
Uboot把控制权交给内核后,内核必须要支持SD卡,才能访问SD卡的根文件系统,因此需要移植SD卡驱动。

1.关于启动的理解

嵌入式Linux开发一般需要至少三个文件:Bootloader(Uboot)、Kernel(uImage)、根文件系统(rootfs)。Kernel-3.x加入设备树后,又多了个DTB设备树文件。
因此,本次要准备四个文件:Uboot、Kernel、rootfs、DTB

一般开发板上有多个存储介质,如:Nand Flash、Nor Flash、mmc、emmc、SD卡、网络也算特殊的一种。

前面的四个文件,理论上可以放在板上的任一存储介质里面,然后给SOC信号(开发板上的启动顺序拨码开关),告诉它从哪个存储介质读取相应文件。
但由于一些特殊原因,往往有所限制。比如,Nor Flash比较小,一般只放Uboot,放不下rootfs。好像也没有支持网络NFS启动的Uboot,至少我目前没遇到过。
因此,一般常见的方式是把Uboot放在Nor Flash,其它的放在Nand Flash,就像JZ2440;或者全都放在SD卡/TF卡,就像Ti的AM437X;又或者都放在emmc,像Tiny4412;
总之就是以上的存储介质组合,根据实际情况而定。
需要一提的是,很多SOC现在都在Uboot前封装了一层代码,或者搞了一个其它什么机制,上电后马上初始化了存储介质相关的寄存器,其次才加载用户的第一行代码。

开发板上电后,先内部固化代码先初始化一些必要的东西(有的SOC没有这一机制),然后根据启动引脚的电平,读取相应的存储介质上的Uboot到RAM,启动Uboot后,根据用户传的参数加载内核、设备树、根文件系统到RAM。
这一过程的Uboot所处的存储介质受限比较大,要根据SOC所支持的启动方式来选择。后面Uboot启动后,Uboot会初始化更多的硬件存储介质,也就有了更多的选择。

启动过程其实是先将要启动的文件从存储位置拷贝到内存空间,再在内存中运行。因此所谓不同位置启动,也就是从不同位置拷贝而已。

2.移植SD卡驱动

SD卡移植的工作内容很少,仅对其设备树文件arch/arm/boot/dts/exynos4412-tiny4412.dts添加了一行代码即可:

 

1

2

3

4

5

6

7

8

9

10

 

-- /work/tools/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dts 2017-10-21 08:55:07.000000000 -0700

+++ /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dts 2017-10-31 03:34:04.609606802 -0700

@@ -79,6 +101,7 @@

bus-width = <4>;

pinctrl-0 = <&sd2_clk &sd2_cmd &sd2_cd &sd2_bus4>;

pinctrl-names = "default";

+ vmmc-supply = <&mmc_reg>;

status = "okay";

};

然后奇迹般就可以了。。懵逼。

3.制作SD卡

先将SD卡分为两个区,一个格式为fat32用于放内核和dtb,一个格式为ext3/4用于存放根文件系统。
可以使用fdisk命令分区,mkfs命令进行格式化。这里使用如下的mkcard.sh脚本更方便,原脚本里面的sfdisk是2.26版本的,在Ubuntu14.04运行正常,在Ubuntu16.04是无法运行的,Ubuntu16.014sfdisk的版本是2.27.1。顺便修改了下分区大小,看起来更舒服点,修改后的脚本如下:

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

 

#! /bin/sh

# mkcard.sh v0.4

# (c) Copyright 2009 Graeme Gregory <dp@xora.org.uk>

# Licensed under terms of GPLv2

#

# Parts of the procudure base on the work of Denys Dmytriyenko

# http://wiki.omap.com/index.php/MMC_Boot_Format

LC_ALL=C

if [ $# -ne 1 ]; then

echo "Usage: $0 <drive>"

exit 1;

fi

DRIVE=$1

dd if=/dev/zero of=$DRIVE bs=1024 count=1024

SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`

echo DISK SIZE - $SIZE bytes

CYLINDERS=`echo $SIZE/255/63/512 | bc`

echo CYLINDERS - $CYLINDERS

# 将SD卡分成2个区

sfdisk --no-reread $DRIVE << EOF

1024,1024000,0x0C,*

1024100,,,-

EOF

# 格式化第1分区为fat32格式, 并且命名为boot

if [ -b ${DRIVE}1 ]; then

mkfs.vfat -F 32 -n "boot" ${DRIVE}1

else

if [ -b ${DRIVE}p1 ]; then

mkfs.vfat -F 32 -n "boot" ${DRIVE}p1

else

echo "Cant find boot partition in /dev"

fi

fi

# 格式化第2分区为ext3格式, 并且命名为rootfs

if [ -b ${DRIVE}2 ]; then

mke2fs -j -L "rootfs" ${DRIVE}2

else

if [ -b ${DRIVE}p2 ]; then

mke2fs -j -L "rootfs" ${DRIVE}p2

else

echo "Cant find rootfs partition in /dev"

fi

fi

sync

sudo partprobe $DRIVE

sync

参考博客(需梯子)

执行

 

1

 

sudo ./mkcard.sh /dev/mmcblk0

等待一会,使用命令sudo fdisk -l查看分区,如果脚本工作完后,看起来没有分区成功,重启系统再来一次,有点莫名其妙的。

搞定后,此时就会有两个分别名叫bootrootfs的分区。
再使用制作Uboot的sd_fusing.sh脚本。

 

1

2

 

cd work/uboot_tiny4412_0929/sd_fuse/tiny4412

sudo ./sd_fusing.sh /dev/mmcblk0

简单看了看sd_fusing.sh脚本,脑补了下此时的SD卡分布:


此时在bootrootfs分区看不到相关文件的原因可能就是不在分区内。

最后依次将uImage、DTB、rootfs复制到SD卡即可:

 

1

2

3

4

 

sudo cp /work/linux-4.13.9/arch/arm/boot/uImage /media/hceng/boot/

sudo cp /work/linux-4.13.9/arch/arm/boot/dts/exynos4412-tiny4412.dtb /media/hceng/boot/

sudo cp -rd /work/nfs_rootfs/* /media/hceng/rootfs/

4.Uboot参数设置

刚开始测试的时候,老是卡在Starting kernel ...,查找了一下午原因,最后发现是Uboot参数设置的时候连写命令所致。
Uboot启动参数设置如下:

  • SD卡启动:

     

    1

    2

    3

    4

    5

    6

    7

     

    setenv bootargs 'root=/dev/mmcblk0p2 rw console=ttySAC0,115200 init=/linuxrc'

    saveenv

    setenv bootcmd fatload mmc 0:1 0x40000000 uImage\;fatload mmc 0:1 0x42000000 exynos4412-tiny4412.dtb\;bootm 0x40000000 - 0x42000000

    saveenv

    boot

  • NFS启动:

     

    1

    2

    3

    4

    5

    6

    7

     

    setenv bootargs 'root=/dev/nfs rw nfsroot=192.168.1.226:/work/fs_mini_mdev_new ethmac=00:40:5c:26:0a:5b ip=192.168.1.225:192.168.1.226:192.168.1.1:255.255.255.0::eth0:off console=ttySAC0,115200 init=/linuxrc'

    saveenv

    setenv bootcmd fatload mmc 0:1 0x40000000 uImage\;fatload mmc 0:1 0x42000000 exynos4412-tiny4412.dtb\;bootm 0x40000000 - 0x42000000

    saveenv

    boot

5.实际效果

Exynos4412——SD卡启动相关推荐

  1. 【TINY4412】U-BOOT移植笔记:(9)SD卡启动U-BOOT

    [TINY4412]U-BOOT移植笔记:(9)SD卡启动U-BOOT 宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64 目标板[底板]: Tiny4412SDK - 1506 目标板 ...

  2. ZYNQ-7000如何生成从Flash和SD卡启动的镜像文件

    将PL与PS部分一起使用,并且通过JTAG下载到板子运行.对于ZYNQ,有多种启动方式,比如从JTAG启动.从QSPI(即Flash)启动,从SD卡启动等.对于从JTAG启动的,我们直接运行程序就OK ...

  3. WINCE6.0+S3C6410基于SD卡启动

    ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi ...

  4. imx6 android SD卡启动

    工作中需要将imx6的android系统从SD卡启动,所以就分析了MfgTool中的脚本,分析android的分区情况,并尝试自己操作,竟然成功了,记录于此. 参考文档 http://www.kanc ...

  5. S5PV210体系结构与接口09:SD卡启动详解

    目录 1. MMC技术演进 1.1 NandFlash & NorFlash芯片 1.2 MMC卡 & SD卡 & MicroSD卡(TF卡) 1.2.1 代际关系 1.2.2 ...

  6. imx533 配置 制作SD卡启动文件系统

    制作SD卡启动文件系统 [1]对SD卡分区 按飞思卡尔文档列出的分区表用fdisk分区: Partition Type/Index Name Start Offset Size File System ...

  7. 基于S3C2440丛SD卡启动WinCE(或其它程序)的实现

    [楼主位] liuweiele Liuwei 积分:687 派别: 等级:------ 来自: 系统上电后,如果发现SD卡中有boot.ini文件,便按boot.ini文件中的指定参数运行,否则继续启 ...

  8. 嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210)

    嵌入式知识-ARM裸机-学习笔记(9):SD卡启动详解(S5PV210) 一.SD卡介绍 1. SD卡背景知识和特点 SD卡.MMC卡.MicroSD.TF卡:这些卡其实内部就是Flash存储颗粒,比 ...

  9. 第十一天: SD卡原理分析及SD卡启动详解

    主流的外存设备 内存和外存的区别: 一般是把这种(random access memory,随机访问存储器,特点是任意字节读写,掉电丢失)叫内存,把ROM(read only memory,只读存储器 ...

最新文章

  1. 设计模式:原型模式(Prototype)
  2. 地图上如何量方位角_楼承板厂家揭秘:压型钢板采购的7个坑之第2个坑_压型钢板如何在镀锌量上偷工减料?...
  3. Mac安装jdk1.8 / mysql5.7.16 与配置环境变量
  4. 以CSS方式提高您网站的速度
  5. Javascript 清空input type=file 的值方法
  6. Matlab:风向玫瑰图,我也行
  7. 第十二周 项目一--图基本算法库
  8. MBR 与 GPT - 分区时要知道的事情
  9. 【报告分享】第二届中国工业互联网大赛成果汇编-中国工业互联网大赛组委会(附下载)
  10. EXCEL中数字显示为E+18且尾数为0的解决方法
  11. 搭建rac+racdg
  12. cad批量转换低版本如何实现?
  13. iOS-扫描二维码and条形码
  14. CH579实现一个最小外围设备(Peripheral)
  15. Vmware Links(转自VMware-land)
  16. CSS 在table td一段文字前面做一个空白小框,空白下划线
  17. Linux 多线程多进程
  18. js实现点击查看大图功能
  19. STM32中ETH驱动配置注意事项dp83848, ip101alf, ip101gr, RTL8201,LAN8720
  20. Python顶点小说爬虫(《三寸人间》爬取)

热门文章

  1. (亲自实测,很好用)Amesim和simulink联合仿真
  2. 医疗小程序源码 在线就诊 视频问诊源码 智慧医院源码
  3. 计算机网络笔记整理(四):网络层
  4. 集合(下) ---有用
  5. python爬虫遇到403错误
  6. 数据结构和算法的重要性
  7. 安卓底层开发学习经验第十九期
  8. 【学霸笔记】数据结构基础知识大全
  9. python 打印当前行号_python中获取当前位置所在的行号和函数名(转)
  10. iPhone贴膜不求人!无气泡无灰尘完美贴膜自己来