已阅读5页,还剩11页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Bootloader Vivi 源代码分析 基于 S3C2410 处理器 1 3 vivi 代码分析代码分析 vivi 的代码包括 arch init lib drivers 和 include 等几个目录 共 200 多条 文件 Vivi 主要包括下面几个目录 arch 此目录包括了所有 vivi 支持的目标板的子目录 例如 s3c2410 目录 drivers 其中包括了引导内核需要的设备的驱动程序 MTD 和串口 MTD 目录下分 map nand 和 nor 三个目录 init 这个目录只有 main c 和 version c 两个文件 和普通的 C 程序一样 vivi 将从 main 函数开始执行 lib 一些平台公共的接口代码 比如 time c 里的 udelay 和 mdelay include 头文件的公共目录 其中的 s3c2410 h 定义了这块处理器的一些寄 存器 Platform smdk2410 h 定义了与开发板相关的资源配置参数 我们往往只 需要修改这个文件就可以配置目标板的参数 如波特率 引导参数 物理内存 映射等 1 4 vivi 的运行的运行 vivi 的运行也可以分为两个阶段 1 4 1 vivi 的第一阶段的第一阶段 完成含依赖于 CPU 的体系结构硬件初始化的代码 包括禁止中断 初始化串口 复制 自身到 RAM 等 相关代码集中在 head S vivi arch s3c2410 目录下 Head S include config h include linkage h include machine h Start of executable code ENTRY start ENTRY ResetEntryPoint Exception vector table physical address 0 x00000000 异常向量表物理地 址 0 x00 Reset 复位 bReset 0 x04 Undefined instruction exception 未定义的指令异常 UndefEntryPoint bHandleUndef 0 x08 Software interrupt exception 软件中断异常 SWIEntryPoint bHandleSWI 0 x0c Prefetch Abort Instruction Fetch Memory Abort 内存操作异常 PrefetchAbortEnteryPoint bHandlePrefetchAbort 0 x10 Data Access Memory Abort 数据异常 DataAbortEntryPoint bHandleDataAbort 0 x14 Not used 未使用 NotUsedEntryPoint bHandleNotUsed 0 x18 IRQ Interrupt Request exception 慢速中断处理 IRQEntryPoint bHandleIRQ 0 x1c FIQ Fast Interrupt Request exception 快速中断处理 FIQEntryPoint bHandleFIQ VIVI magics 0 x20 magic number so we can verify that we only put long 0 0 x24 long 0 0 x28 where this vivi was linked so we can put it in memory in the right place long start 0 x2C this contains the platform cpu and machine id long ARCHITECTURE MAGIC 0 x30 vivi capabilities long 0 ifdef CONFIG PM vivi 考虑不需要使用电源管理 0 x34 bSleepRamProc endif ifdef CONFIG TEST 0 x38 bhmi endif Start VIVI head Reset disable watch dog timer 禁止看门狗计时器 movr1 0 x53000000 WTCON 寄存器地址是 0 x53000000 清 0 movr2 0 x0 str r2 r1 ifdef CONFIG S3C2410 MPORT3 不符合条件 跳到下面的关中断 在 vivi include autoconf h 中 undef CONFIG S3C2410 MPORT3 movr1 0 x56000000 GPACON 寄存器地址是 0 x56000000 movr2 0 x00000005 str r2 r1 0 x70 配置 GPHCON 寄存器 mov r2 0 x00000001 str r2 r1 0 x78 配置 GPHUP 寄存器 movr2 0 x00000001 str r2 r1 0 x74 配置 GPHDAT 寄存器 endif disable all interrupts 禁止全部中断 movr1 INT CTL BASE movr2 0 xffffffff str r2 r1 oINTMSK 掩码关闭所有中断 ldr r2 0 x7ff str r2 r1 oINTSUBMSK initialise system clocks 初始化系统时钟 movr1 CLK CTL BASE mvnr2 0 xff000000 str r2 r1 oLOCKTIME ldrr2 mpll 50mhz strr2 r1 oMPLLCON ifndef CONFIG S3C2410 MPORT1 满足条件 向下执行 在 vivi include autoconf h 中 undef CONFIG S3C2410 MPORT1 1 2 4 movr1 CLK CTL BASE movr2 0 x3 str r2 r1 oCLKDIVN mrcp15 0 r1 c1 c0 0 read ctrl register orr r1 r1 0 xc0000000 Asynchronous mcrp15 0 r1 c1 c0 0 write ctrl register now CPU clock is 200 Mhz CPU 的频率是 200MHz movr1 CLK CTL BASE ldr r2 mpll 200mhz str r2 r1 oMPLLCON else 1 2 2 mov r1 CLK CTL BASE ldr r2 clock clkdivn str r2 r1 oCLKDIVN mrc p15 0 r1 c1 c0 0 read ctrl register orr r1 r1 0 xc0000000 Asynchronous mcr p15 0 r1 c1 c0 0 write ctrl register now CPU clock is 100 Mhz CPU 的频率是 100MHz mov r1 CLK CTL BASE ldr r2 mpll 100mhz str r2 r1 oMPLLCON endif blmemsetup 跳转到 memsetup 函数 Memsetup 函数的实现 ENTRY memsetup initialise the static memory set memory control registers 设置内存控制寄存器的初值 movr1 MEM CTL BASE adrlr2 mem cfg val Data Area Memory configuration values align 4 mem cfg val 定义好的 13 4 52 个字节初 值 longvBWSCON 在 vivi include platform smdk2410 h 中赋值 SDRAM 从 32 位变成 16 位 需要修改 vBWSCON 的值 longvBANKCON0 longvBANKCON1 longvBANKCON2 longvBANKCON3 网卡控制器 vBANKCON3 的值可能需要修改 longvBANKCON4 longvBANKCON5 longvBANKCON6 SDRAM 从 32 位变成 16 位 可能需要修改 vBANKCON6 的值 longvBANKCON7 longvREFRESH longvBANKSIZE SDRAM 从 64MB 变成 32MB 需要修改 vBANKSIZE 的值 longvMRSRB6 longvMRSRB7 add r3 r1 52 1 ldr r4 r2 4 str r4 r1 4 cmpr1 r3 bne 1b 循环操作 直到 13 个寄存器赋值完成 movpc lr ifdef CONFIG PM vivi 考虑不需要使用电源管理 Check if this is a wake up from sleep ldr r1 PMST ADDR ldr r0 r1 tstr0 PMST SMR bne WakeupStart 查看状态 判断是否需要跳转到 WakeupStart endif ifdef CONFIG S3C2410 SMDK SMDK 开发板使用 All LED on 点亮开发板上的 LED movr1 GPIO CTL BASE add r1 r1 oGPIO F LED 使用 GPIOF 组的管脚 ldr r2 0 x55aa 使能 EINT0 EINT1 EINT2 EINT3 另四个管脚配置成输出 屏蔽 EINT4 5 6 7 str r2 r1 oGPIO CON movr2 0 xff str r2 r1 oGPIO UP disable the pull up function movr2 0 x00 str r2 r1 oGPIO DAT endif if 0 SVC mrs r0 cpsr bic r0 r0 0 xdf orr r1 r0 0 xd3 msr cpsr all r1 endif set GPIO for UART 设置串口 movr1 GPIO CTL BASE add r1 r1 oGPIO H 设置 GPIO H 组管脚为串口 ldr r2 gpio con uart str r2 r1 oGPIO CON ldr r2 gpio up uart str r2 r1 oGPIO UP inital values for GPIO gpio con uart longvGPHCON vGPHCON 在 vivi include platform smdk2410 h 中赋值 define vGPHCON0 x0016faaa GPIO H 配置为 nCTS0 nRTS0 RXD0 TXD0 RXD1 TXD1 nCTS1 nRTS1 三个串口都使能 可能需要修改 define vGPHCON 0 x0016aaaa gpio up uart longVgphup 同上 define vGPHUP0 x000007ff The pull up function is disabled blInitUART 跳转到 InitUART 串口初始化函数 Initialize UART r0 number of UART port InitUART ldr r1 SerBase align 4 缺省情况下在 vivi 中只初始化了 UART0 SerBase if defined CONFIG SERIAL UART0 long UART0 CTL BASE 基地址在 vivi include s3c2410 h 中定义 elif defined CONFIG SERIAL UART1 long UART1 CTL BASE elif defined CONFIG SERIAL UART2 long UART2 CTL BASE else error not defined base address of serial endif movr2 0 x0 str r2 r1 oUFCON str r2 r1 oUMCON movr2 0 x3 str r2 r1 oULCON ldr r2 0 x245 str r2 r1 oUCON define UART BRD 50000000 UART BAUD RATE 16 1 movr2 UART BRD str r2 r1 oUBRDIV movr3 100 movr2 0 x0 1 sub r3 r3 0 x1 tstr2 r3 bne 1b if 0 movr2 U str r2 r1 oUTXHL 1 ldr r3 r1 oUTRSTAT and r3 r3 UTRSTAT TX EMPTY tstr3 UTRSTAT TX EMPTY bne 1b movr2 0 str r2 r1 oUTXHL 1 ldr r3 r1 oUTRSTAT and r3 r3 UTRSTAT TX EMPTY tstr3 UTRSTAT TX EMPTY bne 1b endif movpc lr ifdef CONFIG DEBUG LL 打印调试信息 缺省未定义 Print current Program Counter ldr r1 SerBase movr0 r blPrintChar movr0 n blPrintChar movr0 blPrintChar movr0 pc blPrintHexWord endif ifdef CONFIG BOOTUP MEMTEST simple memory test to find some DRAM flaults blmemtest endif ifdef CONFIG S3C2410 NAND BOOT 从 NAND Flash 启动 blcopy myself 跳转到 copy myself 函数 copy myself copy vivi to ram copy myself movr10 lr reset NAND movr1 NAND CTL BASE ldr r2 0 xf830 initial value str r2 r1 oNFCONF ldr r2 r1 oNFCONF bic r2 r2 0 x800 enable chip str r2 r1 oNFCONF movr2 0 xff RESET command strb r2 r1 oNFCMD movr3 0 wait 1 add r3 r3 0 x1 cmpr3 0 xa blt 1b 2 ldr r2 r1 oNFSTAT wait ready tstr2 0 x1 beq 2b ldr r2 r1 oNFCONF orr r2 r2 0 x800 disable chip str r2 r1 oNFCONF get read to call C functions for nand read ldr sp DW STACK START setup stack pointer movfp 0 no previous frame so fp 0 copy vivi to RAM ldr r0 VIVI RAM BASE 在 vivi linux platform smdk2410 h 中定义 define VIVI RAM BASE DRAM BASE DRAM SIZE VIVI RAM SIZE mov r1 0 x0 movr2 0 x20000 0 x20000 128k 字节 blnand read ll nand read ll 在 vivi arch s3c2410 nand read c 中定义 r0 r1 r2 分别为函数的三个参数 从 NANDFlash 的 0 地址拷贝 128k 到 SDRAM 指定 处 tstr0 0 x0 beq ok nand read ifdef CONFIG DEBUG LL bad nand read ldr r0 STR FAIL ldr r1 SerBase blPrintWord 1 b1b infinite loop endif ok nand read ifdef CONFIG DEBUG LL ldr r0 STR OK ldr r1 SerBase blPrintWord endif verify movr0 0 ldr r1 0 x33f00000 movr2 0 x400 4 bytes 1024 4K bytes go next ldr r3 r0 4 ldr r4 r1 4 teq r3 r4 bne notmatch subsr2 r2 4 beq done nand read bne go next notmatch ifdef CONFIG DEBUG LL sub r0 r0 4 ldr r1 SerBase blPrintHexWord ldr r0 STR FAIL ldr r1 SerBase blPrintWord endif 1 b1b done nand read ifdef CONFIG DEBUG LL ldr r0 STR OK ldr r1 SerBase blPrintWord endif movpc r10 vivi 拷贝到 SDRAM 完成 函数返回 jump to ram ldr r1 on the ram add pc r1 0 nop nop 1 b1b infinite loop on the ram endif ifdef CONFIG DEBUG LL ldr r1 SerBase ldr r0 STR STACK blPrintWord ldr r0 DW STACK START blPrintHexWord endif get read to call C functions ldr sp DW STACK START setup stack pointer movfp 0 no previous frame so fp 0 mova2 0 set argv to NULL blmain call main movpc FLASH BASE otherwise reboot End VIVI head 1 4 2 vivi 的第二阶段的第二阶段 vivi 的第二阶段是从 main 函数开始 同一般的 C 语言程序一样 该函 数在 init main c 文件中 总共可以分为 8 个步骤 1 函数开始 通过 putstr vivi banner 打印出 vivi 的版本 Vivi banner 在 init version c 文件中定义 2 对开发板进行初始化 board init 函数 board init 是与开发板紧密相关 的 这个函数在 arch s3c2410 smdk c 文件中 开发板初始化主要完成两 个功能 时钟初始化 init time 和通用 IO 口设置 set gpios int board init void init time arch s3c2410 proc c 中 set gpios arch s3c2410 smdk c return 0 先来看看 init time void init time void TCFG0 TCFG0 DZONE 0 TCFG0 PRE1 15 TCFG0 PRE0 0 void set gpios void GPACON vGPACON GPBCON vGPBCON GPBUP vGPBUP GPCCON vGPCCON GPCUP vGPCUP GPDCON vGPDCON GPDUP vGPDUP GPECON vGPECON GPEUP vGPEUP GPFCON vGPFCON GPFUP vGPFUP GPGCON vGPGCON GPGUP vGPGUP GPHCON vGPHCON GPHUP vGPHUP EXTINT0 vEXTINT0 EXTINT1 vEXTINT1 EXTINT2 vEXTINT2 也就是设置各个 GPIO 口的控制寄存器 和上拉寄存器 其中 GPIO 口在 smdk2410 h vivi include platform 目录下 文件中定 义 3 内存映射初始化和内存管理单元的初始化工作 mem map init mmu init 这两个函数都在 arch s3c2410 mmu c 文件中 void mem map init void ifdef CONFIG S3C2410 NAND BOOT mem map nand boot else mem map nor endif cache clean invalidate tlb invalidate 如果配置 vivi 时使用了 NAND 作为启动设备 则执行 mem map nand boot 否则执行 mem map nor 这里要注意的是 如果 使用 NAND 启动 则必须先把 vivi 代码复制到 RAM 中 这个过程是由 copy vivi to ram 函数来完成的 代码如下 static void copy vivi to ram void putstr hex Evacuating 1MB of Flash to DRAM at 0 x VIVI RAM BASE memcpy void VIVI RAM BASE void VIVI ROM BASE VIVI RAM SIZE VIVI RAM BASE VIVI ROM BASE VIVI RAM SIZE 这些值都可 以在 smdk2410 h 中查到 并且这些值必须根据自己开发板的 RAM 实际大小 修改 这也是在移植 vivi 的过程中需要注意的一个地方 mmu init 函数中执行了 arm920 setup 函数 这段代码是用汇编语言实 现的 针对 arm920t 核的处理器 4 初始化堆 heap init 定义在 vivi lib heap c 文件中 int heap init void return mmalloc init unsigned char HEAP BASE HEAP SIZE heap 堆 内存动态分配函数 mmalloc 就是从 heap 中划出一块空 闲内存的 mfree 则将动态分配的某块内存释放回 heap 中 heap init 函数在 SDRAM 中指定了一块 1M 大小的内存作为 heap 起始地址 HEAP BASE 0 x33e00000 并在 heap 的开头定 义了一个数据结构 blockhead 5 初始化 mtd 设备 mtd dev init 内存技术设备 在分析代码前先介绍一下 MTD Memory Technology Device 相关的技术 在 inux 系统中 我们通常会用到不同的存储设备 特别是 FLASH 设备 为了在使用新的存储设备时 我们能更简便地提供它的驱动程序 在上 层应用和硬件驱动的中间 抽象出 MTD 设备层 驱动层不必关心存储 的数据格式如何 比如是 FAT32 ETX2 还是 FFS2 或其它 它仅仅提供 一些简单的接口 比如读写 擦除及查询 如何组织数据 则是上层应 用的事情 MTD 层将驱动层提供的函数封装起来 向上层提供统一的接 口 这样 上层即可专注于文件系统的实现 而不必关心存储设备的具 体操作 int mtd init void int ret ifdef CONFIG MTD CFI ret cfi init 通用闪存主机接口 endif ifdef CONFIG MTD SMC ret smc init SRAM 接口 endif ifdef CONFIG S3C2410 AMD BOOT ret amd init endif if ret mymtd NULL return ret return 0 这几个函数可以在 drivers mtd maps s3c2410 flash c 里找到 可见 可见 vivi 现在支持三种类型的存储接口 一种是现在支持三种类型的存储接口 一种是 CFI 也就是 也就是 Intel 发起发起 的一个的一个 flash 的接口标准 的接口标准 主要就是主要就是 intel 的的 nor flash 系列系列 一种是一种是 smc 智能 智能 卡系列接口 卡系列接口 nand flash 就是通过这个接口实现读写的就是通过这个接口实现读写的 一种是一种是 AMD 的的 flash 系列 系列 选择什么启动方式 就要选择相应的配置项 选择什么启动方式 就要选择相应的配置项 6 初始化私有数据 init priv data 定义在 vivi lib priv data rw c 文件中 此部分的功能是把 vivi 可能用到的所有私有参数都放在预先规划的内存 区域 大小为 48K 基地址为 0 x33df0000 到此为止 vivi 作为 b
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【苏教版】-小学一年级数学下册-第1课时 按给定的标准分类
- 二年级小散文100篇
- 小区内露台建设方案
- 主管交办紧急工作方案
- 单位中秋活动实施方案
- 寝室公约工作方案范文
- 2025年5G技术在智能家居安全中的应用分析方案
- 编程教育进学校实施方案
- 乡村旅游扶贫开发模式方案
- 医院全面预算工作方案
- 2026年企业法律风险防范与管理能力测试
- 灌注桩接桩规范
- 【新教材】人教PEP版(2024)四年级下册英语Unit 4 Going shopping教案(共5课时)
- 2026江苏苏州数智科技集团有限公司下属子公司招聘34人备考题库(第一批)有完整答案详解
- 医疗质量改进与内部管理策略
- 企业行政管理实务(含活页实训手册) 课件 9建立工作程序
- 思皓E10X保养手册
- 安全监理考试题库
- 市政道路改造管网施工组织设计
- 海外项目科技技术管理探讨汇报材料
- 2022年菏泽职业学院教师招聘考试真题
评论
0/150
提交评论