PC104板卡驱动的设计方法.doc
文本预览下载声明
以ISA_MDLL工程为例,说明ISA板卡驱动的设计步骤:
打开WinDriver,创建一个ISA卡驱动程序的工程,工程命名为isa_m,需要注意的是,如果所设计的ISA卡是采用I/O访问,则只选择I/O寻址的范围,而不对Memory、Interrupts、Registers这3个选项进行任何操作;如果采用Memory访问,则只选择Memory寻址的范围,而不对I/O、Interrupts、Registers这3个选项进行任何操作,一般而言,ISA卡主要采用I/O访问、Memory访问、I/O访问 Interrupts、Memory访问 Interrupts这4中操作方式中的一种。
在该ISA卡驱动程序的工程中,包含有这样几个文件:
basetsd.h、bits.h、status_strings.h、wd_ver.h、windrvr.h、windrvr_events.h、windrvr_int_thread.h、isa_m_lib.h、isa_m_lib.c、status_strings.c,需要说明的是,isa_m_lib.h、isa_m_lib.c这两个文件的文件名与我所创建的ISA卡驱动程序的工程的工程名有关,如果工程名为xxx,则这两个文件的文件名分别为xxx_lib.h、xxx_lib.c。
打开VC。
建立一个空的DLL工程。
给该DLL工程创建8个头文件,命名分别为basetsd.h、bits.h、status_strings.h、wd_ver.h、windrvr.h、windrvr_events.h、windrvr_int_thread.h、isa_m_lib.h。将ISA卡驱动程序工程中的8个头文件的内容(basetsd.h、bits.h、status_strings.h、wd_ver.h、windrvr.h、windrvr_events.h、windrvr_int_thread.h、isa_m_lib.h)按照文件名一一对应的方式,分别复制到DLL工程创建的8个头文件中。
给该DLL工程创建2个源文件文件,命名分别isa_m_lib.cpp、status_strings.cpp,将ISA卡驱动程序工程中的2个源文件的内容(isa_m_lib.c、status_strings.c)按照文件名一一对应的方式,分别复制到DLL工程创建的2个源文件中。
给该DLL工程创建1个头文件,命名为ISA_MDll.h。在头文件ISA_MDll.h中声明要提供给用户的API函数和必要的数据结构,这里需要注意的是ISA_MDll.h文件的格式,该文件的格式可作为蓝本。
给该DLL工程创建一个源文件,命名为ISA_MDll.cpp。ISA_MDll.cpp文件用于实现头文件ISA_MDll.h中声明的API函数,这里需要注意的是ISA_MDll.cpp文件的格式,该文件的格式可作为蓝本。
给该DLL工程创建一个文件,命名为ISA_MDLL.def,该文件是为防止编译器在编译时改变ISA_MDll.h文件中的API函数的函数名,这里需要注意的是ISA_MDLL.def文件的格式,该文件的格式可作为蓝本。
Build整个工程,会产生一个ISA_MDLL.dll文件和一个ISA_MDLL.lib。
最终提供给用户的为3个文件,分别为ISA_MDLL.h头文件、ISA_MDLL.lib导出库文件、ISA_MDLL.dll动态链接库文件。
驱动编制的注意事项:
在用WinDriver创建ISA卡驱动程序工程isa_m时,我们会选择ISA卡的访问方式:I/O或Memory,如果选择I/O访问,并设置好I/O访问的寻址范围为0x300~0x30f,则在产生的isa_m_lib.h文件中,会找到以下两行代码:
enum {ISA_M_IORange0_ADDR = 0x300};
enum {ISA_M_IORange0_BYTES = 0x10};
需要指出的是,对这两行代码,需要做如下改动:
WORD ISA_M_IORange0_ADDR = 0x300 ;
//enum { ISA_M_IORange0_ADDR = 0x300 };
enum { ISA_M_IORange0_BYTES = 0x10 };
即将代码“enum { ISA_M_IORange0_ADDR = 0x300 };”注释掉,而增加代码
WORD ISA_M_IORange0_ADDR = 0x300 ;
这样做的目的是为了便于用户能够自由设置ISA板卡的基地址。
执行完第1步修改后,就开始执行第2步修改。在WinDriver生成的isa_m_lib.h文件中,包含了所有对底层硬件进行操作的API函数,而大部分函数中都有这样两个参数:ISA_M_ADD
显示全部