« | July 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | | | |
| 公告 |
☆★☆★☆★☆★☆★☆ 生活的点点记录,以及一些体会...........
喜欢是淡淡的爱,爱是深深的喜欢.
时间会见证一切.......................
欢迎大家指出错误,共同进步..........
期待中..............................
☆★☆★☆★☆★☆★☆ |
Blog信息 |
blog名称: 日志总数:162 评论数量:312 留言数量:0 访问次数:940536 建立时间:2005年5月17日 |

| |
[wince study]USB设备驱动程序导读(8) 文章收藏
oceanblue 发表于 2008/5/12 16:24:57 |
带着上次留下的疑问,我们继续来学习操作系统如何通过USBDISK读写USB设备的。我们先看USB\CLASS\STORAGE\DISK\SCSI2\usbdisk6.def文件。在这个文件中可以看到,该DLL一共导出了14个函数,其中两个是上次内容当中被设备驱动程序调用的UsbDiskAttach和UsbDiskDetach,余下的是一组以DSK开头的流驱动接口,易见,USBDISK是以流驱动的形式向操作系统提供服务的。
为了清晰起见,以下大量的程序我们并不学习,而只关心设备读写,因此我们来看DISK.C这个程序文件。找到DSK_Read和DSK_Write两个函数,令我们大失所望,因为这两个函数都是形如 UNREFERENCED_PARAMETER(pDevice); UNREFERENCED_PARAMETER(pBuffer); UNREFERENCED_PARAMETER(BufferLength);
DEBUGMSG(ZONE_ER |
|
[wince study]USB设备驱动程序导读(7) 文章收藏
oceanblue 发表于 2008/5/12 16:23:24 |
我们来看程序的第4行,这里有一个判断语句,它是在判断插入的设备是否是USBMSC_INTERFACE_CLASS类型的,这个常量是在usbmsc.h文件中定义的,也就是说如果设备不是USB存储设备,那么就结束这个函数,也就是此驱动只能处理USB存储设备。
当发现设备符合此驱动程序的要求后,就通过函数ParseUsbDescriptors()来解析这个设备,这个函数在下面的程序中将被实现,我们可以看一下该函数的函数体,很显然,它是在为设备进行各种配置,这就不多说它了。
再往下,分配内存,设置标志,从注册表中读取信息。注意,这里读取到的注册表信息是Drivers\\USB\\ClientDrivers\\Mass_Storage_Class和bInterfaceSubClass变量组合成的注册表键下的值,具体可参阅源程序,这个注册表键下放置的内容是 [HKEY_LOCAL_MACHINE |
|
[wince study]USB设备驱动程序导读(6) 文章收藏
oceanblue 发表于 2008/5/12 16:21:22 |
在继续向下看,我们发现了USBDeviceAttach()函数,这可是最重要的地方了,当有USB设备插入插口以后,操作系统是如何识别它的呢,如何将其做为一个文件夹加以访问的呢?我们就来解开这里的谜团。 为了我们方便说明,我将此程序简化如下:
后面的程序将以此行号进行说明。 |
|
[wince study]USB设备驱动程序导读(5) 文章收藏
oceanblue 发表于 2008/5/12 16:19:23 |
正如所料,接下来我们就进入到DRIVERS\USB\CLASS\STORAGE\CLASS文件夹下,接触USB设备驱动程序。
我们先来了解两个头文件,分别是STORAGE\INC\usbmsc.h和STORAGE\CLASS\usbmscp.h,其中前者是USB存储设备公用的头文件,后者是需要按照自己的设备更改的头文件。我们先来看前者。
在usbmsc.h这个头文件中,前边定义了很多常量,包括子类和协议的常量,这是从哪里来的呢?前文我们已经提到过,这些量值是依据USB设备规范得来的,在规范上都作了定义,所以此处的值必须与USB规范中的相一致。再向下的命令块结构体和数据块结构体是用来与USB设备通讯用的,可以通过这两个结构体的实例与USB设备传输数据。 下面的函数原型就不说了,前文提到过,在这里只记得有这几个函数就行了。
&nbs |
|
[wince study]USB设备驱动程序导读(4) 文章收藏
oceanblue 发表于 2008/5/12 16:16:33 |
在上次了解了所有USBD接口函数以后,我们已经有了很多基础知识了,回顾USB样例的文件夹结构,我们还能记得USB\CLASS\COMMON这个文件夹下是存放所公共部分的源程序,它是微软专门抽象出来的能为大多数USB设备驱动程序服务的一些结构体以及函数的封装,我们这次再来概略的了解一下这里面的源程序。
这里面包含了三个程序,分别是: remlock usbclient utils 下面我们分别来了解一下这三个程序的功能和接口,很显然,USB设备驱动程序肯定是会用到这其中的一部分函数的,因此我们不一定需要读 |
|
[wince study]USB设备驱动程序导读(3) 文章收藏
oceanblue 发表于 2008/5/12 16:09:12 |
“广告无限,时间有限”,别看广告了,快回来吧。(发现自己是广告天才,不过耳熟的很,好像游戏上面都有类似的话)
此前,我们共同了解了USB驱动在CE中的位置结构,也了解了样例驱动程序的文件夹结构,接下来,我们就要了解一下USBD为我们提供了哪些接口来实现设备访问以及驱动程序管理的功能。找到USBDI.H,不要告诉我你找不到吧,不管你用什么编辑器,记事本也好,PB也好,VC/EVC或者VS都行,打开它,我们一起来了解一下USBD为我们提供了什么。
我们首先看到的一个大的结构体就是_USB_DRIVER_SETTINGS,注意这个结构体不是USB规范中的USB设备描述,而是为了CE设备管理器加载USB设备驱动程序方便而建立的。该结构体中对供应商描述、设备描述和Interface的描述是用来匹配注册表中对USB设备驱动的注册表键,当设备管理器发现你设备的这些值与注册表中的这些值相符时,就会加载你的 |
|
[wince study]USB设备驱动程序导读(1) 文章收藏
oceanblue 发表于 2008/5/12 12:28:26 |
随着USB设备的不断增加,我们这些开发人员也就多了对USB设备进行驱动程序开发的工作。但是对于很多初学者来说,存在以下三个困难: 一是对WinCE的驱动程序结构了解得太少,没办法得心应手的专注于驱动程序的开发工作; 二是对WinCE自带的USB驱动程序的例子没有弄懂,看到一大堆文件夹结构和源程序思维混乱; 三是几乎没有什么中文的参考资料,不知如何下手。
第三条是很多开发人员都遇到的,我也一样,很多朋友问我有没有什么资料,我也只能说抱歉,因为我也同样有这个问题,一切都靠自己的黑暗中摸索,因此本文不谈第三条。 第一条是可以找到资料 |
|
[wince study]WinCE 5.0 的3 種 USB Function Driver 文章收藏
oceanblue 发表于 2008/5/12 8:50:44 |
Win CE 5.0 下面 USB Client Function Driver 目前有提供
Serial Profile (Emulator a Serial Port, @CESYSGEN_MODULE_SERIALUSBFN, set SYSGEN_USBFN_SERIAL)
RNDIS Profile (Emulator a Network Card, @CESYSGEN CE_MODULE_RNDISFN, set SYSGEN_USBFN_ETHERNET=1)
Mass Storage (Emulator a Disk Device, , @CESYSGEN CE_MODULE_USBMSFN, set SYSGEN |
|
[wince study]S3c2440A平台HIVE注册表+binfs的实现 (转) 文章收藏
oceanblue 发表于 2008/5/9 15:59:01 |
今天总结一些实现的过程和原理。 我的例子是基于samsung S3C2440A+samsung ONENAND+WinCE5.0的,开发平台是platform builder 5.0,首先我们基于RAM register的image已经可以正常跑起来了,Flash除了放置image外其他的空间为用户提供文件系统,这部分的驱动程序是用三星的PocetStoreII15。
先来回味一下底层的东东,我们的Image主要由两部分组成:XIPKERNEL.bin和NK.bin,XIPKERNEL.bin中的东西就是那些WinCE中比较核心的又需要经常加载的一些程序和DLL文件,这些文件会被Boot Loader在刚启动的时候拷贝到RAM中去,这样就可以在RAM中XIP(Excute in place)了。在NK.bin中的基本上是需要但不至于要常驻内存的一些程序和DLL了,比如我们BuildIn下的大部分驱动,比如微软的IE,mediaplayer等应用程序,甚至连设备管理器device.exe也可以放到这里面,这些文件只有在需要的时候才被复制到内存 |
|
|