2

语境:

我设计了一个嵌入式系统,并移植了 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

4

0 回答 0