Samsung S3C2440平台上的Vxworks BSP移植
M_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
}
上面一小段代码是对ROM_BASE_ADRS 的内存映射,ROM_BASE_ADRS+0xf0000000是要映射的虚拟地址,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是实际初始化的地址状态。
若添加新的外设,该外设对应的内存空间必须在sysPhysMemDesc[]中配置。通过这样的配置就完成了内存映射和MMU的开启。
修改dm9kEnd.c
由于S3C2440使用的是DM9000网卡。要做好DM9000网卡的END驱动首先要初始化网卡的数据结构dm9kDevice,这个数据结构如下:
typedef struct dm9kDevice
{
END_OBJ endObj; /*继承类 */
int unit; /*设备单元号 */
UINT32 flags; /* 本地标志信号*/
int ivec; /* 中断向量 */
int ilevel; *中断级 */
……
} DM9K_DRV_CTRL
数据结构中的END_OBJ类型成员、网卡单元号、中断号和中断向量是网卡驱动中必须包含的成员元素。
驱动的部分接口函数,主要包括网卡加载函数dm9kEndLoad、网卡启动函数dm9kStart、停止网卡函数dm9kStop、网卡控制函数dm9kIoctl、网卡卸
BSP 移植 Vxworks 平台 S3C2440 Samsung 相关文章:
- 实现完全本地化和know-how移植(03-16)
- Nucleus操作系统内存池模块移植的研究与应用(01-20)
- 在μC/OS—II上实现动态电压调节技术(05-13)
- VxWorks操作系统的CompactPCI测试仿真系统(12-12)
- 基于VxWorks操作系统的CompactPCI仿真系统(12-12)
- 双高嵌入式工控机平台在工业电力系统中的应用(12-16)