《linux是这样“被”移植的》新书试读之U-Boot启动代码分析

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/niuniumenghua/article/details/6490832

                                         《linux是这样“被”移植的》新书试读之U-Boot启动代码分析

华清远见非著名讲师  O(_)O  牛牛猛

点击链接加我好友!

http://student.csdn.net/invite.php?u=111047&c=758a60d66d3a92d1

欢迎大家去我CSDN博客上踩踩

http://blog.csdn.net/mistyeyed

 

 

 

 

 前几天写了关于CE的驱动分析,好像难了点,今天发个稍微简单的点的,就是传说中嵌入式Linux中常用的U-boot启动代码分析,这是我平时我讲课时的讲义,将要整理成书,这里先和大家分享一下,也许您的意见会体现在我的新书里哦!

分析cpu/arm920t/start.s文件

打开cpu/arm920t/start.s文件

s3c2440复位之后,pc指针会指向0x0地址。在u-boot代码中,该0x0地址是一个向量表,第一条指令跳转branch到复位代码start_code 位于cpu/arm920t/start.S汇编语言文件最开始的地方:

.globl     _start  /*定义一个全局变量,_start,也就是程序的入口点*/

_start:  b    start_code  /*程序入口点是一条跳转指令,跳转到start_code 入口执行*/

 

 

 

 

 

 

 

/*定义中断向量表*/

           ldr pc, _undefined_instruction

           ldr pc, _software_interrupt

           ldr pc, _prefetch_abort

           ldr pc, _data_abort

           ldr pc, _not_used

           ldr pc, _irq

           ldr pc, _fiq

 

按照上面定义的异常模式,当发生异常时,执行cpu/arm920t/interrupts.c中定义的中断处理函数。

 

复位指令跳转之后标号为start_code处开始执行,开始执行arm920t处理器的基本初始化。首先修改当前程序状态寄存器CPSR,使处理器进入Supervisor|32 bit ARM模式,

并关闭ARM9TDMI中断和快速中断,这是通过设置CPSR相应掩码实现的:

 

start_code:     /*      * set the cpu to SVC32 mode      */

      mrs r0,cpsr

         bic r0,r0,#0x1f

         orr r0,r0,#0xd3

         msr cpsr,r0 

 

 

 

 

 

 

 

 

紧接着,将S3C2410特有的WTCON寄存器清零,此举仅为关闭看门狗,因为系统启动时一般不需要看门狗的支持。

 

  ldr r0, =pWTCON

 mov r1, #0x0

 str r1, [r0]

 

然后将S3C2410中断控制器INTMSK寄存器置为全1INTSUBMSK置为0x7ff,禁止全部中断源。S3C2410手册中对此有详细描述:

 

mov r1, #0xffffffff

       ldr r0, =INTMSK

       str r1, [r0]

 

       # if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442) || /    defined(CONFIG_S3C2443)

 

       ldr r1, =INTSUBMSK_val

       ldr r0, =INTSUBMSK

       str r1, [r0]

       # endif

 

 

接下来,访问arm920t控制寄存器CP15,并置位最高两位

31,30]。此两位置为0b11后,处理器时钟被设置为异步模式,

许处理器异步访问总线:

 

 

   mrc p15, 0, r1, c1, c0, 0

       orr r1, r1, #0xc0000000

       mcr p15, 0, r1, c1, c0, 0

 

 

至此arm920t相关的配置完成。

 

 

 

 

 

 

 

 

 

 

 

展开阅读全文

u-bootlinux里面都是这样

03-29

我用的ppc405ex的CPU,网口用的PHY是Micrel KSZ8041,连成了MII模式,把uboot和linux都改了点东西,但是改了后在u-boot里面和linux里面网口发送和接收数据好像都不行。但是把板子通过网口连到电脑上,电脑的网络显示是连接的。还有一个现象是把板子连到电脑上后在板子上ping电脑,发现板子网口上有一个LED灯是常亮的,还有一个闪的比较慢,基本上过一两秒钟闪一下,在u-boot和linux里面都是这样。rn我在u-boot里改了include/configs/kilauea.h文件(因为用的CPU是ppc405ex,所以也借用了AMCC的kilauea demo板的配置),把网络部分改成下面:rn#define CONFIG_MII 1rn//# define CONFIG_PHY_CLOCK_FREQ 25000000 rn//#define CONFIG_M88E1111_PHY 1 rn#define CONFIG_IBM_EMAC4_V4 1rn//#define CONFIG_EMAC_PHY_MODE EMAC_PHY_MODE_RGMII_RGMII rn#define CONFIG_EMAC_PHY_MODE EMAC_PHY_MODE_NONE_MIIrn#define CONFIG_PHY_ADDR 1 /* PHY address, See schematics */rnrn#define CONFIG_PHY_RESET 1 /* reset phy upon startup */rn//#define CONFIG_PHY_GIGE 1 /*disable Include GbE speed/duplex detection */rnrn#define CONFIG_HAS_ETH0 1rnrn//#define CONFIG_HAS_ETH1 1 /* disable add support for "eth1addr" */rn//#define CONFIG_PHY1_ADDR 2rnrn把linux的设备树(dtb)也改了一下(arch/powerpc/boot/dts/kilauea.dts) ,重新编译出kilauea.dtb。kilauea.dts的网络部分修改如下(主要是phy-mode改成MII):rnEMAC0: ethernet@ef600900 论坛

s3c2416 U-Boot移植nand flash启动问题(SD启动正常)

08-06

我们用的是s3c2416的核心板,自己做的底板,SD卡的U-Boot移植成功,rnrn现在出现两个问题,第一个是:rnrnSD启动在U-Boot中敲入 nand scrub 出现这样的信息:rnrnSAM2416EDK # nand scrub rn rnNAND scrub: device 0 whole chip rnWarning: scrub option will erase all factory set bad blocks! rn There is no reliable way to recover them. rn Use this command only for testing purposes if you rn are sure of what you are doing! rn rnReally scrub this NAND flash? rnErasing at 0x31e0000 -- 39% complete. rn[color=#FF0000]NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5 [/color] rnErasing at 0x35c0000 -- 42% complete. rn[color=#FF0000]NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5 [/color] rnErasing at 0x5fe0000 -- 75% complete. rn[color=#FF0000]NAND 128MiB 3,3V 8-bit: MTD Erase failure: -5 [/color] rnErasing at 0x7fe0000 -- 100% complete. rnScanning device for bad blocks rn[color=#FF0000]s3c-nand: ECC uncorrectable error detected rns3c-nand: ECC uncorrectable error detected rns3c-nand: ECC uncorrectable error detected rns3c-nand: ECC uncorrectable error detected rns3c-nand: ECC uncorrectable error detected rns3c-nand: ECC uncorrectable error detected [/color] rnOK rnrnrn第二个问题是,从Nand启动进不了U-Boot,循打印这样的信息:rnU[color=#FF0000]-Boot 1.3.4 (Mar 24 2010 - 09:54:0 for SMDK2416rnrnrnCPU: S3C2416@400MHzrn Fclk = 800MHz, Hclk = 133MHz, Pclk = 66MHzrnBoard: SMDK2416 DDR2rnDRAM: 64 MBrnFlash: 1 MBrnNAND: data abortrnpc : [] lr : []rnsp : c3ffff5c ip : e58de000 fp : 00000000rnr10: 000008c8 r9 : 00000000 r8 : c3ebffdcrnr7 : 24564236 r6 : 00000000 r5 : c3e38ab8 r4 : c3e38b6crnr3 : e24dd704 r2 : e24dce3c r1 : 0000005b r0 : e58de000rnFlags: nzCv IRQs off FIQs off Mode SVC_32rnResetting CPU ...[/color]reset...rnrn搞了三天了,还没找到原因,希望各位帮帮忙. 论坛

没有更多推荐了,返回首页