Samsung S3C2440平台上的Vxworks BSP移植

研究基于s3c2440平台上的vxworks bsp移植具有重要的意义。本文就bsp的概念、bsp移植过程中重点修改的几个文件、串口和网口驱动以及bsp的调试和仿真做详细的介绍。
bsp概述
vxworks操作系统将所有硬件的功能函数分别放到一系列库中,这些库就被称为板级支持包bsp。bsp是连接vxworks操作系统与硬件平台的一个接口软件包,在引导系统、支持系统运行过程中扮演着重要的角色,首先,通过bsp可以生成引导操作系统的bootrom;其次,引导行工程的建立基础就是bsp;最后,bsp具有与用户交互的作用,可以提供一个基础的硬件调试环境。bsp还可以使vxworks运行于特定的硬件平台,如arm、ppc、x86等,它包含了一系列与硬件相关的函数,完成针对硬件的基本输入与输出操作,可以使上层程序员在不用熟悉硬件的情况下进行编程。例如,一般它完成以下操作:目标板硬件初始化、内存控制器初始化、堆栈初始化、外围设备初始化(i/o、interrupt……)、异常向量处理、cache操作、硬件设备的底层驱动、定时器驱动、串口驱动、end网络驱动、flash驱动、lcd驱动等。
bsp在嵌入式系统中扮演的角色,很类似于在pc系统中的bios和驱动程序的地位。图1中包括了vxworks操作系统的各种组件,指明了bsp在整个系统中所处的地位和作用。
vxworks在s3c2440上的bsp设计
s3c2440简介
移植目标机的硬件配置具体如下:处理器s3c2440,采用arm920t内核,内存大小64m;nand flash大小为128m;
nor flash大小为2m;3路urat;2路spi;iic总线接口;网卡:dm9000,10/100m的自适应。
图1 bsp在嵌入式系统中的位置框图
bsp的移植过程
要进行bsp的开发和设计,最好有一个可参考的模板,由于samsung s3c2440a的内核是arm920t,所以参考的模板选择tornado for arm 的integrator920t。bsp文件主要在vxworks编译环境tornado的目录target/config/all和target/config/integrator920t文件夹中。其中,all文件夹里的文件对于绝大多数bsp都是共用的,一般来说不用怎么修改,重点是修改integrator920文件夹下的几个文件,这主要是指makefile、config.h、rominit.s和syslib.c中相关部分的修改,另外添加了串口驱动和dm9000的网卡驱动。
修改makefile文件
makefile的两个主要功能就是提供文件之间的依赖关系和目标文件生成方法,定义编译和链接整个bsp的规则,在makefile文件中有一些参数已经在config.h文件中定义过了,但是必须保证两处的定义一致,否则会出现编译错误。下面介绍一些需要修改的参数:
cpu:描述目标板的处理器类型,设计中为armarch4;
tool:该参数用来选择编译工具,vxworks中可使用gnu和diab两种,设计中用gnu编译器来编译目标代码;
tgt_dir:默认设置为$(wind_base)/target;
target_dir:默认为bsp所在的目录,设计中为mini2440;
vendor:板卡生产商的名称,设计中为hitsat;
board:板卡的名称,设计中为omu;
rom_size:rom或flash的大小(十六进制);
ram_low_adrs:vxworks在ram中的起始地址,即入口地址;
ram_high_adrs:非驻留rom内核的启动程序加载地址。关于入口地址和高位地址的指定需参考硬件的ram组织。
该文件下其余的设置和定义都与模板中的一致。
修改config.h
config.h文件是bsp软件中比较重要的一个文件,vxworks内核组件的配置可以通过config.h文件来定义。config.h文件包含了所有头文件和cpu相关的特殊定义,config.h文件中的配置参数是在configall.h文件内容的基础上根据开发板的硬件资源设置的,其中包括定义引导行、修改存储空间的地址等。下面详细介绍config.h文件中修改的部分配置参数:
(1)定义引导行
#define default_boot_line dm(0,0) zwj-pc:d:\vxworks h=192.168.0.1 e=192.168.0.2 u=zwjhjj pw=zwjfile tn=mini2440
其中:dm(0,0)为boot device,即启动设备映像;
zwj-pc为host name,即主机名;
d:\vxworks为file name,即要下载的vxworks镜像文件路径;
h=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的开启。
修改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、网卡卸载函数dm9kunload、网卡发送函数dm9ksend、获取组播地址函数dm9kmcastget、启动轮询模式函数dm9kpollstart、关闭轮询模式函数dm9kpollstop、轮询模式发送函数dm9kpollsend、轮询模式接收函数dm9kpollrcv等,通过对这些接口函数编写功能,实现网卡驱动。
在编写驱动的过程中,还必须注意:由于目标板用一种100pin的dm9000芯片,这种芯片除了有cmd信号之外,还有6根地址片选信号sa4~sa9,根据sa4~sa9对应的cpu地址线和数据手册上引脚定义,可以计算出网卡的端口地址,如果sa4~sa9对应cpu地址的addr4~addr9,那么网卡端口基址就是0x18000300,这样可以计算出网卡的基地址。
图2 vxworks com1口的打印信息
bsp的调试与仿真
bsp修改完成以后,就要进行调试了,这里采用点亮led灯的调试方法,写一段点灯程序,用bsp生成bootrom和vxworks映像,使用h-jtag软件将bootrom烧写进目标板的norflash中,通过在不同位置反复的调用点灯程序和烧写bootrom到norflash中来调试bsp,并通过串口查看调试信息,如图2所示,是操作系统启动过程中,经过串口传输到主机上打印的调试消息,通过这些信息可以判断出系统启动过程中哪一部分出现了问题。
图3 vxworks shell界面
系统上电之后,bootrom首先运行,然后通过网线将vxworks映像文件下载进rom中,图3所示为vxworks的shell界面,显示设备列表有串口和网口,表明串口和网口驱动成功。

高通和荣耀员工加班研发新机型,首发搭载骁龙778G逆风翻盘
波导手机解锁大全
浏览器网页与T5L迪文屏串口深度扩展(Node-RED技术)
广东电网“智巡通”助力5000余架DJI大疆无人机实现自动飞行巡检
三星下一款6.7英寸的折叠屏手机曝光采用了内折叠方案可以折成正方形
Samsung S3C2440平台上的Vxworks BSP移植
服务器在日常使用中该如何保证它的安全
终“奖”自己!时尚轻薄笔记本U20A送新年礼
怎么判断热电偶还是热电阻?热电阻与热电偶的基本区别
独石电容怎么看数值
FP接连推出两家自己孵化的AI药物研发公司
模外薄膜装饰技术OMD工艺特点、流程和应用
苹果发布业界首款3纳米工艺M3系列计算机芯片
微信将推出自有输入法 搜狗:欢迎 虽然我们不看好
磁力线、磁通、磁感应强度和磁场强度的关系
我国三大运营商积极发布了千兆城市建设战略
英飞凌与诺基亚将合作开发高级LTE解决方案
中科曙光是怎样既做到布局智慧城市及商业模式
你知道静电对LED芯片损害有多少吗?
汉诺塔:闪烁在数学和心理学交汇之地奇妙问题