1、S3C2440启动流程我想请问下。主板上的DL1灯是在什么阶段点亮的?2010-6-13 下午 02:40:44 michael: 早上打电话给你,还怕打扰你休息了。原来你们也需要上班。呵呵2010-6-13 下午 02:40:58 Zhilong Wu: 应该在uboot 里.一开机的时候.2010-6-13 下午 02:42:00 michael: 我们现在有些板启动不了。发现UART口没有U-BOOT输出信息。DL1灯不亮2010-6-13 下午 02:44:03 Zhilong Wu: 每个flash 芯片,烧uboot的时候,有没有重新读出一遍,做检查. 确保uboot 是烧好的20
2、10-6-13 下午 02:44:05 michael: DL1灯是UBOOT来控制的还是什么模块控制的?2010-6-13 下午 02:44:51 Zhilong Wu: uboot , 通过cpu的 io2010-6-13 下午 02:47:44 michael: 烧写UBOOT的时候,应该是怎样的流程?我们现在是erase-blank_check-program-verify2010-6-13 下午 02:48:07 Zhilong Wu: 这样也可以2010-6-13 下午 02:49:42 michael: DL1有几个阶段:2010-6-13 下午 02:50:12 michael
3、: 不亮,常亮,慢闪,快速2010-6-13 下午 02:50:32 Zhilong Wu: 在uboot 就是一个状态.2010-6-13 下午 02:50:46 Zhilong Wu: 长亮.2010-6-13 下午 02:51:12 Zhilong Wu: 能闪的时候,表示uboot 没问题.起来wince 了2010-6-13 下午 02:51:21 michael: 噢。也就是说长亮的时候还在执行UBOOT阶段2010-6-13 下午 02:51:30 Zhilong Wu: 是2010-6-13 下午 02:51:41 michael: 慢闪就表示离开了UBOOT运行OS了?201
4、0-6-13 下午 02:51:50 Zhilong Wu: 是2010-6-13 下午 02:52:38 michael: 那慢闪和快速是指示什么的?我们发现有些机器,停留在慢闪阶段。2010-6-13 下午 02:53:04 Zhilong Wu: 慢闪,应该是 wince 正常运行了.2010-6-13 下午 02:53:25 Zhilong Wu: 这样的话,应该是显示有问题.2010-6-13 下午 02:53:46 Zhilong Wu: 串口应该可以看到 启动信息2010-6-13 下午 02:53:53 michael: 是的2010-6-13 下午 02:54:59 mich
5、ael: 那快速又是指示什么状态的?2010-6-13 下午 02:55:13 michael: 那快闪又是指示什么状态的?2010-6-13 下午 02:56:02 Zhilong Wu: 快闪是wince正在启动过程.2010-6-13 下午 02:56:47 Zhilong Wu: 还有就是,硬件中断很多的时候有. 比如鼠标不停移动2010-6-13 下午 02:57:28 michael: 这会有什么影响?2010-6-13 下午 02:58:17 Zhilong Wu: 没有什么影响2010-6-13 下午 02:58:47 Zhilong Wu: 其实你就区分一下这几个过程.201
6、0-6-13 下午 02:59:16 Zhilong Wu: 1. 灯不亮, cpu 基本是没有工作.2010-6-13 下午 03:00:06 Zhilong Wu: 2. 灯常亮,但是没有串口打印. cpu 工作了.2010-6-13 下午 03:00:53 Zhilong Wu: 但是还是除了很大问题. 有可能sdarm,2010-6-13 下午 03:01:31 Zhilong Wu: 3. 灯常亮,有串口打印. 到 go 30201000. 表示uboot 执行完了. 进入wince2010-6-13 下午 03:03:04 Zhilong Wu: 4. 灯快闪后停止变常亮了,但没有
7、显示, 启动wince的过程出了问题.2010-6-13 下午 03:03:57 Zhilong Wu: 5. 灯进入慢闪,而且很有规律. 就是wince 正常运行了. 应该是显示部分有问题. LCD ,逆变器灯2010-6-13 下午 03:05:00 Zhilong Wu: 大概就是这些. 这些也是大体的判断大概那个步骤出了问题2010-6-13 下午 03:05:04 michael: 好的。谢谢这么详细的解析。2010-6-13 下午 03:05:26 michael: 还有就是,在CPU初始化IO口时,IO口的状态不定,会不会导致UBOOT启动不了?因为有些机器连上LCD背光后,有可
8、能启动不了(有时可以启动,有时启动不了,很奇怪)。2010-6-13 下午 03:06:22 Zhilong Wu: 这样的话,你直接有那个主板上的电原口,供电.2010-6-13 下午 03:06:39 Zhilong Wu: 应该是 那个 电源版的问题.2010-6-13 下午 03:06:50 Zhilong Wu: 不要电源版试试2010-6-13 下午 03:06:54 michael: 明白。2010-6-13 下午 03:07:52 michael: 我先根据你的以上的指导去试试。2010-6-13 下午 03:08:01 Zhilong Wu: 好的.启动的处理流程MPLL20
9、10-05-26 21:01S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL。MPLL用于CPU及其他外围器件,UPLL用于USB。用于产生FCLK, HCLK, PCLK三种频率,这三种频率分别有不同的用途:FCLK是CPU提供的时钟信号。HCLK是为AHB总线提供的时钟信号, Advanced High-performance Bus,主要用于高速外设,比如内存控制器,中断控制器,LCD控制器, DMA 等。从S3C2440的DataSheet里可以看到,S3C2440最大支持400MHz的主频,但是这并不意味着一定工作在400MHz下面,可以
10、通过设定MPLL, UPLL寄存器来设定CPU的工作频率。PCLK是为APB总线提供的时钟信号,Advanced Peripherals Bus,主要用于低速外设,比如看门狗,UART控制器, IIS, I2C, SDI/MMC, GPIO,RTC and SPI等。在这里,需要了解一下AMBA system architecture了。这个可以到官方网站下载相关资料。简单的说,AMBA是一种协议,这种协议已经称为片上组织通信的事实上的标准(the de facto standard for on-chip fabric communication)。下面给出英文描述: The AMBA pr
11、otocol is an open standard, on-chip bus specification that details a stategy for the interconnection and management of functional blocks that makes up a system-on-chip(SoC).It facilitates right-first-time development of embedded processors with one or more CPU/signal processors and multiple peripher
12、als. The AMBA protocol enhances a resuable design methodology by defining a common backbone for SoC modules. 需要知道的是,AMBA总线是ARM提出的一种解决方案,它并非唯一的规范,但是因为ARM的广泛使用,AMBA总线也就成为了事实上的规范了。现在AMBA总线最新为AMBA 3 specification版本,包括AMBA 3 AXI Interface、AMBA 3 AHB Interface、AMBA 3 APB Interface、AMBA 3 ATB Interface。而s3
13、c2410还只能支持AMBA 2 specification,这个版本包含AMBA 2 AHB Interface、AMBA 2 APB Interface。也就是在s3c2410的框图中看到的两种总线接口。需要注意的是,这两种总线所连的外设是有区别的。AHB总线连接高速外设,低速外设则通过APB总线互连。显然,对不同总线上的外设,应该使用不同的时钟信号,AHB总线对应Hclk,APB总线对应Pclk。那么事先就应该弄清楚,每条总线对应的外设有那些,这样在设置好时钟信号后,对应外设的初始化的值就要依此而确定了。 AHB bus上的外设有LCD controller(CONT代表controll
14、er,控制器)、USB Host CONT、ExtMaster、Nand CONT和nand flash boot loader、bus CONT、interrupt CONT、power management、memory CONT(sram/nor/sdram等)。 APB bus上的外设有UART、USB device、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。s3c2410有两个pll(phase locked loop,锁相环,在高频中学过,可以实现倍频,s3c2410的高频就是由此电路产生
15、的)。其中一个是MPLL,M即为main,用来产生三种时钟信号:Fclk(给 CPU核供给时钟信号,我们所说的s3c2410的cpu主频为200MHz,就是指的这个时钟信号,相应的,1/Fclk即为cpu时钟周期)、 Hclk(为AHB bus peripherals供给时钟信号,AHB为advanced high-performance bus)、Pclk(为APB bus peripherals供给时钟信号,APB为advanced peripherals bus)。需要注意的是,这两种总线所连的外设是有区别的。AHB总线连接高速外设,低速外设则通 过APB总线互连。显然,对不同总线上的外
16、设,应该使用不同的时钟信号,AHB总线对应Hclk,APB总线对应Pclk。那么事先就应该弄清楚,每条总 线对应的外设有那些,这样在设置好时钟信号后,对应外设的初始化的值就要依此而确定了。 AHB bus上的外设有LCD controller(CONT代表controller,控制器)、USB Host CONT、ExtMaster、Nand CONT和nand flash boot loader、bus CONT、interrupt CONT、power management、memory CONT(sram/nor/sdram等)。 APB bus上的外设有UART、USB device、
17、SDI/MMC、Watch Dog Timer、bus CONT、spi、iic、iis、gpio、rtc、adc、timer/pwm。主时钟源来自外部晶振或者外部时钟。复位后,MPLL虽然默认启动,但是如果不向MPLLCON中写入value,那么外部晶振直接作为系统时钟。这个主要是基于PLL的特点。简单的描述就是,上电复位后,几个ms后晶振起振。当OSC时钟信号稳定之后,nRESET电平拉高(这是硬件自动检测过 程)。这个时候,PLL开始按照默认的PLL配置开始工作,但是特殊性就在于PLL在上电复位后开始是不稳定的,所以s3c2410设计为把Fin在上电 复位后直接作为Fclk,这是MPLL
18、是不起作用的。如果要想是MPLL起作用,那么方法就是写入MPLLCON寄存器值,然后等待LOCKTIME时间 后,新的Fclk开始工作。下面把这些步骤分来来描述,软件步骤部分结合程序进行。 1、上电几个ms后,晶振输出稳定。Fclk=晶振频率。nRESET恢复高电平后,cpu开始执行指令,这完全是硬件动作,不需要软件设置。 2、第一步软件工作: 设置P M S divider control,也就是设置MPLLCON寄存器。 关于PMS,可以看Figure 7-2.寄存器MPLLCON的设置呢,其实有一定的规则,并非你想要的每个Fclk频率都可以得到。官方推荐了一个表PLL VALUE SEL
19、ECTION TABLE,要按照这个进行。否则的话,就需要自己按照公式推算,但是mizi公司并不保证你的设置是合适的。所以,如果想要工作在200MHz,还是按 照vivi的推荐值即可。 step1: set P M S divider controlmov r1, #CLK_CTL_BASE ldr r2, =vMPLLCON_200str r2, r1, #oMPLLCON 其中,MDIV=0x5c,PDIV=0x04,SDIV=0x00.公式Mpll(Fclk)=(mFin)/(p(2s))【m=MDIV+8, p=PDIV+2,s=SDIV】 3、第二步软件工作: 设置CLKDIVN。
20、这一步是设置分频系数,即Fclk为cpu主频,Hclk由Fclk分频得到,Pclk由Hclk分频得到。假设Hclk是Fclk的二分频,Pclk是 Hclk的二分频,那么分频系数比就是Fclk:Hclk:Pclk=1:2:4.那么Hclk为100MHz,总线时钟周期为10ns。Pclk为 50MHz。 step2: change clock dividermov r1, #CLK_CTL_BASEmov r2, #vCLKDIVNstr r2, r1, #oCLKDIVN 4、第三步软件工作: CLKDIVN的补充设置 If HDIVN = 1, the CPU bus mode has to
21、be changed from the fast bus mode to the asynchronous bus mode using following instructions.MMU_SetAsyncBusMode mrc p15,0,r0,c1,c0,0 orr r0,r0,#R1_nF:OR:R1_iA mcr p15,0,r0,c1,c0,0If HDIVN=1 and the CPU bus mode is the fast bus mode, the CPU will operate by the HCLK. This feature can be used to chang
22、e the CPU frequency as a half without affecting the HCLK and PCLK. 看了上段话,只需要翻译出来就可以了。 FCLK:HCLK=1:2.macro MMU_SetAsyncBusMode mrc p15, 0, r0, c1, c0, 0 orr r0, r0, #(R1_iA | R1_nF) mcr p15, 0, r0, c1, c0, 0.endm step3: set asynchronous bus mode MMU_SetAsyncBusMode 5、第四步软件工作:等待locktime时间,让新的Fclk生效 st
23、ep4: stay locktime mov r1, #CLK_CTL_BASE ldr r2, =vLOCKTIMEstr r2, r1, #oLOCKTIME禁止看门狗The Watchdog timer is used toresume the S3C2440A restart on mal-function after its power on; if controller restart is not desired, the Watchdogtimer should be disabled. disable watch dog timer mov r0, #WTCON mov r1
24、, #0x0 str r1, r0禁止中断在初始化的过程中,在中断模式irq下的堆栈初始化之前,为了防止未预制的中断发生,我们必须把中断掩码都掩上。 ldr r0,=INTMSK ldr r1,=0xffffffff ;all interrupt disable str r1,r0 ldr r0,=INTSUBMSK ldr r1,=0x3ff ;all sub interrupt disable str r1,r0初始化堆栈为了在各个CPU模式下在恰当的位置建立堆栈。我们需要初始化SP寄存器。 irq mode msr cpsr_c, #0xd2 ldr sp, =IRQ_STACK_BAS
25、E sys mode msr cpsr_c, #0xdf ldr sp, =SVC_STACK_BASE enable irq interrupts msr cpsr_c, #0x5f拷贝数据系统上电后将自动将NAND FLASH的前4K的内容,加载到地址从0x0000_0000开始的SDRAM中,然后开始执行这4K的代码。所以我们自己需要将烧写在NAND中整个Boot程序拷贝到SDRAM中然后跳转到以后的main处理。 mov r1, #S3C2440_NAND_BASE initial value tacls=3,rph0=7,rph1=7 ldr r2, =0xfff0 ldr r3,
26、r1, #oNFCONF orr r3, r3, r2 str r3, r1, #oNFCONF ldr r3, r1, #oNFCONT orr r3, r3, #1 enable nand controller str r3, r1, #oNFCONT ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */ sub r0, r0, #CFG_MALLOC_LEN /* malloc area */ sub r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo */ sub sp, r0, #12 /* leave
27、3 words for abort-stack */ copy u-boot to RAM ldr r0, _TEXT_BASE mov r1, #0x0 mov r2, #CFG_UBOOT_SIZE bl nand_read_ll tst r0, #0x0 beq ok_nand_readok_nand_read: verify mov r0, #0 ldr r1, =0x33f00000 ldr r1, _TEXT_BASE mov r2, #0x400 4 bytes * 1024 = 4K-bytesgo_next: ldr r3, r0, #4 ldr r4, r1, #4 teq r3, r4 bne notmatch subs r2, r2, #4 beq done_nand_read bne go_nextnotmatch: LDR R0, = GPJDAT LDR R1, = 0x4 STR R1, R01: b 1bdone_nand_read: LDR R0, = GPJDAT LDR R1, = 0x2 STR R1, R0
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1