解析串口驅(qū)動(Serial Drivers)編寫實例
出處:互聯(lián)網(wǎng) 發(fā)布于:2011-09-05 08:16:40
在當(dāng)前數(shù)字信息技術(shù)和網(wǎng)絡(luò)技術(shù)高速發(fā)展的后PC(Post-PC)時代,嵌入式系統(tǒng)已經(jīng)廣泛地滲透到科學(xué)研究、工程設(shè)計、軍事技術(shù)、各類產(chǎn)業(yè)和商業(yè)文化藝術(shù)以及人們的日常生活等方方面面中。所謂嵌入式系統(tǒng),是以應(yīng)用為中心,以計算機技術(shù)為基礎(chǔ),并且軟硬件可裁剪,適用于應(yīng)用系統(tǒng)對功能、可靠性、成本、體積、功耗有嚴格要求的專用計算機系統(tǒng)。它一般由嵌入式微處理器、外圍硬件設(shè)備、嵌入式操作系統(tǒng)以及用戶的應(yīng)用程序等四個部分組成,用于實現(xiàn)對其他設(shè)備的控制、監(jiān)視或管理等功能。Windows CE.net是微軟公司推出的32位嵌入式操作系統(tǒng),具備多任務(wù)、實時性、模塊化及可伸縮性、強大的通信能力以及圖形界面友好等優(yōu)點。將操作系統(tǒng)和相應(yīng)硬件設(shè)備連接起來,需要通過編寫設(shè)備驅(qū)動程序。下面介紹一個串口驅(qū)動編寫實例。
[代碼步驟:Code Steps]
.初始化
.定義支持的串口通道數(shù)
.初始化驅(qū)動的設(shè)備描述
.寫你的設(shè)備初始化代碼
.寫入口程序(entry point routines)
.寫ISRs(中斷服務(wù)程序)來管理設(shè)備
.使用模板 wind/target/src/drv/ssio/templateSio.c
注意:串口驅(qū)動在VxWorks系統(tǒng)開始的代碼里初始化
[設(shè)備描述:The Device Descriptor]
.XX_DRV結(jié)構(gòu)每個通道有一個XX_CHAN
.每個XX_CHAN指向SIO_DRV_FUNCS
.SIO_DRV_FUNCS引誘驅(qū)動的入口(entry point)
.XX_DRV是xxDrv使用的中心數(shù)據(jù)結(jié)構(gòu)
.xx_CHAN包括:
.xxDrv需要的通道特定信息
.指向驅(qū)動SIO_DRV_FUNCS結(jié)構(gòu)的指針
.例:
/* device and channel structures */
typedef struct
{
/* must be first */
SIO_CHAN sio; /* standard SIO_CHAN element */
/* callbacks */
STATUS (*getTxChar) ();
STATUS (*putRcvChar) ();
void * getTxArg;
void * putRcvArg;
/* register addresses */
volatile char * cr; /* channel control register */
volatile char * dr; /* channel data register */
volatile char * sr; /* channel status register */
volatile char * ms; /* channel modem status register */
volatile char * mc; /* channel modem control register */
volatile short * br; /* channel baud coNStant register */
/* misc */
int mode; /* current mode (interrupt or poll) */
int baudFreq; /* input clock frequency */
int options; /* Hardware options */
} TEMPLATE_CHAN;
typedef struct
{
TEMPLATE_CHAN portA; /* DUSRAT has two channels */
TEMPLATE_CHAN portB;
volatile char * masterCr; /* master control register */
} TEMPLATE_DUSART;
[SIO_CHAN結(jié)構(gòu)]
.對一般字符驅(qū)動,一個指向DEV_FDR的指針被用來在驅(qū)動和I/O system 之間通訊
.對一個串口驅(qū)動,一個指向SIO_CHAN的指針用來在驅(qū)動和高層協(xié)議之間通訊
在 wind/target/h/sioLib.h;里,SIO_CHAN如下定義:
typedef struct sio_chan/* a serial channel */
{
SIO_DRV_FUNCS * pDrvFuncs;
/* device data */
} SIO_CHAN;
.由于高層協(xié)議不知道驅(qū)動的XX_CHAN結(jié)構(gòu),SIO_CHAN被用來允許一個精心定義的數(shù)據(jù)類型在協(xié)議間交換數(shù)據(jù)
.ttyDrv通過SIO_DRV_FUNCS里的入口向xxDrv發(fā)送信息,而xxDrv通過回調(diào)向ttyDrv發(fā)送信息
[入口:Entry Points]
xxCallBackInstall() 安裝到高層協(xié)議的入口(I/O system,target agent(目標(biāo)代理),等等)
xxPollOutPut() 輪巡模式輸出
xxPollInput() 輪巡模式輸入
xxIoctl() 支持設(shè)備特定的ioctl命令
xxTxStaartup() 初始化一個傳輸循環(huán)(transmit cycle)
[驅(qū)動回調(diào)安裝程序]
int xxCallbackInstall(pSsioChan,callbackType,callback,callbbackArg)
pSioChan 指向SIO_CHAN的指針
callbackType SIO_CALLBACK_GET_TX_CHAR 或 SIO_CALLBACK_PUT_RCV_CHAR
callback 指向回調(diào)程序的指針
callbackArg 回調(diào)的參數(shù)
.初始化SIO_CHAN結(jié)構(gòu)里的特定成員
.返回OK 或 ENOSYS(當(dāng)callbackType不是上兩種中的一種)
/********************************************************************************
templateCallbackInstall - install ISR callbacks to get/put chars
This driver allows interrupt callbacks for transmitting characters
and receiving characters. In general, drivers may support other
types of callbacks too.
*
* RETURNS: OK on success, or ENOSYS for an unsupported callback type.*/
LOCAL int templateCallbackInstall
?。?/DIV>
SIO_CHAN * pSioChan, /* channel */
int callbackType, /* type of callback */
STATUS (*callback)(), /* callback */
void * callbackArg /* parameter to callback */
?。?/DIV>
{
TEMPLATE_CHAN * pChan = (TEMPLATE_CHAN *)pSioChan;
switch (callbackType)
{
case SIO_CALLBACK_GET_TX_CHAR:
pChan->getTxChar = callback;
pChan->getTxArg = callbackArg;
return (OK);
case SIO_CALLBACK_PUT_RCV_CHAR:
pChan->putRcvChar = callback;
pChan->putRcvArg = callbackArg;
return (OK);
default:
return (ENOSYS);
}
}
[驅(qū)動初始化]
.參數(shù)是沒一個指向XX_DRV的指針
.初始化XX_CHAN
.帶你的程序的SIO_DRV_FUNCS
.傀儡回調(diào)
.所有設(shè)備特定
.重啟芯片
/* local variables */
LOCAL SIO_DRV_FUNCS templateSioDrvFuncs =
{
templateIoctl,
templateTxStartup,
templateCallbackInstall,
templatePollInput,
templatePollOutput
};
void templateDevInit
?。?/DIV>
TEMPLATE_DUSART * pDusart
?。?/DIV>
{
/* initialize each channel"s driver function pointers */
pDusart->portA.sio.pDrvFuncs = &templateSioDrvFuncs;
pDusart->portB.sio.pDrvFuncs = &templateSioDrvFuncs;
/* install dummy driver callbacks */
pDusart->portA.getTxChar = dummyCallback;
pDusart->portA.putRcvChar = dummyCallback;
pDusart->portB.getTxChar = dummyCallback;
pDusart->portB.putRcvChar = dummyCallback;
/* reset the chip */
TEMPLATE_REG_WRITE(pDusart, masterCr,
TEMPLATE_RESET_CHIP);
/* setting polled mode is one way to make the device quiet */
templateIoctl ((SIO_CHAN *)&pDusart->portA, SIO_MODE_SET,
(void *)SIO_MODE_POLL);
templateIoctl ((SIO_CHAN *)&pDusart->portB, SIO_MODE_SET,
(void *)SIO_MODE_POLL);
}
/*******************************************************************************
*
* dummyCallback - dummy callback routine
*
* RETURNS: ERROR.
*/
LOCAL STATUS dummyCallback (void)
{
return (ERROR);
}
下一篇:WiGig介紹
版權(quán)與免責(zé)聲明
凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責(zé)任。
本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔(dān)此類作品侵權(quán)行為的直接責(zé)任及連帶責(zé)任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責(zé)任。
如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。
相關(guān)技術(shù)資料
- ARM技術(shù)架構(gòu)與應(yīng)用開發(fā)實踐指南2026/1/6 10:40:19
- 嵌入式實時操作系統(tǒng)(RTOS)選型與移植技術(shù)指南2025/12/31 10:42:31
- 工業(yè)嵌入式系統(tǒng):通信接口技術(shù)選型與抗干擾設(shè)計實踐2025/12/15 14:36:53
- 深入解析嵌入式 OPENAMP 框架:開啟異核通信新時代2025/7/22 16:27:29
- 一文快速了解OPENWRT基礎(chǔ)知識2025/7/14 16:59:04
技術(shù)分類
熱門技術(shù)資料









