新闻中心

EEPW首页>嵌入式系统>设计应用> vxworks嵌入式操作系统下串行设备驱动程序开发思路

vxworks嵌入式操作系统下串行设备驱动程序开发思路

作者: 时间:2012-10-09 来源:网络 收藏

i8250Chan[i].outByte = sysOutByte; /*挂接输出函数,此函数向指定的I/O地址写入1bye*/

i8250Chan[i].inByte = sysInByte; /*挂接输出函数,此函数从指定的I/O地址读出1byte*/

i8250HrdInit(i8250Chan[i]);/*调用i8250HrdInit()进一步完成初始化*/

}

}

l i8250HrdInit()

本函数完成的主要工作是挂接相应的入口函数,具体说明如下:

void i8250HrdInit

(

I8250_CHAN * pChan /* 指向相应设备的指针*/

)

{

if (i8250SioDrvFuncs.ioctl == NULL)

{

i8250SioDrvFuncs.ioctl = (int (*)())i8250Ioctl;/*挂接用于处理控制I8250相关输入

输出命令的函数*/

i8250SioDrvFuncs.txStartup = (int (*)())i8250Startup;/*如果设备工作于中断模式下,

启用此函数用于打开中断,使设备开始工作*/

i8250SioDrvFuncs.callbackInstall = i8250CallbackInstall;/*安装上层提供的回调函数,

本例中是安装的tyIRd()、tyITx()*/

i8250SioDrvFuncs.pollInput = (int (*)())i8250PRxChar;/*挂接输入轮询函数*/

i8250SioDrvFuncs.pollOutput = (int (*)(SIO_CHAN *,char))i8250PTxChar;/*挂接输出轮询函数*/

}

pChan->pDrvFuncs = i8250SioDrvFuncs;/*初始化CHAN结构,挂接接口函数列表*/

i8250InitChannel(pChan); /* reset the channel */

}

由上面挂接的函数可以看出,i8250驱动主要实现了三个功能:read、write、ioctl,而并没有实现所有和七项功能。同时,值的注意的是,对同一种设备的驱动只需挂接一次。

同时ttyDrv通过SIO_DRV_FUNCS使用xxDrv(i8250Drv)提供的服务,而xxDrv通过回调函数(本例中是由i8250CallbackInstall()安装的tyIRd()、tyITx())完成ttyDrv提出的请求。原理如下图示:

i8250InitChannel()

本函数的主要作用是初始化特定的CHAN所描述的信道。具体分析如下。

statIC void i8250InitChannel

(

I8250_CHAN * pChan /* pointer to device */

)

{

int oldLevel;

ldLevel = intLock (); /*关中断进入临界区*

(void) i8250BaudSet(pChan, I8250_DEFAULT_BAUD);/*设置信道的波特率*/

…………………………………

intUnlock (oldLevel); /*开中断响应,出临界区*/

}

⑵ 挂接中断服务程序

对i8250的硬件初始化完成后,接着挂接相关的中断服务程序。主要有sysSerialHwinit2()函数完成。需要注意的是,挂接中断应放在系统初始化的最后,主要是因为中断挂接函数iNTCONnect()需要调用malloc()函数,如果在系统的内存分配还未初始化前调用,则会出错。下面请看源代码:

void sysSerialHwInit2 (void)

{

int i;

for (i=0;i

if (i8250Chan[i].int_vec)

{

(void) intConnect (INUM_TO_IVEC (i8250Chan[i].int_vec), i8250Int, (int)i8250Chan[i] );

linux操作系统文章专题:linux操作系统详解(linux不再难懂)


评论


相关推荐

技术专区

关闭