ftp服务器地址,即CCS Uniflash的地址
SERVER_IP="192.168.2.1"
MLO u-boot.img uImage压缩文件的名称,即ftp服务器下载目录里的文件名
BOOT_PARTITION="boot_partition.tar.gz"
文件系统的名称,即ftp服务器下载目录里的文件名
ROOTFS_PARTITION="rootfs_partition.tar.gz"
要烧写的emmc的设备名称
DRIVE="/dev/mmcblk0"
通过tftp下载上面两个文件,这里其实可以不用从ftp上下载,直接拷贝到sd卡也行
time tftp -b 4096 -g -r ${BOOT_PARTITION} ${SERVER_IP} &
boot_pid=$!
time tftp -b 4096 -g -r ${ROOTFS_PARTITION} ${SERVER_IP} &
rootfs_pid=$!
清除分区
dd if=/dev/zero of=$DRIVE bs=4k count=1
sync
sync
获得emmc的大小,以字节为单位
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
计算柱面数,一般来说,linux系统都是将磁盘空间的计算以这样的公式
磁头数*每磁道的扇区数*每扇区的字节数*柱面数 = 磁盘总大小
而且一般计算的时候,磁头数=255,每磁道的扇区数=63,每扇区的字节数=512,然后用总大小来计算出“柱面数”,
然后分区的时候,就以柱面的数量来划分区
因此,下面就是来计算柱面数
CYLINDERS=`echo $SIZE/255/63/512 | bc`
这个函数的作用就是卸载已挂载的分区,并用dd命令来清除分区
check_mounted(){
从proc文件系统中得到已经挂载的分区列表
is_mounted=$(grep ${DRIVE}p /proc/mounts | awk '{print $2}')
if grep -q ${DRIVE}p /proc/mounts; then
echo "Found mounted partition(s) on " ${DRIVE}": " $is_mounted
如果有分区存在,则需要umount所有分区
umount $is_mounted
counter=1
for i in $is_mounted; do
echo "4k erase on ${DRIVE}p${counter}";
然后,依次用dd命令来清除分区
dd if=/dev/zero of=${DRIVE}p${counter} bs=4k count=1;
counter=$((counter+1));
done
else
echo "No partition found. Continuing."
fi
}
check_mounted;
用上面得到的柱面数来分区
echo "Partitioning the eMMC..."
用sfdisk指定emmc,磁头数=255,每磁道的扇区数=63,柱面数=上面计算的结果
sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE << EOF
这里分了两个区,每个区4个参数,第一个参数是起始柱面号,第二个参数是柱面数,因此下面的参数实际
就是,第一个区的柱面数0-9,第二个区的柱面数10-MAX
,9,0x0C,*
10,,,-
EOF
格式化刚刚分的两个区
mkfs.vfat -F 32 -n "boot" ${DRIVE}p1
mkfs.ext3 -L "rootfs" ${DRIVE}p2
挂载刚刚分的两个区
mkdir tmp_boot
mkdir tmp_rootfs
mount -t vfat ${DRIVE}p1 tmp_boot
mount -t ext3 ${DRIVE}p2 tmp_rootfs
分别解压用ftp下载的两个文件到那两个分区即可
time tar -xf ${BOOT_PARTITION} -C tmp_boot
sync
sync
umount ${DRIVE}p1
time tar -xf ${ROOTFS_PARTITION} -C tmp_rootfs
sync
sync
umount ${DRIVE}p2
总结:
通过分析这个烧写脚本,可以看到,bbb的烧写就是对以下几步
1. 首先要先启动一个linux,同过ftp或sd卡
2. 通过ftp或sd卡得到需要烧写的文件
3. 对emmc分区
4. mount emmc分区,并解压烧些文件到emmc的分区即可