ARM开发之三:烧录SD卡,制作bootloader

在此之前,加入一些Linux启动过程和Android启动过程的细分,不想看的可以分级标题跳转到:烧写Uboot实验  部分
 

Linux启动和Android启动的细分

 在嵌入式中
Linux:做工控或者医疗设备使用Linux的多一些

Android:做消费电子,追求用户体验多一些

1)Linux的启动顺序

         先启动Uboot(bootloader)--->启动uImage/zImage(Linux内核)--->rootfs(根文件系统)

        先启动Uboot,Uboot启动之后引导内核,内核启动之后挂载根文件系统(根文件系统在硬盘上<如果是开发板就是EMMC>)

        在EMMC中首先是Uboot,Uboot不在分区里面,uImage可以放在分区也可以不放在分区中

        对于Linux来说EMMC中至少有一个分区,放的是根文件洗系统

未分区空间已分区空间
EMMC(8GB)   Uboot 和 uImagerootfs

2)Android的启动顺序

先启动Uboot(bootloader)--->启动uImage/zImage(安卓内核)--->启动ramdisk(虚拟内存盘)--->对于安卓系统进行简单的初始化--->初始化之后会去挂载

PS:其实ramdisk相当于系统的根(由于其是虚拟内存盘,所以这个根在内存里面)

        在ramdisk(根)目录下有这几个目录文件,需要进行分区挂载,

--->system(只有超级用户可以操作的<系统自带的软件“电话”“短信”等>)

--->data(普通用户可以操作的<相当于是安卓操作系统下的一个家目录,用户自己下载的文件放置在这里>)

--->cache(放的是一些缓存文件)

--->storage(可以存放用户自己的一些文件)

对于安卓系统来说硬盘翻去最少需要这四个

没有Uboot就没有办法进入recovery模式(刷过机的都知道,recovery模式是属于Uboot的一个工具,恢复出厂设置,相当于是格式化data分区)

EMMC(8GB)|Uboot uImage ramdisk | cache | data | storage | system|

看上去分区比Linux麻烦些。

烧写Uboot的实验

        对于我的S5P6818的开发板来说,板子的启动设备有:

  1. 第一启动设备是SD0
  2. 第二启动设备是EMMC
  3. 第三启动设备是USB

我们拿到一个新的开发板之后,EMMC是新的,里面什么都没有

所以我们不能通过EMMC启动,只能从SD0或者USB启动

SD0启动更方便,需要SD卡中有启动代码就是Uboot

所以需要先吧Uboot烧写到SD卡中

需要把Uboot放到SD卡的第513个字节,也就是说SD卡需要在前面空出512个字节

问我原因的话,只能说是S5P6818要求的

1)为啥要第513字节?

        主要是因为S5P6818内部有一块rom,里面存储的三星公司固化好的程序,当S5P6818芯片启动之后先执行ROM中的代码,执行之后获取SD卡中读bootloader。

        把bootloader读到6818内部的RAM中执行bootloader的第一阶段。

        第一阶段的功能就是初始化核心板上的DDR3内存,然后在核心板上的DDR中执行bootloader的第二阶段。

        bootloader必须要放到SD卡的第513个字节上,要不然6818的rom找不到bootloader

2)为啥不放到第0个字节?

        主要是因为SD卡的前512个字节(第一个扇区),存放的是分区表(分区的开始、结束、大小...)

3)如何准确的写入到SD卡的第513个字节?

        可以使用高编学过的知识,在Linux下一切皆文件。使用lseek进行偏移值操作

        SD卡插入到Linux系统中就是一个文件

        是用open close read write lseek

我们是这样给SD卡分区,SD卡开头512byte之后给它预留100MB或者SD卡1/100的空间。(给Uboot和Uimage留的空间)

把分区格式化为FAT32格式

SD卡[512byte + 100MB | ---FAT32--- |]

首先,你需要一张SD卡和Linux操作系统(自行搜索安装虚拟机及乌班图系统),前置硬件准备是必须的

创建SD卡分区

  1. 先把SD卡插入到PC机中
  2. 驱动在Linux系统中识别

    一般来说sda是PC机的硬盘分区,sdb就是SD卡
    /dev/sdb是整个SD卡设备
    /dev/sdb1是SD卡里面的第一个分区
    所以我们要写入bootloader到/dev/sdb文件的513个字节
  3. 确定SD卡是否挂载到了Linux操作系统中
    在Linux命令行中使用mount命令(查询挂载)

    即使没有找到挂载的SD卡分区,也没关系
    因为我们需要重新分区,需要把挂载的分区卸载掉
  4. 卸载挂载的分区
    umount /dev/sdb1 来进行卸载
  5. 去报卸载成功,重新查询一下
  6. 重新建立分区
    需要使用fdisk命令(可用于对磁盘分区的操作)
    1. sudo fdisk /dev/sdb
    2. p 命令(查看sd卡信息)
    3. d 命令(删除分区)
    4. p 命令(再次查看是否已经删除分区)
    5. n 命令(选择分区类型)(然后双回车,默认分区类型为p(主分区),分区号1
    6. 扇区大小 直接/100,例如我的是15728639,则写入157286,然后回车,(如果是新卡,此处没有移除签名选项,如果不是新卡,则有签名选项,Y即可
    7. t 命令,选择分区 1,L (大写)查看所有代码,选择FAT32的,也就是代码 b
    8. p 命令,(再次查看确认类型为 W95 FAT32)
    9. w 命令(同步磁盘,确认分区表)
  7. 给SD卡新创建的出来的分区进行格式化
    在终端命令行输入
    sudo mkfs.vfat -F 32 /dev/sdb1 -n red
    (-n 后是自己想要起的名字,自行决定即可)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值