S5PV210开发系列一开发环境以及启动模式象棋小子 1048272975
ARM核以其高性能、低功耗、低成本广泛应用在各个领域,包括ARM7、ARM9、ARM11、Cortex-M、Cortex-A等这几个系列。众多的
半导体商如NXP、Freescale、Atmel、Samsung、
ti等都设计了基于ARM核的自家通用处理器,ARM核从低成本控制处理器到高性能应用处理器,已经深入到我们生活的方方面面。笔者此处就Samsung的Cortex-A8处理器S5PV210作一个简单的介绍。
1. S5PV210概述S5PV210是一款低功耗、低成本、高性能的移动领域以及普通应用的微处理解决方案,集成于基于ARMv7架构的Cortex-A8内核,支持众多的外设。
S5PV210采用了64位内部总线架构,并包括了许多性能强大的加速硬件,例如,针对于图形、图像加速、显示、伸缩裁剪。集成的多媒体格式编码(MFC)支持编解码MPEG-1/2/4、H.263、H.264,同时还支持实时会议、模拟电视输出、高清视频、PAL等。
S5PV210的关键特性有如下几点:
u ARM Cortex-A8内核,带有NEON信号处理扩展,32/32k 指令/数据缓存以及512k二级缓存,主频
1GHZ@1.2vu 64位多层总线架构
u 用于安全启动的片内64k ROM以及128k RAM
u 8位ITU 601/656摄像头接口,横向最大支持4224像素(伸缩)或8192像素(未伸缩)
u 多格式编解码单元支持MPEG-4/H.263/H.264的编解码,最高支持1080p@30fps,支持MPEG2/VC1/DIVx的解码,最高支持1080p@30fps
u JPEG编解码支持8000万像素每秒
u 支持3D/2D多媒体加速
u 1/2/4/8调色板或8/16/24位非调色板TFT控制器
u 支持模拟电视信号输出以及高清视频接口
u 支持MIPI-DSI以及MIPI-CSI
u 1路AC97音频编解码接口以及3路PCM串口音频接口
u 3通道24位I2S接口
u 1路单输出S/PDIF数字音频接口
u 3通道I2C接口
u 2通道SPI接口
u 4通道UART接口,支持蓝牙2.0
u 1个USB 2.0 OTG控制器
u 1个USB 2.0主机控制器
u 支持异步调制解调器接口
u 4通道SD/SDIO/HS-MMC接口
u 支持ATA/ATAPI-6标准接口
u 24通道DAM控制
u 支持14x8矩阵键盘
u 10通道12位复用ADC
u 可配置的GPIO口
u 实时时钟、PLL、定时器、看门狗等
u 用于在掉电模式下精确计时的系统时钟
u 支持可扩展的存储器接口
2. S5PV210开发环境2.1. 指令集S5PV210是Cortex-A8内核,该内核为ARMv7-A架构,支持两个最主要的指令集:32位ARM指令集以及16/32位Thumb-2指令集。ARM指令集每条指令采用32位长度,具有最高的效率,但也需要更多的代码空间,ARM指令集是向后兼容的,即ARMv7-A的处理器几乎可以直接执行ARMv4架构的ARM指令集代码(如ARM7的应用代码)。Thumb-2是Thumb的扩展指令集,在ARMv6架构前,Thumb作为16位指令集,是作为ARM指令集的子集,它是为了减小代码量而提出的,并不完整,只支持通用功能,无法脱离ARM指令集。在ARMv7架构中,Thumb-2作为必备指令集,它支持16/32混合指令模式,几乎实现了所有的ARM指令集功能,并且效率接近ARM指令集,代码密度接近Thumb指令集。Thumb-2指令集的引入意味着程序存储器可以更小,在一些Cache应用中,相同容量的指令Cache可以缓存更多的指令,提高了指令Cache命中率,间接提升了内核性能。例如,对于Cortex-M内核,更是只支持Thumb-2指令集,因此一般无特殊情况,对于ARMv7内核,也可以直接采用Thumb-2指令集。
除此之外,Cortex-A8内核具有可加速多媒体和信号处理算法的NENO单元。NENO技术包括了单指令多数据SMID指令以及矢量浮点VFPv3指令,因此要想发挥出内核的最优性能,编译器还需支持SMID指令集以及VFPv3指令集。
2.2. 编译工具ARM开发从编写源码到最终生成目标可执行二进制代码需要借助一系统的开发工具,如c编译器、汇编器、链接器、调试器、二进制转换工具等,一般均需成套使用。以下简单地介绍几种常用的ARM集成开发工具。
2.2.1. MDKKeil因Keil C51而被国内广大工程师所熟知,而KeilMDK则是Keil针对ARM核开发的集成开发环境。Keil被ARM公司收购后,也采用了ARM RealView编译工具,使得Keil MDK编译效率、编译质量等都得到相应的提升,目前也是ARM官方编译器。Keil MDK支持ARM7、ARM9、Cortex-M0、Cortex-M3、Cortex-M4这几个中低端系列ARM核。其简单的操作使用,高度优化的微库、小封装实时操作系统、完善的GUI支持等使之能快速开发各种针对性应用,为小型嵌入式应用开发提供完备的解决方案。
2.2.2. IARIAR支持众多半导体公司的微处理器,支持20多种不同架构的8位、16位、32位内核。例如,IAR for 51用来开发经典的51
单片机,IAR for avr用来开发atmel的AVR单片机,IAR for stm8用来开发STMicroelectronics的stm8单片机等等。而IAR for arm即为IAR针对ARM内核开发的工具集,其简洁的用户界面,众多功能强大的设置操作,如自动MISRA C规则检查,完善的C99支持等。ARM版本的IAR支持各个系列的ARM核,包括本章所述的Cortex-A8内核。IAR具有较好的代码优化性能,高质量的代码编译,是一款相当优秀的编译工具。
2.2.3. DS-5DS-5是一款针对ARM支持的Linux和Android平台的全面的端到端软件开发工具套件。ARM自家的编译工具已经经过了几个版本的发展,从最初的ADT到ADS,再到RVDS,到现在的DS-5。其中ADT和ADS已经停止更新十多年了,远远不满足现今的ARM开发要求,不应再继续使用。目前的DS-5支持ARM最新的内核,可以针对具体的内核进行流水线指令等的优化,可对Cortex-A7、Cortex-A8、Cortex-A9、Cortex-A15等直接进行软件模拟
仿真。没有人会比ARM更熟悉ARM内核了,有理由相信DS-5会比其它编译工具有更高的代码优化以及更高的代码质量。
2.2.4. GCCGCC是一套由GNU开发的编译工具,已经被大多数的Unix操作系统(如Linux)采纳为官方编译工具。GCC也支持众多的处理器架构,如ARM、Alpha、MIPS、AVR等等。GNU计划开发出了大批自由免费的开源项目,这些开源项目绝大部分都是基于GCC开发,虽然免费,但丝毫不输相应的商业软件。如果在Linux操作系统下开发ARM,选择GCC也将拥有一大批的优秀开源项目,这也是Linux操作系统繁荣以及吸引人的地方。GCC功能强大灵活,但其绝大部分基于命令行,基于makefile,shell脚本,是习惯windows下开发的工程师所不适的,但使用像eclipse这样的集成开发环境,GCC也将变得容易使用。
软件开发与编译工具是无关的,完全可以根据自己的使用习惯选择一款编译工具。由于windows下使用IAR的用户较多,笔者此处也将基于IAR开发S5PV210。
2.3. 其它工具2.3.1. dnw.exe对于三星系列CPU,三星在windows下开发了dnw.exe工具用来辅助开发其门下芯片。dnw.exe支持两个最主要的功能串口
通信以及USB通信,支持通过串口或USB下载PC端文件到目标板,在调试开发阶段将发挥重要的作用。
图2-1 dnw.exe工具
2.3.2. sd/mmc启动烧录工具对于应用处理器,往往支持多种启动设备,S5PV210也不例如,支持sd/mmc启动、OneNand启动、Nand启动、eSSD启动等。多种启动方式,方便根据实际的应用需求,选择相应的固化存储器,降低BOM成本。尤其是sd/mmc启动方式,只需在PC端把代码烧录进sd/mmc卡,目标板即可执行sd/mmc卡里面的代码,无需复杂的操作以及昂贵的烧录器等。在调试开发阶段,代码往往可以直接烧录进sd/mmc卡运行调试,调试通过后,再通过sd/mmc卡里面的bootloader代码自动把sd/mmc卡里面的烧录bootloader、内核、文件系统等二进制代码烧录进板载Nand flash等固化存储器之中,之后通过板载固化存储器启动即可。
SdBoot.exe为笔者在windows下针对三星S3C2416和S5PV210这两个平台开发的sd/mmc启动烧录工具。sd/mmc启动需要相应的代码格式以及需烧录进sd/mmc卡指定的位置,SdBoot.exe工具集代码格式转换以及sd/mmc卡烧录于一体,可以烧录S3C2416和S5PV210这两个平台下笔者编写的裸机bootloader,wince bootloader,uboot,工具简单易用。
图2-2 SdBoot.exe工具
3. S5PV210启动模式S5PV210支持多种启动模式,通过外部引脚OM[5:0]来选择相应的启动模式,引脚配置对应的启动模式见下图。一般设计中是不会用到Nor flash,因为Nor flash速度慢,不可能用来直接执行代码,都是要加载进RAM执行,代码存储可以根据实际情况选择eMMC、Nand flash等板载固化存储器。
图3-1 OM启动引脚描述
其中,sd/mmc channel 0、Nand、eSSD、OneNand作为第一启动设备,如果第一启动设备失败,则尝试第二启动设备(sd/mmc channel 2),如果再失败,则尝试UART启动,再失败,则是USB启动,若再失败,则停止启动流程。
为了支持外部设备的启动,S5PV210内置了64K ROM以及96K SRAM。其中64K ROM代码位于0x00000000,是三星固化进芯片的代码,称为BL0。在上电复位后,BL0代码最先执行,BL0首先关闭看门狗,初始化指令Cache、堆栈、功能函数、PLL及系统时钟后,拷贝用户代码(BL1)到内部SRAM 0xD0020000处,通过检验和检验BL1代码是否正确,如果失败,则尝试第二启动设备启动,检验成功,则跳转到用户的BL1代码执行。
用户的BL1代码最大16K,可以在BL1处初始化最基本的系统参数,如DRAM初始化,堆栈的重新设置、协处理器等的初始化,然后加载BL2(或者直接内核)到相应的RAM位置,最后跳转到BL2(或内核)执行。
由于BL0代码要检验BL1的代码,正确才能执行,因此BL1代码有特定的格式要求。BL1代码在最开头必须包含4个字的信息头,第0个字以及第2个字将会被BL0用来检验代码的正确性,因此这两个字必须如实反映BL1代码的情况。第0字为BL1代码的大小(Byte),最大16k,第2个字为BL1代码的检验和,BL0根据BL1代码的大小计算出相应的检验和,再与信息头的第2个字比较,若一致,则跳转到BL1执行,否则认为检验失败,尝试第二启动设备。
图3-2 Header Info
除此之外,对于OneNand/Nand启动设备,BL0除了检验BL1的检验和之外,还会检验Nand ECC数据,BL1在烧录进Nand设备时,还应生成相应的8/16位ECC数据,写入到Nand spare区的指定位置,不然ECC校验失败也将无法从Nand设备启动。
图3-3 Nand ECC检验
4. 附录SdBoot.exe工具以及使用手册