uboot在S3C2440上移植《出自超哥(相广超)
- 格式:doc
- 大小:70.50 KB
- 文档页数:12
s3c2440移值u-boot-2016.03第2篇⽀持Nandflash启动1, 要求:在4K 的代码以内,完成 NOR NAND 类型判断,初始化 NAND 复制⾃⾝到 SDRAM ,重定向。
2, 在 /arch/arm/cpu/arm920t/ ⽂件夹⾥添加⼀个 inic.c 的⽂件,要在这个⽂件⾥⾯做上⾯说的事情。
修改 /arch/arm/cpu/arm920t/Makefile 加⼊ inic.c 的编译。
extra-y = start.oobj-y += init.oobj-y += cpu.oinit.c 最后有补丁⽂件3, 在 start.S 中初始化 SP 后调⽤ init.c 中的初始化 NAND FLASH 和复制 u-boot 到 SDRAM 清BSS 等ldr sp, =4096 #在 NOR 启动时定在这⾥是不能写的,sp 中通常是保存⼊栈出栈,局部变量等,因为函数中并没有⽤到,设不设这⾥都可以。
bl init_sdramldr sp, =0x34000000bl nand_init_ll/*** 从 0 地址开始复制到 SDRAM 中* 在 smdk2440.h 中定义 #define CONFIG_SYS_TEXT_BASE* u-boot 的加载地址*/mov r0,#0ldr r1,=CONFIG_SYS_TEXT_BASEldr r2,=__bss_startsub r2, r2, r1bl copy_code_to_sdrambl clear_bss #清不清都可以,因为重定向那⾥还要在清⼀次,为了以后去掉重定向这⾥也清。
#从⽚内 4K 跳到 SDRAM 中 bl 不⾏,要⽤ ldr pcldr pc,=_main4, 启⽤流程/arch/arm/cpu/arm920t/start.S/arch/arm/lib/crt0.Su-boot 第⼀阶段/common/Board_f.c 中的 board_init_f() 函数最后调⽤jump_to_copy()if (gd->flags & GD_FLG_SKIP_RELOC)return 0;调⽤/arch/arm/librelocate.S relocate_code(gd->start_addr_sp, gd->new_gd, gd->relocaddr);执⾏完毕后返回crt0.Sbl board_init_f下⾯直接执⾏第2阶段,也是因为执⾏了重定位,bl 跳不了ldr pc, =board_init_r5, 如何兼容 NOR FLASH NAND FLASH 启⽤?不改动原来的重定位代码⽐较简单。
S3C2440移植uboot之新建单板_时钟_SDRAM_串口上一节S3C2440移植uboot之启动过程概述我们我们分析了uboot启动流程,这节将开始新建一块单板支持S3C2440。
目录•1.新建单板o 1.1 将2410的单板文件夹拷贝成2440:o 1.2 将2410的头文件拷贝成2440•2.修改boards.cfg,使uboot支持2440单板:•3.修改uboot系统时钟•4.烧写修改后的uboot•5.烧写uboot,发现串口已有数据,但是乱码o 5.1进入arch\arm\cpu\arm920t\s3c24x0\Speed.c下的get_HCLK ()函数:o 5.2编译测试o 5.3所以就直接去掉该文件,不让编译器编译即可,步骤如下所示:1.新建单板1.1 将2410的单板文件夹拷贝成2440:cd /work/system/u-boot-2012.04.01/board/samsungcp smdk2410 smdk2440 -rf1.2 将2410的头文件拷贝成2440cd ../../include/configs/cp smdk2410.h smdk2440.h修改2440文件夹下的smdk2410.c和Makefile文件2.修改boards.cfg,使uboot支持2440单板:仿照smdk2410 arm arm920t - sa msung s3c24x0添加:smdk2440 arm arm920t - sa msung s3c24x0使用make smdk2440_config命令(命令便会调用include/configs/smdk2440.h和board/samsung/smdk2440里的文件来配置uboot)同样的,在windows下把u-boot-2012.04.01.tar_2\u-boot-2012.04.01\board\samsung下的smdk2410拷贝成smdk2440,把u-boot-2012.04.01.tar_2\u-boot-2012.04.01\include\configs smdk2410.h复制为smdk2440.h。
S3C2440移植uboot之支持NAND启动上一节S3C2440移植uboot之新建单板_时钟_SDRAM_串口移植uboot初始化了时钟,配置了支持串口,这一节我们继续修改uboot支持NAND启动。
目录•1.去掉 "-pie"选项•2.修改之前的init.c•3.修改start.s重定位部分•4.修改链接脚本•5.报错修改•6.重新修改链接地址1.去掉 "-pie"选项参考之前uboot使用的start.S, init.c来修改uboot代码新的uboot链接地址位于0,且在arm-linux-ld时加了"-pie"选项, 使得u-boot.bin里多了"*(.rel*)", "*(.dynsym)",从而程序非常大,不利于从NAND启动(重定位之前的启动代码应该少于4K).所以接下来修改代码,并取消"-pie"选项.使用grep "-pie" * -nR找到:arch/arm/config.mk:75:LDFLAGS_u-boot += -pie // LDFLAGS: arm-linux-ld的参数所以屏蔽arch/arm/config.mk文件的"LDFLAGS_u-boot += -pie"这行即可2.修改之前的init.c将以前写uboot里的init.c放入board/samsung/smdk2440目录, 并检查是否有同名函数名,若函数只在同文件使用,则添加static.并修改Makefile 增加对init.c的支持vi board/samsung/smdk2440/Makefile修改include/configs/smdk2440.h文件,将CONFIG_SYS_TEXT_BASE宏改为0x33f80000,也就是uboot重定位后的位置, 这里留了512K空间供给uboot重定位修改完的代码如下所示/* NAND FLASH控制器 */#define NFCONF (*((volatile unsigned long *)0x4E000000)) #define NFCONT (*((volatile unsigned long *)0x4E000004)) #define NFCMMD (*((volatile unsigned char *)0x4E000008)) #define NFADDR (*((volatile unsigned char *)0x4E00000C)) #define NFDATA (*((volatile unsigned char *)0x4E000010))#define NFSTAT (*((volatile unsigned char *)0x4E000020))/* GPIO */#define GPHCON (*(volatile unsigned long *)0x56000070)#define GPHUP (*(volatile unsigned long *)0x56000078)/* UART registers*/#define ULCON0 (*(volatile unsigned long *)0x50000000)#define UCON0 (*(volatile unsigned long *)0x50000004)#define UFCON0 (*(volatile unsigned long *)0x50000008)#define UMCON0 (*(volatile unsigned long *)0x5000000c)#define UTRSTAT0 (*(volatile unsigned long*)0x50000010)#define UTXH0 (*(volatile unsigned char *)0x50000020)#define URXH0 (*(volatile unsigned char *)0x50000024)#define UBRDIV0 (*(volatile unsigned long *)0x50000028)#define TXD0READY (1<<2)void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len);static int isBootFromNorFlash(void){volatile int *p = (volatile int *)0;int val;val = *p;*p = 0x12345678;if (*p == 0x12345678){/* 写成功, 是nand启动 */*p = val;return 0;}else{/* NOR不能像内存一样写 */return 1;}}void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len){int i = 0;/* 如果是NOR启动 */if (isBootFromNorFlash()){while (i < len){dest[i] = src[i];i++;}}else{//nand_init();nand_read_ll((unsigned int)src, dest, len);}}void clear_bss(void){extern int __bss_start, __bss_end__;int *p = &__bss_start;for (; p < &__bss_end__; p++)*p = 0;}void nand_init_ll(void){#define TACLS 0#define TWRPH0 1#define TWRPH1 0/* 设置时序 */NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4); /* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */ NFCONT = (1<<4)|(1<<1)|(1<<0);}static void nand_select(void){NFCONT &= ~(1<<1);}static void nand_deselect(void){NFCONT |= (1<<1);}static void nand_cmd(unsigned char cmd){volatile int i;NFCMMD = cmd;for (i = 0; i < 10; i++);}static void nand_addr(unsigned int addr) {unsigned int col = addr % 2048; unsigned int page = addr / 2048; volatile int i;NFADDR = col & 0xff;for (i = 0; i < 10; i++);NFADDR = (col >> 8) & 0xff;for (i = 0; i < 10; i++);NFADDR = page & 0xff;for (i = 0; i < 10; i++);NFADDR = (page >> 8) & 0xff;for (i = 0; i < 10; i++);NFADDR = (page >> 16) & 0xff;for (i = 0; i < 10; i++);}static void nand_wait_ready(void){while (!(NFSTAT & 1));}static unsigned char nand_data(void) {return NFDATA;}void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len){int col = addr % 2048;int i = 0;/* 1. 选中 */nand_select();while (i < len){/* 2. 发出读命令00h */nand_cmd(0x00);/* 3. 发出地址(分5步发出) */nand_addr(addr);/* 4. 发出读命令30h */nand_cmd(0x30);/* 5. 判断状态 */nand_wait_ready();/* 6. 读数据 */for (; (col < 2048) && (i < len); col++){buf[i] = nand_data();i++;addr++;}col = 0;}/* 7. 取消选中 */nand_deselect();}3.修改start.s重定位部分修改arch/arm/cpu/arm920t/start.S,更改重定位代码。
uboot-1.3.2移植到s3c24101、下载u-boot源码:u-boot-1.3.2.tar.bz22、建立共享文件夹,挂载(自动挂载,固定分配),将源码拷贝到linux下的/home/arm-work/下3、进入linux系统建立/home/arm-work/目录cd/home/arm-work/解压源码:tar jxvf u-boot-1.3.2.tar.gz此时解压后得到u-boot目录,下面即为1.3.2的源码,将其改名为u-boot-1.3.2:mv u-boot u-boot-1.3.2进入到源码目录:cd u-boot-1.3.2/4、现在开始就进行整个源码的移植工作,1、建立自己开发板的目录,我将我的开发板取名为s3c2410,现在大多开发板都是由三星公司的SMDK2410板子改装而来,所以为了尽量地省改文件,将SMDK开发板的相关目录拷贝过来进行修改即可。
建立自己开发板目录:cp-rf board/smdk2410board/s3c2410建立自己开发板的配置头文件:(分析考虑需不需要复制smdk2410.c到s3c2410.c) cp include/configs/smdk2410.h include/configs/s3c2410.h为自己的开发板添加配置:emacs Makefile或vi Makefile在适当位置添中自己的板子smdk2400_config:unconfig@$(MKCONFIG)$(@:_config=)arm arm920t smdk2400NULL s3c24x0smdk2410_config:unconfig@$(MKCONFIG)$(@:_config=)arm arm920t smdk2410NULL s3c24x0s3c2410_config:unconfig@$(MKCONFIG)$(@:_config=)arm arm920t s3c24102410NULL s3c24x0(注意红色部分为我添加或者修改的)此时再终端中输入:make s3c2410_config终端将显示:Configuring for s3c2410board...再进行一下编译:make CROSS_COMPILE=arm-linux-一阵编译的英语飘过……若编译通过,则将会在目录下生成u-boot.bin,表明建立自己的开发板已经成功,可进到第二步,进行相关的修改,以符合自己的开发板。
uboot在2440上移植(一)-xgc94418297的日志-网易博客uboot在2440上移植(一) - xgc94418297的日志 - 网易博客以前一直在用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不太一样。
一、移植环境∙主机:VMWare6.5--Fedora 9∙开发板:自制开发板CPU:S3C2440;SDRAM:HY57V561620FTP-H;NOR flash:SST_39VF1601(2M);NAND flash:K9F1G08U0B(128M);网卡芯片:DM9000EP∙编译器:arm-linux-gcc-4.3.2∙u-boot:u-boot-2009.08∙linux kernel:linux-2.6.30∙busybox:busybox-1.13.3二、博客地址/liuqiqi677如有错误,欢迎指正。
三、参考资料主要参考了黄刚的博客/u3/101649/,他的博客写得相当不错,将嵌入式开发各个阶段的知识以边做边学的方式,辅以图片、解释,清晰地呈现给读者,能够让读者把握主线,对嵌入式开发有整体的了解。
强烈推荐!!!四、问题及解决方法7、Fedora9的bug,“No network connection”我的虚拟机采用桥接的方式与Windows连接,并且在Fedora9中能够ping通Windows XP,但是右上角的网络连接图标无论是否手动激活网卡都会一直提示"No network connection",如图7所示,显示一把红色小叉。
图7 网络连接图标显示无连接这个问题之前一直存在,但是没有找到解决方法,就搁置下来了。
后来,我想用tftp将linux内核下载到开发板上,但是一直不能成功,我就怀疑是不是网络部分没有配置好,因此又去仔细研究了一下,终于发现问题所在!这实际上是Fedora 9 的一个bug。
(以前的版本没用过不清楚)造成这个问题的原因是Network Configuration 图形设置界面的默认选项值与/etc/sysconfig/network-scripts/ifcfg-eth0 配置文件的默认值不一致。
刚装完系统的情况下:在Network Configuration 中,编辑Device 下的eth0,会发现"Controlled by NetworkManager" 是不打勾的。
CPU S3C2440A 主频400MHz,最高533MHzSDRAM hy57v561620ftp-h 2片16bit 32M 串联,最高100MHz Nand Flash K9F1208U00-PCB064M ×8bit Nor Flash AM29LV160DB-90EC 2M ×16bitLCD HST-TPA3.5F 3.5英寸真彩色TFT电阻式触摸屏LCD NET CARDCS8900A-CQ3Z10M 网卡控制芯片16bit 数据传输表1实验板的主要硬件组成图1U-boot 的整体结构1Uboot 移植环境准备1.1移植平台的硬件组成硬件平台是ARM9的体系结构,ARM920T 的CPU ,SOC 芯片是三星的S3C2440,支持Nand Flash 与NorFlash 的可选启动方式,其主要硬件资源如表1所示[1]。
支持Nand Flash 与Nor Flash 启动,可以通过跳线来选择启动方式。
Nand Flash 启动时,最开始4KB 数据被硬拷贝到内部Boot Internal SRAM,且被映射到nGCS0的片选空间0x0000,0000—0x0800,0000;Nor Flash 方式启动时,它直接被映射到nGCS0的片选空间。
所以,在U -boot 移植时,要考虑将Uboot 烧写到Nor flash 上还是Nand Flash 上。
1.2Uboot 工作原理Uboot 的整体结构如图1所示。
从图1可以看出,这种分层结构的Uboot 分模块化了,给移植带来了很大的方便。
由于协议层与应用层是与目标硬件无关的,因此移植工作主要集中在物理层和驱动层上面的修改。
而Uboot 支持串口下载、网络下载,并提供了很多交互式命令。
整个Uboot 编译、连接过程如下:(1)创建编译环境在MAKEFILE 中会调用根目录下Uboot 在S3C2440上的移植卢伟,潘炼(武汉科技大学信息科学与工程学院自动化系,湖北武汉434200)摘要:通过分析Uboot 的文件结构及其启动流程,详细给出了Uboot 在基于ARM920T 开发板上的移植方案,包括编译、调试全过程,最终能够在Uboot 命令方式下加载映像文件,完成Linux 内核与yaffs 映像文件的调试,具有Bootloader 移植的通用性。
U-Boot在S3C2440上的移植方法
张徽;张华春
【期刊名称】《电子器件》
【年(卷),期】2007(030)004
【摘要】Bootloader U-Boot功能齐全、应用广泛但移植到ARM微处理器
S3C2440A上相对比较复杂.简介了常见的Bootloader,归纳了U-Boot的主要特征,分析了其运行过程,介绍了系统存储空间分布和基于S3C2440A微处理器为核心自主开发的嵌入式系统板硬件资源配置,给出了U-Boot在嵌入式系统板上的移植方法、移植过程和移植要点.最后对实验结果进行了测试.目前,U-Boot可以完成设计的功能并能够稳定的运行,为下一步移植Linux操作系统奠定了必需的基础.【总页数】4页(P1423-1426)
【作者】张徽;张华春
【作者单位】中国科学院电子学研究所,北京,100080;中国科学院研究生院,北京,100039;中国科学院电子学研究所,北京,100080
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.U-Boot在S3C2440上的分析和移植 [J], 夏礼勇;符秀辉;
2.U-Boot在S3C2440上移植和设置 [J], 王之磊;李临生
3.U-Boot在S3C2440上的分析与移植 [J], 师磊
4.U-Boot在MicroBlaze处理器上的移植方法 [J], 邓伟;许扬婧
5.U-Boot分析及在S3C2440上的移植 [J], 乔铁柱;孙东
因版权原因,仅展示原文概要,查看原文内容请购买。
uboot在S3C2440上移植《出自超哥(相广超)》2012-06-12 14:30:07分类:嵌入式以前一直在用vivi,很精简很方便,源码很好懂,想改什么就改什么,但是功能差了点,所以移植个uboot来跑跑,uboot很好很强大,但是想搞清它的机制有点困难,先移植个最简单的试试,还没有增加对yaffs的支持和usb下载,遇到一些小问题也都解决了。
用的S3C2440开发板Cpu/arm920t/config.mk解压U-BOOT-1.1.6,进入U-BOOT目录,修改Makefile:在smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 加上S3C2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t S3C2440 NULL s3c24x0 各项的意思如下:arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
S3C2440: 开发板的型号(BOARD),对应于board/S3C2440目录。
NULL: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
在第128行:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-指定交叉编译器,我使用的是3.4.1,这里也可以写绝对路径修改完Makefile后,在board目录下,新建自己的开发板目录S3C2440,把smdk2410目录下的所有文件拷到S3C2440,把smdk2410.c改为S3C2440.c。
修改该目录下的Makefile,把smdk2410.o改为TX2410.o。
COBJS := S3C2440.o flash.o将board目录下所有文件夹全部删除,只留S3C2440在include/configs目录下创建板子的配置头文件,把smdk2410.h改名为S3C2440.h,再把所有的文件全部删除,只留S3C2440.h测试能否编译成功:执行make S3C2440_config出现make: execvp: …………/mkconfig: 权限不够查看mkconfig的权限,发现没有可执行权限,用chmod 764 mkconfig加上权限然后再make,成功后可出现 Configuring for S3C2440 board.....修改SDRAM配置,在board/S3C2440/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/S3C2440/S3C2440.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;gpio->GPEUP = 0x0000FFFF;gpio->GPFCON = 0x000055AA;gpio->GPFUP = 0x000000FF;gpio->GPGCON = 0xFF95FFBA;gpio->GPGUP = 0x0000FFFF;gpio->GPHCON = 0x002AFAAA;gpio->GPHUP = 0x000007FF;/*support both of S3C2410 and S3C2440*/if ((gpio->GSTATUS1 == 0x32410000) || (gpio->GSTATUS1 ==0x32410002)){/*FCLK:HCLK:PCLK = 1:2:4*/clk_power->CLKDIVN = S3C2410_CLKDIV;/* change to asynchronous bus mod */__asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */"orr r1, r1, #0xc0000000\n" /* Asynchronous */"mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */:::"r1");/* to reduce PLL lock time, adjust the LOCKTIME register */ clk_power->LOCKTIME = 0xFFFFFF;/* configure MPLL */clk_power->MPLLCON = S3C2410_MPLL_200MHZ;/* some delay between MPLL and UPLL */delay (4000);/* configure UPLL */clk_power->UPLLCON = S3C2410_UPLL_48MHZ;/* some delay between MPLL and UPLL */delay (8000);/* arch number of SMDK2410-Board */gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;}else{/* FCLK:HCLK:PCLK = 1:4:8 */clk_power->CLKDIVN = S3C2440_CLKDIV;/* change to asynchronous bus mod */__asm__( "mrc p15, 0, r1, c1, c0, 0\n" /* read ctrl register */"orr r1, r1, #0xc0000000\n" /* Asynchronous */"mcr p15, 0, r1, c1, c0, 0\n" /* write ctrl register */:::"r1");/* to reduce PLL lock time, adjust the LOCKTIME register */ clk_power->LOCKTIME = 0xFFFFFF;/* configure MPLL */clk_power->MPLLCON = S3C2440_MPLL_400MHZ;/* some delay between MPLL and UPLL */delay (4000);/* configure UPLL */clk_power->UPLLCON = S3C2440_UPLL_48MHZ;/* some delay between MPLL and UPLL */delay (8000);/* arch number of SMDK2440-Board */gd->bd->bi_arch_number = MACH_TYPE_S3C2440;}/* adress of boot parameters */gd->bd->bi_boot_params = 0x30000100;icache_enable();dcache_enable();return 0;}在cpu/arm920t/s3c24X0/speed.c中修改:在程序开头增加一行DECLARE_GLOBAL_DATA_PTR;,这样才可以使用gd变量修改get_PLLCLK函数:static ulong get_PLLCLK(int pllreg){S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();ulong r, m, p, s;if (pllreg == MPLL)r = clk_power->MPLLCON;else if (pllreg == UPLL)r = clk_power->UPLLCON;elsehang();m = ((r & 0xFF000) >> 12) + 8;p = ((r & 0x003F0) >> 4) + 2;s = r & 0x3;/* support both of S3C2410 and S3C2440 */if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)return((CONFIG_SYS_CLK_FREQ * m) / (p << s));elsereturn((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /* S3C2440 */}修改get_HCLK, get_PCLK:/* for s3c2440 */#define S3C2440_CLKDIVN_PDIVN (1<<0)#define S3C2440_CLKDIVN_HDIVN_MASK (3<<1)#define S3C2440_CLKDIVN_HDIVN_1 (0<<1)#define S3C2440_CLKDIVN_HDIVN_2 (1<<1)#define S3C2440_CLKDIVN_HDIVN_4_8 (2<<1)#define S3C2440_CLKDIVN_HDIVN_3_6 (3<<1)#define S3C2440_CLKDIVN_UCLK (1<<3)#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)#define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4)#define S3C2440_CAMDIVN_HCLK3_HALF (1<<8)#define S3C2440_CAMDIVN_HCLK4_HALF (1<<9)#define S3C2440_CAMDIVN_DVSEN (1<<12)/* return HCLK frequency */ulong get_HCLK(void){S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();unsigned long clkdiv;unsigned long camdiv;int hdiv = 1;/* support both of S3C2410 and S3C2440 */if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK()); else{clkdiv = clk_power->CLKDIVN;camdiv = clk_power->CAMDIVN;/* work out clock scalings */switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {case S3C2440_CLKDIVN_HDIVN_1:hdiv = 1;break;case S3C2440_CLKDIVN_HDIVN_2:hdiv = 2;break;case S3C2440_CLKDIVN_HDIVN_4_8:hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4; break;case S3C2440_CLKDIVN_HDIVN_3_6:hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3; break;}return get_FCLK() / hdiv;}}/* return PCLK frequency */ulong get_PCLK(void){S3C24X0_CLOCK_POWER * const clk_power =S3C24X0_GetBase_CLOCK_POWER();unsigned long clkdiv;unsigned long camdiv;int hdiv = 1;/* support both of S3C2410 and S3C2440 */if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK()); else{clkdiv = clk_power->CLKDIVN;camdiv = clk_power->CAMDIVN;/* work out clock scalings */switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {case S3C2440_CLKDIVN_HDIVN_1:hdiv = 1;break;case S3C2440_CLKDIVN_HDIVN_2:hdiv = 2;break;case S3C2440_CLKDIVN_HDIVN_4_8:hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;break;case S3C2440_CLKDIVN_HDIVN_3_6:hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;break;}return get_FCLK() / hdiv / ((clkdiv & S3C2440_CLKDIVN_PDIVN)? 2:1);}}重新执行make S3C2440_config make all 生成u-boot.bin,由于还没有增加NAND Flash的支持,所以可烧入NOR Flash中运行在make all时会出现错误:没有CAMDIVN这个要在include/s3c24x0.h中定义,在129行S3C24X0_CLOCK_POWER结构体中增加:S3C24X0_REG32 CAMDIVN; /* for s3c2440*/支持NAND Flash首先在配置文件include/configs/S3C2440.h的宏CONFIG_COMMANDS中增加CFG_CMD_NAND (大概在82行)编译,出现nand.c的错误和警告解决:在include/configs/S3C2440.h的最后面增加3个宏:/*NAND flash settings*/#define CFG_NAND_BASE 0 //无实际意义:基地址,在board_nand_init中重新定义#define CFG_MAX_NAND_DEVICE 1 //NAND Flash设备数目为1#define NAND_MAX_CHIPS 1 //每个NAND设备由1个NADN芯片组成修改配置文件后再编译,只有一个错误了“board_nand_init”函数未定义board_nand_init需要自己编写,在cpu/arm920t/s3c24x0下新建nand_flash.c 编写之前,需要针对S3C2440 NAND Flash定义一些数据结构和函数在include/s3c24x0.h中增加S3C2440_NAND数据结构(168行)/* NAND FLASH (see S3C2440 manual chapter 6) */typedef struct {S3C24X0_REG32 NFCONF;S3C24X0_REG32 NFCONT;S3C24X0_REG32 NFCMD;S3C24X0_REG32 NFADDR;S3C24X0_REG32 NFDATA;S3C24X0_REG32 NFMECCD0;S3C24X0_REG32 NFMECCD1;S3C24X0_REG32 NFSECCD;S3C24X0_REG32 NFSTAT;S3C24X0_REG32 NFESTAT0;S3C24X0_REG32 NFESTAT1;S3C24X0_REG32 NFMECC0;S3C24X0_REG32 NFMECC1;S3C24X0_REG32 NFSECC;S3C24X0_REG32 NFSBLK;S3C24X0_REG32 NFEBLK;} /*__attribute__((__packed__))*/ S3C2440_NAND;在include/s3c2410.h中仿照S3C2410_GetBase_NAND函数(96行)定义2440的函数:static inline S3C2440_NAND * const S3C2440_GetBase_NAND(void){return (S3C2440_NAND * const)S3C2410_NAND_BASE;}在cpu/arm920t/s3c24x0/nand_flash.c中添加代码,是从Linux-2.6.13中/drivers/mtd/nand/s3c2410.c中移植过来的,代码略。