PCI转串口驱动程序开发总结

好久没有写blog了!也没有写读后感了!也觉得自己最近学习不够努力!前段时间太忙!一直没有时间(借口吧)!前段时间又要做一个PCI转串口驱动!所以又拿来了那本书,开始研究。这一篇可以当做《19章虚拟串口》笔记!


首先介绍一下我用的硬件,是在PCI的BAR2接了个8251的逻辑。
目的是做驱动程序,驱动8251来实现PCI转串口功能。所以在开发驱动程序之前要首先熟悉8251的编程。
起初难道这个课题没有一点思路,在网上找来找去,也没有相应的历程,有人说算了研究ddk里的例子。天啊~代码好多啊,而且英文注释太难读了。想想别的办法吧。最后确定参考《Windows驱动开发技术详解》中十九章虚拟串口驱动。开始吧~
参考之前先应该把书上讲的内容看懂,并实现了!只要智商没有问题很容易...
然后我尝试着把inf中的厂商号和设备号改成了我的板卡的,VEN_10E8&DEV_5933,结果安装上了,也可以看到PCI的资源,并可以完成实验。太好了,现在我的PCI就可以用串口调试工具忽悠人了!现在看似简单了,只要加上对8251的初始化代码和read和write时对8251进行读写访问啦。
首先开始初始化,在HelloWDMCreate中初始化!我的BAR2是9800。因此
   WRITE_PORT_UCHAR(0x9801,(UCHAR)0x00);
   WRITE_PORT_UCHAR(0x9801,(UCHAR)0x00);
 WRITE_PORT_UCHAR(0x9801,(UCHAR)0x00);
 WRITE_PORT_UCHAR(0x9801,(UCHAR)0x40);
 WRITE_PORT_UCHAR(0x9801,(UCHAR)0x4e);
   WRITE_PORT_UCHAR(0x9801,(UCHAR)0x35);
在HelloWDMWrite中,
 WRITE_PORT_UCHAR((PUCHAR)pdx->0x9801,(UCHAR)0x31);
 WRITE_PORT_UCHAR((PUCHAR)pdx->0x9801,(UCHAR)*(pData+i));
这时貌似我的com7可以发数成功了,还是用的串口调试工具调试的。但是收数怎么办呢?
合适发数驱动程序很容易得知,合适开始收数,就不好办了吧。我想了两种思路:
1.用中断,8251收到数时会有RxRDY。
2.做一个线程,始终运行,判断是否有数。
我选择了前者,用中断,当产生中断时。判断是否是因为8251收到数,再调用中断延迟,在中断延迟中调用
DriverCheckEvent(pdx, SERIAL_EV_RXCHAR | SERIAL_EV_RX80FULL);
来相应读事件。在HelloWDMRead中加入
 UCHAR Date = READ_PORT_UCHAR((PUCHAR)0x9800);
这样就简单的实现了PCI转串口的手法!当然,程序中不应该出现0x9800这些东西,因为每个机子分配的空间不同,再在程序中加入读PCI读配置的代码,这些可以参照《详解》中的16章。一切都OK的时候,我又发现不能发字符串,怎么办呢?
需要每次发数完了后做一个判断,判断是否发数成功。
把发数放在一个for循环中,循环次数当然就是字符串的长度,每次判断是否发数完成再发下一个数。代码如下:
 for (ULONG i = 0;i {
  WRITE_PORT_UCHAR((PUCHAR)pdx->portbase2+1,(UCHAR)0x31);
  WRITE_PORT_UCHAR((PUCHAR)pdx->portbase2,(UCHAR)*(pData+i));
  while(!(READ_PORT_UCHAR((PUCHAR)pdx->portbase2+1) & 0x01))
  {}
  WRITE_PORT_UCHAR((PUCHAR)pdx->portbase2+1,(UCHAR)0x34);
  }
总算一切顺利了,再用串口调试工具秀一下成果吧。哈哈~~
最后又发现了一个问题,安装后不能被系统认成串口,着急啊~折磨啊~
发贴求助没人回复!绝望ing~办法总比问题多~静下心慢慢想!
这里要感谢网友波波仔给我了一些帮助,参考NetMos的PCI转串口的inf,在与他认真的两个晚上后,重要开窍了,满怀信心的研究一下哪个inf,看到最后才发现人家的inf中装的是系统中的serenum和serial,我只能理解人家的硬件和ddk提供的驱动兼容吧,但是我的8251啊~相比兼容很难~安装上总是叹号!!!!!
既然Windows不把我当成它的串口,我就只能改注册表了!
每次用这个串口手动改注册表和运行reg文件都不现实!继续想办法,用代码在驱动的DriverEntry中改注册表,OK成功!但是从启电脑后呢~
失败!没有执行DriverEntry!
怎么执行一下?想起了inf中的StartType,修改它也许可以开机启动,执行一下DriverEntry!但是失败!好像inf中这个东西没有用!
继续实验!最后发现修改NT驱动的Start可以开机启动NT驱动!所以我在加载wdm驱动的时候加载了一个nt驱动程序。nt驱动程序的功能就是开机的时候执行DriverEntry修改注册表!
结果成果了~
就这样,告一段落吧!

你可能感兴趣的:(驱动开发/核心开发)