语境:
我设计了一个嵌入式系统,并移植了 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 卡,但都不允许挂载它。显然,我在某个地方漏掉了一些东西。我现在拥有的是一个带有 U-boot 的可引导 4GB FAT32 SD 卡,但该卡的其余部分不再可用。任何人都知道问题可能是什么?为什么我不能使用这个 4GB 可引导 FAT32 分区来安装我的“/sdfuse”文件夹和图像?我使用 Ubuntu 机器创建了可启动的 SD 卡,所以 USB/SD 卡读卡器运行良好,换句话说,问题不在于帽子软件,而在于某种软件配置。
在 Chris Stratton 关于文件系统的评论之后进行编辑:我有一张包含“/sdfuse”的 SD 卡,其中包含 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-Card “live”更改为带有 4 的 SD-Card文件。我使用了命令“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),格式似乎也有问题
根据TheCodeArtist的评论进行 编辑
这是我创建“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”的调用。我有源代码,但它也在谷歌代码上:sd_fdisk.c