1 介绍 S3C4510B是三星公司推出的针对嵌入式应用的 16/32 位嵌入式处理器,该微控制器专为以太网通信系统的集线器和路由器而设计,具有低成本和高性能的特点, S3C4510B中内置了ARM公司设计的 16/32 位ARM7TDMI处理器, 可以执行 32 位的ARM指令,也可执行 16 位的THUMB指令, 并集成了多种外围部件,主要有: ● 时钟频率50MHz ● 内核/IO电压 3.3V ● 8KB的 Cache/SRAM ● 一个 10/100Mbps 以太网控制器,MII 接口 ● 两个 HDLC 通道,每个通道可支持 10Mbps ● 两个 UART 通道 ● 两个 DMA通道 ● 两个 32位定时/计数器 ● 18 个可编程 I/O 口 ● 中断控制器,支持 21个中断源,包括 4 个外部中断 ● 支持 SDRAM,EDO DRAM,SRAM,Flash 等 ● 具有扩展外部总线 ● JTAG 接口,支持软件开发 ,硬件调试 S3C4510B支持目前常用的嵌入式操作系统,如VxWorks、pSoS、uClinux等,本文将主要介绍VxWorks 操作系统下的软件开发。 ARM7TDMI是ARM 家族通用的一款 32 位微处理器,它主要为用户提供了高性能、低价格解决方案。 ARM7TDMI 具有三级流水线的 32 位 RISC 处理器,处理器结构为冯·诺依曼 Load/Store。该 CPU 具有 两种指令集,即 ARM 和 Thumb 指令集。ARM 指令集是 32 位,它可以利用 CPU 最大性能;而 Thumb 指令集则 是 16 位指令集。 ARM7TDMI 内核方块图如图 1 所示。 2 系统硬件图 该系统主要以 S3C4510B为核心,外围集成了以太网卡、SDRAM、FLASH、UART 以及HDLC 等。图2 是以S3C4510B 为核心的最小系统设计图。 SDRAM选用HY57V653220(8Mbyte)、两片FLASH分别为AM29F040(存放bootrom)和T28F160BT(作为文件系统用)。
3 VxWorks 操作系统下 BSP 构建 在完成板上基本硬件的测试后,下面我就开始对 vxWorks操作系统下 BSP 进行开发,开发前需要做一些准备工作,如准备开发工具等。 ① 开发工具用的是 Tornado2.2 for ARM; ② 参考资料有 BSP Kit、S3C4510B DataSheet; ③ 参考 Tornado2.2 for ARM 下自带的 wrSBCArm7 BSP; ④ 烧写程序采用编程器。 通常在开发BSP的时候,我们需要在Tornado原带BSP目录下找一个与我们所用的处理器相同或相近。与 BSP 相关的文件有:romInit.s、sysAlib.s、bootInit.c、bootConfig.c、sysLib.c、config.h、configNet.h、makefile以及与我们硬件相关的,如串口 sysSerial.c 等。由于篇幅所限,具体的文件作用在此就不说了。下面主要根据 S3C4510B 来阐述一下 BSP 开发步骤。 (1)拷贝 BSP 将 wrSBCArm7 BSP 拷贝一份并命名为 4510BSP,接下来的工作就是修改该目录下的文件,从而得到自己的 BSP。 (2)修改 MakeFile 文件 修改 4510BSP 目录下的makefile 文件,修改如下几行: TARGET_DIR = 4510BSP # changed by caiyang VENDOR = CAI # changed by caiyang BOARD = MyArmBoard # changed by caiyang ROM_TEXT_ADRS = 01000000 # ROM entry address ROM_WARM_ADRS = 01000004 # ROM warm entry address ROM_SIZE = 00080000 # number of bytes of ROM space RAM_LOW_ADRS = 00006000 # RAM text/data address (bootrom) RAM_HIGH_ADRS = 00486000 # RAM text/data address (bootrom) MACH_EXTRA = 注解:ROM_TEXT_ADRS:BOOT ROM 的入口地址。对大多数板来说,这就是 ROM 地址区的首地址,然而也有的硬件配置使用 ROM 起始的一部分地址区作为复位向量,因此需要根据此设置偏移量作为它的地址。这个偏移量因 CPU 结构而定。 ROM_WARM_ADRS:BOOT ROM 热启动入口地址。它通常位于固定的 ROM_TEXT_ADRS+4 的地方。当需要热启动时,sysLib.c 文件中 sysToMonitor( )函数代码明确的跳转到 ROM_WARM_ADRS 地址处开始执行。 ROM_SIZE:ROM 实际大小。 RAM_LOW_ADRS:装载 Vxworks 的地址。 RAM_HIGH_ADRS:将Boot Rom Image 拷贝到 RAM 的目的地址。 注意:RAM_LOW_ADRS 和 RAM_HIGH_ADRS 都是绝对地址,通常位于 DRAM 起始地址的偏移量处,该偏移量取决于 CPU 结构,这需要参考 VxWorks 内存分布。对于 ARM 的内存分布请看图 3,从图 3 可以看出RAM_LOW_ADRS 在DRAM+0x1000 处。这些地址对于 S3C4510B 来说都应该是重映射后的地址。 (3)修改 config.h 文件 主要是修改 ROM_BASE_ADRS、ROM_TEXT_ADRS、ROM_SIZE、RAM_LOW_ADRS、RAM_HIGH_ADRS和 undef 掉 不需要的部分。注意这些应该和 makefile 文件中设置的一致。 (4)修改 romInit.s 文件 CPU 一上电就开始执行 romInit( )函数,因此在 romInit.s 代码段中它必须是第一个函数。对于热启动,处理器将会执行 romInit( )加上4 后的代码(具体参考 sysLib.c 中的sysToMonitor( )函数)。更多的硬件初始化在 sysLib.c 中sysHwInit( )函数中,romInit( )的工作就是做较少的初始化并把控制权交给 romStart( )(在bootInit.c 文件)。 在 S3C4510B处理器中,romInit.s 文件主要做了以下几个工作: ① 禁止 CPU中断并切换到 SVC32 模式; ② 禁止中断控制器; ③ 初始化 SYSCFG、EXTDBWTH、ROMCON0、ROMCON1、DRAMCON0 等寄存器,同时初始化了 FLASH、SDRAM、DM9008 等外围设备; ④ 将 FLASH的内容拷贝到 SDRAM 中; ⑤ 改变 FLASH 和SDRAM 的基地址,将 SDRAM 基地址改为 0; ⑥ 初始化堆栈指针; ⑦ 跳转到C程序 romStart( )函数中。 在这里,只需要修改 SYSCFG、EXTDBWTH、ROMCON0、ROMCON1、DRAMCON0 等寄存器来设置 FLASH、SDRAM、DM9008 的基地址和大小即可。这需要根据板上的配置来修改,修改的内容在 wrSbcArm7.h 文件中。 BSP 基本部分就已经修改完成,至于 bootInit.c 和 bootConfig.c 文件,我们一般不需要修改它,只是在调试过程中为了方便调试,可以将他们拷贝到 BSP 目录下,然后修改 makefile 文件,在makefile 文件中添加如下两句。 BOOTCONFIG = bootConfig.c BOOTINIT = bootInit.c (5)利用 tsfs(target server file system)下载 要利用 tsfs下载 VxWorks,首先需要配置以下内容: ① 在 config.h 文件中添加如下内容 /* Serial port configuration */ #define INCLUDE_SERIAL #undef NUM_TTY #define NUM_TTY N_SIO_CHANNELS #undef CONSOLE_TTY #define CONSOLE_TTY 0 #undef CONSOLE_BAUD_RATE #define CONSOLE_BAUD_RATE 38400 /*** WDB ***/ #ifdef SERIAL_DEBUG #define WDB_NO_BAUD_AUTO_CONFIG #undef WDB_COMM_TYPE #undef WDB_TTY_BAUD #undef WDB_TTY_CHANNEL #undef WDB_TTY_DEV_NAME #define WDB_COMM_TYPE WDB_COMM_SERIAL /* WDB in Serial mode */ #define WDB_TTY_BAUD 38400 /* Baud rate for WDB Connection */ #define WDB_TTY_CHANNEL 1 /* COM PORT #2 */ #define WDB_TTY_DEV_NAME "/tyCo/1" /* default TYCODRV_5_2 device name */ #endif /* SERIAL_DEBUG */ /* tsfs added by caiyang */ #define INCLUDE_TSFS_BOOT 并修改引导行为 #define DEFAULT_BOOT_LINE /par "tsfs(0,0)host:vxWorks f=8 h=169.254.72.67 e=169.254.72.68 u=caiyang pw=caiyang" 注:串口 1用来显示引导信息,相当于 PC 机中的显示器,串口 2 用来下载 VxWorks 和调试。同时串口 2 波特率不能太高,经测试 115200 好像不行。 ② 配置 target server 启动 Tornado 开发环境,选择 Tool->target server 菜单。在下拉菜单中选“target server file system”并选中 Enable File System,然后目录指向 Vxworks所在的地方。同时注意要把 Tornado Registry打开,这样配置完后点击 Launch 按钮即可连接成功,此后就可以通过串口 2 下载VxWorks 和调试。 一般情况下,我们首先调试好 BSP,然后在调试网卡。所以在调试网卡前,我们需要用串口来下载VxWorks 映像。 至此,我们的 BSP 就开发完成。
4 结论 在没有调试 BSP 的硬件工具如仿真器的时候,我们只能通过点灯或者串口输出来定位程序执行的正确性。这大大增加了调试难度和进程。对于 BSP开发,一般需要从一个模板来修改。BSP 开发的正确性直接影响到 VxWorks 系统运行的稳定性。
|