以前一直在用vivi,很精简很方便,源码很好懂,想改什么就改什么,但是功能差了点,所以移植个uboot来跑跑,uboot很好很强大,但是想搞清它的机制有点困难,先移植个最简单的试试,还没有增加对yaffs的支持和usb下载,遇到一些小问题也都解决了。
我用的2440开发板,取名为TX2440。
解压U-BOOT-1.1.6,进入U-BOOT目录,修改Makefile:
在smdk2410_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0
加上
TX2440_config : unconfig
@$(MKCONFIG) $(@:_config=) arm arm920t TX2440 NULL s3c24x0
各项的意思如下:
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.o flash.o
将board目录下所有文件夹全部删除,只留TX2440
在include/configs目录下创建板子的配置头文件,把smdk2410.h改名为TX2440.h,再把所有的文件全部删除,只留TX2440.h
测试能否编译成功:
执行make TX2440_config
出现make: execvp: …………/mkconfig: 权限不够
查看mkconfig的权限,发现没有可执行权限,用chmod 764 mkconfig加上权限
然后再make,成功后可出现 Configuring for TX2440 board.....
修改SDRAM配置,在board/TX2440/lowlevel_init.S中,检查
#define B6_BWSCON (DW32) 位宽为32
把B1_BWSCON 改为(DW16) B5_BWSCON 改为(DW8)
根据HCLK设置SDRAM 的刷新参数,主要是REFCNT寄存器,开发板HCLK为100M
将 #define REFCNT 0x1113 改为 #define REFCNT 0x4f4
增加对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 (the value for divider M)+ 8, p = P (the value for divider P) + 2
*/
#define S3C2440_MPLL_400MHZ ((0x7f<<12)|(0x02<<4)|(0x01))
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))
#define S3C2440_CLKDIV 0x05 /* FCLK:HCLK:PCLK = 1:4:8 */
/* S3C2410: Mpll,Upll = (m * Fin) / (p * 2^s)
* m = M (the value for divider M)+ 8, p = P (the value for divider P) + 2
*/
#define S3C2410_MPLL_200MHZ ((0x5c<<12)|(0x04<<4)|(0x00))
#define S3C2410_UPLL_48MHZ ((0x28<<12)|(0x01<<4)|(0x02))
#define S3C2410_CLKDIV 0x03 /* FCLK:HCLK:PCLK = 1:2:4 */
int board_init (void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
/* set up the I/O ports */
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00044555;
gpio->GPBUP = 0x000007FF;
gpio->GPCCON = 0xAAAAAAAA;
gpio->GPCUP = 0x0000FFFF;
gpio->GPDCON = 0xAAAAAAAA;
gpio->GPDUP = 0x0000FFFF;
gpio->GPECON = 0xAAAAAAAA;