u-boot-2012.04.01移植到TQ2440
2013-03-21 23:58
337 查看
u-boot-2012.04.01移植到TQ2440(一):建立自己的开发板
到官网http://ftp.denx.de/pub/u-boot/下载u-boot-2012.04.01.tar.bz2
解压后在board/samsung/目录下任然没有2440,虽然没有直接支持2440开发板,但其代码已经支持,只需添加相关配置即可。新版u-boot要使用较新的交叉编译器,我使用的是4.4.3
一、 首先建立自己的开发板
拷贝board/samsung/smdk2410/目录到board/tq2440
root@zjh:/home/work/u-boot-2012.04.01#cp -a board/samsung/smdk2410/ board/tq2440
进入board/tq2440目录修改
root@zjh:/home/work/u-boot-2012.04.01/board/tq2440#mv smdk2410.c tq2440.c
修改该目录下的Makefile
COBJS := tq2440.o
拷贝配置文件
root@zjh:/home/work/u-boot-2012.04.01#cp include/configs/smdk2410.h include/configs/tq2440.h
增加开发板配置选项
在顶层目录下的Makefile中搜索不到smdk2410
在顶层目录执行如下命令
root@zjh:/home/work/u-boot-2012.04.01#grep "smdk2410" . –nR
./boards.cfg:65:smdk2410 arm arm920t - samsung s3c24x0
./MAINTAINERS:750: smdk2410 ARM920T
./board/samsung/smdk2410/Makefile:28:COBJS := smdk2410.o
./arch/arm/include/asm/mach-types.h:1644:#define machine_is_smdk2410() (machine_arch_type== MACH_TYPE_SMDK2410)
./arch/arm/include/asm/mach-types.h:1646:#define machine_is_smdk2410() (0)
知道在顶层目录下的boards.cfg文件中定义了smdk2410开发板的配置选项,仿照它定义TQ2440开发板的配置选项
# Target ARCH CPU Board name Vendor SoC Options
########################################################################################
tq2440 arm arm920t - - s3c24x0
由于我们在board目录下创建开发板目录,所以Vendor指定为空
/*************************************************/
一、 修改时钟
在配置文件include/configstq2440.h中加入S3C2440的配置,屏蔽掉S3C2410的配置
//#defineCONFIG_S3C2410 /* specifically aSAMSUNG S3C2410 SoC */
#define CONFIG_S3C2440
//#defineCONFIG_SMDK2410 /* on a SAMSUNGSMDK2410 Board */
屏蔽一些暂时不用的支持
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#endif
#if 0
#define CONFIG_USB_OHCI
#define CONFIG_USB_KEYBOARD
#define CONFIG_USB_STORAGE
#define CONFIG_DOS_PARTITION
#endif
//#defineCONFIG_CMD_DHCP
//#defineCONFIG_CMD_NAND
//#defineCONFIG_CMD_USB
#if 0
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#defineCONFIG_MTD_PARTITIONS
#define CONFIG_YAFFS2
#define CONFIG_RBTREE
#endif
在arch/arm/cpu/arm920t/start.S添加如下代码
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
# ifdefined(CONFIG_S3C2440)
ldr r1,=0x7fff
ldr r0,=INTSUBMSK
str r1,[r0]
# endif
# ifdefined(CONFIG_S3C2440)
# define MPLLCON 0x4C000004 //系统主频配置寄存器
# define UPLLCON 0x4C000008 //USB频率配置寄存器
# define CAMDIVN 0x4C000018 //照相机时钟分频寄存器
ldr r0, =CAMDIVN
mov r1, #0
str r1, [r0]
ldr r0, =CLKDIVN
mov r1, #0x05
str r1, [r0]
/*如果HDIVN不等于0,CPU必须设置为异步总线模式*/
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
ldr r0, =UPLLCON
ldr r1, =0x38022 // 48MHZ
str r1, [r0]
/*
**When you set MPLL&UPLL values, you haveto set the UPLL
**value first and then the MPLL value. (Needsintervals
**approximately 7 NOP)
*/
nop
nop
nop
nop
nop
nop
nop
ldr r0, =MPLLCON
ldr r1, =0x5c011 //400MHZ
str r1, [r0]
# else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
# endif /*CONFIG_S3C2440 */
#endif /* CONFIG_S3C24X0 */
屏蔽board/tq2440/tq2440.c中board_early_init_f()函数对时钟的设置
#if 0
struct s3c24x0_clock_power * const clk_power =
s3c24x0_get_base_clock_power();
#endif
struct s3c24x0_gpio * const gpio =s3c24x0_get_base_gpio();
#if 0
/* to reduce PLL lock time, adjust the LOCKTIME register */
writel(0xFFFFFF, &clk_power->locktime);
/* configure MPLL */
writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
&clk_power->mpllcon);
/* some delay between MPLL and UPLL */
pll_delay(4000);
/* configure UPLL */
writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,
&clk_power->upllcon);
/* some delay between MPLL and UPLL */
pll_delay(8000);
#endif
在board_init函数中修改机器码
gd->bd->bi_arch_number= MACH_TYPE_S3C2440;
修改代码以支持直接烧到SDRAM运行
修改配置文件include\configs\tq2440.h
#define CONFIG_SYS_TEXT_BASE 0x32000000
#define CONFIG_SKIP_LOWLEVEL_INIT
#defineCONFIG_AUTO_COMPLETE //开启命令自动补全
修改命令提示符
#define CONFIG_SYS_PROMPT "TQ2440# "
修改顶层目录Makefile(根据自己的tftp服务器目录修改,这只是为了以后方便)
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $<$@
$(BOARD_SIZE_CHECK)
cp u-boot.bin/home/tftpboot
配置
root@zjh:/home/work/u-boot-2012.04.01#make tq2440_config
Configuring for tq2440board...
编译
root@zjh:/home/work/u-boot-2012.04.01#make
将u-boot.bin烧到0x32000000地址然后执行
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T #############
done
Bytes transferred = 180536(2c138 hex)
TQ2440 # go 32000000
## Starting application at0x32000000 ...
U-Boot 2012.04.01 (Dec 292012 - 14:00:52)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESETthe board ###卡在这里不动了
搜索“Flash:”
puts("Flash: ");
flash_size = flash_init();
if (flash_size > 0) {
# ifdefCONFIG_SYS_FLASH_CHECKSUM
char *s = getenv("flashchecksum");
print_size(flash_size, "");
/*
* Compute and printflash CRC if flashchecksum is set to 'y'
*
* NOTE: Maybe weshould add some WATCHDOG_RESET()? XXX
*/
if (s && (*s == 'y')) {
printf(" CRC: %08X", crc32(0,
(const unsigned char *) CONFIG_SYS_FLASH_BASE,
flash_size));
}
putc('\n');
# else /* !CONFIG_SYS_FLASH_CHECKSUM */
print_size(flash_size, "\n");
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
} else {
puts(failed);
hang();
}
在看下hang()函数
void hang(void)
{
puts("### ERROR ### Please RESET the board ###\n");
for (;;);
}
从这里可以知道是Flash初始化失败
/******************************************************/
一、 移植NOR FLASH
去掉配置文件include\configs\tq2440.h中的宏并修改代码段基地址
#define CONFIG_SYS_TEXT_BASE 0x0
//#defineCONFIG_SKIP_LOWLEVEL_INIT
在board\tq2440\lowlevel_init.S修改SDRAM’刷新频率
#define REFCNT 0x4f4
该文件中的这三条指令其实可以用一条指令替换adrl r0, SMRDATA
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
进入/drivers/mtd/cfi_flash.c中的flash_init()函数
在该文件开头定义宏DEBUG打开调试信息
#define DEBUG 1
#define _DEBUG 1
重新编译
用原先的u-boot从NOR FLASH启动,将新u-boot.bin烧到NOR FLASH
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T #############
done
Bytes transferred = 180828(2c25c hex)
TQ2440 # protect off all
Un-Protect Flash Bank # 1
TQ2440 # erase 0 +30000
...... done
Erased 6 sectors
TQ2440 # cp.b 32000000 030000
Copy to Flash...9....8....7....6....5....4....3....2....1....done
TQ2440 #
重启开发板
U-Boot 2012.04.01 (Dec 292012 - 14:25:05)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: fwc addr (null) cmdf0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa00aa 16bit x 16 bit
fwc addr 00005554 cmd 550055 16bit x 16 bit
fwc addr 0000aaaa cmd 900090 16bit x 16 bit
fwc addr (null) cmd f0 00f016bit x 16 bit
JEDEC PROBE: ID 1c2249 0
fwc addr (null) cmd ff 00ff16bit x 16 bit
fwc addr (null) cmd 90 009016bit x 16 bit
fwc addr (null) cmd ff 00ff16bit x 16 bit
JEDEC PROBE: ID 13 ea00 0
*** failed ***
### ERROR ### Please RESETthe board ###
搜索“JEDEC PROBE:”
flash_read_jedec_ids(info);
debug("JEDECPROBE: ID %x %x %x\n",
info->manufacturer_id,
info->device_id,
info->device_id2);
if (jedec_flash_match(info,info->start[0]))
break;
else
unmap_physmem((void*)info->start[0],
MAP_NOCACHE);
drivers\mtd\jedec_flash.c中的jedec_flash_match()函数:
/*-----------------------------------------------------------------------
* match jedec ids against table. If a match isfound, fill flash_info entry
*/
intjedec_flash_match(flash_info_t *info, ulong base)
{
int ret = 0;
int i;
ulong mask = 0xFFFF;
if (info->chipwidth == 1)
mask = 0xFF;
for (i = 0; i < ARRAY_SIZE(jedec_table); i++) {
if ((jedec_table[i].mfr_id & mask) ==(info->manufacturer_id & mask) &&
(jedec_table[i].dev_id & mask) == (info->device_id & mask)) {
fill_info(info, &jedec_table[i], base);
ret = 1;
break;
}
}
return ret;
}
flash_read_jedec_ids(info)读出了我们的开发板的NOR FLASH的厂商ID为0x1c,设备ID为0x2249
jedec_flash_match(info,info->start[0])将读出的信息与jedec_table[]数组进行匹配,如果有匹配成功则填充flashin信息并返回1,否则返回0。说明这里没有匹配成功,需要在jedec_table[]数组中添加我们自己开发板的NOR FLASH信息。
修改配置文件include\configs\tq2440.h
#defineCONFIG_SYS_FLASH_LEGACY_1024Kx16
在drivers\mtd\jedec_flash.c文件中jedec_table[]数组中增加EN29LV160AB的配置根据芯片手册。
#ifdefCONFIG_SYS_FLASH_LEGACY_1024Kx16
/* TQ2440 EN29LV160AB */
{
.mfr_id = 0x1c, /* 厂商ID */
.dev_id = 0x2249, /* 设备ID */
.name = "EON EN29LV160AB",
.uaddr = {/* 因为NOR FLASH的ADDR0接到了S3C2440的ADDR1 */
[1] = MTD_UADDR_0x0555_0x02AA/* x16 */
},
.DevSize = SIZE_2MiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x04000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x08000, 1),
ERASEINFO(0x10000, 31),
}
},
#endif
重新编译通过工具将u-boot.bin烧写到NOR FLASH
U-Boot 2012.04.01 (Dec 292012 - 15:26:09)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: fwc addr (null) cmdf0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa00aa 16bit x 16 bit
fwc addr 00005554 cmd 550055 16bit x 16 bit
fwc addr 0000aaaa cmd 900090 16bit x 16 bit
fwc addr (null) cmd f0 00f016bit x 16 bit
JEDEC PROBE: ID 1c 2249 0
ERROR: too manyflash sectors
2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
TQ2440 #
出现一个错误ERROR: too many flash sectors
修改配置文件include\configs\tq2440.h
#defineCONFIG_SYS_MAX_FLASH_SECT (35)
取消调试信息drivers\mtd\cfi_flash.c
//#define DEBUG 1
//#define _DEBUG 1
重新编译
U-Boot 2012.04.01 (Dec 292012 - 15:33:09)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
TQ2440 # fflinfo
Bank # 1: EON EN29LV160ABflash (16 x 16) Size: 2 MB in 35 Sectors
AMD Legacy command set, Manufacturer ID:0x1C, Device ID: 0x2249
Erase timeout: 30000 ms, write timeout: 100ms
Sector Start Addresses:
00000000 RO 00004000 RO 00006000 RO 00008000 RO 00010000 RO
00020000 RO 00030000 00040000 00050000 00060000
00070000 RO 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 00100000
00110000 00120000 00130000 00140000 00150000
00160000 00170000 00180000 00190000 001A0000
001B0000 001C0000 001D0000 001E0000 001F0000
TQ2440 # md.b 32000000 a
32000000: 13 00 00 ea 14 f09f e5 14 f0 ..........
TQ2440 # erase 100000 +a
. done
Erased 1 sectors
TQ2440 # cp.b 32000000100000 a
Copy to Flash... done
TQ2440 # md.b 100000 a
00100000: 13 00 00 ea 14 f09f e5 14 f0 ..........
/******************************************************/
一、 移植网卡DM9000
在配置文件include\configs\tq2440.h中添加DM9000的配置信息
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#endif
#defineCONFIG_DRIVER_DM9000
#defineCONFIG_DM9000_NO_SROM 1
#defineCONFIG_DM9000_BASE 0x20000000
#defineDM9000_IO CONFIG_DM9000_BASE
#defineDM9000_DATA (CONFIG_DM9000_BASE + 4)
修改IP地址,添加MAC地址(也可在u-boot启动后通过setenv命令设置)
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.2.100
#define CONFIG_SERVERIP 192.168.2.209
#define CONFIG_ETHADDR 00:0c:29:4d:e4:f4
修改board\tq2440\tq2440.c
int board_eth_init(bd_t*bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdefCONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis);
#endif
return rc;
}
重新编译烧到NOR FLASH执行
U-Boot 2012.04.01 (Dec 292012 - 15:58:53)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: dm9000
TQ2440 #
现在可以用tftpboot命令通过网络下载文件了,前提是确保服务器IP和开发板u-boot的IP在同一个网段。
TQ2440 # pri
baudrate=115200
bootdelay=5
ethact=dm9000
ethaddr=00:0c:29:4d:e4:f4
ipaddr=172.28.12.10
netmask=255.255.255.0
serverip=172.28.12.60
stderr=serial
stdin=serial
stdout=serial
Environment size: 194/65532bytes
TQ2440 # tftp 32000000 u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
could notestablish link
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: #############
done
Bytes transferred = 183576(2cd18 hex)
出现一个错误could not establish link
解决错误并加快速度
修改drivers\net\dm9000x.c
#if 0
i = 0;
while (!(dm9000_phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link\n");
return 0;
}
}
/* see what we've got */
lnk = dm9000_phy_read(17) >> 12;
printf("operating at ");
switch (lnk) {
case 1:
printf("10M half duplex ");
break;
case 2:
printf("10M full duplex ");
break;
case 4:
printf("100M half duplex ");
break;
case 8:
printf("100M full duplex ");
break;
default:
printf("unknown: %d ", lnk);
break;
}
printf("mode\n");
#endif
重新编译烧到NOR FLASH运行
U-Boot 2012.04.01 (Dec 292012 - 17:14:04)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: dm9000
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T #############
done
Bytes transferred = 182996(2cad4 hex)
TQ2440 #
/************************************************/
一、 支持NAND FLASH读写
修改配置文件include\configs\tq2440.h打开之前注释掉的NAND相关的宏
#defineCONFIG_CMD_NAND
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET0x40000
#define CONFIG_ENV_SIZE 0x20000
编译出错
iteral-Wno-format-security -os3c2410_nand.o s3c2410_nand.c -c
s3c2410_nand.c: In function's3c2410_hwcontrol':
s3c2410_nand.c:57: warning:implicit declaration of function 's3c2410_get_base_nand'
s3c2410_nand.c:57: warning:initialization makes pointer from integer without a cast
s3c2410_nand.c:72: error:dereferencing pointer to incomplete type
s3c2410_nand.c:72: error:dereferencing pointer to incomplete type
s3c2410_nand.c:75: error:dereferencing pointer to incomplete type
s3c2410_nand.c:75: error:dereferencing pointer to incomplete type
s3c2410_nand.c: In function's3c2410_dev_ready':
s3c2410_nand.c:85: warning:initialization makes pointer from integer without a cast
s3c2410_nand.c:87: error:dereferencing pointer to incomplete type
s3c2410_nand.c: In function'board_nand_init':
s3c2410_nand.c:129: warning:initialization makes pointer from integer without a cast
s3c2410_nand.c:150: error:dereferencing pointer to incomplete type
s3c2410_nand.c:153: error:dereferencing pointer to incomplete type
s3c2410_nand.c:154: error:dereferencing pointer to incomplete type
make[1]: ***[s3c2410_nand.o] Error 1
make[1]: Leaving directory`/home/work/u-boot-2012.04.01/drivers/mtd/nand'
make: ***[drivers/mtd/nand/libnand.o] Error 2
将drivers/mtd/nand/s3c2410_nand.c拷贝为drivers/mtd/nand/s3c2440_nand.c
root@zjh:/home/work/u-boot-2012.04.01#cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c
在drivers/mtd/nand/Makefile文件中增加一行
COBJS-$(CONFIG_NAND_S3C2440)+= s3c2440_nand.o
将s3c2440_nand.c中所有的2410替换为2440
修改配置文件include\configs\tq2440.h
#define CONFIG_NAND_S3C2440
#define CONFIG_SYS_S3C2440_NAND_HWECC
修改drivers\mtd\nand\s3c2440_nand.c中的board_nand_init()函数
#ifdefined(CONFIG_S3C24XX_CUSTOM_NAND_TIMING)
tacls =CONFIG_S3C24XX_TACLS;
twrph0 = CONFIG_S3C24XX_TWRPH0;
twrph1 = CONFIG_S3C24XX_TWRPH1;
#else
tacls = 0;
twrph0 = 1;
twrph1 = 0;
#endif
#if 0
cfg = S3C2440_NFCONF_EN;
cfg |= S3C2440_NFCONF_TACLS(tacls - 1);
cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
#endif
cfg = (tacls << 12)|(twrph0 << 8)|(twrph1 << 4);
writel(cfg, &nand_reg->nfconf);
/*初始化ECC、禁止片选、使能NANDFLASH控制器*/
writel((1 << 4)|(1 << 1)|(1<< 0), &nand_reg->nfcont);
nand->select_chip = s3c2440_nand_select;
添加函数s3c2440_nand_select
static voids3c2440_nand_select(struct mtd_info *mtd, int chipnr)
{
structs3c2440_nand *nand = s3c2440_get_base_nand();
switch(chipnr) {
case-1: /* 取消选中 */
nand->nfcont |= (1<<1);
break;
case0: /* 选中 */
nand->nfcont&= ~(1<<1);
break;
default:
BUG();
}
}
修改s3c2440_hwcontrol()函数
/*
** ctrl:表示做什么(选中芯片/取消选中,发命令还是发地址)
** cmd:命令值或地址值
*/
static voids3c2440_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
struct s3c2440_nand*nand = s3c2440_get_base_nand();
if(ctrl & NAND_CLE) {
/*发命令 */
writeb(cmd,&nand->nfcmd);
}else if (ctrl & NAND_ALE) {
/* 发地址 */
writeb(cmd,&nand->nfaddr);
}
}
重新编译烧到NOR FLASh执行
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T ################
done
Bytes transferred = 226588(3751c hex)
TQ2440 # pro off all
Un-Protect Flash Bank # 1
TQ2440 # erase 0 +40000
....... done
Erased 7 sectors
TQ2440 # cp.b 32000000 040000
Copy to Flash...9....8....7....6....5....4....3....2....1....done
TQ2440 # res
resetting ...
U-Boot 2012.04.01 (Dec 292012 - 21:53:59)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
NAND: 256 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: dm9000
TQ2440 #
测试
将SDRAM的0x32000000地址的0xff字节数据写到NAND FLASH的0地址
TQ2440 # nand write 320000000 ff
NAND write: device 0 offset0x0, size 0xff
255 bytes written: OK
从NAND FLASH的0地址读0xff字节数据到SDRAM的0x31000000地址
TQ2440 # nand read 310000000 ff
NAND read: device 0 offset0x0, size 0xff
255 bytes read: OK
比较
TQ2440 # cmp.b 3100000032000000 ff
/*******************************************************/
一、 支持NAND FLASH启动
新版u-boot在链接时加了“-pie”选项
-pie
Produce a position independentexecutable on targets which support it. For predictable results, you must also specify the same set of optionsthat were used to generate code (-fpie, -fPIE, or model suboptions) when youspecify this option.
产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。
最终u-boot.bin中多了这些段
.rel.dyn : {
__rel_dyn_start = .;
*(.rel*)
__rel_dyn_end = .;
}
.dynsym : {
__dynsym_start = .;
*(.dynsym)
}
从NOR FLASH把代码复制到SDRAM,程序的链接地址是0,访问全局变量、静态变量、调用函数时是使用基于0地址编译得到的地址,现在把程序复制到了SDRAM(0x3000000),需要修改代码,把原来的地址改为新地址。这样太复杂了,我还是使用老版本的方法。
去掉“-pie”选项,在u-boot源码搜索“-pie”
root@zjh:/home/work/u-boot-2012.04.01#grep "\-pie" . -nR
./doc/README.arm-relocation:3:Atarch level: add linker flag -pie
./arch/x86/config.mk:43:LDFLAGS_FINAL+= --gc-sections -pie
./arch/arm/config.mk:75:LDFLAGS_u-boot+= -pie
去除arch/arm/config.mk:75:LDFLAGS_u-boot += -pie中的“-pie”
# needed for relocation
ifndef CONFIG_NAND_SPL
#LDFLAGS_u-boot +=-pie
endif
修改配置文件include\configs\tq2440.h,给u-boot分配512KB
#define CONFIG_SYS_TEXT_BASE 0x33f80000
增加文件board\tq2440\nand_read_ll.c并修改相应的Makefile
COBJS := tq2440.onand_read_ll.o
Nand_read_ll.c文件内容如下:
/* NAND FLASH控制器 */
#define NFCONF(*((volatile unsigned long *)0x4E000000))
#define NFCONT(*((volatile unsigned long *)0x4E000004))
#define NFCMMD(*((volatile unsigned char *)0x4E000008))
#define NFADDR(*((volatile unsigned char *)0x4E00000C))
#define NFDATA(*((volatile unsigned char *)0x4E000010))
#define NFSTAT(*((volatile unsigned char *)0x4E000020))
static intisBootFromNorFlash(void)
{
volatile int *p = (volatile int *)0;
int val;
val = *p;
*p = 0x12345678;
if (*p == 0x12345678) {
/* 写成功,是nand启动 */
*p = val;
return 0;
} else {
/* NOR不能像内存一样写 */
return 1;
}
}
voidclear_bss(void)
{
extern int __bss_start, __bss_end__;
int *p = &__bss_start;
for (; p < &__bss_end__; p++)
*p = 0;
}
void nand_init_ll(void)
{
#define TACLS 0
#defineTWRPH0 1
#defineTWRPH1 0
/* 设置时序 */
NFCONF =(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
/* 使能NAND Flash控制器,初始化ECC, 禁止片选 */
NFCONT =(1<<4)|(1<<1)|(1<<0);
}
static voidnand_select(void)
{
NFCONT &= ~(1<<1);
}
static voidnand_deselect(void)
{
NFCONT |= (1<<1);
}
static voidnand_cmd(unsigned char cmd)
{
volatile int i;
NFCMMD = cmd;
for (i = 0; i < 10; i++);
}
static voidnand_addr(unsigned int addr)
{
unsigned int col = addr % 2048;
unsigned int page = addr / 2048;
volatile int i;
NFADDR = col & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (col >> 8) & 0xff;
for (i = 0; i < 10; i++);
NFADDR = page & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 8) & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 16) & 0xff;
for (i = 0; i < 10; i++);
}
static voidnand_wait_ready(void)
{
while (!(NFSTAT & 1));
}
static unsignedchar nand_data(void)
{
return NFDATA;
}
voidnand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
int col = addr % 2048;
int i = 0;
/* 1. 选中 */
nand_select();
while (i < len) {
/* 2. 发出读命令00h */
nand_cmd(0x00);
/* 3. 发出地址(分5步发出) */
nand_addr(addr);
/* 4. 发出读命令30h */
nand_cmd(0x30);
/* 5. 判断状态 */
nand_wait_ready();
/* 6. 读数据 */
for (; (col < 2048) && (i< len); col++) {
buf[i] = nand_data();
i++;
addr++;
}
col = 0;
}
/* 7. 取消选中 */
nand_deselect();
}
voidcopy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
int i = 0;
/* 如果是NOR启动 */
if (isBootFromNorFlash()) {
while (i < len) {
dest[i] = src[i];
i++;
}
} else {
nand_init_ll();
nand_read_ll((unsigned int)src, dest,len);
}
}
修改arch\arm\cpu\arm920t\start.S
call_board_init_f:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABIcompliance */
ldr r0,=0x00000000
ldr r1, _TEXT_BASE
ldr r2, _bss_start_ofs
bl copy_code_to_sdram
bl clear_bss
ldr pc, = board_init_f /* 跳转到SDRAM */
.globl second
second:
/* 调用第2阶段的代码 */
bl board_init_r
注释掉以下代码
#if 0
.globl relocate_code
relocate_code:
mov r4, r0 /* save addr_sp */
mov r5, r1 /* save addr of gd */
mov r6, r2 /* save addr of destination */
/* Set up the stack */
stack_setup:
mov sp, r4
adr r0, _start
cmp r0, r6
beq clear_bss /* skip relocation */
mov r1, r6 /* r1 <- scratch forcopy_loop */
ldr r3, _bss_start_ofs
add r2, r0, r3 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r9-r10} /* copy from source address[r0] */
stmia r1!, {r9-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end address[r2] */
blo copy_loop
#ifndef CONFIG_SPL_BUILD
/*
* fix .rel.dynrelocations
*/
ldr r0, _TEXT_BASE /* r0 <- Text base */
sub r9, r6, r0 /* r9 <- relocation offset */
ldr r10,_dynsym_start_ofs /* r10 <- sym tableofs */
add r10, r10, r0 /* r10 <- sym table in FLASH */
ldr r2,_rel_dyn_start_ofs /* r2 <- reldyn start ofs */
add r2, r2, r0 /* r2 <- rel dyn start in FLASH */
ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */
add r3, r3, r0 /* r3 <- rel dyn end in FLASH */
fixloop:
ldr r0, [r2] /* r0 <- location to fix up, INFLASH! */
add r0, r0, r9 /* r0 <- location to fix up in RAM*/
ldr r1, [r2, #4]
and r7, r1, #0xff
cmp r7, #23 /* relative fixup? */
beq fixrel
cmp r7, #2 /* absolute fixup? */
beq fixabs
/* ignore unknown type of fixup */
b fixnext
fixabs:
/* absolute fix: set location to (offset) symbol value */
mov r1, r1, LSR #4 /* r1 <- symbol index in .dynsym */
add r1, r10, r1 /* r1 <- address of symbol in table*/
ldr r1, [r1, #4] /* r1 <- symbol value */
add r1, r1, r9 /* r1 <- relocated sym addr */
b fixnext
fixrel:
/* relative fix: increase location by offset */
ldr r1, [r0]
add r1, r1, r9
fixnext:
str r1, [r0]
add r2, r2, #8 /* each rel.dyn entry is 8 bytes */
cmp r2, r3
blo fixloop
#endif
clear_bss:
#ifndef CONFIG_SPL_BUILD
ldr r0, _bss_start_ofs
ldr r1, _bss_end_ofs
mov r4, r6 /* reloc addr */
add r0, r0, r4
add r1, r1, r4
mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /*clear loop... */
add r0, r0, #4
cmp r0, r1
bne clbss_l
bl coloured_LED_init
bl red_led_on
#endif
#endif
修改arch\arm\lib\board.c中的函数board_init_f
//addr -=gd->mon_len;
//addr &=~(4096 - 1);
addr =CONFIG_SYS_TEXT_BASE;
注视最后的重定位,并跳转到刚才定义的second
//relocate_code(addr_sp,id, addr);
second(id, addr);
修改链接脚本arch\arm\cpu\u-boot.lds把start.o、nand_read_ll.o、lowlevel_init.o编译到前面4k
CPUDIR/start.o (.text)
board/tq2440/libtq2440.o(.text)
重新编译,烧到NAND FLASH
TQ2440 # nand erase 040000;tftp 32000000 u-boot.bin;nand write 32000000 0 40000
NAND erase: device 0 offset0x0, size 0x40000
Erasing at 0x20000 -- 100%complete.
OK
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T ###############
done
Bytes transferred = 208508(32e7c hex)
NAND write: device 0 offset0x0, size 0x40000
262144 bytes written: OK
TQ2440 #
从NAND FLASH启动
U-Boot 2012.04.01 (Dec 312012 - 11:57:16)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESETthe board ###
由于从NAND启动,CPU检测不到NOR FLASH,具体代码如下arch\arm\lib\board.c
#if!defined(CONFIG_SYS_NO_FLASH)
puts("Flash: ");
flash_size = flash_init();
if (flash_size > 0) {
# ifdefCONFIG_SYS_FLASH_CHECKSUM
char *s = getenv("flashchecksum");
print_size(flash_size, "");
/*
* Compute and printflash CRC if flashchecksum is set to 'y'
*
* NOTE: Maybe weshould add some WATCHDOG_RESET()? XXX
*/
if (s && (*s == 'y')) {
printf(" CRC: %08X", crc32(0,
(const unsigned char *) CONFIG_SYS_FLASH_BASE,
flash_size));
}
putc('\n');
# else /* !CONFIG_SYS_FLASH_CHECKSUM */
print_size(flash_size, "\n");
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
} else {
puts(failed);
hang();
}
#endif
void hang(void)
{
puts("### ERROR ### Please RESET the board ###\n");
for (;;);
}
我们直接注释掉上面的hang();
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
} else {
puts(failed);
//hang();
}
#endif
重新编译,烧到NAND FLASH,从NAND启动
U-Boot 2012.04.01 (Dec 31 2012- 12:27:20)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
NAND: 256 MiB
卡在这里,检查后发现修改start.S的时候调用第二阶段代码没有重新设置栈指针,做如下修改
board.c中的board_init_f函数
//relocate_code(addr_sp, id,addr);
second(id, addr, addr_sp);
start.S
second:
mov sp, r2 /*重新设置栈指针 */
/* 调用第2阶段的代码 */
bl board_init_r
重新编译,烧到NAND,从NAND启动
U-Boot 2012.04.01 (Dec 312012 - 12:31:58)
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
TQ2440 #
一、 添加分区信息并启动jffs2文件系统
烧写之前的内核看输出分区信息
TQ2440 # tftp 32000000uImage
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'uImage'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
################
done
Bytes transferred = 2138388(20a114 hex)
TQ2440 # bootm 32000000
…………
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
…………
修改配置文件include\configs\tq2440.h打开之前屏蔽的MTDPARTS命令的宏
#if 0
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#endif
#define CONFIG_CMD_MTDPARTS
#if 0
#define CONFIG_MTD_DEVICE
#defineCONFIG_MTD_PARTITIONS
#define CONFIG_YAFFS2
#define CONFIG_RBTREE
#endif
添加如下分区信息
#define CONFIG_MTD_DEVICE
#defineMTDIDS_DEFAULT "nand0=tq2440-0" /*哪一个设备 */
#defineMTDPARTS_DEFAULT "mtdparts=tq2440-0:256k(u-boot)," \
"128k(params)," \
"3m(kernel)," \
"-(rootfs)" \
重新编译,烧到开发板并启动
U-Boot 2012.04.01 (Dec 312012 - 16:52:29)
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
TQ2440 # mtdparts default第一次启动首先执行mtdparts default
TQ2440 # save
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x40000 -- 100% complete.
Writing to Nand... done
TQ2440 # mtdparts
device nand0<tq2440-0>, # parts = 4
#: name size offset mask_flags
0: u-boot 0x00040000 0x00000000 0
1: params 0x00020000 0x00040000 0
2: kernel 0x00300000 0x00060000 0
3: rootfs 0x0fca0000 0x00360000 0
active partition: nand0,0 -(u-boot) 0x00040000 @ 0x00000000
defaults:
mtdids : nand0=tq2440-0
mtdparts:mtdparts=tq2440-0:256k(u-boot),128k(params),3m(kernel),-(rootfs)
TQ2440 # nand erase.part kernel
NAND erase.part: device 0offset 0x60000, size 0x400000
Erasing at 0x440000 -- 100%complete.
OK
TQ2440 # tftp 32000000 uImage
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'uImage'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
################
done
Bytes transferred = 2138388(20a114 hex)
TQ2440 # nand write 32000000 kernel
NAND write: device 0 offset0x60000, size 0x400000
4194304 bytes written: OK
设置启动参数
TQ2440 # set bootcmd nand read 32000000 kernel\;bootm 32000000
TQ2440 # save
Saving Environment toNAND...
Erasing Nand...
Erasing at 0x40000 -- 100%complete.
Writing to Nand... done
烧写jffs2文件系统
TQ2440 # tftpboot 32000000 rootfs.jffs2
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'rootfs.jffs2'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
#################################################################
############################
done
Bytes transferred = 3262836(31c974 hex)
TQ2440 # nand erase.part rootfs
NAND erase.part: device 0offset 0x460000, size 0xfba0000
Skipping bad block at 0x08260000
Erasing at 0xffe0000 -- 100%complete.
OK
TQ2440 # nand write 32000000 rootfs $filesize
NAND write: device 0 offset0x460000, size 0x31c974
3262836 bytes written: OK
设置启动参数
TQ2440 # set bootargs root=/dev/mtdblock3 rootfstype=jffs2init=/linuxrc console=ttySAC0,115200
TQ2440 # save
Saving Environment toNAND...
Erasing Nand...
Erasing at 0x40000 -- 100%complete.
Writing to Nand... done
TQ2440 # res 重启
resetting ...
U-Boot 2012.04.01 (Dec 31 2012- 16:52:29)
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 stopautoboot: 0
NAND read: device 0 offset0x60000, size 0x300000
3145728 bytes read: OK
## Booting kernel fromLegacy Image at 32000000 ...
Image Name: Linux-2.6.36.4
Created: 2012-12-31 8:37:05 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2138324 Bytes = 2 MiB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done,booting the kernel.
Linux version 2.6.36.4(root@zjh) (gcc version 4.4.3 (ctng-1.6.1) ) #4 Mon Dec 31 16:36:50 CST 2012
CPU: ARM920T [41129200]revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVTinstruction cache
Machine: SMDK2440
Memory policy: ECC disabled,Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright2004 Simtec Electronics
S3C244X: core 400.000 MHz,memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zoneorder, mobility grouping on. Totalpages: 16256
Kernel command line:root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0,115200
PID hash table entries: 256(order: -2, 1024 bytes)
Dentry cache hash table entries:8192 (order: 3, 32768 bytes)
Inode-cache hash tableentries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60620k/60620kavailable, 4916k reserved, 0K highmem
Virtual kernel memorylayout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16MB)
.init : 0xc0008000 - 0xc0028000 ( 128 kB)
.text : 0xc0028000 - 0xc03d1000 (3748 kB)
.data : 0xc03ea000 - 0xc040cac0 ( 139 kB)
Hierarchical RCUimplementation.
RCU-based detection of stalled CPUs isdisabled.
Verbose stalled-CPUs detection isdisabled.
NR_IRQS:85
irq: clearing subpendingstatus 00000002
Console: colour dummy device80x30
console [ttySAC0] enabled
Calibrating delay loop...199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768minimum: 301
Mount-cache hash tableentries: 512
CPU: Testing write buffercoherency: ok
gpiochip_add: gpios 288..303(GPIOK) failed to register
gpiochip_add: gpios 320..334(GPIOL) failed to register
gpiochip_add: gpios 352..353(GPIOM) failed to register
NET: Registered protocolfamily 16
S3C Power Management,Copyright 2004 Simtec Electronics
S3C2440: Initialisingarchitecture
S3C2440: IRQ Support
S3C24XX DMA Driver,Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000,irq 33
DMA channel 1 at c4808040, irq34
DMA channel 2 at c4808080,irq 35
DMA channel 3 at c48080c0,irq 36
S3C244X: Clock Support, DVSoff
bio: create slab<bio-0> at 0
SCSI subsystem initialized
usbcore: registered newinterface driver usbfs
usbcore: registered newinterface driver hub
usbcore: registered newdevice driver usb
s3c-i2c s3c2440-i2c: slaveaddress 0x10
s3c-i2c s3c2440-i2c: busfrequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0:S3C I2C adapter
Advanced Linux SoundArchitecture Driver Version 1.0.23.
NET: Registered protocolfamily 2
IP route cache hash tableentries: 1024 (order: 0, 4096 bytes)
TCP established hash tableentries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries:2048 (order: 1, 8192 bytes)
TCP: Hash tables configured(established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256(order: 0, 4096 bytes)
UDP-Lite hash table entries:256 (order: 0, 4096 bytes)
NET: Registered protocolfamily 1
RPC: Registered udptransport module.
RPC: Registered tcptransport module.
RPC: Registered tcp NFSv4.1backchannel transport module.
NetWinder Floating PointEmulator V0.97 (extended precision)
JFFS2 version 2.2. (NAND)(SUMMARY) © 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat,Inc.
msgmni has been set to 118
io scheduler noop registered
io scheduler deadlineregistered
io scheduler cfq registered(default)
Console: switching to colourframe buffer device 30x40
fb0: s3c2410fb frame bufferdevice
lp: driver loaded but nodevices found
ppdev: user-space parallelport driver
Serial: 8250/16550 driver, 4ports, IRQ sharing enabled
s3c2440-uart.0:s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1:s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2:s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
loop: module loaded
Uniform Multi-Platform E-IDEdriver
ide-gd driver 1.18
ide-cd driver 5.00
S3C24XX NAND Driver, (c)2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
s3c24xx-nand s3c2440-nand:NAND soft ECC
NAND device: ManufacturerID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for badblocks
Bad eraseblock 1043 at0x000008260000
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
dm9000 Ethernet Driver,V1.31
usbmon: debugfs is notavailable
ohci_hcd: USB 1.1 'Open'Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci:S3C24XX OHCI
s3c2410-ohci s3c2410-ohci:new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci:irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 portsdetected
usbcore: registered newinterface driver libusual
usbcore: registered newinterface driver usbserial
USB Serial supportregistered for generic
usbcore: registered newinterface driver usbserial_generic
usbserial: USB Serial Drivercore
USB Serial supportregistered for FTDI USB Serial Device
usbcore: registered newinterface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDISerial Converters Driver
USB Serial supportregistered for pl2303
usbcore: registered newinterface driver pl2303
pl2303: Prolific PL2303 USBto serial adaptor driver
mice: PS/2 mouse devicecommon for all mice
S3C24XX RTC, (c) 2004,2006Simtec Electronics
S3C2410 Watchdog Timer, (c)2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt:watchdog inactive, reset disabled, irq enabled
No device for DAI UDA134X
No device for DAIs3c24xx-i2s
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocolfamily 17
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
VFS: Mounted root (jffs2filesystem) on device 31:3.
Freeing init memory: 128K
Please press Enter toactivate this console.
Processing /etc/profile...
Done
[root@tq2440 /]#
/**********************************/
一、 支持yaffs烧写文件系统
先直接烧写试一下
TQ2440 # nand write.yaffs32000000 rootfs $filesize
NAND write: device 0 offset0x360000, size 0x614ac0
Unknown nandcommand suffix '.yaffs'.
不认识的后缀‘.yaffs’
搜索.yaffs
Cmd_nand.c(u-boot-2012.04.01\common): } elseif (!strcmp(s, ".yaffs")) {
#ifdefCONFIG_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
因为没有定义上面那个宏,修改配置文件include\configs\tq2440.h添加该宏
#defineCONFIG_CMD_NAND_YAFFS
重新编译,烧到开发板并重启,再次烧写yaffs文件系统
TQ2440 # nand erase 040000;tftp 32000000 u-boot.bin;nand write 32000000 0 40000
重启
TQ2440 # tftp 32000000rootfs.yaffs;nand erase.part rootfs;nand write.yaffs 32000000 rootfs $filesize
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'rootfs.yaffs'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
#################################################################
done
Bytes transferred = 6376128(614ac0 hex)
NAND erase.part: device 0offset 0x360000, size 0xfca0000
Skipping bad block at 0x08260000
Erasing at 0xffe0000 -- 100%complete.
OK
NAND write: device 0 offset0x360000, size 0x614ac0
6376128 bytes written: OK
TQ2440 # set bootargs root=/dev/mtdblock3 rootfstype=yaffs2init=/linuxrc console=ttySAC0,115200
TQ2440 # res 重启
resetting ...
U-Boot 2012.04.01 (Dec 312012 - 18:46:42)
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 stopautoboot: 0
NAND read: device 0 offset0x60000, size 0x300000
3145728 bytes read: OK
## Booting kernel from LegacyImage at 32000000 ...
Image Name: Linux-2.6.36.4
Created: 2012-12-31 10:56:09 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2186324 Bytes = 2.1 MiB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done,booting the kernel.
Linux version 2.6.36.4(root@zjh) (gcc version 4.4.3 (ctng-1.6.1) ) #5 Mon Dec 31 18:55:35 CST 2012
CPU: ARM920T [41129200]revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVTinstruction cache
Machine: SMDK2440
Memory policy: ECC disabled,Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright2004 Simtec Electronics
S3C244X: core 400.000 MHz,memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zoneorder, mobility grouping on. Totalpages: 16256
Kernel command line:root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200
PID hash table entries: 256(order: -2, 1024 bytes)
Dentry cache hash tableentries: 8192 (order: 3, 32768 bytes)
Inode-cache hash tableentries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60532k/60532kavailable, 5004k reserved, 0K highmem
Virtual kernel memorylayout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16MB)
.init : 0xc0008000 - 0xc0028000 ( 128 kB)
.text : 0xc0028000 - 0xc03e8000 (3840 kB)
.data : 0xc0400000 - 0xc0422b80 ( 139 kB)
Hierarchical RCUimplementation.
RCU-based detection of stalled CPUs isdisabled.
Verbose stalled-CPUs detection isdisabled.
NR_IRQS:85
irq: clearing subpendingstatus 00000002
Console: colour dummy device80x30
console [ttySAC0] enabled
Calibrating delay loop...199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768minimum: 301
Mount-cache hash tableentries: 512
CPU: Testing write buffercoherency: ok
gpiochip_add: gpios 288..303(GPIOK) failed to register
gpiochip_add: gpios 320..334(GPIOL) failed to register
gpiochip_add: gpios 352..353(GPIOM) failed to register
NET: Registered protocolfamily 16
S3C Power Management,Copyright 2004 Simtec Electronics
S3C2440: Initialisingarchitecture
S3C2440: IRQ Support
S3C24XX DMA Driver,Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000,irq 33
DMA channel 1 at c4808040,irq 34
DMA channel 2 at c4808080,irq 35
DMA channel 3 at c48080c0,irq 36
S3C244X: Clock Support, DVSoff
bio: create slab<bio-0> at 0
SCSI subsystem initialized
usbcore: registered newinterface driver usbfs
usbcore: registered newinterface driver hub
usbcore: registered newdevice driver usb
s3c-i2c s3c2440-i2c: slaveaddress 0x10
s3c-i2c s3c2440-i2c: busfrequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0:S3C I2C adapter
Advanced Linux SoundArchitecture Driver Version 1.0.23.
NET: Registered protocolfamily 2
IP route cache hash tableentries: 1024 (order: 0, 4096 bytes)
TCP established hash tableentries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries:2048 (order: 1, 8192 bytes)
TCP: Hash tables configured(established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256(order: 0, 4096 bytes)
UDP-Lite hash table entries:256 (order: 0, 4096 bytes)
NET: Registered protocolfamily 1
RPC: Registered udptransport module.
RPC: Registered tcptransport module.
RPC: Registered tcp NFSv4.1backchannel transport module.
NetWinder Floating PointEmulator V0.97 (extended precision)
JFFS2 version 2.2. (NAND)(SUMMARY) © 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat,Inc.
msgmni has been set to 118
io scheduler noop registered
io scheduler deadlineregistered
io scheduler cfq registered(default)
Console: switching to colourframe buffer device 30x40
fb0: s3c2410fb frame bufferdevice
lp: driver loaded but nodevices found
ppdev: user-space parallelport driver
Serial: 8250/16550 driver, 4ports, IRQ sharing enabled
s3c2440-uart.0:s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1:s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2:s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
loop: module loaded
Uniform Multi-Platform E-IDEdriver
ide-gd driver 1.18
ide-cd driver 5.00
S3C24XX NAND Driver, (c)2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
s3c24xx-nand s3c2440-nand:NAND soft ECC
NAND device: ManufacturerID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for badblocks
Bad eraseblock 1043 at0x000008260000
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
dm9000 Ethernet Driver,V1.31
usbmon: debugfs is notavailable
ohci_hcd: USB 1.1 'Open'Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci:S3C24XX OHCI
s3c2410-ohci s3c2410-ohci:new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci:irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 portsdetected
usbcore: registered newinterface driver libusual
usbcore: registered newinterface driver usbserial
USB Serial supportregistered for generic
usbcore: registered newinterface driver usbserial_generic
usbserial: USB Serial Drivercore
USB Serial supportregistered for FTDI USB Serial Device
usbcore: registered newinterface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDISerial Converters Driver
USB Serial supportregistered for pl2303
usbcore: registered newinterface driver pl2303
pl2303: Prolific PL2303 USBto serial adaptor driver
mice: PS/2 mouse devicecommon for all mice
S3C24XX RTC, (c) 2004,2006Simtec Electronics
S3C2410 Watchdog Timer, (c)2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt:watchdog inactive, reset disabled, irq enabled
No device for DAI UDA134X
No device for DAIs3c24xx-i2s
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocolfamily 17
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
yaffs: dev is32505859 name is "mtdblock3" rw
yaffs: passedflags ""
VFS: Mounted root(yaffs2 filesystem) on device 31:3.
Freeing initmemory: 128K
Failed to execute/linuxrc. Attempting defaults...
Kernel panic - notsyncing: No init found. Try passinginit= option to kernel. See Linux Documentation/init.txt for guidance.
[<c002e344>](unwind_backtrace+0x0/0xf0) from [<c02ff798>] (panic+0x54/0x17c)
[<c02ff798>](panic+0x54/0x17c) from [<c002856c>] (init_post+0x9c/0xbc)
[<c002856c>](init_post+0x9c/0xbc) from [<c00085e8>] (kernel_init+0x10c/0x148)
[<c00085e8>](kernel_init+0x10c/0x148) from [<c0029e50>] (kernel_thread_exit+0x0/0x8)
Yaffs文件系统挂载上了,但是没法执行/linuxrc,换回以前的u-boot烧写yaffs文件系统可以正常启动,说明是u-boot的问题。
YAFFS中,文件是以固定大小的数据块进行存储的,块的大小可以是512字节、1 024字节或者2 048字节。这种实现依赖于它能够将一个数据块头和每个数据块关联起来。每个文件(包括目录)都有一个数据块头与之相对应,数据块头中保存了ECC(ErrorCorrection Code)和文件系统的组织信息,用于错误检测和坏块处理。
TQ2440开发板用的NAND FLASH每页2k
用UltraEdit打开刚才烧写的rootfs.yaffs文件和烧到NAND FLASH里的数据对比
在u-boot中执行
TQ2440 # nand dump 360000
Page 00360000 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里的数据和原文件不一致
跟踪u-boot源码common\cmd_nand.c
ret =nand_write_skip_bad(nand, off, &rwsize,
(u_char *)addr, WITH_YAFFS_OOB);
这里传入了一个参数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,应该为原始 */
rval =nand->write_oob(nand, offset, &ops);
if (rval) /* 返回0成功,非0失败,之前那样就只写了第一页 */
break;
重新编译重新烧写yaffs文件系统
TQ2440 # tftp 32000000rootfs.yaffs;nand erase.part rootfs;nand write.yaffs 32000000 rootfs $filesize
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'rootfs.yaffs'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#############################################
done
Bytes transferred = 6376128(614ac0 hex)
NAND erase.part: device 0offset 0x360000, size 0xfca0000
Skipping bad block at 0x08260000
Erasing at 0xffe0000 -- 100%complete.
OK
NAND write: device 0 offset0x360000, size 0x614ac0
6376128 bytes written: OK
TQ2440 # res
resetting ...
U-Boot 2012.04.01 (Dec 312012 - 19:45:23)
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 stopautoboot: 0
NAND read: device 0 offset0x60000, size 0x300000
3145728 bytes read: OK
## Booting kernel fromLegacy Image at 32000000 ...
Image Name: Linux-2.6.36.4
Created: 2012-12-31 10:56:09 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2186324 Bytes = 2.1 MiB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done,booting the kernel.
Linux version 2.6.36.4(root@zjh) (gcc version 4.4.3 (ctng-1.6.1) ) #5 Mon Dec 31 18:55:35 CST 2012
CPU: ARM920T [41129200]revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVTinstruction cache
Machine: SMDK2440
Memory policy: ECC disabled,Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright2004 Simtec Electronics
S3C244X: core 400.000 MHz,memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zoneorder, mobility grouping on. Totalpages: 16256
Kernel command line:root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200
PID hash table entries: 256(order: -2, 1024 bytes)
Dentry cache hash table entries:8192 (order: 3, 32768 bytes)
Inode-cache hash tableentries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60532k/60532kavailable, 5004k reserved, 0K highmem
Virtual kernel memorylayout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16MB)
.init : 0xc0008000 - 0xc0028000 ( 128 kB)
.text : 0xc0028000 - 0xc03e8000 (3840 kB)
.data : 0xc0400000 - 0xc0422b80 ( 139 kB)
Hierarchical RCUimplementation.
RCU-based detection of stalled CPUs isdisabled.
Verbose stalled-CPUs detection isdisabled.
NR_IRQS:85
irq: clearing subpendingstatus 00000002
Console: colour dummy device80x30
console [ttySAC0] enabled
Calibrating delay loop...199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768minimum: 301
Mount-cache hash tableentries: 512
CPU: Testing write buffercoherency: ok
gpiochip_add: gpios 288..303(GPIOK) failed to register
gpiochip_add: gpios 320..334(GPIOL) failed to register
gpiochip_add: gpios 352..353(GPIOM) failed to register
NET: Registered protocolfamily 16
S3C Power Management,Copyright 2004 Simtec Electronics
S3C2440: Initialisingarchitecture
S3C2440: IRQ Support
S3C24XX DMA Driver,Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000, irq33
DMA channel 1 at c4808040,irq 34
DMA channel 2 at c4808080,irq 35
DMA channel 3 at c48080c0,irq 36
S3C244X: Clock Support, DVSoff
bio: create slab<bio-0> at 0
SCSI subsystem initialized
usbcore: registered newinterface driver usbfs
usbcore: registered newinterface driver hub
usbcore: registered newdevice driver usb
s3c-i2c s3c2440-i2c: slaveaddress 0x10
s3c-i2c s3c2440-i2c: busfrequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0:S3C I2C adapter
Advanced Linux SoundArchitecture Driver Version 1.0.23.
NET: Registered protocolfamily 2
IP route cache hash tableentries: 1024 (order: 0, 4096 bytes)
TCP established hash tableentries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries:2048 (order: 1, 8192 bytes)
TCP: Hash tables configured(established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256(order: 0, 4096 bytes)
UDP-Lite hash table entries:256 (order: 0, 4096 bytes)
NET: Registered protocolfamily 1
RPC: Registered udptransport module.
RPC: Registered tcptransport module.
RPC: Registered tcp NFSv4.1backchannel transport module.
NetWinder Floating PointEmulator V0.97 (extended precision)
JFFS2 version 2.2. (NAND)(SUMMARY) © 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat,Inc.
msgmni has been set to 118
io scheduler noop registered
io scheduler deadlineregistered
io scheduler cfq registered(default)
Console: switching to colourframe buffer device 30x40
fb0: s3c2410fb frame bufferdevice
lp: driver loaded but nodevices found
ppdev: user-space parallelport driver
Serial: 8250/16550 driver, 4ports, IRQ sharing enabled
s3c2440-uart.0:s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1:s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2:s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
loop: module loaded
Uniform Multi-Platform E-IDEdriver
ide-gd driver 1.18
ide-cd driver 5.00
S3C24XX NAND Driver, (c)2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
s3c24xx-nand s3c2440-nand:NAND soft ECC
NAND device: ManufacturerID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for badblocks
Bad eraseblock 1043 at0x000008260000
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
dm9000 Ethernet Driver,V1.31
usbmon: debugfs is notavailable
ohci_hcd: USB 1.1 'Open'Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci:S3C24XX OHCI
s3c2410-ohci s3c2410-ohci:new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci:irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 portsdetected
usbcore: registered newinterface driver libusual
usbcore: registered newinterface driver usbserial
USB Serial supportregistered for generic
usbcore: registered newinterface driver usbserial_generic
usbserial: USB Serial Drivercore
USB Serial supportregistered for FTDI USB Serial Device
usbcore: registered newinterface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDISerial Converters Driver
USB Serial supportregistered for pl2303
usbcore: registered newinterface driver pl2303
pl2303: Prolific PL2303 USBto serial adaptor driver
mice: PS/2 mouse devicecommon for all mice
S3C24XX RTC, (c) 2004,2006Simtec Electronics
S3C2410 Watchdog Timer, (c)2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt:watchdog inactive, reset disabled, irq enabled
No device for DAI UDA134X
No device for DAIs3c24xx-i2s
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocolfamily 17
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
yaffs: dev is 32505859 nameis "mtdblock3" rw
yaffs: passed flags""
VFS: Mounted root(yaffs2 filesystem) on device 31:3.
Freeing init memory: 128K
Please press Enter toactivate this console.
Processing /etc/profile...
Done
[root@tq2440 /]#
到官网http://ftp.denx.de/pub/u-boot/下载u-boot-2012.04.01.tar.bz2
解压后在board/samsung/目录下任然没有2440,虽然没有直接支持2440开发板,但其代码已经支持,只需添加相关配置即可。新版u-boot要使用较新的交叉编译器,我使用的是4.4.3
一、 首先建立自己的开发板
拷贝board/samsung/smdk2410/目录到board/tq2440
root@zjh:/home/work/u-boot-2012.04.01#cp -a board/samsung/smdk2410/ board/tq2440
进入board/tq2440目录修改
root@zjh:/home/work/u-boot-2012.04.01/board/tq2440#mv smdk2410.c tq2440.c
修改该目录下的Makefile
COBJS := tq2440.o
拷贝配置文件
root@zjh:/home/work/u-boot-2012.04.01#cp include/configs/smdk2410.h include/configs/tq2440.h
增加开发板配置选项
在顶层目录下的Makefile中搜索不到smdk2410
在顶层目录执行如下命令
root@zjh:/home/work/u-boot-2012.04.01#grep "smdk2410" . –nR
./boards.cfg:65:smdk2410 arm arm920t - samsung s3c24x0
./MAINTAINERS:750: smdk2410 ARM920T
./board/samsung/smdk2410/Makefile:28:COBJS := smdk2410.o
./arch/arm/include/asm/mach-types.h:1644:#define machine_is_smdk2410() (machine_arch_type== MACH_TYPE_SMDK2410)
./arch/arm/include/asm/mach-types.h:1646:#define machine_is_smdk2410() (0)
知道在顶层目录下的boards.cfg文件中定义了smdk2410开发板的配置选项,仿照它定义TQ2440开发板的配置选项
# Target ARCH CPU Board name Vendor SoC Options
########################################################################################
tq2440 arm arm920t - - s3c24x0
由于我们在board目录下创建开发板目录,所以Vendor指定为空
/*************************************************/
一、 修改时钟
在配置文件include/configstq2440.h中加入S3C2440的配置,屏蔽掉S3C2410的配置
//#defineCONFIG_S3C2410 /* specifically aSAMSUNG S3C2410 SoC */
#define CONFIG_S3C2440
//#defineCONFIG_SMDK2410 /* on a SAMSUNGSMDK2410 Board */
屏蔽一些暂时不用的支持
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#endif
#if 0
#define CONFIG_USB_OHCI
#define CONFIG_USB_KEYBOARD
#define CONFIG_USB_STORAGE
#define CONFIG_DOS_PARTITION
#endif
//#defineCONFIG_CMD_DHCP
//#defineCONFIG_CMD_NAND
//#defineCONFIG_CMD_USB
#if 0
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#defineCONFIG_MTD_PARTITIONS
#define CONFIG_YAFFS2
#define CONFIG_RBTREE
#endif
在arch/arm/cpu/arm920t/start.S添加如下代码
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
# ifdefined(CONFIG_S3C2440)
ldr r1,=0x7fff
ldr r0,=INTSUBMSK
str r1,[r0]
# endif
# ifdefined(CONFIG_S3C2440)
# define MPLLCON 0x4C000004 //系统主频配置寄存器
# define UPLLCON 0x4C000008 //USB频率配置寄存器
# define CAMDIVN 0x4C000018 //照相机时钟分频寄存器
ldr r0, =CAMDIVN
mov r1, #0
str r1, [r0]
ldr r0, =CLKDIVN
mov r1, #0x05
str r1, [r0]
/*如果HDIVN不等于0,CPU必须设置为异步总线模式*/
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
ldr r0, =UPLLCON
ldr r1, =0x38022 // 48MHZ
str r1, [r0]
/*
**When you set MPLL&UPLL values, you haveto set the UPLL
**value first and then the MPLL value. (Needsintervals
**approximately 7 NOP)
*/
nop
nop
nop
nop
nop
nop
nop
ldr r0, =MPLLCON
ldr r1, =0x5c011 //400MHZ
str r1, [r0]
# else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
# endif /*CONFIG_S3C2440 */
#endif /* CONFIG_S3C24X0 */
屏蔽board/tq2440/tq2440.c中board_early_init_f()函数对时钟的设置
#if 0
struct s3c24x0_clock_power * const clk_power =
s3c24x0_get_base_clock_power();
#endif
struct s3c24x0_gpio * const gpio =s3c24x0_get_base_gpio();
#if 0
/* to reduce PLL lock time, adjust the LOCKTIME register */
writel(0xFFFFFF, &clk_power->locktime);
/* configure MPLL */
writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
&clk_power->mpllcon);
/* some delay between MPLL and UPLL */
pll_delay(4000);
/* configure UPLL */
writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,
&clk_power->upllcon);
/* some delay between MPLL and UPLL */
pll_delay(8000);
#endif
在board_init函数中修改机器码
gd->bd->bi_arch_number= MACH_TYPE_S3C2440;
修改代码以支持直接烧到SDRAM运行
修改配置文件include\configs\tq2440.h
#define CONFIG_SYS_TEXT_BASE 0x32000000
#define CONFIG_SKIP_LOWLEVEL_INIT
#defineCONFIG_AUTO_COMPLETE //开启命令自动补全
修改命令提示符
#define CONFIG_SYS_PROMPT "TQ2440# "
修改顶层目录Makefile(根据自己的tftp服务器目录修改,这只是为了以后方便)
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $<$@
$(BOARD_SIZE_CHECK)
cp u-boot.bin/home/tftpboot
配置
root@zjh:/home/work/u-boot-2012.04.01#make tq2440_config
Configuring for tq2440board...
编译
root@zjh:/home/work/u-boot-2012.04.01#make
将u-boot.bin烧到0x32000000地址然后执行
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T #############
done
Bytes transferred = 180536(2c138 hex)
TQ2440 # go 32000000
## Starting application at0x32000000 ...
U-Boot 2012.04.01 (Dec 292012 - 14:00:52)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESETthe board ###卡在这里不动了
搜索“Flash:”
puts("Flash: ");
flash_size = flash_init();
if (flash_size > 0) {
# ifdefCONFIG_SYS_FLASH_CHECKSUM
char *s = getenv("flashchecksum");
print_size(flash_size, "");
/*
* Compute and printflash CRC if flashchecksum is set to 'y'
*
* NOTE: Maybe weshould add some WATCHDOG_RESET()? XXX
*/
if (s && (*s == 'y')) {
printf(" CRC: %08X", crc32(0,
(const unsigned char *) CONFIG_SYS_FLASH_BASE,
flash_size));
}
putc('\n');
# else /* !CONFIG_SYS_FLASH_CHECKSUM */
print_size(flash_size, "\n");
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
} else {
puts(failed);
hang();
}
在看下hang()函数
void hang(void)
{
puts("### ERROR ### Please RESET the board ###\n");
for (;;);
}
从这里可以知道是Flash初始化失败
/******************************************************/
一、 移植NOR FLASH
去掉配置文件include\configs\tq2440.h中的宏并修改代码段基地址
#define CONFIG_SYS_TEXT_BASE 0x0
//#defineCONFIG_SKIP_LOWLEVEL_INIT
在board\tq2440\lowlevel_init.S修改SDRAM’刷新频率
#define REFCNT 0x4f4
该文件中的这三条指令其实可以用一条指令替换adrl r0, SMRDATA
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1
进入/drivers/mtd/cfi_flash.c中的flash_init()函数
在该文件开头定义宏DEBUG打开调试信息
#define DEBUG 1
#define _DEBUG 1
重新编译
用原先的u-boot从NOR FLASH启动,将新u-boot.bin烧到NOR FLASH
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T #############
done
Bytes transferred = 180828(2c25c hex)
TQ2440 # protect off all
Un-Protect Flash Bank # 1
TQ2440 # erase 0 +30000
...... done
Erased 6 sectors
TQ2440 # cp.b 32000000 030000
Copy to Flash...9....8....7....6....5....4....3....2....1....done
TQ2440 #
重启开发板
U-Boot 2012.04.01 (Dec 292012 - 14:25:05)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: fwc addr (null) cmdf0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa00aa 16bit x 16 bit
fwc addr 00005554 cmd 550055 16bit x 16 bit
fwc addr 0000aaaa cmd 900090 16bit x 16 bit
fwc addr (null) cmd f0 00f016bit x 16 bit
JEDEC PROBE: ID 1c2249 0
fwc addr (null) cmd ff 00ff16bit x 16 bit
fwc addr (null) cmd 90 009016bit x 16 bit
fwc addr (null) cmd ff 00ff16bit x 16 bit
JEDEC PROBE: ID 13 ea00 0
*** failed ***
### ERROR ### Please RESETthe board ###
搜索“JEDEC PROBE:”
flash_read_jedec_ids(info);
debug("JEDECPROBE: ID %x %x %x\n",
info->manufacturer_id,
info->device_id,
info->device_id2);
if (jedec_flash_match(info,info->start[0]))
break;
else
unmap_physmem((void*)info->start[0],
MAP_NOCACHE);
drivers\mtd\jedec_flash.c中的jedec_flash_match()函数:
/*-----------------------------------------------------------------------
* match jedec ids against table. If a match isfound, fill flash_info entry
*/
intjedec_flash_match(flash_info_t *info, ulong base)
{
int ret = 0;
int i;
ulong mask = 0xFFFF;
if (info->chipwidth == 1)
mask = 0xFF;
for (i = 0; i < ARRAY_SIZE(jedec_table); i++) {
if ((jedec_table[i].mfr_id & mask) ==(info->manufacturer_id & mask) &&
(jedec_table[i].dev_id & mask) == (info->device_id & mask)) {
fill_info(info, &jedec_table[i], base);
ret = 1;
break;
}
}
return ret;
}
flash_read_jedec_ids(info)读出了我们的开发板的NOR FLASH的厂商ID为0x1c,设备ID为0x2249
jedec_flash_match(info,info->start[0])将读出的信息与jedec_table[]数组进行匹配,如果有匹配成功则填充flashin信息并返回1,否则返回0。说明这里没有匹配成功,需要在jedec_table[]数组中添加我们自己开发板的NOR FLASH信息。
修改配置文件include\configs\tq2440.h
#defineCONFIG_SYS_FLASH_LEGACY_1024Kx16
在drivers\mtd\jedec_flash.c文件中jedec_table[]数组中增加EN29LV160AB的配置根据芯片手册。
#ifdefCONFIG_SYS_FLASH_LEGACY_1024Kx16
/* TQ2440 EN29LV160AB */
{
.mfr_id = 0x1c, /* 厂商ID */
.dev_id = 0x2249, /* 设备ID */
.name = "EON EN29LV160AB",
.uaddr = {/* 因为NOR FLASH的ADDR0接到了S3C2440的ADDR1 */
[1] = MTD_UADDR_0x0555_0x02AA/* x16 */
},
.DevSize = SIZE_2MiB,
.CmdSet = P_ID_AMD_STD,
.NumEraseRegions= 4,
.regions = {
ERASEINFO(0x04000, 1),
ERASEINFO(0x02000, 2),
ERASEINFO(0x08000, 1),
ERASEINFO(0x10000, 31),
}
},
#endif
重新编译通过工具将u-boot.bin烧写到NOR FLASH
U-Boot 2012.04.01 (Dec 292012 - 15:26:09)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: fwc addr (null) cmdf0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa00aa 16bit x 16 bit
fwc addr 00005554 cmd 550055 16bit x 16 bit
fwc addr 0000aaaa cmd 900090 16bit x 16 bit
fwc addr (null) cmd f0 00f016bit x 16 bit
JEDEC PROBE: ID 1c 2249 0
ERROR: too manyflash sectors
2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
TQ2440 #
出现一个错误ERROR: too many flash sectors
修改配置文件include\configs\tq2440.h
#defineCONFIG_SYS_MAX_FLASH_SECT (35)
取消调试信息drivers\mtd\cfi_flash.c
//#define DEBUG 1
//#define _DEBUG 1
重新编译
U-Boot 2012.04.01 (Dec 292012 - 15:33:09)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
TQ2440 # fflinfo
Bank # 1: EON EN29LV160ABflash (16 x 16) Size: 2 MB in 35 Sectors
AMD Legacy command set, Manufacturer ID:0x1C, Device ID: 0x2249
Erase timeout: 30000 ms, write timeout: 100ms
Sector Start Addresses:
00000000 RO 00004000 RO 00006000 RO 00008000 RO 00010000 RO
00020000 RO 00030000 00040000 00050000 00060000
00070000 RO 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 00100000
00110000 00120000 00130000 00140000 00150000
00160000 00170000 00180000 00190000 001A0000
001B0000 001C0000 001D0000 001E0000 001F0000
TQ2440 # md.b 32000000 a
32000000: 13 00 00 ea 14 f09f e5 14 f0 ..........
TQ2440 # erase 100000 +a
. done
Erased 1 sectors
TQ2440 # cp.b 32000000100000 a
Copy to Flash... done
TQ2440 # md.b 100000 a
00100000: 13 00 00 ea 14 f09f e5 14 f0 ..........
/******************************************************/
一、 移植网卡DM9000
在配置文件include\configs\tq2440.h中添加DM9000的配置信息
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#endif
#defineCONFIG_DRIVER_DM9000
#defineCONFIG_DM9000_NO_SROM 1
#defineCONFIG_DM9000_BASE 0x20000000
#defineDM9000_IO CONFIG_DM9000_BASE
#defineDM9000_DATA (CONFIG_DM9000_BASE + 4)
修改IP地址,添加MAC地址(也可在u-boot启动后通过setenv命令设置)
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.2.100
#define CONFIG_SERVERIP 192.168.2.209
#define CONFIG_ETHADDR 00:0c:29:4d:e4:f4
修改board\tq2440\tq2440.c
int board_eth_init(bd_t*bis)
{
int rc = 0;
#ifdef CONFIG_CS8900
rc = cs8900_initialize(0, CONFIG_CS8900_BASE);
#endif
#ifdefCONFIG_DRIVER_DM9000
rc = dm9000_initialize(bis);
#endif
return rc;
}
重新编译烧到NOR FLASH执行
U-Boot 2012.04.01 (Dec 292012 - 15:58:53)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: dm9000
TQ2440 #
现在可以用tftpboot命令通过网络下载文件了,前提是确保服务器IP和开发板u-boot的IP在同一个网段。
TQ2440 # pri
baudrate=115200
bootdelay=5
ethact=dm9000
ethaddr=00:0c:29:4d:e4:f4
ipaddr=172.28.12.10
netmask=255.255.255.0
serverip=172.28.12.60
stderr=serial
stdin=serial
stdout=serial
Environment size: 194/65532bytes
TQ2440 # tftp 32000000 u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
could notestablish link
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: #############
done
Bytes transferred = 183576(2cd18 hex)
出现一个错误could not establish link
解决错误并加快速度
修改drivers\net\dm9000x.c
#if 0
i = 0;
while (!(dm9000_phy_read(1) & 0x20)) { /* autonegation complete bit */
udelay(1000);
i++;
if (i == 10000) {
printf("could not establish link\n");
return 0;
}
}
/* see what we've got */
lnk = dm9000_phy_read(17) >> 12;
printf("operating at ");
switch (lnk) {
case 1:
printf("10M half duplex ");
break;
case 2:
printf("10M full duplex ");
break;
case 4:
printf("100M half duplex ");
break;
case 8:
printf("100M full duplex ");
break;
default:
printf("unknown: %d ", lnk);
break;
}
printf("mode\n");
#endif
重新编译烧到NOR FLASH运行
U-Boot 2012.04.01 (Dec 292012 - 17:14:04)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: dm9000
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T #############
done
Bytes transferred = 182996(2cad4 hex)
TQ2440 #
/************************************************/
一、 支持NAND FLASH读写
修改配置文件include\configs\tq2440.h打开之前注释掉的NAND相关的宏
#defineCONFIG_CMD_NAND
#define CONFIG_ENV_IS_IN_NAND
#define CONFIG_ENV_OFFSET0x40000
#define CONFIG_ENV_SIZE 0x20000
编译出错
iteral-Wno-format-security -os3c2410_nand.o s3c2410_nand.c -c
s3c2410_nand.c: In function's3c2410_hwcontrol':
s3c2410_nand.c:57: warning:implicit declaration of function 's3c2410_get_base_nand'
s3c2410_nand.c:57: warning:initialization makes pointer from integer without a cast
s3c2410_nand.c:72: error:dereferencing pointer to incomplete type
s3c2410_nand.c:72: error:dereferencing pointer to incomplete type
s3c2410_nand.c:75: error:dereferencing pointer to incomplete type
s3c2410_nand.c:75: error:dereferencing pointer to incomplete type
s3c2410_nand.c: In function's3c2410_dev_ready':
s3c2410_nand.c:85: warning:initialization makes pointer from integer without a cast
s3c2410_nand.c:87: error:dereferencing pointer to incomplete type
s3c2410_nand.c: In function'board_nand_init':
s3c2410_nand.c:129: warning:initialization makes pointer from integer without a cast
s3c2410_nand.c:150: error:dereferencing pointer to incomplete type
s3c2410_nand.c:153: error:dereferencing pointer to incomplete type
s3c2410_nand.c:154: error:dereferencing pointer to incomplete type
make[1]: ***[s3c2410_nand.o] Error 1
make[1]: Leaving directory`/home/work/u-boot-2012.04.01/drivers/mtd/nand'
make: ***[drivers/mtd/nand/libnand.o] Error 2
将drivers/mtd/nand/s3c2410_nand.c拷贝为drivers/mtd/nand/s3c2440_nand.c
root@zjh:/home/work/u-boot-2012.04.01#cp drivers/mtd/nand/s3c2410_nand.c drivers/mtd/nand/s3c2440_nand.c
在drivers/mtd/nand/Makefile文件中增加一行
COBJS-$(CONFIG_NAND_S3C2440)+= s3c2440_nand.o
将s3c2440_nand.c中所有的2410替换为2440
修改配置文件include\configs\tq2440.h
#define CONFIG_NAND_S3C2440
#define CONFIG_SYS_S3C2440_NAND_HWECC
修改drivers\mtd\nand\s3c2440_nand.c中的board_nand_init()函数
#ifdefined(CONFIG_S3C24XX_CUSTOM_NAND_TIMING)
tacls =CONFIG_S3C24XX_TACLS;
twrph0 = CONFIG_S3C24XX_TWRPH0;
twrph1 = CONFIG_S3C24XX_TWRPH1;
#else
tacls = 0;
twrph0 = 1;
twrph1 = 0;
#endif
#if 0
cfg = S3C2440_NFCONF_EN;
cfg |= S3C2440_NFCONF_TACLS(tacls - 1);
cfg |= S3C2440_NFCONF_TWRPH0(twrph0 - 1);
cfg |= S3C2440_NFCONF_TWRPH1(twrph1 - 1);
#endif
cfg = (tacls << 12)|(twrph0 << 8)|(twrph1 << 4);
writel(cfg, &nand_reg->nfconf);
/*初始化ECC、禁止片选、使能NANDFLASH控制器*/
writel((1 << 4)|(1 << 1)|(1<< 0), &nand_reg->nfcont);
nand->select_chip = s3c2440_nand_select;
添加函数s3c2440_nand_select
static voids3c2440_nand_select(struct mtd_info *mtd, int chipnr)
{
structs3c2440_nand *nand = s3c2440_get_base_nand();
switch(chipnr) {
case-1: /* 取消选中 */
nand->nfcont |= (1<<1);
break;
case0: /* 选中 */
nand->nfcont&= ~(1<<1);
break;
default:
BUG();
}
}
修改s3c2440_hwcontrol()函数
/*
** ctrl:表示做什么(选中芯片/取消选中,发命令还是发地址)
** cmd:命令值或地址值
*/
static voids3c2440_hwcontrol(struct mtd_info *mtd, int cmd, unsigned int ctrl)
{
struct s3c2440_nand*nand = s3c2440_get_base_nand();
if(ctrl & NAND_CLE) {
/*发命令 */
writeb(cmd,&nand->nfcmd);
}else if (ctrl & NAND_ALE) {
/* 发地址 */
writeb(cmd,&nand->nfaddr);
}
}
重新编译烧到NOR FLASh执行
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T ################
done
Bytes transferred = 226588(3751c hex)
TQ2440 # pro off all
Un-Protect Flash Bank # 1
TQ2440 # erase 0 +40000
....... done
Erased 7 sectors
TQ2440 # cp.b 32000000 040000
Copy to Flash...9....8....7....6....5....4....3....2....1....done
TQ2440 # res
resetting ...
U-Boot 2012.04.01 (Dec 292012 - 21:53:59)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: 2 MiB
NAND: 256 MiB
*** Warning - bad CRC, usingdefault environment
In: serial
Out: serial
Err: serial
Net: dm9000
TQ2440 #
测试
将SDRAM的0x32000000地址的0xff字节数据写到NAND FLASH的0地址
TQ2440 # nand write 320000000 ff
NAND write: device 0 offset0x0, size 0xff
255 bytes written: OK
从NAND FLASH的0地址读0xff字节数据到SDRAM的0x31000000地址
TQ2440 # nand read 310000000 ff
NAND read: device 0 offset0x0, size 0xff
255 bytes read: OK
比较
TQ2440 # cmp.b 3100000032000000 ff
/*******************************************************/
一、 支持NAND FLASH启动
新版u-boot在链接时加了“-pie”选项
-pie
Produce a position independentexecutable on targets which support it. For predictable results, you must also specify the same set of optionsthat were used to generate code (-fpie, -fPIE, or model suboptions) when youspecify this option.
产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意
位置,都可以正确的执行。
最终u-boot.bin中多了这些段
.rel.dyn : {
__rel_dyn_start = .;
*(.rel*)
__rel_dyn_end = .;
}
.dynsym : {
__dynsym_start = .;
*(.dynsym)
}
从NOR FLASH把代码复制到SDRAM,程序的链接地址是0,访问全局变量、静态变量、调用函数时是使用基于0地址编译得到的地址,现在把程序复制到了SDRAM(0x3000000),需要修改代码,把原来的地址改为新地址。这样太复杂了,我还是使用老版本的方法。
去掉“-pie”选项,在u-boot源码搜索“-pie”
root@zjh:/home/work/u-boot-2012.04.01#grep "\-pie" . -nR
./doc/README.arm-relocation:3:Atarch level: add linker flag -pie
./arch/x86/config.mk:43:LDFLAGS_FINAL+= --gc-sections -pie
./arch/arm/config.mk:75:LDFLAGS_u-boot+= -pie
去除arch/arm/config.mk:75:LDFLAGS_u-boot += -pie中的“-pie”
# needed for relocation
ifndef CONFIG_NAND_SPL
#LDFLAGS_u-boot +=-pie
endif
修改配置文件include\configs\tq2440.h,给u-boot分配512KB
#define CONFIG_SYS_TEXT_BASE 0x33f80000
增加文件board\tq2440\nand_read_ll.c并修改相应的Makefile
COBJS := tq2440.onand_read_ll.o
Nand_read_ll.c文件内容如下:
/* NAND FLASH控制器 */
#define NFCONF(*((volatile unsigned long *)0x4E000000))
#define NFCONT(*((volatile unsigned long *)0x4E000004))
#define NFCMMD(*((volatile unsigned char *)0x4E000008))
#define NFADDR(*((volatile unsigned char *)0x4E00000C))
#define NFDATA(*((volatile unsigned char *)0x4E000010))
#define NFSTAT(*((volatile unsigned char *)0x4E000020))
static intisBootFromNorFlash(void)
{
volatile int *p = (volatile int *)0;
int val;
val = *p;
*p = 0x12345678;
if (*p == 0x12345678) {
/* 写成功,是nand启动 */
*p = val;
return 0;
} else {
/* NOR不能像内存一样写 */
return 1;
}
}
voidclear_bss(void)
{
extern int __bss_start, __bss_end__;
int *p = &__bss_start;
for (; p < &__bss_end__; p++)
*p = 0;
}
void nand_init_ll(void)
{
#define TACLS 0
#defineTWRPH0 1
#defineTWRPH1 0
/* 设置时序 */
NFCONF =(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
/* 使能NAND Flash控制器,初始化ECC, 禁止片选 */
NFCONT =(1<<4)|(1<<1)|(1<<0);
}
static voidnand_select(void)
{
NFCONT &= ~(1<<1);
}
static voidnand_deselect(void)
{
NFCONT |= (1<<1);
}
static voidnand_cmd(unsigned char cmd)
{
volatile int i;
NFCMMD = cmd;
for (i = 0; i < 10; i++);
}
static voidnand_addr(unsigned int addr)
{
unsigned int col = addr % 2048;
unsigned int page = addr / 2048;
volatile int i;
NFADDR = col & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (col >> 8) & 0xff;
for (i = 0; i < 10; i++);
NFADDR = page & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 8) & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 16) & 0xff;
for (i = 0; i < 10; i++);
}
static voidnand_wait_ready(void)
{
while (!(NFSTAT & 1));
}
static unsignedchar nand_data(void)
{
return NFDATA;
}
voidnand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
int col = addr % 2048;
int i = 0;
/* 1. 选中 */
nand_select();
while (i < len) {
/* 2. 发出读命令00h */
nand_cmd(0x00);
/* 3. 发出地址(分5步发出) */
nand_addr(addr);
/* 4. 发出读命令30h */
nand_cmd(0x30);
/* 5. 判断状态 */
nand_wait_ready();
/* 6. 读数据 */
for (; (col < 2048) && (i< len); col++) {
buf[i] = nand_data();
i++;
addr++;
}
col = 0;
}
/* 7. 取消选中 */
nand_deselect();
}
voidcopy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
int i = 0;
/* 如果是NOR启动 */
if (isBootFromNorFlash()) {
while (i < len) {
dest[i] = src[i];
i++;
}
} else {
nand_init_ll();
nand_read_ll((unsigned int)src, dest,len);
}
}
修改arch\arm\cpu\arm920t\start.S
call_board_init_f:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
bic sp, sp, #7 /* 8-byte alignment for ABIcompliance */
ldr r0,=0x00000000
ldr r1, _TEXT_BASE
ldr r2, _bss_start_ofs
bl copy_code_to_sdram
bl clear_bss
ldr pc, = board_init_f /* 跳转到SDRAM */
.globl second
second:
/* 调用第2阶段的代码 */
bl board_init_r
注释掉以下代码
#if 0
.globl relocate_code
relocate_code:
mov r4, r0 /* save addr_sp */
mov r5, r1 /* save addr of gd */
mov r6, r2 /* save addr of destination */
/* Set up the stack */
stack_setup:
mov sp, r4
adr r0, _start
cmp r0, r6
beq clear_bss /* skip relocation */
mov r1, r6 /* r1 <- scratch forcopy_loop */
ldr r3, _bss_start_ofs
add r2, r0, r3 /* r2 <- source end address */
copy_loop:
ldmia r0!, {r9-r10} /* copy from source address[r0] */
stmia r1!, {r9-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end address[r2] */
blo copy_loop
#ifndef CONFIG_SPL_BUILD
/*
* fix .rel.dynrelocations
*/
ldr r0, _TEXT_BASE /* r0 <- Text base */
sub r9, r6, r0 /* r9 <- relocation offset */
ldr r10,_dynsym_start_ofs /* r10 <- sym tableofs */
add r10, r10, r0 /* r10 <- sym table in FLASH */
ldr r2,_rel_dyn_start_ofs /* r2 <- reldyn start ofs */
add r2, r2, r0 /* r2 <- rel dyn start in FLASH */
ldr r3, _rel_dyn_end_ofs /* r3 <- rel dyn end ofs */
add r3, r3, r0 /* r3 <- rel dyn end in FLASH */
fixloop:
ldr r0, [r2] /* r0 <- location to fix up, INFLASH! */
add r0, r0, r9 /* r0 <- location to fix up in RAM*/
ldr r1, [r2, #4]
and r7, r1, #0xff
cmp r7, #23 /* relative fixup? */
beq fixrel
cmp r7, #2 /* absolute fixup? */
beq fixabs
/* ignore unknown type of fixup */
b fixnext
fixabs:
/* absolute fix: set location to (offset) symbol value */
mov r1, r1, LSR #4 /* r1 <- symbol index in .dynsym */
add r1, r10, r1 /* r1 <- address of symbol in table*/
ldr r1, [r1, #4] /* r1 <- symbol value */
add r1, r1, r9 /* r1 <- relocated sym addr */
b fixnext
fixrel:
/* relative fix: increase location by offset */
ldr r1, [r0]
add r1, r1, r9
fixnext:
str r1, [r0]
add r2, r2, #8 /* each rel.dyn entry is 8 bytes */
cmp r2, r3
blo fixloop
#endif
clear_bss:
#ifndef CONFIG_SPL_BUILD
ldr r0, _bss_start_ofs
ldr r1, _bss_end_ofs
mov r4, r6 /* reloc addr */
add r0, r0, r4
add r1, r1, r4
mov r2, #0x00000000 /* clear */
clbss_l:str r2, [r0] /*clear loop... */
add r0, r0, #4
cmp r0, r1
bne clbss_l
bl coloured_LED_init
bl red_led_on
#endif
#endif
修改arch\arm\lib\board.c中的函数board_init_f
//addr -=gd->mon_len;
//addr &=~(4096 - 1);
addr =CONFIG_SYS_TEXT_BASE;
注视最后的重定位,并跳转到刚才定义的second
//relocate_code(addr_sp,id, addr);
second(id, addr);
修改链接脚本arch\arm\cpu\u-boot.lds把start.o、nand_read_ll.o、lowlevel_init.o编译到前面4k
CPUDIR/start.o (.text)
board/tq2440/libtq2440.o(.text)
重新编译,烧到NAND FLASH
TQ2440 # nand erase 040000;tftp 32000000 u-boot.bin;nand write 32000000 0 40000
NAND erase: device 0 offset0x0, size 0x40000
Erasing at 0x20000 -- 100%complete.
OK
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T ###############
done
Bytes transferred = 208508(32e7c hex)
NAND write: device 0 offset0x0, size 0x40000
262144 bytes written: OK
TQ2440 #
从NAND FLASH启动
U-Boot 2012.04.01 (Dec 312012 - 11:57:16)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESETthe board ###
由于从NAND启动,CPU检测不到NOR FLASH,具体代码如下arch\arm\lib\board.c
#if!defined(CONFIG_SYS_NO_FLASH)
puts("Flash: ");
flash_size = flash_init();
if (flash_size > 0) {
# ifdefCONFIG_SYS_FLASH_CHECKSUM
char *s = getenv("flashchecksum");
print_size(flash_size, "");
/*
* Compute and printflash CRC if flashchecksum is set to 'y'
*
* NOTE: Maybe weshould add some WATCHDOG_RESET()? XXX
*/
if (s && (*s == 'y')) {
printf(" CRC: %08X", crc32(0,
(const unsigned char *) CONFIG_SYS_FLASH_BASE,
flash_size));
}
putc('\n');
# else /* !CONFIG_SYS_FLASH_CHECKSUM */
print_size(flash_size, "\n");
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
} else {
puts(failed);
hang();
}
#endif
void hang(void)
{
puts("### ERROR ### Please RESET the board ###\n");
for (;;);
}
我们直接注释掉上面的hang();
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
} else {
puts(failed);
//hang();
}
#endif
重新编译,烧到NAND FLASH,从NAND启动
U-Boot 2012.04.01 (Dec 31 2012- 12:27:20)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
NAND: 256 MiB
卡在这里,检查后发现修改start.S的时候调用第二阶段代码没有重新设置栈指针,做如下修改
board.c中的board_init_f函数
//relocate_code(addr_sp, id,addr);
second(id, addr, addr_sp);
start.S
second:
mov sp, r2 /*重新设置栈指针 */
/* 调用第2阶段的代码 */
bl board_init_r
重新编译,烧到NAND,从NAND启动
U-Boot 2012.04.01 (Dec 312012 - 12:31:58)
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
TQ2440 #
一、 添加分区信息并启动jffs2文件系统
烧写之前的内核看输出分区信息
TQ2440 # tftp 32000000uImage
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'uImage'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
################
done
Bytes transferred = 2138388(20a114 hex)
TQ2440 # bootm 32000000
…………
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
…………
修改配置文件include\configs\tq2440.h打开之前屏蔽的MTDPARTS命令的宏
#if 0
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#endif
#define CONFIG_CMD_MTDPARTS
#if 0
#define CONFIG_MTD_DEVICE
#defineCONFIG_MTD_PARTITIONS
#define CONFIG_YAFFS2
#define CONFIG_RBTREE
#endif
添加如下分区信息
#define CONFIG_MTD_DEVICE
#defineMTDIDS_DEFAULT "nand0=tq2440-0" /*哪一个设备 */
#defineMTDPARTS_DEFAULT "mtdparts=tq2440-0:256k(u-boot)," \
"128k(params)," \
"3m(kernel)," \
"-(rootfs)" \
重新编译,烧到开发板并启动
U-Boot 2012.04.01 (Dec 312012 - 16:52:29)
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
TQ2440 # mtdparts default第一次启动首先执行mtdparts default
TQ2440 # save
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x40000 -- 100% complete.
Writing to Nand... done
TQ2440 # mtdparts
device nand0<tq2440-0>, # parts = 4
#: name size offset mask_flags
0: u-boot 0x00040000 0x00000000 0
1: params 0x00020000 0x00040000 0
2: kernel 0x00300000 0x00060000 0
3: rootfs 0x0fca0000 0x00360000 0
active partition: nand0,0 -(u-boot) 0x00040000 @ 0x00000000
defaults:
mtdids : nand0=tq2440-0
mtdparts:mtdparts=tq2440-0:256k(u-boot),128k(params),3m(kernel),-(rootfs)
TQ2440 # nand erase.part kernel
NAND erase.part: device 0offset 0x60000, size 0x400000
Erasing at 0x440000 -- 100%complete.
OK
TQ2440 # tftp 32000000 uImage
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'uImage'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
################
done
Bytes transferred = 2138388(20a114 hex)
TQ2440 # nand write 32000000 kernel
NAND write: device 0 offset0x60000, size 0x400000
4194304 bytes written: OK
设置启动参数
TQ2440 # set bootcmd nand read 32000000 kernel\;bootm 32000000
TQ2440 # save
Saving Environment toNAND...
Erasing Nand...
Erasing at 0x40000 -- 100%complete.
Writing to Nand... done
烧写jffs2文件系统
TQ2440 # tftpboot 32000000 rootfs.jffs2
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'rootfs.jffs2'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
#################################################################
############################
done
Bytes transferred = 3262836(31c974 hex)
TQ2440 # nand erase.part rootfs
NAND erase.part: device 0offset 0x460000, size 0xfba0000
Skipping bad block at 0x08260000
Erasing at 0xffe0000 -- 100%complete.
OK
TQ2440 # nand write 32000000 rootfs $filesize
NAND write: device 0 offset0x460000, size 0x31c974
3262836 bytes written: OK
设置启动参数
TQ2440 # set bootargs root=/dev/mtdblock3 rootfstype=jffs2init=/linuxrc console=ttySAC0,115200
TQ2440 # save
Saving Environment toNAND...
Erasing Nand...
Erasing at 0x40000 -- 100%complete.
Writing to Nand... done
TQ2440 # res 重启
resetting ...
U-Boot 2012.04.01 (Dec 31 2012- 16:52:29)
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 stopautoboot: 0
NAND read: device 0 offset0x60000, size 0x300000
3145728 bytes read: OK
## Booting kernel fromLegacy Image at 32000000 ...
Image Name: Linux-2.6.36.4
Created: 2012-12-31 8:37:05 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2138324 Bytes = 2 MiB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done,booting the kernel.
Linux version 2.6.36.4(root@zjh) (gcc version 4.4.3 (ctng-1.6.1) ) #4 Mon Dec 31 16:36:50 CST 2012
CPU: ARM920T [41129200]revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVTinstruction cache
Machine: SMDK2440
Memory policy: ECC disabled,Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright2004 Simtec Electronics
S3C244X: core 400.000 MHz,memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zoneorder, mobility grouping on. Totalpages: 16256
Kernel command line:root=/dev/mtdblock3 rootfstype=jffs2 init=/linuxrc console=ttySAC0,115200
PID hash table entries: 256(order: -2, 1024 bytes)
Dentry cache hash table entries:8192 (order: 3, 32768 bytes)
Inode-cache hash tableentries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60620k/60620kavailable, 4916k reserved, 0K highmem
Virtual kernel memorylayout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16MB)
.init : 0xc0008000 - 0xc0028000 ( 128 kB)
.text : 0xc0028000 - 0xc03d1000 (3748 kB)
.data : 0xc03ea000 - 0xc040cac0 ( 139 kB)
Hierarchical RCUimplementation.
RCU-based detection of stalled CPUs isdisabled.
Verbose stalled-CPUs detection isdisabled.
NR_IRQS:85
irq: clearing subpendingstatus 00000002
Console: colour dummy device80x30
console [ttySAC0] enabled
Calibrating delay loop...199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768minimum: 301
Mount-cache hash tableentries: 512
CPU: Testing write buffercoherency: ok
gpiochip_add: gpios 288..303(GPIOK) failed to register
gpiochip_add: gpios 320..334(GPIOL) failed to register
gpiochip_add: gpios 352..353(GPIOM) failed to register
NET: Registered protocolfamily 16
S3C Power Management,Copyright 2004 Simtec Electronics
S3C2440: Initialisingarchitecture
S3C2440: IRQ Support
S3C24XX DMA Driver,Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000,irq 33
DMA channel 1 at c4808040, irq34
DMA channel 2 at c4808080,irq 35
DMA channel 3 at c48080c0,irq 36
S3C244X: Clock Support, DVSoff
bio: create slab<bio-0> at 0
SCSI subsystem initialized
usbcore: registered newinterface driver usbfs
usbcore: registered newinterface driver hub
usbcore: registered newdevice driver usb
s3c-i2c s3c2440-i2c: slaveaddress 0x10
s3c-i2c s3c2440-i2c: busfrequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0:S3C I2C adapter
Advanced Linux SoundArchitecture Driver Version 1.0.23.
NET: Registered protocolfamily 2
IP route cache hash tableentries: 1024 (order: 0, 4096 bytes)
TCP established hash tableentries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries:2048 (order: 1, 8192 bytes)
TCP: Hash tables configured(established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256(order: 0, 4096 bytes)
UDP-Lite hash table entries:256 (order: 0, 4096 bytes)
NET: Registered protocolfamily 1
RPC: Registered udptransport module.
RPC: Registered tcptransport module.
RPC: Registered tcp NFSv4.1backchannel transport module.
NetWinder Floating PointEmulator V0.97 (extended precision)
JFFS2 version 2.2. (NAND)(SUMMARY) © 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat,Inc.
msgmni has been set to 118
io scheduler noop registered
io scheduler deadlineregistered
io scheduler cfq registered(default)
Console: switching to colourframe buffer device 30x40
fb0: s3c2410fb frame bufferdevice
lp: driver loaded but nodevices found
ppdev: user-space parallelport driver
Serial: 8250/16550 driver, 4ports, IRQ sharing enabled
s3c2440-uart.0:s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1:s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2:s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
loop: module loaded
Uniform Multi-Platform E-IDEdriver
ide-gd driver 1.18
ide-cd driver 5.00
S3C24XX NAND Driver, (c)2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
s3c24xx-nand s3c2440-nand:NAND soft ECC
NAND device: ManufacturerID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for badblocks
Bad eraseblock 1043 at0x000008260000
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
dm9000 Ethernet Driver,V1.31
usbmon: debugfs is notavailable
ohci_hcd: USB 1.1 'Open'Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci:S3C24XX OHCI
s3c2410-ohci s3c2410-ohci:new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci:irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 portsdetected
usbcore: registered newinterface driver libusual
usbcore: registered newinterface driver usbserial
USB Serial supportregistered for generic
usbcore: registered newinterface driver usbserial_generic
usbserial: USB Serial Drivercore
USB Serial supportregistered for FTDI USB Serial Device
usbcore: registered newinterface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDISerial Converters Driver
USB Serial supportregistered for pl2303
usbcore: registered newinterface driver pl2303
pl2303: Prolific PL2303 USBto serial adaptor driver
mice: PS/2 mouse devicecommon for all mice
S3C24XX RTC, (c) 2004,2006Simtec Electronics
S3C2410 Watchdog Timer, (c)2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt:watchdog inactive, reset disabled, irq enabled
No device for DAI UDA134X
No device for DAIs3c24xx-i2s
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocolfamily 17
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
VFS: Mounted root (jffs2filesystem) on device 31:3.
Freeing init memory: 128K
Please press Enter toactivate this console.
Processing /etc/profile...
Done
[root@tq2440 /]#
/**********************************/
一、 支持yaffs烧写文件系统
先直接烧写试一下
TQ2440 # nand write.yaffs32000000 rootfs $filesize
NAND write: device 0 offset0x360000, size 0x614ac0
Unknown nandcommand suffix '.yaffs'.
不认识的后缀‘.yaffs’
搜索.yaffs
Cmd_nand.c(u-boot-2012.04.01\common): } elseif (!strcmp(s, ".yaffs")) {
#ifdefCONFIG_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
因为没有定义上面那个宏,修改配置文件include\configs\tq2440.h添加该宏
#defineCONFIG_CMD_NAND_YAFFS
重新编译,烧到开发板并重启,再次烧写yaffs文件系统
TQ2440 # nand erase 040000;tftp 32000000 u-boot.bin;nand write 32000000 0 40000
重启
TQ2440 # tftp 32000000rootfs.yaffs;nand erase.part rootfs;nand write.yaffs 32000000 rootfs $filesize
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'rootfs.yaffs'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
#################################################################
done
Bytes transferred = 6376128(614ac0 hex)
NAND erase.part: device 0offset 0x360000, size 0xfca0000
Skipping bad block at 0x08260000
Erasing at 0xffe0000 -- 100%complete.
OK
NAND write: device 0 offset0x360000, size 0x614ac0
6376128 bytes written: OK
TQ2440 # set bootargs root=/dev/mtdblock3 rootfstype=yaffs2init=/linuxrc console=ttySAC0,115200
TQ2440 # res 重启
resetting ...
U-Boot 2012.04.01 (Dec 312012 - 18:46:42)
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 stopautoboot: 0
NAND read: device 0 offset0x60000, size 0x300000
3145728 bytes read: OK
## Booting kernel from LegacyImage at 32000000 ...
Image Name: Linux-2.6.36.4
Created: 2012-12-31 10:56:09 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2186324 Bytes = 2.1 MiB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done,booting the kernel.
Linux version 2.6.36.4(root@zjh) (gcc version 4.4.3 (ctng-1.6.1) ) #5 Mon Dec 31 18:55:35 CST 2012
CPU: ARM920T [41129200]revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVTinstruction cache
Machine: SMDK2440
Memory policy: ECC disabled,Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright2004 Simtec Electronics
S3C244X: core 400.000 MHz,memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zoneorder, mobility grouping on. Totalpages: 16256
Kernel command line:root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200
PID hash table entries: 256(order: -2, 1024 bytes)
Dentry cache hash tableentries: 8192 (order: 3, 32768 bytes)
Inode-cache hash tableentries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60532k/60532kavailable, 5004k reserved, 0K highmem
Virtual kernel memorylayout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16MB)
.init : 0xc0008000 - 0xc0028000 ( 128 kB)
.text : 0xc0028000 - 0xc03e8000 (3840 kB)
.data : 0xc0400000 - 0xc0422b80 ( 139 kB)
Hierarchical RCUimplementation.
RCU-based detection of stalled CPUs isdisabled.
Verbose stalled-CPUs detection isdisabled.
NR_IRQS:85
irq: clearing subpendingstatus 00000002
Console: colour dummy device80x30
console [ttySAC0] enabled
Calibrating delay loop...199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768minimum: 301
Mount-cache hash tableentries: 512
CPU: Testing write buffercoherency: ok
gpiochip_add: gpios 288..303(GPIOK) failed to register
gpiochip_add: gpios 320..334(GPIOL) failed to register
gpiochip_add: gpios 352..353(GPIOM) failed to register
NET: Registered protocolfamily 16
S3C Power Management,Copyright 2004 Simtec Electronics
S3C2440: Initialisingarchitecture
S3C2440: IRQ Support
S3C24XX DMA Driver,Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000,irq 33
DMA channel 1 at c4808040,irq 34
DMA channel 2 at c4808080,irq 35
DMA channel 3 at c48080c0,irq 36
S3C244X: Clock Support, DVSoff
bio: create slab<bio-0> at 0
SCSI subsystem initialized
usbcore: registered newinterface driver usbfs
usbcore: registered newinterface driver hub
usbcore: registered newdevice driver usb
s3c-i2c s3c2440-i2c: slaveaddress 0x10
s3c-i2c s3c2440-i2c: busfrequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0:S3C I2C adapter
Advanced Linux SoundArchitecture Driver Version 1.0.23.
NET: Registered protocolfamily 2
IP route cache hash tableentries: 1024 (order: 0, 4096 bytes)
TCP established hash tableentries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries:2048 (order: 1, 8192 bytes)
TCP: Hash tables configured(established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256(order: 0, 4096 bytes)
UDP-Lite hash table entries:256 (order: 0, 4096 bytes)
NET: Registered protocolfamily 1
RPC: Registered udptransport module.
RPC: Registered tcptransport module.
RPC: Registered tcp NFSv4.1backchannel transport module.
NetWinder Floating PointEmulator V0.97 (extended precision)
JFFS2 version 2.2. (NAND)(SUMMARY) © 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat,Inc.
msgmni has been set to 118
io scheduler noop registered
io scheduler deadlineregistered
io scheduler cfq registered(default)
Console: switching to colourframe buffer device 30x40
fb0: s3c2410fb frame bufferdevice
lp: driver loaded but nodevices found
ppdev: user-space parallelport driver
Serial: 8250/16550 driver, 4ports, IRQ sharing enabled
s3c2440-uart.0:s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1:s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2:s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
loop: module loaded
Uniform Multi-Platform E-IDEdriver
ide-gd driver 1.18
ide-cd driver 5.00
S3C24XX NAND Driver, (c)2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
s3c24xx-nand s3c2440-nand:NAND soft ECC
NAND device: ManufacturerID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for badblocks
Bad eraseblock 1043 at0x000008260000
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
dm9000 Ethernet Driver,V1.31
usbmon: debugfs is notavailable
ohci_hcd: USB 1.1 'Open'Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci:S3C24XX OHCI
s3c2410-ohci s3c2410-ohci:new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci:irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 portsdetected
usbcore: registered newinterface driver libusual
usbcore: registered newinterface driver usbserial
USB Serial supportregistered for generic
usbcore: registered newinterface driver usbserial_generic
usbserial: USB Serial Drivercore
USB Serial supportregistered for FTDI USB Serial Device
usbcore: registered newinterface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDISerial Converters Driver
USB Serial supportregistered for pl2303
usbcore: registered newinterface driver pl2303
pl2303: Prolific PL2303 USBto serial adaptor driver
mice: PS/2 mouse devicecommon for all mice
S3C24XX RTC, (c) 2004,2006Simtec Electronics
S3C2410 Watchdog Timer, (c)2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt:watchdog inactive, reset disabled, irq enabled
No device for DAI UDA134X
No device for DAIs3c24xx-i2s
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocolfamily 17
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
yaffs: dev is32505859 name is "mtdblock3" rw
yaffs: passedflags ""
VFS: Mounted root(yaffs2 filesystem) on device 31:3.
Freeing initmemory: 128K
Failed to execute/linuxrc. Attempting defaults...
Kernel panic - notsyncing: No init found. Try passinginit= option to kernel. See Linux Documentation/init.txt for guidance.
[<c002e344>](unwind_backtrace+0x0/0xf0) from [<c02ff798>] (panic+0x54/0x17c)
[<c02ff798>](panic+0x54/0x17c) from [<c002856c>] (init_post+0x9c/0xbc)
[<c002856c>](init_post+0x9c/0xbc) from [<c00085e8>] (kernel_init+0x10c/0x148)
[<c00085e8>](kernel_init+0x10c/0x148) from [<c0029e50>] (kernel_thread_exit+0x0/0x8)
Yaffs文件系统挂载上了,但是没法执行/linuxrc,换回以前的u-boot烧写yaffs文件系统可以正常启动,说明是u-boot的问题。
YAFFS中,文件是以固定大小的数据块进行存储的,块的大小可以是512字节、1 024字节或者2 048字节。这种实现依赖于它能够将一个数据块头和每个数据块关联起来。每个文件(包括目录)都有一个数据块头与之相对应,数据块头中保存了ECC(ErrorCorrection Code)和文件系统的组织信息,用于错误检测和坏块处理。
TQ2440开发板用的NAND FLASH每页2k
用UltraEdit打开刚才烧写的rootfs.yaffs文件和烧到NAND FLASH里的数据对比
在u-boot中执行
TQ2440 # nand dump 360000
Page 00360000 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里的数据和原文件不一致
跟踪u-boot源码common\cmd_nand.c
ret =nand_write_skip_bad(nand, off, &rwsize,
(u_char *)addr, WITH_YAFFS_OOB);
这里传入了一个参数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,应该为原始 */
rval =nand->write_oob(nand, offset, &ops);
if (rval) /* 返回0成功,非0失败,之前那样就只写了第一页 */
break;
重新编译重新烧写yaffs文件系统
TQ2440 # tftp 32000000rootfs.yaffs;nand erase.part rootfs;nand write.yaffs 32000000 rootfs $filesize
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'rootfs.yaffs'.
Load address: 0x32000000
Loading: T#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#################################################################
#############################################
done
Bytes transferred = 6376128(614ac0 hex)
NAND erase.part: device 0offset 0x360000, size 0xfca0000
Skipping bad block at 0x08260000
Erasing at 0xffe0000 -- 100%complete.
OK
NAND write: device 0 offset0x360000, size 0x614ac0
6376128 bytes written: OK
TQ2440 # res
resetting ...
U-Boot 2012.04.01 (Dec 312012 - 19:45:23)
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 stopautoboot: 0
NAND read: device 0 offset0x60000, size 0x300000
3145728 bytes read: OK
## Booting kernel fromLegacy Image at 32000000 ...
Image Name: Linux-2.6.36.4
Created: 2012-12-31 10:56:09 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2186324 Bytes = 2.1 MiB
Load Address: 30008000
Entry Point: 30008000
Verifying Checksum ... OK
Loading Kernel Image ... OK
OK
Starting kernel ...
Uncompressing Linux... done,booting the kernel.
Linux version 2.6.36.4(root@zjh) (gcc version 4.4.3 (ctng-1.6.1) ) #5 Mon Dec 31 18:55:35 CST 2012
CPU: ARM920T [41129200]revision 0 (ARMv4T), cr=c0007177
CPU: VIVT data cache, VIVTinstruction cache
Machine: SMDK2440
Memory policy: ECC disabled,Data cache writeback
CPU S3C2440A (id 0x32440001)
S3C24XX Clocks, Copyright2004 Simtec Electronics
S3C244X: core 400.000 MHz,memory 100.000 MHz, peripheral 50.000 MHz
CLOCK: Slow mode (1.500MHz), fast, MPLL on, UPLL on
Built 1 zonelists in Zoneorder, mobility grouping on. Totalpages: 16256
Kernel command line:root=/dev/mtdblock3 rootfstype=yaffs2 init=/linuxrc console=ttySAC0,115200
PID hash table entries: 256(order: -2, 1024 bytes)
Dentry cache hash table entries:8192 (order: 3, 32768 bytes)
Inode-cache hash tableentries: 4096 (order: 2, 16384 bytes)
Memory: 64MB = 64MB total
Memory: 60532k/60532kavailable, 5004k reserved, 0K highmem
Virtual kernel memorylayout:
vector : 0xffff0000 - 0xffff1000 ( 4 kB)
fixmap : 0xfff00000 - 0xfffe0000 ( 896kB)
DMA : 0xffc00000 - 0xffe00000 ( 2 MB)
vmalloc : 0xc4800000 - 0xe0000000 ( 440 MB)
lowmem : 0xc0000000 - 0xc4000000 ( 64 MB)
modules : 0xbf000000 - 0xc0000000 ( 16MB)
.init : 0xc0008000 - 0xc0028000 ( 128 kB)
.text : 0xc0028000 - 0xc03e8000 (3840 kB)
.data : 0xc0400000 - 0xc0422b80 ( 139 kB)
Hierarchical RCUimplementation.
RCU-based detection of stalled CPUs isdisabled.
Verbose stalled-CPUs detection isdisabled.
NR_IRQS:85
irq: clearing subpendingstatus 00000002
Console: colour dummy device80x30
console [ttySAC0] enabled
Calibrating delay loop...199.47 BogoMIPS (lpj=498688)
pid_max: default: 32768minimum: 301
Mount-cache hash tableentries: 512
CPU: Testing write buffercoherency: ok
gpiochip_add: gpios 288..303(GPIOK) failed to register
gpiochip_add: gpios 320..334(GPIOL) failed to register
gpiochip_add: gpios 352..353(GPIOM) failed to register
NET: Registered protocolfamily 16
S3C Power Management,Copyright 2004 Simtec Electronics
S3C2440: Initialisingarchitecture
S3C2440: IRQ Support
S3C24XX DMA Driver,Copyright 2003-2006 Simtec Electronics
DMA channel 0 at c4808000, irq33
DMA channel 1 at c4808040,irq 34
DMA channel 2 at c4808080,irq 35
DMA channel 3 at c48080c0,irq 36
S3C244X: Clock Support, DVSoff
bio: create slab<bio-0> at 0
SCSI subsystem initialized
usbcore: registered newinterface driver usbfs
usbcore: registered newinterface driver hub
usbcore: registered newdevice driver usb
s3c-i2c s3c2440-i2c: slaveaddress 0x10
s3c-i2c s3c2440-i2c: busfrequency set to 97 KHz
s3c-i2c s3c2440-i2c: i2c-0:S3C I2C adapter
Advanced Linux SoundArchitecture Driver Version 1.0.23.
NET: Registered protocolfamily 2
IP route cache hash tableentries: 1024 (order: 0, 4096 bytes)
TCP established hash tableentries: 2048 (order: 2, 16384 bytes)
TCP bind hash table entries:2048 (order: 1, 8192 bytes)
TCP: Hash tables configured(established 2048 bind 2048)
TCP reno registered
UDP hash table entries: 256(order: 0, 4096 bytes)
UDP-Lite hash table entries:256 (order: 0, 4096 bytes)
NET: Registered protocolfamily 1
RPC: Registered udptransport module.
RPC: Registered tcptransport module.
RPC: Registered tcp NFSv4.1backchannel transport module.
NetWinder Floating PointEmulator V0.97 (extended precision)
JFFS2 version 2.2. (NAND)(SUMMARY) © 2001-2006 Red Hat, Inc.
ROMFS MTD (C) 2007 Red Hat,Inc.
msgmni has been set to 118
io scheduler noop registered
io scheduler deadlineregistered
io scheduler cfq registered(default)
Console: switching to colourframe buffer device 30x40
fb0: s3c2410fb frame bufferdevice
lp: driver loaded but nodevices found
ppdev: user-space parallelport driver
Serial: 8250/16550 driver, 4ports, IRQ sharing enabled
s3c2440-uart.0:s3c2410_serial0 at MMIO 0x50000000 (irq = 70) is a S3C2440
s3c2440-uart.1:s3c2410_serial1 at MMIO 0x50004000 (irq = 73) is a S3C2440
s3c2440-uart.2:s3c2410_serial2 at MMIO 0x50008000 (irq = 76) is a S3C2440
brd: module loaded
loop: module loaded
Uniform Multi-Platform E-IDEdriver
ide-gd driver 1.18
ide-cd driver 5.00
S3C24XX NAND Driver, (c)2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:Tacls=1, 10ns Twrph0=3 30ns, Twrph1=1 10ns
s3c24xx-nand s3c2440-nand:NAND soft ECC
NAND device: ManufacturerID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for badblocks
Bad eraseblock 1043 at0x000008260000
Creating 4 MTD partitions on"NAND":
0x000000000000-0x000000040000: "u-boot"
0x000000040000-0x000000060000: "params"
0x000000060000-0x000000360000: "kernel"
0x000000360000-0x000010000000: "rootfs"
dm9000 Ethernet Driver,V1.31
usbmon: debugfs is notavailable
ohci_hcd: USB 1.1 'Open'Host Controller (OHCI) Driver
s3c2410-ohci s3c2410-ohci:S3C24XX OHCI
s3c2410-ohci s3c2410-ohci:new USB bus registered, assigned bus number 1
s3c2410-ohci s3c2410-ohci:irq 42, io mem 0x49000000
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 2 portsdetected
usbcore: registered newinterface driver libusual
usbcore: registered newinterface driver usbserial
USB Serial supportregistered for generic
usbcore: registered newinterface driver usbserial_generic
usbserial: USB Serial Drivercore
USB Serial supportregistered for FTDI USB Serial Device
usbcore: registered newinterface driver ftdi_sio
ftdi_sio: v1.6.0:USB FTDISerial Converters Driver
USB Serial supportregistered for pl2303
usbcore: registered newinterface driver pl2303
pl2303: Prolific PL2303 USBto serial adaptor driver
mice: PS/2 mouse devicecommon for all mice
S3C24XX RTC, (c) 2004,2006Simtec Electronics
S3C2410 Watchdog Timer, (c)2004 Simtec Electronics
s3c2410-wdt s3c2410-wdt:watchdog inactive, reset disabled, irq enabled
No device for DAI UDA134X
No device for DAIs3c24xx-i2s
ALSA device list:
No soundcards found.
TCP cubic registered
NET: Registered protocolfamily 17
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
yaffs: dev is 32505859 nameis "mtdblock3" rw
yaffs: passed flags""
VFS: Mounted root(yaffs2 filesystem) on device 31:3.
Freeing init memory: 128K
Please press Enter toactivate this console.
Processing /etc/profile...
Done
[root@tq2440 /]#
相关文章推荐
- u-boot-2012.04.01移植到TQ2440(一):建立自己的开发板
- TQ2440 u-boot-2012.04.01移植二支持NAND启动
- TQ2440 u-boot-2012.04.01移植五支持DM9000
- u-boot-2012.04.01移植到TQ2440(二):修改时钟
- TQ2440 u-boot-2012.04.01移植六完善u-boot
- u-boot-2012.04.01移植到TQ2440(三):移植NOR FLASH
- u-boot-2012.04.01移植到TQ2440(四):移植网卡DM9000
- TQ2440 u-boot-2012.04.01移植三支持NOR Flash
- u-boot-2012.04.01移植到TQ2440(五):支持NAND FLASH读写
- u-boot-2012.04.01移植到TQ2440(六):支持NAND FLASH启动
- u-boot-2012.04.01移植到TQ2440(七):添加分区信息并启动jffs2文件系统
- TQ2440 u-boot-2012.04.01移植一串口正常输出
- u-boot-2012.04.01移植到TQ2440(八):支持烧写yaffs文件系统
- TQ2440 u-boot-2012.04.01移植五支持DM9000
- 移植启动TQ2440 u-boot-2012.04.01移植六完善u-boot
- u-boot2012.04.01移植到mini2440
- ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
- TQ2440 学习笔记—— 30、移植U-Boot【U-Boot 的启动过程第一阶段源码分析】
- u-boot-2011.03在TQ2440上的移植(8)--支持下载yaffs2文件系统
- u-boot-2011.03在TQ2440上的移植(10)--支持串口xmodem协议