|
我的环境是:TQ2440 U-Boot 2009.11 arm-linux-gcc-4.3.3 Nor Flash的型号是EN29LV160AB
我先移植过程是这样的:
首先复制board/samsung/smdk2410为board/samsung/arm2440
复制board/samsung/arm2440/smdk2410.c为board/samsung/arm2440/arm2440.c
还要记得修改自己的开发板arm2440目录下的Makefile文件,不然编译时会出错:
vim Makefile
COBJS := arm2440.o flash.o
拷贝include/configs/smdk2410.h到arm2440.h,
修改Makefile文件在其中添加:
arm2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t arm2440 NULL s3c24x0
然后就可以运行:
make arm2440_config
能够编译成功说明当前配置成功
修改include/configs/arm2440.h
/*
c * 网卡的配置信息
*/
#define CONFIG_DRIVER_DM9000 1
#define CONFIG_DM9000_BASE 0x20000300
#define DM9000_IO CONFIG_DM9000_BASE
#define DM9000_DATA (CONFIG_DM9000_BASE + 4)
#define CONFIG_DM9000_USE_16BIT
并删除原来的网卡配置
运行:
make arm2440_config
出现了错误net/net.c:252: undefined reference to `eth_send'..........
这是因为在做网卡配置时有个宏定义被我屏蔽了需要改回来:
/*
* Hardware drivers
*/
#define CONFIG_NET_MULTI
//#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 */
然后就能够编译成功说明当前配置成功
并指定norflash
#define CONFIG_AMD_LV800 1 /* uncomment this if you have a LV800 flash */
#define CONFIG_SYS_MAX_FLASH_BANKS 1 /* max number of memory banks */
#ifdef CONFIG_AMD_LV800
#define PHYS_FLASH_SIZE 0x00200000 /* 1MB */
#define CONFIG_SYS_MAX_FLASH_SECT (19) /* max number of sectors on one chip */
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x1F0000) /* addr of environment */
修改board/samsung/arm2440/arm2440.c
这个文件是由原来的 board/samsung/arm2440/smdk2410.c 来的。笔者修改了这段:
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */
#define M_MDIV 0xC3
#define M_PDIV 0x4
#define M_SDIV 0x1
#elif FCLK_SPEED==1 /* Fout = 75MHz */
#define M_MDIV 42 /* 42*/
#define M_PDIV 0x2 /* 0x3 */
#define M_SDIV 0x2
#endif
这段代码修改了 MPLL的时钟。它是为了迎合波特率计算公式的设置的。然
后在该文件里的 board_init 函数, 笔者把UPLLCON的配置和 MPLLCON的配置
顺序颠倒下。可能这是 2410 与 2440 的区别。S3C2440 的 datasheet 文档中明确
规定,必须先初始化 UPLLCON,然后延迟一段时间后才能初始化 MPLLCON。
/* configure UPLL */
clk_power->UPLLCON = ((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV);
/* some delay between MPLL and UPLL */
delay (0xffff);
delay (0xffff);
delay (0xffff);
/* configure MPLL */
clk_power->MPLLCON = ((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV);
/* some delay between MPLL and UPLL */
delay (0xffff);
delay (0xffff);
delay (0xffff);
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00055555;
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 = 0xFF94FFBA;
gpio->GPGUP = 0x0000FFEF;
gpio->GPGDAT = gpio->GPGDAT & (~(1<<4)) | (1<<4) ;
gpio->GPHCON = 0x002AFAAA;
gpio->GPHUP = 0x000007FF;
gpio->GPJCON = 0x02aaaaaa;
gpio->GPJUP = 0x00001fff;
在include/s3c24x0.h中的/* I/O PORT (see manual chapter 9) */添加端口定义
/* s3c2440 */
S3C24X0_REG32 res9[4];
S3C24X0_REG32 GPJCON;
S3C24X0_REG32 GPJDAT;
S3C24X0_REG32 GPJUP;
修改cpu/arm920t/s3c24x0/speed.c
static ulong get_PLLCLK(int pllreg)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
ulong r, m, p, s;
if (pllreg == MPLL)
r = clk_power->MPLLCON;
else if (pllreg == UPLL)
r = clk_power->UPLLCON;
else
hang();
if (pllreg == MPLL)
m = 2*(((r & 0xFF000) >> 12) + 8);
else if (pllreg == UPLL)
m = ((r & 0xFF000) >> 12) + 8;
else
hang();
// m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}
修改include/configs/arm2440.h
#define CONFIG_SYS_PROMPT "uboot-zhu # " /* Monitor Command Prompt */
这句是修改在uboot的命令行前的提示符前面的SMDK2410变成我自己定义的
这个时候已经能下到板子上了。
由于当前并未配置从nandflash启动的代码,所有现在启动方式是默认的
也是uboot自带的代码从norfalsh启动,通过TQ2440上原有的norflash启动
uboot1.1.6来用USB口把刚编译的u-boot.bin烧写到norflash中,再重新启动得到串口显示:
U-Boot 2009.11 ( 1鏈?25 2010 - 14:49:38)
DRAM: 64 MB
Flash: 2 MB
*** Warning - bad CRC, using default environment
In: serial
Out: serial
Err: serial
Net: No ethernet found.
uboot-zhu #
uboot-zhu # flinfo
Bank # 1: AMD: 1x Amd29LV800BB (8Mbit)
Size: 2 MB in 19 Sectors
Sector Start Addresses:
00000000 (RO) 00004000 (RO) 00006000 (RO) 00008000 (RO) 00010000 (RO)
00020000 00030000 00040000 00050000 00060000
00070000 00080000 00090000 000A0000 000B0000
000C0000 000D0000 000E0000 000F0000 (RO)
uboot-zhu #
我们的Nor Flash的型号是EN29LV160AB而上面显示为AMD的,但是现在也完全可以对NORFLASH进行读操作
并打印出了NORFLASH内的数据,证明当前的NORFLASH驱动已经可用了
但是在uboot保存环境变量时saveenv,出现
uboot-zhu # saveenv
Saving Environment to Flash...
Error: start address not on sector boundary
请问这是什么原因啊?现在网卡和NORFLASH都好像不大对 |
|