U-Boot在ARM S3C2410上的移植
- 格式:doc
- 大小:36.50 KB
- 文档页数:6
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,更改重定位代码。
U-Boot移植(3)增加对S3C2440的⽀持昨天跟张⽼师去打乒乓球了,还没写完今天接着写。
6、S3C2440是S3C2410的改进版,它们的操作基本相似,只是在系统时钟的设置、NAND Flash控制器的操作等⽅⾯有⼀些⼩差别。
⽽下⾯我要做的就是令⼀个U-Boot⼆进制代码既可以在S3C2410上运⾏,也可以在S3C2440上运⾏。
虽说我的板也是S3C2410的,但是增加S3C2440的U-Boot练习,可以提⾼我们的能⼒,为后⾯的学习打下基础。
GSTATUS1寄存器的值:0x32410000表⽰S3C2410,0x32410002表⽰S3C2440。
S3C2410:FCLK=200MHZ;S3C2440:FCLK=400MHZ,UCLK=48MHZ;搞清楚之后,下⾯我们就可以开始了。
⾸先先在board/100ask24x0/100ask24x0.c 中的前⾯定义如下⼀些值:我的开发板输⼊时钟为12MHZ,如果你的开发板时钟和我的不⼀样的话,可以根据以前代码中的公式计算,然后修改系统时钟,这在include/configs/100ask24x0.h中的宏CONFIG_SYS_CLK_FREQ中定义。
接下来,就是使⽤不同的宏设置系统时钟,包括S3C2410、S3C2440。
7、在后⾯设置串⼝波特率时需要获得系统时钟,就是在U-Boot的第⼆个阶段,即是lib_arm/board.c中start_armboot函数调⽤serial_init函数初始化串⼝时,会调⽤get_PCLK、get_HCLK、get_PLLCLK等函数,这需要我们作相应的修改。
⾸先要在board_init函数的开关增加如下⼀⾏,才能使⽤变量gd,因为识别出S3C2410和S3C2440,设置了机器类型ID:gd->bd->bi_arch_number 。
接着在get_PLLCLK函数中增加如下:由于分频系数设置⽅法也不⼀样,get_HCLK、get_PCLK也需要修改。
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,表明建立自己的开发板已经成功,可进到第二步,进行相关的修改,以符合自己的开发板。
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在S3C2410上的移植分析引言BootLoader 是嵌入式系统软件开发的第一个环节,它紧密地将软硬件衔接在一起,对于一个嵌入式设备后续的软件开发至关重要。
BootLoader 还涉及到许多硬件相关的知识,对于普通的嵌入式开发板,它又是不可跳过的步骤,所以做好它的移植工作是必须的,对于后续的开发工作也是有益的。
U-Boot 是当前比较流行、功能强大的BootLoader,它操作简便,可以支持多种体系结构的处理器,同时提供了完备的命令体系。
S3C2410 是三星公司一款基于ARM920T 的嵌入式通用处理器。
本文的移植平台就是以S3C2410 为核心的HHARM9-EDU-R2 开发板,这块开发板的硬件资源配置较为完善。
主要硬件资源有:S3C2410 处理器;1 片Intel TE28f128FLASH ( 16M);2 片Hynix HY57V561620 SDRAM(64M);10/100M 自适应网络芯片DM9000;USBHost/Device;RS232×2/RS485×1串口;LQ035FLM08L 256K 色TFT 真彩LCD 显示屏;全功能JTAG 调试口等。
U-Boot 简介U- Boot 是Das U-Boot 的简称,是由denx 软件中心依照GPL 发布的公共软件,作为系统启动的引导模块,U-Boot 支持多种处理器架构,比如Power-PC、ARM、MIPS 和x86 等。
目前,U-Boot 源代码在sourceforge 网站的社区服务器中,Internet 上有一群自由开发人员对其进行维护和开发,它的项目主页是http://sourceforge/ projects/ u-boot。
当下载并解压U-Boot 源码包后,会形成如下的目录结构:board,和一些已有开发板有关的文件;common,实现各种U-Boot 命令的C 文件;cpu,CPU 相关文件,其中的子目录都是以U-Boot 所支持的CPU 命名的;disk,disk 驱动的分区处理代码;doc,文档;drivers,通用设备驱动程序;fs,支持文件系统的文件;include,头文件,对各种硬件平台支持的汇编文件,系统的配置文件和对文件系统支持的文件;net:与网络有关的代码;lib-。
一、Uboot移植前的准备1、修改makefile、配置文件在配置文件之前,需要修改makeflie相关内容:修改如下:(1)修改编译器,这里我们的makefile已经设置为arm-linux-无需再修改,如下所示:ifeq ($(ARCH),arm)CROSS_COMPILE = arm-linux-Endif(2)添加fl2440的配置项,如下所示:fl2440_config:unconfig@$(MKCONFIG) $(@:_config=) arm arm920t fl2440 step s3c24x0注意:在添加的fl2440_config的第二行,必须以Table开头,不能有任何多余的符号,否则极易导致编译错误。
Uboot支持多种处理器和平台,在编译uboot之前需要对其进行配置,使其支持我们自己的开发平台。
在执行编译make之前,需要进行配置即make fl2440_config。
通过查看顶层目录的makeflie文件,通过以下语句:MKCONFIG := $(SRCTREE)/mkconfig得出实际执行的命令为:./mkconfig fl2440 arm arm920t fl2440 step s3c24x0执行完这句后,产生如下结果:(1)开发板名称为fl2440;(2)将include中的头文件连接到同平台相关的头文件中,这里的连接为:asm->asm-armarch->arch-s3c24x0proc->proc-armv(3)创建顶层Makefile包含的文件inclued/config.mk,该文件内容如下ARCH = armCPU = arm920tBOARD = fl2440VENDOR = stepSOC = s3c24x0(4)创建开发板相关头文件include/config.h,该文件中包含了对开发板的相关配置,如下所示:#include <configs/fl2440.h>从上面可以知道,在将uboot配置为适合自己的平台的时候,需要在路径/include/configs下添加配置头文件fl2440.h。
福建电脑2007年第1期基于S3C2410开发板的U-Boot移植分析邹政,江伴东,朱华清(景德镇陶瓷学院信息工程学院江西景德镇333001)【摘要】:Bootloader是操作系统和硬件的枢纽,负责初始化硬件和引导操作系统的内核。
U-Boot是当前比较流行、功能强大的Bootloader,可以支持多种体系结构。
S3C2410是三星公司一款基于ARM920T的嵌入式通用处理器。
本文详细介绍U-Boot的功能、启动工作机理以及在S3C2410开发板上的移植过程。
【关键词】:Bootloader;U-Boot;S3C2410;嵌入式系统;移植0.引言Bootloader(引导装载器)相当于PC机主板上的BIOS,是初始化目标板硬件的基本设置,为接收外部程序做硬件上的准备。
简单地说,Bootloader就是在操作系统内核运行之前运行的一段小程序。
通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。
通常,Boot-loader是依赖于硬件而实现的,特别是在嵌入式世界。
尽管如此,我们仍然可以对Bootloader归纳出一些通用的概念,设计和实现特定的Bootloader。
目前,Linux可以使用的开放源码Boot-loader有RedBoot、U-Boot、Blob和Bootldr等。
1.U-Boot简介U-Boot,全称UniversalBootLoader,是德国DENX小组的开发用于多种嵌入式CPU的Bootloader程序。
它遵循GPL条款,源代码完全开放。
它被认为是功能最多、最具有弹性以及开发最积极的开发源码Bootloader。
它目前由DENXSoftwareEn-gineering的WolfgangDenk维护,并且受到各种开发者的支持。
U-Boot以PPCBoot和ARMBoot计划为基础。
PPCBoot本身基于8xxRom的源码,ARMBoot则是SysgoGmbh将PPCBoot移植到ARM的成果。
移植U-Boot.1.3.1到S3C244和S3C2410首先,U-Boot1.3.1还没有支持s3c2440,移植仍是用2410的文件稍作修改而成的。
2440和2410的区别在我移植1.2.0的文章中已经写了,这里不再赘述。
对于1.3.1和1.2.0的差别,我初看了一下,(对于ARM920T内核)应该是增加了对A TMEL 公司的A T91RM9200系列处理器的支持。
至于S3C24X0系列的芯片,原理上并没有什么大的变化。
一、在U-Boot中建立自己的开发板类型,并测试编译。
我为开发板取名叫: tekkaman24400 在工作目录下解压U-Boot。
[tekkamanninja@ARM9-Host working]$ tar -xjvf u-boot-1.3.1.tar.bz21 进入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#为tekkaman2440建立编译项sbc2410x_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm920t sbc2410x NULL s3c24x0tekkaman2440_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t tekkaman2440 tekkaman s3c24x0LSD1808_config: unconfig@$(MKCONFIG) $(@:_config=) arm arm926ejs lsd1808 NULL am1808各项的意思如下:arm: CPU的架构(ARCH)arm920t: CPU的类型(CPU),其对应于cpu/arm920t子目录。
U-Boot分析及在S3C2440上的移植摘要本文简要介绍Bootloader,分析归纳U-Boot的源码结构及启动过程源码,详细阐述U-Boot在嵌入式开发板S3C2440上的移植过程。
应用结果表明U-Boot在S3C2440上成功移植,为移植Linux操作系统奠定了基础。
关键词Bootloader;U-Boot;S3C2440;移植1 Bootloader简介Bootloader在系统上电时开始执行,初始化硬件设备、准备好软件环境,为调用操作系统内核作好准备。
U-Boot即通用Bootloader是遵循GPL条款的开放源代码项目。
2 U-Boot的源码结构本文在U-Boot-1.1.6的基础上进行分析和移植。
U-Boot-1.1.6根目录下共有26个子目录,可分为4类:平台相关的或开发板相关的;通用的函数;设备的驱动程序;U-Boot工具、示例程序、文档。
3 U-Boot启动过程源码U-Boot属于两阶段的Bootloader。
U-Boot第一段代码分析:硬件设备初始化包括屏蔽所有的中断、设置CPU的速度和时钟频率等;为第二阶段代码准备RAM空间;复制第二阶段代码到RAM空间;设置好堆栈;跳转到第二阶段代码的C入口点。
U-Boot第二段代码分析:初始化本阶段用到得硬件设备;检测系统内存映射;将内核映像和根文件系统映像从FLASH读到RAM空间中;为内核设置启动参数;调用内核。
4 U-Boot移植过程4.1 移植环境硬件环境:CPU:SAMSUNG S3C2440AL;SDRAM内存:64MB SDRAM HY57V561620,地址范围:0x30000000-0x34000000;FLASH存储器:1MB NOR FLASH 芯片AM29LV800;64MB NAND FLASH 芯片K9S1208。
软件环境:RedHat:8.0;U-Boot-1.1.6;交叉编译工具:arm-linux-gcc-3.4.5。
u-boot在S3C2440上的移植问题及解决方法集锦(一)一、移植环境∙主机: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/,他的博客写得相当不错,将嵌入式开发各个阶段的知识以边做边学的方式,辅以图片、解释,清晰地呈现给读者,能够让读者把握主线,对嵌入式开发有整体的了解。
强烈推荐!!!四、问题及解决方法1、NAND flash(K9F1G08U0B)的寻址方案开始照着黄刚的博客进行u-boot移植,u-boot从NOR flash启动比较顺利,但是从NAND flash启动时,就遇到问题了,u-boot不能完全启动!通过在程序中插入点led灯的方法,将问题定位在了NAND flash的读取函数nand_read_ll中对NAND flash单元进行寻址的几条指令上。
这时,问题大概有眉目了,黄刚所用的开发板是友善之臂的mini2440,上面的NAND flash 的型号是K9F1208,容量为64M,与我所用的芯片不一样。
下面比较一下这两款芯片的寻址方案:图1 K9F1208寻址方案图2 K9F1G08寻址方案黄刚博客中K9F1208的寻址代码是:NFADDR = i & 0xFF;NFADDR = (i >> 9) & 0xFF;NFADDR = (i >> 17) & 0xFF;NFADDR = (i >> 25) & 0xFF;而我的K9F1G08的寻址代码则是:NFADDR = 0;NFADDR = 0;NFADDR = (i >> 11) & 0xFF;NFADDR = (i >> 19) & 0xFF;NFADDR = (i >> 27) & 0xFF;但是,这里又出现三个问题了:(1)K9F1G08的寻址方案只有4个周期,而我的代码却有5个周期;(2)为什么前两个周期我给的值都是0;(3)按照芯片手册,第3-5个周期起,移位操作应该分别为(i >> 12)、(i >> 20)、(i >> 28),那为什么却是上面那样的呢?一开始,我也是挺纳闷的,但是通过查找资料与不断试验,终于弄懂了这些原因。
S3C2440移植uboot之启动过程概述上节烧写了uboot到开发板,不能运行。
这节我们分析uboot重新编译uboot,由最后一条链接命令开始分析uboot 目录•1.分析start.S•2._start会跳转到start_code处•3.然后进入第一个C数:board_init_f()•4.接下来进入重定位•5.清除bss段下图为编译uboot后显示的最后一条链接命令。
1.分析start.S打开uboot.lds,发现链接地址为0,所以新的uboot只能在nor flash运行。
运行开始文件为start.o。
下面我们分析arch/arm/cpu/arm920t/start.S从start_code开始运行.globl _start //声明_start全局符号,这个符号会被lds链接脚本用到_start:b start_code //跳转到start_code符号处,0x00ldr pc, _undefined_instruction //0x04ldr pc, _software_interrupt //0x08ldr pc, _prefetch_abort //0x0cldr pc, _data_abort //0x10ldr pc, _not_used //0x14ldr pc, _irq //0x18ldr pc, _fiq //0x20_undefined_instruction: .word undefined_instruction//定义_undefined_instruction指向undefined_instruction(32位地址)_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq.balignl 16,0xdeadbeef //balignl使用,参考/lifexy/p/7171507.html2._start会跳转到start_code处start_code:/*设置CPSR寄存器,让CPU进入管理模式*/mrs r0, cpsr //读出cpsr的值bic r0, r0, #0x1f //清位orr r0, r0, #0xd3 //位或msr cpsr, r0 //写入cpsr#if defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK)/** relocate exception table*/ldr r0, =_startldr r1, =0x0 //r1等于异常向量基地址mov r2, #16copyex:subs r2, r2, #1 //减16次,s表示每次减都要更新条件标志位ldr r3, [r0], #4str r3, [r1], #4 //将_start标号后的16个符号存到异常向量基地址0x0~0x3c处bne copyex //直到r2减为0#endif#ifdef CONFIG_S3C24X0/* 关看门狗*/# define pWTCON 0x53000000# define INTMSK 0x4A000008 /* Interrupt-Controller base addresses */# define INTSUBMSK 0x4A00001C# define CLKDIVN 0x4C000014 /* clock divisor register */ldr r0, =pWTCONmov r1, #0x0str r1, [r0] //关看门狗,使WTCON寄存器=0/*关中断*/mov r1, #0xffffffffldr r0, =INTMSKstr r1, [r0] //关闭所有中断# if defined(CONFIG_S3C2410)ldr r1, =0x3ffldr r0, =INTSUBMSKstr r1, [r0] //关闭次级所有中断# endif/* 设置时钟频率, FCLK:HCLK:PCLK = 1:2:4 ,而FCLK默认为120Mhz*/ldr r0, =CLKDIVNmov r1, #3str r1, [r0]#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit //关闭mmu,并初始化各个bank #endifcall_board_init_f:ldr sp, =(CONFIG_SYS_INIT_SP_ADDR) //CONFIG_SYS_INIT_SP_ADDR=0x30000f80bic sp, sp, #7 //sp=0x30000f80ldr r0,=0x00000000bl board_init_f上面的CONFIG_SYS_INIT_SP_ADDR =0x30000f80,是通过arm-linux-objdump -D u-boot>u-boot.dis生成反汇编,然后从u-boot.dis得到的。
板子配置如下:CPU S3C2410AL-20SDRAM HY57V561620FTP-H4 Banks * 4M * 16bit共32MNAND FLASHK9F5608U0D-PCB032M*8bit网卡DM9000EP其中DM9000位于BANK2,SDRAM 位于BANK6直接从NAND FLASH启动配置的时候需要看清楚器件的BANK 和大小两个参考的连接:/u1/34474/showart.php?id=2085154/u3/105764/showart_2091132.html按照UBoot 的启动流程,修改代码如下一、在U-Boot中建立自己的开发板类型,并测试编译0. 在工作目录下解压u-boot-2009.08.tar.bz21. 进入UBoot 目录,修改Makefile$ gedit Makefile为my2410 建立编译项smdk2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0my2410_config : unconfig@$(MKCONFIG) $(@:_config=) arm arm920t my2410 samsung s3c24x0各项的意思如下:arm: CPU 的架构(ARCH)arm920t: CPU 的类型(CPU),其对应于cpu/arm920t 子目录。
my2410: 开发板的型号(BOARD),对应于board/my/my2410 目录。
samsung: 开发者/或经销商(vender)。
s3c24x0: 片上系统(SOC)。
2. 在代码ifeq ($(HOSTARCH),$(ARCH))CROSS_COMPILE ?=endif前面添加代码CROSS_COMPILE=/opt/crosstool/gcc-4.1.1-glibc-2.3.2/arm-linux/bin/arm-linux-3. 修改下面__LIBS := $(subst $(obj),,$(LIBS)) $(subst $(obj),,$(LIBBOARD))修改为__LIBS := $(subst $(obj),,$(LIBBOARD)) $(subst $(obj),,$(LIBS))4. 在/board 子目录中建立自己的开发板目录$cd board/samsung$mkdir my2410$cp -arvf smdk2410/* my2410/ /*copy*/将文件smdk2410.c重命名为my2410.c$cd my2410$mv smdk2410.c my2410.c5. 记得修改自己的开发板my2410 目录下的Makefile 文件,不然编译时会出错:COBJS := my2410.o flash.o$gedit Makefile6. 在include/configs/中建立配置头文件$cd ../../..$cp include/configs/smdk2410.h include/configs/my2410.h7. 软浮点问题解决若编译出现“……uses hardware FP, whereas u-boot uses software FP”,即软浮点问题修改文件u-boot-2009.08/cpu/arm920t/config.mk,(make distclean后,重新编译)注释掉-msoft-floatPLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8 \-msoft-float改为:PLATFORM_RELFLAGS += -fno-strict-aliasing -fno-common -ffixed-r8#\# -msoft-float8. 测试编译能否成功$make my2410_configConfiguring for my2410 board...(如果出现:$ make my2410_configMakefile:1927: *** 遗漏分隔符。
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。
U-Boot在S3C2440上移植和设置
王之磊;李临生
【期刊名称】《工业控制计算机》
【年(卷),期】2012(025)002
【摘要】BootLoader是嵌入式系统开发的重要环节,是操作系统和硬件平台联系
的桥梁,对嵌入式系统的后继开发十分重要.简介了BootLoader U-Boot目录结构、工作流程及其移植的思路和引导内核的方法;给出了移植uboot-2010-03到ARM微处理器S3C2440上,所需操作环境的搭建、具体代码的修改、具体参数的
设置、所需的操作命令及常见错误的处理方法等要点.最后将编译生成了U-Boot.bin文件下载到ARM微处理器S3C2440上,经过测试U-Boot可以达到设计的功能要求并能够稳定的运行而且通过对其正确的配置成功的引导了内核.
【总页数】3页(P84-86)
【作者】王之磊;李临生
【作者单位】太原科技大学,山西太原030024;太原科技大学,山西太原030024【正文语种】中文
【相关文献】
1.U-Boot在S3C2440上的分析和移植 [J], 夏礼勇;符秀辉;
2.U-Boot在S3C2440上的移植方法 [J], 张徽;张华春
3.基于S3C2440嵌入式系统的U-Boot移植 [J], 李鹏勃;靳伍银
4.U-Boot在S3C2440上的分析与移植 [J], 师磊
5.U-Boot分析及在S3C2440上的移植 [J], 乔铁柱;孙东
因版权原因,仅展示原文概要,查看原文内容请购买。
U-Boot在S3c2410上的移植
王淑贞;姚铭;周结华
【期刊名称】《网络新媒体技术》
【年(卷),期】2008(029)004
【摘要】基于Samsung公司的板子S3c2410,实现U-Boot的移植,并成功启动内核和加载文件系统.首先了解移植环境,本文主要是针对最小硬件系统的移植;分析U-Boot的启动原理和启动流程,深刻剖析U-Boot阶段1和阶段2的运行过程;在通用的U-Boot基础上修改其硬件配置,对应于S3c2410板子上的硬件;编译U-Boot,用JTAG口将U-Boot烧写到板子;最后利用U-Boot命令下载,烧写内核和文件系统,复位后成功启动内核,这一步同时证实了所移植的U-Boot的正确性.
【总页数】5页(P95-99)
【作者】王淑贞;姚铭;周结华
【作者单位】厦门大学信息科学与技术学院,厦门,361005;厦门大学信息科学与技术学院,厦门,361005;厦门大学信息科学与技术学院,厦门,361005
【正文语种】中文
【中图分类】TP3
【相关文献】
1.U-Boot在s3c2410上的移植及功能扩展 [J], 吴玉香;周建香;郭建勋
2.基于S3C2410上U-Boot的移植与实现 [J], 张伟;刘斌;董群锋
3.U-Boot在S3C2410系统上的移植与应用 [J], 黄卫军;苗放;郗诚
4.S3c2410上支持Nand Flash的U-Boot移植 [J], 任军华;黄仁;李勇
5.U-Boot的分析及其在S3C2410上的移植 [J], 李园园;李勇;魏权利
因版权原因,仅展示原文概要,查看原文内容请购买。
U-Boot 在ARM S3C2410上的移植2007-06-09 07:54:31 作者:佚名 来源:互连网 浏览次数:57 文字大小:【大】【中】【小】 简介:U-Boot 是用于初始化目标板硬件,为嵌入式操作系统提供目标板硬件配置信息,完成嵌入式操作系统装载、引导和运行的固件程序。
它能够将系统的软硬件紧密衔接在一起。
S3C2410是三星公司的一款基于ARM920T 核的嵌入式 ...关键字:U-Boot ARM S3C2410U-Boot 是用于初始化目标板硬件,为嵌入式操作系统提供目标板硬件配置信息,完成嵌入式操作系统装载、引导和运行的固件程序。
它能够将系统的软硬件紧密衔接在一起。
S3C2410是三星公司的一款基于ARM920T 核的嵌入式通用处理器。
本文将详细介绍U-Boot 在ARM S3C2410开发板上的移植与运行。
U-BOOT 简介U-Boot 支持ARM 、 PowerPC 等多种架构的处理器,也支持Linux 、NetBSD 和VxWorks等多种操作系统。
它提供启动加载和下载两种工作模式。
启动加载模式也称自主模式,一般是将存储在目标板Flash中的内核和文件系统的镜像装载到SDRAM中,整个过程无需用户的介入。
在使用嵌入式产品时,一般工作在该模式下。
工作在下载模式时,目标板往往受外设(一般是PC机)的控制,从而将外设中调试好的内核和文件系统下载到目标板中去。
U-Boot允许用户在这两种工作模式间进行切换。
通常目标板启动时,会延时等待一段时间,如果在设定的延时时间范围内,用户没有按键,U-Boot就进入启动加载模式。
开发板的主要配置包括三星ARM9处理器S3C2410、1个串口和JTAG接口,晶振为12 MHz,系统主频为200MHz。
另外,开发板上还包括1片4M×16位数据宽度的Flash,地址范围为0x01000000~0x01800000和2片8M×16位数据宽度的SDRAM,地址范围为0x30000000~0x32000000。
Flash使用了2410处理器的BANK0单元,由于2410中地址是循环映射的,因而0x01000000 和0x0地址等同。
在本系统中,U-Boot的主要功能包括:建立和初始化RAM;初始化一个串口;检测机器的体系结构,传递MACH_TYPE_xxx的值(SMDK2410)给内核;建立内核的标记列表(tagged list);调用内核镜像。
U-Boot移植步骤为了使U-Boot支持新的开发板,一种简便的做法是在U-Boot已经支持的开发板中选择一种和目标板接近的,并在其基础上进行修改。
代码修改的步骤如下:1)在board目录下创建smdk2410目录,添加smdk2410.c、flash.c、memsetup.s、u-boot.lds和config.mk等;2)在cpu目录下创建arm920t目录,主要包含start.s、interrupts.c、cpu.c、serial.c和speed.c等文件;3)在include/configs目录下添加smdk2410.h,它定义了全局的宏定义等;4)修改u-boot根目录下的Makefile文件:smdk2410_config : unconfig@./mkconfig $(@:_config=) arm arm920t smdk24105)运行make smdk2410_config,如果没有错误,就可以开始进行与硬件相关的代码移植工作。
由于这部分代码与硬件紧密相关,所以要熟悉开发板的硬件配置,可参考各芯片的用户手册。
U-Boot启动过程U-Boot的启动过程可以分成3个阶段。
首先在Flash中运行汇编程序,将Flash中的启动代码部分复制到SDRAM中,同时创造环境准备运行C程序;然后在SDRAM中执行,对硬件进行初始化;最后设置内核参数的标记列表,复制镜像文件,进入内核的入口函数。
1) 程序首先在Flash中运行CPU入口函数/cpu/arm920t/start.s。
具体工作包括:设置异常的入口地址和异常处理函数;配置PLLCON寄存器,确定系统的主频;屏蔽看门狗和中断;初始化I/O寄存器;关闭MMU功能;调用/board/smdk2410中的memsetup. s,初始化存储器空间,设置刷新频率;将U-Boot的内容复制到SDRAM中;设置堆栈的大小,ldr pc, _start_armboot。
board/s3c2410中config.mk文件(TEXT_BASE = 0x31F00000)用于设置程序编译连接的起始地址,在程序中要特别注意与地址相关指令的使用。
当程序在Flash中运行时,执行程序跳转时必须要使用跳转指令,而不能使用绝对地址的跳转(即直接对PC操作)。
如果使用绝对地址,那么,程序的取指是相对于当前PC位置向前或者向后的32MB空间内,而不会跳入SDRAM中。
2) 程序跳转到SDRAM中执行/lib_arm/board.c中的start_armboot()函数。
该函数将完成如下工作:*设置通用端口rGPxCON;rGPxUP;设置处理器类型gd->bd->bi_arch_number = 1 93;设置启动参数地址gd->bd->bi_boot_params = 0x30000100;* env_init:设置环境变量,初始化环境;* init_baudrate:设置串口的波特率;* serial_init:设置串口的工作方式;* flash_init:设置ID号、每个分页的起始地址等信息,将信息送到相应的结构体中;* dram_init:设置SDRAM的起始地址和大小;* env_relocate:将环境变量的地址送到全局变量结构体中(gd->env_addr = (ulong)&(env_ptr->data));* enable_interrupts:开启中断;* main_loop:该函数主要用于设置延时等待,从而确定目标板是进入下载操作模式还是装载镜像文件启动内核。
在设定的延时时间范围内,目标板将在串口等待输入命令,当目标板接到正确的命令后,系统进入下载模式。
在延时时间到达后,如果没有接收到相关命令,系统将自动进入装载模式,执行bootm 30008000 30800000命令,程序进入do_bootm_linux()函数,调用内核启动函数;3) 装载模式下系统将执行do_bootm_linux()函数,0x30008000是内核在SDRAM中的起始地址;0x30800000是ramdisk在SDRAM中的起始地址;0x40000是内核在F lash中的位置,0x100000是数据块的大小;0x140000是ramdisk在FLASH中的位置,0x440000是数据块的大小。
系统调用memcpy()函数将内核从flash和ramdisk复制到SDRAM中,具体如下:memcpy((void *)0x30008000, (void *)0x40000, 0x100000);//复制数据块memcpy((void *)0x30800000, (void *)0x140000, 0x440000);//复制数据块通常,将内核参数传递给Linux操作系统有两种方法:采用struct param_struct结构体或标记列表。
本系统中采用了第二种方法。
一个合法的标记列表开始于ATAG_CORE,结束于ATAG_NONE。
ATAG_CORE可以为空,一个空的ATAG_CORE的size字段设为“2”(0x00000002)。
ATAG_NONE 的size 字段必须设为“0”。
标记列表可以有任意多的标记(tag)。
在嵌入式Linux系统中,通常由U -Boot设置的启动参数有:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD等。
在本系统中,传递参数时分别调用了以下tag:setup_start_tag(bd); //标记列表开始setup_memory_tags(bd); //设置内存的起始位置和大小setup_commandline_tag(bd, commandline); /*Linux内核在启动时可以命令行参数的形式来接收信息,利用这一点可以向内核提供那些内核不能检测的硬件参数信息,或者重载(override)内核检测到的信息,这里char *commandline "initrd=0x30800000,0 x440000 root="/dev/ram" init="/linuxrc" console="ttyS0"";*/setup_ramdisk_tag(bd); //表示内核解压后ramdisk的大小setup_initrd_tag(bd, initrd_start, initrd_end); //设置ramdisk的大小和物理起始地址setup_end_tag(bd); //标记列表结束其中bd_t *bd = gd->bd是指向bd_t 结构体的指针,在该结构体中存放了关于开发板配置的基本信息。
标记列表应该放在内核解压和initrd的bootp程序都不会覆盖的内存区域,同时又不能和异常处理的入口地址相冲突。
建议放在RAM起始的16K大小处,在本系统中即为0x30000100处。
U-Boot调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到 MEM _START+0x8000地址处。
在跳转时,要满足下列条件:a) CPU寄存器的设置:R0=0;R1=机器类型 ID,本系统的机器类型ID=193。
R2=启动参数标记列表在RAM中的起始基地址;b) CPU模式:必须禁止中断(IRQs和FIQs);CPU必须工作在SVC模式;c) Cache和MMU的设置:MMU 必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭。
系统采用下列代码来进入内核函数:theKernel = (void (*)(int, int))ntohl(hdr->ih_ep);theKernel(0, bd->bi_arch_number);其中,hdr是image_header_t类型的结构体,hdr->ih_ep指向内核的第一条指令地址,即Linux操作系统下的/kernel/arch/arm/bo ot/compressed/head.S汇编程序。
theKernel()函数调用应该不会返回,如果该调用返回,则说明出错。