- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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)
{
您可能关注的文档
最近下载
- 学堂在线 实用绳结技术 期末考试答案.docx VIP
- 风力发电技术的发展现状和未来发展趋势.pptx VIP
- 医疗行业数据脱敏技术方案.docx VIP
- 新译林九年级上Unit 4 精选短语和词汇(预习+复习+默写)2024-2024学年牛津版英语九年级上册.docx VIP
- DB14T 3225-2025煤矸石生态回填环境保护技术规范.docx VIP
- 精品解析:辽宁省沈阳市第四十三中学2024-2025学年八年级上学期期中考试 数学试题(原卷版).docx VIP
- 中医内科学中风(共42张PPT).pptx VIP
- 探究与实践++湖泊生态环境治理与保护+课件-2025-2026学年八年级地理上学期湘教版(2024).pptx VIP
- 医疗器械经营质量管理制度及工作程序.docx VIP
- 额定电压110 kV(Um=126 kV)交联聚乙烯绝缘电力电缆及其附件 第1部分:试验方法和要求.pdf VIP
文档评论(0)