1. S3C2416概述

S3C2416是低功耗、高性能、低成本的SAMSUNG ARM9(ARM926EJ)处理器,目前三星已停止生产S3C2440, S3C2416具有更高的性能,以及更低的价格,是S3C2440、S3C2410等处理器的完美替代者。相比S3C2440,S3C2416采用了双总线架构,主频也可稳定达到533M,内存接口也支持DDR/DDR2等,具有2D图形加速器,支持MLC nand flash,支持SD卡启动。尤其是支持SD卡启动,使之代码调试,烧录变得极其简单,无需任何的代码烧录设备,只要把代码烧写进SD卡,设置从SD卡启动即可对代码进行更新。

SofTool.CN Notes:

  • S3C2416 是 ARM926 ,所以在Linux内核中 .proc.info.init 段被定义在 arch/arm/mm/proc-arm926.S 中;

S3C2416的特性有以下几点:

  • 1.3V 内核供电,主频400M, 1.8V/2.5V/3.0V/3.3V ROM/SRAM储存器供电, 1.8V/2.5V mSDR/mDDR/DDR2 动态存储器供电,1.8V/2.5V/3.3V 外部I/O 供电,具备16KB 的指令缓存和16KB 的数据缓存和MMU
  • 外部存储控制器(mSDR/mDDR/DDR2控制和片选逻辑)
  • LCD 控制器(最大支持256K色)提供1 通道LCD 专用DMA
  • 6通道DMA 并有外部请求引脚
  • 4通道UART(IrDA1.0,64字节发送FIFO和64字节接收FIFO)
  • 1通道高速SPI
  • 1通道IIC总线接口(支持多主机)
  • 1通道IIS总线音频编解码器接口(24位,端口0支持5.1声道)
  • AC97/PCM编解码器接口(和IIS复用)
  • 2通道高速MMC/SD接口(SD主接口协议2.0版,MMC协议兼容4.2版)
  • 2通道USB主机(兼容1.1版)/1通道USB设备(兼容2.0版)
  • 4通道PWM 定时器和1通道内部定时器/看门狗定时器
  • 10通道12位ADC 和触摸屏接口
  • 具有日历功能的RTC
  • 138个通用I/O口和16通道外部中断源
  • 电源管理具有工作,空闲,待机,深度待机和休眠模式
  • 具有PLL片上时钟发生器

2. S3C2416编程环境概述

2.1. 代码编译工具

S3C2416是ARM926EJ内核,使用armv5指令集,相比armv4指令集,指令只是增加了软件断点BKPT,双字加载,存储指令LDRD/STRD等。因此,只要能编译armv4指令集(常见arm7/arm9芯片采用的指令版本)的编译器都可以用来开发S3C2416。目前流行的常用arm编译器有IAR,Keil MDK,arm-linux-gcc等。尤其是对于嵌入式linux方面的开发,几乎无疑选用arm-linux-gcc,但此处笔者暂时是用来作裸机方面的开发,因此选用一款windows下集成开发环境更适合。Keil用于开发arm的集成环境有很多称呼uVersion、MDK、Keil for arm等。而Keil公司已经被ARM公司收购,因此编译器方面选择MDK是不错的选择。

01_裸机开发环境以及启动模式 - 图1

图2.1-1 MDK集成开发环境

2.2. 三星专用工具

对于三星系列的cpu,三星公司开发了两个专用工具来开发其门下的芯片。dnw.exe用来串口调试以及通过usb进行下载,而IROM_Fusing_Tool.exe是用来烧写代码到sd卡特定位置的,通过设置sd卡启动,即可运行sd卡里面的代码。在没有任何烧录设备时,这是唯一简单,省成本的代码烧录方式。从sd卡启动后可把bootloader烧写进nand flash等固化存储器,以后通过nand启动等方式运行bootloader即可。

01_裸机开发环境以及启动模式 - 图2

图2.2-1 串口调试及usb下载工具dnw

01_裸机开发环境以及启动模式 - 图3

图2.2-2 sd卡启动代码烧录工具

3. S3C2416启动模式

S3C2416支持多种启动模式,通过外部引脚OM[4:0]来决定从哪个存储设备上启动,引脚配置对应的启动模式见下图:

01_裸机开发环境以及启动模式 - 图4

图3-1 S3C2416启动模式配置

SofTool.CN Notes:
奇怪,上图和我的UM_S3C2416_rEV130文档不太一样。

目前市面上的各类S3C2416开发板都是参照三星smdk2416开发板进行开发的。由于有了IROM启动以及NAND启动,Nor flash已基本没有用处,因为代码一般是不会在Norflash执行,都是要搬到RAM里执行,不然性能无法忍受。因此,市面上的开发板基本都是不再配置Nor flash,只配置了NAND flash。笔者此处只讲解市面上S3C2416开发板支持的两种启动模式,IROM启动和NAND启动。

01_裸机开发环境以及启动模式 - 图5

图3-2 启动模式对应的存储器映射

3.1. IROM启动

SofTool.CN Notes:
官方推荐的方法 认为比较好,因为有时NandFlash第0块损坏导致无法启动

通过设置[OM4, OM3, OM2, OM1, OM0] = [0,1,0,0,x],上电复位即可从IROM启动,IROM启动即先执行芯片固化代码(在0x0位置处),固化代码先进行初始化芯片(如设置系统时钟,初始化堆栈等),随后会再根据相关引脚的配置([GPC7:GPC5]),确定启动设备是SD/MMC还是NAND,对于IROM NAND启动,固化代码从[GPC7:GPC5]的引脚配置状态得出NANDFLASH的信息,如页大小,地址周期多少。之后固化代码再从 NAND FLASH 的 0x0 地址偏移处读出 8k的代码 到内部RAM地址0x40000000处,这块8k的IRAM就被叫做Steppingstone。因为这8k的IRAM代码往往需要进一步引导用户的其它代码到RAM运行。对于IROM SD/MMC启动,固化代码会直接从SD/MMC卡的一个特殊位置读出8k的代码到0x40000000处的Steppingstone。复制完代码到Steppingstone后,固化代码跳转到0x40000000处开始执行用户的代码。
IROM启动的更多细节,笔者已在文章的最后给出相关的参考文档S3C2450_51_16_IROM_ApplicationNote.pdf。

01_裸机开发环境以及启动模式 - 图6

图3.1-1 IROM启动存储设备配置

SofTool.CN Notes 补充:
iROM:Interal ROM
iROM启动:三星的S3C2416芯片在地址为0x8000_0000的IROM区域固化了一段大小为32KB的代码,称作BL0。处理器上电后,PC指向运行0x8000_0000,运行BL0,这种启动方式称作iROM启动。
iROM启动流程:启动的大体流程如下:
1) 运行BL0进行一些初始化工作,如关闭看门狗,初始化TCM、系统时钟、堆栈等
2) 然后根据GPN[15:13]管脚的电平状态,判断选定的存储设备的类型,初始化存储设备和它对应的控制器。从存储设备(SD/MMC/OneNand/Nand)的特定区域读取8KB的程序到SteppingStone中运行,被拷贝的这段代码称Bootloader1(BL1)。
3) BL1是用户自行编写的代码,必须简短精悍,运行与位置无关。BL1一般简单地重新初始化系统,开辟更广阔的内存空间,并将更加完善的Bootloader2(BL2)拷贝到SDRAM中。
4) IROM启动内存映射地址

01_裸机开发环境以及启动模式 - 图7


跳转到SDRAM中的BL2,继续运行,BL2功能更加强大,把存储设备中的内核和文件系统加载到SDRAM中,从而启动系统。

3.2. NAND启动

首先要先确定板载NAND FLASH的信息,如地址周期,页大小等,然后再根据NAND FLASH的信息配置相应的[OM4:OM0],上电复位即可从NAND启动。NAND启动模式下,NAND控制器会自动从NAND FLASH 0x0地址偏移处拷贝8KB的代码到内部RAM地址0x0处,用户代码从0x0处开始执行。从Samsung给出的S3C2416数据手册来看,较新的数据手册都已经把NAND启动[OM4:OM0]引脚配置以及内存映射信息都删除了,因此Samsung是推荐用户从iROM NAND启动的,因为这样用户代码可以统一处理IROM SD/MMC或IROM/NAND,而不用考虑过多的启动模式。

SofTool.CN Notes:
NAND启动也可以使用。

附注:

以下资料笔者认为是与本文相关的,可供学习与参考,点击下面链接即可下载。
a. S3C2416X_UM_Rev0.01_20080412.pdf,S3C2416数据手册,开发必备
b. S3C2450_51_16_IROM_ApplicationNote.pdf,S3C2416及其同类芯片的IROM启动流程详述
c. dnw.exe,三星cpu串口调试及usb下载工具
d. IROM_Fusing_Tool.exe,三星cpu从sd卡代码烧写工具,用于从sd卡启动
百度网盘下载地址: http://pan.baidu.com/s/1kTzAVD9