背景:
我设计了一个嵌入式系统,我移植了Android Gingerbread来运行它。我使用基于ARM Cortex-A8的CPU模块,其上有CPU,SDRAM,NANDFLASH,其余部分都可以在模块引脚上使用,因此我可以添加自己的硬件接口。第一个预装了u-boot。我必须做的就是安装我的Gingerbread,将4张图像(kernel.img,system.img,ramdisk-yaffs.img和userdata.img)放在SD-CARD的目录(/ sdfuse)中,然后刻录它使用命令“sdfuse flash kernel kernel.img”和其他3个文件的等效命令到板载NANDFLASH。很简单。之后,我将Android中的SDCARD用作外部存储。 (生活很美好!)
问题:
现在我买了更多的模块而且他们没有预装u-boot。因此,我需要在其上制作带有u-boot的可启动SD卡。它必须是FAT才能在启动时被我的处理器识别。我实际上有一个FAT32的SDHC 4GB卡,成功安装U-boot,它启动我的系统到u-boot提示,告诉我它找不到4个图像文件。这是预期的,因为图像还没有。问题是现在我无法创建/ sdfuse文件夹并将4个图像文件放在其上。我的MACBook和我的Ubuntu机器都不允许我安装SD卡以在其上创建“/ sdfuse”文件夹。两个磁盘管理器都看到了SD卡,但都不允许挂载它。显然,我错过了某个地方。我现在拥有一个可启动的4GB FAT32 SD卡,上面有U-boot,但卡的其余部分不再可用了。谁知道问题可能是什么?为什么我不能使用这个4GB可启动FAT32分区来安装带有图像的“/ sdfuse”文件夹?我使用Ubuntu机器来创建可启动的SD卡,因此,USB / SD卡读卡器运行良好,换句话说,问题不是hatdware,而是某种软件配置。
编辑Chris Stratton关于文件系统的评论: 我有一张SD卡包含“/ sdfuse”和4个图像文件(kernel.img等)以及一堆其他文件和文件夹。使用Ubuntu Diskutility,我可以将其视为一个分区W95 FAT32(LBA)(0x0c)主引导记录。我可以从Ubuntu和MacOSX上读/写任何内容。我制作的第二张SD卡也有一个FAT32分区主引导记录,类型为W95 FAT32(LBA)(0X0c),但我无法从Ubuntu(但在/ dev / sdb下看到)和MacOSX上安装它。最后一个,是带有u-boot的那个。真奇怪!只是为了解决这个问题,我只是有了一个想法,所以我可以继续工作,我只是尝试使用“u-boot SD-Card”启动,然后,我改变了SD卡“现场”为4文件。我使用命令“sdfuse”将u-boot,内核,android等闪存到我的NANDFLASH设备。然后,当我强制从NAND重启时,它会启动到Android。开发是可以的,但这对于生产过程来说太复杂了。当他指向文件系统分区或结构时,Chris Stratton可能是正确的。我只是没弄明白。有人有一些线索吗?
从Ubuntu终端“dmesg | tail”运行后,我得到以下结果:
dmesg | tail
[5871490.553791] sd 16:0:0:0: [sdb] 7829504 512-byte logical blocks: (4.00 GB/3.73 GiB)
[5871490.556190] sd 16:0:0:0: [sdb] Write Protect is off
[5871490.556197] sd 16:0:0:0: [sdb] Mode Sense: 03 00 00 00
[5871490.556201] sd 16:0:0:0: [sdb] Assuming drive cache: write through
[5871490.559054] sd 16:0:0:0: [sdb] Assuming drive cache: write through
[5871490.559064] sdb: sdb1
[5871490.563912] sd 16:0:0:0: [sdb] Assuming drive cache: write through
[5871490.563920] sd 16:0:0:0: [sdb] Attached SCSI removable disk
[5872079.044194] FAT: bogus number of reserved sectors
[5872079.044201] VFS: Can't find a valid FAT filesystem on dev sdb1.
所以,即使卡片启动并且看到格式有W95 FAT32(LBA)(0x0c)
,看起来格式有问题 的评论后编辑以下是我创建“u-boot”可启动映像磁盘的方法。我运行由三星创建的脚本(在我的Ubuntu机器上)。以下是脚本内容:
#
# Copyright (C) 2010 Samsung Electronics Co., Ltd.
# http://www.samsung.com/
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
####################################
reader_type1="/dev/sdb"
reader_type2="/dev/mmcblk0"
if [ -z $1 ]
then
echo "usage: ./sd_fusing.sh <SD Reader's device file>"
exit 0
fi
if [ $1 = $reader_type1 ]
then
partition1="$11"
partition2="$12"
partition3="$13"
partition4="$14"
elif [ $1 = $reader_type2 ]
then
partition1="$1p1"
partition2="$1p2"
partition3="$1p3"
partition4="$1p4"
else
echo "Unsupported SD reader"
exit 0
fi
if [ -b $1 ]
then
echo "$1 reader is identified."
else
echo "$1 is NOT identified."
exit 0
fi
####################################
# make partition
echo "make sd card partition"
echo "./sd_fdisk $1"
./sd_fdisk $1
dd iflag=dsync oflag=dsync if=sd_mbr.dat of=$1
rm sd_mbr.dat
####################################
# format
umount $partition1 2> /dev/null
umount $partition2 2> /dev/null
umount $partition3 2> /dev/null
umount $partition4 2> /dev/null
echo "mkfs.vfat -F 32 $partition1"
mkfs.vfat -F 32 $partition1
#echo "mkfs.ext2 $partition2"
#mkfs.ext2 $partition2
#echo "mkfs.ext2 $partition3"
#mkfs.ext2 $partition3
#echo "mkfs.ext2 $partition4"
#mkfs.ext2 $partition4
####################################
# mount
#umount /media/sd 2> /dev/null
#mkdir -p /media/sd
#echo "mount -t vfat $partition1 /media/sd"
#mount -t vfat $partition1 /media/sd
####################################
#<BL1 fusing>
bl1_position=1
uboot_position=49
echo "BL1 fusing"
./mkbl1 ../u-boot.bin SD-bl1-8k.bin 8192
dd iflag=dsync oflag=dsync if=SD-bl1-8k.bin of=$1 seek=$bl1_position
rm SD-bl1-8k.bin
####################################
#<u-boot fusing>
echo "u-boot fusing"
dd iflag=dsync oflag=dsync if=../u-boot.bin of=$1 seek=$uboot_position
####################################
#<Message Display>
echo "U-boot image is fused successfully."
echo "Eject SD card and insert it again."
此外,您可以看到调用函数“sd_fdisk”。我有源代码,但它也在Google代码上:sd_fdisk.c