成功移植uboot116到edukitIII.docx
《成功移植uboot116到edukitIII.docx》由会员分享,可在线阅读,更多相关《成功移植uboot116到edukitIII.docx(16页珍藏版)》请在冰豆网上搜索。
成功移植uboot116到edukitIII
待修改,由于时间关系还没整理完善,先把主要步骤列出:
有关于Retrycountexceeded;startingagain错误即将描述
一、先实现可从nandflash启动
1.在u-boot-1.2.0/Makefile中
diff-urN
u-boot-1.2.0.orig/Makefileu-boot-1.2.0/Makefile
---
u-boot-1.2.0.orig/Makefile2007-01-07
07:
13:
11.000000000+0800
+++
u-boot-1.2.0/Makefile2007-09-19
12:
09:
20.000000000+0800
@@-125,7
+125,7@@
CROSS_COMPILE=powerpc-linux-
endif
ifeq($(ARCH),arm)
-CROSS_COMPILE=arm-linux-
+CROSS_COMPILE=
/usr/local/arm/arm-2007q1/bin/arm-none-linux-gnueabi-
endif
这是需要修改的第一段代码
其实就是把/u-boot-1.2.0/Makefile
程序第125行改了,其实就是设定交叉编译器,这段代码是很好的学习材料
这就是一个补丁的制作过程
diff:
以u-boot-1.2.0/Makefile为目标文件,以u-boot-1.2.0.orig/Makefile为源文件
2.在u-boot-1.2.0/board/smdk2410/中
Makefile
diff-urNu-boot-1.2.0.orig/board/smdk2410/Makefile
u-boot-1.2.0/board/smdk2410/Makefile
---
u-boot-1.2.0.orig/board/smdk2410/Makefile2007-01-07
07:
13:
11.000000000+0800
+++
u-boot-1.2.0/board/smdk2410/Makefile2007-09-19
12:
22:
24.000000000+0800
@@-25,7+25,7@@
LIB=$(obj)lib$(BOARD).a
-COBJS:
=smdk2410.oflash.o
+COBJS:
=smdk2410.oflash.o
nand_read.o
SOBJS:
=
lowlevel_init.o
SRCS:
=$(SOBJS:
.o=.S)
$(COBJS:
.o=.c)
lowlevel_init.S
diff-urN
u-boot-1.2.0.orig/board/smdk2410/lowlevel_init.S
u-boot-1.2.0/board/smdk2410/lowlevel_init.S
---
u-boot-1.2.0.orig/board/smdk2410/lowlevel_init.S2007-01-07
07:
13:
11.000000000+0800
+++
u-boot-1.2.0/board/smdk2410/lowlevel_init.S2007-09-19
12:
22:
08.000000000+0800
@@-123,7+123,7@@
#defineTrp
0x0
#defineTrc
0x3
#defineTchr
0x2
-#defineREFCNT
1113
+#define
REFCNT
1268
_TEXT_BASE:
新建文件nand_read.c
diff-urN
u-boot-1.2.0.orig/board/smdk2410/nand_read.c
u-boot-1.2.0/board/smdk2410/nand_read.c
---
u-boot-1.2.0.orig/board/smdk2410/nand_read.c1970-01-01
08:
00:
00.000000000+0800
+++
u-boot-1.2.0/board/smdk2410/nand_read.c2007-09-19
12:
24:
13.000000000+0800
@@-0,0+1,77@@
+
+
+#include
+
+#ifdefCONFIG_S3C2410_NAND_BOOT
+
+#define__REGb(x)(*(volatileunsignedchar
*)(x))
+#define__REGi(x)(*(volatileunsignedint
*)(x))
+#define
NF_BASE 0x4e000000
+#defineNFCONF __REGi(NF_BASE+
0x0)
+#defineNFCMD __REGb(NF_BASE+
0x4)
+#defineNFADDR __REGb(NF_BASE+
0x8)
+#defineNFDATA __REGb(NF_BASE+
0xc)
+#defineNFSTAT __REGb(NF_BASE+
0x10)
+
+#defineBUSY1
+inlinevoidwait_idle(void){
+ int
i;
+
+
while(!
(NFSTAT&BUSY))
+
for(i=0;i512
+#define
NAND_BLOCK_MASK (NAND_SECTOR_SIZE
-1)
+
+
+int
+nand_read_ll(unsignedchar*buf,unsignedlongstart_addr,int
size)
+{
+ inti,
j;
+
+ if
((start_addr&NAND_BLOCK_MASK)||(size
&NAND_BLOCK_MASK)){
+
return-1;
+ }
+
+
+ NFCONF
&=~0x800;
+ for(i=0;
i
for(i=start_addr;i
+
NFCMD=0;
+
+
+
NFADDR=i&0xff;
+
NFADDR=(i>>9)&
0xff;
+
NFADDR=(i>>17)&
0xff;
+
NFADDR=(i>>25)&
0xff;
+
+
wait_idle();
+
+
for(j=0;j*buf=(NFDATA&0xff);
+buf++;
+
}
+ }
+
+
+ NFCONF|=
0x800;
+
+ return
0;
+}
+
+#endif
smdk2410.c
diff-urNu-boot-1.2.0.orig/board/smdk2410/smdk2410.c
u-boot-1.2.0/board/smdk2410/smdk2410.c
---
u-boot-1.2.0.orig/board/smdk2410/smdk2410.c2007-01-07
07:
13:
11.000000000+0800
+++
u-boot-1.2.0/board/smdk2410/smdk2410.c2007-09-19
12:
21:
39.000000000+0800
@@-36,10+36,10@@
#defineM_MDIV0xC3
#defineM_PDIV0x4
#defineM_SDIV0x1
-#elifFCLK_SPEED==1
-#defineM_MDIV0xA1
-#defineM_PDIV0x3
-#defineM_SDIV0x1
+#elif
FCLK_SPEED==1
+#defineM_MDIV0x5C
+#defineM_PDIV0x4
+#define
M_SDIV0x0
#endif
#defineUSB_CLOCK1
@@-87,7+87,7@@
gpio->GPACON=
0x007FFFFF;
-gpio->GPBCON=0x00044555;
+gpio->GPBCON=
0x000055A;
gpio->GPBUP
=0x000007FF;
gpio->GPCCON=
0xAAAAAAAA;
gpio->GPCUP=
0x0000FFFF;
@@-99,7+99,7@@
gpio->GPFUP=
0x000000FF;
gpio->GPGCON=
0xFF95FFBA;
gpio->GPGUP=
0x0000FFFF;
-gpio->GPHCON=0x002AFAAA;
+gpio->GPHCON=
0x0016FAAA;
gpio->GPHUP
=0x000007FF;
3.在u-boot-1.2.0/cpu/arm920t中
start.S(第一层汇编程序入口)
diff-urNu-boot-1.2.0.orig/cpu/arm920t/start.S
u-boot-1.2.0/cpu/arm920t/start.S
---
u-boot-1.2.0.orig/cpu/arm920t/start.S2007-01-07
07:
13:
11.000000000+0800
+++u-boot-1.2.0/cpu/arm920t/start.S2007-09-19
12:
37:
00.000000000+0800
@@-27,7+27,7@@
#include
#include
-
+#include
ldrr0,
=INTSUBMSK
strr1,
[r0]
#endif
@@-161,6+161,7@@
#endif
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
+#ifndef
CONFIG_S3C2410_NAND_BOOT
relocate:
adrr0,
_start
ldrr1,
_TEXT_BASE
@@-177,8+178,67@@
stmiar1!
{r3-r10}
cmpr0,
r2
blecopy_loop
+#else
+relocate:
+copy_myself:
+@resetNAND
+movr1,
#S3C2410_NAND_BASE
+ldrr2,
=0xf830 @initialvalue
enable
+strr2,[r1,#oNFCONF]
+ldrr2,[r1,#oNFCONF]
+bicr2,r2,
#0x800 @enablechip
+strr2,[r1,#oNFCONF]
+movr2,
#0xff @RESETcommand
+strbr2,[r1,#oNFCMD]
+movr3,
#0 @
wait
+1:
addr3,r3,#0x1
+cmpr3,#0xa
+blt1b
+2:
ldrr2,[r1,
#oNFSTAT]@waitready
+tstr2,#0x1
+beq2b
+ldrr2,[r1,#oNFCONF]
+orrr2,r2,
#0x800 @disablechip
+strr2,[r1,#oNFCONF]
+
+
+ldrr0,
_TEXT_BASE
+subr0,r0,
#CFG_MALLOC_LEN
+subr0,r0,
#CFG_GBL_DATA_SIZE
+#ifdefCONFIG_USE_IRQ
+subr0,r0,
#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
+#endif
+subsp,r0,
#12
+
+@copyu-boottoRAM
+ldrr0,_TEXT_BASE
+mov
r1,#0x0
+movr2,#CFG_UBOOT_SIZE
+blnand_read_ll
+
+tstr0,#0x0
+beqok_nand_read
+
+ok_nand_read:
+@verify
+movr0,#0
+ldrr1,_TEXT_BASE
+movr2,
#0x400@4bytes*1024=4K-bytes
+go_next:
+ldrr3,[r0],#4
+ldrr4,[r1],#4
+teqr3,r4
+bnenotmatch
+subsr2,r2,#4
+beqdone_nand_read
+bnego_next
+notmatch:
+1:
b1b
+done_nand_read:
+#endif
#endif
+#ifndef
CONFIG_S3C2410_NAND_BOOT
stack_setup:
ldrr0,
_TEXT_BASE
@@-188,6+248,7@@
subr0,r0,
#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
subsp,r0,
#12
+#endif
clear_bss:
ldrr0,
_bss_start
4.在u-boot-1.2.0/include/Configs/smdk2410.h中
diff-urNu-boot-1.2.0.orig/include/configs/smdk2410.h
u-boot-1.2.0/include/configs/smdk2410.h
---
u-boot-1.2.0.orig/include/configs/smdk2410.h2007-01-07
07:
13:
11.000000000+0800
+++
u-boot-1.2.0/include/configs/smdk2410.h2007-09-19
12:
42:
45.000000000+0800
@@-82,6+82,8@@
\
\
\
+ CFG_CMD_NET
|\
+ CFG_CMD_PING
|
\
CFG_CMD_REGINFO
|\
CFG_CMD_DATE
|\
CFG_CMD_ELF)
@@-91,10+93,10@@
#defineCONFIG_BOOTDELAY3
-
+#define
CONFIG_ETHADDR 08:
00:
3e:
26:
0a:
5b
#define
CONFIG_NETMASK
255.255.255.0
-#define
CONFIG_IPADDR 10.0.0.110
-#define
CONFIG_SERVERIP 10.0.0.1
+#define
CONFIG_IPADDR 192.168.1.110
+#define
CONFIG_SERVERIP 192.168.1.216
@@-108,7+110,7@@
*Miscellaneousconfigurableoptions
*/
#defineCFG_LONGHELP
-#defineCFG_PROMPT "SMDK2410
#"
+#defineCFG_PROMPT "U-boot
#
"
#defineCFG_CBSIZE 256
#defineCFG_PBSIZE
(CFG_CBSIZE+sizeof(CFG_PROMPT)+16)
#defineCFG_MAXARGS 16
@@-178,4+180,8@@
#defineCFG_ENV_IS_IN_FLASH1
#define
CFG_ENV_SIZE 0x10000
+
+#defineCONFIG_S3C2410_NAND_BOOT
+#define
CFG_UBOOT_SIZE 0x20000
+
#endif
5.在u-boot-1.2.0/include/s3c2410.h
diff-urNu-boot-1.2.0.orig/include/s3c2410.h
u-boot-1.2.0/include/s3c2410.h
---u-boot-1.2.0.orig/include/s3c2410.h2007-01-07
07:
13:
11.000000000+0800
+++u-boot-1.2.0/include/s3c2410.h2007-09-19
12:
38:
31.000000000+0800
@@-38,12+38,6@@
#define
S3C2410_ECCSIZE 512
#defineS3C2410_ECCBYTES3
-typedefenum{
-S3C24X0_UART0,
-S3C24X0_UART1,
-S3C24X0_UART2
-}S3C24X0_UARTS_NR;
-
#define
S3C24X0_MEMCTL_BASE 0x48000000
#define
S3C24X0_USB_HOST_BASE 0x49000000
@@-64,10+58,23@@
#define
S3C24X0_SPI_BASE 0x59000000
#define
S3C2410_SDI_BASE 0x5A000000
+#define
oNFCONF 0x00
+#define
oNFCMD 0x04
+#define
oNFADDR 0x08
+#define
oNFDATA 0x0C
+#define
oNFSTAT 0x10
+#define
oNFECC 0x14
+
+#ifndef__ASSEMBLER__
#include
+typedefenum{
+S3C24X0_UART0,
+S3C24X0_UART1,
+S3C24X0_UART2
+}S3C24X0_UARTS_NR;
staticinlineS3C24X0_MEMCTL*const
S3C24X0_GetBase_MEMCTL(void)
{
@@-224,4+231,7@@
rINTPND;\
}
+
+#endif
+
#endif
二、再实现支持nandflash读写的部分(可以去掉2440的部分):
U-Boot1.1.6中对NAND
Flash的支持有新旧两套代码,新代码在drivers/nand目录下,旧代码在drivers/nand_legacy目录下。
文档
doc/README.nand对这两套代码有所说明:
使用旧代码需要定义更多的宏,而新代码移植自Linux内核2.6.12,它更加智能,可以自动识
别更多型号的NAND
Flash。
目前之所以还保留旧的代码,是因为两个目标板NETTA、NETTA_ISDN使用JFFS文件系统,它们还依赖于旧代码。
当相关功能移植到
新代码之后,旧的代码将从U-Boot中去除。
要让U-Boot支持NANDFlash,首先在配置文件include/configs/100ask24x0.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND,如下:
#defineCONFIG_COMMANDS\
(CONFIG_CMD_DFL|\
CFG_CMD_CACHE|\
CFG_CMD_PING|\
CFG_CMD_NAND|\
……
然后选择使用哪套代码:
在配置文件中定义宏CFG_NAND_LEGACY则使用旧代码,否则使用新代码。
使用旧代码时,需要实现drivers/nand_legacy/nand_legacy.c中使用到的各种宏,比如:
#defineNAND_WAIT_READY(nand)/*等待NandFlash的状态为“就绪”,代码依赖于具体的开发板*/
#defineWRITE_NAND_COMMAND(d,adr)/*写NANDFlash命令,代码依赖于具体的开发板*/
本书使用新代码,下面讲述移植过程。
代码的移植没有现成的文档,可以在配置文件include/configs/100ask24x0.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND后,就编译代码,然后一个一个地解决出现的错误。
编译结果中出现的错误和警告如下:
nand.h:
412:
error:
`NAND_MAX_CHIPS'undeclaredhere(notinafunction)
nand.c:
35:
error:
`CFG_MAX_NAND_DEVICE'undeclaredhere(notinafunction)
nand.c:
38:
error:
`CFG_NAND_BASE'undeclaredhere(notinafunction)
nand.c:
35:
error:
storagesizeof`nand_info'isn'tknown
nand.c:
37:
error:
storagesizeof`nand_chip'isn'tknown
nand.c:
38:
error:
storagesizeof`base_address'isn'tknown
nand.c:
37:
warning:
'nand_chip'definedbutnotused
nand.c:
38:
warning:
'base_address'definedbutnotused
在配置文件include/