Board logo

标题: 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