Uboot移植详解

所需积分/C币:12 2014-10-24 10:37:31 373KB PDF

本文主要讲解Uboot的移植全过程,详细介绍移植的步骤和代码的讲解,让你轻松移植Uboot
看,放在text段的第一个文件就是 start.c编译后的内容,而 start.c中的第一个函 数就是 start,所以 start应该是放在text段的起始位置,因此说 start= TEXT BASE也 不为过。 5.一直不明白的U-BOOT是怎样从4 Steppingstone跳到RAM中执行的,现 在终于明白了。关键在于: Idr pc, start armboot start armboot, word start armboot 这两条语句, Idr pc, start armboot指令把 start armboot这个标签的地方存 放的内容(也即是 start ambo移到PC寄存器里面, start armboot是一个函数地 址,在编译的时候给分配了一个绝对地址,所以上面语句实际上是完成了一个绝 对地址的跳转。而我一直不明白的为什么在 start, S里面有很多BL,B跳转语句都 没有跳出4 Steppingstone,原因是他们都是相对于PC的便宜的跳转,而不是绝 对地址的跳转。还有要补充一下 LDR MOV,LDR伪指令的区别。 LDRR0,0x12345678把地址0x12345678存放的内容放到R0里面 MOV RO.#X 把立即数x放到R0里面,x必须是一个8bits的数移 到偶数次得到的数 LDRR0,=0x12345678把立即数0x12345678放到R0里面 6.在移植u-b00t-13.3以上版本的时候要注意: 在u-boot1.3.3及以上版本 Makefile有一定的变化,使得对于24x0处 理器从nand启动的遇到问题。也就是网上有人说的:无法运行过 lowlcvel init。 其实这个问题是由于编译器将我们自己添加的用于 nandboot的子函数 nand read11放到了4K之后造成的(到这不理解的话,请仔细看看24x0处理 器 nandboot原理)。我是在运行失败后,利用mini2440的4个LED调试发现 u-boot根本没有完成自我拷贝,然后看了 uboot根日录下的 System.map文件就 可知道原因 解决办法其实很简单: LIBS: =$(subst s(obj),s(LIBS))S(subst s(obj),, S (LIBBOARD)) E LIBS:$(subst $(obj),, $(LIBBOARD))$(subst S(obj),, S(LIBS) 7.然后说一下跳转指令。ARM有两种跳转方式 (1) mov pc<跳转地址〉 这种向程序计数器PC直接写跳转地址,能在4GB连续空间内任意朓转。 (2)通过 BBL BLX BX可以完成在当前指令向前或者向后32MB的地址空间 的跳转(为什么是32MB呢?奇器是32位的,此时的值是24位有符号数,所 以32MB)。 B是最简单的跳转指令。要注意的是,跳转指令的实际值不是绝对地址,而是相 对地址——是相对当前PC值的一个偏移量,它的值由汇编器计算得出 BL非常常用。它在跳转之前会在寄存器LR(R14)中保仔PC的当前内容。BL的 经典用法如下: b1NEXT;跳转到NEXT NEXT mov pc, r 从子程序返回。 二.开始上机移植:(红色字体为添加的内容,蓝色字体为修改的内容,下同) 给自己的开发板取名为qj2440。 随便找个目录解压 u-boot, Star -xjvf u-boot-1.3.4. tar. gz2 2.进入u-bot目录修改 Makefile(你要编译u-boot那当然少不了配置啦) Scd u-boot-1.3. 4 [ uboot(@localhost u-boot-1.3.4]$ vim makefile修改内容如下 LIBS : -(subst $(obj),(LIBS))$(subst (obj),, S(LIBBOARD)) 改为 LIBS:=$(subst $(obj),, $(LIBBOARD))$subst $(obj),, $(LIBS)) sbc2410x config: unconfig @s(MKCONFIG) S(@: config) arm arm920t sbc2110X NULL s3c21x0 gljt2440 config: unconfig (s(MKCONFIG)$(@: config=) arm arm920t 1jt2440 qljt s3c24x0 各项的意思如下 qljt2440 config:这个名字是将来你配置板子时候用到的名字,参见make q1jt2440 config命令。 arm:CPU的架构(ARCH) arm920:CPU的类型(CPU),其对应于cpu/arm920t子目录。 qjt2440:开发板的型号( BOARD),对应于 board/qljt/q2440目录。 qjt:开发者/或经销商( vender)。s3c24x0:片上系统(SOC)。 4.在/ board子目录中建立自己的开发板qljt2440目录 出于我在上一步板子的开发者/或经销商( vender)中填了qljt,所以开发板q]2440 日录一定要建在/oard子日录中的qt日录下,膂则编译会出错 [uboot(@localhost u-boot-134]S cd board [uboot(@localhost board] S mkdir qljtqljt/qljt2440 [uboot(@localhost board]$ cp -arf sbc24 10x/*qljt/qljt2440/ [uboot(@localhost board S cd qljt/qljt2440 luboot @localhost qljt2440S mv sbc24 1 Ox c qljt2440c [ uboot(@localhost qljt2440jSls可以看到下面这些文件 config. mk flash. c lowlevel init.s Makefile qljt2440 c u-boot. lds [uboot(@localhost qljt2440S vim Makefile COBJS: qjt2440o flash.o 5.在 include/configs中建立开发板所需要的配置头文件 [uboot(@localhost qljt2440]S cd. // [uboot(@localhost u-boot-1. 3.4]S cp include/configs/sbc24 10x h include/configs/qljt2440 h 6.测试交叉编译能否成功 1)配置 [uboot@localhost u-boot-1 3 4]S make qljt2440 config Configure for qljt2440 board (2)测试编译 Luboot(@localhost u-boot-1,3.4]S make 详细信息如下 编译信息最后两行 arm-linux-objcopy--gap-fill-Oxff-O srec u-bootu-boot srec arm-linux-objcopy --gap-fill-=Oxff-o binary u-boot u-boot bin 到此交叉编译成功。 开始针对自己的开发板移植 修改/cpu/arm920 t/start.S 1.1修改寄存器地址定义 #if defined (CoNFIG S. C2400) defined (CONFIG S3C2410)I defined(CONFIG S3C2440) /x turn off the watchdog */ #if defined(CONFIG S3C2400) define pWTCON 0x15300000 d define tmsk 0x14400008/* Interupt-Controller base addresses"/ define clkdivn 0x14800014 /'clock divisor register */ 井else # define pWTCON0x5300000/该地址用来屏蔽看门狗* define INTMSK 0x4A000008 /*Interupt-Controller base addresses ii 地址用来屏蔽中断 # define INtsUbmsk0x4A00001C/该地址用来屏蔽子中断 define CLKDIvn0x4C00014 clock divisor register该地址用来决定 FCLK、HCLK、PCLK的比例* # define ClK CTL base0x4c000000qjt从S3C2440Apdf中可以看出 该寄存器是存放Mpl和Upl的P254* #if defined (CONFIG S3C2440) # define MDiv4050x7f<<12/qj参见P255表,同时要知道本开发板 的Fin是12MHz,需要的Fck(也就 是Mpl是405MHz*/ # define psdiv4050x21/qt同上,同时设定PDV和SDIv的值, PDIV和SDIV参见S3C2440Apdf/ #endif #endif 12修改中断禁止部分 H if defined(CoNFIG S3C2410 ldrr1,=0x7f∥根据2410芯片手册, INTSUBMSK有11位可用, ivi也是0x7,不知为什么U一Boot一直没改过来。但是由于芯 片复位默认 ∥所有的终端都是被屏蔽的,所以这个不影响工作 Idr rO =INTSUBMSK str rl, rOl f endif if defined(CONFIG S3C2440) ldrr1,=0x7ff/根据2440芯片手册, INTSUBMSK有15位可用 Idr rO =INTSUBMSK str rl, rO endit 13修改时钟设置 /时钟控制逻辑单元能够产生s3c2440需要的时钟信号,包括CPU使用的主频 FCLKAHB总线使用的HCLK,APB总线设备使用的PCLK,2440里面的两个 锁相环(PLL),其中一个对应FCLK、HCLK、PCLK,另外一个对应 UCLK(48MHz)*/ /注意:AHP、APB总线的简介参见“AHB与APB总线doc” /x FCLK: HCLK: PCLK=1: 4: 8*/ Idr rO=CLKDIVN moy r1.#5 str rl, rO /这三条协处理器命令确实不知道什么意思,在 ATXJGYBC ql pdf中搜p15和 c1,只知道它们执行以后会把协处理器p15的寄存器c1的最高两位置1,但c1 的最高两位是没有意义啊,弄不懂它的真正意思 不过我却知道这三条语句是从哪里出来的,详细请参考s3c2440的 datasheet和 s3c2440 datasheet中的R1nF和 RI aDoc mrc p15, 0, rl, cl, c0,0 /read ctrl register qljt*/ 0rrr1,r1,#0xc0000000 Asynchronous qljt改变总线模式为异步模 式网上某位朋友说不知到在哪里看到过 如果FCLK与HCLK不同的话就要选择这种模式的 mcr p15, 0, rl, cl, c0,0 /write ctrl register qljt"/ fif defined( CONFIG S3C2440)∥(2440的主频可达533MHz,但听说设到 533MIz时系统 ∥很不稳定,不知是不是 SDRAY和总线配置的影响,所以现在先设到/405MHz, 以后在改进。) /now, CPU clock is 405.00 Mhz qljt*/ mov rl, #CLK CTL BASE /qjt*/ moy r2.#MDIV 405 mpll 405mhz qljt*/ add r2 r2.#PSDIV 405 / mpll 405mhz qljt*/ str r2, rl,#0x04 / MPLLCON glit实际上是设置寄存器 CLK CTL BASE+0x04=0x4c000004的值* #endif #endif / CONFIG S3 C2400 CONFIG S3C2410 CONFIG S3C2440*/ 1.4将从Fash启动改成从 NAND Flash启动。(特别注意:这和2410的程序有 不同,不可混用!!!是拷贝vvi的代码。) 将以下U-Boot的重定向语句段: a#if ndef CONFIG AT9IRM9200 #if 0 #ifndef CONFIG SKIP RELOCATE UBOOt relocate: / relocate U-Boot to RAM adr rO. start /*r0 <- current position of code *7 Idr rl. TEXT BASE /s test if we run from flash or rAM 2/ mp rO, rI / don't reloc during debug beq stack setup Idr r2. armboot start Idr r3. bss start ib r2, r3, r2 /*r2 <-size of armboot dd r2. ro r2 /*r2 < source end address copy loop Idmia rO!,(r3-r103 copy from source address rO)*/ stmia rl!, r3-r10/ copy to target address r cmp ro. n2 until source end addreee [r2*/ ble copy loop #endif /* CONFIG SKIP RELOCATE UBOOT * fendi/CONFIG AT91RM9200 * 然后添加: /*下载了一个vivi源代码看了一下,还真的有下面哪一段代码“/ #ifdef CONFIG S3C2440 NAND BOOT aqljt@acal@@a@@ac@cacass SSSSSSSSSSS a reset NAND /往下四段内容都是针对S3C2440的关于NAND- FLASH的寄存器的设置,具 体有什么作用,看了 datasheet,有些明白有些不明白* mov r1. #NAND CTL BASE ldrr2,((7<<12)(7<<8)(7<<4)(0<<0)) strr2,[r1,#0 NFCONF]这些宏是在 include/ configs/qljt2440.h中被 定义的* ldrr2,[r1,# NFCONF]/还是弄不懂为什么上面一句sr以后还要有这句 的ldr命令?why?难道是多余的? Idr r2,-((1<<4) (0<<D)(<<0)( Active low CE Control str r2, rl, #ONFCONTI Idr r2, rl, #oNFCONTI Idr r2,=(0x6) Ca RnB clear str r2, rl, #ONFSTATI Idr r2, r1, #ONFSTATI mov r2,#Oxff RESET command strb r2, rl, #ONFCMDI / delay一段时间 mov r3.#0 wait nandI. add r3r3.#OxI cmp r3, #Oxa bIt nand 等待nand-fash的复位完毕信号 nand Idr r2, [rl, #onFSTAT wait ready tst r2. #0x4 beg nand Idr r2, rl, #ONFCONTI 0rrr2,r2,#x2@ Flash Memory Chip Disable/在这里先 Display fans ce先,在C函数中对 falsh进行* str r2, [rl, #ONFCONT /操作的时候才 enable,为什么这样操 作不太清楚* /下面这段用来初始化栈指针sp和帧指针f,至于它们的定义和作用参考文件 夹”栈指针sp和帧指针f”里面的内容 记住它们都是与函数调用时候相关的。简单来讲就是子函数被调用以后是通过 指针的相对位置来查找调用参数和局部变量的,但是由于sp经常变化,所以需 要印来协助。* get ready to call C functions (for nand reado) Idr sp, DW STACK START@a setup stack pointer/sp是指堆栈指针* mov fp, #0 no previous frame, so fp=0 (a copy U-Boot to RAM /vivi里面应该是有一段是针对gpio的程序, 也许使用来 debug用的信号灯,这里省略了* / TEXT BASE是 uboot自己的入口地址,在 u-b0ot-1.3.4- board/ quit/qljt2440的 config. mk中定义 有趣的是外国人的逆向思维很厉害,它们很灵活地把它放在 SDRAM的最后 0x80000地方,也就是0x33F80000 ldrr0,= TEXT BASE r0:把u-b0ot复制到ram的那个位置* mov r1.#OxO /r1:从 falsh的那个位置开始复制* movr2,#0x20000 /*r2:复制多大的内容* b nand read l /跳到执行 uboot复制的程序入口,这个函数从哪 里来?也是来自viⅵi的,没办法* tst rO. #OxO /这里特别注意r0的值是指 nand read执行完 以后的返回值,而不是上面 ldrr0,= TEXT BASE的值,初学者往往在这里想不通 beg ok nand read bad nand read: /如果读 nand read失败的话,那么sory,重来, 或者检查硬件* loop2: b loop2 infinite loop ok nand read: 计算机就是好,很容易就可以检测我们放在 SDRAM中的u-b00t是不是nash 中的 uboot 本开发板使用的是nand- falsh的启动方式,板子一上电并不是马上进入 SDRAM 执行程序的。是这样的:板子一上电,S3C2440自动把nand- falsh中从0地址 开始的4 Kbytes复制到S3C2440集成的某个缓冲区里面(起始地址是0x00),从 那里开始执行,那4K程序负责把整个 uboot复制到 SDRAM,然后才跳到 SDRAM开始正真的 UBOOT(这个技术是有个专业名字的我忘记了),* 下面这段程序的作用就是用开始执行的4 Kbytes程序跟我们复制到 SDRAM中 的 uboot的前4K程序进行比较,从而校验 moy rO. #O Idr rl =TEXT BASE mov r2, #0x400 a 4 bytes =1024= 4K-bytes go next: Idr r3, r0,#4

...展开详情
试读 38P Uboot移植详解
img

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐
    Uboot移植详解 12积分/C币 立即下载
    1/38
    Uboot移植详解第1页
    Uboot移植详解第2页
    Uboot移植详解第3页
    Uboot移植详解第4页
    Uboot移植详解第5页
    Uboot移植详解第6页
    Uboot移植详解第7页
    Uboot移植详解第8页
    Uboot移植详解第9页
    Uboot移植详解第10页
    Uboot移植详解第11页
    Uboot移植详解第12页

    试读已结束,剩余26页未读...

    12积分/C币 立即下载 >