爱板网论坛

查看: 308|回复: 0

[项目] 基于bbb-制作自己的SD启动卡

[复制链接]

37

主题

1

好友

508

积分

举人

Rank: 4

  • TA的每日心情

    2015-8-5 11:09
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2017-7-25 15:11:21 |显示全部楼层

    制作一张SD启动卡,可以有两种选择,第一,利用TI-SDK的脚本来制作,该脚本功能较多,可以制作2分区的也可以制作3分区的启动卡,而且写入的相关启动文件比如MLO、u-boot.img、根文件系统(包括了内核)既可以是TI-SDK包里面自带的预编译好的,也可以是自己做的放在其他地方的文件;第二,完全自己手动制作,定制一张自己想要的大小、分区数、写入自己编译的MLO、u-boot.img、根文件系统,这样也算是DIY了。

            TI-SDK包的使用不做说明,非常简单好用,运行脚本creat-sdcard.sh即可。下面介绍手动制作启动卡的步骤。
    1、关于SD卡启动模式
             当按住BBB板子上的boot按键,板子便从SD卡(也就是mmc0)启动,此时ROM-Code从SD卡的一个活动主分区(boot分区)寻找SPL文件,将其加载到片内SRAM,控制权移交SRAM,之后SPL运行后又以和寻找SPL相同的方式开始寻找u-boot.img文件,于是从boot分区找到u-boot.img文件,并将其加载到片外SDRAM,之后u-boot加载内核,挂载根分区的根文件系统(rootfs分区)。系统启动!
              由此得出结论,一张SD必须具备一个活动主分区,而且分区格式为FAT32(LBA),暂时把这个分区的名字叫做boot,boot分区中必须要有MLO、u-boot.img,以及一个根分区,分区格式为ext3/4,叫做rootfs,rootfs分区中必须有根文件系统,其他的就无所谓了。也就是说其他的文件可以和这些文件共存,只要保证这些文件以及目录完好即可。
               既然现在大小、分区数都有自己来定了,那么我手上一张8GB的内存卡microSD,我希望除了这两个用于启动系统的分区外还有第三个分区用于存放自己的文件,这样以后操作另外两个分区不会影响第三个分区,也不用像以前老是要把U盘的东西复制出来腾出空间做启动盘。在Linux可系统中对于一个移动设备它可以识别上面所有的分区,包括ext2/3/4以及FAT32(LBA),而windows系统对于一个移动设备,他仅仅识别上面第一个主分区,如果没有主分区就识别第一个逻辑分区,仅仅支持FAT32(LBA)格式。另外,对于BBB开发板,活动主分区一定要在第一个,否则启动系统时找不到文件。
                那么,有两种选择,
                 1)分区为boot分区,活动主分区,格式FAT32(LBA),大小50M即可
                 2)分区为rootfs分区,主分区,格式ext3/4,大小2GB
                 3)分区为store分区,主分区,格式ext3/4,剩余全部空间
                 或者
                 1)分区为boot分区,活动主分区,格式FAT32(LBA),大小5GB
                 2)分区为rootfs分区,主分区,格式ext3/4,剩余全部
                两种分区方法各有好处缺点。也可以有其他选择。Note:一个硬盘或者移动存储设备,上面最多可以有四个分区,其中包括主分区和扩展分区,并且扩展分区最多一个,当然也可以没有扩展分区。扩展分区之下可以有若干个逻辑分区。所以总容量=主分区+扩展分区,而扩展分区=逻辑分区之和。

    2、制作SD卡
             选择第二种方案进行分区。操作环境,虚拟机ubuntu12.04,microSD卡8GB,BBB开发板。
    step1:设置SD卡的磁头数、扇区数、柱面数,即H、S、C,这样设置是为了向SD卡读写数据是达到较高性能,其中C=SD卡bytes/H*S*512,我的SD卡的C=966,。
    1. <font color="#000000" size="3">    zhouyu@zhouyu-virtual-machine:~$ ls /dev | grep sd  
    2.     sda  
    3.     sda1  
    4.     sda2  
    5.     sda5  
    6.     sda6  
    7.     sdb  
    8.     sdb1  
    9.     sdc  
    10.     sdc1  
    11.     sdd  
    12.     sdd1  
    13.     sdd2  
    14.     sdd3  
    15.     sdd5  
    16.     zhouyu@zhouyu-virtual-machine:~$ sudo umount /dev/sdd5  
    17.     zhouyu@zhouyu-virtual-machine:~$ sudo umount /dev/sdd2  
    18.     zhouyu@zhouyu-virtual-machine:~$ sudo umount /dev/sdd3  
    19.     zhouyu@zhouyu-virtual-machine:~$ sudo fdisk /dev/sdd  
    20.       
    21.     命令(输入 m 获取帮助): p  
    22.       
    23.     Disk /dev/sdd: 7948 MB, 7948206080 bytes  
    24.     245 heads, 62 sectors/track, 1021 cylinders, total 15523840 sectors  
    25.     Units = 扇区 of 1 * 512 = 512 bytes  
    26.     Sector size (logical/physical): 512 bytes / 512 bytes  
    27.     I/O size (minimum/optimal): 512 bytes / 512 bytes  
    28.     Disk identifier: 0x00000000  
    29.       
    30.        设备 启动      起点          终点     块数   Id  系统  
    31.     /dev/sdd1            2048    10487807     5242880    5  扩展  
    32.     /dev/sdd2   *    10487808    10569727       40960    c  W95 FAT32 (LBA)  
    33.     /dev/sdd3        10569728    15523839     2477056   83  Linux  
    34.     /dev/sdd5            4096    10487806     5241855+   c  W95 FAT32 (LBA)  
    35.       
    36.     命令(输入 m 获取帮助):</font>
    复制代码
    插入SD卡后用命令查看一下,当前SD卡的标号是sdd,而且里面已经有分区sdd1(扩展分区),sdd2(活动主分区),sdd3(主分区),sdd5(逻辑分区),现将其全部卸载,再用fdisk程序开始进行分区工作。
    1. <font color="#000000" size="3">命令(输入 m 获取帮助): d  
    2.     分区号 (1-5): 1  
    3.       
    4.     命令(输入 m 获取帮助): d  
    5.     分区号 (1-4): 2  
    6.       
    7.     命令(输入 m 获取帮助): d  
    8.     Selected partition 3  
    9.       
    10.     命令(输入 m 获取帮助): x  
    11.       
    12.     专家命令(输入 m 显示帮助): h  
    13.     磁头数 (1-256,默认为 245): 255  
    14.       
    15.     专家命令(输入 m 显示帮助): s  
    16.     扇区数 (1-63,默认为 62): 63  
    17.       
    18.     专家命令(输入 m 显示帮助): c  
    19.     柱面数 (1-1048576,默认为 1021): 966  
    20.       
    21.     专家命令(输入 m 显示帮助): r  
    22.       
    23.     命令(输入 m 获取帮助):</font>
    复制代码
    先删除原先的分区,在输入指令X进入专家模式,分别设置H、S、C。C=SD卡bytes/H*S*512,取整数。设置完后输入R返回,继续。

    step2:分区设置
    1. <font color="#000000" size="3">    命令(输入 m 获取帮助): p  
    2.       
    3.     Disk /dev/sdd: 7948 MB, 7948206080 bytes  
    4.     255 heads, 63 sectors/track, 966 cylinders, total 15523840 sectors  
    5.     Units = 扇区 of 1 * 512 = 512 bytes  
    6.     Sector size (logical/physical): 512 bytes / 512 bytes  
    7.     I/O size (minimum/optimal): 512 bytes / 512 bytes  
    8.     Disk identifier: 0x00000000  
    9.       
    10.        设备 启动      起点          终点     块数   Id  系统  
    11.       
    12.     命令(输入 m 获取帮助): n  
    13.     Partition type:  
    14.        p   primary (0 primary, 0 extended, 4 free)  
    15.        e   extended  
    16.     Select (default p): p  
    17.     分区号 (1-4,默认为 1): 1  
    18.     起始 sector (2048-15523839,默认为 2048): 2048  
    19.     Last sector, +扇区 or +size{K,M,G} (2048-15523839,默认为 15523839): +6G  
    20.       
    21.     命令(输入 m 获取帮助): n  
    22.     Partition type:  
    23.        p   primary (1 primary, 0 extended, 3 free)  
    24.        e   extended  
    25.     Select (default p): p  
    26.     分区号 (1-4,默认为 2): 2  
    27.     起始 sector (12584960-15523839,默认为 12584960):   
    28.     将使用默认值 12584960  
    29.     Last sector, +扇区 or +size{K,M,G} (12584960-15523839,默认为 15523839):   
    30.     将使用默认值 15523839  
    31.       
    32.     命令(输入 m 获取帮助): p  
    33.       
    34.     Disk /dev/sdd: 7948 MB, 7948206080 bytes  
    35.     255 heads, 63 sectors/track, 966 cylinders, total 15523840 sectors  
    36.     Units = 扇区 of 1 * 512 = 512 bytes  
    37.     Sector size (logical/physical): 512 bytes / 512 bytes  
    38.     I/O size (minimum/optimal): 512 bytes / 512 bytes  
    39.     Disk identifier: 0x00000000  
    40.       
    41.        设备 启动      起点          终点     块数   Id  系统  
    42.     /dev/sdd1            2048    12584959     6291456   83  Linux  
    43.     /dev/sdd2        12584960    15523839     1469440   83  Linux  
    44.       
    45.     命令(输入 m 获取帮助):</font>
    复制代码
    可以看到新建分区前指令p的输出显示没有任何分区,再按照前面说的方案进行分区后在输入指令p查看新建的分区。

    step3:改变boot分区的系统id和设置boot分区为活动主分区
    1. <font color="#000000" size="3">   命令(输入 m 获取帮助): t  
    2.     分区号 (1-4): 1  
    3.     Hex code (type L to list codes): c  
    4.     Changed system type of partition 1 to c (W95 FAT32 (LBA))  
    5.       
    6.     命令(输入 m 获取帮助): a  
    7.     分区号 (1-4): 1  
    8.       
    9.     命令(输入 m 获取帮助): p  
    10.       
    11.     Disk /dev/sdd: 7948 MB, 7948206080 bytes  
    12.     255 heads, 63 sectors/track, 966 cylinders, total 15523840 sectors  
    13.     Units = 扇区 of 1 * 512 = 512 bytes  
    14.     Sector size (logical/physical): 512 bytes / 512 bytes  
    15.     I/O size (minimum/optimal): 512 bytes / 512 bytes  
    16.     Disk identifier: 0x00000000  
    17.       
    18.        设备 启动      起点          终点     块数   Id  系统  
    19.     /dev/sdd1   *        2048    12584959     6291456    c  W95 FAT32 (LBA)  
    20.     /dev/sdd2        12584960    15523839     1469440   83  Linux  
    21.       
    22.     命令(输入 m 获取帮助): w  
    23.     The partition table has been altered!  
    24.       
    25.     Calling ioctl() to re-read partition table.  
    26.       
    27.     WARNING: If you have created or modified any DOS 6.x  
    28.     partitions, please see the fdisk manual page for additional  
    29.     information.  
    30.     Syncing disks. </font>
    复制代码

    通过指令x,将分区表写入SD卡,分区完成!

    step4:分区格式化
    1. <font color="#000000" size="3">     zhouyu@zhouyu-virtual-machine:~$ sudo mkfs.vfat -F 32 -n boot /dev/sdd1  
    2.     [sudo] password for zhouyu:   
    3.     mkfs.vfat 3.0.12 (29 Oct 2011)  
    4.     zhouyu@zhouyu-virtual-machine:~$ sudo mkfs.ext3 -L rootfs /dev/sdd2  
    5.     mke2fs 1.42 (29-Nov-2011)  
    6.     文件系统标签=rootfs  
    7.     OS type: Linux  
    8.     块大小=4096 (log=2)  
    9.     分块大小=4096 (log=2)  
    10.     Stride=0 blocks, Stripe width=0 blocks  
    11.     91968 inodes, 367360 blocks  
    12.     18368 blocks (5.00%) reserved for the super user  
    13.     第一个数据块=0  
    14.     Maximum filesystem blocks=377487360  
    15.     12 block groups  
    16.     32768 blocks per group, 32768 fragments per group  
    17.     7664 inodes per group  
    18.     Superblock backups stored on blocks:   
    19.         32768, 98304, 163840, 229376, 294912  
    20.       
    21.     Allocating group tables: 完成                              
    22.     正在写入inode表: 完成                              
    23.     Creating journal (8192 blocks): 完成 </font>
    复制代码
    第一个分区被格式化成FAT32(LBA),分区名称boot。
    第二个分区被格式化成ext3,分区名称rootfs。

    step5:拷贝MLO、u-boot.img、rootfilesystem
    1. <font color="#000000" size="3">    <pre class="plain" name="code">zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/board-support/prebuilt-images$ sudo cp MLO-am335x-evm /media/boot/MLO  
    2.     zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/board-support/prebuilt-images$ sudo cp u-boot-am335x-evm.img /media/boot/u-boot.img  
    3.     zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/board-support/prebuilt-images$ sync  
    4.     zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/filesystem$ sudo tar -zxvf tisdk-rootfs-image-am335x-evm.tar.gz -C /media/rootfs/  
    5.     zhouyu@zhouyu-virtual-machine:/opt/ti-sdk-am335x-evm-07.00.00.00/filesystem$ sync</font>
    复制代码
    对于硬盘、优盘这类块设备,每次拷贝完文件其实文件只是写入了缓冲区,所以CP完后都要执行sync,将读写操作真正完成。
    step6:上述步骤完成后,一张SD启动卡算是完成了,插到板子上,按住boot按键,然后上电,结束!

    转自博客zy812248258

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /2 下一条

    手机版|爱板网 |网站地图  

    GMT+8, 2017-11-23 02:39 , Processed in 0.245740 second(s), 12 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部