微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > SamsungS3C2440平台上的VxworksBSP移植

SamsungS3C2440平台上的VxworksBSP移植

时间:10-28 来源:中电网 点击:

192.168.0.1为主机IP地址;

e=192.168.0.2为目标板IP地址;

u=zwjhjj为FTP登陆时的用户名;

pw=zwjfile为FTP登陆时的密码;

tn=mini2440为目标板名称。

(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

}

上面一小段代码是对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的开启。

修改

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top