如何在两块s5pv210上c s通信模式

没有更多推荐了,
不良信息举报
举报内容:
S5PV210 串口
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!S5PV210开发系列三_简易Bootloader的实现
时间: 13:37:54
&&&& 阅读:194
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&S5PV210开发系列三
简易Bootloader的实现
象棋小子&&&&&&&&&
Bootloader是嵌入式系统上电后第一段执行的代码。对于功能简单的处理器,可能并没有Bootloader的概念,但对于应用处理器,有不同的启动方式,不同的存储设备(Nand flash、sd/mmc、DDR2、SRAM等),不同的操作系统等,往往需要一个Bootloader先初始化CPU和相关的硬件,建立内存空间映射,把内核或应用程序加载到相应的内存执行位置,最后调用内核或应用程序,释放CPU控制权,完成整个Bootloader的流程。笔者此处就S5PV210的Bootloader实现作一个简单的介绍。
1. Bootloader流程
Bootloader是严重依赖于具体硬件实现的,相同CPU内核架构,不同厂商生产的处理器其Bootloader都是完全不一样的,即使对于同一CPU,板载不同的硬件配置,往往都是要针对性实现其Bootloader。因此,Bootloader的功能、流程等都没有特定的要求,只要将系统的软硬件环境带到一个合适的状态,最终为操作系统内核或应用程序准备好正确的环境即可。一般对于一个Bootloader应实现两种不同的操作模式:启动加载模式和下载模式。启动加载模式就是Bootloader从设备系统的某个固态储存器中将操作系统或应用程序加载进RAM,整个过程无需用户的介入,这种模式是设备成型后Bootloader的正常工作模式。下载模式是Bootloader可以通过串口、USB或网络等通信手段从主机下载文件,并最终写入到到设备系统的某个固态储存器中,这种模式用在设备开发调试中,用于刷机升级。此处笔者从自己的角度简单介绍Bootloader实现的一般流程。
与Bootloader相关的代码文件放在System目录文件夹中,目录架构如下:
& s5pv210.s,启动代码文件,代码执行时的入口,控制了整个Bootloader的执行流程,最终建立起c运行环境后,进入到应用程序main入口。& LowLevelInit.s,板级初始化代码,包括CPU时钟的初始化、DDR2内存控制器初始化、代码加载实现(sd/mmc卡启动、Nand flash启动)。& Coprocessor.c,协处理器相关代码,主要是CP15协处理器L1 Cache、L2 Cache、MMU内存映射、中断向量基址等操作代码。& NandBoot.c,实现Nand flash启动相关Nand驱动代码,实现相应Nand代码下载、Nand代码启动的接口实现。& Download.c,实现代码下载调试功能,支持代码直接下载内存调试运行,支持代码下载进Nand flash,支持uboot的内存下载运行调试以及Nand下载固化。& Exception.c,异常处理相关代码,支持中断处理的完整架构,如中断嵌套处理、中断注册、中断开启等接口实现,为系统应用架构实现。& Retarge.c,标准IO的底层重定向,支持c库中的标准IO函数,如标准输入、输出流重定向到串口、文件操作重定向到相应的文件系统接口实现等,为系统应用架构实现。& s5pv210.icf,IAR下链接文件,指定板载内存范围,代码以及RAM等布局。
这里笔者说明一下,在建立c运行环境之前的Bootloader代码均是地址无关的,CPU上电后会加载部分的Bootloader代码到内部RAM执行,任何RAM地址这部分Bootloader均应能正确执行。Bootloader中不要尝试调用c库函数,注意在Bootloader的c代码c运行环境也是不成立的。在Bootloader中应初始化最关键的硬件环境,其它不紧要的硬件初始化或功能代码可以放到c运行环境建立后处理。
1.1. 异常向量表
ARM核在异常发生时,会从异常向量表中取得相应的异常向量地址执行,发生IRQ中断则从异常向量表0x18偏移处取得IRQ异常向量地址。异常向量表就是用来记录各个异常进入时的代码处理位置。除了Cortex-M处理器有嵌套向量中断控制器(NVIC),以下的异常向量处理对所有系列的ARM核均是成立的。
__iar_program_start
&&& BLX Reset_Handler&&&&&&&
&&& LDR PC, Undef_Addr
&&& LDR PC, SWI_Addr
&&& LDR PC, PAbt_Addr
&&& LDR PC, DAbt_Addr
&&& LDR PC, Notuse_Addr
&&& LDR PC, IRQ_Addr
&&& LDR PC, FIQ_Addr
&&& DCD 0x55aa55 0x20位置用来判断代码的运行区域
&&&&&&&&&&&
Undef_Addr
&&& DCD Undef_Handler
&&& DCD SWI_Handler
&&& DCD PAbt_Handler
&&& DCD DAbt_Handler
Notuse_Addr
&&& DCD 0&&&&&&&&&&; Reserved Address
&&& DCD IRQ_SaveContext
&&& DCD FIQ_Handler
IRQ_SaveContext
; 保存中断上下文,支持中断嵌套&&&&&&&&&&&&&
&&& SUB LR, LR, #4 ; 计算返回地址
&&& STMFD SP!,{R0-R12, LR} ;所有寄存器压栈保存
&&& MRS R0, SPSR ; 保存中断前的CPSR(即现在的SPSR)
&&& STMFD&& SP!, {R0} ;
&&& MSR CPSR_cxsf, #Mode_SYS+I_B 切换到系统模式
&&& STMFD&& SP!, {LR} ; 压栈系统模式LR
&&&&&&&&&&&&&&&
&&& LDR R0, =IRQ_H系统模式下进行IRQ代码处理
&&& BLX R0 ; 调用中断处理函数
&&&&&&&&&&&
&&& LDMFD&& SP!, {LR} ; 出栈系统模式LR
&&& MSR CPSR_cxsf, #Mode_IRQ+I_B 切换到IRQ模式&&&&&&&&&&&&&&&&&
&&& LDMFD&& SP!, {R0} ; 返回中断前的CPSR&&&&&&&&&&&&&&&
&&& MSR SPSR_cxsf, R0
&&& LDMFD& SP!, {R0-R12, PC}^ ; ^表同时从spsr恢复给cpsr
&&& PUBWEAK Undef_Handler
&&& PUBWEAK SWI_Handler
&&& PUBWEAK PAbt_Handler
&&& PUBWEAK DAbt_Handler
&&& PUBWEAK IRQ_Handler
&&& PUBWEAK FIQ_Handler
Undef_Handler
SWI_Handler
PAbt_Handler
DAbt_Handler
IRQ_Handler
FIQ_Handler
1.2. 关看门狗
复位代码最先做的事应该是关看门狗,因为如果看门狗打开的话,在启动代码进行初始化过程中是无法喂狗的,可能造成处理器一直不停复位。
; 看门狗关闭
&&& LDR R0, =WT_BASE
&&& LDR R1, =0
&&& STR R1, [R0]
1.3. 关闭所有中断
启动代码未完成时,各个状态都还不是确定的,如果有中断打开并引起中断异常,可能造成代码跑飞。
; 关闭所有外设中断
&&& LDR R1,=0xFFFFFFFF
&&& LDR R0,=VIC0_BASE
&&& STR R1,[R0, #INT_EN_CLR_OFS]
&&& LDR R0,=VIC1_BASE
&&& STR R1,[R0, #INT_EN_CLR_OFS]
&&& LDR R0,=VIC2_BASE
&&& STR R1,[R0, #INT_EN_CLR_OFS]
&&& LDR R0,=VIC3_BASE
&&& STR R1,[R0, #INT_EN_CLR_OFS]
1.4. 初始化协处理器
ARM核可最多支持16个协处理器,其中一般内置了CP14调试通信协处理器以及CP15系统控制协处理器。在Bootloader中需要对实际的寄存器物理地址进行初始化读写,因此应初始化CP15协处理器关闭Cache、关闭MMU、设置中断向量表基址等。
; 初始化协处理器
&&& EXTERN Coprocessor_Init
&&& BLX Coprocessor_Init
1.5. 初始化系统时钟
一般来说,处理器复位后都是运行在一个较低速的时钟下,为加快启动,通常尽可能快地设置处理器的各个时钟。
; 系统时钟设置
&&& EXTERN& &&& Clock_Init
&&& BLX Clock_Init
1.6. 初始化外部内存
除了Nor flash可以直接执行代码外,其它的代码存储器如nand flash、sd/mmc都是不能直接执行代码的。一般对于应用处理器,代码都是加载进RAM后执行。
; 外部内存控制设置
&&& EXTERN& ERAM_Init
&&& BLX ERAM_Init
&&& LDR SP,=SFE(CSTACK) ; RAM初始化后调整栈指针到外部RAM
1.7. 下载模式
在调试开发阶段,可以通过直接下载代码到RAM调试执行,避免重复地烧写固态存储器,加快调试开发,在确定代码OK后,再把代码下载进固态存储器(Nandflash)即可。在开发完成后,下载模式代码可注释掉。
; 检查是否进入串口下载模式,开机时按住空格键进入串口下载模式
&&& EXTWEAK DownloadCheck&&
&&& BLX DownloadCheck&&
1.8. 代码加载
对于代码存储在Nand flash、sd/mmc等不能直接执行代码的存储器,Bootloader是一定需要把用户代码从这些设备读入到特定的内存中执行的。而对于Nor flash可直接执行代码的存储器,通常为了提高性能,也是会把代码从Nor flash读出,在内存中执行的。
; 拷贝用户代码到RAM
&&& EXTERN& &&& CopyCodeToRAM
&&& BLX CopyCodeToRAM
1.9. MMU内存映射
为了提高CPU的处理性能,MMU必须开启,在开启之前,需先建立相应的内存空间映射表,设置相应的内存区域访问权限等。开启MMU后,也必须同时开启L1 I/D Cache、L2 Cache、硬件分支预测功能,不然CPU的性能将极其低下,有几十倍的性能差异。
; MMU初始化
&&& EXTERN& &&& MMU_Init
&&& BLX MMU_Init
1.10. 初始化栈
ARM核有多种工作模式,每种模式的栈是一定要分配及初始化的,这样才能在相应模式下正确地执行代码。
; 堆栈初始化
;& Enter Undefined Instruction Mode and set itsStack Pointer
&&& LDR R0,=SFE(UND_STACK)
&&& LDR R1,=Mode_UND+I_Bit+F_Bit
&&& MSR CPSR_c,R1
&&& MOV SP,R0
;& Enter Abort Mode and set its Stack Pointer
&&& LDR R0,=SFE(ABT_STACK)
&&& LDR R1,=Mode_ABT+I_Bit+F_Bit
&&& MSR CPSR_c,R1
&&& MOV SP,R0
;& Enter FIQ Mode and set its Stack Pointer
&&& LDR R0,=SFE(FIQ_STACK)
&&& LDR R1,=Mode_FIQ+I_Bit+F_Bit
&&& MSR CPSR_c,R1
&&& MOV SP,R0
;& Enter IRQ Mode and set its Stack Pointer
&&& LDR R0,=SFE(IRQ_STACK)
&&& LDR R1,=Mode_IRQ+I_Bit+F_Bit
&&& MSR CPSR_c,R1
&&& MOV SP,R0
;& Enter Supervisor Mode and set its StackPointer
&&& LDR R0,=SFE(SVC_STACK)
&&& LDR R1,=Mode_SVC+I_Bit+F_Bit
&&& MSR CPSR_c,R1
&&& MOV SP,R0
;& Enter System Mode and set its Stack Pointer
&&& LDR R0,=SFE(CSTACK)
&&& LDR R1,=Mode_SYS
&&& MSR CPSR_c,R1
&&& MOV SP,R0
1.11. 初始化c运行环境
进入c入口之前是需要初始化c环境的,如清0全局变量、静态变量区等。此处直接利用编译器的库函数__cmain来完成c环境的初始化,最后才是真正的应用程序入口main函数,用绝对地址跳转到c入口__cmain,Bootloader释放CPU控制权,完成整个流程。
; Initialize VFP (ifneeded).
&&& EXTERN __iar_init_vfp
&&& LDR R0,=__iar_init_vfp
&&& BLX R0
; Continue to ?mainfor C-level initialization.
&&& EXTERN& __cmain
&&& LDR R0,=__cmain
&&& BX& R0
2. 代码烧写
代码可以存储在Nand flash或sd/mmc卡中,一般先把代码烧写进sd/mmc卡中,这样无需复杂的操作以及昂贵的烧录器等。sd/mmc卡启动后通过里面的Bootloader下载功能把主机上的相应代码下载进设备的Nand flash上,之后无需再用sd/mmc卡,设置Nand flash启动,代码更新也通过Nandflash上的Bootloader下载更新即可。
sd/mmc卡启动需要专用的烧录软件SdBoot,SdBoot.exe为笔者在windows下针对三星S3C2416和S5PV210这两个平台开发的sd/mmc启动烧录工具。sd/mmc启动需要相应的代码格式以及需烧录进sd/mmc卡指定的位置,SdBoot.exe工具集代码格式转换以及sd/mmc卡烧录于一体,可以烧录S3C2416和S5PV210这两个平台下笔者编写的裸机bootloader,wince bootloader,uboot,工具简单易用。
图2-1 SdBoot.exe工具
3. Bootloader下载功能
Bootloader通过串口实现主机代码文件的下载,主机端代码下载需要三星专用的工具dnw.exe工具,连接好串口后,按住空格键后,目标板上电会进入Bootloader的下载模式。
图3-1 Bootloader下载模式
其中选项1可以基于笔者Bootloader开发的应用,下载进RAM,并直接调试运行。下载进RAM的代码均是编译器直接编译出来的代码,未经过SdBoot工具格式转换。
选项2用于uboot的调试开发,可以直接把编译好的uboot二进制代码下载进RAM,并直接调试运行。
选项3用于代码烧录进Nand flash,把通过SdBoot工具格式转换后的基于笔者Bootloader应用代码、uboot代码下载进Nand flash,之后设置Nand flash启动即可。
4. Bootloader功能
笔者的S5PV210的Bootloader设置最高的CPU主频1GHZ,MMU进行1:1内存空间线性映射,并开启L1 I/D Cache、L2 Cache、硬件分支预测功能,使CPU能达到最大的吞吐量性能。初始化内存,能够识别sd/mmc启动和Nand flash启动,自动加载应用代码到RAM位置。统一的中断管理架构、重定向底层IO操作,能够更加专注于应用的开发。
Bootloader.rar,Bootloader下IAR测试工程以及SdBoot工具。
&标签:&&&&&&&&&&&&&&&原文地址:http://blog.csdn.net/huang/article/details/
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!博客访问: 684031
博文数量: 69
博客积分: 1741
博客等级: 上尉
技术积分: 2462
注册时间:
分类: LINUX 23:51:46
& & 三星在android中提供了Camere的hardware framework和HAL层的代码,也提供了S5K系列Camera的参考代码,有了这些就好办了,直接开发。& & 找个相对比较好的sensor吧,先买个可以直接用的模组试一下,以后再自己买sensor芯片做模组,暂时选用了OVW像素(),和在公司调的OV3660和OV5640的差不多,很容易写,把IIC驱动搞好,在BSP中注册设备,找个现成的一改就OK,把init code通过IIC写进去。输出格式:YUYV& &Preview Size: VGA(640x480)&&Framerate:15fpshardware framework的代码暂不用修改,直接使用,编译成libcamera.soHAL及camera驱动会在dev目录下生成video0和video2两个设备节点自己做了个转接板,插上后,进入Camera应用,出影喽。。。。。。。查看调试信息:[& &66.295000] OVc: ov3640 has been probed[& &66.295000] OVc: fetching platform data[& &66.370000] ov3640: power ON[& &66.370000] OVc: ov3640_init: camera initialization start[& &66.385000] [xxm]: ov3640_i2c_write_serials ov3640 init param serials write suceesfully.[& &66.450000] OVc: ov3640_s_ctrl: no such control[& &66.520000] pmem: request for physical address of pmem region from process 88.[& &66.620000] test delay :0[& &66.635000] test delay :0[& &92.185000] test delay :0然后再根据OV3640的代码写了个OV7670的程序,也OK了,目前可以使用拍照和录像功能(需要插TF卡)下一步再搞个OV2655的程序,接着把功能完善一下:1. 曝光值设置2. 拍照大小设置3. 白平衡设置4. 色彩效果设置至于缩放功能,比较麻烦,还要计算窗口大小,如果210平台支持软件缩放就好了,有待验证最近准备写个三星平台的hardware framework源码分析,精彩图片过几天再放上精美图片,拿我家的招财猫做实验(就是这个QT210开发板做的太那个了。。。。很无语,影响发挥啊!)
阅读(7674) | 评论(0) | 转发(5) |
给主人留下些什么吧!~~
请登录后评论。豆丁微信公众号
君,已阅读到文档的结尾了呢~~
基于S5PV210的U-BOOT分析与移植
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于S5PV210的U-BOOT分析与移植
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer--144.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口

我要回帖

更多关于 stm8s003串口通信 的文章

 

随机推荐