USB开发中需要弄清的一些概念

摘要: USB接口芯片 USB接口芯片一般是一块专用MCU,集成USB电气层协议。而USB协议就是USB固件做的事了,也有一部分USB协议MCU会集成 USB固件 一般地,USB设备需要一个固件程序来处理USB协议,以及设备相关的内容。比如一个USB的数据采集卡,固件就是除了处理USB协议,就是负责采数据到端点。而读取数据就是设备驱动做的事了。再比如,USB设备配置时,使用控制传输,里面有一些错误处理也是... 阅读全文
posted @ 2009-05-29 19:22 devcfei 阅读(467) 评论(0) 推荐(0) 编辑

IRP方式通知Win32

摘要: 基于IRP方式的通知有一个重要的细节,一个设备句柄只能有一个IRP Pending,这是我实践中得出的结论,我并没有仔细深入研究,并且假设这个细节是正确的。即一旦对一个设备发出IRP,并且IRP没有完成,那么就无法再次发送IRP,调用线程将永久阻塞。这会引发一系列问题。 企图绕过阻塞的线程 无论同步操作时在IRP上阻塞,还是异步操作后在事件上阻塞,都是阻塞调用线程,线程无法再次发送IRP,那么创建... 阅读全文
posted @ 2009-05-29 19:16 devcfei 阅读(283) 评论(0) 推荐(0) 编辑

KMD使用Win32事件

摘要: KMD可以设置Win32事件有信号,当KMD内部发生了某些事情,需要Win32来做某些工作时,就可以使用这种手段步骤1.KMD内部保存KEVENT对象指针,Win32使用IOCTL方法传递Win32事件句柄2.KMD转换Win32句柄得到KEVENT对象指针3.使用KeSetEvent,和KENENT对象指针参数,使Win32事件有信号4.不需要使用该事件时,KMD要释放KEVENT对象 /*Wi... 阅读全文
posted @ 2009-05-29 19:14 devcfei 阅读(431) 评论(0) 推荐(0) 编辑

IO请求包-IRP

摘要: IRP(IO请求包)用于win32和驱动程序通讯,NT内核有一个组件叫做IO管理器。IO管理器负责IRP的分发,驱动程序里创建好设备并且创建好符号链接后,Win32就可以加载驱动了。而要让一个驱动可以处理IRP,必需给驱动添加IRP处理例程。 添加的方法就是再DriverEntry里面对驱动对象DriverObject操作。该参数是一个指针,指向驱动对象,驱动对象内部有一个MajorFunctio... 阅读全文
posted @ 2009-05-29 19:11 devcfei 阅读(4577) 评论(0) 推荐(0) 编辑

加载驱动程序

摘要: 一个KMD都需要创建设备和符号链接,它们分别为kernel和win32提供了名字,这样kernel和win32就可以正确地使用KMD相关例程 IoCreateDevice IoDeleteDevice IoCreateSymbolicLink IoDeleteSymbolicLink 查阅DDK文档 /*driver.c*/#include <ntddk.h>#define FILE_... 阅读全文
posted @ 2009-05-29 19:03 devcfei 阅读(2208) 评论(0) 推荐(1) 编辑

创建一个驱动程序

摘要: Windows NT内核下的驱动通常称为KMD(Kernel-Mode Driver),下载并安装好DDK后,就可以编写KMD了。编写一个KMD至少需要notepad+ddk。DDK使用C语言编写,驱动的函数有一个新的名字,例程,实际上二者没有必要刻意区分一个KMD至少需要DriverEntry例程,和C语言中的main一样,DriverEntry是驱动程序的入口点,驱动程序加载时DriverEn... 阅读全文
posted @ 2009-05-29 18:53 devcfei 阅读(608) 评论(0) 推荐(0) 编辑

ARM-Linux开发步骤

摘要: 拿到一块YC2440(s3c2440)的开发板,经过几天的学习,我对arm-linux系统开发步骤有了一些认识。就以开发这个开发板为例,arm-linux开发工作大概分4个部分1. 硬件(hardware)2. 引导加载器(bootloader)3. 内核(kernel)4. 文件系统(file system)硬件我并不是硬件工程师,但我知道硬件的设计基本上是从性能,结构,可靠性等方面的需求方面来... 阅读全文
posted @ 2009-05-29 08:47 devcfei 阅读(2828) 评论(0) 推荐(1) 编辑