摘要: 在Wince下获取设备ID(Device ID)并不困难,只要简单地调用KernelIoControl即可.不过至于能否获得设备ID,并且获得的ID属于什么类型,则关系到驱动层的实现.而 设备ID的实现,在不同的平台有不同,比如在夏普的LH71404的开发板中,设备ID位于platform.c中.不过本文目的不关注如何设置或编写设 备ID,而仅仅是通过函数调用获得该设备ID而已. 首先我们来看看设备ID在winCE下的定义:typedefstruct_DEVICE_ID{DWORDdwSize;DWORDdwPresetIDOffset;DWORDdwPresetIDBytes;DWORDd. 阅读全文
posted @ 2012-06-26 18:37 nsoft 阅读(474) 评论(0) 推荐(0) 编辑
摘要: malloc和realloc是C标准函数,而new是C++的关键字,三者都能动态分配内存.但其中一些有意思的细节,你注意了么? 在开篇之前,我们首先需要明确一个概念,数据存储在内存中是无针对性的,换句话说,内存里面的数据,究竟是解释为字符串还是解释为整数,甚至是一个DWORD值还是一个拥有两个WORD的数值,它都是不知道的.如何解释内存中的数据,只和指向这段内存的指针有关. 我们可以用以下代码验证:intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){#defineM... 阅读全文
posted @ 2012-06-26 18:36 nsoft 阅读(413) 评论(0) 推荐(0) 编辑
摘要: 在WinCE平台下,使用evc或vs2005写出文字滚动的代码并不是一件难事,甚至可以说非常简单。 大体上来说,程序的失败与否取决于两个关键点: 1.准确计算文本的长度以及宽度; 2.定时刷新窗口。 现在我们来看看这两点分别有什么注意的地方。 首先是计算文本的长度。 其实要做到这点也并非难事,因为WinCE给我们一个现成的函数:GetTextExtentPoint。 函数的原型和解释如下: BOOL GetTextExtentPoint( HDC hdc, LPCTSTR lpString, int cbString, LPSIZE lpSize ); hdc [i... 阅读全文
posted @ 2012-06-26 18:34 nsoft 阅读(359) 评论(0) 推荐(0) 编辑
摘要: Lib和Dll,前者是运用于link使其,后者则于runtime起作用.按理说不该会有歧义,但偏偏微软定义DLL的调用时,又将lib给牵扯上,以 致于不少初学者会发出这样的疑问:为何我link了lib,运行时还需要Dll? 本文试图以微薄之力,以基础来解释这疑问.1.Dll Export Dll,动态链接库,从字面就知道是程序运行时才需要用上的玩意. Dll和Exe其实架构上非常相似,相同之处是两者都是二进制文件;不同的是,Exe以WinMain为函数入口点(console程序为Main),而Dll则是DllMain.除了该点,本质上Exe和Dll再无更多区别. 创建一个Dll不比一个Ex.. 阅读全文
posted @ 2012-06-26 18:32 nsoft 阅读(182) 评论(0) 推荐(0) 编辑
摘要: 确切地说,歌词显示并不是一件很困难的事情,并且实现的方式也多种多样,所以本文只讨论其中一种可能的实现。 本文所要探究的歌词显示类似于MTV的形式,同屏显示双行歌词。当任意一行歌词的显示超过限定的时间,则自动切换。 总体上来说,关键点有两个: 1.获取当前曲目的时间; 2.歌词的存储和获取。 首先我们来看第一点。如果要显示歌词,首要必须知道当前播放的位置。如果播放器是采用DShow写的,那么获取当前时间则是一件非常简单的事情: IMediaSeeking::GetCurrentPosition(pllPos) 返回的是一个LONG LONG类型,单位为100ns,足够用来表示文件的播... 阅读全文
posted @ 2012-06-26 18:30 nsoft 阅读(297) 评论(0) 推荐(0) 编辑
摘要: 和桌面清一色的采用explorer不同,嵌入式设备更多的采用是自定义的简单UI,即使是含有explorer的wince也是如此。因为对于嵌入式设 备而言,功能强大并不是主打,简单易用才是根本。以目前国内的手持车载设备为例,大部分的公司卖的都是硬件,利润很大一部分取决于硬件成本的多寡。并且, 每个系列的产品都会有不同的外围器件,而这也决定了无法所有的产品都用同一个UI程序。 虽然UI程序无法使用同一个,但从总体上而言,基本上是相同的;最有可能不同的地方无非是界面多了某些按钮,调用某些功能而已。另一方面,UI程序往往也需要配合产品的外观,风格尽可能和外观相符合。 于是由此,基于可重用性考虑,嵌.. 阅读全文
posted @ 2012-06-26 18:28 nsoft 阅读(989) 评论(0) 推荐(0) 编辑
摘要: 用过串口进行开发的朋友应该都知道,串口驱动是一个典型的独占设备。简单点来说,就是在成功地调用CreateFile打开串口之后,没有通过CloseHandle进行关闭,是无论如何都不能再次调用CreateFile来再次打开相同的串口。有的朋友可能会觉得莫名奇妙,为什么微软要在这上面做限制呢?但其实从另一个角度来讲,微软这么做是非常有道理的。以接收数据为例子,在驱动里面会有一定的缓存,用来保留一定量的数据。当通过ReadFile来获取数据时,驱动就会将缓存给清空,然后再继续接收数据。如果串口不是独占设备,可以多次打开,那么在读取数据上面就会有问题:应该什么时候才清空缓存?比方说,其中一个线程通过R 阅读全文
posted @ 2012-06-26 18:25 nsoft 阅读(451) 评论(0) 推荐(0) 编辑
摘要: 相对于硬件来说,软开关的软件代码更为简单,只需要检测DETECT_KEY即可。该功能的实现主要是通过GPIO,而wince并没有对GPIO 做上层定义,并且每款CPU的GPIO的操作方式又各自不同,所以本文无法给出一个完整可用的代码,只能用伪代码作为示例讲解。虽然是伪代码,但对于了解 其流程还是有一定的意义。void Power_On(){ ... //设置GPIO_SHDN为high SetGPIO_HIGH(GPIO_SHDN); ...}DWORD PWR_IntrThread(PVOID pParam){ .... //使能中断 EnableInterrupt(); //初始化... 阅读全文
posted @ 2012-06-26 18:07 nsoft 阅读(186) 评论(0) 推荐(0) 编辑
摘要: 添加应用程序到WinCE的开始菜单中应该是一个比较常用的功能,在产品定制的时候,添加本产品的应用到StartMenu中,让用户可以方便启动程序,下面就来介绍一下:先说一下原理,其实在WinCE启动以后,点击Start,然后点击Programs,里面所能看到的应用其实也都是以文件的形式存放的,它们存放在/Windows/Programs目录下面,都是一些快捷方式文件,这些快捷方式文件连接了真正的应用程序,就这么简单。理解了这个原理,也就清楚该怎么做了,步骤如下:1. 更改project.bib文件,添加应用程序,这里以Hello, world为例如下:hello.exe d:/WINCE600/ 阅读全文
posted @ 2012-06-26 18:04 nsoft 阅读(240) 评论(0) 推荐(0) 编辑
摘要: 介绍一下WinCE系统声音的定制。说白了,就是设置注册表。WinCE系统启动的开机音乐,点击触摸屏以及键盘输入的按键音,还有系统运行过程中的各种声音其实都是在注册表里面预先设置好的。这里做个简单介绍:整个WinCE系统声音注册表设置如下:[HKEY_CURRENT_USER/ControlPanel/Volume]"Key"=dword:10002"Screen"=dword:10002"Mute"=dword:7"Volume"=dword:99999999[HKEY_LOCAL_MACHINE/Snd/Sche 阅读全文
posted @ 2012-06-26 16:54 nsoft 阅读(231) 评论(0) 推荐(0) 编辑
摘要: 在WinCE下面,创建工程,然后编译是需要花很长时间的。当我们第一编译完工程以后,如果需要改我们的驱动或者BSP,我们是不需要重新编译整个工程的:1. 如果更改了driver,以WinCE6.0为例,我们可以在菜单里面选择“build”->“Open ReleaseDirectory in Build Window”,然后在弹出的命令行窗口中,通过dos命令切换到你要编译的driver的目录下面,然后运行“build”就可以了。也可以运行 “build -c”会强制把所有的文件都编译一遍。被编译后的driver的dll会被自动拷贝到release目录下面,然后再切换的工程的release 阅读全文
posted @ 2012-06-26 16:53 nsoft 阅读(136) 评论(0) 推荐(0) 编辑
摘要: S3C64xx系列的应用处理器芯片是三星主推的,三星目前推出了S3C6400和S3C6410,都是基于ARM11架构的,而且硬件管脚兼容,应该说大致的功能基本相同,比较明显的区别就是S3C6410带有2D/3D硬件加速。大致看了一下,S3C6410是一个强大的应用处理器,我不是在这里做广告,呵呵,因为我正在使用它,有了它,可以做很多东西。下面,我对S3C6410做个简单介绍,该芯片大小为13x13mm,424管脚,芯片架构如图:ARM Core:采用ARM1176JZF-S的核,包含16KB的指令数据Cache和16KB的指令数据TCM,ARM Core电压为1.1V的时候,可以运行到553M 阅读全文
posted @ 2012-06-26 16:50 nsoft 阅读(277) 评论(0) 推荐(0) 编辑
摘要: 我所说的ARM裸板调试是指ARM的PCB板制作完后,贴片回来的板子,不但没有任何程序,上电都是第一次。之所以写一篇blog,是因为最近调试了一块ARM板,基于S3C6410的,但是我们把原来的M-DDR DRAM和Nandflash全部都换掉了,硬件做了不小的改动。以前也做过类似的裸板调试,从ARM7到ARM9,再到现在的ARM11。今天就来写一篇ARM裸板调试的文章。如我前面所说,刚拿到ARM裸板的时候,首先就是要上电。不过上电之前,最好测一下电源和地是否短路。然后就可以上电了,我一般采用稳压电源,这样可以看到电流的大小,如果电流太大,说明硬件可能有问题,用手摸摸板子上的芯片,看看是否烫手, 阅读全文
posted @ 2012-06-26 16:49 nsoft 阅读(172) 评论(0) 推荐(0) 编辑
摘要: 目前的ARM处理器都支持多种启动模式,S3C6410和以前的Samsung的ARM处理器一样,通过外部管脚OM[4:0]的拉高拉低来决定是从哪个存储设备上启动。我认为S3C6410的User Manual并没有说的很清楚,所以我在最开始使用的时候,也对其启动模式有一些误解,下面就我个人的理解,介绍一下S3C6410的启动。先读一下S3C6410 User Manual的第3章 System Controller,在123页列了一张表,如图:这章表列出了S3C6410所支持的几种启动模式。首先介绍一下和启动模式相关的硬件管脚:OM[4:0]:选择启动设备及时钟源。OM[0]为0选择XXTlpll 阅读全文
posted @ 2012-06-26 16:48 nsoft 阅读(201) 评论(0) 推荐(0) 编辑
摘要: 我们在项目中更换了DRAM,所以需要重新配置S3C6410的DRAM控制器,结果发现S3C6410中的DRAM控制器还是挺复杂的。S3C6410支持两个DRAM片选,可以分别接最大256MB的内存,该处理器用的DRAM控制器是来自ARM的PrimeCell Dynamic Memory Controller(PL340)。只看S3C6410的Datasheet中的DRAM部分介绍是不够的,你还需要看PL340的技术参考文档,这个文档网上搜索一下就有了。想完全了解6410的DRAM控制器,必须两篇文档都看。我都看了,虽然没完全了解,但是比看6410的datasheet要强多了。我用的是mobil 阅读全文
posted @ 2012-06-26 16:47 nsoft 阅读(562) 评论(0) 推荐(0) 编辑
摘要: 在WinCE的环境下大家都使用过STL,单不知道大家有没有发现,这里有个致命的问题。如果容器的数据量比较大,会导致无法释放内存资源。不信?我们来看一下下面这个测试代码:[cpp] view plaincopy{std::map<DWORD,DWORD>mpTmp;//..........................(1)for(inti=0;i<1024*100;i++){mpTmp.insert(std::make_pair(i,i));}mpTmp.clear();//............................(2)}//................ 阅读全文
posted @ 2012-06-26 16:01 nsoft 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 自从在blog上公布了CMedia的完全源代码后,就陆续接到不少邮件和提问,无非是询问CMedia能播放什么样的格式;或是破口大骂,将CMedia损得一无是处,因为该类什么视频文件都无法播放;当然也有好的,对CMedia赞不绝口,称其为万能的播放类。 为什么同样的源代码,却能得到如此截然不同的评论呢?有感于此,我觉得应该写一写这其中的奥秘了。 如果你是DirectShow的高手,那么你可以不必再往下看了,因为之后的内容没有足以让你深究的价值,仅仅是给初学者的扫盲而已--并且还是尽可能地简洁。 我们首先要知道,我blog上的CMedia其实只是对DirectShow在文件播放方面的一个封装而已. 阅读全文
posted @ 2012-06-26 15:59 nsoft 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 用过IPhone的人应该都记得,IPhone界面切换时有个很有意思的效果:当前窗口从左边移出,显示窗口从右边进入。这个比WinCE原生的一闪然后方框出现的形态更富有想象力。 那么,我们能不能在WinCE上模拟出IPhone的这种效果呢?答案当然可以--否则也不会有此篇文章了。:) 效果的原理不是很复杂,但涉及到一些基础的知识,如果你是WinCE新手,可能理解起来有点吃力。不过没关系,让我们一点点来吧! 在WinCE里面,任何我们需要绘制的图像,最终还是要归结于HDC。HDC是WinCE的设备句柄,我们简单点认为,它就是一个显示的区域,你往里面写 了什么,那么它在屏幕上就会显示相应的内容。它的. 阅读全文
posted @ 2012-06-26 15:58 nsoft 阅读(552) 评论(0) 推荐(0) 编辑
摘要: WinCE的设备,估计会和SD卡打交道的应该不在少数。特别是一些软件,比如导航地图之类,加密数据用的就是SD卡的序列号。不过,严格来说,在 WinCE下面并没有专门针对于SD卡序列号的获取函数,而是针对Storage的。只不过SD卡也是Storage的一种,所以自然也能够被获取。 SD卡序列号的获取,是需要通过驱动的的。这么一说的话,熟悉的朋友可能就明白流程了:首先调用CreateFile打开驱动,接着使用DeviceIoControl来获取序列号,最后则是调用CloseHandle进行关闭。 一步一步来,先看看CreateFile的调用,如:[cpp] view plaincopyHANDL 阅读全文
posted @ 2012-06-26 15:55 nsoft 阅读(578) 评论(0) 推荐(0) 编辑
摘要: Wzctool是WinCE一个比较小巧实用的无线Wifi配置小工具,借助命令行调用该程序能够非常简单地设置wifi的相应参数,能够在一定程度上避免书写代码的繁琐之举。 这个工具是在编译系统的时候,添加Wifi组件后自动生成的。如果用户直接进到Platform Builder的..\WINCE500\PUBLIC\COMMON\OAK\DRIVERS\NETSAMP\WZCTOOL文件夹中直接输入 “build –C”得到的只是一个lib库而已。按理说,WinCE底下还应该做了某些东西令其生成exe文件的,但这里并不详细讨论了。 还是来看看wzctool的如何使用吧。将编译好的wzctool.. 阅读全文
posted @ 2012-06-26 15:53 nsoft 阅读(437) 评论(0) 推荐(0) 编辑