uboot 1.1.6 移植到SBC2440(一)

之前 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

你可能感兴趣的:(uboot,sbc2440)