Presentation is loading. Please wait.

Presentation is loading. Please wait.

College of Computer Science & Technology

Similar presentations


Presentation on theme: "College of Computer Science & Technology"— Presentation transcript:

1 College of Computer Science & Technology
第四章 BootLoader开发 College of Computer Science & Technology

2 第五章 BootLoader开发 BootLoader的作用 BootLoader的启动流程 BootLoader之vivi
鲁东大学 LUDONG UNIVERSITY BootLoader的作用 BootLoader的启动流程 BootLoader之vivi BootLoader之Uboot (附)

3 什么是BootLoader PC系统-开机/Reset工作过程 操作系统 引导 进入操作系统 硬盘MBR BIOS固件程序 Reset
鲁东大学 LUDONG UNIVERSITY PC系统-开机/Reset工作过程 操作系统 引导 进入操作系统 硬盘MBR BIOS固件程序 Reset

4 嵌入式系统软件结构 什么是BootLoader BootLoader程序 HAL硬件抽象层 嵌入式操作系统 硬件 文件系统 协议栈 GUI
鲁东大学 LUDONG UNIVERSITY 嵌入式系统软件结构 系统正常运行 BootLoader程序 HAL硬件抽象层 嵌入式操作系统 硬件 文件系统 协议栈 GUI 应用程序 Reset

5 用户主应用程序/操作系统运行之前,运行一段专门的代码进行系统的初始化工作。
什么是BootLoader 鲁东大学 LUDONG UNIVERSITY 嵌入式系统开发第一步: BootLoader的移植与烧写 没有BootLoader,系统无法启动 通过JTAG烧写BootLoader 嵌入式系统 用户主应用程序/操作系统运行之前,运行一段专门的代码进行系统的初始化工作。 BootLoader 引导加载程序 位置 存储空间0x 地址 存储空间 BootLoader 复位异常 异常向量 Reset 0x

6 适用于无操作系统/或者简单操作系统 适用于功能完备的嵌入式操作系统 BootLoader开发说明 构建BootLoader
鲁东大学 LUDONG UNIVERSITY 构建BootLoader 适用于无操作系统/或者简单操作系统 BootLoader移植 适用于功能完备的嵌入式操作系统 常用可供移植的BootLoader,主要有 Mizi公司的vivi(专门针对S3c2410) Soureforge开源BootLoader-UBOOT (支持多种架构) Blob(转为Intel ARM处理器,StrongARM, Xscale开发)

7 BootLoader开发说明 BootLoader两种工作模式 下载模式 提供命令行接口; 启动加载模式
鲁东大学 LUDONG UNIVERSITY BootLoader两种工作模式 下载模式 提供命令行接口; 使用命令,可通过串口(UART)或网口下载程序(内核、根文件)到目标板 启动加载模式 完成初始化配置后,自动将OS由Flash加载到RAM,并跳转到内核入口,实现自启动,不需要人为干预。 嵌入式产品发布时,Bootloader必须是启动加载模式。

8 包含依赖于CPU体系结构的硬件初始化代码 汇编语言编写 第二阶段 初始化操作系统内核运行环境 C语言完成
BootLoader结构 鲁东大学 LUDONG UNIVERSITY BootLoader一般分为两个阶段 第一阶段 包含依赖于CPU体系结构的硬件初始化代码 汇编语言编写 第二阶段 初始化操作系统内核运行环境 C语言完成 分段:提高BootLoader的可移植性和可读性

9 第一阶段 基本硬件设备初始化 BootLoader启动流程 为第二阶段准备RAM空间 复制BootLoader第二阶段代码到RAM 堆栈设置
鲁东大学 LUDONG UNIVERSITY 第一阶段 基本硬件设备初始化 为第二阶段准备RAM空间 复制BootLoader第二阶段代码到RAM 堆栈设置 跳转至第二阶段的C程序入口

10 SFR-Special Function Register 决定当前硬件如何工作。
鲁东大学 LUDONG UNIVERSITY 第一阶段与硬件关系紧密 -设置处理器相关硬件的工作状态。 通过设置 SFR-Special Function Register 决定当前硬件如何工作。 即:根据与某硬件相关SFR各位的含义 对SFR进行赋值 SFR虽然名为寄存器,但是映射为内存地址 采用LDR指令进行赋值 S3c2410处理器

11 Special Function Register
鲁东大学 LUDONG UNIVERSITY Special Function Register 映射地址 Bank0-Bank7 total 1GB 128MB/bank 打开手册的memory mapping 图 注意: 0x000_0000 ~0x4000_0000 共1GB,8条Bank,通过GCS选择线,限定范围。0x4000_0000~0x4000_0FFF 内部BootRAM,BootLoader。 0x4800_0000~0x6000_0000映射SFR。 Core图

12 NAND FLASH启动 CPU 4KB Stepping Stone NAND FLASH OS/APP SDRAM bootloader
鲁东大学 LUDONG UNIVERSITY 4KB Stepping Stone NAND FLASH OS/APP SDRAM bootloader

13 BootLoader启动流程之结合vivi
鲁东大学 LUDONG UNIVERSITY 第一阶段 1.基本硬件设备初始化 包括: 禁watchdog 禁中断 初始化系统时钟 初始化内存控制寄存器 初始化电源工作状态 点亮板上LED 串口初始化 传送调试信息 CPU初始化 调试标志 串口打通标志

14 S3c2410-WatchDog 基本特征: 常见操作: 禁止 使能 赋初值 16位内部计数器
鲁东大学 LUDONG UNIVERSITY 基本特征: 常见操作: 16位内部计数器 PCLK时钟信号输入后,通过prescaler预分频和Division分频后,作为计数器的计数时钟信号 可作为普通定时器使用 三个SFR WTCON- 控制寄存器 WTDAT – 重载计数值 WTCNT- 计数寄存器 禁止 使能 赋初值 作WTD使用 作定时器使用 通过LDR命令,向相应SFR寄存器赋值完成。

15 watchdog工作原理 鲁东大学 LUDONG UNIVERSITY

16 vivi第一阶段-禁watchdog 鲁东大学 LUDONG UNIVERSITY The Watchdog timer is used to resume the S3C2410X restart on mal-function after its power on. 特殊功能寄存器 -- WTCON-16位寄存器 [15-8]-prescaler value [5]-enable/disable watch-dog timer [0]-reset enable/disable 应该注意的是:1)各寄存器的初始值(复位值) 2) 启动之前,初始化计数值时,需要初始化WTDAT和WTCNT两个寄存器,WTDAT不会在初始化的时候自动装载到WTCNT寄存器,只有在溢出之后,才会自动加载。 3)做WTD使用,Enable WTD,Enable Reset signal 4) 做计数器使用,Enable WTD, Enable Interrupt 详细位定义参考 手册

17 watch dog 复位值为0x8021 1000,0000,0010,0001 禁watch dog
鲁东大学 LUDONG UNIVERSITY watch dog 复位值为0x8021 1000,0000,0010,0001 @ disable watch dog timer mov r1, #0x mov r2, #0x0 str r2, [r1] [0]位- reset 信号开 [5]位- watch dog开 128预分频

18 WatchDog初始化函数 watch dog操作 “喂狗”代码 rWTCNT=rWTDAT;
鲁东大学 LUDONG UNIVERSITY WatchDog初始化函数 void watchdog_start(int prescaler,int divider,int value) { rWTCON = ((prescaler)<<8)|(divider<<3); //PCLK分频设置; rWTDAT = value; //看门狗定时器的计数常数; rWTCNT = value; //看门都定时器的计数器初始化; rWTCON = rWTCON & ~(1<<2)); //关闭中断请求; rWTCON = rWTCON | 1; //使能RESET信号输出,做看门狗定使用; rWTCON = rWTCON |(1<<5); //启动看门狗; } “喂狗”代码 rWTCNT=rWTDAT;

19 S3c2410-中断控制器 基本特征: 常见操作: 内部、外部中断源56个
鲁东大学 LUDONG UNIVERSITY 基本特征: 常见操作: 内部、外部中断源56个 主中断源30个(ENIT4-7,8-23,UART0-2,ADC\LCD有子中断源) 每个主中断源都可选择采用IRQ或者FIQ模式(但系统中只能有一个FIQ中断源) IRQ判优方式-两级,分组均为Round Robin或固定优先级 SFR-标记、屏蔽、模式、优先级 中断屏蔽寄存器操作 中断优先级模式设置 中断服务程序中,需要对处理中断源的INTPND和SRCPND标记手动清零,否则会重复触发。对应位写1即可。 通过LDR命令,向相应SFR寄存器赋值完成。 中断机制

20 S3c2410-中断控制器 中断源分类 集成外设中断 DMA通道中断 外部中断请求管脚 外部中断请求管脚-EINTn GPIO管脚:
鲁东大学 LUDONG UNIVERSITY 中断源分类 外部中断请求管脚-EINTn GPIO管脚: GPF和GPG口的特殊功能作为外部中断请求管脚 GPF[0:7]共8根,EINT0-7 GPG[0:15]共16根,EINT8-23 可配置触发方式、管脚滤波器、对于4-23有EINTMASK、EINTPEND进行外部中断的屏蔽和记录。 集成外设中断 集成ADC、LCD 各类定时器件: TIMER0-4、RTC、WDT 各类集成通信接口: UART0-2、SPI0-1、IIC、USB、SDIO DMA通道中断 DMA channel 0-3 外部中断请求管脚 EINT0-3(独立主请求源) EINT4-7、EINT8-23

21 中断机制简介 SUBSRCPND-子中断标记(请求)寄存器 INTMOD-中断模式选择寄存器 SUBMASK-子中断屏蔽寄存器
鲁东大学 LUDONG UNIVERSITY S3c2410的中断源个数为56个,其中外部中断ENIT4-7使用同一个中断源(+3),外部中断EINT8-23使用同一个中断源(+15),UART0、1、2的RXD、TXD、ERROR各自对应同一个中断源(UART0(+2),UART1(+2),UART2(+2)),ADC的两种情况ADC和触摸屏TC对应一个中断源(+1),LCD也是两个子中断源对应一个中断源(+1),SRCPND,MASK,INTPND都是32位对应30个中断源(有两个保留位)+子中断请求( )=30+26 =56个中断源。 UART0\1\2\ADC的子中断源的请求及屏蔽通过SUBSCRPND和SUBSRCMASK控制; ENT4-7及ENT8-23由GPIO的特殊功能寄存器 ENITPND、ENITMASK控制; SUBSRCPND-子中断标记(请求)寄存器 INTMOD-中断模式选择寄存器 SUBMASK-子中断屏蔽寄存器 PRIORITY-中断优先级设置寄存器 SRCPND-中断源请求标记寄存器 INTPND-中断响应标记寄存器 (优先级最高) INTMSK-中断屏蔽寄存器

22

23 Vivi第一阶段-禁中断 禁中断 -中断屏蔽寄存器,所有屏蔽位置1 SFR-中断屏蔽寄存器 ①INTMSK ②INTSUBMSK
鲁东大学 LUDONG UNIVERSITY 禁中断 -中断屏蔽寄存器,所有屏蔽位置1 SFR-中断屏蔽寄存器 ①INTMSK ②INTSUBMSK

24 @ disable all interrupts mov r1, #INT_CTL_BASE mov r2, #0xffffffff
vivi第一阶段-禁中断 鲁东大学 LUDONG UNIVERSITY @ disable all interrupts mov r1, #INT_CTL_BASE mov r2, #0xffffffff str r2, [r1, #oINTMSK] ldr r2, =0x7ff str r2, [r1, #oINTSUBMSK] 0x4A000000 0x08 0x1C

25 系统时钟的产生 时钟信号的产生 S3c2410X时钟电路带有两个PLL电路 MPLL-主锁相环电路 MPLL产生三种时钟信号
鲁东大学 LUDONG UNIVERSITY 时钟信号的产生 采用低频的外部晶振(XTIPLL管脚),低频时钟经内部PLL电路,倍频、提纯为高频的工作时钟信号 S3c2410X时钟电路带有两个PLL电路 MPLL-主锁相环电路 UPLL-USB锁相环电路,产生USB工作时钟 MPLL产生三种时钟信号 FCLK-CPU时钟信号 HCLK-AHB时钟信号 PCLK-APB时钟信号

26 S3c2410时钟信号 鲁东大学 LUDONG UNIVERSITY 外部时钟电路要求

27 鲁东大学 LUDONG UNIVERSITY

28 vivi-系统时钟初始化代码 mov r1, #CLK_CTL_BASE mvn r2, #0xff000000
鲁东大学 LUDONG UNIVERSITY mov r1, #CLK_CTL_BASE mvn r2, #0xff000000 str r2, [r1, #oLOCKTIME] ldr r2, mpll_200mhz str r2, [r1, #oMPLLCON] mov r2, #0x3 str r2, [r1, #oCLKDIVN] mrc p15, 0, r1, c1, c0, 0 orr r1, r1, #0xc mcr p15, 0, r1, c1, c0, 0 LOCKTIME 寄存器初始化 MPLLCON 寄存器初始化 CLKDIVN 寄存器初始化 时钟异步

29 系统时钟-特殊寄存器 12MHz外部晶振 MPLL计算公式 MPLL= FIN*(MDIV+8) (PDIV+2)*(2SDIV)
鲁东大学 LUDONG UNIVERSITY mpll_200mhz: .long vMPLLCON_200 smdk2410.h #define vMPLLCON_50 (MDIV_50 << 12) | (PDIV_50 << 4) | (SDIV_50)) /* CPU clcok */ /* MHz */ #define MDIV_50 0x5c #define PDIV_50 0x4 #define SDIV_50 0x2 /* MHz */ #define MDIV_200 0x5c #define PDIV_200 0x4 #define SDIV_200 0x0 MPLL计算公式 MPLL= FIN*(MDIV+8) (PDIV+2)*(2SDIV) 12MHz外部晶振 EXAMPLE MPLLCON=0x000a1031

30 系统时钟-特殊寄存器 鲁东大学 LUDONG UNIVERSITY

31 AMBA总线时钟频率HCLK=FCLK/2
总线时钟同步设置 鲁东大学 LUDONG UNIVERSITY 时钟模式切换 当HDIVN=1时 AMBA总线时钟频率HCLK=FCLK/2 总线将由快速总线模式转为异步模式 通过设置协处理器CP15的寄存器C1进行模式转换 协处理器[31-30]位-总线工作模式位 00 快速 01 同步 11 异步 orr r1, r1, #0xc 协处理器C1定义 ARM处理器的三种工作方式: 1、快速总线模式(Fast Mode) - 在该模式下,采用总线上过来的BCLK作为ARM920T的工作时钟GCLK。用于外部高速存储器的情况。 2、同步工作模式,-访存时,切换成BLCK,FCLK是BCLK的整数倍,BBCLK的边沿(上、下转换)的时候必须是FCLK高电平的时候。 3、异步工作模式 ,-与同步模式的区别在于,对于BCLK上、下转换时间与FCLK的关系无要求。 后两种工作模式用于采用低速存储器的系统。 1100,0…0

32 BL memsetup vivi第一阶段-memsetup S3c2410内部集成内存控制器 memsetup 子程序-内存控制器初始化
鲁东大学 LUDONG UNIVERSITY BL memsetup memsetup 子程序-内存控制器初始化 S3c2410内部集成内存控制器 内存空间1G,分为8个Bank,最大128MB/bank 根据采用的存储芯片,可自定义存取周期及采用wait信号延长总线周期 存储字长可根据需要采用8bit,16bit,32bit 支持SDRAM自刷新和掉电模式 memsetup - 完成对内存控制器的初始化操作 设置 13个特殊功能寄存器

33 vivi-memsetup代码 mov r1, #MEM_CTL_BASE adrl r2, mem_cfg_val
鲁东大学 LUDONG UNIVERSITY mov r1, #MEM_CTL_BASE adrl r2, mem_cfg_val add r3, r1, #52 1: ldr r4, [r2], #4 str r4, [r1], #4 cmp r1, r3 bne 1 ; 0x BWSCON,内存控制相关寄存器第一个 ;对寄存器具体的设置,在内存中开辟的空间存放 循环次数,52/4=13 head.s 第333行 ;这个循环实现了对13个内存控制寄存器的初始化赋值

34 存储空间结构 Bank6~Bank7空间大小可为2的1~7次幂MB Bank6和Bank7的大小必须相同
鲁东大学 LUDONG UNIVERSITY BANKSIZE Bank6~Bank7空间大小可为2的1~7次幂MB Bank6和Bank7的大小必须相同 Bank7的起始地址由Bank6的大小决定 Core –memory图 芯片 地址线A0~A26共27根 Bank选线 nGCS0~nGCS7共8根 Bank0~Bank5空间大小固定为128MB SROM为SRAM/ROM

35 内存控制SFR-BWSON BWSCON 数据线宽度 及等待信号 控制寄存器 扩展芯片是否使用UB/LB管脚 4bit/bank 32bit
鲁东大学 LUDONG UNIVERSITY 1bit 1bit 2bit 4bit/bank 32bit BWSCON 数据线宽度 及等待信号 控制寄存器 扩展芯片是否使用UB/LB管脚 使用Wait信号,延长总线周期 16位SRAM带UB/LB管脚 分别选中高/低字节操作 mem_cfg_val

36 UB/LB 两片8位芯片 扩展16位存储器 两片16位SRAM芯片 扩展16位存储器 使用nWBE
鲁东大学 LUDONG UNIVERSITY 两片8位芯片 扩展16位存储器 两片16位SRAM芯片 扩展16位存储器 使用nWBE nBE:nWBE:DQM[3-0]四根,分别针对32位SRAM,ROM,SDRAM芯片操作字的四个字节 UB/LB接nBE Core –memory图

37 内存控制SFR-BANKCON BANK0~BANK5相同 nGCSn 滞后Addr的延迟 nOE 滞后nGCSn的延迟 存取周期
鲁东大学 LUDONG UNIVERSITY nGCSn 滞后Addr的延迟 BANK0~BANK5相同 nOE 滞后nGCSn的延迟 存取周期 nGCSn滞后nOE失效后的时间 Addr滞后nGCSn失效后的时间

38 nWait信号时序图 鲁东大学 LUDONG UNIVERSITY Tcah

39 内存控制SFR-BANKCON BANK6、7可以扩展为SDRAM 若接SRAM/ROM 同Bank0~5 SDRAM设置
鲁东大学 LUDONG UNIVERSITY BANK6、7可以扩展为SDRAM 若接SRAM/ROM 同Bank0~5 SDRAM设置 CAS滞后RAS的延迟 列地址根数

40 MemoryController-SFR
鲁东大学 LUDONG UNIVERSITY 存储控制器内部集成了SDRAM刷新控制器 SDRAM刷新方式控制寄存器 0x2 可变长BANK(6,7)设置寄存器 [7]-BURST-EN,突发模式使能 [5]-SCKE-EN,掉电工作模式支持使能 [4]-SCLK-EN,该位置1,则只有访问SDRAM时,SCLK有效 [2-0]-Bank6/7映射大小 2的[(BANKSIZE[2-0]+5)mod 8 ]次幂MB

41 MemoryController-SFR
鲁东大学 LUDONG UNIVERSITY MRSRB寄存器,设置与SDRAM相关的工作模式,主要是关于突发工作方式。 vivi中将这两个寄存器的值初始化为0x30,即 00,0011,0000

42 S3c2410X-SDRAM扩展 16M×16bit两片 4BANK×4M×16bit BA0:BA1 22根地址
鲁东大学 LUDONG UNIVERSITY 16M×16bit两片 4BANK×4M×16bit BA0:BA1 22根地址 A0:A12 – 13根行地址 9根列地址 16根数据 D0-D15数据线

43 vivi第一阶段-系统电源初始化 S3c2410电源管理 --降低系统功耗 S3c2410有4种电源模式 降低功耗: 控制系统时钟信号
鲁东大学 LUDONG UNIVERSITY S3c2410电源管理 --降低系统功耗 晶体管状态的改变 系统电流损耗 时钟边沿 S3c2410有4种电源模式 Normal-正常模式 时钟频率越高 Slow-低速模式 边沿越频繁 Idle-空闲模式 Power-off-睡眠模式 功耗越多 降低功耗: 控制系统时钟信号

44 all peripherals and the basic blocks may operate fully.
S3c2410电源管理模式 鲁东大学 LUDONG UNIVERSITY NORMAL all peripherals and the basic blocks may operate fully. the clock to each peripheral, except the basic blocks can be stopped selectively by software. IDLE the block disconnects clocks (FCLK) only to the CPU core while it supplies clocks to all other peripherals. The IDLE mode results in reduced power consumption due to CPU core. Any interrupt request to CPU can be woken up from the Idle mode.

45 电源管理模式-低速模式 鲁东大学 LUDONG UNIVERSITY SLOW Power consumption can be reduced in the SLOW mode by applying a slow clock, excluding the power consumption from the PLL. Normal Slow Shut down MPLL MPLL CLKSLOW LOCKTIME MPLLCLK FCLK Slow CLK

46 电源管理模式-睡眠模式 POWER-OFF Two independent power sources
鲁东大学 LUDONG UNIVERSITY POWER-OFF Two independent power sources One of the two power sources supplies the power for the wake-up logic. The other one supplies other internal logics including CPU, and should be controlled for power on/off. no power consumption due to CPU and the internal logic power off,except the wake-up logic in this mode

47 Interrupt,EINT[23:0],RTC Alarm
电源模式转换图 鲁东大学 LUDONG UNIVERSITY IDLE_BIT=1 Interrupt,EINT[23:0],RTC Alarm SLOW_BIT=1 POWER_OFF_BIT=1 SLOW_BIT=0 Reset EINT[15:0],RTC Alarm

48 1.CLKCON-Clock Control Register
电源管理SFR 鲁东大学 LUDONG UNIVERSITY 1.CLKCON-Clock Control Register [18-4] 分别控制各模块的时钟信号使能,通过设置,可以分别关闭不需要使用的模块,达到降低功耗的目的。 [2] IDE_BIT :disable 1: Transition to IDE mode [3] POWER-OFF 0: disable 1: Transition to power-off mode 复位值:0x7FFF0 所有模块均打开,电源为正常工作状态

49 2.CLKSLOW-Clock Slow Control Register
电源管理SFR 鲁东大学 LUDONG UNIVERSITY 2.CLKSLOW-Clock Slow Control Register [7] UPLL-ON :UPLL off : UPLL on [5] MPLL-OFF 0: MPLL turns on 1:if SLOW-BIT=1,MPLL turns off [4] SLOW-BIT 0: FCLK=MPLL 1:FCLK=input clock/(2*SLOW_VaL) [2-0] SLOW-VAL 低速模式下,分频率

50 进入power_off模式的准备工作 ①合理设置外部中断/RTC屏蔽位; ②USB挂起 ③保存有用信息到GSTATUS3、4两个寄存器中
鲁东大学 LUDONG UNIVERSITY ①合理设置外部中断/RTC屏蔽位; ②USB挂起 ③保存有用信息到GSTATUS3、4两个寄存器中 ④数据总线各管脚上拉 ⑤LCD停止工作 ⑥SDRAM设为自刷新 ⑦通过设置MISCCR[19-17],保护SDRAM ⑧最后将CLKCON中POWER-OFF位置1 进入休眠模式 EINTMASK MISCCR GSTATUS3、4 MISCCR LCDCON1 REFRESH MISCCR CLKCON

51 tst r0, #(PMST_SMR) // PMST_SMR = (1 << 1) bne WakeupStart
vivi第一阶段-电源管理初始化 鲁东大学 LUDONG UNIVERSITY ldr r1, PMST_ADDR // 0x560000B4 GSTATUS2 Reset status ldr r0, [r1] tst r0, #(PMST_SMR) // PMST_SMR = (1 << 1) bne WakeupStart 测试当前复位原因 如果是由于从power_off模式唤醒 则,调WakeupStart子程序 WakeupStart Head.s -268行

52 vivi中电源初始化涉及到的SFR 1.GSTATUS2(PWST_ADDR)
鲁东大学 LUDONG UNIVERSITY 1.GSTATUS2(PWST_ADDR) ldr r0, PMST_ADDR // 0x560000B4 GSTATUS2 mov r1, #PMST_SMR // PMST_SMR = (1 << 1) str r1, [r0] 唤醒后,清除该位

53 系统进power_off模式前,将这三位置1,保护SDRAM
vivi中电源初始化涉及到的SFR 鲁东大学 LUDONG UNIVERSITY 2.MISCCR(PMCTL1_ADDR ) ldr r0, PMCTL1_ADDR // 0x MISCCR ldr r1, [r0] // SCLKE= (1 << 19) bic r1, r1, #(SCLKE | SCLK1 | SCLK0) // SCLK1= (1 << 18) // SCLK0= (1 << 17) str r1, [r0] 系统进power_off模式前,将这三位置1,保护SDRAM

54 系统进入Power-off模式前,将有用的信息保存到GSTATUS3、4两个寄存器中
vivi中电源初始化涉及到的SFR 鲁东大学 LUDONG UNIVERSITY 3.GSTATUS3(PMSR0_ADDR) ldr r0, PMSR0_ADDR // read a return address 0x560000B8 GSTATUS3 Infrom register。 ldr r1, [r0] mov pc, r1 系统进入Power-off模式前,将有用的信息保存到GSTATUS3、4两个寄存器中 这里保存一个返回地址;

55 调试信息-LED LED-发光二极管 简单的显示器件 允许电流的单向流动 指示电路状态 指示程序运行是否正常 高电平 控制I/O口输出
鲁东大学 LUDONG UNIVERSITY LED-发光二极管 输出 输出口 高电平 简单的显示器件 允许电流的单向流动 指示电路状态 低电平 指示程序运行是否正常 控制I/O口输出

56 S3c2410-GPIO s3c2410带有117个多功能的通用I/O管脚 PORTA(GPA)-23位,输出口
鲁东大学 LUDONG UNIVERSITY s3c2410带有117个多功能的通用I/O管脚 PORTA(GPA)-23位,输出口 数据传输方向,只能输出 port A PORTB(GPB)-11位,输入/输出口 可定义为输入或者输出 PORTC(GPC)-16位,输入/输出口 PORTD(GPD)-16位,输入/输出口 PORTE(GPE)-16位,输入/输出口 PORTF(GPF)-8位,输入/输出口 port F PORTG(GPG)-16位,输入/输出口 PORTH(GPH)-11位,输入/输出口

57 根据需要,选择某一管脚作为输出或特殊功能管脚
GPA-GPH的特殊功能 鲁东大学 LUDONG UNIVERSITY GPA-A0,A16-A26,nGCS1-nGCS5,NAND Flash的相关控制线; GPB-DMA请求/应答线,定时器输出线 GPC-LCD显示用信号线和部分数据线 GPD-LCD显示用数据线 GPE-I2C,SPI,SDI,I2S GPF-外部中断EINT0~EINT7 GPG-外部中断EINT8~EINT23 GPH-UART0~2 根据需要,选择某一管脚作为输出或特殊功能管脚 Core-1原理图 选择某一管脚作为输入、输出、特殊功能管脚使用

58 GPIO设置 GPnCON-定义端口n每个管脚的功能 GPACON GPB-GPHCON EXAMPLE GPACON设置为 ?
鲁东大学 LUDONG UNIVERSITY GPnCON-定义端口n每个管脚的功能 GPACON 每个管脚的对应位置0-输出,置1-特殊功能 GPB-GPHCON 每个管脚对应两位,00-输入,01-输出,10-特殊 EXAMPLE GPACON设置为 ?

59 GPIO-SFR GPnDAT-输出数据写入该寄存器 GPnUP-上拉电阻使能管脚 输入数据由该寄存器中读取 GPA无上拉电阻使能
鲁东大学 LUDONG UNIVERSITY GPnDAT-输出数据写入该寄存器 输入数据由该寄存器中读取 GPnUP-上拉电阻使能管脚 GPA无上拉电阻使能 SFR映射地址为每个端口分配4个字的地址空间,最后一个字保留 对每个port,都有独立的GPnCON,GPnDAT,GPnUP三个寄存器(除A)

60 vivi 点亮LED mov r1, #GPIO_CTL_BASE // 0x56000000 add r1, r1, #oGPIO_F
鲁东大学 LUDONG UNIVERSITY mov r1, #GPIO_CTL_BASE // 0x add r1, r1, #oGPIO_F ldr r2,=0x55aa str r2, [r1, #oGPIO_CON] mov r2, #0xff str r2, [r1, #oGPIO_UP] mov r2, #0x00 str r2, [r1, #oGPIO_DAT] // oGPIO_F 0x50 偏为0x // …….0101,0101,1010,1010 //Configures the pins of the port //Pull-up disable register //Data register for port

61 vivi-串口(UART)初始化 vivi串口初始化的目的 vivi串口初始化包括三个部分 GPIO串口设置 UART初始化子程序
鲁东大学 LUDONG UNIVERSITY vivi串口初始化的目的 vivi串口初始化包括三个部分 GPIO串口设置 UART初始化子程序 通过串口发送调试信息 交叉编译 宿主机 PC 下载 目标机 Embedded system 调试 串口通信可用

62 UART-Universal Asynchronous Receive & Transmit
鲁东大学 LUDONG UNIVERSITY UART-Universal Asynchronous Receive & Transmit 当UART与PC串口相连时,需要增加RS232电平转换模块 s3c2410带有三个UART, UART0,1,2 支持中断/DMA传送方式 可使用握手信号 可作为红外接口 其中UART0,1带有RTS和CTS信号线 RxD-串行接收数据线 A B TxD TxD TxD-串行发送数据线 RxD RxD GND GND

63 UART0~2的信号线属于GPH端口的特殊功能
串口设置 鲁东大学 LUDONG UNIVERSITY UART0~2的信号线属于GPH端口的特殊功能 串口初始化第一步,需要将GPH相应管脚定义为需要的UART信号线 UART2 UART1 UART0 00 01 10 11 GPHCON

64 vivi-UART设置 mov r1, #GPIO_CTL_BASE // 0x56000000
鲁东大学 LUDONG UNIVERSITY mov r1, #GPIO_CTL_BASE // 0x add r1, r1, #oGPIO_H // oGPIO_H = 0x70 ldr r2, gpio_con_uart str r2, [r1, #oGPIO_CON] ldr r2, gpio_up_uart str r2, [r1, #oGPIO_UP] = 0x0016faaa 01,0110,1111,1010,1010,1010 // GPHUP 0x control register for port H = 0x000007ff // GPHUP 0x Pull-up disable register for port H 定义使用带有RTS和CTS信号线的UART0和UART1 BL InitUART

65 自动流控制AFC-Auto Flow Control 使用RTS和CTS信号
鲁东大学 LUDONG UNIVERSITY 自动流控制AFC-Auto Flow Control 使用RTS和CTS信号 nCTS有效-对方的接收缓冲区有空间 UART A TxD RxD UART B RxD TxD nRTS有效-接收缓冲区有空间 nCTS nCTS AFC 数据的发送和接收取决于CTS和RTS信号 nRTS nRTS

66 鲁东大学 LUDONG UNIVERSITY 接收/发送分别有16字节的队列 队列模式 缓冲寄存器模式

67 vivi-InitUART InitUART: ldr r1, SerBase //UART0_CTL_BASE = 0x50000000
鲁东大学 LUDONG UNIVERSITY InitUART: ldr r1, SerBase //UART0_CTL_BASE = 0x mov r2, #0x0 str r2, [r1, #oUFCON] str r2, [r1, #oUMCON] mov r2, #0x3 str r2, [r1, #oULCON] ldr r2, =0x245 str r2, [r1, #oUCON] // UFCON0 0x R/W UART channel 0 FIFO control register // UMCON0 0x C R/W UART channel 0 Modem control register Control Unit // ULCON0 0x R/W UART channel 0 line control register // UCON0 0x R/W UART channel 0 control register

68 UART 控制寄存器 UFCONn-FIFO控制寄存器 复位值0x0=0000,0000 不使用FIFO
鲁东大学 LUDONG UNIVERSITY UFCONn-FIFO控制寄存器 复位值0x0=0000,0000 不使用FIFO

69 UART控制寄存器 UMCONn-Modem控制寄存器 UART0和UART1带有RTS和CTS信号线,UMCONn针对这两个信号线进行设置
鲁东大学 LUDONG UNIVERSITY UMCONn-Modem控制寄存器 UART0和UART1带有RTS和CTS信号线,UMCONn针对这两个信号线进行设置 (1)AFC禁用 (2)当AFC禁掉时,软件设置RTS的规则

70 UART帧发送/接收时序图 数据位 起始位 数据位可选择为5/6/7/8位 停止位 ULCONn-帧格式控制寄存器进行设置 1/2位
鲁东大学 LUDONG UNIVERSITY 数据位 起始位 数据位可选择为5/6/7/8位 停止位 1/2位 ULCONn-帧格式控制寄存器进行设置

71 UART控制寄存器 0000,0011 初始化为0x03 无校验 奇/偶校验 强制校验位 停止位个数 数据位个数
鲁东大学 LUDONG UNIVERSITY 无校验 奇/偶校验 强制校验位 停止位个数 数据位个数 0000,0011 初始化为0x03

72 UART控制寄存器 UCONn-UART控制寄存器(主) 通过该寄存器的设置,可以确定 串口的接收/发送状态 中断处理方式 及对于异常的处理
鲁东大学 LUDONG UNIVERSITY UCONn-UART控制寄存器(主) 通过该寄存器的设置,可以确定 串口的接收/发送状态 中断处理方式 及对于异常的处理 分析,vivi将UCON0初始化为0x245 即:0010,0100,0101

73 鲁东大学 LUDONG UNIVERSITY 0x245 1 1

74 InitUART第二段 鲁东大学 LUDONG UNIVERSITY #define UART_BRD ((S3C2410MCLK /4 / (UART_BAUD_RATE * 16)) - 1) //S3C2410MCLK , UART_BAUD_RATE mov r2, #UART_BRD // UART_BRD = 26 str r2, [r1, #oUBRDIV] // UBRDIV0 0x R/W Baud rate divisior register 0 mov r3, #100 mov r2, #0x0 1: sub r3, r3, #0x1 tst r2, r3 bne 1b 延时程序段

75 UART波特率设置寄存器 UBRDIV-控制PCLK/UCLK到串口波特率的分频值
鲁东大学 LUDONG UNIVERSITY UBRDIV-控制PCLK/UCLK到串口波特率的分频值 UBRDIV=(int)(PCLK/(bps*16)-1) or =(int)(UCLK/(bps*16)-1) bps ≈PCLK/(UBRDIV+1)*16

76 使用UART发送数据 mov r2, #'U' str r2, [r1, #oUTXHL]
鲁东大学 LUDONG UNIVERSITY mov r2, #'U' str r2, [r1, #oUTXHL] //UTXH0 0x (L) 0x (B) W (by byte) 1: ldr r3, [r1, #oUTRSTAT] //UTRSTAT0 0x R UART channel 0 Tx/Rx status register and r3, r3, #UTRSTAT_TX_EMPTY tst r3, #UTRSTAT_TX_EMPTY bne 1b mov r2, #'0' 测试是否 发送就绪 (1 << 2)

77 UART发送/接收数据寄存器 小端对齐L,大端对齐B 发送寄存器,1个字节 接收寄存器,1个字节
鲁东大学 LUDONG UNIVERSITY 小端对齐L,大端对齐B 发送寄存器,1个字节 接收寄存器,1个字节

78 UART接收/发送状态寄存器 鲁东大学 LUDONG UNIVERSITY 发送缓冲空,发送就绪 接收缓冲有数据,接收就绪

79 轮循方式发送数据 UART0 ~UART2 设置GPH的管脚作 UART用 UCONn ULCONn UFCONn 设置所有的控制寄存器
鲁东大学 LUDONG UNIVERSITY UART0 ~UART2 设置GPH的管脚作 UART用 UCONn ULCONn UFCONn UMCONn 设置所有的控制寄存器 UBRDIVn 串口波特率设置 测试串口通信状态寄存器 UTRSTATn N 发送缓冲空 Y 将发送的数据写入寄存器TxHn

80 打印调试信息 串口打通后,可以利用串口打印调试信息,PC端利用com口接收打印信息,可以获知程序的运行情况。
鲁东大学 LUDONG UNIVERSITY 串口打通后,可以利用串口打印调试信息,PC端利用com口接收打印信息,可以获知程序的运行情况。 PrintChar函数-打印一个字符 PrintFaultAddr函数-打印地址,调用PrintHexWord进行打印 PrintHexNibble函数-将16进制最低位数转换为ASCII,打印 PrintHexWord函数-调用PrintHexNibble转换16进制各位数后,调用PrintChar函数,打印 Vivi head.s – 694行 PrintWord函数-调用PrintChar,以8位为单位,打印

81 vivi第一阶段-测试DRAM是否存在 memtest 子程序 SDRAM BANK6 BANK6或者BANK7 BANK7
鲁东大学 LUDONG UNIVERSITY memtest 子程序 SDRAM BANK6 BANK6或者BANK7 BANK7 测试当前DRAM 是否能正常使用 Vivi原始代码,测试BANK6 memtest为下一步作准备 S3c2410芯片管脚OM[1:0]=00 定义从NAND Flash启动 在SDRAM中继续运行 将启动程序拷贝到SDRAM

82 memtest子程序 memtest: ;一段通过串口打印的调试信息,略 mov r7, #0x1000
鲁东大学 LUDONG UNIVERSITY memtest: ;一段通过串口打印的调试信息,略 mov r7, #0x1000 mov r6, r7, lsl # /* 4k << 2^8 = 1MB */ mov r5, #DRAM_BASE mem_test_loop: mov r0, r5 bl testram_nostack teq r0, #1 beq badram add r5, r5, r7 subs r6, r6, r7 bne mem_test_loop =BANK6 起始地址 调用DRAM测试子函数 打印失败信息 以4KB为单位,测试1MB空间

83 testram_nostack子程序 mov r3, #0x55 将r0指向内存地址的前两个值另存 mov r4, #0xaa
ldmia r0, {r1, r2} mov r3, #0x55 mov r4, #0xaa stmia r0, {r3, r4} ldmia r0, {r3, r4} teq r3, #0x55 teqeq r4, #0xaa bne bad mov r3, #0xaa mov r4, #0x55 teq r3, #0xaa teqeq r4, #0x55 bad: stmia r0, {r1, r2} moveq r0, #0 movne r0, #1 mov pc, lr 鲁东大学 LUDONG UNIVERSITY 将r0指向内存地址的前两个值另存 向r0指向内存写入数据0x55,0xaa 再从写入的位置读出数据 测试读出的数据是否与写入的相同 不同 相同? 相同 再测试一遍 不同 相同? 相同 返回值r0=0 返回值r0=1

84 vivi-NAND Flash拷贝子程序 copy_myself
鲁东大学 LUDONG UNIVERSITY 对于从NAND FLASH启动的系统,启动时,自动将前4KB空间的内容拷贝到Stepping Stone中,然后从Stepping Stone执行boot loader. NAND FLASH boot loader Auto SDRAM Stepping Stone S3c2410专为支持由NAND FLASH启动系统,内部集成的一块SRAM. Stepping Stone boot, copy Nand flash 内存空间映射图

85 对于NAND FLASH的操作是通过NAND FLASH控制器进行的
鲁东大学 LUDONG UNIVERSITY NAND FLASH 操作 对于NAND FLASH的操作是通过NAND FLASH控制器进行的 NAND FLASH控制器 NAND FLASH控制器为CPU内部集成,通过操作SFR,进行控制

86 NAND FLASH NAND FLASH芯片介绍 I/O0~I/O7:
鲁东大学 LUDONG UNIVERSITY NAND FLASH芯片介绍 I/O0~I/O7: input ommand,address,input&output data CLE:Command Latch Enable ALE:Address Latch Enable CE:Chip Enable RE:Read Enable WE:Write Enable with ALE or CLE WP:Write Protection R/B:Ready/Busy Status

87 NAND FLASH 鲁东大学 LUDONG UNIVERSITY K9F2808 擦除以块为单位进行 编程/读操作以页为单位进行

88 0x4E000000 NFCONF initial value
NAND FLASH 拷贝子程序 鲁东大学 LUDONG UNIVERSITY @ Part1-Reset Nand Flash mov r1, #NAND_CTL_BASE ldr r2, =0xf830 str r2, [r1, #oNFCONF] ldr r2, [r1, #oNFCONF] bic r2, r2, #0x800 str r2, [r1, #oNFCONF] mov r2, #0xff strb r2, [r1, #oNFCMD] mov r3, #0 1: add r3, r3, #0x1 cmp r3, #0xa blt 1b 2: ldr r2, [r1, #oNFSTAT] tst r2, #0x1 beq 2b ldr r2, [r1, #oNFCONF] orr r2, r2, #0x800 str r2, [r1, #oNFCONF] 0x4E NFCONF initial value // enable chip // RESET command // wait 等待延迟 // wait 就绪 // disable chip

89 NAND FLASH控制器 SFR NFCONF;[15]-NF控制器使能,[12]-ECC使能,[11]-NF片选使能
鲁东大学 LUDONG UNIVERSITY NFCONF;[15]-NF控制器使能,[12]-ECC使能,[11]-NF片选使能 NFCMD,NFADDR,NFDATA ;均与I/O0~7相连,输入命令,地址,输入/输出数据 NFSTAT ;[0]-RnB,Reay/Busy Status NFECC ;512B/page,3字节ECC校验位

90 NAND FLASH拷贝子程序 @PART2-copy vivi to RAM,调用C程序NAND_READ_LL
鲁东大学 LUDONG UNIVERSITY @PART2-copy vivi to RAM,调用C程序NAND_READ_LL NAND FLASH 操作流程 写NFCONF,使能芯片 读操作命令写入NFCMD COMMAND查手册 I/O管脚只有8根 输出地址需要多次 读地址写入NFADDR 校验可根据数据可靠性要求,选用 根据NFECC进行校验 读出一页数据

91 NAND_READ_LL子程序 nand_read_ll(unsigned char *buf, unsigned long start_addr, int size) { int i, j; if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) { return -1; } NFCONF &= ~0x800; for(i=0; i<10; i++); for(i=start_addr; i < (start_addr + size);) { NFCMD = 0;              NFADDR = i & 0xff;                 NFADDR = (i >> 9) & 0xff; NFADDR = (i >> 17) & 0xff; NFADDR = (i >> 25) & 0xff; wait_idle(); //空转,等待延迟 for(j=0; j < NAND_SECTOR_SIZE; j++, i++) { *buf = (NFDATA & 0xff); buf++;} } NFCONF |= 0x800; return 0; 鲁东大学 LUDONG UNIVERSITY //start_addr和size为page的整数倍 //使能NAND FLASH芯片 //写入读命令 00h //当NF的容量超过225B 8MB,地址需要分4次输出 //读出一页到内存buf,继续读下一页 //读出指定size后,NF使能无效,返回0

92 copy_myself调用NAND_READ_LL拷贝vivi
鲁东大学 LUDONG UNIVERSITY ldr sp, DW_STACK_START @ setup stack pointer mov fp, # @ no previous frame, so fp=0 ldr r0, =VIVI_RAM_BASE /*(DRAM_BASE + DRAM_SIZE - VIVI_RAM_SIZE) 移植需修改,此处DRAM_SIZE=64M 拷贝的VIVI_RAM_SIZE=1M*/ mov r1, #0x0 mov r2, #0x //使用r0,r1,r2传递参数 bl nand_read_ll //调用此函数拷贝vivi tst r0, #0x //r0为执行完nand_read_ll 函数,返回参数 beq ok_nand_read //打印信息,是否完成拷贝 bne bad_nand_read 此处可以增加一段验证拷贝是否正确的代码,将SDRAM与stepping Stone前4KB做比较,如果相同,则拷贝正确。可以转移到SDRAM继续执行

93 ldr r1, =on_the_ram //将on_the_ram的地址装入r1
鲁东大学 LUDONG UNIVERSITY ldr r1, =on_the_ram //将on_the_ram的地址装入r1 add pc, r1, # //跳到on_the_ram 地址处去执行 nop 1: b 1b @ infinite loop 无限循环 on_the_ram: @ get read to call C functions //准备栈,调用c函数完成vivi的第二阶段 ldr sp, setup stack pointer mov fp, #0 @ no previous frame, so fp=0 为r11 mov a2, #0 @ set argv to NULL a2相当于r1 bl main @ call main 调用主函数 mov pc, otherwise, reboot @ End VIVI head

94 UART相关SFR地址 Base Offset SFR UART0 0x50000000 UART1 0x50000040 UART2
鲁东大学 LUDONG UNIVERSITY Base Offset SFR UART0 0x UART1 0x UART2 0x 0x0 UCON0 UART控制寄存器 0x4 ULON0 帧格式控制寄存器 0x8 UFCON0 队列控制寄存器 0xC UMCON0 Modem控制寄存器 0x10 UTRSTAT0 接收/发送状态寄存器 0x14 UERSTAT0 接收错误状态寄存器 0x18 UFSTAT0 队列状态寄存器 0x1C UMSTAT0 Modem状态寄存器 0x20 UTXHL 发送数据寄存器 0x24 URXHL 接收数据寄存器 0x28 UBRDIV 波特率设置寄存器

95 附图-MPLLCON计算表 鲁东大学 LUDONG UNIVERSITY

96 鲁东大学 LUDONG UNIVERSITY
CLOCON寄存器

97 附图-MISCCR各位含义 鲁东大学 LUDONG UNIVERSITY


Download ppt "College of Computer Science & Technology"

Similar presentations


Ads by Google