1、uboot-2010-03移植 tq2440记录(by fengyong()一.移植环境(1) Vmware6.5-Ubuntu8.04(2) 使用的开发板是 TQ2440,配有 Nor Flash大小为 2MB; NandFlash 256MB。型号是三星的 K9F2GU08A。页的大小是 2KB.我们的开发板 NandFlash是 64MB的,三星的型号是 K9F1208。页的大小是512K。(3) 交叉编译器的版本是 EABI-4.3.3_EmbedSky_20100610.tar.bz2。编译器的选择我们选择 4.3.3(4) 移植的 U-Boot版本号为 u-boot-2010-03
2、。其官方下载地址 ftp:/ftp.denx.de/pub/u-boot/。在该版本中,仍然不支持 s3c2440的处理器,因此必须以 smdk2410为原型,在此基础上进行 U-Boot的移植工作。二.建立自己的开发板目录并测试编译环境(1) 新建一个开发板的相应目录和文件(检测配置问题,看能不能编译出 u-boot.bin)为了不破坏原来的结构目录和代码,在 board目录下建立一个目录embedsky,将 samsung/smdk2410目录复制到 embedsky目录下,并将文件夹改名 smdk2440。 (2) 将 smdk2440/smdk2410.c改名为 smdk2440.c。
3、(3) 在 include/configs目录下,将 smdk2410.h直接复制为 smdk2440.h(4) 修改顶层的 Makefile文件,在其中添加如下的两行:smdk2440_config : unconfig $(MKCONFIG) $(:_config=) arm arm920t smdk2440 embedsky s3c24x0上面第二行一定要记得加 TAB键,这是 Makefile的规则说明:arm :CPU 的架构(ARCH)arm920t:CPU 的类型smdk2440 :对应在 board目录下建立新的开发板项目的目录embedsky:新开发板项目目录的上级目录,如直
4、接在 board下建立新的开发板项目的目录,则这里就为 NULLs3c24x0:CPU 型号注意:编译选项格式的第二行要用 Tab键开始,否则编译会出错,这是Makefile文件的规则.当 Make出错的时候就应该查看是不是,这里写错!(5)修改 board/embedsky/smdk2440目录下的 Makefile文件,因为前面将smdk2410.c文件改名为 smdk2440.c:COBJS := smdk2410.o flash.o改为COBJS := smdk2440.o flash.o(6) 修改根目录下 Makefile将_LIBS := $(subst $(obj),$(LIB
5、S) $(subst $(obj),$(LIBBOARD)改为_LIBS := $(subst $(obj),$(LIBBOARD) $(subst $(obj),$(LIBS)或修改 cpu/arm920t/u-boot.lds文件的.text :cpu/arm920t/start.o (.text)board/embedsky/smdk2440/lowlevel_init.o (.text)board/embedsky/smdk2440/nand_read.o (.text)*(.text)(7)进入 u-boot-2010.03目录,验证环境 先 #make distclean 清理所有
6、以前的编译生成项然后# make smdk2440_configConfiguring for smdk2440 board. 生成一个适合 smdk2440的 configmake 到此,就已经建立了自己的目录,还有测试了编译的环境,如果都正确的话,就可以进行下面的移植工作了。三、修改 u-boot-2010.03中的文件,以便支持 smdk24401.修改/cpu/arm920t/start.S 文件,使 U-BOOT可以从 NandFlash启动(1)删除掉 LED的代码 #include #include start_code:/* set the cpu to SVC32 mode*
7、/mrs r0,cpsrbic r0,r0,#0x1forr r0,r0,#0xd3msr cpsr,r0 bl coloured_LED_init bl red_LED_on(2) 修改寄存器的地址# if defined(CONFIG_S3C2400)# define pWTCON 0x15300000# define INTMSK 0x14400008 /* Interupt-Controller base addresses */# define CLKDIVN 0x14800014 /* clock divisor register */#else# define pWTCON 0x
8、53000000# define INTMSK 0x4A000008 /* Interupt-Controller base addresses */# define INTSUBMSK 0x4A00001C# define CLKDIVN 0x4C000014 /* clock divisor register */# endif后增加:#define CLK_CTL_BASE 0x4C000000#define MDIV_405 (0x7f #include #define _REGb(x) (*(volatile unsigned char *)(x)#define _REGw(x) (
9、*(volatile unsigned short *)(x)#define _REGi(x) (*(volatile unsigned int *)(x)#define NF_BASE 0x4e000000#if defined(CONFIG_S3C2410)#define NFCONF _REGi(NF_BASE + 0x0)#define NFCMD _REGb(NF_BASE + 0x4)#define NFADDR _REGb(NF_BASE + 0x8)#define NFDATA _REGb(NF_BASE + 0xc)#define NFSTAT _REGb(NF_BASE +
10、 0x10)#define NFSTAT_BUSY 1#define nand_select() (NFCONF /* 0x50 */NFADDR = nand-bad_block_offset NFADDR = (i 9) NFADDR = (i 17) NFADDR = (i 25) else if (nand-page_size = 2048) page_num = i 11; /* addr / 2048 */ 除 2048从第三个周期对齐NFCMD = NAND_CMD_READ0;NFADDR = nand-bad_block_offset NFADDR = (nand-bad_b
11、lock_offset 8) NFADDR = page_num NFADDR = (page_num 8) NFADDR = (page_num 16) NFCMD = NAND_CMD_READSTART; 读命令 else return -1;nand_wait();data = (NFDATA if (data != 0xff) 判断是否是坏块return 1; 返回 1表示是坏块return 0;static int nand_read_page_ll(struct boot_nand_t * nand, unsigned char *buf, unsigned long addr)
12、 读一个页的 buf的数据unsigned short *ptr16 = (unsigned short *)buf; buf指针unsigned int i, page_num;nand_clear_RnB();NFCMD = NAND_CMD_READ0; 读命令if (nand-page_size = 512) /* Write Address */NFADDR = addr NFADDR = (addr 9) NFADDR = (addr 17) NFADDR = (addr 25) else if (nand-page_size = 2048) page_num = addr 11;
13、 /* addr / 2048 */* Write Address */NFADDR = 0;NFADDR = 0;NFADDR = page_num NFADDR = (page_num 8) NFADDR = (page_num 16) NFCMD = NAND_CMD_READSTART; else return -1;nand_wait();#if defined(CONFIG_S3C2410)for (i = 0; i page_size; i+) *buf = (NFDATA buf+;/2440#elif defined(CONFIG_S3C2440) for (i = 0; i page_size1); i+) *ptr16 = NFDATA16; 16位总线读方式ptr16+;#endifreturn nand-page_size; 返回读的大小static unsigned short nand_read_id() 返回读的 IDunsigned short res = 0;NFCMD = NAND_CMD_READID;NFADDR = 0;res = NFDATA; 第一个字节 res = (res 8) | NFDATA; 第二个字节 return res; 合并为 16字节的 返回extern unsigned int dynpart_size;