天祥TX2440对uboot的移植.docx

上传人:b****5 文档编号:6849047 上传时间:2023-01-11 格式:DOCX 页数:13 大小:19.43KB
下载 相关 举报
天祥TX2440对uboot的移植.docx_第1页
第1页 / 共13页
天祥TX2440对uboot的移植.docx_第2页
第2页 / 共13页
天祥TX2440对uboot的移植.docx_第3页
第3页 / 共13页
天祥TX2440对uboot的移植.docx_第4页
第4页 / 共13页
天祥TX2440对uboot的移植.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

天祥TX2440对uboot的移植.docx

《天祥TX2440对uboot的移植.docx》由会员分享,可在线阅读,更多相关《天祥TX2440对uboot的移植.docx(13页珍藏版)》请在冰豆网上搜索。

天祥TX2440对uboot的移植.docx

天祥TX2440对uboot的移植

uboot在2440上移植

(一)-xgc94418297的日志-网易博客

2011-06-2215:

516611人阅读评论(5)收藏举报

网易asynchronousmakefilecdelayflash

以前一直在用vivi,很精简很方便,源码很好懂,想改什么就改什么,但是功能差了点,所以移植个uboot来跑跑,uboot很好很强大,但是想搞清它的机制有点困难,先移植个最简单的试试,还没有增加对yaffs的支持和usb下载,遇到一些小问题也都解决了。

我用的2440开发板,取名为TX2440。

解压U-BOOT-1.1.6,进入U-BOOT目录,修改Makefile:

在smdk2410_config:

unconfig

@$(MKCONFIG)$(@:

_config=)armarm920tsmdk2410NULLs3c24x0

加上

TX2440_config:

unconfig

@$(MKCONFIG)$(@:

_config=)armarm920tTX2440NULLs3c24x0

各项的意思如下:

arm:

CPU的架构(ARCH)

arm920t:

CPU的类型(CPU),其对应于cpu/arm920t子目录。

TX2440:

开发板的型号(BOARD),对应于board/TX2440目录。

NULL:

开发者/或经销商(vender)。

s3c24x0:

片上系统(SOC)。

在第128行:

ifeq($(ARCH),arm)

CROSS_COMPILE=arm-linux-

指定交叉编译器,我使用的是3.4.1,这里也可以写绝对路径

修改完Makefile后,在board目录下,新建自己的开发板目录TX2440,把smdk2410目录下的所有文件拷到TX2440,把smdk2410.c改为TX2440.c。

修改该目录下的Makefile,把smdk2410.o改为TX2410.o。

COBJS:

=TX2440.oflash.o

将board目录下所有文件夹全部删除,只留TX2440

在include/configs目录下创建板子的配置头文件,把smdk2410.h改名为TX2440.h,再把所有的文件全部删除,只留TX2440.h

测试能否编译成功:

执行makeTX2440_config

出现make:

execvp:

…………/mkconfig:

权限不够

查看mkconfig的权限,发现没有可执行权限,用chmod764mkconfig加上权限

然后再make,成功后可出现ConfiguringforTX2440board.....

修改SDRAM配置,在board/TX2440/lowlevel_init.S中,检查

#defineB6_BWSCON(DW32)位宽为32

把B1_BWSCON改为(DW16)B5_BWSCON改为(DW8)

根据HCLK设置SDRAM的刷新参数,主要是REFCNT寄存器,开发板HCLK为100M

将#defineREFCNT0x1113改为#defineREFCNT0x4f4

增加对S3C2440的支持,2440的时钟计算公式、NAND操作和2410不太一样。

对于2440开发板,将FCLK设为400MHz,分频比为FCLK:

HCLK:

PCLK=1:

4:

8。

修改board/TX2440/TX2440.c中的board_init函数

/*S3C2440:

Mpll,Upll=(2*m*Fin)/(p*2^s)

*m=M(thevaluefordividerM)+8,p=P(thevaluefordividerP)+2

*/

#defineS3C2440_MPLL_400MHZ((0x7f<<12)|(0x02<<4)|(0x01))

#defineS3C2440_UPLL_48MHZ((0x38<<12)|(0x02<<4)|(0x02))

#defineS3C2440_CLKDIV0x05/*FCLK:

HCLK:

PCLK=1:

4:

8*/

/*S3C2410:

Mpll,Upll=(m*Fin)/(p*2^s)

*m=M(thevaluefordividerM)+8,p=P(thevaluefordividerP)+2

*/

#defineS3C2410_MPLL_200MHZ((0x5c<<12)|(0x04<<4)|(0x00))

#defineS3C2410_UPLL_48MHZ((0x28<<12)|(0x01<<4)|(0x02))

#defineS3C2410_CLKDIV0x03/*FCLK:

HCLK:

PCLK=1:

2:

4*/

intboard_init(void)

{

S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

S3C24X0_GPIO*constgpio=S3C24X0_GetBase_GPIO();

/*setuptheI/Oports*/

gpio->GPACON=0x007FFFFF;

gpio->GPBCON=0x00044555;

gpio->GPBUP=0x000007FF;

gpio->GPCCON=0xAAAAAAAA;

gpio->GPCUP=0x0000FFFF;

gpio->GPDCON=0xAAAAAAAA;

gpio->GPDUP=0x0000FFFF;

gpio->GPECON=0xAAAAAAAA;

gpio->GPEUP=0x0000FFFF;

gpio->GPFCON=0x000055AA;

gpio->GPFUP=0x000000FF;

gpio->GPGCON=0xFF95FFBA;

gpio->GPGUP=0x0000FFFF;

gpio->GPHCON=0x002AFAAA;

gpio->GPHUP=0x000007FF;

/*supportbothofS3C2410andS3C2440*/

if((gpio->GSTATUS1==0x32410000)||(gpio->GSTATUS1==0x32410002))

{

/*FCLK:

HCLK:

PCLK=1:

2:

4*/

clk_power->CLKDIVN=S3C2410_CLKDIV;

/*changetoasynchronousbusmod*/

__asm__("mrcp15,0,r1,c1,c0,0/n"/*readctrlregister*/

"orrr1,r1,#0xc0000000/n"/*Asynchronous*/

"mcrp15,0,r1,c1,c0,0/n"/*writectrlregister*/

:

:

:

"r1"

);

/*toreducePLLlocktime,adjusttheLOCKTIMEregister*/

clk_power->LOCKTIME=0xFFFFFF;

/*configureMPLL*/

clk_power->MPLLCON=S3C2410_MPLL_200MHZ;

/*somedelaybetweenMPLLandUPLL*/

delay(4000);

/*configureUPLL*/

clk_power->UPLLCON=S3C2410_UPLL_48MHZ;

/*somedelaybetweenMPLLandUPLL*/

delay(8000);

/*archnumberofSMDK2410-Board*/

gd->bd->bi_arch_number=MACH_TYPE_SMDK2410;

}

else

{

/*FCLK:

HCLK:

PCLK=1:

4:

8*/

clk_power->CLKDIVN=S3C2440_CLKDIV;

/*changetoasynchronousbusmod*/

__asm__("mrcp15,0,r1,c1,c0,0/n"/*readctrlregister*/

"orrr1,r1,#0xc0000000/n"/*Asynchronous*/

"mcrp15,0,r1,c1,c0,0/n"/*writectrlregister*/

:

:

:

"r1"

);

/*toreducePLLlocktime,adjusttheLOCKTIMEregister*/

clk_power->LOCKTIME=0xFFFFFF;

/*configureMPLL*/

clk_power->MPLLCON=S3C2440_MPLL_400MHZ;

/*somedelaybetweenMPLLandUPLL*/

delay(4000);

/*configureUPLL*/

clk_power->UPLLCON=S3C2440_UPLL_48MHZ;

/*somedelaybetweenMPLLandUPLL*/

delay(8000);

/*archnumberofSMDK2440-Board*/

gd->bd->bi_arch_number=MACH_TYPE_S3C2440;

}

/*adressofbootparameters*/

gd->bd->bi_boot_params=0x30000100;

icache_enable();

dcache_enable();

return0;

}

在cpu/arm920t/s3c24X0/speed.c中修改:

在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量

修改get_PLLCLK函数:

staticulongget_PLLCLK(intpllreg)

{

S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

ulongr,m,p,s;

if(pllreg==MPLL)

r=clk_power->MPLLCON;

elseif(pllreg==UPLL)

r=clk_power->UPLLCON;

else

hang();

m=((r&0xFF000)>>12)+8;

p=((r&0x003F0)>>4)+2;

s=r&0x3;

/*supportbothofS3C2410andS3C2440*/

if(gd->bd->bi_arch_number==MACH_TYPE_SMDK2410)

return((CONFIG_SYS_CLK_FREQ*m)/(p<

else

return((CONFIG_SYS_CLK_FREQ*m*2)/(p<

}

修改get_HCLK,get_PCLK:

/*fors3c2440*/

#defineS3C2440_CLKDIVN_PDIVN(1<<0)

#defineS3C2440_CLKDIVN_HDIVN_MASK(3<<1)

#defineS3C2440_CLKDIVN_HDIVN_1(0<<1)

#defineS3C2440_CLKDIVN_HDIVN_2(1<<1)

#defineS3C2440_CLKDIVN_HDIVN_4_8(2<<1)

#defineS3C2440_CLKDIVN_HDIVN_3_6(3<<1)

#defineS3C2440_CLKDIVN_UCLK(1<<3)

#defineS3C2440_CAMDIVN_CAMCLK_MASK(0xf<<0)

#defineS3C2440_CAMDIVN_CAMCLK_SEL(1<<4)

#defineS3C2440_CAMDIVN_HCLK3_HALF(1<<8)

#defineS3C2440_CAMDIVN_HCLK4_HALF(1<<9)

#defineS3C2440_CAMDIVN_DVSEN(1<<12)

/*returnHCLKfrequency*/

ulongget_HCLK(void)

{

S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

unsignedlongclkdiv;

unsignedlongcamdiv;

inthdiv=1;

/*supportbothofS3C2410andS3C2440*/

if(gd->bd->bi_arch_number==MACH_TYPE_SMDK2410)

return((clk_power->CLKDIVN&0x2)?

get_FCLK()/2:

get_FCLK());

else

{

clkdiv=clk_power->CLKDIVN;

camdiv=clk_power->CAMDIVN;

/*workoutclockscalings*/

switch(clkdiv&S3C2440_CLKDIVN_HDIVN_MASK){

caseS3C2440_CLKDIVN_HDIVN_1:

hdiv=1;

break;

caseS3C2440_CLKDIVN_HDIVN_2:

hdiv=2;

break;

caseS3C2440_CLKDIVN_HDIVN_4_8:

hdiv=(camdiv&S3C2440_CAMDIVN_HCLK4_HALF)?

8:

4;

break;

caseS3C2440_CLKDIVN_HDIVN_3_6:

hdiv=(camdiv&S3C2440_CAMDIVN_HCLK3_HALF)?

6:

3;

break;

}

returnget_FCLK()/hdiv;

}

}

/*returnPCLKfrequency*/

ulongget_PCLK(void)

{

S3C24X0_CLOCK_POWER*constclk_power=S3C24X0_GetBase_CLOCK_POWER();

unsignedlongclkdiv;

unsignedlongcamdiv;

inthdiv=1;

/*supportbothofS3C2410andS3C2440*/

if(gd->bd->bi_arch_number==MACH_TYPE_SMDK2410)

return((clk_power->CLKDIVN&0x1)?

get_HCLK()/2:

get_HCLK());

else

{

clkdiv=clk_power->CLKDIVN;

camdiv=clk_power->CAMDIVN;

/*workoutclockscalings*/

switch(clkdiv&S3C2440_CLKDIVN_HDIVN_MASK){

caseS3C2440_CLKDIVN_HDIVN_1:

hdiv=1;

break;

caseS3C2440_CLKDIVN_HDIVN_2:

hdiv=2;

break;

caseS3C2440_CLKDIVN_HDIVN_4_8:

hdiv=(camdiv&S3C2440_CAMDIVN_HCLK4_HALF)?

8:

4;

break;

caseS3C2440_CLKDIVN_HDIVN_3_6:

hdiv=(camdiv&S3C2440_CAMDIVN_HCLK3_HALF)?

6:

3;

break;

}

returnget_FCLK()/hdiv/((clkdiv&S3C2440_CLKDIVN_PDIVN)?

2:

1);

}

}

重新执行makeTX2440_configmakeall生成u-boot.bin,由于还没有增加NANDFlash的支持,所以可烧入NORFlash中运行

在makeall时会出现错误:

没有CAMDIVN

这个要在include/s3c24x0.h中定义,在129行S3C24X0_CLOCK_POWER结构体中增加:

S3C24X0_REG32CAMDIVN;/*fors3c2440*/

支持NANDFlash

首先在配置文件include/configs/TX2440.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND(大概在82行)

编译,出现nand.c的错误和警告

解决:

在include/configs/TX2440.h的最后面增加3个宏:

/*NANDflashsettings*/

#defineCFG_NAND_BASE0//无实际意义:

基地址,在board_nand_init中重新定义

#defineCFG_MAX_NAND_DEVICE1//NANDFlash设备数目为1

#defineNAND_MAX_CHIPS1//每个NAND设备由1个NADN芯片组成

修改配置文件后再编译,只有一个错误了“board_nand_init”函数未定义

board_nand_init需要自己编写,在cpu/arm920t/s3c24x0下新建nand_flash.c

编写之前,需要针对S3C2440NANDFlash定义一些数据结构和函数

在include/s3c24x0.h中增加S3C2440_NAND数据结构(168行)

/*NANDFLASH(seeS3C2440manualchapter6)*/

typedefstruct{

S3C24X0_REG32NFCONF;

S3C24X0_REG32NFCONT;

S3C24X0_REG32NFCMD;

S3C24X0_REG32NFADDR;

S3C24X0_REG32NFDATA;

S3C24X0_REG32NFMECCD0;

S3C24X0_REG32NFMECCD1;

S3C24X0_REG32NFSECCD;

S3C24X0_REG32NFSTAT;

S3C24X0_REG32NFESTAT0;

S3C24X0_REG32NFESTAT1;

S3C24X0_REG32NFMECC0;

S3C24X0_REG32NFMECC1;

S3C24X0_REG32NFSECC;

S3C24X0_REG32NFSBLK;

S3C24X0_REG32NFEBLK;

}/*__attribute__((__packed__))*/S3C2440_NAND;

在include/s3c2410.h中仿照S3C2410_GetBase_NAND函数(96行)

定义2440的函数:

staticinlineS3C2440_NAND*constS3C2440_GetBase_NAND(void)

{

return(S3C2440_NAND*const)S3C2410_NAND_BASE;

}

在cpu/arm920t/s3c24x0/nand_flash.c中添加代码,是从Linux-2.6.13中/drivers/mtd/nand/s3c2410.c中移植过来的,代码略。

修改cpu/arm920t/s3c24x0/Makefile:

COBJS=加上一项nand_flash.o

编译后生成uboot镜像,但这里注意,现在还不支持NANDFLASH启动,只能烧到NORFLASH中。

要支持NANDFLASH启动,要修改cpu/arm920t/start.S,还要编写nand启动函数,这里先不考虑,复制现成的代码过来,以后再说。

支持网卡芯片DM9000

在driver下,有网卡驱动DM9000x.c和DM9000x.h

DM9000接在BANK4,位宽16

在include/configs/TX2440.h中设置网卡基地址:

在56行处,将CS8900的定义改成:

#defineCONFIG_DRIVER_DM90001

#defineCONFIG_DM9000_BASE0x20000300

#defineDM9000_IOCONFIG_DM9000_BASE

#defineDM9000_DATA(CONFIG_DM9000_BASE+4)

#defineCONFIG_DM9000_USE_16BIT

在drivers目录下,只留nandnand_legacydm9000x.cdm9000x.hMakefile

其他文件全部删除,修改Makefile:

COBJS=dm9000x.o

修改顶层目录的Makefile:

将209行的内容

LIBS+=drivers/sk98lin/libsk98lin.a删除

可以将顶层目录下没用的lib_x文件夹删除,只留lib_armlib_generic

编译可生成支持网卡的uboot

设置Linux启动参数

在77行处,加两个宏定义:

/*fortag(s)totransfermessagetokernel*/

#defineCONFIG_SETUP_MEMORY_TAGS1

#defineCONFIG_CMDLINE_TAG1

在#include

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1