在样本模型设备驱动程序(MDD)中, 键盘驱动程序的中断服务线程IST的名字是KeybdDriverThread。这个线程调用函数Intenfljntlnltlallze注册SYSINTR_KEYBOARD中断,然后等待系统发出SYSINTR_KEYBOARD信号,在收到信号后中断处理程序调用函数KeybdPdd_GetEvent.把从设备依赖驱动程序(PDD)返回的键盘事件发送到输入系统。输入系统对它们进行排队以分发给相应的应用程序
样本串行口驱动程
功能:串行D驱动程序处理和串行口工作类似的任何I/O设备,包括那些基于16450和16550
通用异步接收传送器(UART)芯片的设备和那些使用直接内存访问(DMA)的设各、许
多基于WndoWW CE的平台都有这种类型的设备,包括普通9针串行口、红外线I/O D和PC卡串行设备如调制解调器
位置:Public\Common\Oak\Driver\Serial
DDI函数:
COM _Close COM _ PowerDown
COM _Deinit COM _ PowerUp
COM_INIT COM _ Read
COM _IOControl COM _Write
COM _ Open
DDSI函数
GetSerialObject HWGetModemStatus HWPutBytes HWClearBreak HWGetRxBufferSize HWReset HWClearDTR HWGetRxStart HWSetBreak HWClearRTS HWGetStatus HWSetCommTimeouts HWClose HWInitHWSetDCB HWDeinitHWIoctl HWSetDTRHWDisableIR HWLineIntrHandler HWSetRTSHWEnableIR HWOpenHWTxIntrHandler HWGetBytes HWPowerOffHWXmitComChar HWGetCommPropertiesHWPowerOn
HWGetIntrTypeHWPurgeComm
电源管理
为提供对可删除国行口硬件的连接事件的自动侦测 串行口驱动程序需对受检数据载体线(the Data Carrer Detected line)进行监视、对于可以自动侦测的串行口如基于pC卡的串行口硬件,驱动程序使用函数 CeEventHasoccured查看 NOTIFCATION EVENT RS232 DETECTED消息
流接口驱动程序
流接口驱动程序是动态连接库.由一个叫做设备管理程序的特殊应用程序加载、管理和卸载、与具有单独目的接口的内部设备驱动程序相比.所有流接口驱动程序使用同一个接口并调用同一个函数集——流接口函数
流接D驱动程序的主要任务是把外设的使用传递给应用程序,这是通过把设备表示为文件系统的一个特殊文件实现
流接口驱动程序模型
PC Card 客户端设备流程图
流接口驱动程序接收来自设备管理程序和应用程序的命令,并把这些命令转换成他控制的设备的适当控制信息。
用户应用程序:包括任何访问外部设备的应用程序,对外部设备的访问是通过文件系统和连接外围设备的特殊文件完成的。
设备管理程序: 设备管理程序是一个用于加载和卸载流接口驱动程序的特殊应用程序。
外围设备:由设备驱动程序管理的设备。
设备管理程序
用户层程序,非内核,与内核、注册表、流接口驱动程序DLL关系密切。
在系统启动时或收到用户在基于WindowS CE的中自上增加了外围设备的信息时, 初始化驱动程序的加载、例如 在用户插入一个PC卡时.设备管理程序就试图寻
找这PCi并为之加载设备驱动程序。
向内核注册特定文件名,该文件名把应用程序使用的流接口函数映射到流接口驱 动程序的那些函数的实现。
通过从外围设备获得即插即用标识符或激活一个检查子程序来发现可以处理该设 备的驱动程序为外围设备找到合适的设备驱动程序。
通过读写注册值加载和跟踪驱动程序。
当不再敲要设备时 卸我其驱动程序、例如.在用户去掉PC卡后 设备管理程序 就卸载PC卡设备的驱动程序。
设备管理程序使用的注册键
位置:HKEY_LOCAL_MACHINEDrivers
子键:
Active :包含由设备管理程序加载的跟踪当前活动驱动程序的子键、设备驱动程序设置子 程序不应修改Active键的内容.也不应依赖于Active键中任何特殊值的存在。
PCMCIA\:含有与PC卡及其流接口驱动程序有关的子键。这个子链中最重要的信息是PC卡的即插即用标识符.它是和特殊的驱动程序相对应的.
Detect\子键包含已编号的条目项 这些项是DLL名和侦测函数的列表、这些函数为即插即用标识符的PC卡或为未知即插即用标识符的PC卡识别一个通用流接回驱动程序。
Driver: 在通用PC卡驱动程序之后命名的Driver子键含有用于加载驱动程序的值.当通用流接口驱动程序侦测函数指示它可以驱动一个特殊设备时.设备管理程序就生成单独的Driver子键。Driver子键的存在说明由驱动程序完成的侦测的存在,该侦测在PCMCIA\dete。的键中有一个条目项。
Plug_and_Play ID:子键含有用于加载PC卡流接口驱动程序的值.典型地.PC卡驱动程序的设置子程序在基于Wndows CE平台上安装驱动程序时就生成了这些子键.
加载流接口驱动程
在启动时进行。在基于WINDOWS CE的平台启动时,就启动设备管理程序。设备管理程序读取 HKEY_LOCAL_MACHINEDriversBUILTIN键的内容并加载已列出的流接口驱动程序、例如.在许多基于WINDOWS CE的平台上,设备管理程序通过这个机制加载内部串行口(Serialdll)的驱动程序
在设备管理程序自动检测外围设备与基于 Wndows CE平台的连接时进行的.
设备管理程序不能识别设备时,应用程序自己加载:
启动应用程序,
检测驱动是否加载,
调用RegisterDevice函数来加载驱动并锁入内存
应用程序进行正常操作.
卸载流接口驱动
设备管理程序卸载
用户程序自行卸载: DeRegisterDevice函数从文件系统卸载设备文件,通知FreeLibrary函数卸载DLL
流接口驱动程序入口点
XXX_Close XXX_Deinit XXX_Init XXX_IOControl XXX_Open
XXX_PowerDown XXX_PowerUp
XXX_Read XXX_Seek
XX_Write
单访问和多访问
多个应用可以同时访问驱动
多访问对XXX_Open的调用返回不同的hOpenContext值.单访问返回相同值.以后的调用使用这个值.
串行设备驱动设计
创建一个流接口驱动程序
在应用程序中直接对串口读写,并处理数据
串行设备驱动的考虑因素
单点或多点访问:若要支持多个应用的同时访问,使用流接口实现,简化用户级程序设计;
数据流的复杂性:复杂的处理需要相当的处理。最好使用流接口方式。
数据速率:高速的数据处理,可能流接口驱动没有足够的处理时间,可能使用用户程序处理比较好。
安装流接口驱动程序
安装程序必须执行下列步骤:
1. 与基于Windows CE的平合连接.或检测连接已存在。
2.把流接口驱动程序DLL拷贝到平台的\WINDOWS目录下。
3.如果需要的话 为驱动程序建立注册键和注册值
流接口驱动程序例子
Pager Card
Illustrates a device driver for the Motorola NewsCard pager
Modem Card
Illustrates a device driver for a PC Card modem
RAM Card
Illustrates a device driver for a Static RAM PC Card
PC Card Test
Illustrates a device driver for testing PC Cards
Serial
Illustrates a device driver for devices that connect to a serial port
Touch Screen
Illustrates a device driver that interacts with the screen
NDIS网络驱动程序
提供一组抽象层,用于把网络驱动和协议栈或网络适配器相连.
网络驱动程序模型
CE支持的NDIS功能
NDIS4.0的一个子集
以太网和IrDA介质类型
标准的小端口卡驱动程序
中性小端口卡驱动程序的一个子集.]
Plug and Play loading of miniport drivers for PC Card–based NICs
CE不支持的NDIS功能
单片或全功能的NDIS
直接内存存取(DMA)
连续的物理内存分配
既提供小端口给已有的协议栈,又提供协议接口给其它应用的中性小端口卡驱动程序
通过NDIS的广域网互联
PC卡属性空间
多包传送
Windows CE Miniport Driver
largely compatible with Windows NT
miniport driver for Windows CE is compiled as a dynamic-link library (DLL) that exports the DriverEntry function
DriverEntry typically performs any general or platform-specific initializations. It also registers the miniport driver with the NDIS system by calling the NdisMRegisterMiniport function.
CE does not support the Common Network .inf file format
NDIS驱动的注册和初始化
setup application or through the driver’s Install_Driver function must ensure that the proper registry keys are created
miniport driver should be installed in the Windows directory
Miniport drivers for PC Card–based NICs can be loaded and unloaded dynamically
HKEY_LOCAL_MACHINECommMiniportGroup listed NDIS component loaded
Implementing DMA for NDIS Miniport Drivers
DMA is important for efficient networking because it enables the layers in the networking architecture to share data without first copying that data
two categories of DMA: slave DMA and busmaster DMA
Slave DMA
Slave DMA is appropriate for OEMs because it requires a block of memory that is pre-allocated in the device memory map of the Windows CE–based platform. Miniport drivers can map that block of physical memory to the driver’s virtual memory space, and then use the VirtualAlloc and VirtualCopy functions to move data in and out of that space
busmaster DMA
To receive data, the driver allocates a shared memory block, transfers the data to buffers within that block, and uses NDIS functions to indicate that a packet has arrived. To send data, the driver uses the LockPages and UnlockPages functions to map the virtual memory to device memory, informs the NIC of the addresses of the data, and instructs the NIC to send the data. This method can be faster for larger data block sizes.
NDIS Protocol Binding
miniport driver must bind to an appropriate protocol stack
Protocol binding takes place through the NdisOpenAdapter and NdisCloseAdapter functions.
TCP/IP protocol stack supports miniports for both built-in and PC Card–based Ethernet hardware. The TCP/IP protocol stack in Windows CE can bind to multiple miniport driver instances,
IrDA stack supports only a single built-in infrared port, which means that the IrDA stack binds to only a single miniport driver instance
The particular miniport instances that protocol stacks bind to are stored in the HKEY_LOCAL_MACHINECommProtocolLinkage registry key.
NDIS Power Management
miniport driver performs the same power-cycle processing that is required of all PC Card device drivers;
miniport driver for a built-in NIC, the miniport driver’s reset function is called when power returns
Miniport drivers for IrDA must support the OID_IRDA_REACQUIRE_HW_RESOURCES and OID_IRDA_RELEASE_HW_RESOURCES messages.
Registry Keys for Miniport Drivers
Windows CE loads NDIS drivers listed within the HKEY_LOCAL_MACHINEComm key
subkeys that are contained in each Miniport key:
DisplayName A user-friendly name for the driver
Group The literal string “NDIS”
ImagePath The name of the DLL containing the miniport driver
LinkageRoute A set of Miniport Instance keys, separated by commas
LinkageRoute key lists additional subkeys of the Comm key for each miniport instance
subkeys that are contained in each Miniport Instance key:
DisplayName A user-friendly description of the miniport instance
Group The literal value “NDIS”
ImagePath The name of the miniport driver’s DLL
Parmssubkey Subkeys for the miniport driver’s parameters
subkeys that are contained in each Miniport InstancePARMS key:
BusNumber The bus number for the miniport instance
BusType The bus type of the miniport instance
A set of registry keys for a miniport driver
[HKEY_LOCAL_MACHINEComm]
[NE2000]
DisplayName="NE2000 Compatible Ethernet Driver"
Group ="NDIS"
ImagePath="NE2000.DLL"
[Linkage] Route="NE20001, NE20002“
[NE20001]
DisplayName="NE2000 Compatible Ethernet Driver" Group="NDIS"
ImagePath="NE2000.dll"
[Parms]
BusNumber=0
BusType=8
CardType=1
InterruptNumber=03
IOBaseAddress=0300
Transceiver=3
subkeys that are contained in the HKEY_LOCAL_MACHINEDriversPCMCIAPlug-and-Play ID key:
DLL The literal string “Ndis.dll”
Prefix The literal string “NDS”
Miniport The name of the miniport driver for the PC Card, which corresponds to the name of the registry key within HKEY_LOCAL_MACHINEComm for the miniport driver
Protocol binding
HKEY_LOCAL_MACHINECommIrDALinkage
HKEY_LOCAL_MACHINECommTcpipLinkage.
[HKEY_LOCAL_MACHINEComm] [IrDALinkage]
Bind=multi_sz:"IrSir1“
[TcpipLinkage]
Bind=multi_sz: "PPP","NE20001"