arm-linux嵌入式 系統直接從SD卡啟動運行


這種一般是在工廠測試,為了提高效率 使用的

 

之前有寫過一個,把SD卡制作好,然后通過另外分區, 加載到SD卡也能啟動系統,但是這個有一個缺點,就是文件系統不能使用鏡像直接燒了,要使用Linux拷貝文件到exit4中,

這樣比較麻煩,今天記錄一下在之前的基礎上 實現 鏡像的統一

 

首先,參考  https://www.cnblogs.com/ChenChangXiong/p/11347044.html

 

參照這里把除了文件系統以外的uboot  zImage相關的文件制作好,文件系統鏡像留着

完成以上的步驟,得到

 

zImag  MLO  **.dtb  u-boot.img

 

uboot修改

需要修改參數,修改bootargs啟動參數,把自動燒錄模式的AUTO_UPDATESYS變量取消定義 ,因為在bord.c中會判斷如果這個變量定義了,就進去燒錄模式,所以需要取消定義

 

 取消以后,就直接進入MMC啟動,也就是sd卡,而不是燒錄模式

 

 uEnv.txt中需要注意的是 console是否對的上,要寫串口使用的節點 ,一般是ttyO0 ,我使用的是ttyAP0,就因為這里忽略,有一次總是卡在kernel就找不到原因了,因為節點不對,不現實打印kernel,修改后解決問題,還需要注意的就是設備樹需要修改

接下來就是分區合並了,把uEnv.txt zImag  MLO  **.dtb  u-boot.img,以及文件系統合並,  kernel和文件系統不需修改,所有系統文件如下,文件系統不做修改,直接復制到p2分區

 

 

 命令操作如下:

 

sudo dd if=/dev/zero of=my.img bs=1M count=200

sudo losetup -f --show my.img

 通過 fdisk 命令對磁盤文件進行分區,就跟普通磁盤文件一樣。

sudo    fdisk    /dev/loop0

 Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x2e7df78e. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable.
 Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) Command (m for help): n # 新建一個分區 Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p # 主分區 Partition number (1-4, default 1): 1 # 分區號 First sector (2048-409599, default 2048): # 默認2048 Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-409599, default 409599): +30M # 給30M空間第一個分區 Command (m for help): n # 新建一個分區 Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): p # 主分區 Partition number (1-4, default 2): # 使用默認的2 Using default value 2 First sector (63488-409599, default 63488): # 使用默認值 Using default value 63488 Last sector, +sectors or +size{K,M,G} (63488-409599, default 409599): # 直接到結束 Using default value 409599 Command (m for help): t # 改變分區 Partition number (1-4): 1 # 改變第幾個分區 Hex code (type L to list codes): e # 改為FAT16分區 Changed system type of partition 1 to e (W95 FAT16 (LBA)) Command (m for help): a # 增加boot 屬性 Partition number (1-4): 1 # 指定第一個分區增加boot 屬性 ommand (m for help): w # 保存相關信息 The partition table has been altered! Calling ioctl() to re-read partition table. WARNING: Re-reading the partition table failed with error 22: Invalid argument. The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8) WARNING: If you have created or modified any DOS 6.x partitions, please see the fdisk manual page for additional information. Syncing disks.

 

 sudo kpartx -av /dev/loop0

 sudo mkfs.vfat -n "boot" -F 16 /dev/mapper/loop0p1

sudo mkfs.ext3 -L "rootfs" /dev/mapper/loop0p2

 

接着掛載在p1  p2 上,首先新建兩個文件夾 p1  p2

 

sudo mount /dev/mapper/loop0p1 p1

sudo mount /dev/mapper/loop0p2 p2

sync

就是復制你的鏡像文件到對應的分區,把除了文件系統的文件,復制到p1  ,文件系統下的文件 復制到p2

 

然后解除掛載

 sudo umount   p1   p2

sudo kpartx -d /dev/loop0

sudo losetup -d /dev/loop0

 

就可以把第一步制作的my.img 拷貝出去,正常燒錄

 

 上面的步驟可以做成腳本,一鍵生成

#!/bin/sh

sudo dd if=/dev/zero of=my.img bs=1M count=200
sudo losetup -f --show my.img
sudo    fdisk    /dev/loop0 <<EOF

n
p
1
2048
+30M
n
p
2
63488
409599
t
1
e
a
1
w
EOF

sleep  1
echo ==finish==

sudo kpartx -av /dev/loop0
sudo mkfs.vfat -n "boot" -F 16 /dev/mapper/loop0p1
sudo mkfs.ext3 -L "rootfs" /dev/mapper/loop0p2
sleep 1

sudo mount /dev/mapper/loop0p1 p1
sudo mount /dev/mapper/loop0p2 p2
sync

echo  ==start copy==
sudo cp image/am335x-qt243n.dtb  image/MLO  image/u-boot.img image/uEnv.txt image/zImage p1/
sudo cp PDK3_ROOTFS/rootfs/*  p2  -rf

sudo umount   p1   p2
sudo kpartx -d /dev/loop0
sudo losetup -d /dev/loop0

cp  my.img  ~/
sync

echo  ==done==

 

參考:  https://www.cnblogs.com/chenfulin5/p/7596564.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM