之前 mini2440 写过移植,由于平台换了总有些不同,于是重新搞一次。
centOS 5.8 i386
VMware.Workstation.v8.0.1.528992
uboot 1.1.6
sbc2440 (S3C2440A SOC)
注意,有些设置的值是根据具体平台使用的IC而定的,例如这例子用在mini2440上面是不行的,因为
它们的SDRAM 芯片不同,刷新周期也不同。
(一)先安装ARM工具链,我是直接使用了 rtems 4.10 的工具链,安装办法如下:
http://blog.csdn.net/etual/article/details/8237517
arm-rtems4.10-gcc -v 先保证能正确的调用编译链。
下载 uboot
# wget -c ftp://ftp.denx.de/pub/u-boot/u-boot-1.1.6.tar.bz2
~/sbc2440 为工作主目录,其中uboot 作为工作移植,archive放各种压缩包。
/opt/rtems-4.10/bin 放的是工具链,加入环境变量。
$ make CROSS_COMPILE=smdk2410_config
$ make
$ make dist-clean
先保证能正确的编译 smdk2410板子,移植是根据这个来做。
(二)上面都正确。
board 文件夹将 smdk2410 复制一份为 sbc2440,并且mini2440下面的 smdk2410.c 改名
sbc2440.c ,Makefile 里面 COBJS 改为 sbc2440.o
include/configs 目录下复制 smdk2410.h 为 sbc2440.h
修改顶层makefile ,复制一份SMDK的改为 sbc2440
修改makefile 115行左右添加指定交叉编译器
CROSS_COMPILE=arm-rtems4.10
sbc2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t sbc2440 NULL s3c24x0
$ make sbc2440_config
$ make
(三)以上就是建立一个sbc2440的分支,到目前为止还不能调试,接着修改具体的内容。
修改配置文件 /include/configs/sbc2440.h ,暂时先修改这几项
#define CFG_PROMPT "SBC2440 # " 修改提示行
由于debug是使用jlink下载,所以屏蔽系统做底层初始化
#define CONFIG_SKIP_LOWLEVEL_INIT 1
#define CONFIG_SKIP_RELOCATE_UBOOT 1
设置网络
#define CONFIG_ETHADDR 08:00:3e:26:0a:5b
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_IPADDR 192.168.1.110
#define CONFIG_SERVERIP 192.168.1.103
调试的初期我们使用使用jlink设置好SDRAM 控制寄存器,直接下载到SDRAM 中运行,这样是最快的
这里涉及到jlink的初始化脚本。
建议建立一个 eclipse 的项目,非常方便。
1
到 /cpu/arm920t/ 目录下修改 start.S
2440 多了一个中断位,也屏蔽掉。
ldr r1, =0x7ff //0x3ff
ldr r0, =INTSUBMSK
设置分频比,同时设置非同步总线模式
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
mrc p15, 0, r1, c1, c0, 0
orr r1, r1, #0xc0000000
mcr p15, 0, r1, c1, c0, 0
2
修改 /cpu/arm920t/s3c24x0/speed.c
在 static ulong get_PLLCLK(int pllreg) 函数中修改返回值,这是 2440 的时钟计算公式决定的
具体可以查看datasheet
// return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s));
get_HCLK 和 get_PCLK 是根据 get_FCLK 计算来的,可以不改
3
然后来到 /board/sbc2440/sbc2440.c ,如果不破坏原来架构的话,则添加一个选项就可以了。
#define FCLK_SPEED 2
#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 = 202.8MHz */
#define M_MDIV 0xA1
#define M_PDIV 0x3
#define M_SDIV 0x1
#elif FCLK_SPEED==2 /* Fout = 200 MHz */
#define M_MDIV 92
#define M_PDIV 1
#define M_SDIV 2
#endif
4
用gdb加载(注意不能用烧写的办法,因为这里并没有做底层的初始化,靠jlink脚本做的)
已经可以从串口看到提示符和提示信息了。如果还不行,则需要仔细
需要注意的是网卡 CS8900 是在BANK3 上面,所以脚本的BWSCON 和 BANK3 都需要正确设置,按照uboot的设置就可以了。
jlink的脚本如下
target remote 192.168.1.101:2331
monitor reset
monitor halt
monitor speed 8000
monitor endian little
monitor reg cpsr = 0xd3
#MEMCTRL
monitor memU32 0x48000000 = 0x2201D110 #BWSCON
monitor memU32 0x48000004 = 0x00000700 #BANK0-5
monitor memU32 0x48000008 = 0x00000700
monitor memU32 0x4800000c = 0x00000700
monitor memU32 0x48000010 = 0x00001F4C #BANK3
monitor memU32 0x48000014 = 0x00000700
monitor memU32 0x48000018 = 0x00000700
monitor memU32 0x4800001C = 0x00018005 #BANK6-7
monitor memU32 0x48000020 = 0x00018005
monitor memU32 0x48000024 = 0x008C04F5 #REFRESH 2^11 + 1 - HCLK* 7.8 = 1269 = 4F5
monitor memU32 0x48000028 = 0x000000B1 #BANKSIZE
monitor memU32 0x4800002C = 0x00000030 #MRSRB6-7
monitor memU32 0x48000030 = 0x00000030
#break main
load
#continue
5,修改内存控制器,让uboot不依赖jlink,自己可以成功的初始化
config 哪里先屏蔽掉之前为了debug而添加的
//#define CONFIG_SKIP_LOWLEVEL_INIT 1
//#define CONFIG_SKIP_RELOCATE_UBOOT 1
到 /boart/sbc2440/lowlevel_init.S 修改SDRAM 控制器的刷新频率
注意,刷新值是根据不同的SDRAM IC 而不同的,具体要查看datasheet,这里是使用
#define REFCNT 0x4f5
重新编译,然后使用JFLASH软件下载到norflash里面,应该可以看到串口有输出,表示系统时钟已经正常了。
不行的就仔细检查上面哪一步坏了。
第一阶段的工作结束了,这个时候应该可以正常的使用uboot了。
包括基本的命令,能使用TFTP下载文件
Etual
2012-12-12