vxworks-powerppc;vme-gpib

如何編寫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,從設計開始討論整個流程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章