APP下载

基于龙芯1E1F航天应用平台与VxWorks系统的VxBus型驱动设计

2018-05-23,,,,

计算机测量与控制 2018年5期
关键词:龙芯串口中断

, ,,,

(上海微小卫星工程中心,上海 201210)

0 引言

龙芯1E和1F芯片是龙芯中科科技有限公司研制的具有自主知识产权的高性能32位抗辐射芯片,打破了国外对我国航天级高性能芯片的封锁。龙芯1E是一个高性能应用处理器SOC,以龙芯1号处理器为运算中心,提供了通用的处理器部件和对外接口,包含中断控制器、定时器、RS232串口控制器、浮点处理器、PCI和存储器接口(存储器接口支持SDRAM和FLASH ROM)等。龙芯1E芯片的外部时钟频率不低于66 MHz,功耗3 W。龙芯1F芯片是龙芯1E芯片的配套IO桥芯片,集成了航天领域常用的遥测遥控功能接口和外围接口,时钟33 MHz,功耗1 W,支持桥片模式和自主模式。龙芯1F芯片的桥片模式分为3种,即PCI总线设备模式、ISA总线设备模式和1553B总线简易终端设备模式。龙芯1E和龙芯1F芯片的抗辐射特性为抗总剂量不小于 1×103Gy(Si),单粒子锁定(SEL)阈值不小于 75MeV·cm2/mg,单粒子翻转(SEU)阈值不小于 37MeV·cm2/mg 或 IGSO 轨道翻转率小于 10-10次/位天[1-2]。

VxWorks系统由于其优秀的实时性和可靠性,在航天领域得到了广泛的应用。VxWorks 6.2之后引入了新的基于VxBus的设备驱动开发模式。与传统的设备驱动程序高度耦合在板级支持包(BSP)中相比,基于VxBus的设备驱动开发可以使BSP的开发与设备驱动的开发相对分离,使得这两部分的开发工作可以并行开展。提高了设备驱动开发效率,使得设备驱动程序开发更加规范化,结构化,进一步提高了软件开发的质量和可靠性,并且降低了开发和测试成本[3]。

由于龙芯芯片在商用领域推出较多,在航天领域推出较少,目前对龙芯应用技术的研究大多集中在商用领域,在航天领域的应用技术的研究尚处于初始阶段[4]。在航天领域龙芯的应用介绍较少,并且研究内容主要着眼于系统引导,软件更新[5]和传统的VxWorks BSP移植设计等方面[6-7],对如何针对VxWorks新推出的VxBus型驱动进行龙芯应用的设计介绍较少。

1 VxBus设备驱动分析

VxWorks系统下VxBus型驱动具有设备可配置以及驱动使用界面化操作的特点。如图1所示,进行VxBus驱动开发一般要提供驱动头文件,驱动源代码文件,驱动说明文件,Makefile编译文件,cdf驱动配置文件,dr驱动注册文件以及dc驱动注册文件。这几个文件存放的位置各不相同,驱动说明文件,驱动源代码文件和Makefile编译配置文件存放在“C: WindRivervxworks-6.8 arget3rdpartyvendorName driveName”路径下。其中“C: WindRiver”为VxWorks开发环境的安装路径,vendorName是自定义的驱动供应商的名称,driveName是自定义的驱动的名称。一个驱动供应商可以对应多个驱动,多个驱动都以驱动文件夹的方式存放在供应商文件夹下。cdf配置文件存放在“C:WindRivervxworks-6.8 argetconfigcomps vxWorks”路径下,这个目录下是专门用来存放驱动配置文件。dc和dr配置文件存放在C:WindRivervxworks-6.8 argetconfigcompssrchwif路径下,这个目录下是专门用来存放VxBus型驱动的注册文件。

VxWorks系统初始化时,首先在sysHwInit()函数中调用hardWareInterFaceInit()函数,该函数完成VxBus型驱动的注册,并调用各个VxBus型驱动的xxxInit()函数,执行各个驱动的第一次初始化。在第一次初始化过程中,VxWorks系统为每个VxBus型驱动设备分配了内存空间,并且连接了供应用层调用的驱动方法,从BSP的硬件设备定义文件hwconf.c中获取每个硬件设备的驱动参数。然后在sysHwInit2()函数中调用vxbDevInit()函数,在vxbDevInit ()函数中调用各个VxBus型驱动的xxxInit2()函数,执行各个驱动的第二次初始化,进行了VxBus型驱动的中断服务函数的连接和使能。接着建立一个任务vxbDevConnect,该任务执行了每个VxBus型驱动的xxxConnect()函数,在该函数中将执行一些额外的比较费时,但是不影响整个系统初始化的初始化操作[8-9]。整个VxBus驱动的初始化流程如下图2所示。

图1 VxBus驱动组成图

图2 VxBus驱动初始化流程图

2 VxBus设备驱动程序设计

对于VxWorks系统的基本运行,一般需要提供3种必需的驱动:时钟驱动,串口驱动和中断控制驱动。时钟驱动用来驱动VxWorks系统运行,如任务调度,定时控制等,串口驱动一般用作调试时输出日志信息,输入控制命令等,中断控制驱动用作在系统发生中断时进行中断响应。

1)串口驱动设计。

龙芯1E芯片上提供了2个RS232串口,串口控制器与NS16550串口控制器在寄存器接口上兼容,并且VxWorks开发环境中已经提供了基于VxBus型NS16550串口控制驱动的参考源代码,源代码文件为vxbNs16550Sio.c。源代码文件不需要修改,只要在BSP的硬件配置文件hwconf.c中配置各个串口的寄存器的起始地址,波特率,时钟等即可。关键代码如下。

首先定义两个串口设备的相关驱动参数:

define LSN_UART_DEFAULT_BAUD 115200

struct hcfResource ns16550Dev0Resources[] = {

{ "regBase", HCF_RES_INT, {(void *)LS1E_UART0_BASE} },

{ "baudRate", HCF_RES_INT, { (void *)LSN_UART_DEFAULT_BAUD }},

{ "clkFreq", HCF_RES_INT, {(void *)BAUD_CLK_FREQ} },

{ "regInterval", HCF_RES_INT, {(void *)UART_DELTA} },

};

define ns16550Dev0Num NELEMENTS(ns16550Dev0Re-sources)

struct hcfResource ns16550Dev1Resources[] = {

{ "regBase", HCF_RES_INT, {(void *)LS1E_UART1_BASE} },

{ "baudRate", HCF_RES_INT, { (void *)LSN_UART_DEFAULT_BAUD }},

{ "clkFreq", HCF_RES_INT, {(void *)BAUD_CLK_FREQ} },

{ "regInterval", HCF_RES_INT, {(void *)UART_DELTA} },

};

define ns16550Dev1Num NELEMENTS(ns16550Dev1Re-sources)

然后在设备列表中定义2个串口设备:

{"ns16550", 0, VXB_BUSID_PLB, 0, ns16550Dev0Num, ns16550Dev0Resources },

{"ns16550", 1, VXB_BUSID_PLB, 0, ns16550Dev1Num, ns16550Dev1Resources },

2)时钟驱动设计。

龙芯1E1F开发板上使用的时钟频率为33 MHz,时钟驱动可以使用VxWorks开发环境中提供的MIPS R4K时钟驱动,源文件为vxbMipsR4KTimer.c。需要在BSP的硬件配置文件hwconf.c中定义最小时钟,最大时钟,cpu频率等时钟驱动参数。关键代码如下。

首先定义时钟驱动的相关驱动参数:

struct hcfResource r4KTimerDevResources[] =

{

{"regBase", HCF_RES_INT, {(void *)0} },

{"minClkRate", HCF_RES_INT, {(void *)SYS_CLK_RATE_MIN} },

{"maxClkRate", HCF_RES_INT, {(void *)SYS_CLK_RATE_MAX} },

{"cpuClkRate", HCF_RES_INT, {(void *) 33000000} }

};

define r4TimerDevNum NELEMENTS(r4KTimerDevResources)

然后在设备列表中定义时钟设备:

{"r4KTimerDev",0,VXB_BUSID_PLB,0,r4TimerDevNum,r4KTimerDevResources},

3)中断控制驱动设计。

根据龙芯1E1F平台的中断控制器的特点,中断控制驱动可以分层设计[10],将中断驱动分为3个层次,如图3所示。第1层为MIPS中断控制,共8个中断类型,第2层为龙芯1E中断控制,共32个中断类型,第3层为龙芯1F中断控制,共32个中断类型。其中第2层龙芯1E的中断是作为第1层MIPS中断的第2种中断类型进行连接,第3层龙芯1F中断是作为第2层龙芯1E的第17种中断类型进行连接。

图3中仅列出了本文涉及的串口中断,时钟中断,龙芯1E中断,龙芯1F中断,SM1553B中断,其他中断类型可以参考龙芯芯片数据手册[11]。

图3 龙芯1E1F中断分层图

a)对MIPS中断控制的驱动可以使用VxWorks提供的mipsIntCtlr驱动,源文件为vxbMipsIntCtlr.c。在BSP的hwconf.c文件中配置MIPS驱动中各个引脚中断所属的中断服务设备。关键代码如下。

首先定义MIPS中断控制设备的相关驱动参数:

const struct intrCtlrInputs mipsIntCtlr0Inputs[] = {

/* pin, driver, unit, index */

/* IPI interrupts from IPI controller */

{0, "legacy", 0, 0},

{1, "legacy", 0, 0},

{2, "LS1EIntCtlr", 0, 0},

{7, "r4KTimerDev", 0, 0},

};

const struct hcfResource cpu0Resources[] = {

{ "regBase", HCF_RES_INT, {(void *)TRUE} },

{ "input", HCF_RES_ADDR, {(void *)&mipsIntCtlr0Inputs[0]} },

{ "inputTableSize", HCF_RES_INT, {(void *)NELEMENTS(mipsIntCtlr0Inputs)}}

};

define cpu0Num NELEMENTS(cpu0Resources)

然后在设备列表中定义MIPS中断控制器设备:

{ "mipsIntCtlr", 0, VXB_BUSID_PLB, 0, cpu0Num, cpu0Resources },

b)对龙芯1E中断控制的驱动需要编写新的VxBus类型的驱动。中断程序设计整体结构上参考MIPS中断控制程序。对于中断服务程序需要进行更改,在中断服务程序中,需要首先读取龙芯1E的中断状态寄存器,然后清除龙芯1E的中断状态,防止重复产生中断,接着再根据获取的龙芯1E的中断状态依次调用所有发生中断的子服务程序。中断服务程序关键代码如下:

/*获取中断状态*/

vxbMipsLsnIntLevelGet (pInst, &ints);

/*清除中断*/

MIPS_SW32(LS1E_INT_BASE+ LS1E_INT_ CLR, ints);

/*调用子服务程序*/

if (ints != (UINT32)0)

{

for (i = 0;i < LS1E_INT_INPUTS && ints != 0;i++,ints >>= 1)

{

if ((ints & 0x01) != 0)

{

VXB_INTCTLR_ISR_CALL(&pDrvCtrl->isrHandle, I +pInst->unitNumber * 32);

}

}

}

在BSP的hwconf.c文件中龙芯1E中断控制器驱动的配置为:

定义龙芯1E中断控制器的驱动参数:

const struct intrCtlrInputs ls1EIntCtlrInputs0[] = {

/* pin, driver, unit, index */

/* interrupts inputs into cpu */

{11, "ns16550", 0, 0 },

{12, "ns16550", 1, 0 },

{17, "LS1FIntCtlr", 0, 0 },

};

const struct hcfResource ls1EIntCtlrResources0[] = {

{ "regBase", HCF_RES_INT, {(void *)TRUE} },

{ "input", HCF_RES_ADDR, {(void *)&ls1EIntCtlrInputs0[0]} },

{ "inputTableSize", HCF_RES_INT, {(void *)NELEMENTS(ls1EIntCtlrInputs0)}},

};

define ls1EIntCtlrNum0 NELEMENTS(ls1EIntCtlrResources0)

在设备列表中定义龙芯1E中断控制器设备:

{"LS1EIntCtlr",0,VXB_BUSID_PLB,0, ls1EIntCtlrNum0, ls1EIntCtlrResources0 },

c)对龙芯1F中断控制器的驱动需要编写新的VxBus类型的驱动。中断程序整体结构上参考龙芯1E中断控制的程序。同样对于中断服务程序需要进行更改。在中断服务程序中,需要首先读取龙芯1F的中断状态寄存器,接着再根据获取的龙芯1F的中断状态调用所有发生中断的子服务程序。与龙芯1E中断服务程序不同,在龙芯1F的中断服务程序中不需要进行中断清除,某个引脚的中断状态的清除在被调用的中断子服务程序中单独进行。中断服务程序关键代码如下:

/*获取中断状态*/

vxbMipsLsn_1fIntLevelGet (pInst, &ints);

/*调用子服务程序*/

if (ints != (UINT32)0)

{

for (i = 0;i < (LS1F_INT_INPUTS) && ints != 0;i++,ints >>= 1)

{

if ((ints & 0x01) != 0)

{

VXB_INTCTLR_ISR_CALL(&pDrvCtrl->isrHandle,i);

}

}

}

在BSP的hwconf.c文件中龙芯1F中断控制器驱动的配置为:

定义龙芯1F中断控制器的驱动参数:

const struct intrCtlrInputs ls1FIntCtlrInputs0[] =

{

/* pin, driver, unit, index */

{31,"LS1F_sm1553b", 0, 0},

};

const struct hcfResource ls1FIntCtlrResources0[] = {

{ "regBase", HCF_RES_INT, {(void *)TRUE} },

{ "input", HCF_RES_ADDR, {(void *)& ls1FIntCtlrInputs0[0]} },

{ "inputTableSize", HCF_RES_INT, {(void *)NELEMENTS(ls1FIntCtlrInputs0)}},

};

define ls1FIntCtlrNum0 NELEMENTS(ls1FIntCtlrResources0)

在设备列表中定义龙芯1F中断控制器设备:

{"LS1FIntCtlr",0,VXB_BUSID_PLB,0,ls1FIntCtlrNum0, ls1FIntCtlrResources0},

4)龙芯1F芯片的智能1553B功能驱动设计。

首先在“C:WindRivervxworks-6.8 arget 3rdpartyvendorName”路径下建立一个新的文件夹用来存放驱动文件,文件夹名称为LS1FSM1553B,然后在该文件夹下分别建立vxbLS1F_sm1553b.c,40vxbLS1F_sm1553b.cdf,vxbLS1F_sm1553b.dc,vxbLS1F_sm1553b.dr,Makefile,README等几个文件。其中vxbLS1F_sm1553b.c文件中包含了驱动的实现代码,是驱动的主要文件。40vxbLS1F_sm1553b.cdf包含了用于vxWorks工程进行图形化配置1553B驱动的描述信息。vxbLS1F_sm1553b.dc,vxbLS1F_sm1553b.dr文件包含1553B驱动的注册信息。Makefile文件用于将1553B驱动编译到目标函数库文件中,README文件包含了介绍驱动的功能,使用方法等信息。

在vxbLS1F_sm1553b.c文件中除了包含vxBus型驱动所必需的第一阶段初始化函数xxxinit(),第二阶段初始化函数xxxinit2(),中断连接与使能函数xxxConnect(),中断服务函数xxxISR()等函数外,还对外提供了一系列的方法供上层应用调用。提供的方法有BC功能初始化方法,BC启动方法,用户自定义的中断服务等。这里为了简便起见,在BC启动方法里面也完成了BC消息块的设置和BC消息数据的设置。实际应用中需要将BC消息块的设置和BC数据的设置分别设计为可供上层应用调用的驱动方法,以增强驱动的灵活性和适应能力。

源代码文件和配置文件编辑完成后在VxWorks shell中使用编译命令make CPU=MIPSI32R2 TOOL=gnule,将最新的智能1553B驱动增加到库文件中。其中MIPSI32R2表示将驱动编译成适合架构为MIPS的32位R2类型CPU,gnule表示驱动使用gnu编译器编译,并且编译成小端模式。

接着将40vxbLS1F_sm1553b.cdf拷贝到“C:WindRivervxworks-6.8 argetconfigcompsvxWorks”路径下。然后将vxbLS1F_ sm1553b.dc,vxbLS1F_sm1553b.dr文件拷贝到“C:WindRivervxworks-6.8 argetconfigcompssrchwif”路径下。完成驱动在Wind River Workbench开发环境中的配置。更新驱动文件后需要重新启动Workbench开发环境,并且重新建立工程才能使用新的驱动程序。

3 实验验证

1)实验环境。

目标机:龙芯1E1F开发板。

宿主机:研华工控机(i7处理器,16G内存,2TB硬盘),Alta PCI 1553B 双通道 仿真卡(用于模拟RT以及总线数据监控),windows 7 x64,vxWorks6.8开发环境Workbench 3.2,On Chip Debugger ICE2(用于下载程序),AltaView Bus Analyzer(Alta PCI 1553B 双通道 仿真卡的应用软件)。

设备连接图如图4。

图4 龙芯1E1F实验连接图

2)实验过程。

首先在workbench开发环境中创建一个VxWorks Image型工程,选择相应的支持龙芯1E1F的BSP,然后在工程的内核模块配置界面上将上文提到的ns16550串口,mips r4k 时钟,mips中断控制器,龙芯1E中断控制器,龙芯1F中断控制器,智能1553B等驱动模块都选择上,然后保存工程。接着在usrAppInit.c文件中usrAppInit()函数内添加应用层代码。通过调用智能1553B驱动提供的一些方法,进行1553B的BC功能和相关驱动的功能测试。关键代码如下:

a)调用BC init方法执行BC的初始化。

methodLS1FBCInit = vxbDevMethodGet(devID,DEVMETHOD_CALL(ls1fbcInit));

if(NULL != methodLS1FBCInit)

{

methodLS1FBCInit(devID,0);

}

b)添加用户自定义的中断服务函数。

methodLS1FBCSetISR = vxbDevMethodGet(devID,DEVMETHOD_CALL(ls1fbcSetISR));

if(NULL != methodLS1FBCSetISR)

{

methodLS1FBCSetISR(devID,sm1553bISR);

}

其中sm1553bISR内部只进行一个打印输出:

logMsg("1F 1553b new ISR, ",0,0,0,0,0,0);

c)启动一个任务进行每秒启动一次BC消息帧。

taskSpawn("tBC-Test",100, 0,5000, (FUNCPTR) task_1F_BC, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

任务task_1F_BC中首先获取SM1553b驱动的ls1fbcStart方法,然后设计了一个while循环模块,在循环中调用ls1fbcStart方法,然后通过taskDelay等待1秒钟,再进行下一个循环。主要代码如下:

VXB_DEVICE_ID devID = NULL;

STATUS (*methodLS1FBCStart)(VXB_DEVICE_ID devID,void * pArg);

devID = vxbInstByNameFind("LS1F_sm1553b",0);

if(NULL != devID)

{

methodLS1FBCStart = vxbDevMethodGet ( devID,DEVMETHOD_CALL ( ls1fbcStart));

}

while(NULL != methodLS1FBCStart)

{

methodLS1FBCStart(devID,0);

/*等待1秒,1秒 60个tick,*/

taskDelay(60);

}

3)实验结果。

系统启动后在串口终端运行vxBusShow命令显示当前系统的驱动和设备。从串口输出可知当前系统注册的驱动有mipsIntCtlr中断控制器驱动,LS1F_sm1553b驱动,LS1FIntCtlr中断控制器驱动,LS1EIntCtlr中断控制器驱动,ns16550驱动,r4KTimerDev时钟驱动等,已经与驱动匹配的设备有LS1F_sm1553b unit0,mipsIntCtlr0,LS1FIntCtlr unit0,LS1EIntCtlr unit0,ns16550 unit0,ns16550 unit1,r4KTimerDev unit0等。

BC运行后,观察串口输出内容(见图5),每秒执行了一次BC帧,并且响应中断2次,进入了用户自定义的中断服务函数2次。表明中断响应过程正常。

图5 中断响应串口输出图

通过Alta 1553B仿真卡提供的RT和BM功能可以监控到1553B总线上进行了从BC到RT4的消息传输,分别为子地址1,子地址2,子地址3,数据内容与数据频率与前面的BC消息块设置一致。

4 结论

本文基于龙芯1E1F平台和VxWorks系统,对VxBus型驱动设计技术进行了详细介绍,对串口、时钟,中断控制器和智能1553B的驱动进行了设计,并通过实验验证,证明了VxBus型驱动设计技术结构更加清晰,能够更好的进行底层技术封装,对上层应用软件开发提供了更加友好的接口。对未来航天领域基于龙芯和Vxworks系统的开发设计具有较高的参考价值。

参考文献:

[1]龙芯中科技术有限公司,龙芯1E处理器数据手册[Z]. 北京:龙芯中科技术有限公司,2016.

[2]龙芯中科技术有限公司,龙芯1F处理器用户手册[Z] . 北京:龙芯中科技术有限公司,2015.

[3]向昱丞,周加谊,浅谈VxBus的设备驱动开发[J].机电产品开发与创新,2016,29(2):57-58.

[4]王 雷,樊晓桠,王党辉,龙芯3A平台Vxworks移植的研究和实现[J].微电子学与计算机,2012,29(2):86-90.

[5]史毅龙, 薛长斌,基于“龙芯”的VxWorks系统函数在轨更新研究[J].电子设计工程,2015,23(21):106-109.

[6]杨 晔,安军社,VxWorks在龙芯处理器上移植与实现[J].微计算机信息,2010,26(12-2):31-33.

[7]陈学兵,沈毅南,张振华,VxWorks5.5在龙芯2号处理器的移植和性能分析[J].计算机测量与控制,2012,20(9):2542-2545.

[8]Wind River.Device Driver Developer’s Guide Volume 1:Fundamentals of Writing Device Drivers 6.8,Wind River[Z].2009.

[9]Wind River.Device Driver Developer’s Guide Volume 2: Writing Class-Specific Device Drivers 6.8,Wind River[Z].2009.

[10]徐 骞,VxWorks下龙芯3A中断控制技术的研究[J].现代电子技术,2017,40(14):36-39.

[11]龙芯中科技术有限公司,龙芯1E 1F开发手册[Z] . 北京:龙芯中科技术有限公司, 2017.

猜你喜欢

龙芯串口中断
基于国产化龙芯的动环数据采集系统
基于API函数库实现串口数据通信的分析与设计
基于EM9000工控板高性能双串口通信模型设计与实现
“单片机中断概述”微课教学设计
一种考虑GPS信号中断的导航滤波算法
Linux中断线程化分析及中断延时测试
跟踪导练(二)(5)
MCS—51单片机中的多串口通讯技术的应用
“龙芯之父”胡伟武
“龙芯1号”:电脑中国“芯”