如何編寫vxworks的驅動程序,這個問題要好好想想
1,drv
硬件手冊,--主要芯片寄存器;--工作流程;--中斷方式;--數據發送方式;--初始化順序。尤其要注意板卡有很多種工作模式。 板卡的主要功能;寄存器的分類(具體的數量);
NI,TNT4882提供一個單芯片Talker/Listener 接口到GPIB。電路上/寄存器上包含(1)Turbo488 ASIC(2)NAT4882 IEEE 488.2 ASIC。後者又包含NEC mPD7210 和 TI TMS9914A寄存器。爲了快速傳遞數據包括(1)FIFO緩衝器(2)HS488功能電路。
CPU接口特性/總線接口特性
• FIFO緩衝器,• Byte-to-word 壓縮解壓,• DMA接口(– Cycle steal– Burst– Time limited),• 32-bit 內部傳輸字節計數器,特殊的最後字節電路減少軟件過載,• Interrupts(– Interrupts can be individually enabled and cleared– Many interrupting conditions are available),• Programmable timer interrupts for general-purpose timing use,• Device-status indicator pins///• On-chip ISA interface glue circuitry,• Generic interfacing to other buses
三種工作結構/內在的硬件結構
(1)one-chip mode,(2)Turbo+7210 mode, (3)Turbo+9914 mode. 結構決定那一套寄存器及其位對主機接口起作用, 以及 FIFOs如何和GPIB接口.
數據發送方式
7210:寫數據到GPIB時, 主機接口寫數據到TNT4882的FIFO。一個傳輸狀態機傳輸數據,從FIFO到NAT4882電路,然後 NAT4882 電路通過GPIB發送數據。從GPIB讀數據時,NAT4882電路從GPIB讀字節,傳輸狀態機傳輸數據,從NAT4882到FIFO,然後主機接口從FIFO讀取數據。9914:和7210相像。one-chip mode:直接連接到GPIB端口,無需傳輸狀態機。
address map/interface register
one-chip mode/tubor+7210 mode,register;0~1F,共32個字節;16個Read;21個Write;8個R/W;有的寄存器讀寫屬性是分開的,有的只能寫(5-ACCWR,7-INTR,D-HSSEL,13-HIER,15-MISC),有的寄存器讀寫是一樣的屬性。(如何分辨,是否ISA模式)
generic Pin/ISA Pin
The information in this chapter supplements the information contained in the TNT4882 Single-Chip IEEE 488.2 Talker/Listener ASIC data sheet.
vxworks驅動程序
基本框架--字符設備驅動程序,模板;首先系統啓動代碼調用驅動程序安裝函數,該函數通過函數安裝驅動程序,然後啓動代碼將調用設備創建函數創建設備,該函數通過調用函數爲系統創建設備。經過上述操作後,用戶可以調用vxworks的標準io接口函數對設備進行操作,例如打開、關閉、讀,寫等,不過這些操作最終由驅動程序完成。
設備描述符結構
LOCAL int gpibDrvNum=0;
typedef struct
{
DEV_HRD devHdr;
BOOL isCreat;
BOOL isOpen;
UINT32 RegMEMBase;
UINT32 ioAddr;
...
SEL_WAKEUP_LIST selWakeupList;
BOOL ReadyToRead;
BOOL ReadyToWrite;
}
gpib_DEV;
設備驅動程序裝載函數
STATUS gpibDrv()
{
if(gpibDrvNum>0)
return(OK);
...
if((gpibDrvNum=iosDrvInstall(gpibOpen,NULL,gpibOpen,gpibClose,gpibRead,gpibWrite,gpibIoctl))==ERROR)
{
return(ERROR);
}
return(OK);
}
設備創建函數
STATUS gpibDevCreat(char * devName)
{
gpib_DEV *pgpibDev;
if(gpibDrvNum<1)
{
errno=S_ioLib_NO_DRIVER;
return(ERROR);
}
if((pgpibDev=(gpib_DEV *)malloc(sizeof(gpibDev)))==NULL)
return(ERROR);
bzero(pgpibDev,sizeof(gpib_Dev));
selWakeupListInit(&pgpib->selWakeupList);
...
if(iosDevAdd(&pgpibDev->devHdr,devName,gpibDrvNum)==ERROR)
{
free((char *)pgpibDev);
return(ERROR);
}
return(OK);
}
打開函數
讀函數
寫函數
io控制函數
設備關閉函數
int gpibClose(int gpibDevId)
{
gpib_Dev* pgpibDev=(gpib_DEV*)gpibDevId;
if(pgpibDev==(gpib_DEV *)NULL)
{
errnoSet(S_gpib_NOMEM);
return(ERROR);
}
.../*設備相關操作*/
.../*釋放相關資源*/
free(pgpibDev);/*釋放資源*/
}
卸載設備函數
STATUS gpibDelete(char *devName)
{
DEV_HDR *pDevHdr;
char * pNameTail;
pDevHdr=iosDevFind(devName,&pNameTail);/*查找設備*/
if(pDevHdr==NULL||*pNameTail!='/0')
return(ERROR);
.../*釋放設備所佔用資源,例如:信號量、喚醒等待該設備的任務等*/
iosDevDelete(pDevHdr);/*卸載設備*/
return(OK);
}
設備中斷管理函數
LOCAL ULONG gpibIntHandler(int gpibDevId)
{
gpib_DEV* pgpibDev=(gpib_DEV*)gpibDevId;
.../*讀取中斷狀態*/
pgpibDev->ReadyToRead=TRUE;/*如果可以接收*/
pgpibDev->ReadyToWrite=FALSE;
.../*清除相應中斷*/
}
板卡初始化流程
芯片初始化,順序如下:
1. 復位TNT4882的Turbo488電路.
2. 置TNT4882 爲Turbo+7210模式. TNT4882 必須是Turbo+7210模式在你進行第三步之前.
3. 配置TNT4882 爲one-chip mode.
4. Make sure that the local Power-On (pon) message is asserted.
5. Configure the TNT4882 for GPIB operation.
6. Clear the local pon message to begin GPIB operation.
2,dev
3,dbd
4,db
5,opi
6,從設計開始討論整個流程