天天看點

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

i.MXU6LL - 制作燒錄SD卡詳細步驟

目錄

  • i.MXU6LL - 制作燒錄SD卡詳細步驟
      • 1、SD卡分區
      • 2、拷貝uboot到SD卡
      • 3、拷貝kernel和dtbs到SD卡
      • 4、拷貝檔案系統到SD卡

本文所有操作均在root模式下進行!

本篇部落格步驟主要參考NXP官方的手冊《i.MX_Linux_Users_Guide.pdf》的這一章節:

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

1、SD卡分區

提示:我們常用的SD卡一個扇區的大小是512位元組。

先說一下i.MX6ULL使用SD卡啟動時的分區情況,NXP官方給的鏡像布局結構如下所示:

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

可以看到,上圖将一張SD卡分成了三部分:

  • 第一部分:扇區起始位址2,大小為20478個扇區,分區格式為原始格式,用于存放uboot;
  • 第二部分:扇區起始位址20480,大小為1024000個扇區,分區格式為FAT,用于存放核心和裝置樹;
  • 第三部分:扇區起始位址1228800,大小為SD卡剩餘的空間,分區格式為Ext3或Ext4,用于存放rootfs,也就是檔案系統。

第一部分用于存放UBOOT,無檔案系統格式的要求,是以我們對分區的建立從第二部分開始就可以。

有了以上分區布局後,我們就可以對SD進行分區了。

拿到一張SD卡,首先将SD卡在windows下格式化成FAT32格式:

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

插入ubuntu系統之前,先使用以下指令檢視一下所有的磁盤:

fdisk -l
           

将SD卡插入ubuntu,再次輸入以上指令檢視一下所有磁盤,會發現多出來一個/dev/sdb和/dev/sdb1:

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

其中,/dev/sdb代表的就是SD卡本身,/dev/sdb1代表的是SD卡上的分區一,且格式為FAT32。

注意:SD卡插入ubuntu後,會出現/dev/sdX,具體是/dev/sdb還是/dev/sdc又或者是/dev/sdd要視個人插入ubuntu的USB口裝置情況而定。

接下來對SD卡重新分區:

fdisk /dev/sdb
           

依次輸入:

d         ---> 删除分區
n         ---> 建立分區 
p         ---> 選擇為主分區
1         ---> 分區編号為1
20480     ---> 分區1起始扇區
+500M     ---> 分區大小:500MB
p         ---> 顯示目前分區
n         ---> 建立分區
p         ---> 選擇為主分區
2         ---> 分區編号為2
1044480   ---> 分區起始位址
<enter>   ---> 敲回車,表示将剩下的所有空間都分給分區2
p         ---> 顯示目前分區
w         ---> 儲存
           

如下圖所示:

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟
i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

設定sdb1分區格式為FAT:

sudo mkfs.vfat /dev/sdb1
           

設定sdb2分區格式為Ext3或Ext4都可以:

sudo mkfs.ext3 /dev/sdb2
           

sudo mkfs.ext4 /dev/sdb2
           

如下圖:

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

此時SD卡的分布如下圖所示:

i.MXU6LL - 制作燒錄SD卡詳細步驟i.MXU6LL - 制作燒錄SD卡詳細步驟

2、拷貝uboot到SD卡

拷貝uboot到SD卡,輸入以下指令:

sudo dd if=u-boot.imx of=/dev/sdb bs=1k seek=1 conv=fsync
           

從上面我們對SD卡分區的時候知道,第一分區的起始位址是從扇區位址2開始的,SD卡的一個扇區是512位元組,也就是說第一分區的起始位址是SD卡的1K位元組處,上面這條指令中,bs設定dd指令的讀寫塊為1K大小,并且設定seek=1,表示從/dev/sdb開頭的1K位元組處開始寫u-boot.imx,正好就是寫到了u-boot在SD卡中所在的位置處。

問:為什麼從SD卡1K位置處存放uboot而不是從SD卡頭部開始?

答:這是NXP官方規定的,照做就是了。

dd指令可從标準輸入或檔案中讀取資料,根據指定的格式來轉換資料,再輸出到檔案、裝置或标準輸出。詳細指令解釋參見:https://www.runoob.com/linux/linux-comm-dd.html
  • if=檔案名:輸入檔案名,預設為标準輸入。即指定源檔案。
  • of=檔案名:輸出檔案名,預設為标準輸出。即指定目的檔案。
  • bs=bytes:同時設定讀入/輸出的塊大小為bytes個位元組。
  • seek=blocks:從輸出檔案開頭跳過blocks個塊後再開始複制。
  • conv=<關鍵字>,關鍵字可以有以下11種:
    • conversion:用指定的參數轉換檔案。
    • ascii:轉換ebcdic為ascii
    • ebcdic:轉換ascii為ebcdic
    • ibm:轉換ascii為alternate ebcdic
    • block:把每一行轉換為長度為cbs,不足部分用空格填充
    • unblock:使每一行的長度都為cbs,不足部分用空格填充
    • lcase:把大寫字元轉換為小寫字元
    • ucase:把小寫字元轉換為大寫字元
    • swap:交換輸入的每對位元組
    • noerror:出錯時不停止
    • notrunc:不截短輸出檔案
    • sync:将每個輸入塊填充到ibs個位元組,不足部分用空(NUL)字元補齊。

3、拷貝kernel和dtbs到SD卡

建立挂載點:

mkdir /mountpoint
           

挂載分區一:

mount /dev/sdb1 /mountpoint
           

使用cp指令将zImage和*.dtb檔案拷貝進/mountpoint目錄,然後取消挂載:

umount mountpoint
           

4、拷貝檔案系統到SD卡

挂載分區二:

mount /dev/sdb2 /mountpoint
           

解包你的檔案系統,假設檔案系統包為:rootfs.tar.bz2

tar -jxvf rootfs.tar.bz2
           

進入檔案系統目錄:

cd rootfs
           

拷貝所有檔案到/mountpoint目錄:

cp -a * /mountpoint
           

然後取消挂載:

umount mountpoint
sync
           

到此,SD啟動卡就已經制作完成!

ends…

繼續閱讀