发新话题
打印

WinCE驱动开发问题精华集锦四

WinCE驱动开发问题精华集锦四

WinCE驱动开发问题精华集锦

[日期:2008-04-30]来源:中嵌网  作者:aea22[字体: ]
为什么WINCE目录下的例子用build+sysgen能够编译成EXE文件,而我添加的例子就不能编译呢?
如果这个例子是一个应用程序,那么肯定包括代码文件(.h .c .cpp)和资源文件(.rc和其它资源文件),build工具根据source文件内容把代码文件编译成lib文件,资源文件编译成.res文件,sysgen工具根据makefile文件内容将source文件中列出的需要链接的各个库文件合并成一个EXE文件。所以说关键在于makefile文件,WINCE目录下凡是能够用build+sysgen编译的都在makefile中有如何链接的设置,而我们添加的例子当然没有在makefile中找到如何链接的设置,nmake工具就会提示不知道如何创建。  
  
pcienum.exe
干什么用的?
如果你要开发某一个PCI设备的驱动程序,首先要知道这个PCI设备的信息(如VendorIDDeviceIDBaseClass SubClass)和PCI总线的信息。运行这个pcienum.exe就能得到相关信息。pcienum.exe提供了源码,位置\Public\ Common\Oak\Drivers\Ceddk\Test\Pcienum  
  
wince
下如何让操作系统进入待机模式?又如何把它激活?
通过注册表就可以设置,前提是你的驱动和硬件都支持。注册表项参见标题为“GWES Suspend Time-outs”的帮助文档。  
[HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Power]  
    "BattPowerOff"=dword:300  
    "ExtPowerOff"=dword:0  
    "WakeupPowerOff"=dword:60  
    "ScreenPowerOff"=dword:0  
  
现有一个GPRS模块,如何通过GPRS连接到Internet  
1
、先在内核中加入WAN下面的几个组件,如RAS/PPPTAPIWINCE采用unimodem驱动,所以不必担心没有Modem驱动的支持。  
2
WINCE启动后新建一个拨号连接,比如名称叫“gprs1”,输入用户名、密码、电话号码。电话号码不同,所采用的模式不一样,例如“*99#”GPRS模式,“17201”是普通的数据模式,速度差很多,价钱也差很多。  
3
、开始连接,连接过程会在对话框中显示,直到显示连接成功  
4
、打开浏览器或者自己开发的通讯软件测试网络连接情况。  
5
、关闭连接。  
6
、保存[HKEY_CURRENT_USER\Comm\RasBook\gprs1]下的所有数据,添加到project.reg中,重新编译后内核中就有了一个拨号连接“gprs1”  
7
、调用RAS函数可以修改拨号连接“gprs1”的参数,如用户名、密码、电话号码,但是不能修改硬件设置,如波特率、串口、数据位、停止位等。RAS函数还能够拨号、挂断。为了修改波特率可以多保存几个拨号连接,也可以直接调用TAPI开发拨号软件,另外WINCE自带的拨号连接是有源码的,位置在\ PUBLIC\COMMON\OAK\DRIVERS\NETSAMP\CONNMC
采用基于HIVE的注册表如何删除用户保存在注册表中的数据,恢复到出厂时的注册表?
用户修改的数据保存在user.hv文件中,直接删除一定失败,所以不能通过删除文件实现恢复出厂设置。微软考虑到了这个问题,在WINCE启动过程中 filesys.exe加载注册表时会调用OEMIoControl函数并传递一个IOCTL,这个IOCTLpkfuncs.h中定义如下:  
#define  IOCTL_HAL_GET_HIVE_CLEAN_FLAG  CTL_CODE(FILE_DEVICE_HAL, 49, METHOD_BUFFERED, FILE_ANY_ACCESS)  
filesys.exe
会分别传递参数HIVECLEANFLAG_SYSTEMHIVECLEANFLAG_USERS,如果返回值为TRUE那么filesys.exe清除原来的注册表文件,如果返回值为FALSE那么filesys.exe保留原来的注册表文件。默认WINCE并没有实现这个IOCTL,所以OEM要删除注册表文件就必须先编写这个IOCTL代码。代码的例子可参考标题为“IOCTL_HAL_GET_HIVE_CLEAN_FLAG”的帮助文档。另外必须在ioctl.hioctl.c两个文件中编写该代码。在ioctl.c文件中找到 const OAL_IOCTL_HANDLER g_oalIoCtlTable[],添加IOCTL和对应的处理函数。要进一步了解这个全局数组,参见标题为“IOCTL Library”的帮助文档。
如何在不删除必要组件的前提下减小内核文件长度?
要减小内核文件长度首先要在使用PB的定制内核向导中选择自定义,也就是说对于每个组件都由自己来选择,而不是选择PB的标准配置。但减小内核文件长度最有效最直接的办法是缩小字体,尤其对于东亚字体,采用字体压缩技术并且选择合理的字库文件将明显缩小文件长度。  
1
、在定制内核时选择AGFA AC3 Font Compression组件。SYSGEN变量为SYSGEN_AGFA_FONT  
2
、参考标题为“East Asian Font Versions”的帮助文档,从中选择你需要的字库文件加到内核中,从文档可以看出加AC3压缩比不加压缩在文件长度方面差距很大。
如何得到WAV文件播放的总时间?  
1
、直接读取wav文件头信息,从文件起始地址偏移28个字节长度为4个字节保存的是每秒钟播放的字节数,从文件起始地址偏移40个字节长度为4个字节保存的是声音数据的总的字节数,相除就是播放时间。  
2
、调用IGraphBuilder::RenderFile打开一个wav文件,然后通过IGraphBuilder得到IMediaSeeking指针,再调用IMediaSeeking::GetDuration得到总的时间(结果要除以10000000),IMediaSeeking:: GetCurrentPosition得到当前播放时间。
如何在Dialog-Based程序中加入menubar
先调用CommandBar_Create再调用CommandBar_InsertMenubar
请问MultiByteToWideChar_TLTEXT的区别?  
MultiByteToWideChar
函数转换的对象可以是常量也可以是变量。其它只能转换常量。_TTEXT会根据当前系统是否定义_UNICODE宏来决定是否转换,而L就是转换成宽字符,当然也包括其他类型常量的转换。
在用UBS线缆通过ActiveSync同步有效的情况下,如何插上USB线缆后WINCE自动与PC同步?  
1
、新建一个拨号连接,假设名称为“usb1”,选择连接类型为直接连接,并在连接设备里选择通过USB线缆连接。  
2
、将注册表[HKEY_CURRENT_USER\Comm\RasBook\usb1]下的数据添加到project.reg或者platform.reg中。  
3
、在[HKEY_CURRENT_USER\ControlPanel\Comm]下添加如下:  
"AutoCnct"=dword:1  ///
直接连接  
"Cnct"="usb1"       ///
连接名称  
4
、重新编译内核。为了节省编译时间也可以在内核工程下搜索*.reg文件,将23步骤中的注册表数据添加其中,然后直接make image
如何通过进程句柄来获得该进程的主窗口句柄?
好像没有API能够通过进程句柄直接获得主窗口的句柄,因为并非每个应用程序都带UI。但是可以反过来,先枚举当前系统所有主窗口,然后根据每个窗口的句柄调用GetWindowThreadProcessId函数得到进程的ID,再调用OpenProcess得到进程句柄,与现有的进程句柄比较。
我做的显示驱动DLL已经编译成功了,但是在加载显示驱动的过程中弹出话框,提示如下:  
unhandled exception  in  gwes.exe  (0xc0000005 access violation)  
提示的错误——地址访问非法,表明你的驱动程序代码并没有在读写数据前添加SetKMode(TRUE)或者SetProcPermissions (0xFFFFFFFF)函数让线程能够访问任何进程的地址空间。你可以调用 IsBadReadPtrIsBadWritePtr函数检测地址是否能够合法访问。编写和gwes有关的驱动程序应该首先调用SetKMode(TRUE)或者SetProcPermissions(0xFFFFFFFF) 函数,这是一个好习惯。
请问在嵌入式系统中如何设置GPRS拔号用的APN
对一个拨号连接比如我的连接单击鼠标右键,在弹出的菜单中选择属性,然后单击配置”—“拨号选项,在附加设置中添加AT命令如“+cgdcont=1,"ip","cmnet"”“cmnet”位置即为APN  
  
WINCE
IP Phone功能如何?  
WINCE
voip需要c-s-c结构,既需要服务器的中转,而skype采用第三代p2p技术就不需要中转,但是在gprs下也做不到语音流畅。skypepocket pc版本,但是无线方面需要wlan或者cdma
三星ARM平台如何定义自己的中断ID
S3C2410 为例,在oalintr.h文件中定义中断ID,也称SYSINTR,例如 #define SYSINTR_MYINT   (SYSINTR_FIRMWARE+20),最大值不能超过SYSINTR_FIRMWARE+23。然后在ARMint.c文件中找到 OEMInterruptHandler函数,用if (IntPendVal == INTSRC_XXX) 判断当前发生的中断源号,然后返回 SYSINTR_MYINT。内核分别调用OEMInterruptDisable(禁止当前中断)、OEMInterruptDone(中断处理结束)、OEMInterruptEnable(当前中断有效)三个函数,参数都为中断ID,在这三个函数中用 case SYSINTR_MYINT判断当前要处理的中断。
如何开发软件从PC端复制文件到基于WINCE的设备?
调用RAPI Remote Application Programming Interface)函数,此函数集由桌面计算机调用,由基于WINCE的设备执行。一旦连接上就可以在桌面计算机端调用RAPI。通过注册表还可以限制RAPI能够访问目录的范围。具体参考RAPIRDP(远程桌面协议)。
请问如何对NandFlash分区、格式化?
你看看WINCE420\PUBLIC\COMMON\OAK\DRIVERS\ETHDBG\BOOTPART\bootpart.cpp,在Eboot中先要调用BP_LowLevelFormat(  
DWORD dwStartBlock,  DWORD dwNumBlocks, DWORD dwFlags)
flash的一个区域建立空的MBR,然后连续两次调用 BP_OpenPartition(DWORD dwStartSector, DWORD dwNumSectors, DWORD dwPartType,  BOOL fActive, DWORD dwCreationFlags)函数来建立BINFSFAT分区。建好后,将nk.bin烧入binfs 分区中。
要做个弹出对话框具有 always on top 属性,如何实现?
调用SetWindowPos(.. , HWND_TOPMOST, ...., SWP_NOACTIVATE)  
  
s3c2410
WINCE下网络PING一会就断,如何解决?
原因在于中断处理程序把已经产生的中断标志清除掉了,这样就丢失一次中断。因为原驱动里配置中断为上升沿触发,一次中断丢失就导致不会再产生中断信号跳变,因为只有在中断服务中读取了cs8900 Interrupt status queue寄存器后,才会产生下一次中断!解决办法:  
1
、在cfw.c文件中全局定义BOOL Inited = FALSE  
2
、修改OEMInterruptEnable()case SYSINTR_ETHER: 下面的语句为:  
if(Inited == FALSE)   
{   
s2410IOP->rEINTPEND = 0x200;   
s2410INT->rSRCPND = BIT_EINT8_23;   
if (s2410INT->rINTPND & BIT_EINT8_23)   
s2410INT->rINTPND = BIT_EINT8_23;   
Inited = TRUE;   
}   
s2410IOP->rEINTMASK &= ~0x200;   
s2410INT->rINTMSK &= ~BIT_EINT8_23;   
break

注:本解决办法转载于http://stoned.blogchina.com/stoned/3083045.html,非我本人研究成果。
已经搜索到文件,如何用CListBox以图标形式显示出来?  
CListCtrl        ListCtrl;  
CImageList      ImageList;  
ImageList.Create(IDB_BITMAP, 48, 2, RGB(0,0,0));  
ListCtrl.SetImageList(&ImageList, LVSIL_NORMAL);  
ListCtrl.InsertItem(iListIndex, strItem, 1);   
  
如何改变控制面板中电源属性对话框的尺寸?   
1
、需要修改对话框的尺寸是因为对话框是以资源方式加载的,不会根据当前系统显示分辨率而自我调节尺寸。  
2
、安装WINCE后有一些组件(feature)的资源文件*.res就已经有了,如果你不改变,那么build内核的时候PB只是把这些.res复制到工程目录下,然后与*.obj合并成EXEDLLCPL。所以修改了.rc文件里面的对话框尺寸后要重新编译.rc文件为.res文件,然后再覆盖原来 WINCE自带的.res文件。  
3
、改变对话框尺寸有两种办法:一种方法是更改系统字体字号,系统字体的字号变化会影响对话框的尺寸,但是缺点是所有系统字体有关的UI都会改变。另一种是在.rc文件中调整对话框尺寸,然后编译成.res文件,再将.res复制到对应的语言目录里,比如目录名为0804(中文),再执行Rebuild命令重新编译内核,或者执行sysgenbuild。在研究中我发现.res文件虽然能够直接用EVC打开、修改、保存,但是和其它Obj链接成EXEDLLCPL后并不能运行,所以还是建议读者用CE自带的rc工具编译最好。读者可在PB的命令行中键入“rc /?”了解rc.exe工具的用途和参数。
使用EVC build之后连接模拟器的时候,提示download file等了一会又出现download failed
一般这样的问题从下面几个步骤解决:  
1
、如果之前能启动模拟器而现在不能,那么先clean然后重启计算机再build  
2
、如果开发的主机为WINXP+SP2,可能存在与EVC模拟器不兼容的情况,检查C:\boot.ini,将/noexecute=optin改为/execute=optin  
3
、检查你的模拟器是否能运行,假设你正用的SDK名称为MYSDK,单击菜单tools—configure platform manager,选择 MYSDK—MYSDK emulator,再单击properties—test,看看模拟器是否能够启动,如果能启动那问题就不大。  
4
、单击菜单build—update remote output files,看看模拟器是否能够启动。  
5
、如果上述办法均不行,关闭EVC然后重新建立一个新的工程,编译,看看模拟器是否能够启动,如果能启动说明原来工程出了问题,最好恢复原工程的备份。
如何设置能够自动拨号、禁止自动拨号?
[HKEY_LOCAL_MACHINE\Comm\Autodial]下是自动拨号的注册表设置。  
Enabled=DWORD:1          ///
是否能够自动拨号  
FailRetryWaitMS=DWORD    ///
如果失败再次拨号的等待时间  
RasEntryName1= REG_SZ     ///
自动拨号采用的拨号连接名称
更多细节请参考标题为“Auto Dial Registry Settings”的帮助文档。

TOP

发新话题