T03.设备驱动开发_1_.ppt

Download Report

Transcript T03.设备驱动开发_1_.ppt

医学仪器中的嵌入式系统设计
T03. 设备驱动开发(1)
2011-05-11
 Agenda
• WinCE驱动介绍
–
–
–
–
–
•
•
•
•
•
本机驱动程序
流接口驱动程序
内置驱动
可安装的驱动
需要时加载的驱动
如何安装驱动
中断处理
驱动程序模型
驱动程序的内存管理
设备管理程序
1
WinCE驱动介绍
• 所有驱动都是动态链接库
• 驱动实现中可以调用所有标准的API
2
本机驱动程序
• 用于低级、内置设备
• 提供一组定制的接口
• 可通过移植、定制微软提供的驱动样例来实
现
– Display, Battery, Keyboard, Touch, LED
• 本机驱动模型
– 单片驱动程序
• 直接将硬件设备的功能传递给操作系统
– 分层驱动程序
• 模型设备驱动程序(MDD)
• 依赖平台的设备驱动程序(PDD)
3
流接口驱动程序
•
•
•
•
基本的设备驱动类型
实现一组固定的流接口函数
所有的CE设备皆可使用此模型实现
流接口驱动程序由设备管理程序的特殊应用程序加载、
管理和卸载、与具有单独目的接口的内部设备驱动程序
相比.所有流接口驱动程序使用同一个接口并调用同一
个函数集——流接口函数
• 流接口驱动程序的主要任务是把外设的使用传递给应
用程序,这是通过把设备表示为文件系统的一个特殊文
件实现
4
内置驱动
可以都是本机驱动
系统启动后由GWES加载
使用定制接口
一般用于在系统启动时必须加载的驱动
Keyboard Mouse
Touch Screen
Display
Battery
Notification LED
5
可安装的驱动
•
•
•
•
一般指流接口驱动
由设备管理器在系统启动或者插入动态时加载
使用流接口驱动架构
混合驱动
– 支持流接口和用户定义接口
• 一般包括
– 本机驱动:PCMCIA Host Controller;USB Host
Controller driver;NDIS.DLL
– 流接口驱动:Audio driver;Serial port driver;
Parallel port driver;Port Monitor
6
需要时加载的驱动
• PC Card Client drivers
• USB Client drivers
• NDIS Miniport drivers
7
如何安装驱动程序
• 本机驱动
– 连接CE设备
– 把驱动DLL拷贝到\Windows目录
– 设置注册表键值
• 流接口驱动
– 与基于Windows CE的平合连接.或检测到连接
– 把流接口驱动DLL拷贝到\WINDOWS目录下
– 如果需要的话 为驱动程序建立注册键和注册值
8
中断处理
•
•
•
•
•
•
介绍
中断模型
中断处理相关的函数
典型的IST
中断ID
处理一个中断
9
介绍
• 中断服务例程
– 内核模式的中断服务例程(ISR)
 短小的汇编语言代码
 返回中断号给内核
– 用户模式的中断服务例程(ISP)
 接收中断通知,并进行中断的处理
• 256个优先级, 0最高
• 高优先级的ISR和IST可以中断低优先级的ISR和IST
• 四个范围
–
–
–
–
0-96:高优先级实时任务
97-152:缺省的CE驱动
153-247:比普通的用户级任务高的任务
248-255:非实时的用户应用
10
中断模型
Kernel
Exception 5
Handler
3
1
OAL
4
ISR
6
Interrupt
Support Handler
2
Driver
IST
8
9
OAL routines
7
I/O Routines
OEM Hardware
11
中断模型(Continued)
12
中断模型(Continued)
• 该图的最低层为硬件和中断控制器的状态。次
低层是中断服务过程中的内核交互。OAL 描述
了BSP 的职责。最顶层阐述了中断服务所需的
应用程序或驱动程序线程交互。
• 过程
– 生成了一个异常->处理器加载内核 ISR 向量->禁用
所有处理器上的所有具有相同和较低优先级的中断->
特定中断注册的 OAL ISR->直接处理/遍历->执行
ISR->返回该设备的名为 SYSINTR 的映射中断->驱
动程序或应用程序的 IST 运行 ->InterruptDone( ) 通
知完成->重新启用指定的中断
13
中断处理相关的函数
• OEMInterruptEnable()
– 允许设备产生特定的中断
• OEMInterruptDisable()
– 禁止特定的硬件中断
• OEMInterruptDone()
– 中断处理完成的信号
• OEMInterruptHandler()
– 当中断发生时由内核调用
• InterruptInitialize ()
– 内核初始化硬件中断。 允许设备驱动注册一个事件并使能中断。
• WaitForSingleObject()
• CreateEvent ()
14
典型的IST
•
•
•
•
•
•
•
struct ISTData // Declare the Strucure to pass to the IST
{
HANDLE hThread; // IST Handle
DWORD sysIntr; // Logical ID
HANDLE hEvent; // handle to the event to wait for interrupt
volatile BOOL abort; // flag to test to exit the IST
};
•
•
•
•
•
•
ISTData g_KeypadISTData;
// Create event to link to IST
g_KeypadISTData.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
// start the thread
g_KeypadISTData.hThread = CreateThread(NULL,0,&KeypadIST,
&g_KeypadISTData, 0, NULL);
15
中断ID
16
处理一个中断
1. 中断发生时.内核跳至异常处理程序
2. 异常处理程序使所有中断无效.然后调用合适的中断
服务例行程序准备物理中断经
3. 中断服务例行程序以中断标识符的形式返回逻辑中断。
4. 中断处理程序重新启动除当前中断以外的所有中断,
并把信号传递给适当的中断服务线程。
5. 中断服务线程调用依赖平台的驱动程序来访问硬件和
完成逻辑中断的处理。
6. 中断服务线程调用InterruntDone函数。
7. 中断处理程序重新启动当前中断.并在OAL中调用
OEMIntemptDone函数。
17
驱动程序模型
• 本机驱动模型
– MDD
– PDD
• 流接口驱动模型
–
–
–
–
加载流接口驱动程序
卸载流接口驱动程序
流接口驱动入口点
单访问和多访问
• 网络驱动程序模型
18
本机驱动模型
USB Client
Driver
GWE subsystem
Device
Manager
USBD
DDI
MDD
DDSI
PDD
Monolithic
Driver
(display)
MDD
MDD
DDSI
PDD
OEM Hardware
PDD
19
MDD
• MDD执行的任务
–
–
–
–
链接PDD层并定义它希望调用的函数
把不同的函数集提供给操作系统
处理像中断处理这样的复杂任务
与GWES模块和内核通信
• MDD的特点
– 提供标准的设备驱动程序接口
– 一般不需改变
20
PDD
• 不象MDD层.依赖平台的驱动程序(PDD)层与MDD
和硬件都有接口,这就意味着必须适合目标平台的需要。
• 一个PDD由针对具体硬件的函数组成.而这些函数与一
个MDD相对应、但这种对应不是直接的一一对应。
• PDD函数实现独立的任务,而MDD则通过使用这些任
务来实现其目标。因为PDD是硬件相关的,因此必须生
成一个设置好的PDD并输出到平台硬件
• 微软为各种各样的内部设备提供了几个样本PDD层
21
流接口驱动模型
22
加载流接口驱动程序
• 在基于WINDOWS CE的平台启动时,就启动设备管理
程序。设备管理程序读取
HKEY_LOCAL_MACHINE\Drivers\BUILTIN键的内容
并加载已列出的流接口驱动程序。
– 例如.在许多基于WINDOWS CE的平台上,设备管理程序通
过这个机制加载内部串行口(Serialdll)的驱动程序
• 在设备管理程序自动检测外围设备与基于 Wndows CE
平台的连接时进行的.
• 设备管理程序不能识别设备时,应用程序自己加载:
–
–
–
–
启动应用程序,
检测驱动是否加载,
调用RegisterDevice函数来加载驱动并锁入内存
应用程序进行正常操作.
23
卸载流接口驱动程序
• 通过设备管理程序卸载
• 用户程序自行卸载:
– DeRegisterDevice函数,从文件系统卸载设备文件
– 通知FreeLibrary函数卸载DLL
24
流接口驱动入口点
•
•
•
•
•
•
•
•
•
XXX_Close
XXX_Deinit
XXX_Init XXX_IOControl
XXX_Open
XXX_PowerDown
XXX_PowerUp
XXX_Read
XXX_Seek
XX_Write
25
单访问和多访问
• 多访问的概念
– 多个应用可以同时访问驱动
• 对XXX_Open调用的返回值
– 多访问的返回不同的hOpenContext值
– 单访问返回相同hOpenContext值, 以后的调用使用
这个值.
26
网络驱动程序模型
•
•
•
•
•
•
•
•
•
网络驱动程序模型
CE对NDIS驱动的支持
CE Miniport驱动
NDIS驱动的注册和初始化
为NDIS Miniport驱动实现DMA
NDIS协议绑定
NDIS电源管理
NDIS驱动的注册键
NIDIS驱动注册表实例
27
网络驱动程序模型
• 提供一组抽象层,用于把网络驱动和协议栈或网络适配器相连.
28
CE对NDIS驱动的支持
• CE支持的NDIS功能
–
–
–
–
–
NDIS4.0的一个子集
以太网和IrDA介质类型
标准的小端口卡驱动程序
中性小端口卡驱动程序的一个子集.]
Plug and Play loading of miniport drivers for PC Card–based NICs
• CE不支持的NDIS功能
–
–
–
–
单片或全功能的NDIS
直接内存存取(DMA)
连续的物理内存分配
既提供小端口给已有的协议栈,又提供协议接口给其它应用的中性小端
口卡驱动程序
– 通过NDIS的广域网互联
– PC卡属性空间
– 多包传送
29
CE Miniport驱动
• 基本上与Windows NT兼容
• CE 的miniport 驱动编译为DLL,输出
DriverEntry
• 典型的DriverEntry执行任何一般的或平台特定
的初始化,并且通过调用
NdisMRegisterMiniport 注册miniport驱动
• CE 不支持一般的网络驱动的 .inf文件格式
30
NDIS驱动的注册和初始化
31
NDIS驱动的注册和初始化(Continued)
• 设置App或者通过驱动的Install_Driver 函数
– 必须确保建立了合适的注册键
• Miniport驱动应该安装到\Windows 目录下
• 基于PC卡的NICs的Miniport驱动可以动态加载
和卸载
• 已经加载的NDIS组件会显示在
HKEY_LOCAL_MACHINE\Comm\Miniport\下
32
为NDIS Miniport驱动实现DMA
• DMA对于高效的网络传输非常重要
– 允许网络的各层之间共享数据而不用拷贝数据
• 有两种类型的DMA:从DMA和主DMA
• 从DMA
• 主DMA
33
NDIS协议绑定
• Miniport驱动必须绑定一种合适的协议栈
• 协议绑定相关的函数
– NdisOpenAdapter
– NdisCloseAdapter
• TCP/IP协议支持内建驱动和基于PC卡的以太网卡驱动。
WinCE的TCP/IP协议栈支持绑定到多个Miniport驱动实
例
• IrDA协议栈只支持绑定到单个Miniport驱动实例
• Miniport驱动实例与协议栈的绑定关系存储在
HKEY_LOCAL_MACHINE\Comm\Protocol\Linkage\
34
NDIS电源管理
• Miniport驱动的电源处理时序与PC卡设备驱动
的要求是一致的
• IrDA的Miniport驱动必须支持的消息有
OID_IRDA_REACQUIRE_HW_RESOURCES
和OID_IRDA_RELEASE_HW_RESOURCES
• 内建NIC的Minport驱动在恢复供电时调用
Miniport驱动的reset函数
35
NDIS驱动的注册键
• Windows CE加载的NDIS驱动列表在
HKEY_LOCAL_MACHINE\Comm\ 键值下
• 在每一个Miniport\键下的子键包括
–
–
–
–
DisplayName:用户看到的易于理解的名字
Group:字符串常量“NDIS”
ImagePath:Miniport驱动的DLL名字
Linkage\Route :用逗号分开的Miniport实例集合
36
NDIS驱动的注册键(Continued)
• Linkage\Route下每一个Miniport实例对应的附
加子键
–
–
–
–
DisplayName:用户看到的易于理解的名字
Group:字符串常量“NDIS”
ImagePath: Miniport驱动的DLL名字
Parms:Miniport驱动的参数
• BusNumber:Miniport实例的总线编号
• BusType:Miniport实例的总线类型
37
NDIS驱动的注册键(Continued)
• 在
HKEY_LOCAL_MACHINE\Drivers\PCMCIA\Pl
ug-and-Play ID\ 键下包含的子键
• DLL
字符串常量 “Ndis.dll”
• Prefix
字符串常量 “NDS”
• Miniport PC卡Miniport驱动的名字,与
HKEY_LOCAL_MACHINE\Comm\ 下的
Miniport驱动的注册键名字匹配
38
NDIS驱动的注册键(Continued)
• 协议绑定
– HKEY_LOCAL_MACHINE\Comm\IrDA\Linkage\
– HKEY_LOCAL_MACHINE\Comm\Tcpip\Linkage\
• 实例
– [HKEY_LOCAL_MACHINE\Comm] [IrDA\Linkage]
• Bind=multi_sz:"IrSir1“
– [Tcpip\Linkage]
• Bind=multi_sz: "PPP","NE20001"
39
NIDIS驱动注册表实例
[HKEY_LOCAL_MACHINE\Comm]
[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
40
IEEE 1394架构
Applications
End of Wire devices
-Digital VCRs
-DVD, CD Players
-Digital camcorder or
-Digital still camera
Controller devices
-Set-top-box (STB)
-AV Receiver
-HDTV or Smart TV
-Res Gateway Box
-Media, Game or
Entertainment Console
Sample AV
Subunit
SBP/2
(Mass Storage Devices)
AV/C
61883 1-5
(Transport)
Bus Class driver
Port Driver (OHCI)
41
驱动程序的内存管理
•
•
•
•
内存管理函数
Windows CE的地址空间
驱动和指针数据
驱动的内存访问
42
内存管理函数
• 用户模式的设备驱动-必须映射物理内存到虚拟内存
• VirtualAlloc-保留虚拟内存
– MEM_RESERVE
• VirtualFree-释放虚拟内存
• VirtualCopy-映射物理内存到虚拟内存
– PAGE_NOCACHE
– PAGE_PHYSICAL
• MapPtrToProcess
– GetCurrentProcess
– GetOwnerProcess
43
内存管理函数(Continued)
• UnMapPtr
• SetProcPermissions
• Volatile qualifier
44
Windows CE的地址空间
4 GB
Not Used
Accessable via
MmMapiIoSpace
3 GB
512M Non-Cached
0xA0000000
512M Cached
Virtual
address
space
Above 2G-3G
Mapped to
physical memory
0x80000000
2 GB
Memory mapped files
(Shared)
Slot 32
Slot 32:Process32
64 MB
32 MB
64 KB
Slot 1:Process 2
Slot 0:Process 1
NULL pointers
45
驱动和指针数据
• OS管理作为参数直接传递的指针
• 驱动必须映射包含在结构中的所有的指针
• DeviceIOControl缓冲区通常作为包含结构化
的数据
• MapPtrToProcess( SomePtr,
GetOwnerProcess())
• GetOwnerProcess
46
驱动的内存访问
•
•
•
•
•
•
•
•
•
•
APP 被映射到Slot 0
App调用DeviceIOControl
DM被映射到Slot 0
DM设置APP空间的访问权限
DM调用xxx_IoControl
驱动调用MapPtrToProcess
驱动从xxx_IoControl返回
DM重新设置App空间的访问权限
APP被映射到Slot 0
如果驱动创建一个线程来完成这些
工作,MapPtrToProcess() 必须加
入辅助措施才能工作
Mapped
pointer
APP
DM
Original
pointer
APP
DM
Slot 0
– 必须使用 GetCurrentPermissions()
和 SetProcPermissions() 获得和重
设进程的访问权限
47
设备管理程序
• 流接口驱动程序
– 接收来自设备管理程序和应用程序的命令,并把这些命令转换
成他控制的设备的适当控制信息。
• 用户应用程序,包括任何访问外部设备的应用程序
– 对外部设备的访问是通过文件系统和连接外围设备的特殊文件
完成的。
•
设备管理程序
– 设备管理程序是一个用于加载和卸载流接口驱动程序的特殊应
用程序。
• 外围设备
– 由设备驱动程序管理的设备。
48
设备管理程序(Continued)
• 设备管理器与用户层程序,非内核,内核、注册表、流接口驱动
程序DLL关系密切
• 在系统启动时或收到用户在基于WindowS CE的中自上增加了外
围设备的信息时, 初始化驱动程序的加载。例如 在用户插入一个
PC卡时.设备管理程序就试图寻找这PCi并为之加载设备驱动程
序
• 向内核注册特定文件名,该文件名把应用程序使用的流接口函数
映射到流接口驱 动程序的那些函数的实现。
• 通过从外围设备获得即插即用标识符或激活一个检查子程序来发
现可以处理该设 备的驱动程序,为外围设备找到合适的设备驱动
程序。
• 通过读写注册值加载和跟踪驱动程序。
• 当不再敲要设备时 卸我其驱动程序。例如.在用户去掉PC卡后 设
备管理程序 就卸载PC卡设备的驱动程序。
49
设备管理程序(Continued)
• 设备管理程序使用的注册键
– 位置: HKEY_LOCAL_MACHINE\Drivers
– 子键:
• 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平台上安装
驱动程序时就生成了这些子键.
50