新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > PCI總線語音卡及WDM驅(qū)動(dòng)程序設(shè)計(jì)

PCI總線語音卡及WDM驅(qū)動(dòng)程序設(shè)計(jì)

作者: 時(shí)間:2012-03-13 來源:網(wǎng)絡(luò) 收藏

該驅(qū)動(dòng)程序主要用DriverStudio 2.5加VC++ 6.0設(shè)計(jì)。DriverStudio對(duì)DDK進(jìn)行封裝,利用向?qū)Э缮沈?qū)動(dòng)程序框架。在此基礎(chǔ)上再添加針對(duì)處理的函數(shù)及語句即可完成設(shè)計(jì),調(diào)試工具為SOFTICE。程序結(jié)構(gòu)框圖如圖4所示。

PCI2040.lib和PCI2040.dll處于Ring3層,它封裝了和底層驅(qū)動(dòng)打交道的函數(shù),對(duì)外只顯現(xiàn)出如Open_Device()、Close_Device(HANDLE hDevice)、Record(HANDLE hDevice,LPSTR FileName)、Play(HANDLE hDevice,LPSTR FileName)等API函數(shù)。這樣可以讓多種編程語言以DLL的形式來調(diào)用,給使用者提供了方便。

核心編程是PCI2040.sys,它處于Ring0層,為Ring3層和PCI進(jìn)行數(shù)據(jù)交換搭建了一個(gè)橋梁。驅(qū)動(dòng)程序中主要模塊有:

(1)OnStartDevice(),在這個(gè)例程里驅(qū)動(dòng)程序?qū)⒌玫絇nP管理器為所分配的硬件資源,包括HPI CSR基地址和HPI控制空間基地址,對(duì)PCI配置空間進(jìn)行初始化。初始化中斷等。需要注意的是,在初始化中斷之前禁止卡向主機(jī)發(fā)中斷,因此應(yīng)有屏蔽中斷的操作。

(2)DeviceControl(),在這個(gè)例程中可以定制自己的函數(shù)來達(dá)到Ring3層和Ring0層相互通訊的目的。通過IOCTL_CODE可以區(qū)分不同的請(qǐng)求。例如:

#define SEND_HEVENT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_ANY_ACCESS)

在DeviceControl()中,可執(zhí)行如下語句:

case SEND_HEVENT:

status = SEND_HEVENT_Handler(I);//接收應(yīng)用程序傳遞給WDM的事件句柄

m_Irq.Connect(LinkTo(Isr_Irq), this); //連接中斷

INT_MASK_SET_UL=(ULONG)0x80000001; //開相應(yīng)中斷屏蔽位

m_CtlMemoryRange.outw((ULONG)0x0000,0x0b0b);//清除中斷位,等待中斷到來

break;

把連接中斷的函數(shù)放在DeviceControl()里,并沒有和初始化中斷(在OnStartDevice()中)放在一起,不然會(huì)在Win2000里引起死機(jī)。

DSP語音卡是基于中斷處理的,因此上面的程序就起了這樣一個(gè)作用:當(dāng)語音卡向主機(jī)發(fā)中斷時(shí),驅(qū)動(dòng)程序就跳到Isr_Irq執(zhí)行,并在DpcFor_Irq中將事件設(shè)置為信號(hào)態(tài),從而通知上層應(yīng)用程序進(jìn)行處理。

(3)Isr_Irq(),這個(gè)例程是用來處理中斷的。Windows 2000的中斷處理機(jī)制是假定多個(gè)設(shè)備可以共享一個(gè)硬件中斷。因此,Isr的首要工作就是找出哪一個(gè)設(shè)備發(fā)生了中斷。如果沒有,則應(yīng)該立刻返回FALSE,以便HAL能把中斷送往其它設(shè)備驅(qū)動(dòng)程序[5]。中斷服務(wù)例程Isr執(zhí)行在提升的IRQL上,在DIRQL級(jí)別上運(yùn)行的代碼需要盡可能快地運(yùn)行。通常情況下,若判斷中斷是由自己的設(shè)備產(chǎn)生的,則調(diào)用一個(gè)在DISPATCH_LEVEL級(jí)別上運(yùn)行的延遲過程調(diào)用(DpcFor_Irq)。

在處理的過程中要注意,當(dāng)確定是自己卡的中斷時(shí),要馬上屏蔽中斷位防止中斷再進(jìn)來,等到DpcFor_Irq的結(jié)尾處再開中斷。Dpc中部分語句如下:

if(m_pEventToSignal!=NULL) m_pEventToSignal->Set() //將事件設(shè)置為信號(hào)態(tài)

t ″Event Set!n″;

INT_MASK_SET_UL=(ULONG)(0x80000001); //開中斷

M_CtlMemoryRange.outw((ULONG)0x0000,0x0b0b);

參考文獻(xiàn)

1 陳立學(xué),孫 彪,趙玉連. 微機(jī)總線與接口設(shè)計(jì). 成都:電子科技大學(xué)出版社,1998

2 PCI2040 PCI-DSP Bridge Controller Data Manual. Texas Instruments, 1999

3 TMS320VC5410 Fiexed-Point Digital Signal Processor.Texas Instruments, 2000

4 武安河,周莉莉.Windows設(shè)備驅(qū)動(dòng)程序(VxD與WDM)開發(fā)實(shí)務(wù).北京:電子工業(yè)出版社,2001

5 Walter Oney.Programming the Microsoft Windows Driver Model.Microsoft Press,1999


上一頁 1 2 3 下一頁

評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉