sd-writer为什么选择210可以6410苹果6s sd卡不可以用

1625人阅读
Embeded(29)
C/C++(54)
Hardware(20)
&& 转自:http://blog.csdn.net/turui/article/details/6634461
&& &前章我们也大致分析了SD卡的启动过程,在具体进行问题的定位及解决的过程中,发现还是有很多不明确的地方,网上的文章也多是人云亦云让我们来一步一步搞清楚S3C6410 SD卡启动的步骤及过程(我这里的开发板为OKM+1G的配置,SD卡为2G,MMC)
一、开发板跳线,从SD卡启动
iROM supports initial boot up,initialize system clock,D-TCM,device specific controller and bootin device.
iROM boot codes can load 4KB of bootloader to stepping stone. The 8KB boot loader is called BL1
BL1: BL1 can initialize system clock, UART, and SDRAM for user. After initializing, BL1 will load remaining boot loader which is called BL2 on the SDRAM
Finally, jump to start address of BL2. That will make good environment to use system.
按照这个启动过程,我们必须准备好8K的引导代码在BL1,
用来初始化系统,始终,串口,SDRAM等,并且将完整的BootLoader放在BL2上
2.7 Boot Block Assignment Guide 中有详细的描述
2G以下 SD/MMC 的卡的存储结构
SD/MMC 1Block = 512 Byte
=========================================================================================
SD/MMC Device
=========================================================================================
| Recommendation |
| User File System |=====================================================================
| Kernel |
| Signature(512Byte) | Reserved(512Byte) |
| 16 Block |
=========================================================================================
有了这个大致的印象,我们先放一下,下面我们来修改UBOOT的代码
二、修改UBOOT代码
s3c6410的uboot源码见最后的参考资料
修改makefile 交叉工具链的绝对路径(嘿嘿,这个交叉工具链当然是俺自己做的交叉工具链了,参考前面篇BLOG)
ifeq ($(ARCH),arm)
CROSS_COMPILE = arm-none-linux-gnueabi-
CROSS_COMPILE = /opt/cross_toolchains/arm/4.6.1/bin/arm-none-linux-gnueabi-
修改 include/configs/smdk6410.h 打开 #define CONFIG_BOOT_MOVINAND 这个宏,并屏蔽其他的启动选项
在UBOOT的代码中,将IROM的启动模式称之为MOVINAND
这个UBOOT就已经可以从SD卡启动了,S3C6410具体又是怎么工作的呢?
分析 movi_bl2_copy 函数
cpu/s3c64xx/movi.c&中&void&movi_bl2_copy(void)&中定义如下
#if defined(CONFIG_S3C6400)
CopyMovitoMem(MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, CONFIG_SYS_CLK_FREQ, MOVI_INIT_REQUIRED);
writel(readl(HM_CONTROL4) | (0x3 && 16), HM_CONTROL4);
CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, MOVI_INIT_REQUIRED);
确定MOVI_BL2_POS的值
./include/movi.h:#define MOVI_BL2_POS
(MOVI_LAST_BLKPOS - MOVI_BL1_BLKCNT - MOVI_BL2_BLKCNT - MOVI_ENV_BLKCNT)
./include/movi.h:#define MOVI_LAST_BLKPOS (MOVI_TOTAL_BLKCNT - (eFUSE_SIZE / MOVI_BLKSIZE))
./include/movi.h:#define MOVI_BL1_BLKCNT
(SS_SIZE / MOVI_BLKSIZE)
./include/movi.h:#define MOVI_BL2_BLKCNT
(((PART_ZIMAGE_OFFSET - PART_UBOOT_OFFSET) / MOVI_BLKSIZE) - MOVI_ENV_BLKCNT)
./include/movi.h:#define MOVI_ENV_BLKCNT
(CFG_ENV_SIZE / MOVI_BLKSIZE)
./include/movi.h
#ifdef CONFIG_BOOT_MOVINAND
#define MOVI_TOTAL_BLKCNT
*((volatile unsigned int*)(TCM_BASE - 0x4))
#define MOVI_HIGH_CAPACITY
*((volatile unsigned int*)(TCM_BASE - 0x8))
#define MOVI_TOTAL_BLKCNT
7864320 // 7864320 // 3995648 // 1003520 /* static movinand total block count: for writing to movinand when nand boot */
#define MOVI_HIGH_CAPACITY
./include/movi.h:#define MOVI_BLKSIZE
./include/movi.h
#if defined(CONFIG_S3C6400) || defined(CONFIG_S3C6410) || defined(CONFIG_S3C6430)
#define TCM_BASE
0x0C004000
#define BL2_BASE
0x57E00000
#elif defined(CONFIG_S3C2450) || defined(CONFIG_S3C2416)
#define TCM_BASE
#define BL2_BASE
0x33E00000
# error TCM_BASE or BL2_BASE is not defined
./include/movi.h
#if defined(CONFIG_S3C6400)
#define SS_SIZE
(4 * 1024)
#define eFUSE_SIZE
(2 * 1024)
// 1.5k eFuse, 0.5k reserved
#define SS_SIZE
(8 * 1024)
#define eFUSE_SIZE
(1 * 1024)
// 0.5k eFuse, 0.5k reserved`
./include/movi.h:#define PART_ZIMAGE_OFFSET
./include/movi.h:#define PART_UBOOT_OFFSET
./include/configs/smdk6410.h:#define CFG_ENV_SIZE
/* Total Size of Environment Sector */
确定BL2_BASE的值
./include/movi.h
#if defined(CONFIG_S3C6400) || defined(CONFIG_S3C6410) || defined(CONFIG_S3C6430)
#define TCM_BASE
0x0C004000
#define BL2_BASE
0x57E00000
#elif defined(CONFIG_S3C2450) || defined(CONFIG_S3C2416)
#define TCM_BASE
#define BL2_BASE
0x33E00000
# error TCM_BASE or BL2_BASE is not defined
经过计算我们可以看出,这里决定CopyMovitoMem的功能,是TCM_BASE - 0x4,这个地址的寄存器的值(隐含的也告诉我们UBOOT编译出来之后不得大于256k)
《S3C6410_Internal_ROM_Booting.pdf》中看到
<span style="color:#x0C003FFC globalBlockSizeHide Total block count of the MMC device
这个&#20540;,具体的为,256K(根据打印可以得出,没找到具体的说明)
MOVI_BL2_BLKCNT 的&#20540;为 ( (0x2 - (0x) ) = 512 -32 (个扇区)
网上大多数资料写到CopyMovitoMem是将256k的数据搬运到内存中,从这个计算上我们可以看出实际这个结论是错的
在这里只搬运了 256k-16k的数据到内存
在MOVI_BL2_POS的定义中做了相应的处理,以保证位置的正确性
编译uboot,生成u-boot.bin
make smdk6410_config
三、将修改好的UBOOT烧录到SD卡中
为什么要用到下面的脚本,请参考:
生成的uboot-bin是不是直接可以烧录到SD卡中呢?
有现成的工具IROM_Fusing_Tool.exe(开源的,可以找到源代码),但这个工具烧录的是nb0文件
实际上nb0文件的结构是:256k&#43;8k 这样的一个形式,在Linux系统可以通过下面这个脚本来生成nb0文件
rm -rf temp x* u-boot_256k.bin u-boot_8k.bin u-boot_mmc.nb0
cat u-boot.bin && temp
cat u-boot.bin && temp
split -b 256k temp
mv xaa u-boot_256k.bin
split -b 8k u-boot.bin
mv xaa u-boot_8k.bin
cat u-boot_256k.bin & u-boot_mmc.nb0
cat u-boot_8k.bin && u-boot_mmc.nb0
我想直接将uboot-bin烧录到SD卡中,使用脚本太麻烦,于是我打算自己写一个烧录工具,关键代码如下
需要说明的是,我这里使用的是VC6,WINDOWS XP,VC6对磁盘IO的操作本身支持并不是非常好,有很多扩展的定义,功能都无法使用,这里很多都我手工添加进去的
如果使用的是VC2003及以上版本,会简单一些
DWORD CSC6410BootLoaderWriterDlg::BlockDataRead(char cPart,DWORD dwBlockIndex,DWORD dwReadCount,BYTE* pBuffer)
CString devN
devName.Format(&\\\\.\\%c:&,cPart);
HANDLE hDevice = CreateFile(devName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,0,NULL);
DWORD dwFilePointer = SetFilePointer(hDevice,dwBlockIndex*512, 0,FILE_BEGIN);
DWORD dwBytesRead = 0;
BOOL bRead = ReadFile(hDevice,pBuffer,dwReadCount,&dwBytesRead,NULL);
if(bRead == FALSE)
DWORD dwError = GetLastError();
CloseHandle(hDevice);
return dwBytesR
DWORD CSC6410BootLoaderWriterDlg::BlockDataWrite(ULONG nPhysicalDriveNumber,DWORD dwBlockIndex,BYTE* pData,DWORD dwDataLen)
if( (dwDataLen % 512) != 0 ) dwDataLen = ( (dwDataLen / 512) + 1 ) * 512;
CString devN
devName.Format(&\\\\.\\PhysicalDrive%d&,nPhysicalDriveNumber);
HANDLE hDevice = CreateFile(devName,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
DWORD dwFilePointer = SetFilePointer(hDevice,dwBlockIndex*512, 0,FILE_BEGIN);
DWORD dwBytesWrite = 0;
BOOL bWrite = WriteFile(hDevice,pData,dwDataLen,&dwBytesWrite,NULL);
if(bWrite == FALSE)
DWORD dwError = GetLastError();
CloseHandle(hDevice);
return dwBytesW
看到区别了吗?这里要非常非常注意!
Write函数中devName的构建形式与Read函数中的不一样,这个问题让我调试了很久,如果在Write函数中使用Read函数的构建形式,则会遇到WriteFile工作不正常的现象
具体为:在操作最后若干个扇区时,bWrite 等于 TRUE,dwBytesWrite却为0(为什么?还没能深究下去)
另外,如果要写入的数据长度不是512的整数倍,一定要进行处理,否则会引起GetLastError是87,参数错误
因为所有的FLASH,最小的扇区时512字节,则最少要以512个字节作为一次操作单位
(文件系统帮我们解决了这些问题,我们现在是对磁盘裸的操作,所以不能按照有文件系统的想法来考虑这个问题)
下面是Write函数构造devName时需要用到的函数
ULONG CSC6410BootLoaderWriterDlg::GetPhysicalDriveNumber(char cPart)
typedef struct _DISK_EXTENT {
LARGE_INTEGER StartingO
LARGE_INTEGER ExtentL
} DISK_EXTENT, *PDISK_EXTENT;
typedef struct _VOLUME_DISK_EXTENTS {
NumberOfDiskE
DISK_EXTENT Extents[ANYSIZE_ARRAY];
} VOLUME_DISK_EXTENTS, *PVOLUME_DISK_EXTENTS;
#define VOLUMEDISKSIZE (sizeof(VOLUME_DISK_EXTENTS))
#define IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS 5636096
CString devN
devName.Format(&\\\\.\\%c:&,cPart);
HANDLE hDevice = CreateFile(devName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL );
VOLUME_DISK_EXTENTS volumeD
DWORD dwOut = 0;
DeviceIoControl( hDevice, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS,NULL, 0, &volumeData, VOLUMEDISKSIZE, &dwOut, NULL );
CloseHandle( hDevice );
return volumeData.Extents[0].DiskN
下面这段代码是用来获得,所有插入的U盘(可移动磁盘,注意下面的判断)的盘符
void CSC6410BootLoaderWriterDlg::OnButtonGetdriverinfo()
// TODO: Add your control notification handler code here
// 获取所有的盘符
m_cbList.ResetContent();
DWORD dwStrLen = GetLogicalDriveStrings(0,NULL);
char* pString = new char[dwStrLen+1];
memset(pString,0,dwStrLen+1);
GetLogicalDriveStrings(dwStrLen+1,pString);
char *pNow = pS
while(TRUE)
if(pNow &= (pString+dwStrLen-1))
DWORD dwRet = GetDriveType(pNow);
if(dwRet == DRIVE_REMOVABLE)
m_cbList.InsertString(0,pNow);
pNow += strlen(pNow);
delete[] pS
m_cbList.SetCurSel(0);
m_cbList.SetFocus();
WriteLog(&U盘检查完成&);
最后是写入代码,在这里我们会要求SD卡首先会被各式化成FAT32各式,以便我们能去读取FTA32文件分配表中MBR的部分
void CSC6410BootLoaderWriterDlg::OnButtonOp()
// TODO: Add your control notification handler code here
int nCurSel = m_cbList.GetCurSel();
if(nCurSel == -1)
MessageBox(&探测磁盘信息&);
CString strBootFileP
m_eBootFilePath.GetWindowText(strBootFilePath);
if(strBootFilePath == &&)
MessageBox(&请先选择需要烧录的引导文件&);
// 获得驱动器盘符
CString strT
m_cbList.GetLBText(m_cbList.GetCurSel(),strText);
char cPart = strText[0];
// 获得 PhysicalDriveNumber
ULONG nPhysicalDriveNumber = GetPhysicalDriveNumber(cPart);
// 读取 0 扇区 mbr
BYTE szMbr[512];
memset(szMbr,0,sizeof(szMbr));
DWORD dwReturn = BlockDataRead(cPart,0,sizeof(szMbr),szMbr);
if(dwReturn != sizeof(szMbr))
MessageBox(&Read MBR error.&,&错误&,MB_OK|MB_ICONERROR);
CString strL
strLog.Format(&读取MBR成功&);
WriteLog(strLog);
// 判断是否为 fat32
// FAT16 为 0x36 0x37 0x38 0x39 0x3a 0x3b
char szFs[6];
szFs[0] = szMbr[0x52];
szFs[1] = szMbr[0x53];
szFs[2] = szMbr[0x54];
szFs[3] = szMbr[0x55];
szFs[4] = szMbr[0x56];
szFs[5] = '\0';
if ( strcmp(szFs,&FAT32&) != 0)
MessageBox(&请将SD卡格式化为FAT32文件系统&,&错误&,MB_OK|MB_ICONINFORMATION);
// 获得磁盘的扇区总数
本分区隐含扇区数
该盘实际使用扇区数(不包括隐含扇区)
DWORD count_block_hidden = 0;
memcpy(&count_block_hidden,&szMbr[0x1c],sizeof(count_block_hidden));
DWORD count_block = 0;
memcpy(&count_block,&szMbr[0x20],sizeof(count_block));
DWORD count_block_total = count_block_hidden + count_
// 另一种方法 获得 扇区总数
// #define IOCTL_DISK_GET_DRIVE_GEOMETRY_EX 458912
struct _DISK_GEOMETRY_EX
DISK_GEOMETRY
LARGE_INTEGER
// } DiskEX;
// DeviceIoControl(hDevice,IOCTL_DISK_GET_DRIVE_GEOMETRY_EX,NULL,0,(LPVOID)&DiskEX,sizeof(DiskEX),(LPDWORD)&bytesReturned,NULL);
// 读取 u-boot.bin 文件
// 最大 256k
#define MOVI_TOTAL_BLKCNT 0x40000
BYTE buffer_utoot[MOVI_TOTAL_BLKCNT];
memset(buffer_utoot,0,sizeof(buffer_utoot));
cf.Open(strBootFilePath,CFile::modeRead);
DWORD uboot_size = min(MOVI_TOTAL_BLKCNT,cf.GetLength());
cf.Read(buffer_utoot,uboot_size);
cf.Close();
// 将引导程序 uboot-bin 写入相应的位置
DWORD bl2_begin = count_block_total-1-1-16-512;
DWORD bl1_begin = count_block_total-1-1-16;
dwReturn = BlockDataWrite(nPhysicalDriveNumber,bl1_begin,buffer_utoot,8192);
if(dwReturn != 8192)
MessageBox(&写入引导8k字节失败&);
CString strL
strLog.Format(&写入引导8k字节成功&);
WriteLog(strLog);
dwReturn = BlockDataWrite(nPhysicalDriveNumber,bl2_begin,buffer_utoot,uboot_size);
if(dwReturn & uboot_size)
MessageBox(&写入引导失败&);
CString strL
strLog.Format(&引导文件写入完成,磁盘总扇区数:%d&,count_block_total);
WriteLog(strLog);
到这里,我们就可以完全分析清楚,并可以自主的制作一个S3C6410的启动SD卡了,附后为一些参考资料,这里没办法贴附件,问题给我留言吧
后面的内容中,我们将进入UBOOT,对UBOOT进行修改,请关注下一节《如何计算内存大小,并在UBOOT中调整内存大小》
四、参考资料
下载 uboot1.1.6 (支持 movinand)
使uboot支持S3C6410的SD启动
《S3C6410_Internal_ROM_Booting.pdf》
《s3c6410_rev12.pdf》
《smdk6410_users_manual_rev1.0.pdf》
《K4X51163PC.pdf》
《OK6410开发板LINUX2.6用户手册.pdf》
《OK6410开发板硬件手册2.1.pdf》
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:294301次
积分:4253
积分:4253
排名:第5250名
原创:123篇
转载:126篇
评论:40条
(1)(2)(1)(2)(3)(2)(3)(3)(2)(6)(6)(9)(7)(6)(1)(3)(4)(3)(1)(3)(13)(5)(8)(13)(1)(19)(3)(3)(14)(31)(3)(9)(6)(8)(18)(9)(5)(2)(2)(2)(6)(2)2692人阅读
几个月前买了一块tiny6410的开发板,因为自己有很多SD卡,当时没有再买。哪知买回来自己的SD卡竟然无法识别,插进去一点反应都没有。无奈再买了一块。
在几天前,自己做的另一个项目中,偶然发现了这个问题的原因。
首先,启动开发板,cd /dev/;然后ls。发现其中的猫腻。
这是没有识别的SD卡。其中只有一个mmcblk0。而识别的SD卡是这样的
发现多了一个mmcblk0p1,百度知道这是SD卡的第一个分区,p1即partition 1的意思。
然后我尝试将mmcblk0 mount到sdcard目录下,发现竟然能够看得到里面的文件。那为什么不能够自动挂载呢。
我们知道busybox是通过mdev来实现设备的动态更新的。
当内核支持hotplug的时候,每当有新的设备插入,或者有设备移除,mdev就会查找mdev.config文件,按照这个文件执行相应的操作。
于是我查看了tiny6410的mdev.config。其中有这么一行
可见只有mmcblk0p1才会被自动挂载,而没有的SD卡是不会挂载的。我们可以把此处改为mmcblk0。
当然这样并不是很好的解决办法。
那怎样生成p1分区呢。&#26684;式化?经过我的屡次测试。Win下的&#26684;式化是不会生成这个分区的。
我采用的是在Linux下通过fdisk进行&#26684;式化,当然还有其他的方法,有兴趣的可以百度之。
首先将SD卡插入PC机,并连接到虚拟机上。
然后在虚拟机的/dev目录下查找我们这个设备的节点。
我的是通过USB读卡器,所以是sdb,如果是通过笔记本的读卡器的话是不一样的。这点可以通过mount指令查看
然后输入指令:fdisk sdb
[root@zyt dev]# fdisk sdb
Command (m for help): m
Command action
&& a&&toggle a bootable flag
&& b&&edit bsd disklabel
&& c&&toggle the dos compatibility flag
&& d&&delete a partition
&& l&&list known partition types
&& m&&print this menu
&& n&&add a new partition
&& o&&create a new empty DOS partition table
&& p&&print the partition table
&& q&&quit without saving changes
&& s&&create a new empty Sun disklabel
&& t&&change a partition's system id
&& u&&change display/entry units
&& v&&verify the partition table
&& w&&write table to disk and exit
&& x&&extra functionality (experts only)
Command (m for help): p
输入p,查看分区情况
Disk sdb: 4023 MB,
124 heads, 62 sectors/track, 1022 cylinders, total 7858176 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6f20736b
This doesn't look like a partition table
Probably you selected the wrong device.
Device Boot&&&&& Start&&&&&&&&End&&&&&Blocks&&Id&
& sdb1&&?&&&
&&&#43;&72&
& sdb2&&?&&&
Novell Netware 386
& sdb3&&?&&
& sdb4&&?&&
&&&&&&27749&#43;&&d&Unknown
这里我们看到有四个分区。将它们都删除
Command (m for help): d
Partition number (1-4): 1
Command (m for help): d
Partition number (1-4): 2
Command (m for help): d
Partition number (1-4): 3
Command (m for help): d
Selected partition 4
Command (m for help): d
No partition is defined yet!
然后新建分区
Command (m for help): n输入n,新建分区
Command action
&& e&&extended
&& p&&primary partition (1-4)
p 选择基本分区
Partition number (1-4, default 1): 1分区号1
First sector (, default 2048): 2048
Last sector, &#43;sectors or &#43;size{K,M,G} (, default 7858175): 如果你只需要一个分区的话,此处和上一行处都按默认的即可
Using default value 7858175
Command (m for help): p
然后查看下现在的分区
Disk sdb: 4023 MB,
124 heads, 62 sectors/track, 1022 cylinders, total 7858176 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x6f20736b
Device Boot&&&&& Start&&&&&&&&End&&&&&
Blocks&&Id&System
& sdb1&&&&&&&&&&&2048&&&&
7858175&&&&3928064&&83&
Linux只有一个分区
Command (m for help): t然后指定文件系统的类型
Selected partition 1
Hex code (type L to list codes): 1
Changed system type of partition 1 to 1 (FAT12)
Command (m for help): l
&0&Empty&&&&&&&&&&24&
NEC DOS&&&&&&&&81&Minix / old Lin bf&Solaris&&&&&&&
&1&FAT12&&&&&&&&&&39&
Plan 9&&&&&&&&&82&Linux swap / So c1&DRDOS/sec(FAT-
&2&XENIX root&&&&&3c&PartitionMagic&83&
Linux&&&&&&&&&&c4&DRDOS/sec (FAT-
&3&XENIX usr&&&&&&40&
Venix 80286&&&&84&OS/2 hidden C:&c6&
DRDOS/sec (FAT-
&4&FAT16 &32M&&&&&41&PPC PReP Boot&&85&
Linux extended&c7&Syrinx&&&&&&&&
&5&Extended&&&&&&&42&
SFS&&&&&&&&&&&&86&NTFS volume set da&Non-FS data&&&
&6&FAT16&&&&&&&&&&4d&
QNX4.x&&&&&&&&&87&NTFS volume set db&CP/M / CTOS /.
&7&HPFS/NTFS&&&&&&4e&
QNX4.x 2nd part 88&Linux plaintext de&
Dell Utility&&
&8&AIX&&&&&&&&&&&&4f&QNX4.x 3rd part 8e&Linux
LVM&&&&&& df&BootIt&&&&&&&&
&9&AIX bootable&&&50&
OnTrack DM&&&&&93&Amoeba&&&&&&&&&e1&
DOS access&&&&
&a&OS/2 Boot Manag 51&OnTrack DM6Aux 94&
Amoeba BBT&&&&& e3&DOS R/O&&&&&&&
&b&W95 FAT32&&&&&&52&
CP/M&&&&&&&&&&&9f&
BSD/OS&&&&&&&&&e4&SpeedStor&&&&&
&c&W95 FAT32 (LBA) 53&OnTrack DM6Aux a0&
IBM Thinkpad hi eb&
BeOS fs&&&&&&&
&e&W95 FAT16 (LBA) 54&OnTrackDM6&&&&&
a5&FreeBSD&&&&&&&&
ee&GPT&&&&&&&&&&&
&f&W95 Ext'd (LBA) 55&EZ-Drive&&&&&&&
a6&OpenBSD&&&&&&&&ef&
EFI (FAT-12/16/
10& OPUS&&&&&&&&&&&56&Golden Bow&&&&&a7&
NeXTSTEP&&&&&&&f0&Linux/PA-RISC b
11& Hidden FAT12&&&5c&
Priam Edisk&&&&a8&Darwin UFS&&&&&f1&
SpeedStor&&&&&
12& Compaq diagnost 61&SpeedStor&&&&&&
a9&NetBSD&&&&&&&&&f4&
SpeedStor&&&&&
14& Hidden FAT16 &3 63&GNU HURD or Sys ab&
Darwin boot&&&&f2&DOS secondary&
16& Hidden FAT16&&&64&Novell Netware&af&
HFS / HFS&#43;&&&&&fb&VMware VMFS&&&
17& Hidden HPFS/NTF 65&Novell Netware&
b7&BSDI fs&&&&&&&&fc&
VMware VMKCORE
18& AST SmartSleep&70&DiskSecure Mult b8&BSDI
swap&&&&&& fd&Linux raid auto
1b& Hidden W95 FAT3 75&PC/IX&&&&&&&&&&
bb&Boot Wizard hid fe&LANstep&&&&&&&
1c& Hidden W95 FAT3 80&Old Minix&&&&&&
be&Solaris boot&&&ff&
BBT&&&&&&&&&&&
1e& Hidden W95 FAT1
Command (m for help): 6
我选的是FAT16。
最后保存设置结果。
Command (m for help): w
自此mmcblk0p1就有了。
如果FAT16不方便的话,也可以在Win下&#26684;式化成FAT32的,Win下&#26684;式化是不会消掉这个分区的。
这是一个非常好的消息,以后&#26684;式化后就不必这样频繁的操作 了。
当然,如果你用winhex往SD卡烧写uboot后就不行了,&#26684;式化后要重新操作一遍。友善提供的uboot的烧写器是不会有这样问题的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5486次
排名:千里之外ok6410一键烧写linux过程及注意事项
ok6410linux
2GSDok6410XP
winceLinuxlinuxlinux
winceeboot
打开sd_writer.exe
软件,点击scan按钮,SD
Volume会出现你的SD卡的盘符,如果有多个SD卡,你需要手动选择一个座位启动卡
点击Select
Boot在你的文件中选择mmc.bin,(在你的文件里可能会有多个类似于MMC.bin
的文件,像mmc_ram128.bin和mmc_ram256.bin,像这种情况你就需要选择和你的板子匹配的)
ProgrameIt`s ok
&&&&U-boot.binzImagerootfs.yaffs2SD128M DDR256DDRU-boot_128ram.binU-boot_256ram.binSDU-boot.binroots.yaffs2SDzImage
SD080-0-0-1-1-1-1-1SD
UsbDNW.exe
Configuration optionBaud
Rate设为115200,Com
Port设为你所连接的电脑的串口端口号(一般为Com1),Download Address设为0x.
DnwExeserial Portconnect
DNW.exeoptionsCom1com2
com1com1com2Com1.
256M ddr128M
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。OK6410平台下UBOOT的移植(三) uboot 2012.10编译配置 - ARM系统 - 次元立方网 - 电脑知识与技术互动交流平台
OK6410平台下UBOOT的移植(三) uboot 2012.10编译配置
1.安装交叉编译器
这里选择一个比较新的版本:ARM-Linux-gcc 4.5.1
在/usr/local目录下新建一个目录arm,把4.5.1版本拷贝到这里。
然后设置环境变量:在/root/.bashrc文件最后一行添加如下内容:
export PATH=$PATH:/usr/local/arm/4.5.1/bin
保存后注销系统,重新登录后可以用export命令查看是否生效:
root@ubuntu:/# export
declare -x PATH=&/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/4.5.1/bin&
可以看到设置有效,接下来可以试一下编译Uboot.
2.初试Uboot编译
&先做个简单的编译试一下前面安装的交叉编译器是否能用。
&& 2.1.把U-boot-2012.10版本解压到/Home/my/smdk6410目录下,
&& 2.2.修改U-boot-2012.10目录下的Makefile文件
在CROSS_COMPILE ?=这里上面增加两行:
CROSS_COMPILE =/usr/local/arm/4.5.1/bin/arm-linux-
export CROSS_COMPILE
保存后编译:
& root@ubuntu:/home/my/smdk6410/u-boot-2012.10# make clean
这时如果没有提示出错的话说明交叉编译器安装成功了,接下来:
& root@ubuntu:/home/my/smdk6410/u-boot-2012.10# make smdk6400_config
& root@ubuntu:/home/my/smdk6410/u-boot-2012.10# make
3.Uboot移植到smdk6410上
& 因为是板级移植,所以我们先复制一份SMDK6400改为smdk6410。
&3.1.需要拷贝的文件&目录有:
&&& 3.1.1.拷贝board/samsung/smdk6400 到board/samsung/smdk6410
&&& 3.1.2.拷贝nand_spl/board/samsung/smdk6400 到 nand_spl/board/samsung/smdk6410
&&& 3.1.3.拷贝include/configs/smdk6400.h 到include/configs/smdk6410.h
&&& 3.1.4.拷贝include/asm/arch/s3c6400.h 为 include/asm/arch/s3c6410.h
& 3.2.需要更改名称的文件有:
&&& 3.2.1.更改board/samsung/smdk6410目录下smdk6400.c 为smdk6410.c ,
&&& 3.2.2.更改smdk6400_nand_spl.c为smdk6410_nand_spl.c
&&& 3.2.3.更改nand_spl/board/samsung/smdk6410目录下smdk6400_nand_spl.c为smdk6410_nand_spl.c
&3.3.需要修改内容的文件有:
& 3.3.1. board/samsung/smdk6410/Makefile
& 把其中有SMDK6400的相关字符换成smdk6410
&& 3.3.2. nand_spl/board/samsung/smdk6410/Makefile
& 把其中有SMDK6400的相关字符换成smdk6410
&& 3.3.3. u-boot-2011.12目录下Makefile
& 找到ARM1176 Systems部分,把smdk6400都换成smdk6410
&& 3.3.4. 把所有#include &asm/arch/s3c6400.h&都改为#include &asm/arch/s3c6410.h&
&& 3.3.5. arch/arm/cpu/armxx/Makefile
把COBJS-$(CONFIG_S3C6400)改为COBJS-$(CONFIG_S3C6410)
&& 3.3.6. include/configs/smdk6410.h
把#define CONFIG_S3C6400 1 改为 #define CONFIG_S3C6410 1
把#define CONFIG_SMDK6400 1 改为 #define CONFIG_SMDK6410 1
好了,在u-boot-2011.12目录下
& make smdk6410_config
编译通过,说明复制成功了,但这时的u-boot还是SMDK6400的,所以我们还要修改,才能在OK6410板上运行起来。
4.配置板上资源使uboot能够在板上运行。
&& 这里说的运行指的是下载到SDRAM后能够跑起来。
&& 4.1.修改/include/configs/smdk6410.h
&&&&&&&& 4.1.1 #define CONFIG_S3C6410&&&&&&& 1&&& /* in a SAMSUNG S3C6400 SoC */
&&&&&&&& 4.1.2 #define CONFIG_SMDK6410&&&& 1&&& /* on a SAMSUNG SMDK6400 Board */&&
&&&&&&&& 4.1.3 #define CONFIG_SYS_PROMPT &SMDK6410 # & /* Monitor Command Prompt */
&&&&&&&& 4.1.4#define CONFIG_NR_DRAM_BANKS 2 //2个128M的chip
&&&&&&&& 4.1.5#define PHYS_SDRAM_1 CONFIG_SYS_SDRAM_BASE /* SDRAM Bank #1 */
&&&&&&&& 4.1.6#define PHYS_SDRAM_1_SIZE 0x /* 128 MB in Bank #1 */
&&&&&&& //zxd--&
&&&&&&&& 4.1.7#define PHYS_SDRAM_2 (CONFIG_SYS_SDRAM_BASE+PHYS_SDRAM_1_SIZE)/* SDRAM Bank #1 */
&&&&&&&& 4.1.8#define PHYS_SDRAM_2_SIZE 0x /* 128 MB in Bank #1 */
&&&&&&& //&--
&这里4.1.4到4.1.8暂时不修改也可以,但运行后显示SDRAM 128M。或者把4.1.6中的0x改为0x再配合后面的修改也可以显示256M的SDRAM。
&&&&&&&& 4.1.9#define CONFIG_IDENT_STRING&&& & for SMDK6410&
&&&&&&&& 4.1.10#define CONFIG_SYS_NAND_PAGE_SIZE
&&&&&&&& 4.1.11#define CONFIG_SYS_NAND_BLOCK_SIZE (512 * 1024)//128
&&&&&&&& 4.1.12#define CONFIG_SYS_NAND_PAGE_COUNT 128//64。
这里4.1.10到4.1.12暂时不修改也可以,改它是为了后面NAND驱动的都写都能正常
& 4.2.修改/board/samsung/smdk6410/lowlevel_init.S
&&&&&&&& 4.2.1修改LED显示
&&&&&&&&&&&&&&&&&& /* LED on only #8 */
&&&&&&&&&&&&&&&&&&&&&&& ldr r0, =ELFIN_GPIO_BASE
&&&&&&&&&&&&&&&&&&&&&&& ldr r1, =0x
&&&&&&&&&&&&&&&&&&&&&&& str r1, [r0, #GPMCON_OFFSET]
&&&&&&&&&&&&&&&&&&&&&&& ldr r1, =0x
&&&&&&&&&&&&&&&&&&&&&&& str r1, [r0, #GPMPUD_OFFSET]
&&&&&&&&&&&&&&&&&&&&&&& ldr r1, =0x0027
&&&&&&&&&&&&&&&&&&&&&&& str r1, [r0, #GPMDAT_OFFSET]
&&&&&&& 4.2.2修改这段This was unconditional in original Samsung sources.......屏蔽掉宏定义
//#ifndef CONFIG_S3C6410
ldr r1, [r0, #OTHERS_OFFSET]
bic r1, r1, #0xC0
orr r1, r1, #0x40
str r1, [r0, #OTHERS_OFFSET]
wait_for_async:
ldr r1, [r0, #OTHERS_OFFSET]
and r1, r1, #0xf00
cmp r1, #0x0
bne wait_for_async
&&&&&&&& 4.2.3修改这句
#elif !defined(CONFIG_S3C6400)为
#elif !defined(CONFIG_S3C6410)
/* According to 661558um_S3C6400X_rev10.pdf 0x20 is reserved */
&&&&&&&&& 4.2.4要想正确显示SDRAM大小,除了上面4.1.6外还要在这里修改MMU关于内存这部分:
/* 128MB for SDRAM 0xC0000000 -& 0x */
.set __base, 0x500
.rept 0xD00 - 0xC00&&& //.rept 0xc80 - 0xC00
FL_SECTION_ENTRY __base, 3, 0, 1, 1
.set __base, __base + 1
/* access is not allowed. */
.rept 0x1000 - 0xD00& //.rept 0x1000 - 0xc80
5.下载uboot到SDRAM中运行
&&& 5.1& 先使用IROM_Fusing_Tool.exe把OK6410_SDboot.nb0烧录到SD卡中
&&& 5.2 设置开发板从SD卡启动。打开DNW,设置下载地址为0x57e00000,启动开发板后通过DNW把编译好的u-boot.bin下载到SDRAM中,下载后DNW窗口显示: www.it165.net
U-Boot 2012.10 (Nov 05 2012 - 17:29:28) for SMDK6410
CPU: S3CMHz
Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode)
Board: SMDK6410
DRAM: 256 MiB
然后。。。。。。系统重启了:
跟踪发现board.c(/arch/arm/lib)中有两个函数board_init_f和board_init_r。显示SDRAM: 256 MiB就是在board_init_f函数中实现,而board_init_r会接着初始化FLASH等,查看这个函数发现显示FLASH及NAND大小都是在这个函数中实现。但为什么会没有打印信息而是直接重启了呢?难道系统还没有走到这个board_init_r函数就发生了错误?为了验证这个猜想,在这个board_init_r函数开头弄串字符输出看看,把puts(&I am here! &);这句话放在board_init_r函数的开头,重新编译出现:
U-Boot 2012.10 (Nov 05 2012 - 23:52:29) for SMDK6410
CPU: S3CMHz
Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode)
Board: SMDK6410
DRAM: 256 MiB
I am here! WARNING: Caches not enabled
: *** failed ***
### Error ### Please RESET the Board ###
这说明board_init_r这个函数还是有执行的。后面测试发现无论把puts(&I am here! &);放在board_init_f或board_init_r中都可以输出
。。。。。。
WARNING: Caches not enabled
: *** failed ***
### Error ### Please RESET the Board ###
程序到这里就停住了。
再看看board_init_r函数里到底有什么吧。
。。。。。。。
#if !defined(CONFIG_SYS_NO_FLASH)
puts(&Flash: &);
flash_size = flash_init();
if (flash_size & 0) {
# ifdef CONFIG_SYS_FLASH_CHECKSUM
char *s = getenv(&flashchecksum&);
print_size(flash_size, &&);
* Compute and print flash CRC if flashchecksum is set to &#39;y&#39;
* NOTE: Maybe we should add some WATCHDOG_RESET()? XXX
if (s && (*s == &#39;y&#39;)) {
printf(& CRC: %08X&, crc32(0,
(const unsigned char *) CONFIG_SYS_FLASH_BASE,
flash_size));
putc(&#39;\n&#39;);
# else /* !CONFIG_SYS_FLASH_CHECKSUM */
print_size(flash_size, &\n&);
# endif /* CONFIG_SYS_FLASH_CHECKSUM */
puts(failed);
#if defined(CONFIG_CMD_NAND)
puts(&NAND: &);
nand_init(); /* go init the NAND */
。。。。。。
显然&*** failed ***&就是puts(failed)这个函数干的。而&### Error ### Please RESET the Board ###&又是谁出的主意呢?调查hang()发现:
void hang(void)
puts(&### ERROR ### Please RESET the board ###\n&);
元凶在此,OK6410开发板上并没有这个FLASH,所以先屏蔽掉hang()试试吧,也把测试的那句puts(&I am here! &)去掉,下载后DNW显示如下:
U-Boot 2012.10 (Nov 05 2012 - 23:52:29) for SMDK6410
CPU: S3CMHz
Fclk = 533MHz, Hclk = 133MHz, Pclk = 66MHz (ASYNC Mode)
Board: SMDK6410
DRAM: 256 MiB
WARNING: Caches not enabled
Flash: *** failed ***
NAND: raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
No oob scheme defined for oobsize 218
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: CS8900-0
Hit any key to stop autoboot: 0
NAND read: device 0 offset 0x60000, size 0x1c0000
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
raise: Signal # 8 caught
。。。。。(后面是不停地打印raise: Signal # 8 caught)。
OK,关于&Signal # 8 caught&的问题后面再解决,但怎么也想不明白屏蔽hang()之前加上测试
puts(&I am here! &)就可以让程序正常的运行呢?
元芳,你怎么看?
延伸阅读:
受朋友所托,调试一款GPS模块,该模块是UBLOX的NEO-6...
本教程为 李华明 编著的iOS-Cocos2d游戏开发系列教程:教程涵盖关于i......
专题主要学习DirectX的初级编程入门学习,对Directx11的入门及初学者有......
&面向对象的JavaScript&这一说法多少有些冗余,因为JavaScript 语言本......
Windows7系统专题 无论是升级操作系统、资料备份、加强资料的安全及管......

我要回帖

更多关于 sd卡不可以用 的文章

 

随机推荐