搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Gausst松鼠会
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
CentOS7详细图文安装教程(非虚拟机)_非虚拟机centos7安装
2
git从本地仓库到远程仓库的连接_git链接本地库和远程库
3
Xcode11 无线调试iphone_xcode 取消网络连接调试
4
JAVA微信公众号完整版教程扫一扫登录/自动回复/客服消息_wx-java-mp实现微信扫码登录
5
腾讯云微搭低代码实现日期格式化输出_微搭低代码中选中的事件是一串数字如何转换成时间格式
6
如何免费用微信小程序中文 AI 绘画?
7
利用java GUI图形工具实现简单的计算器界面的功能(仅仅实现计算器的界面不可以真实的实现计算功能)_java入门计算器不实现功能
8
ElasticSearch7.7.1安装分词器——ik分词器和hanlp分词器_es7.17.1对应的ik分词器
9
HDFS原理理解(一) 基本数据存储和读写_一个写数据的dfs的客户端将数据发给管道中的
10
200+篇Graph4NLP文献集:图深度学习在NLP任务的应用
当前位置:
article
> 正文
WinCE6.0 USB Host驱动加载流程详解(_ce6 unidentified usb device driver name
作者:Gausst松鼠会 | 2024-03-16 04:07:12
赞
踩
ce6 unidentified usb device driver name
前面已经讲过WinCE6.0下USB驱动的整体结构,今天来看看USB Host驱动部分。可能是因为USB Host驱动一般不修改的原因,这方面的资料少的可怜,所以只能自己研究了。分析的源码微软已经提供了,在目录WINCE600\PUBLIC\COMMON\OAK\DRIVERS\USB下面。
该目录下包含CLASS、USBD、HCD、COMMON和INC文件夹,其中COMMON和INC文件夹中包含的一个关于锁功能的文件lock.c,HCD文件夹中是对USB1.1和USB2.0等协议的支持,为USBD提供操作控制器的接口,一般不会去做修改,这里不去深究。
USBD
USBD
文件夹实现的是一组接口,利用这组接口,上层
Client
层设备驱动程序来实现设备访问以及驱动程序管理的功能。这里也是所有
USB Host
驱动加载的总入口,
USBD
目录如下:
USBD
驱动最后生成的库为
usbd.dll
,
Usdb.def
文件的内容如下:
LIBRARY USBD
EXPORTS
HcdAttach
HcdDetach
HcdDeviceAttached
HcdDeviceDetached
HcdSelectConfiguration
RegisterClientDriverID
UnRegisterClientDriverID
OpenClientRegistryKey
GetClientRegistryPath
RegisterClientSettings
UnRegisterClientSettings
GetUSBDVersion
在系统启动之后,由设备管理器device.exe加载USBD.DLL驱动程序,入口同样是函数DllMain(),之后调用HcdAttach()函数初始化一些Hcd控制器的资源,包括一些接口函数的列表。具体有哪些函数,后面会讲到。到这里USBD.DLL启动完成。
一般来说,大部分驱动都是由device.exe进程根据注册表信息进行加载的,当第一次插入USB设备时,由于注册表不存在相关的信息,会提示未能识别的USB设备,要求用户输入驱动程序的名称,即驱动DLL的文件名。那么下面看看这一过程在代码中是如何实现的?
当插入USB设备之后,系统调用USBD.DLL驱动中的HcdDeviceAttached()函数。该函数内,首先调用LoadDeviceDrivers()函数来加载USB设备对应的Client层驱动,具体如何调用下面再讲。如果没有找到合适的驱动,加载失败了,便会调用函数GetClientDriverName(),该函数执行的功能便是提示用户无法识别USB设备,请输入相应的驱动程序名称,以便系统加载。
解释了上面的问题后,看一下LoadDeviceDrivers()函数是如何查找正确的Client层驱动的。当插入USB设备之后,系统会读取USB的设备描述符,然后根据描述符的值在注册表HKEY_LOCAL_MACHINE\Drivers\USB\LoadClients下面进行扫描来查找相应的驱动程序。该注册表的键值格式为:LoadClients/<Group1 Id>/<Group2 Id>/<Group3 Id>/<Driver Name>
这里称为第一组\第二组\第三组,每组又是由三个值中间加下划线组成,如下:
第一组:dwVendorId_dwProductId_dwReleaseNumber
第二组:dwDeviceClass_dwDeviceSubClass_dwDeviceProtocol
第三组:dwInterfaceClass_dwInterfaceSubClass_dwInterfaceProtocol
如果有一个值设置为USB_NO_INFO,则键名不包括该值。如果整个组中每个值都设置成USB_NO_INFO,则键名为Default。具体的每组包含的值的意义,请查阅相关资料。
在扫描注册表找到相应的驱动之后,LoadDeviceDrivers()函数调用LoadUSBClient()函数加载Client驱动。加载的流程为:LoadUSBClient()函数调用LoadRegisteredDriver()函数,在LoadRegisteredDriver()内,获取到Client驱动的DLL名称之后,调用LoadDriver()函数将驱动程序加载到自己的虚拟地址空间,接着便通过GetProcAddress()函数获得Client驱动中USBDeviceAttach()函数的地址,最后执行USBDeviceAttach()函数,运行Client驱动程序。
回到上面,如果没有找到匹配的驱动,则会提示用户输入驱动的名称,在用户输入之后,HcdDeviceAttached()便调用InstallClientDriver()函数,该函数里面通过LoadLibrary()函数将驱动程序映射到当前的虚拟地址空间,接着通过GetProcAddress()函数获得Client驱动中USBInstallDrvier()函数的地址,同时执行该函数完成相关注册表的设置。最后回到循环中,继续执行LoadDeviceDrivers()函数。
上面运行的LoadDriver()和LoadLibrary()函数会在第一次加载对应的驱动的时候,运行驱动程序的DllMain()入口函数。到这里就解释了从USBD驱动转向了Client驱动的整个过程。
解释一下上面提到的几个函数。USBInstallDriver函数负责向注册表添加USB设备驱动的信息,以便下次插入时,能
够识
别该USB设备。USBUnInstallDriver是在设备被移除后清理写入注册表的配置。USBDeviceAttach是在每次插入USB设备时,由系统调用来初始化USB设备、获取USB信息、配置USB以及申请资源。这里需要注意的是下面将要提到的USBD接口函数列表结构体_USB_FUNCS也是通过该函数传入具体的Client驱动中的。上面的这三个接口函数是每一个Client层驱动必须实现的接口。
下面看一下
USBD
为上层
Client
驱动提供了哪些接口函数。首先是
USBD
导出的函数,但这不是全部的接口函数,而且
Client
层驱动部分使用
USDB
库接口时,必须包含一个头文件
usbdi.h
,位于
WINCE600\PUBLIC\COMMON\DDK\INC
中,此文件定义了所有的
USDB
接口。下面看看
usbdi.h
中为上层提供了哪些接口。
BOOL USBDeviceAttach(USB_HANDLE hDevice, LPCUSB_FUNCS lpUsbFuncs,
LPCUSB_INTERFACE lpInterface, LPCWSTR szUniqueDriverId,
LPBOOL fAcceptControl,
LPCUSB_DRIVER_SETTINGS lpDriverSettings, DWORD dwUnused);
BOOL USBInstallDriver(LPCWSTR szDriverLibFile);
BOOL USBUnInstallDriver();
上面的三个函数在
usbdi.h
文件中只是声明,具体实现在
Client
驱动中。所有的
Client
驱动部分必须实现这三个接口。
VOID GetUSBDVersion(LPDWORD lpdwMajorVersion, LPDWORD lpdwMinorVersion);
BOOL RegisterClientDriverID(LPCWSTR szUniqueDriverId);
BOOL UnRegisterClientDriverID(LPCWSTR szUniqueDriverId);
BOOL RegisterClientSettings(LPCWSTR lpszDriverLibFile,
LPCWSTR lpszUniqueDriverId, LPCWSTR szReserved,
LPCUSB_DRIVER_SETTINGS lpDriverSettings);
BOOL UnRegisterClientSettings(LPCWSTR lpszUniqueDriverId, LPCWSTR szReserved,
LPCUSB_DRIVER_SETTINGS lpDriverSettings);
HKEY OpenClientRegistryKey(LPCWSTR szUniqueDriverId);
BOOL GetClientRegistryPath(LPWSTR szRegistryPath, DWORD dwRegPathUnit, LPCWSTR szUniqueDriverId);
可以看出上面几个函数都是通过def文件显式导出的。除此之外,usbdi.h中还有一个函数指针列表结构体_USB_FUNCS,里面包含了USBD的另外一部分接口,是在def中没有导出的,通过函数指针结构体在驱动之间进行传递的。_USB_FUNCS中的函数指针的实体都在文件usbddrv.cpp的文件中,整个USB驱动只有一个_USB_FUNCS的全局变量gc_UsbFuncs,它的声明及初始化在usbd.c中。
USBD提供的主要接口函数归类如下:
USBD的传输函数
IssueControlTransfer IssueBulkTransfer IssueInterruptTransfer IssueIsochTransfer
IsTransferComplete GetTransferStatus GetIsochResults AbortTransfer
CloseTransfer
USBD和USB设备建立通讯管道的函数
OpenPipe AbortPipeTransfers ResetPipe ClosePipe
IsPipeHalted IsDefaultPipeHalted ResetDefaultPipe
USBD针对总线上数据打包的函数
GetFrameNumber GetFrameLength TakeFrameLengthControl
SetFrameLength ReleaseFrameLengthControl
USBD和USB设备进行交互的函数
OpenClientRegistryKey RegisterNotificationRoutine UnRegisterNotificationRoutine
GetUSBDVersion LoadGenericInterfaceDriver TranslateStringDescr
FindInterface RegisterClientDriverID UnRegisterClientDriverID
GetDeviceInfo RegisterClientSettings UnRegisterClientSettings
今天先到这里,明天继续。
参考资料:
wince下USB设备驱动程序导读
http://blog.csdn.net/caowenbin/article/details/2030938
详解WinCE下USB Host驱动开发
http://blog.csdn.net/selfref/article/details/4830961
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/246942
推荐阅读
article
docker
之网络配置_
docker
--
net
=
host
...
docker
之网络配置_
docker
--
net
=
host
docker
--
net
=
host
...
赞
踩
article
Docker
进阶 - 7.
docker
network
网络
模式
之
host
_
docker
net...
1.
host
模式
概述直接使用宿主机的IP地址与外界进行通信,不再需要额外进行NAT转换。容器将不会获得一个独立的Ne...
赞
踩
article
安卓手机解锁:Device is
locked
. Please
unlock
the
device
...
Device is
locked
. Please
unlock
the
device
first 在安卓P的手机上如果a...
赞
踩
article
Device is
locked
. Please
unlock
the
device
first
...
adb root 提示 Device is
locked
. Please
unlock
the
device
first
...
赞
踩
article
ohasd
failed to start: Inappropriate
ioctl
for
dev...
今天同事在安装GI的时候出现问题,让我帮忙看一下。下面记录如下:问题现象:在安装gi的时候执行root.sh报如下错误;...
赞
踩
article
HI386
1
学习笔记(
1
)——搭建环境、编译烧写_
hi386
1
host
app
编译...
一、搭建环境
1
.
1
安装VMware链接:https://pan.baidu.com/s/
1
oN7H8
1
GV0g6cD9...
赞
踩
article
解决
Github
:fatal:
unable
to
access
‘
https
://
git
hub
.co...
1.问题:在
Github
上clone资源时发生:fatal:
unable
to
access
‘
https
://
git
...
赞
踩
article
Android
Studio
新功能-设备镜像
Device
mirroring
-在电脑侧显示手机实时画...
下载最新的灰测版本-蜥蜴成功运行到真机后,点击右侧Running
Device
s选项卡,再点击+号 选中当前设备;非常丝...
赞
踩
article
Unknown
host
mirrors
.
neusoft
.
edu
.cn You may
need
t...
mirrors
.
neusoft
.
edu
.cn_
unknown
host
'
mirrors
.
neusoft
.
edu
.cn'...
赞
踩
article
亲测Unknown host mirrors.opencas.cn You may
need
to ...
新装As,设置了 HTTP Proxy host name 为mirrors.opencas.cn ,新项目sync不过...
赞
踩
article
Unknown
host
'dl.
google
.com'. You may
need
to adju...
第一次导入别人的项目时编译出现这个问题解决:是因为还有相对应的文件没下载,点击Sync Project with Gra...
赞
踩
article
Download interrupt
ed
: URL not found._
download
inte...
应该是url被墙了。可以试下:启动 Android SDK Manager ,打开主界面,依次选择Tools、Optio...
赞
踩
article
“Could not
resolve
host
:
mirrors
.
neusoft
.
edu
.
cn
; 未...
centOs系统在linux系统下使用yum安装软件时经常会出现这种情况:[root@local
host
~]# yum...
赞
踩
article
Android
SDK Manager下载包失败问题解决方案_io
unknown
host
mir...
Android
SDK Manager下载失败的主要原因是Google资源被国内禁止访问了,所以才会出现很多开源资源无法...
赞
踩
article
AndroidStudio
编译时
Unknown
host
‘
dl
.
google
.
com
‘. You ...
由于国内网络环境问题,无法访问
dl
.
google
.
com
,但是
AndroidStudio
编译项目时需要下载东西,这样就会...
赞
踩
article
Unknown host ‘
dl
.google.com‘ You may
need
to adjus...
一、分析:这个Error的出现是因为你的当前代理不可用了造成的,也就你需要替换可用的代理。二、发生场景:一般公司的代理发...
赞
踩
article
Unknown
host
mirrors
.
opencas
.cn You may
need
to ad...
1、如果project的gradle.properties文件下配置了代理(如下图一和图二)和.gradle文件夹(在M...
赞
踩
article
unbutu无法上网的解决方案 或者
ping
:
unknown
host
mirrors
.tuna....
当前虚拟机状态:3块网卡都是nat和主机模式主机ip状态Last login
:
Sun Jul 28 21
:
10
:
08 ...
赞
踩
article
解决
Gradle
同步错误:
Unknown
Hos
t
‘
services
.
gradle
.
org
’_un...
在ko
t
lin项目开发过程中,初始化项目时遇到了“
Unknown
hos
t
‘
services
.
gradle
.
org
’”...
赞
踩
article
Error:Unknown
host
'
services
.
gradle
.org'. You may ...
Error:Unknown
host
'
services
.
gradle
.org'. You may
need
to ad...
赞
踩
相关标签
docker
网络
运维
host模式
容器
android
adb
root
fastboot
hi3861
wifi
鸿蒙
HarmonyOS
海思
android studio
nginx
编译错误
URL not found
linux
centos