标题:
Samsung S3C2440平台上的Vxworks BSP移植(2)
[打印本页]
作者:
yuyang911220
时间:
2015-2-26 15:39
标题:
Samsung S3C2440平台上的Vxworks BSP移植(2)
(2)修改地址
对目标板存储区配置参数的修改时一定要注意:该文件中地址定义,如ROM-TEXT-ADRS、ROM-SIZE、RAM-LOW-ADR、SRAM-HIGH-SIZE等要与Makefile文件中的相关定义一致。根据实际CPU以及外扩存储器的大小来确定目标板内存。
#define LOCAL_MEM_LOCAL_ADRS 0x30000000 / *RAM的起始地址*/
#define LOCAL_MEM_SIZE 0x04000000 /*RAM的大小为64M*/
#define ROM_BASE_ADRS 0x00000000 /*Flash的基地址*/
#define ROM_SIZE0x00100000 /*存VxWorks的Flash大小*/
#define ROM_COPY_SIZE ROM_SIZE
#define ROM_SIZE_TOTAL 0x00200000 /*Flash总大小*/
#define RAM_LOW_ADRS 0x30001000 /*VxWorks 映像的入口地址*/
#define RAM_HIGH_ADRS 0x32e00000 /*Bootrom在RAM中的起始地址*/
修改S3C2440x.h
该文件是自己添加的一个文件,其中包括处理器相关的外设寄存器结构、地址、外设中断号分配、串口等的设置。下面主要介绍一下该文件中对串口的定义:
/* s3c2440串口的定义*/
#define UART_XTAL_FREQ s3c2440x_PCLK
/*串口时钟频率*/
#define N_s3c2440x_UART_CHANNELS 3 /*串口通道数 */
#define N_SIO_CHANNELS N_s3c2440x_UART_CHANNELS
#define N_UART_CHANNELS N_s3c2440x_UART_CHANNELS
#define UART_0_BASE_ADR 0x50000000 /*串口0的基地址*/
#define UART_1_BASE_ADR 0x50004000/*串口1的基地址*/
#define UART_2_BASE_ADR 0x50008000/*串口2的基地址*/
另外又添加了一个s3c2440xSio.h文件,在该文件中定义了串口数据结构:
typedef struct s3c2440x_CHAN
{ SIO_CHAN sio; /* 标准SIO_CHAN结构 */
STATUS (*getTxChar) (); /*安装发送回调函数 */
STATUS (*putRcvChar) (); /*安装接收回调函数 */
void * getTxArg;
void * putRcvArg;
…….
UINT32 channelMode; /*当前模式(中断或轮询)*/
int baudRate; /*当前波特率*/
}
数据结构初始化之后,还有几个重要的函数需要注意:sysHwInit():处理器I/O端口的初始化;sysSerialHwInit():初始化设备描述符;sysSerialHwInit2():通过intConnect()把串口的中断处理程序s3c2440xIntTx、s3c2440xIntRcv连接接到相应的中断向量上,并由int Enable()开启两个中断,调用s3c2440xDevInit2()对_UCON寄存器赋值完成对串口的最终配置由轮询模式转换为中断模式,并在中断服务程序中实现串口数据的接收和发送。通过对这些功能函数的添加完成串口驱动的设计。
修改romInit.s
部分代码修改如下:
/*添加了对串行口UART的初始化,配置了UART的一些控制寄存器,并设置了波特率,部分代码如下*/
InitUART:
#define UART_BRD (( 50750000 / (115200 * 16)) - 1)
mov r2,#UART_BRD /*设置串口的波特率 */
/*初始化堆栈指针*/
ldr sp, L$_STACK_ADDR
mov fp, #0
在建立堆栈之后,系统就具备了高级语言的执行条件,后续的代码就可以用C语言来实现了。
/*使程序跳转至C语言程序段代码如下*/
#if (ARM_THUMB)
ldr r12,L$_rStrtInRom
orr r12,r12, #1
bx r12
#else
ldr pc,L$_rStrtInRom /*跳转到romStart()中执行*/ #endif
CPU将执行权转移给romStart()之后。该函数就使内存清空,然后把整个引导映像复制到内存中,最后将CPU的控制权交给usrInit()。
修改sysLib.c
文件sysLib.c提供VxWorks和应用程序间的板级联系,这里重点介绍一下内存映射函数。
目标系统开启了MMU模块,BSP在sysLib.c文件里面就定义了一个sysPhysMemDesc[ ]表。部分代码如下所示:
PHYS_MEM_DESC sysPhysMemDesc [] =
{ (void*) (ROM_BASE_ADRS+0xf0000000), (void *) (ROM_BASE_ADRS),
ROUND_UP(ROM_SIZE_TOTAL*2,PAGE_SIZE),
VM_STATE_MASK_VALID|VM_STATE_MASK_WRITABLE|VM_STATE_MASK_CACHEABLE,
VM_STATE_VALID|VM_STATE_WRITABLE_NOT|VM_STATE_CACHEABLE_NOT
}
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0