目錄結構說明
一、基礎說明
1、環境介紹
2、啟動過程
3、相關地址布局
二、配置uboot支持uenv啟動
1、修改menuconfig
2、編譯uboot并準備文件
三、設置env.txt文件
0、了解bootcmd命令參數
1、mmc啟動參數
2、設置tftp啟動參數
3、設置tftp啟動引導nfs參數
4、設置tftp更新uboot、kernel參數
5、設置uart串口更新uboot、kernel參數
6、整合成env.txt
四、制作SD卡img
1、準備文件
2、制作Fat分區img
3、制作Ext4分區img
4、制作uboot、spl和分區表鏡像頭
5、整合成腳本
一、基礎說明
1、環境介紹
?? 首先這里我們需要安裝一些基礎的編譯環境,安裝tftp服務器,安裝nfs服務器等,這里我們可以參考文章《orangpione利用usb共享網絡(RNDIS)實現tftp加載內核掛載到NFS根文件系統》中的環境準備章節,自行安裝相關服務,在這里不展開。后續的開發是基于tftp和nfs傳輸的條件下進行。
2、啟動過程
?? 這里對應大多數的嵌入式linux系統的啟動過程都是相似的。首先在開機后,片上的soc會把在存儲設置中的SPL文件加載到RAM;然后SPL再加載存儲設備中的BootLoader到RAM中,再由BootLoader加載Kernel到RAM中,最后由Kernel接管控制權,并掛載根文件系統,成功啟動系統。其中有些還會使用initram,其實也是相當于內核接管控制權后,再把控制權移交給新的內核。
3、相關地址布局
??我們這里使用的orangpinone作為例子對相關的地址布局進行相應的描述,其中官網給出了一個相應的http://www.orangepi.org/Docs/Settingup.html,如下圖所示。個人感覺,這個分區布局更適合spiflash的布局。
??我這里使用的分區表信息如下
1、前面的8k空間沒有用,主要是預留給分區表用的
2、從8k開始的放了SPL,就是開機之后會被首先運行的文件
3、從40k開始放uboot-dtb,編譯出來的uboot和dtb合并的固件。
4、從1M之后建立一個10M的Fat分區,主要是為了方便在windons和linux上進行修改,因為這個分區主要放的文件是env.txt、zImage和dtb文件,即這里主要放的都是啟動時需要的env變量或者內核和內核設備樹文件。
5、最后再建立一個ext4格式的根文件系統。
二、配置uboot支持uenv啟動
??這里我們假設kernel、uboot和rootfs都已經編譯過了
1、修改menuconfig
??要使uboot支持uenv參數配置,我們只需要通過修改uboot啟動的命令行即可。
??基本思路是,uboot啟動后,從mmc中加載env.txt文件到RAM中,在通過env import指令把env.txt的參數設置為uboot的環境參數,最后通過env.txt參數中的uenvboot啟動命令開始加載內核。
- 通過
fatload mmc 0 $kernel_addr_r env.txt;
加載env.txt到內存中, - 通過
env import -t $kernel_addr_r $filesize;
把內存中的env.txt設置為uboot的環境參數。 - 最后通過
run uenvboot;
開始加載內核 - 當加載出錯的時候
run distro_bootcmd;
會被執行,則會按照默認的啟動順序啟動
主要配置為:
CONFIG_USE_BOOTCOMMAND=y
CONFIG_BOOTCOMMAND="fatload mmc 0 $kernel_addr_r env.txt; env import -t $kernel_addr_r $filesize; run uenvboot; run distro_bootcmd;"
2、編譯uboot并準備文件
- 通過make重新編譯uboot
- 準備好文件,env.txt、u-boot-dtb.bin、sunxi-spl.bin、zImage、sun8i-h3-orangepi-one.dtb和根文件系統
u-boot-dtb.bin 在uboot編譯目錄下ubootbuild/u-boot-dtb.bin
sunxi-spl.bin 在uboot編譯目錄下ubootbuild/spl/sunxi-spl.bin
zImage 在kernel編譯目錄下linuxbuild/arch/arm/boot/zImage
sun8i-h3-orangepi-one.dtb 在kernel編譯目錄下linuxbuild/arch/arm/boot/dts/sun8i-h3-orangepi-one.dtb
env.txt 文件我們下一章節介紹
三、設置env.txt文件
0、了解bootcmd命令參數
??是uboot在啟動后,需要執行的命令,一般可以固化到uboot編譯中去,也可以在uboot終端輸入執行,也能通過env.txt等參數設置文件傳入給uboot執行。其中通過uEnv的執行方式最為靈活,可以在不重新編譯的情況下直接修改設置參數,且只要env.txt的配置參數在相應分區中可以找到,就可以有uboot啟動后自動執行。
??具體的代碼定義可以在uboot源碼目錄下的include/config_distro_bootcmd.h文件中找到,里面定義了各種各樣的啟動參數配置,理論上說不管是從mmc啟動還是flash啟動,其配置的原理大致相同,不同的是SPL在引導uboot是產生的區別,已經不同環境的配置參數不同罷了。從config_distro_bootcmd.h文件中,不難發現,在include/configs/sunxi-common.h代碼中已經固定定義好了幾個參數變量,這個我們后續可以直接在env.txt中使用。比如kernel_addr_r、fdt_addr_r、filesize等,這里filesize需要特別強調一下,filesize是會返回前面一次操作返回的文件大小的值,在我們后續的env.txt中很有用。
1、mmc啟動參數
在uboot終端輸入
- 通過命令
fatload mmc 0:1 zImage $kernel_addr_h
從Fat格式分區加載zImage 內存內核中 - 通過命令
fatload mmc 0:1 sun8i-h3-orangepi-one.dtb $fdt_addr_r
從Fat格式分區加載sun8i-h3-orangepi-one.dtb內存設備樹中 - 通過命令
setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait rw
設置啟動之后的根文件系統為mmc的第2個分區(也就是我們的ext4分區) - 通過命令
bootz $kernel_addr_h - $fdt_addr_r
啟動內核
最后把整個mmc的啟動,當執行run boottommc是即可從mmc啟動根文件系統。
參數化到env.txt中有
mmcbootarg=setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait rw
mmcbootenv=fatload ${devname} ${devnum} $kernel_addr_r ${imagename}; fatload ${devname} ${devnum} $fdt_addr_r ${dtbna me};
boottommc=run mmcbootenv; bootz $kernel_addr_r - $fdt_addr_r;
2、設置tftp啟動參數
在uboot終端輸入(相關ip設置參考之前的文章)
- 通過命令
usb start;
啟動usb功能 - 通過命令
setenv ethact usb_ether;
設置usb網卡為第一網卡 - 通過命令
setenv ipaddr 192.168.137.2;
設置開發板ip - 通過命令
setenv netmask 255.255.255.0;
設置開發板掩碼 - 通過命令
setenv gatewayip 192.168.137.1;
設置網關ip - 通過命令
setenv serverip 10.8.24.111;
設置服務器地址 - 通過命令
tftp $kernel_addr_r zImage;
加載zImage到內存中 - 通過命令
tftp $fdt_addr_r sun8i-h3-orangepi-one.dtb
從Fat格式分區加載sun8i-h3-orangepi-one.dtb內存設備樹中 - 通過命令
setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait rw
設置啟動之后的根文件系統為mmc的第2個分區(也就是我們的ext4分區) - 通過命令
bootz $kernel_addr_h - $fdt_addr_r
啟動內核
參數化到env.txt中有
pcip=192.168.1.111
boardip=192.168.137.2
boardgw=192.168.137.1
boardmask=255.255.255.0
tftpenv=usb start; setenv ethact usb_ether; setenv ipaddr ${boardip}; setenv gatewayip ${boardgw}; setenv netmask ${boardmask}; setenv serverip ${pcip};
tftpgetimage=tftp $kernel_addr_r ${imagename}; tftp $fdt_addr_r ${dtbname};
mmcbootarg=setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait rw
tftpboottommc=run tftpenv; run tftpgetimage; run mmcbootarg; bootz $kernel_addr_r - $fdt_addr_r;
3、設置tftp啟動引導nfs參數
在uboot終端輸入(相關nfs設置參考之前的文章)
- ip設置部分參照“設置tftp啟動參數”的1~6步
- 通過命令
setenv bootargs "root=/dev/nfs rw rootpath=/home/vencol/code/nfs nfsroot=192.168.1.111:/home/vencol/code/nfs,nolock ip=192.168.137.2:192.168.1.111:192.168.137.1:255.255.255.0 console=${console} nfsvers=2"
設置nfs啟動根文件系統 - 通過命令
tftp $kernel_addr_r zImage;
加載zImage到內存中 - 通過命令
tftp $fdt_addr_r sun8i-h3-orangepi-one.dtb
從Fat格式分區加載sun8i-h3-orangepi-one.dtb內存設備樹中 - 通過命令
setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait rw
設置啟動之后的根文件系統為mmc的第2個分區(也就是我們的ext4分區) - 通過命令
bootz $kernel_addr_h - $fdt_addr_r
啟動內核
參數化到env.txt中有
pcip=192.168.1.111
boardip=192.168.137.2
boardgw=192.168.137.1
boardmask=255.255.255.0
nfspath=/home/vencol/code/nfs
tftpenv=usb start; setenv ethact usb_ether; setenv ipaddr ${boardip}; setenv gatewayip ${boardgw}; setenv netmask ${boardmask}; setenv serverip ${pcip};
nfsbootarg=setenv bootargs root=/dev/nfs rw rootpath=${nfspath} nfsroot=${pcip}:${nfspath},nolock ip=${boardip}:${pcip}:${boardgw}:${boardmask} console=ttyS0,115200 nfsvers=2
tftpgetimage=tftp $kernel_addr_r ${imagename}; tftp $fdt_addr_r ${dtbname};
tftpboottonfs=run tftpenv; run tftpgetimage; run nfsbootarg; run tftpgetimage; bootz $kernel_addr_r - $fdt_addr_r;
4、設置tftp更新uboot、kernel參數
以更新uboot和更新kernel為例子,在uboot終端輸入(這里我們選擇kernel的內存地址作為暫存地址,因為后續kernel更新會覆蓋)
- ip設置部分參照“設置tftp啟動參數”的1~6步
- 通命命令
tftp $kernel_addr_r u-boot-dtb.bin;
加載u-boot-dtb.bin到內存中 - 通過命令
fatwrite mmc 0:1 $kernel_addr_r 50 3E8
更新uboot(0x50 X 512 = 40K, 0x3E8 X 512 = 500K,默認uboot最多500k,可以適當修改小于1M-40K就行) - 通過命令
tftp $kernel_addr_r zImage;
加載zImage到內存中 - 通過命令
fatwrite mmc 0:1 $kernel_addr_r zImage ${filesize};
更新mmc中的內核
參數化到env.txt中有
devname=mmc
devnum=0
bootpart=1
saveenvname=uboot.env
envname=env.txt
splname=sunxi-spl.bin
bootname=u-boot-dtb.bin
imagename=zImage
dtbname=sun8i-h3-orangepi-one.dtb
bytftpupspl=tftp $kernel_addr_r ${splname}; ${devname} write $kernel_addr_r 10 40;
bytftpupuboot=tftp $kernel_addr_r ${bootname};${devname} write $kernel_addr_r 50 3E8;
bytftpupenv=tftp $kernel_addr_r ${envname};fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${envname} ${filesize};
bytftpupdtb=tftp $kernel_addr_r ${dtbname};fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${dtbname} ${filesize};
bytftpupimg=tftp $kernel_addr_r ${imagename};fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${imagename} ${filesize};
5、設置uart串口更新uboot、kernel參數
以更新uboot和更新kernel為例子,PC使用SecureCRT通過Ymoden協議傳輸,在uboot終端輸入
- 通過命令
loady $kernel_addr_r;
- 在PC的SecureCRT選擇發送Ymoden,并選中u-boot-dtb.bin文件,開始傳輸
- 傳輸完成后,通過命令
fatwrite mmc 0:1 $kernel_addr_r 50 3E8
更新uboot(0x50 X 512 = 40K, 0x3E8 X 512 = 500K,默認uboot最多500k,可以適當修改小于1M-40K就行) - 通過命令
loady $kernel_addr_r;
- 在PC的SecureCRT選擇發送Ymoden,并選中zImage文件,開始傳輸
- 傳輸完成后,通過命令
fatwrite mmc 0:1 $kernel_addr_r zImage ${filesize};
更新mmc中的內核
參數化到env.txt中有
devname=mmc
devnum=0
bootpart=1
saveenvname=uboot.env
envname=env.txt
splname=sunxi-spl.bin
bootname=u-boot-dtb.bin
imagename=zImage
dtbname=sun8i-h3-orangepi-one.dtb
byuartupspl=loady $kernel_addr_r; ${devname} write $kernel_addr_r 10 40;
byuartupuboot=loady $kernel_addr_r; ${devname} write $kernel_addr_r 50 3E8;
byuartupenv=loady $kernel_addr_r; fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${envname} ${filesize};
byuartupdtb=loady $kernel_addr_r; fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${dtbname} ${filesize};
byuartupimg=loady $kernel_addr_r; fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${imagename} ${filesize};
6、整合成env.txt
devname=mmc
devnum=0
bootpart=1
saveenvname=uboot.env
envname=env.txt
splname=sunxi-spl.bin
bootname=u-boot-dtb.bin
imagename=zImage
dtbname=sun8i-h3-orangepi-one.dtb
#tftp boot param
pcip=192.168.1.111
boardip=192.168.137.2
boardgw=192.168.137.1
boardmask=255.255.255.0
nfspath=/home/vencol/code/nfs
#mmc boot param
mmcbootarg=setenv bootargs console=ttyS0,115200 earlyprintk root=/dev/mmcblk0p2 rootwait rw
mmcbootenv=fatload ${devname} ${devnum} $kernel_addr_r ${imagename}; fatload ${devname} ${devnum} $fdt_addr_r ${dtbname};
boottommc=run mmcbootenv; bootz $kernel_addr_r - $fdt_addr_r;
#tftp and nfs
tftpenv=usb start; setenv ethact usb_ether; setenv ipaddr ${boardip}; setenv gatewayip ${boardgw}; setenv netmask ${boardmask}; setenv serverip ${pcip};
nfsbootarg=setenv bootargs root=/dev/nfs rw rootpath=${nfspath} nfsroot=${pcip}:${nfspath},nolock ip=${boardip}:${pcip}:${boardgw}:${boardmask} console=ttyS0,115200 nfsvers=2
tftpgetimage=tftp $kernel_addr_r ${imagename}; tftp $fdt_addr_r ${dtbname};
#set uart update env ymoden
byuartupspl=loady $kernel_addr_r; ${devname} write $kernel_addr_r 10 40;
byuartupuboot=loady $kernel_addr_r; ${devname} write $kernel_addr_r 50 3E8;
byuartupenv=loady $kernel_addr_r; fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${envname} ${filesize};
byuartupdtb=loady $kernel_addr_r; fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${dtbname} ${filesize};
byuartupimg=loady $kernel_addr_r; fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${imagename} ${filesize};
#set tftp update env
bytftpupspl=tftp $kernel_addr_r ${splname}; ${devname} write $kernel_addr_r 10 40;
bytftpupuboot=tftp $kernel_addr_r ${bootname};${devname} write $kernel_addr_r 50 3E8;
bytftpupenv=tftp $kernel_addr_r ${envname};fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${envname} ${filesize};
bytftpupdtb=tftp $kernel_addr_r ${dtbname};fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${dtbname} ${filesize};
bytftpupimg=tftp $kernel_addr_r ${imagename};fatwrite ${devname} ${devnum}:${bootpart} $kernel_addr_r ${imagename} ${filesize};
#updatebytftp=run updatespl; run updateenv; run updatedtb; run updateimg; run updateuboot;
#set define env
debugprint=echo "saveip ${serverip} setip ${pcip}";
cleanenv=setenv rmenv "env default -a; fatrm ${devname} ${devnum}:${bootpart} ${saveenvname};"
savedefenv=run cleanenv; run tftpenv; run mmcbootarg; saveenv;
saveenvfirst=if test "${serverip}_IP" = "${pcip}_IP"; then run debugprint; else run savedefenv; fi;
#boot selection
boottommc=run saveenvfirst; bootz $kernel_addr_r - $fdt_addr_r;
tftpboottommc=run saveenvfirst; run tftpgetimage; bootz $kernel_addr_r - $fdt_addr_r;
tftpboottonfs=run saveenvfirst; run nfsbootarg; run tftpgetimage; bootz $kernel_addr_r - $fdt_addr_r;
#select boot
uenvboot=run tftpboottonfs;
#uenvboot=run boottommc;
#uenvboot=run tftpboottommc;
#must have the last line
四、制作SD卡img
1、準備文件
??按照分區信息表,我們這里需要的文件有:sunxi-spl.bin、u-boot-dtb.bin、env.txt、zImage、sun8i-h3-orangepi-one.dtb和根文件系統rootfs
2、制作Fat分區img
-
dd if=/dev/zero of=img1 bs=1M count=10> /dev/null 2>&1
生成一個 10M的img1鏡像文件 -
sudo mkfs -t vfat -F 32 -n BOOT img1 > /dev/null 2>&1
格式化img1為Fat32格式,命名為BOOT -
sudo mount img1 bootdir;
掛載img1鏡像到bootdir目錄下 - 拷貝env.txt、zImage、sun8i-h3-orangepi-one.dtb到bootdir目錄下
-
sudo umount bootdir;
卸載img1鏡像
3、制作Ext4分區img
-
dd if=/dev/zero of=img2 bs=1M count=10> /dev/null 2>&1
生成一個 10M的img2鏡像文件 -
sudo mkfs -F -t ext4 -L ROOTFS img2 > /dev/null 2>&1
格式化img2為Ext4格式,命名為ROOTFS -
sudo mount img2 linuxdir;
掛載img2鏡像到linuxdir目錄下 -
sudo cp -rfa rootfs/* linuxdir > /dev/null 2>&1
拷貝rootfs下所有文件到linuxdir目錄下 -
sudo umount linuxdir ;
卸載img2鏡像
4、制作uboot、spl和分區表鏡像頭
-
dd if=/dev/zero of=img1 bs=1M count=30> /dev/null 2>&1
生成一個 30M的img鏡像文件 -
dd if=sunxi-spl.bin of=img seek=8 conv=notrunc bs=1k > /dev/null 2>&1
把sunxi-spl.bin復制到img鏡像8K之后 -
dd if=u-boot-dtb.bin of=img seek=1 conv=notrunc bs=40k > /dev/null 2>&1
把u-boot-dtb.bin復制到img鏡像40K之后 -
echo -e "n\np\n1\n2048\n+10M\nn\np\n2\n \n+10M\nt\n1\nc\na\n2\nw\n" | sudo fdisk ${SDIMG} > /dev/null 2 >&1
通過fdisk工具創建10M的fat和10M的ext4分區 -
dd if=img of=imgt bs=512 count=2048 > /dev/null 2>&1
把img的頭1M備份到imgt鏡像中 -
dd if=imgt of=img bs=512 count=2048 > /dev/null 2>&1
把imgt信息復制到img中 -
dd if=img1 of=img bs=1M conv=notrunc oflag=append > /dev/null 2>&1
把img1信息拼接到img中 -
dd if=img2 of=img bs=1M conv=notrunc oflag=append > /dev/null 2>&1
把img2信息拼接到img中
5、整合成腳本
#! /bin/bash
JOBNUM=4
NPWD=`realpath .`
CODETOP=`realpath ../../`
export ARCH=arm
export CROSS_COMPILE=$CODETOP/gcc/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
CONFIG_BOARD="OPIONE"
#CONFIG_BOARD="BBB"
mkdir -p images
cd images
mkdir -p bootfile
mkdir -p bootdir
mkdir -p linuxdir
echo $PWD
SDIMG="sd.img"
BOOTPARTSIZE=10
FSPARTSIZE=10
if [ $BOOTPARTSIZE -lt 10 ];then
echo "boot part size must larget than 10M"
exit 1
fi
if [ $FSPARTSIZE -lt 10 ];then
echo "rootfs part size must larget than 10M"
exit 1
fi
#boot partion
dd if=/dev/zero of=${SDIMG}1 bs=1M count=$BOOTPARTSIZE > /dev/null 2>&1
echo "Formating fat partition for boot..."
sudo mkfs -t vfat -F 32 -n BOOT ${SDIMG}1 > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "ERROR formating fat boot partition."
exit 0
fi
vfatuuid=`sudo blkid -s UUID -o value ${SDIMG}1`
echo " fat boot partition formated."
if ! sudo mount ${SDIMG}1 bootdir; then
echo "ERROR mounting fat boot partitions..."
exit 1
fi
if [ "${CONFIG_BOARD}_x" == "BBB_x" ];then
sudo cp -rf $NPWD/ubootbuild/MLO $NPWD/images/bootdir/
sudo cp -rf $NPWD/ubootbuild/u-boot.img $NPWD/images/bootdir/
sudo cp -rf $NPWD/linuxbuild/arch/arm/boot/zImage $NPWD/images/bootdir/
sudo cp -rf $NPWD/linuxbuild/arch/arm/boot/dts/am335x-boneblack.dtb $NPWD/images/bootdir/
sudo cp -rf $NPWD/ubootbuild/MLO $NPWD/images/bootfile/
sudo cp -rf $NPWD/ubootbuild/u-boot.img $NPWD/images/bootfile/
elif [ "${CONFIG_BOARD}_x" == "OPIONE_x" ];then
sudo cp -rf $NPWD/linuxbuild/arch/arm/boot/zImage $NPWD/images/bootdir/
sudo cp -rf $NPWD/linuxbuild/arch/arm/boot/dts/sun8i-h3-orangepi-one.dtb $NPWD/images/bootdir/
elif [ "${CONFIG_BOARD}_x" == "OPIWIN_x" ];then
sudo cp -rf $NPWD/linuxbuild/arch/arm64/boot/Image $NPWD/images/bootdir/
sudo cp -rf $NPWD/linuxbuild/arch/arm64/boot/dts/allwinner/sun50i-a64-orangepi-win.dtb $NPWD/images/bootdir/
fi
sudo cp -rf $NPWD/env.txt $NPWD/images/bootdir/
sync
if ! sudo umount bootdir; then
echo "ERROR unmounting fat boot partition."
fi
#rootfs partion
dd if=/dev/zero of=${SDIMG}2 bs=1M count=$FSPARTSIZE > /dev/null 2>&1
echo "Formating rootfs linux partition ..."
sudo mkfs -F -t ext4 -L ROOTFS ${SDIMG}2 > /dev/null 2>&1
#sudo mkfs -F -t ext4 -b 4096 -E stride=2,stripe-width=1024 -L ROOTFS ${SDIMG}2 > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "ERROR formating rootfs linux partition."
exit 0
fi
vfatuuid=`sudo blkid -s UUID -o value ${SDIMG}2`
echo " rootfs linux partition formated."
if ! sudo mount ${SDIMG}2 linuxdir; then
echo "ERROR mounting rootfs linux partitions..."
exit 1
fi
sudo rm -rf $NPWD/rootfs/root/*
sudo cp -rf $NPWD/env.txt $NPWD/rootfs/root
sudo cp -rfa $NPWD/rootfs/* linuxdir > /dev/null 2>&1
#sudo rsync -r -t -p -o -g -x --delete -l -H -D --numeric-ids -s --stats $NPWD/rootfs/ linuxdir > /dev/null 2>&1
sync
if ! sudo umount linuxdir; then
echo "ERROR unmounting rootfs linux partitions."
fi
#create img to burn
TABLESIZE=2048
FATSIZE=+${BOOTPARTSIZE}M
EXTSIZE=+${FSPARTSIZE}M
TOTALSIZE=$(expr ${BOOTPARTSIZE} + ${FSPARTSIZE} + 2)
dd if=/dev/zero of=${SDIMG} bs=1M count=$TOTALSIZE > /dev/null 2>&1
#cp SPL and bootloade to sd
echo "create partition table"
if [ "${CONFIG_BOARD}_x" == "BBB_x" ];then
#beaglebonblack first part
dd if=$NPWD/images/bootfile/MLO of=${SDIMG} count=1 seek=1 conv=notrunc bs=128k > /dev/null 2>&1
dd if=$NPWD/images/bootfile/u-boot.img of=${SDIMG} count=2 seek=1 conv=notrunc bs=384k > /dev/null 2>&1
elif [ "${CONFIG_BOARD}_x" == "OPIONE_x" ];then
#orangepi
#dd if=$NPWD/ubootbuild/u-boot-sunxi-with-spl.bin of=${SDIMG} seek=1 conv=notrunc bs=8k > /dev/null 2>&1
#CONFIG_SYS_MMCSD_RAW_MODE_U_BOOT_SECTOR=0x50 so x050*512/1024=40k
dd if=$NPWD/ubootbuild/spl/sunxi-spl.bin of=${SDIMG} seek=8 conv=notrunc bs=1k > /dev/null 2>&1
dd if=$NPWD/ubootbuild/u-boot-dtb.bin of=${SDIMG} seek=1 conv=notrunc bs=40k > /dev/null 2>&1
elif [ "${CONFIG_BOARD}_x" == "OPIWIN_x" ];then
#orangepi win
#dd if=$NPWD/ubootbuild/spl/sunxi-spl.bin of=${SDIMG} seek=1 count=4 conv=notrunc bs=8k > /dev/null 2>&1
#dd if=$NPWD/ubootbuild/u-boot.itb of=${SDIMG} seek=1 count=20 conv=notrunc bs=40k > /dev/null 2>&1
dd if=$NPWD/ubootbuild/u-boot-sunxi-with-spl.bin of=${SDIMG} seek=1 conv=notrunc bs=8k > /dev/null 2>&1
fi
#create img partition table
echo -e "n\np\n1\n$TABLESIZE\n$FATSIZE\nn\np\n2\n \n$EXTSIZE\nt\n1\nc\na\n2\nw\n" | sudo fdisk ${SDIMG} > /dev/null 2>&1
sync
sleep 2
partprobe -s ${SDIMG} > /dev/null 2>&1
if [ $? -ne 0 ]; then
echo "make img partition table error"
exit 1
fi
dd if=${SDIMG} of=${SDIMG}t bs=512 count=$TABLESIZE > /dev/null 2>&1
rm -rf ${SDIMG}
echo " create partition table success"
#merge imgt and img1 and img2 to img
echo "mergeing image "
if [ ! -f ${SDIMG}t ]; then
echo "error there is not ${SDIMG}t"
exit 1
fi
if [ ! -f ${SDIMG}1 ]; then
echo "error there is not ${SDIMG}1"
exit 1
fi
if [ ! -f ${SDIMG}2 ]; then
echo "error there is not ${SDIMG}2"
exit 1
fi
dd if=${SDIMG}t of=${SDIMG} bs=512 count=$TABLESIZE > /dev/null 2>&1
dd if=${SDIMG}1 of=${SDIMG} bs=1M conv=notrunc oflag=append > /dev/null 2>&1
dd if=${SDIMG}2 of=${SDIMG} bs=1M conv=notrunc oflag=append > /dev/null 2>&1
sync
sleep 2
partprobe -s ${SDIMG}
if [ $? -ne 0 ]; then
echo "make img partition table error"
exit 1
fi
echo "create successful"