对于1.3.1和1.2.0的差别,我初看了一下,(对于ARM920T内核)应该是增加了对ATMEL公司的AT91RM9200系列处理器的支持。至于S3C24X0系列的芯片,原理上并没有什么大的变化。
一、在U-Boot中建立自己的开发板类型,并测试编译。
我为开发板取名叫: tekkaman2440
[tekkamanninja@ARM9-Host working]$ tar -xjvf u-boot-1.3.1.tar.bz2
1 进入U-Boot目录,修改Makefile(我在fedora 8 下,比较喜欢使用KWrite)
[tekkamanninja@ARM9-Host working]$ cd u-boot-1.3.1
[tekkamanninja@ARM9-Host u-boot-1.3.1]$ kwrite Makefile
@$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0
@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman s3c24x0
arm: CPU的架构(ARCH)
arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
tekkaman2440: 开发板的型号(BOARD),对应于board/tekkaman/tekkaman2440目录。
tekkaman: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
2 在/board子目录中建立自己的开发板tekkaman2440目录
[tekkamanninja@ARM9-Host board]$ mkdir tekkaman tekkaman/tekkaman2440
[tekkamanninja@ARM9-Host board]$ cp -arf sbc2410x/* tekkaman/tekkaman2440/
[tekkamanninja@ARM9-Host board]$ cd tekkaman/tekkaman2440/
[tekkamanninja@ARM9-Host tekkaman2440]$ mv sbc2410x.c tekkaman2440.c
[tekkamanninja@ARM9-Host tekkaman2440]$ kwrite Makefile
COBJS := tekkaman2440.o flash.o
[tekkamanninja@ARM9-Host tekkaman2440]$ cd ../../..
[tekkamanninja@ARM9-Host u-boot-1.3.1]$ cp include/configs/sbc2410x.h include/configs/tekkaman2440.h
1、配置
[tekkamanninja@ARM9-Host u-boot-1.3.1]$ make tekkaman2440_config
Configuring for tekkaman2440 board...
(1) 如果出现:
$ make tekkaman2440_config
Makefile:1927: *** 遗漏分隔符 。 停止。
请在U-boot的根目录下的Makefile的
@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman)
前加上“Tab”键
[tekkamanninja@ARM9-Host u-boot-1.3.1]$make
测试通过后进行下一步
start_code: |
(0)修改寄存器地址定义
#if defined(CONFIG_S3C2400) |
(1)修改中断禁止部分
|
(2)修改时钟设置(2440的主频为405MHz。)
/*now, CPU clock is 405.00 Mhz tekkaman*/ #else mrc p15, 0, r1, c1, c0, 0 /*read ctrl register tekkaman*/ /*now, CPU clock is 202.8 Mhz tekkaman*/ # endif |
红色部分是我添加的,利用vivi的代码。
(3)将从Flash启动改成从NAND Flash启动。
在以下U-Boot的重定向语句段:
#ifndef CONFIG_SKIP_RELOCATE_UBOOT ldr r2, _armboot_start copy_loop: |
的后面添加上:
ldr r2, =( (1<<4)|(0<<1)|(1<<0) ) @ Active low CE Control ldr r2, =(0x6) @ RnB Clear mov r3, #0 @ wait nand2: ldr r2, [r1, #oNFCONT] @ get read to call C functions (for nand_read()) @ copy U-Boot to RAM bad_nand_read: ok_nand_read: notmatch: #endif @ CONFIG_S3C2440_NAND_BOOT #ifdef CONFIG_S3C2410_NAND_BOOT mov r3, #0 @ wait nand2: ldr r2, [r1, #oNFCONF] @ get read to call C functions (for nand_read()) @ copy U-Boot to RAM bad_nand_read: ok_nand_read: notmatch: #endif @ CONFIG_S3C2410_NAND_BOOT |
在“ldr pc, _start_armboot”之前加入:
|
修改目的:如果看到只有LED1亮了,说明U-Boot的第一阶段已完成!(针对友善之臂SBC2440V4,不是这块开发板的,必须修改或不添加)
在 “ _start_armboot: .word start_armboot ” 后加入:
|
2 在board/tekkaman/tekkaman2440加入NAND Flash读函数文件,拷贝vivi中的nand_read.c文件到此文件夹即可:
#define __REGb(x) (*(volatile unsigned char *)(x)) # if defined(CONFIG_S3C2440) #define NFCONF __REGi(NF_BASE + 0x0) //#define GPDAT __REGi(GPIO_CTL_BASE+oGPIO_F+oGPIO_DAT) #define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1)) #define BUSY 4 #define NAND_SECTOR_SIZE 512 /* low level nand read function */ if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { NAND_CHIP_ENABLE; for(i=start_addr; i < (start_addr + size);) { /* Write Address */ NAND_DETECT_RB; for(j=0; j < NAND_SECTOR_SIZE; j++, i++) { # if defined(CONFIG_S3C2410) #define NFCONF __REGi(NF_BASE + 0x0) inline void wait_idle(void) { |
3 修改board/tekkaman/tekkaman2440/Makefile文件
|
4 修改include/configs/tekkaman2440.h文件,添加如下内容:
# if defined(CONFIG_S3C2440) # if defined(CONFIG_tekkaman2440_LED) #endif # if defined(CONFIG_S3C2410)
|
5 修改board/tekkaman/tekkaman2440/lowlevel_init.S文件
依照开发板的内存区的配置情况, 修改board/tekkaman/tekkaman2440/lowlevel_init.S文件,我利用友善之臂提供的vivi源码里的信息做了如下更改:
#if defined(CONFIG_DRIVER_NE2000) #define B3_BWSCON (DW16 + WAIT + UBLB) /* REFRESH parameter */ # if defined(CONFIG_S3C2440) |
6 修改/board/tekkaman/tekkaman2440/tekkaman2440.c
修改其对GPIO和PLL的配置(请参阅开发板的硬件说明和芯片手册):
#if FCLK_SPEED==0 /* Fout = 203MHz, Fin = 12MHz for Audio */ #if defined(CONFIG_S3C2410) #if defined(CONFIG_S3C2440) #if USB_CLOCK==0 #if defined(CONFIG_S3C2410) #if defined(CONFIG_S3C2440) #define U_M_SDIV 0x2 #if defined(CONFIG_S3C2410) #if defined(CONFIG_S3C2440) |
7 为了实现NAND Flash的读写,再次修改/include/configs/tekkaman2440.h
(请格外注意:如果编译时报错,在Linux下用KWrite等有高亮显示的文本编辑器看看文件的注释是不是为注释应有的颜色(KWrite中为灰色),如果不是,则将注释删除。因为#define后面的注释被认为是程序的一部分。建议注释和#define分行写)
#define CONFIG_CMD_ASKENV #define CONFIG_CMD_JFFS2 /* JFFS2 Support 080218 */ #define CONFIG_CMD_USB /* USB Support 080218 */ #define CONFIG_CMD_FAT
...... /* timeout values are in ticks */ #define CFG_ENV_IS_IN_NAND 1 /*---------------------------------------------------------------------- # if defined(CONFIG_S3C2440) #define NAND_CTL_CLRALE(nandptr) |
8、在个文件中添加“CONFIG_S3C2440”,使得原来s3c2410的代码可以编译进来。
(1)/include/common.h文件的第474行:
|
(2)/include/s3c24x0.h文件的第85、95、99、110、148、404行:
将“#ifdef CONFIG_S3C2410”改为
|
顺便在其中加入2440 的NAND FLASH 寄存器定义(第160行附近)和CAMDIVN定义(第128行附近):
|
(3)/cpu/arm920t/s3c24x0/interrupts.c文件的第33行: