随笔分类 -  WinCE

1
摘要:系统下面许多设备,比如键盘,串口,触摸屏,硬盘......这些设备什么时候被系统使用的?这些设备怎样被系统使用的?加载过程是怎么样的?设备如何加入系统协同工作的?为什么系统能检测到并使用即插即用的设备(如usb鼠标)?系统是怎么控制设备的电源的?CE管理设备的程序叫做DEVICE.EXE,这是一个独立的用户级进程,它主要负责跟踪,维护系统的设备信息并对设备资源进行调配.设备管理器包括即插即用设备管理,电源管理,io资源管理等等.结构示意图:目录树:c:/WINCE500/PRIVATE/WINCEOS/COREOS/DEVICE/[DEVCORE]设备管理器的核心代码部分.Devapi.cDe 阅读全文
posted @ 2011-05-03 16:14 andriod2012 阅读(444) 评论(0) 推荐(0) 编辑
摘要:设备管理器架构----Windows Embedded CE 6.0 R3原文:http://msdn.microsoft.com/en-us/library/ee484004(v=WinEmbedded.60).aspx设备管理器运行在Windows Embedded CE操作系统下,跟踪加载的驱动及其接口。它从内核中启动,并持续运行。当设备接口变的可用或不可用时,设备管理器能够通知用户。用户,或者系统本身可以让设备接口变的可用或不可用。对于那些暴露了流接口(stream interface)的设备接口,设备管理器会通知内核该设备接口支持CreateFile之类的文件操作来访问设备。设备管理 阅读全文
posted @ 2011-05-03 15:14 andriod2012 阅读(431) 评论(0) 推荐(0) 编辑
摘要:函数CHub::IdentifyOTGDevice中对m_bOtgDescriptor进行赋值 m_bOtgDescriptor = m_bOtgDesc[2];函数CDevice::CreateUsbConfigurationStructure中对m_bOtgDesc进行了赋值: //identify the OTG descriptor memset((PVOID)&m_bOtgDesc[0], 0, 3); memcpy((PVOID)&m_bOtgDesc[0], pDataBuffer + offset, 3);函数CHub::GetOtgDescriptor返回m_ 阅读全文
posted @ 2011-05-02 22:05 andriod2012 阅读(429) 评论(0) 推荐(0) 编辑
摘要:函数OTGHNP_Init中调用了函数UsbSocHnpInit。 UsbSocHnpInit(dwHnpRegBase, fLegacyHost);函数UsbSocHnpInit中对全局变量g_dwHnpRegBase进行赋值。 g_dwHnpRegBase = dwHnpRegBase;函数OTGHNP_IsADevice调用了函数UsbSocHnpIsADevice。函数UsbSocHnpIsADevice使用宏READ_HNPREG_ULONG读取数据: dwData = READ_HNPREG_ULONG(OTG_OTGSC_OFFSET); // 然后判断设备是否为A de... 阅读全文
posted @ 2011-05-02 18:18 andriod2012 阅读(162) 评论(0) 推荐(0) 编辑
摘要:wince usb驱动中的CHub::AttachDevice函数函数CHub::AttachDevice在HubStatusChangeThread中被调用。当有设备插入的时候,该函数被调用。函数的注释如下:// This function is called when a new device is attached// on port "port". After this procedure finishes, a configured// device will be added to the hub's port array该函数中,通过一个循环,判断当前 阅读全文
posted @ 2011-05-02 17:48 andriod2012 阅读(491) 评论(0) 推荐(0) 编辑
摘要:Viewbin是微软提供的一个命令行工具,在WinCE5.0和WinCE6.0中,可以在"/WINCE600/PUBLIC/COMMON/OAK/BIN/I386"找到他。Viewbin工具可以用来查看NK.bin文件。它可以从NK.bin中获得这个NK image的大小,运行的起始地址等。还能查看到里面所包含的模块,应用程序及相关的信息。Viewbin的使用格式如下:viewbin [parameter] [filename]举几个例子吧:1. viewbin -nk.binViewBin... nk.binImage Start = 0xC02C0000, length 阅读全文
posted @ 2011-04-28 11:50 andriod2012 阅读(268) 评论(0) 推荐(0) 编辑
摘要:vs2005 wince dll调试只需要简单的几个设置就可以了:1 在dll project的property设置,deployment中的remote directory设置为目标文件夹,即编译好的dll需要copy to的地方2 在property中设置,Debugging中的remote executable设置为会调用你dll的应用程序(当然是wince的应用)。只要你的dll是用debug版本编译的就可以在dll的solution中调试了转自:http://www.rosoo.net/a/200812/7200.html 阅读全文
posted @ 2011-04-27 15:09 andriod2012 阅读(168) 评论(0) 推荐(0) 编辑
摘要:IssueTransfer调用相关在CHub类中的AttachDevice函数中,经常会调用到类CControlPipe的函数IssueTransfer。本文介绍一下函数CControlPipe::IssueTransfer的调用过程,以及具体实现。首先说说对函数CControlPipe::IssueTransfer的调用。首先调用函数CControlPipe::IssueTransfer: status = pControlPipe->IssueTransfer( . . . TransferDoneCallbackSetEvent, // 回调函数 m_hHubStat... 阅读全文
posted @ 2011-04-22 18:20 andriod2012 阅读(295) 评论(0) 推荐(0) 编辑
摘要:Fun(){char SourceBuffer[102400] = {0};}在一函数中如上,申请了100K栈内存,出现的问题是只要一调用该函数,主线程马上终止并退出。一开始就想到了栈空间不足的可能,重启手机,再调试,问题依旧,google了WIN CE内存,找到了答案。栈是Windows CE内存类型中最容易使用的(自行管理)。在Windows CE中的栈像其它操作系统一样,是被引用函数的临时变量存储区。操作系统也用栈来存储函数的返回地址和在异常处理中微处理器寄存器的状态。 在系统中,Windows CE给每个线程一个分离的栈。默认情况下,系统中每个栈大小最大被限制为58KB。在一个进程中. 阅读全文
posted @ 2011-04-10 15:23 andriod2012 阅读(298) 评论(0) 推荐(0) 编辑
摘要:USB驱动中,共包含128个address。其中,给设备用的有127(0 - 127)个。第0个address是保留给root hub用的。 这128个address是通过一个包含四个成员的DWORD数组来实现管理的。 DWORD m_dwFreeAddressArray[4]; 一个DWORD包含32个bit,4个DWORD刚好128个bit,每个bit代表一个address。通过判断相应bit的0/1,就可以知道该address是否已经被使用。 每个设备的address必须是唯一的。所以,在为一个设备分配address时,就需要寻找未被使用的address... 阅读全文
posted @ 2011-04-06 16:54 andriod2012 阅读(154) 评论(0) 推荐(0) 编辑
摘要:该函数是USB驱动中,监视hub状态改变的线程函数。Root hub的监视线程在OTG_Init函数被调用时创建。External Hub的监视线程在External Hub插入到Root Hub时被创建。在线程刚启动的时候(在线程循环体之外),需要进行一些操作。// before we can process port changes, we need// to power all ports// 函数PowerAllHubPorts在CRootHub类中的实现为空。// 在类CExternalHub中,遍历Hub上的所有Port,// 调用函数SetOrClearFeature设置各个Po 阅读全文
posted @ 2011-04-05 22:09 andriod2012 阅读(760) 评论(0) 推荐(0) 编辑
摘要:USB驱动中,设备相关的类及其继承关系如下: CDevice (ADT) / / CFunction CHub (ADT) / / CRootHub CExternalHub父类CDevice中包含一个虚函数成员EnterOperationalState。各个子类中,根据需要,对该函数有不同的实现。各个子类的EnterOperationalState函数被调用的地方也不相同。其中,CRootHub的该函数,在函数CEhcd::DeviceInitializ... 阅读全文
posted @ 2011-04-02 17:06 andriod2012 阅读(273) 评论(0) 推荐(0) 编辑
摘要:前面有篇文章说到如何获取U盘描述符,最终我们读取描述符的时候是通过以下语句实现的: lpudd[i] = m_ppCDeviceOnPort[i]->m_deviceInfo.Descriptor; 将驱动中保存的Desctiptor信息,赋值到传入的buffer中。因此,引出来一个问题,驱动中保存的Descriptor信息是什么时候产生的?宏观上来讲,应该是USB Device插入的时候,驱动从USB Device读取相关信息,并最终生成Descriptor。但具体是怎么实现的呢?今天就来分析一下这个过程。 首要的工作当然还是顺藤摸瓜,一步步找到入口。一步步跟踪下来,发现最初的启动点上 阅读全文
posted @ 2011-04-01 18:19 andriod2012 阅读(571) 评论(0) 推荐(0) 编辑
摘要:前面有篇文章,说到了如何获取USB设备的Descriptor。其中有一个步,通过调用CHcd类的成员变量m_pCRootHub(CRootHub)的GetDeviceList函数,来获取Root Hub上设备列表。此处的Root Hub是在什么地方被初始化的呢?1、搜索代码发现,类CHcd中有一个成员函数SetRootHub,会给m_pCRootHub赋值。2、类CEhcd的成员函数DeviceInitialize,会创建一个CRootHub类的对象,并将该对象作为参数,调用函数SetRootHub。 SetRootHub( new CRootHub( deviceInfo, FALSE,T. 阅读全文
posted @ 2011-03-31 17:20 andriod2012 阅读(241) 评论(0) 推荐(0) 编辑
摘要:古老的unix提出了一切皆文件的思想,近代的OO提出了一切皆对象的理论,在unix的年代,人们迫切需要的是如何操作计算机而不是如何设计软件,毕竟那个时候软件设计其实比现在简单,就那么几种,关键是没有人会操作计算机,而OO年代,软件成了一种工业产品,此时不管是追求利润也好,XX也罢,人们的计算机操作水平被windows拉到了一个很高的层次--如此复杂菜单加菜单的方式。使用软件成了人们日常生活的一部分,因此问题就成了如何快速开发出软件,因此也就有了OO,甚至更新的面向YY编程。windows正好出现在unix年代和OO年代交替的时期,因此注定成为了一个很成功的操作系统,我不关心windows的应用 阅读全文
posted @ 2011-03-31 16:07 andriod2012 阅读(167) 评论(0) 推荐(0) 编辑
摘要:最近由于项目需求,需要获取U盘的描述符。而现有的usb otg驱动中没有提供这样的接口。没有办法,只能自己动手来修改了。本人刚开始接触USB 驱动,在代码的海洋中还比较迷茫。以下代码的实现是公司内一位大牛所作,本人只是借来学习一用。也算对USB驱动有个初步的了解。先罗嗦两句。刚开始看到文件夹usbotg,还有点不太理解是什么意思。当时在想,usb驱动为什么不直接放在usb文件夹下,而是放在usbotg文件夹下?otg是嘛意思?资料当然也很好找,usb家族里面,对该成员有详细介绍(http://www.usb.org/developers/onthego)。原来otg就是On The Go。传统 阅读全文
posted @ 2011-03-31 15:32 andriod2012 阅读(520) 评论(0) 推荐(0) 编辑
摘要:外国wince学习论坛收集http://www.archivum.info/microsoft.public.windowsce.platbuilder/——更新很快,资料很多,搜索功能很强的老外wince论坛(SD......SPI ,and so on.)http://www.tech-archive.net/Archive/WindowsCE/——很牛的一个网站,PB,EVC,EVB等都有很多例子。有Bruce Eitman等高人回答,是学习英语的好地方http://www.pocketpcjunkies.com/Uwe/Forums.aspx/wince-vc/200905/1——这个 阅读全文
posted @ 2011-03-21 17:26 andriod2012 阅读(130) 评论(0) 推荐(0) 编辑
摘要:Kernel Startup SequenceStartup() KernelStartup() ArmInit() OEMInitDebugSerial() OEMInit() KernelInit() HeapInit() InitMemoryPool() ProcInit() SchedInit() FirstSchedule() SystemStartupFunc() IOCTL_HAL_POSTINIT上表是基于ARM 的wince内核启动顺序.粗体字表示OEM 需要定制的部分.1. Startup() -> Startup.s位于%_WINCEROO... 阅读全文
posted @ 2011-03-21 16:06 andriod2012 阅读(201) 评论(0) 推荐(0) 编辑
摘要:1访问检查访问检查是用来检查函数的调用者是否有足够的权限去访问传递给这个函数的内存。访问检查是很必要的,它可以防止恶意的应用程序利用驱动程序去完成需要特权才能访问的资源。设备驱动程序由于在Windows Embedded CE 6.0中处于内核空间所以是一种特权程序,可以访问很多系统的资源。而工作在用户态的应用程序却不是。如果一个应用程序利用设备驱动程序去读写系统的内存,那么设备驱动程序实际上就相当于是授予了这个应用程序高的访问权限。所以在设备驱动程序中进行访问检查可以保护操作系统的内存不受恶意应用程序的破坏。在Windows CE 5.0中,设备驱动程序是通过MapCallerPtr API 阅读全文
posted @ 2010-08-31 22:22 andriod2012 阅读(111) 评论(0) 推荐(0) 编辑
摘要:File System Driver CreationA file system driver (FSD) is a dynamic-link library (DLL) that exports file system entry points that map to standard Microsoft® Windows® CE file system functions, such as CreateFile and CreateDirectory. When an application calls a file system function, and the f 阅读全文
posted @ 2010-08-22 15:19 andriod2012 阅读(148) 评论(0) 推荐(0) 编辑

1
点击右上角即可分享
微信分享提示