以下是最近的收获。
一般来说,驱动程序的结构如下所示:
a、 打开WinDriver设备;
b、 查找要访问的PCI设备;
c、 枚举该设备的资源(内存、I/O、中断);
d、 锁定该设备的资源;
e、 访问插卡上的资源(读写内存、读写I/O、响应中断);
f、 解锁资源;
g、 关闭WinDriver设备。
以下是一段使用WinDriver开发的PLX9050的驱动代码,从中可以看出
WinDriver驱动程序的框架结构,只要对其稍作修改就可作为其他PCI卡
的一部分。程序中没有给出变量说明,具体说明请查阅WinDriver的设计
文档。
hWD=WD_open();//打开WinDriver设备,得到一个文件句柄;
Pciscan..searchId.dwVenderId=0x10b5;//PLX公司供货号;
Pciscan..searchId.dwDeviceId=0x9050;//PXL9050的设备号;
WD_PCIScanCards(hWD,&Pciscan)//检测PCI插槽上的设备;
PciSlot=Pciscan.cardslot[0];//将插卡的地址传递给变量PCICardInfo来
PCICardInfo.pcislot=PciSlot;//检测卡上的资源信息;
WD_PciGetCardInfo(hWD,&PciCardInfo);//检测卡上的资源信息;
Card=PciCardInfo.card;
Cardreg.card=Card;
WD_CardRegister(hWD,&Cardreg);//向系统登记检测到的资源信息;
Item=Card.Item[0];//将卡上的0号资源赋给变量Item;
If (Item.item==ITEM_MEMORY)
RegAddress=Item.I.Mem.dwTrans.Addr;//得到PCI卡上的内存映射到用户态的地址;
Trans.dwport=RegAddress;
Trans.CmdTrans=RM_B;//设为内存字节读命令;
Trans.fAutoinc=True;
WD_Transfer(hWD,&Trans)//进行数据传递;
WD_CardUnregister(hWD,&Cardreg)//释放注册到的资源;
WD_Close(hWD)//关闭WinDriver设备