uboot116的移植目标板TQ24401 编译测试.docx
- 文档编号:7308425
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:11
- 大小:18.35KB
uboot116的移植目标板TQ24401 编译测试.docx
《uboot116的移植目标板TQ24401 编译测试.docx》由会员分享,可在线阅读,更多相关《uboot116的移植目标板TQ24401 编译测试.docx(11页珍藏版)》请在冰豆网上搜索。
uboot116的移植目标板TQ24401编译测试
u-boot1.1.6的移植(目标板TQ2440)1编译测试
Linux内核2009-12-1501:
18:
50阅读146评论0 字号:
大中小 订阅
如何将u-booot1.1.6从smdk2410移植到tq2440目标板?
阅读了天嵌公司的tq2440开发板u-boot代码,以下是我的总结。
为实践需要,另起自己的目标板名字,故用jzy2440替代tq2440。
蓝色的为修改部分,红色为jzy23注释。
(一)编译测试
1. /board目录下
(1). 将smdk2410目录复制为jzy2440目录。
(2).将jzy2440目录下的Makefile中的COBJS改为:
COBJS:
=jzy2440.oflash.o
2./include/configs目录下
将smdk2410.h复制为jzy2440.h。
3.修改顶层Makefile
增加:
jzy2440_config:
unconfig
@$(MKCONFIG)$(@:
_config=)armarm920tjzy2440NULLs3c24X0
这两句的含义,可参见韦东山编著的《嵌入式Linux应用开发完全手册》的bootloader部分--第15章,第249页u-boot配置过程。
4.使用支持softfloat的交叉编译器:
crosstools_3.4.1_soft(光盘附带)。
5.编译测试
配置
makejzy2440_config
编译:
make
具体u-boot编译,连接过程参看韦东山《嵌入式Linux应用开发完全手册》第254页。
6.清除上次编译的结果:
makemrproper
u-boot1.1.6的移植(目标板TQ2440)4.lds设置
Linux内核2009-12-1501:
17:
34阅读43评论0 字号:
大中小 订阅
(四).lds文件设置
注:
蓝色部分为修改或者改动部分,红色部分为jzy23注解。
在board/jzy2440/u-boot.lds里修改:
SECTIONS
{
.=0x00000000;
.=ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/jzy2440/boot_init.o(.text) //添加这句
*(.text)
}
.=ALIGN(4);
.rodata:
{*(.rodata)}
.=ALIGN(4);
.data:
{*(.data)}
.=ALIGN(4);
.got:
{*(.got)}
.=.;
__u_boot_cmd_start=.;
.u_boot_cmd:
{*(.u_boot_cmd)}
__u_boot_cmd_end=.;
.=ALIGN(4);
__bss_start=.;
.bss:
{*(.bss)}
_end=.;
}
u-boot1.1.6的移植(目标板TQ2440)5代码重定向
Linux内核2009-12-1501:
15:
55阅读81评论0 字号:
大中小 订阅
(五)代码重定向
注:
蓝色部分为修改或者改动部分,红色部分为jzy23注解。
1. start.S里修改:
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
relocate:
/*relocateU-BoottoRAM */
adr r0,_start /*r0<-currentpositionofcode(r0=0) */
ldr r1,_TEXT_BASE /*testifwerunfromflashorRAM(r1=0x33f80000*/
cmp r0,r1 /*don'trelocduringdebug */
beq clear_bss /*(原来为stack_setup)*/
ldr r2,_armboot_start /*(r2为_start的地址=0x3ff80000)*/
ldr r3,_bss_start /*(在连接文件中定义)*/
sub r2,r3,r2
#if1 /*(增加)*/
bl CopyCode2Ram /*r0:
source,r1:
dest,r2:
size*/
/*(跳转到CopyCode2Ram函数)*/
#else
add r2,r0,r2 //r2<-sourceendaddress */
copy_loop:
ldmia r0!
{r3-r10} //copyfromsourceaddress[r0] */
stmia r1!
{r3-r10} //copyto targetaddress[r1] */
cmp r0,r2 //untilsourceendaddreee[r2] */
ble copy_loop
#endif
#endif //CONFIG_SKIP_RELOCATE_UBOOT*/
2.在board/jzy2440/boot_init.c中与CopyCode2Ram()相关的函数与定义如下:
#include
#include
#defineGSTATUS1 (*(volatileunsignedint*)0x560000B0)
#defineBUSY 1
//供外部调用的函数*/
voidnand_init_ll(void);
intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize);
//NANDFlash操作的总入口,它们将调用S3C2410或S3C2440的相应函数*/
staticvoidnand_reset(void);
staticvoidwait_idle(void);
staticvoidnand_select_chip(void);
staticvoidnand_deselect_chip(void);
staticvoidwrite_cmd(intcmd);
staticvoidwrite_addr(unsignedintaddr);
staticunsignedcharread_data(void);
//S3C2410的NANDFlash处理函数*/
staticvoids3c2410_nand_reset(void);
staticvoids3c2410_wait_idle(void);
staticvoids3c2410_nand_select_chip(void);
staticvoids3c2410_nand_deselect_chip(void);
staticvoids3c2410_write_cmd(intcmd);
staticvoids3c2410_write_addr(unsignedintaddr);
staticunsignedchars3c2410_read_data(void);
//S3C2440的NANDFlash处理函数*/
staticvoids3c2440_nand_reset(void);
staticvoids3c2440_wait_idle(void);
staticvoids3c2440_nand_select_chip(void);
staticvoids3c2440_nand_deselect_chip(void);
staticvoids3c2440_write_cmd(intcmd);
staticvoids3c2440_write_addr(unsignedintaddr);
staticunsignedchars3c2440_read_data(void);
//S3C2410的NANDFlash操作函数*/
//复位*/
staticvoids3c2410_nand_reset(void)
{
s3c2410_nand_select_chip();
s3c2410_write_cmd(0xff); //复位命令
s3c2410_wait_idle();
s3c2410_nand_deselect_chip();
}
//等待NANDFlash就绪*/
staticvoids3c2410_wait_idle(void)
{
inti;
S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFSTAT;
while(!
(*p&BUSY))
for(i=0;i<10;i++);
}
// 发出片选信号*/
staticvoids3c2410_nand_select_chip(void)
{
inti;
S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;
s3c2410nand->NFCONF&=~(1<<11);
for(i=0;i<10;i++);
}
//取消片选信号*/
staticvoids3c2410_nand_deselect_chip(void)
{
S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;
s3c2410nand->NFCONF|=(1<<11);
}
//发出命令*/
staticvoids3c2410_write_cmd(intcmd)
{
S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFCMD;
*p=cmd;
}
//发出地址*/
staticvoids3c2410_write_addr(unsignedintaddr)
{
inti;
S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFADDR;
*p=addr&0xff;
for(i=0;i<10;i++);
*p=(addr>>9)&0xff;
for(i=0;i<10;i++);
*p=(addr>>17)&0xff;
for(i=0;i<10;i++);
*p=(addr>>25)&0xff;
for(i=0;i<10;i++);
}
//读取数据*/
staticunsignedchars3c2410_read_data(void)
{
S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2410nand->NFDATA;
return*p;
}
//S3C2440的NANDFlash操作函数*/
//复位*/
staticvoids3c2440_nand_reset(void)
{
s3c2440_nand_select_chip();
s3c2440_write_cmd(0xff); //复位命令
s3c2440_wait_idle();
s3c2440_nand_deselect_chip();
}
//等待NANDFlash就绪*/
staticvoids3c2440_wait_idle(void)
{
inti;
S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFSTAT;
while(!
(*p&BUSY))
for(i=0;i<10;i++);
}
// 发出片选信号*/
staticvoids3c2440_nand_select_chip(void)
{
inti;
S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;
s3c2440nand->NFCONT&=~(1<<1);
for(i=0;i<10;i++);
}
//取消片选信号*/
staticvoids3c2440_nand_deselect_chip(void)
{
S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;
s3c2440nand->NFCONT|=(1<<1);
}
//发出命令*/
staticvoids3c2440_write_cmd(intcmd)
{
S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFCMD;
*p=cmd;
}
//发出地址*/
staticvoids3c2440_write_addr(unsignedintaddr)
{
inti;
S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFADDR;
*p=addr&0xff;
for(i=0;i<10;i++);
*p=(addr>>9)&0xff;*/(不是8!
)*/
for(i=0;i<10;i++);
*p=(addr>>17)&0xff;
for(i=0;i<10;i++);
*p=(addr>>25)&0xff;
for(i=0;i<10;i++);
}
//读取数据*/
staticunsignedchars3c2440_read_data(void)
{
S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;
volatileunsignedchar*p=(volatileunsignedchar*)&s3c2440nand->NFDATA;
return*p;
}
//在第一次使用NANDFlash前,复位一下NANDFlash*/
staticvoidnand_reset(void)
{
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
s3c2410_nand_reset();
}
else
{
s3c2440_nand_reset();
}
}
staticvoidwait_idle(void)
{
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
s3c2410_wait_idle();
}
else
{
s3c2440_wait_idle();
}
}
staticvoidnand_select_chip(void)
{
inti;
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
s3c2410_nand_select_chip();
}
else
{
s3c2440_nand_select_chip();
}
for(i=0;i<10;i++);
}
staticvoidnand_deselect_chip(void)
{
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
s3c2410_nand_deselect_chip();
}
else
{
s3c2440_nand_deselect_chip();
}
}
staticvoidwrite_cmd(intcmd)
{
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
s3c2410_write_cmd(cmd);
}
else
{
s3c2440_write_cmd(cmd);
}
}
staticvoidwrite_addr(unsignedintaddr)
{
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
s3c2410_write_addr(addr);
}
else
{
s3c2440_write_addr(addr);
}
}
staticunsignedcharread_data(void)
{
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
returns3c2410_read_data();
}
else
{
returns3c2440_read_data();
}
}
//初始化NANDFlash*/
voidnand_init_ll(void)
{
S3C2410_NAND*s3c2410nand=(S3C2410_NAND*)0x4e000000;
S3C2440_NAND*s3c2440nand=(S3C2440_NAND*)0x4e000000;
#defineTACLS 0
#defineTWRPH0 3
#defineTWRPH1 0
//判断是S3C2410还是S3C2440*/
if((GSTATUS1==0x32410000)||(GSTATUS1==0x32410002))
{
//使能NANDFlash控制器,初始化ECC,禁止片选,设置时序*/
s3c2410nand->NFCONF=(1<<15)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);
}
else
{
//设置时序*/
s3c2440nand->NFCONF=(TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
s3c2440nand->NFCONT=(1<<4)|(1<<1)|(1<<0);
}
//复位NANDFlash*/
nand_reset();
}
#defineNAND_SECTOR_SIZE 512
#defineNAND_BLOCK_MASK (NAND_SECTOR_SIZE-1)
//读函数*/
intnand_read_ll(unsignedchar*buf,unsignedlongstart_addr,intsize)
{
inti,j;
if((start_addr&NAND_BLOCK_MASK)||(size&NAND_BLOCK_MASK)){
return;
}
//选中芯片*/
nand_select_chip();
for(i=start_addr;i<(start_addr+size);){
//发出READ0命令*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- uboot116的移植目标板TQ24401 编译测试 uboot116 移植 目标 TQ24401 编译 测试