一、 支持烧写yaffs文件系统 执行? Nand TQ2440 # ? nand nand - NAND sub-system Usage: …… 没有.yaffs后缀,在源码目录搜索.yaffs pengdl@debian:~/work/tq2440/u-boot-2014.04$ grep "\.yaffs" * -nR ...... common/cmd_nand.c:709: } else if (!strcmp(s, ".yaffs"  ) { ...... 查看代码 708 #ifdef CONFIG_CMD_NAND_YAFFS 709 } else if (!strcmp(s, ".yaffs"  ) { 710 if (read) { 711 printf("Unknown nand command suffix '%s'.\n", s); 712 return 1; 713 } 714 ret = nand_write_skip_bad(nand, off, &rwsize, NULL, 715 maxsize, (u_char *)addr, 716 WITH_YAFFS_OOB); 717 #endif 需要在配置文件tq2440.h中定义CONFIG_CMD_NAND_YAFFS #define CONFIG_CMD_NAND_YAFFS 重新编译,烧写到NandFlash中: TQ2440 # nand ? nand - NAND sub-system Usage: …… nand write.yaffs - addr off|partition size write 'size' bytes starting at offset 'off' with yaffs format from memory address 'addr', skipping bad blocks. …… TQ2440 # 先直接烧写试一下 TQ2440 # tftp 32000000 uImage;nand erase.part kernel; dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:0c:29:2a:5c:a5 operating at 100M full duplex mode Using dm9000 device TFTP from server 192.168.1.8; our IP address is 192.168.1.6 Filename 'uImage'. Load address: 0x32000000 Loading: T ################################################################# ################################################################# ############################ 361.3 KiB/s done Bytes transferred = 2317984 (235ea0 hex) NAND erase.part: mtdparts variable not set, see 'help mtdparts' incorrect device type in kernel TQ2440 # mtdpart default TQ2440 # saveenv Saving Environment to NAND... Erasing NAND... Erasing at 0x40000 -- 100% complete. Writing to NAND... OK TQ2440 # nand erase.part kernel NAND erase.part: device 0 offset 0x200000, size 0x300000 Erasing at 0x4e0000 -- 100% complete. OK TQ2440 # nand write 32000000 kernel 烧写内核 NAND write: device 0 offset 0x200000, size 0x300000 3145728 bytes written: OK TQ2440 # tftp 30000000 root.bin 确保yaffs文件系统是好的 dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:0c:29:2a:5c:a5 operating at 100M full duplex mode Using dm9000 device TFTP from server 192.168.1.8; our IP address is 192.168.1.6 Filename 'root.bin'. Load address: 0x30000000 Loading: T ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ########## 778.3 KiB/s done Bytes transferred = 6825984 (682800 hex) TQ2440 # nand erase.part rootfs TQ2440 # nand write.yaffs 30000000 rootfs $filesize 设置u-boot启动参数 TQ2440 # set bootargs root=/dev/mtdblock2 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200 TQ2440 # set bootcmd nand read 32000000 kernel\;bootm 32000000 TQ2440 # save TQ2440 # reset resetting ... U-Boot 2014.04 (Jun 29 2014 - 08:14:15) CPUID: 32440001 FCLK: 400 MHz HCLK: 100 MHz PCLK: 50 MHz DRAM: 64 MiB WARNING: Caches not enabled Flash: *** failed *** NAND: 256 MiB In: serial Out: serial Err: serial Net: dm9000 Hit any key to stop autoboot: 0 NAND read: device 0 offset 0x200000, size 0x300000 3145728 bytes read: OK ## Booting kernel from Legacy Image at 32000000 ... Image Name: Linux-3.8.7 Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2317920 Bytes = 2.2 MiB Load Address: 30008000 Entry Point: 30008000 Verifying Checksum ... OK Loading Kernel Image ... OK Starting kernel ... Uncompressing Linux... done, booting the kernel. Error: unrecognized/unsupported machine ID (r1 = 0x000000c1). Available machine support: ID (hex) NAME 000000a8 SMDK2440 Please check your kernel config and/or bootloader. 不支持的机器ID 由于我用的是tq2440自带的内核,tq2440的机器ID是168,修改arch/arm/mach-types.h,添加TQ2440的机器ID 两种解决办法: 1、 设置环境变量machid TQ2440 # set machid a8 TQ2440 # save 2、 修改board/tq2440/tq2440.c: board_init函数 gd->bd->bi_arch_number = MACH_TYPE_TQ2440; 解决后重启开发板 resetting ... U-Boot 2014.04 (Jun 29 2014 - 08:14:15) CPUID: 32440001 FCLK: 400 MHz HCLK: 100 MHz PCLK: 50 MHz DRAM: 64 MiB WARNING: Caches not enabled Flash: *** failed *** NAND: 256 MiB In: serial Out: serial Err: serial Net: dm9000 Hit any key to stop autoboot: 0 NAND read: device 0 offset 0x200000, size 0x300000 3145728 bytes read: OK ## Booting kernel from Legacy Image at 32000000 ... Image Name: Linux-2.6.30.4-EmbedSky Image Type: ARM Linux Kernel Image (uncompressed) Data Size: 2415756 Bytes = 2.3 MiB Load Address: 30008000 Entry Point: 30008000 Verifying Checksum ... OK Loading Kernel Image ... OK Using machid 0xa8 from environment Starting kernel ... Uncompressing Linux................................................................................................................................................................ done, booting the kernel. Linux version 2.6.30.4-EmbedSky (pengdl@debian) (gcc version 4.3.3 (Sourcery G++ Lite 2009q1-176) ) #1 Sat Jun 21 02:35:07 EDT 2014 CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177 CPU: VIVT data cache, VIVT instruction cache ................ NET: Registered protocol family 17 RPC: Registered udp transport module. RPC: Registered tcp transport module. lib80211: common routines for IEEE802.11 drivers s3c2410-rtc s3c2410-rtc: setting system clock to 2013-03-03 18:07:17 UTC (1362334037) yaffs: dev is 32505858 name is "mtdblock2" yaffs: passed flags "" yaffs: Attempting MTD mount on 31.2, "mtdblock2" block 325 is bad block 330 is bad block 519 is bad block 1252 is bad block 1753 is bad block 1754 is bad yaffs_read_super: isCheckpointed 0 VFS: Mounted root (yaffs2 filesystem) on device 31:2. Freeing init memory: 240K Warning: unable to open an initial console. Failed to execute /linuxrc. Attempting defaults... Kernel panic - not syncing: No init found. Try passing init= option to kernel. Backtrace: [<c0048fd4>] (dump_backtrace+0x0/0x10c) from [<c036f630>] (dump_stack+0x18/0x1c) r7:00000000 r6:c04e8d40 r5:c04e8700 r4:c04b0248 [<c036f618>] (dump_stack+0x0/0x1c) from [<c036f680>] (panic+0x4c/0x124) [<c036f634>] (panic+0x0/0x124) from [<c00444f0>] (init_post+0xec/0x17  r3:00000000 r2:00000000 r1:c051f000 r0:c043c77c [<c0044404>] (init_post+0x0/0x17  from [<c000847c>] (kernel_init+0xcc/0xf4) r5:c001f860 r4:c001fcc8 [<c00083b0>] (kernel_init+0x0/0xf4) from [<c0059f30>] (do_exit+0x0/0x620) r7:00000000 r6:00000000 r5:00000000 r4:00000000 已经挂载上yaffs2文件系统,因为yaffs文件系统是好的,所以是u-boot烧写yaffs文件系统的问题 YAFFS中,文件是以固定大小的数据块进行存储的,块的大小可以是512字节、1 024字节或者2 048字节。这种实现依赖于它能够将一个数据块头和每个数据块关联起来。每个文件(包括目录)都有一个数据块头与之相对应,数据块头中保存了ECC(Error Correction Code)和文件系统的组织信息,用于错误检测和坏块处理。 TQ2440开发板用的NAND FLASH每页2k 用UltraEdit打开刚才烧写的root.bin文件和烧到NAND FLASH里的数据对比 在u-boot中执行 TQ2440 # nand dump 500000 Page 00500000 dump: 03 00 00 00 01 00 00 00 ff ff 00 00 00 00 00 00 ……………………………………………… ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff OOB: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff aa 9a a7 ff f3 03 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff TQ2440 # 通过对比发现烧到NAND FLASH里的数据和原文件不一致 查看代码common/cmd_nand.c #ifdef CONFIG_CMD_NAND_YAFFS } else if (!strcmp(s, ".yaffs"  ) { if (read) { printf("Unknown nand command suffix '%s'.\n", s); return 1; } ret = nand_write_skip_bad(nand, off, &rwsize, (u_char *)addr, WITH_YAFFS_OOB); #endif 调用函数drivers/mtd/nand/nand_util.c: nand_write_skip_bad,注意这里传入了一个标志WITH_YAFFS_OOB drivers/mtd/nand/nand_util.c:nand_write_skip_bad()函数 if (!need_skip && !(flags & WITH_DROP_FFS)) { rval = nand_write (nand, offset, length, buffer); 这里如果没有坏块而且没有指定WITH_DROP_FFS标志就执行nand_write (nand, offset, length, buffer); 而我们需要执行write_oob(nand, offset, &ops);所以应该加上之前传入的参数 if (!need_skip && !(flags & WITH_DROP_FFS) && !(flags & WITH_YAFFS_OOB)) ops.mode = MTD_OOB_RAW; /* 原来为AUTO,应该为原始 */ 重新编译,烧写新的u-boot.bin,重新烧写yaffs文件系统 TQ2440 # nand erase.part u-boot;tftp 32000000 u-boot.bin;nand write 32000000 u-boot TQ2440 # reset TQ2440 # tftp 0x32000000 root.bin;nand erase.part rootfs;nand write.yaffs 0x32000000 rootfs $filesize dm9000 i/o: 0x20000000, id: 0x90000a46 DM9000: running in 16 bit mode MAC: 00:0c:29:2a:5c:a5 operating at 100M full duplex mode Using dm9000 device TFTP from server 192.168.1.8; our IP address is 192.168.1.6 Filename 'root.bin'. Load address: 0x32000000 Loading: T ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ########## 777.3 KiB/s done Bytes transferred = 6825984 (682800 hex) NAND erase.part: device 0 offset 0x500000, size 0xfb00000 Skipping bad block at 0x02d80000 Skipping bad block at 0x02e20000 Skipping bad block at 0x045c0000 Skipping bad block at 0x0a160000 Skipping bad block at 0x0e000000 Skipping bad block at 0x0e020000 Erasing at 0xffe0000 -- 100% complete. OK NAND write: device 0 offset 0x500000, size 0x682800 6825984 bytes written: OK TQ2440 # reset …… s3c2410-rtc s3c2410-rtc: setting system clock to 2013-03-03 18:11:59 UTC (1362334319) yaffs: dev is 32505858 name is "mtdblock2" yaffs: passed flags "" yaffs: Attempting MTD mount on 31.2, "mtdblock2" block 325 is bad block 330 is bad block 519 is bad block 1252 is bad block 1753 is bad block 1754 is bad yaffs_read_super: isCheckpointed 0 VFS: Mounted root (yaffs2 filesystem) on device 31:2. Freeing init memory: 240K mmc0: new SDHC card at address 1234 mmcblk0: mmc0:1234 SA04G 3.63 GiB mmcblk0: p1 FAT: utf8 is not a recommended IO charset for FAT filesystems, filesystem will be case sensitive! Please press Enter to activate this console. [root@TQ2440 /]# [root@TQ2440 /]#
未完待续。。。。。。
|