<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:黑体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimHei; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:Calibri; mso-font-alt:Arial; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@黑体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:Fixedsys; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-alt:方正舒体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:"/@Fixedsys"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin-top:0cm; margin-right:0cm; margin-bottom:10.0pt; margin-left:0cm; line-height:120%; mso-pagination:none; mso-hyphenate:none; font-size:10.0pt; font-family:Calibri; mso-fareast-font-family:宋体; mso-bidi-font-family:"Times New Roman"; mso-fareast-language:EN-US; mso-bidi-language:EN-US; font-style:italic;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->
uboot-2010.03 移植到 2410( 从 nand 启动 )
【环境】
<a> Ubuntu 10.04 LTS
<b> u-boot-2010.03
<c> FS2410 主板, SAMSUNG S3C2410A 微处理器
<d> 交叉编译器 arm-linux-gcc-4.3.2
<e> Nand: Samsung K9F1208U0B , 64M
【步骤】
Step1: 创建板级源码
<1> 解压
furtherchan@further:~/work$
tar -jxvf u-boot-2010.03.tar.bz2
<2> 进入板极源码目录
furtherchan@further:~/work/u-boot-2010.03/board/samsung$ ls
smdk2400 smdk2410 smdk6400 smdkc100
<3> 拷贝一份最相似的平台代码:
furtherchan@further:~/work/u-boot-2010.03/board/samsung$ cp -av smdk2410/ fs2410
`smdk2410/' -> `fs2410'
`smdk2410/Makefile' -> `fs2410/Makefile'
`smdk2410/config.mk' -> `fs2410/config.mk'
`smdk2410/flash.c' -> `fs2410/flash.c'
`smdk2410/smdk2410.c' -> `fs2410/smdk2410.c'
`smdk2410/lowlevel_init.S' -> `fs2410/lowlevel_init.S'
furtherchan@further:~/work/u-boot-2010.03/board/samsung$ ls
fs2410 smdk2400 smdk2410 smdk6400 smdkc100
furtherchan@further:~/work/u-boot-2010.03/board/samsung$ cd fs2410/
修改文件名
furtherchan@further:~/work/u-boot-2010.03/board/samsung/fs2410$ mv smdk2410.c fs2410.c
修改 Makefile
furtherchan@further:~/work/u-boot-2010.03/board/samsung/fs2410$ vim Makefile
COBJS := smdk2410.o flash.o → COBJS := fs2410.o flash.o
拷贝头文件
furtherchan@further:~/work/u-boot-2010.03/board/samsung/fs2410$ cd ../../../include/configs/
furtherchan@further:~/work/u-boot-2010.03/include/configs$ cp -v smdk2410.h fs2410.h
`smdk2410.h' -> `fs2410.h'
退回 U-Boot 根目录
furtherchan@further:~/work/u-boot-2010.03/include/configs$ cd ../..
furtherchan@further:~/work/u-boot-2010.03$
<4> 修改顶级 Makefile
furtherchan@further:~/work/u-boot-2010.03$ vim Makefile
smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 samsung s3c24x0
在 3045 和 3046 行(即以上两句)下加入以下两句:
fs2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t fs2410 samsung s3c24x0
<5> 编译
furtherchan@further:~/work/u-boot-2010.03$ make fs2410_config
furtherchan@further:~/work/u-boot-2010.03$ make
…...
arm-linux-objcopy -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
furtherchan@further:~/work/u-boot-2010.03$ ll -h u-boot.bin
-rwxr-xr-x 1 furtherchan furtherchan 99K 2010-07-05 20:25 u-boot.bin
此时编译生成的 u-boot.bin 文件还无法运行在 fs2410 开发板上,需要做以下修改 .
Step2: 修改平台相关信息
<1> 修改中断禁止部分
furtherchan@further:~/work/u-boot-2010.03$ cd cpu/arm920t/
furtherchan@further:~/work/u-boot-2010.03/cpu/arm920t$ vim start.S
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
修改成如下:
# if defined(CONFIG_S3C2410)
ldr r1, =0x7ff
ldr r0, =INTSUBMSK
str r1, [r0]
<2> 修改 SDRAM 刷新周期: board/samsung/fs2410/lowlevel_init.S
#define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
改成:
#define REFCNT 1268 /* period=7.8125us, HCLK=100Mhz, (2048+1-7.8125*100) */
Step3: U-BOOT 增加 NAND 启动支持
<1> 修改命令提示符,在 include/configs/fs2410.h 中修改如下代码:
#define CONFIG_SYS_PROMPT "SMDK2410 # "
改成:
#define CONFIG_SYS_PROMPT "fs2410 # "
<2> 修改默认载入地址
#define CONFIG_SYS_LOAD_ADDR 0x33000000
改成:
#define CONFIG_SYS_LOAD_ADDR 0x30008000
<3> 加入支持 nand 写
#define CONFIG_ENV_IS_IN_FLASH 1
改成:
#define CONFIG_ENV_IS_IN_NAND 1 /* common/env_nand.c */
并增加一句:
#define CONFIG_ENV_OFFSET 0x30000
<4> 调试过程
U-Boot 第一阶段完成后,跳转到第二阶段的主函数 lib_arm/board.c 中 271 行: void start_armboot (void) ,在该函数中有如下定义:
#if defined(CONFIG_CMD_NAND)
puts ("NAND: ");
nand_init(); /* go init the NAND */
#endif
为了支持 NAND ,在 include/configs/fs2410.h 中添加如下代码:
#define CONFIG_CMD_NAND
添加完先编译一下:
furtherchan@further:~/work/u-boot-2010.03$ make distclean
Generating include/autoconf.mk
furtherchan@further:~/work/u-boot-2010.03$ make fs2410_config
Configuring for fs2410 board...
furtherchan@further:~/work/u-boot-2010.03$ arm-linux-gcc -v
Using built-in specs.
Target: arm-none-linux-gnueabi
…...
gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72)
编译,出现错误:
furtherchan@further:~/work/u-boot-2010.03$ make CROSS_COMPILE=arm-linux-
make[1]: Entering directory `/home/furtherchan/work/u-boot-2010.03/drivers/mtd/nand'
…... -o nand.o nand.c -c
nand.c:29: error: 'CONFIG_SYS_MAX_NAND_DEVICE' undeclared here (not in a function)
nand.c:32: error: 'CONFIG_SYS_NAND_BASE' undeclared here (not in a function)
make[1]: *** [nand.o] Error 1
make[1]: Leaving directory `/home/furtherchan/work/u-boot-2010.03/drivers/mtd/nand'
make: *** [drivers/mtd/nand/libnand.a] Error 2
在 include/configs/fs2410.h 中继续添加代码:
#define CONFIG_SYS_MAX_NAND_DEVICE 1
#define CONFIG_SYS_NAND_BASE 0x4E000000
继续编译,出现错误:
furtherchan@further:~/work/u-boot-2010.03$ make CROSS_COMPILE=arm-linux-
make[1]: Leaving directory `/home/furtherchan/work/u-boot-2010.03/cpu/arm920t'
…...
drivers/mtd/nand/libnand.a(nand.o): In function `nand_init_chip':
/home/furtherchan/work/u-boot-2010.03/drivers/mtd/nand/nand.c:48: undefined reference to `board_nand_init'
make: *** [u-boot] Error 1
板级 nand 初始化函数找不到,在 drivers/mtd/nand/ 目录下有个 s3c2410_nand.c 文件,一直不知道是什么时候用的,估计是需要调用该文件中的 board_nand_init() 。
查看 drivers/mtd/nand/nand.c ,其中 nand_init_chip 调用了 board_nand_init() ,同时在 /drivers/mtd/nand/s3c2410_nand.c 中有 board_nand_init() 函数,下面就要考虑如何把 s3c2410_nand.c 的 board_nand_init() 整到 nand.c 中。
分析该目录下的 Makefile ,用 s3c2410 关键字查询到如下内容:
COBJS-$( CONFIG_NAND_S3C2410 ) += s3c2410_nand.o
要使该行编译进工程,需定义 CONFIG_NAND_S3C2410 ,同样,在 include/configs/fs2410.h 中继续添加代码:
#define CONFIG_NAND_S3C2410
继续编译:
furtherchan@further:~/work/u-boot-2010.03$ make CROSS_COMPILE=arm-linux-
编译成功,烧写板子,输出如下信息:
fs2410 #
U-Boot 2010.03 (Jul 06 2010 - 13:22:17)
DRAM: 64 MB
Flash: 512 kB
NAND: 64 MiB
*** Warning - bad CRC or NAND, using default environment
In: serial
Out: serial
Err: serial
Net: CS8900-0
fs2410 # nand info
Device 0: NAND 64MiB 3,3V 8-bit, sector size 16 KiB
fs2410 # saveenv
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x3c00000000001 -- 0% complete.
Writing to Nand... done
fs2410 #
可见 nand 读写成功。
设好环境参数后启动,出现如下错误:
fs2410 # boot
NAND read: device 0 offset 0x40000, size 0x200000
2097152 bytes read: OK
## Starting application at 0x30008000 ...
Uncompressing Linux................................................................................................................. done, booting the kernel.
Error: unrecognized/unsupported machine ID (r1 = 0x33f4fb6c).
Available machine support:
ID (hex) NAME
000000c1 SMDK2410
0000015b IPAQ-H1940
00000290 Acer-N30
0000014b Simtec-BAST
000002a8 Nex Vision - Otom 1.1
00000400 AML_M5900
000001db Thorcom-VR1000
00000454 QT2410
000003fe SMDK2413
000003f1 SMDK2412
00000377 S3C2413
00000474 VSTMS
000002de Simtec-Anubis
0000034a Simtec-OSIRIS
00000250 IPAQ-RX3715
0000016a SMDK2440
000002a9 NexVision - Nexcoder 2440
0000043c SMDK2443
Please check your kernel config and/or bootloader.
以上信息可见, machine Id 不匹配,由于本人的 zImage 之前在板子上跑是正确的,基本可断定 u-boot 平台 ID 传递错误:
fs2410 # bdinfo
arch_number = 0x000000C1
env_t = 0x00000000
boot_params = 0x30000100
DRAM bank = 0x00000000
-> start = 0x30000000
-> size = 0x04000000
ethaddr = aa:2c:33:44:55:66
ip_addr = 192.168.1.212
baudrate = 115200 bps
以上 arch_number 转换成 10 进制即 193 ,在内核源码文件 include/asm-arm/mach-types.h 中有相应定义,在 u-boot 文件 include/asm-arm/mach-types.h
存在相同定义:
#define MACH_TYPE_SMDK2410 193
在 board/samsung/fs2410/fs2410.c 中有如下定义:
/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
/* adress of boot parameters */
gd->bd->bi_boot_params = 0x30000100;
看来的确是 uboot 没有把参数传递给内核。
board/samsung/fs2410/fs2410.c
: #include <asm/arch/s3c24x0_cpu.h>
include/asm-arm/arch-s3c24x0/s3c24x0_cpu.h
s3c24x0_cpu.h
内容如下 :
#ifdef CONFIG_S3C2400
#include <asm/arch/s3c2400.h>
#elif defined CONFIG_S3C2410
#include <asm/arch/s3c2410.h>
#else
#error Please define the s3c24x0 cpu type
#endif
需要定义: CONFIG_S3C2410 ,在 fs2410.h 中已有该定义
解决:在 common/cmd_boot.c 中 do_go() 函数修改如下:
int
do_go (cmd_tbl_t * cmdtp, int flag, int argc, char *argv[])
{
ulong addr, rc;
int rcode = 0;
/************* Add by FurtherChan ************/
char *commandline = getenv ("bootargs" );
struct param_struct *my_params = (struct param_struct *) 0x30000100;
memset (my_params, 0, sizeof (struct param_struct));
my_params->u1.s.page_size = 4096;
my_params->u1.s.nr_pages = 0x4000000 >> 12;
memcpy (my_params->commandline, commandline, strlen (commandline) + 1);
/***************** Add end *******************/
if (argc < 2)
{
cmd_usage (cmdtp);
return 1;
}
addr = simple_strtoul (argv[1], NULL, 16);
printf ("## Starting application at 0x%08lX .../n" , addr);
/* * pass address parameter as argv[0] (aka command name),
* and all remaining args
*/
/*************** Add by FurtherChan *************/
__asm__ ("mov r1, #193/n"
"mov ip, #0/n"
"mcr p15, 0, ip, c13, c0, 0/n"
"mcr p15, 0, ip, c7, c7, 0/n"
"mcr p15, 0, ip, c7, c10, 4/n"
"mcr p15, 0, ip, c8, c7, 0/n"
"mrc p15, 0, ip, c1, c0, 0/n"
"bic ip, ip, #0x0001/n"
"mov pc, %0/n" "nop/n"
:
:"r" (addr)
);
/***************** Add end ********************/
rc = do_go_exec ((void *) addr, argc - 1, argv + 1);
if (rc != 0)
rcode = 1;
printf ("## Application terminated, rc = 0x%lX/n" , rc);
return rcode;
}
重新编译后,烧写,启动板子:
fs2410 # boot
NAND read: device 0 offset 0x40000, size 0x200000
2097152 bytes read: OK
## Starting application at 0x30008000 ...
Uncompressing Linux................................................................................................................. done, booting the kernel.
Linux version 2.6.22.6 (furtherchan@further) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #25 Thu Jul 1 16:25:29 CST 2010
CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=00007177
Machine: SMDK2410
ATAG_INITRD is deprecated; please update your bootloader.
Memory policy: ECC disabled, Data cache writeback
CPU S3C2410A (id 0x32410002)
S3C2410: core 202.800 MHz, memory 101.400 MHz, peripheral 50.700 MHz
…...
启动成功!