使用ADS时候有uboot功能的启动代码
2014-01-13 14:16
387 查看
解释见 http://wenku.baidu.com/view/782a7219227916888486d7f6.html
注意本代码中有些宏是ADS开发环境自带的linker内部定义的宏,使用MDK的估计没有这些
注意本代码中有些宏是ADS开发环境自带的linker内部定义的宏,使用MDK的估计没有这些
;************************************************************** ; ; This an simple implementation of bootloader for S3C4510B ; Hope it is useful to you. ; ; Duyunhai use this program to UART0 ; ; Enjoy it! ; ;************************************************************** LOOPNUM EQU 0x02 AREA Init, CODE, READONLY CODE32 GET snds.s ENTRY start ;Part 1 ;*************************************************************** ;disable interrupts in CPU and switch to SVC32 mode MRS r0, cpsr BIC r0, r0, #MASK_MODE ORR r0, r0, #MODE_SVC32 ORR r0, r0, #I_BIT ORR r0, r0, #F_BIT MSR cpsr_c, r0 LDR r2, =ARM7_INTMASK ;R2->interrupt controller MVN r1, #0 ;&FFFFFFFF STR r1, [r2] ;disable all interrupt soucres LDR r2, =ARM7_INTPEND ;R2->interrupt pend register. MVN r1, #0 ;&FFFFFFFF STR r1, [r2] ;clear all interrupt flags. ;Part 2 ;**************************************************************** LDR r0, =ARM7_SYSCFG LDR r1, =0x87ffffA0 ;config SYSCFG STR r1, [r0] ;Cache & WB disabled ;Part 3 ;*************************************************************** ; Import some important variables for later use IMPORT |Image$$RO$$Base| IMPORT |Image$$RO$$Limit| IMPORT |Image$$RW$$Base| IMPORT |Image$$RW$$Limit| IMPORT |Image$$ZI$$Base| IMPORT |Image$$ZI$$Limit| ;Part 4 ;**************************************************************** ;Initalize the memory as followa: ; FLASH @ 0 ~ 2 M ; SDRAM @ 2 ~ 18M LDR r1, =rEXTDBWTH ;EXTDBWTH LDR r2, =rROMCON0 ;ROMCON0 @ 0M ~ 2M LDR r3, =rROMCON1 ;ROMCON1 @ DISABLED LDR r4, =rROMCON2 ;ROMCON1 @ DISABLED LDR r5, =rROMCON3 ;ROMCON1 @ DISABLED LDR r6, =rROMCON4 ;ROMCON1 @ DISABLED LDR r7, =rROMCON5 ;ROMCON1 @ DISABLED LDR r8, =rSDRAMCON0 ;SDRAMCON0 @ 2M ~ 18M LDR r9, =rSDRAMCON1 ;SDRAMCON1 @ DISABLED LDR r10,=rSDRAMCON2 ;SDRAMCON2 @ DISABLED LDR r11,=rSDRAMCON3 ;SDRAMCON3 @ DISABLED LDR r12,=rSREFEXTCON LDR r0, =ARM7_EXTDBWTH STMIA r0, {r1-r12} ;Part 5 ;*************************************************************** ;Self copy from FLASH to SDRAM LDR r0, =|Image$$RO$$Base| LDR r1, =|Image$$RO$$Limit| LDR r2, =|Image$$RW$$Base| LDR r3, =|Image$$RW$$Limit| SUB r1, r1, r0 SUB r3, r3, r2 ADD r1, r1, r3 LDR r2, =0x200000 ;@2M COPY LDR r3, [r0], #4 STR r3, [r2], #4 SUBS r1, r1, #4 BNE COPY ;Part 6 **************************************************************** ;Remap the memory ; FLASH @ 16 ~ 18M ; SDRAM @ 0 ~ 16M LDR r1, =rEXTDBWTH_R ;EXTDBWTH LDR r2, =rROMCON0_R ;ROMCON0 @ 16M ~ 18M LDR r3, =rROMCON1_R ;ROMCON1 @ DISABLED LDR r4, =rROMCON2_R ;ROMCON2 @ DISABLED LDR r5, =rROMCON3_R ;ROMCON3 @ DISABLED LDR r6, =rROMCON4_R ;ROMCON4 @ DISABLED LDR r7, =rROMCON5_R ;ROMCON4 @ DISABLED LDR r8, =rSDRAMCON0_R ;SDRAMCON0 @ 0M ~ 16M LDR r9, =rSDRAMCON1_R ;SDRAMCON1 @ DISABLED LDR r10,=rSDRAMCON2_R ;SDRAMCON2 @ DISABLED LDR r11,=rSDRAMCON3_R ;SDRAMCON3 @ DISABLED LDR r12,=rSREFEXTCON_R LDR r0, =ARM7_EXTDBWTH STMIA r0, {r1-r12} ;注意这一句之后就是存储控制其重映射了 ;但是MCU中PC的值没有变,所以依然是从 ;这里开始执行,但是“这里”已经不是FLASH ;里面了,而是SDRAM中 ;Part 7 ;***************************************************************** ; Copy RW & ZI to SDRAM LDR r0, =|Image$$RO$$Limit| LDR r1, =|Image$$RW$$Base| LDR r3, =|Image$$ZI$$Base| CMP r0, r1 BEQ %1 0 CMP r1, r3 ; Copy init data LDRCC r2, [r0], #4 STRCC r2, [r1], #4 BCC %0 1 LDR r1, =|Image$$ZI$$Limit| ; Top of zero init segment MOV r2, #0 2 CMP r3, r1 ; Zero init STRCC r2, [r3], #4 BCC %2 ;Part 8 这部分才是真正的执行code,前面的都是linker添加的类似uboot的代码 ;********************************************************************* ;Use the UART0 to tranmit some byte ;;------------------------------------ ;; SerialComm program ;;------------------------------------ ;; ARM7_ULCON0 (UART0s Line control Register) Initializatin ; ; [1:0] Word length per frame (WL) ; 00 = 5 bits 01 = 6 bits ; 10 = 7 bits 11 = 8 bits ; [2] Number of Stop bits at the end of frame (STB) ; 0 = One stop bit per frame ; 1 = Two stop bits per frame ; [5:3] Parity mode (PMD) ; 0xx = No parity ; 100 = Odd parity ; 101 = Even parity ; 110 = Parity forced/ checked as 1. ; 111 = Parity forced/checked as 0. ; [6] Serial clock selection (SC) ; 0 = Internal (MCLK) ; 1 = External (UCLK) ; [7] Infra-red mode selection (IR) ; 0 = Normal mode operation ;; 1 = Infra-red Tx/Rx mode LDR R1,=ARM7_ULCON0 LDR R0,=0x03 ;8 bit ,one stop,no parity,MCLK,Normal mode STR R0,[R1] ; ARM7_UCON0 (UART0s control Register) Initializatin LDR R1,=ARM7_UCON0 LDR R0,=0x09 ;no receive interrupt,interrupt Tx mode,no DSR STR R0,[R1] ;; ARM7_UBRDIV0 (UART0s baud rate divisor Register) ; ; BRGOUT = (MCLK2 or UCLK)/(CNT0 + 1)/(16^CNT1)/16 ; ; When MCLK=50MHz(MCLK2=MCLK/2) ; Baudrate=9600: UBRDIV0=0xA20 ;; Baudrate=19200: UBRDIV0=0x500 LDR R1,=ARM7_UBRDIV0 LDR R0,=0x500 ;When MCLK=50MHz, Baudrate=19200 STR R0,[R1] ; Transmit the message from UART0 of S3C4510B to DCE LDR R7,=LOOPNUM LOOP LDR R1,=LINE1 BL PrintLine LDR R1,=LINE2 BL PrintLine LDR R1,=LINE3 BL PrintLine LDR R1,=LINE4 BL PrintLine LDR R1,=LINE5 BL PrintLine SUBS R7,R7,#1 BNE LOOP STOP ; MOV r0, #0x18 ; angel_SWIreason_ReportException ; LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit ; SWI 0x123456 ; Angel semihosting ARM SWI NOP B STOP ;Subroute----PrintLine PrintLine MOV R4,LR MOV R5,R1 Line LDRB R2,[R5],#1 AND R1,R2,#&FF TST R1,#&FF MOVEQ PC,R4 BL PrintByte NOP MOV R0,R0 NOP B Line PrintByte LDR R3,=ARM7_USTAT0 ;Query the TBE bit,if bit=0,waiting... LDR R6,[R3] TST R6,#&40 BEQ PrintByte ;TBE=0 LDR R3,=ARM7_UTXBUF0 ;TBE=1,and write data to UTXBUF0 and transmit STR R2,[R3] MOV PC,LR AREA PRINTLINEOUT,DATA,READWRITE ;这是RW data LINE1 DCB &A,&D,"***************************************",0 LINE2 DCB &A,&D," hello world,i am qrsgate2004 in ARM ",0 LINE3 DCB &A,&D," These is the Serial IO test program!",0 LINE4 DCB &A,&D," Let us go on!!",0 LINE5 DCB &A,&D,"***************************************",&A,&D,&A,&D,0 END
相关文章推荐
- 使用Spring Boot日志框架在已有的微服务代码中添加日志功能
- SpringBoot系列三:SpringBoot基本概念(统一父 pom 管理、SpringBoot 代码测试、启动注解分析、配置访问路径、使用内置对象、项目打包发布)
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- 什么是JTAG,U-BOOT的启动流程及移植,如何正确使用ads(axd)
- ARM启动代码及ADS基本使用
- 使用u-boot_2016_01启动mini2440(一)启动代码
- [小代码]在任何时候使用Toast
- 在springboot中,如何做到当项目启动的时候去执行这个逻辑
- 3、Spring Boot之使用init.d启动jar
- U-BOOT-2016.07移植 (第四篇) 修改代码,从NOR启动
- spring boot中使用generator插件自动生成代码
- 使用iPhoneX模拟器适配时如何改动最少的代码使不支持模拟器的.a文件相关的功能不报错
- 怎么知道自己的代码或者循环执行时候,同时有几个功能单元在并行
- ASP.NET中使用脚本代码保护功能
- angular使用bootstrap方法手动启动的实例代码
- 使用Swagger生成JAVA Mock Server(Springboot)代码
- spring boot项目中使用spring-boot-devtools模块进行代码热部署,避免重新启动web项目
- Weblogic启动失败以及Apache使用时候需要的事项。
- 在研究ARM Linux启动代码的时候顺手翻译了一下:
- 在使用Git push或pull代码的时候,总是要输入用户名和密码的问题