nt2000pc设i备驱动程序详解.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
nt2000pc设i备驱动程序详解

常常有朋友问我关于pci驱动程序的问题,但是在和他们的交谈中 我发现有一些问题非常重复,也没有什么特别的地方(真有什么特别 的地方,我也搞不定:-)),对于一些问题,其实卡的结构非常 普通,只要熟悉pci驱动程序的一些基本概念就可以解决的。 下面我把pci驱动程序的一些基本概念整理整理:首先讲一讲pci的配置空间。 这个概念本来是非常简单的,但是我这个有灌水的爱好,为了让文章能够 更成体系,加上这一段。 pci的配置空间的结构不在这里重复,任何一本pci的书里都有。 对于pci的配置空间操作,我用过的操作系统中,linux下是最简单的, linux提供了许多函数,细节可看linux device driver。 我在这里简单的给出一个操作x86结构下pci的方法就结束这一段。 我在写第一个pci driver的时候是在dos下,最早我操作pci的方法就是用 int 1a,需要bios支持,现在的主板是没有不支持得了。后来我发现了另外 一种方法,更为简单,int 1a的方法就记不得了,如果想知道,可以去查 int 1a中断,要96年以后的书(int 1a是时钟,但是扩展为pci操作)。 由于不同操作系统提供的函数不同,使得代码可移植性变差,其实这些实现 几乎都是基于BIOS的int 1a中断调用。由于在不同系统中调用1a中断的实现 也很不相同,而且一般都需要写驱动程序。下面是我写的一个通用的操作PCI 配置空间的程序如下,该方法和int 1a内部机制相同,都是基于PCI规范实现 的,只用到了端口操作。代码如下: #include stdio.h #include windows.h DWORD DWORD_In(WORD io_Port) { DWORD val; _asm { mov dx,io_Port in eax,dx mov val,eax } return val; } DWORD DWORD_Out(WORD io_Port,DWORD val) { _asm { mov dx,io_Port mov eax,val out dx,eax } return 0; } int main() { DWORD io_CF8; // port 0xcf8 DWORD io_CFC; // port 0xcfc int i; io_CF8=0 //because the first bit is enable/disable for(;;) //so must be 1,so from 0x800000000 { DWORD_Out(0xcf8,io_CF8); io_CFC=DWORD_In(0xcfc); if (io_CFC!=0xffffffff) //if =0xffffffff,then is a invalid { //bus number and device number printf( PCI device has found,the pci config address=%lx ,io_CF8); printf(its Bus Numer is %lx ,(io_CF80x00ff0000)/0x10000); printf(its Device Number is %lx ,(io_CF80x0000f800)/0x800); printf(its Functin Number is %lx ,(io_CF80x700)/0x100); printf(this devices deviceID and vendorID=%lx ,io_CFC); for (i=0 ;i=15;i++) { DWORD_Out(0xcf8,io_CF8+4*i); //read DWORD switch (i) {

文档评论(0)

love3892 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档