来源http://www.winu.cn/space-14160-do-blog-id-498.html
向往嵌入式开发其实已经很久了,但是作为学计算机的我,对电子方面的知识其实很欠缺,再加上从事了很久的MIS开发基本上都在做工程做项目,一直沉浸在DELPHI的世界中,早已将C语言丢脑后了。现在终于有机会开始接触嵌入式的开发,真的很开心。乱七八糟的了解了一些相关知识,急急忙忙的着手了,这里描述一下我的亲身经历。
经过一年的混乱学习、了解,大致明白了嵌入式的开发过程,于是在老板的急切催促中项目开始了。
最开始对于嵌入式还不甚明白的时候购买了一个款ARM2410的试验板(好贵呀!)心想以后生产可以让厂家提供PCB我们自己生产,后来随着对这个行业的了解,才明白,厂家根本不会也不会允许我这么做,人家就靠这个挣钱的。但在他们提供的技术资料和在网上大量搜集到的资料中,我拼凑出了一套自己的核心板,然后请我们老师按照这个思路绘制了我们自己的ARM2410的PCB核心板。
由于ARM的设计还需要一段时间,老板是不会等很久的,于是老板提出先用电脑PC作为主板先行进行CE的开发(使用WINCE相对来说开发起来较为LINUX简单)。
接下来,我连着几天开始了寻找主板的工作。
一、硬件 – 目标板
先是普通的电脑PC,其价格便宜但是做不到我们要求的低功耗。
接下来老板听说国外有用PC104的板子,于是开始四处寻找工业的主板,这时突然想起我一个同学所在的一家企业就是生产工业PC的,立刻联系,但是他们使用的芯片都是Intel或者AMD的且是军品,价格偏高,他们的104主板价格更高,他们推荐我寻找威盛的芯片,那个应该便宜。
于是找到了威盛,一番询价后发现价格也不很便宜但相对于Intel、AMD算便宜了。
后来我想到的研祥,跑去看了一下他们的PC104的主板价格和威盛的工业PC价格相当但性能偏低。
于是选用了威盛的一款主板[图]
这款主板最吸引我的地方在于它的很多接口全是以插针方式至于板上,安装使用起来都很方便。它有很多常用接口,感觉很不错 1G的CPU也足够嵌入式的设备了。
主板选定后,就是为它配置部件,先是买了一个256M的DOM卡,一根512M的DDR667的内存。
接下来就是输入输出设备,按照计划输入设备应该使用我们的面膜,但是面膜的接口问题有点麻烦,经过几天的寻找找到一家有做一个接口可将面膜的数据线转成PS2接口的公司,输出选用了LCD的液晶屏,问题最大的还是接口,需要选用一个VGA接口(操作系统能够直接支持),经过几天的寻找和与老板的沟通,在目前的产品上同意使用触摸屏作为输入设备,这下子键盘的问题就不存在了,可以找一个大一些的(机器上能放下的)液晶屏就行,最终找到一个6.4英寸的屏幕,大小刚刚好,配了一款6.4的触摸屏,液晶屏带一块VGA的转接板触摸屏有一个USB的转接板。一且准备就绪,回到公司,拆了一台没用的电脑,抢了它的电源,做了几个插座接VGA和PS2,这样我的硬件平台就搭好了(产品上的其它部分采用了ARM7的设计与我的主板通过COM进行数据通信即可)。
二、系统移植
硬件设备准备齐后,我的工作才算正式开始了
因为先前我就已经下载了Platform Builder 5.0,所以现在威盛的网站上下载了wince5.0的BSP包,PB好大,第一次安装不知道他的厉害,完全安装后发现硬盘所剩无几……而且发现使用起来也很占资源,之后我就把PB装到了另一台电脑上,专门做NK,我的电脑专门作应用开发。
这回首先出现了一个问题,就是如何引导WINCE启动的问题,在ARM中我知道需要一个BOOTLOAD来启动系统,但在X86下好像可以有一个更简单的方法,使用PC自己的BIOS来引导。这时我发现DOM卡是IDE接口,又没有读卡器之类的东西,每次写东西进去都要把电脑先关了,再把卡插上,再启动电脑,甚是麻烦。
首先就是启动的问题,我先做一个DOS的启动盘,按道理Format /s就可以在DOM盘上生成3个文件,但是不管我在WINDOWS下还是DOS下都没法使用/s这个参数,真是气死人了,后来无意间发现好像使用的format命令不对,于是经网友推荐找到了个矮人工具,使用这个format命令顺利的将DOM盘做成了启动盘,DOM盘能自己启动后接着就是引导CE了,找很多做资料,终于在PB自己的文件夹中找到了websetup.exe和cepcboot.144文件,用websetup解压cepcboot.144 (这里需要软盘的支持,没办法,从别人电脑上拆了一个软驱)在软盘上生成了一堆文件,我把它们考到了DOM盘(我没有替换那三个系统引导文件),我看了一个下AUTOEXEC.BAT和CONFIG.SYS文件看到了里面有很多种方式下载引导NE启动CE,但是我需要机器启动直接运行CE,启动后直接打开我的应用程序,所以最这两个文件进行了修改。
CONFIG.SYS文件只保留了如下信息,其他选择菜单全给删了
[COMMON]
buffers=10,0
files=30
break=on
lastdrive=Z
dos=high,umb
device=himem.sys /testmem:OFF
AUTOEXEC.BAT文件改成了这样:
set NET_IRQ=0
set NET_IOBASE=0
set NET_IP=192.168.1.17
cls
loadcepc /L:640x480x16 nk.bin
按照资料所说NET_IP那里是设置目标板的IP地址的
一切准备好了 接下来就是NK的定制了
开始对WINCE没有概念,网上介绍WINCE5.0的资料不多大部分都是4.2的,自己研究了半天才弄明白一些。
开始还没安装威盛BSP,选用了PB自带的X86平台的CEPC,胡乱选了一些组件,没作任何修改直接就按了[SYSGEN],的确生成了一个NK.BIN然后在我的电脑上试着用DOM启动引导这个NK启动,果然
我的屏幕上出现了WINCE的桌面,键盘鼠标都好(玩了几次后发现我的设置不能保存),然后将DOM卡插到了我的主板上,却迟迟不能进入界面,找不到原因。
后来尝试了多次还是不行,这才发现安装了威盛的BSP后在新建一项中会有一个威盛的平台供选择,于是……但是还是没有起来。于是询问了威盛的技术支持,他们经过尝试发现也起不来,这下麻烦了!但是他们的技术支持告诉我,是因为LAN用的是intel的芯片,威盛没有他们的驱动…………没办法他建议我自己下载一个这个芯片的驱动,他们下了一个说好像驱动不全怎么的。没办法,自己到intel的网站下到了驱动,安装后新建了工程,在third party中找到了这个驱动加进了项目。(随着尝试的次数增加以及找到的资料的增加,慢慢发现了,设定了选项其他组件要自行添加。)但是这个Intel网络组件上面却打这个叉,没管那么多[sysgen]后出来个NK,这次拿到主板上一试 哈哈!WINCE终于起来了。
接下来 问题又出现了 我接上了PS2的鼠标键盘,开始的时候挺好的后来做了几个NK,PS2的鼠标就不能用了,同时插上鼠标键盘两个就都不行,只插一个键盘就没事,但是USB的鼠标挺好使的。问题还没解决(因为我根本不需要PS2的鼠标,也就放过去了,估计是哪个组件没选好)新问题出现了,触摸屏驱动怎么安装呀!
我买的是国产的触摸屏控制器,卖家提供了一堆驱动,还有说明,看了之后让人更加头晕了。
按照触摸屏厂家网站提供的驱动下载了一个大包,里面包括了X86和ARM4I的USB驱动并附了一个说明书ManualCE.pdf,我当然应该安装X86下面的驱动啦!但是在X86驱动包下面又有一个Registry Setting for USB.txt文件,里面写着:
registerity setting for USB
<i>
[HKEY_LOCAL_MACHINE/HARDWARE/DEVICEMAP/TOUCH]
"DriverName"="Touchp.dll"
"CalibrationData"="102,102 1945,102 1945,1945 102,1945"
"BCLEFT"=dword:64
"BCRIGHT"=dword:64
"BCTOP"=dword:64
"BCBOTTOM"=dword:64
<ii>
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/14371_1/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBPort.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/14371_2/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBPort.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/291_1/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBPort.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/3823_1/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBPort.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/3823_2/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBPort.dll"
然而ManualCE.pdf中关于WINCE5.0 .net中却写着:
Add these two lines in Modules:
a) TouchKit utility:
TouchKit.exe C:/CEDB/TouchKit.exe NK S
DrawTest.exe C:/CEDB/DrawTest.exe NK S
Calibration.exe C:/CEDB/Calibration.exe NK S
UpdateEEPROM.exe C:/CEDB/Calibration.exe NK S
b)If users want to use USB module:
USBTouch.dll C:/CEDB/USBTouch.dll NK SH
c)If users want to use RS232 module:
TouchKit.dll C:/CEDB/TouchKit.dll NK SH
Add these lines for registry:
a) Add the registry setting for all modules:
[HKEY_LOCAL_MACHINE/Drivers/TouchKit]
“RBSIZE”=dword:800
“RBTIME”=dword:989680
“FLAGS”=dword:1----------------------->set 0x1 sofware filter enable
set 0x3000 update eeprom function enable
“ZfilterThreshold”=dword:800
“ZfilterBound”=dword:00100001
“SoundType”=dword:0----------------------->This is the default sound type
SoundType = 0 is no sound
SoundType = 1 is Beep in touch down
SoundType = 2 is Beep in lift off
b)If users want to use USB module:
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/14371_1/0_0_0/255_255_255/USB_TOUCH_Driver]
“DLL”=”USBTouch.dll”
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/14371_2/0_0_0/255_255_255/USB_TOUCH_Driver]
“DLL”=”USBTouch.dll”
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/4660_1/0_0_0/255_255_255/USB_TOUCH_Driver]
“DLL”=”USBTouch.dll”
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/3823_1/0_0_0/255_255_255/USB_TOUCH_Driver]
“DLL”=”USBTouch.dll”
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients3823_2/0_0_0/255_255_255/USB_TOUCH_Driver]
“DLL”=”USBTouch.dll”
c) If users want to use RS232 module1:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/TouchKit1]
“Dll”=”TouchKit.dll”
“Order”=dword:00000001
“Prefix”=”TKT”
“Index”=dword:00000001
“Context”=dword:1;--------------------->This is the COM Port index which users use
d)If users want to use RS232 module2:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/TouchKit2]
“Dll”=”TouchKit.dll”
“Order”=dword:00000001
“Prefix”=”TKT”
“Index”=dword:00000002
“Context”=dword:2;--------------------->This is the COM Port index which users use
但是上面的那些文件X86的包里根本没有[图]
然后在另一个WINCE5.0下面找到了这里所说的文件[图]
这个文件夹里的说明写着:
Salt TouchKit USB for Windows CE .NET installation Guide
Revision : 2.0.12.4515
OS : Windows CE .NET (CEPB 4.0/4.1/4.2) 5.0
Release Date : 11-15-2005
File list:
TouchKit.DLL - RS232 Touch Screen Driver
USBTouch.dll - USB Touch Screen Driver
TouchKit.exe - The TouchKit Utility
DrawTest.exe - The DrawTest Utility
Calbration.exe - The Calibration Utility
UpdateEEPROM.exe - The Update EEPROM Utility
language_e.reg - The English Language Registry Setting
language_tch.reg - The Traditional Chinese Language Registry Setting
language_sch.reg - The Simplified Chinese Language Registry Setting
language_jap.reg - The Japanese Language Registry Setting
language_kor.reg - The Korean Language Registry Setting
language_spa.reg - The Spanish Language Registry Setting
language_ita.reg - The Italian Language Registry Setting
language_ger.reg - The German Language Registry Setting
language_fre.reg - The French Language Registry Setting
language_dut.reg - The Dutchh Language Registry Setting
Notes:
Select the UHCI or OHCI USB Host Controller driver into your platform
which supported by the target device. And check the USB mouse can go
well at the same port.
Select the "Mouse" into your platform. This can find in:
"Catalog/Core OS/Display based devices/Shell and User Interface/Mouse"
1. Create an directory under c:/ Ex:"c:/CEDB"
And Copy All files to this directory.
2. Launch platform builder and open your platform workspace
3. Edit the PROJECT.BIB in the Parameter View of Platform Builder.
Add these lines in MODULES:
a)The TouchKit utility:
TouchKit.exe c:/CEDB/TouchKit.exe NK S
DrawTest.exe c:/CEDB/drawtest.exe NK S
Calbration.exe c:/CEDB/calbration.exe NK S
UpdateEEPROM.exe c:/CEDB/UpdateEEPROM.exe NK S
b)If you want to used USB module:
USBTouch.dll c:/CEDB/UsbTouch.dll NK SH
c)If you want to used RS232 module:
TouchKit.dll c:/CEDB/touchkit.dll NK SH
4. Edit the PROJECT.REG in the Parameter View of Platform Builder.
Add these lines for registry.
a)Add the registry setting for all module
[HKEY_LOCAL_MACHINE/Drivers/TouchKit]
"RBSIZE"=dword:800
"RBTIME"=dword:989680
"FLAGS"=dword:1-------------------------------->set 0x1 sofware filter enable
set 0x3000 update eeprom funtion enable
"BeepFrequence"=dword:1F4---------------------->Beep Frequence(x86 only)
"BeepTime"=dword:64---------------------------->Beep Times(ms)(x86 only)
"ZFilterThreshold"=dword:800
"ZFilterBound"=dword:00100001
"SoundType"=dword:0---------------------------->This is the default sound type.
SoundType = 0 is no sound
SoundType = 1 is Beep in touch down.
SoundType = 2 is Beep in lift off.
b)If you want to used USB module:
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/14371_1/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBTouch.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/14371_2/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBTouch.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/4660_1/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBTouch.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/3823_1/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBTouch.dll"
[HKEY_LOCAL_MACHINE/Drivers/USB/LoadClients/3823_2/0_0_0/255_255_255/USB_TOUCH_Driver]
"DLL"="USBTouch.dll"
c)If you want to used RS232 module 1:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/TouchKit1]
"Dll"="TouchKit.dll"
"Order"=dword:00000001
"Prefix"="TKT"
"Index"=dword:00000001
"Context"=dword:1;-------------------------------->This is the COM Port index which you used.
If you want to used RS232 module 2:
[HKEY_LOCAL_MACHINE/Drivers/BuiltIn/TouchKit2]
"Dll"="TouchKit.dll"
"Order"=dword:00000001
"Prefix"="TKT"
"Index"=dword:00000002
"Context"=dword:2;-------------------------------->This is the COM Port index which you used.
d)If you want to used other language for your utility:
#include "C:/CEDB/language_tch.reg"---------------------->Chose one language you want to use.
5. Build Platform.
6. You can used the TouchKit.exe to do the calibration and draw test. Befor you do the calibration or drawtest, you must select the module.
TUBX: is the USB module.
TKTX: is the RS232 module.
7. If you want to emulate the mouse right button. You can touch the panel and don't move for two or three seconds, the last time touch will be emulated the mouse right button.You can change the waitting time and the stop size in registry value "RBTIME" and "RBVALUE"
就这样,前前后后排列组合了N中方式尝试安装触摸屏的驱动,一直没有效果,最后先后找到这款触摸屏的厂家和经销商,都没能解决,在网上很多朋友也帮忙想办法,进行了很多种尝试,由于我的主板没有办法和PC进行远程连接、调试(网卡好像就是没好)activesync4.5不知道为什么就是连接不上。
最后还是触摸屏的经销商提了个建议,换一家台湾的触摸屏控制器,台湾生产的带WINCE5.0的驱动,但是贵了好多钱。没办法,先要把平台弄好,否则……
拿着台湾的控制器回来装上驱动,还是说人家的东西就是好一些,直接做成了CEC,很快触摸屏就OK了!
这么多天的辛苦总算没有白费,输入输出都OK了,接下来就是先前发现的一个问题,对系统的设置根本不能保存。分析了半天,发现WINCE的所有这些文件都是保存在RAM里的,估计是系统load NK后解压在RAM中,所以进行的设置,保存的注册表都在RAM中保存,一掉电就全没了。而且我在我的设备中根本找不到我的DOM盘??
在网上搜集了很久发现是一个设置组件没有添加。[图]
因为这里的设备组件我已经全部选择了[图]
这样一来DOM盘出现在系统中,接着就是保存注册表了,在网上终于找到了方法。
首先选择HIVE-based Registry方式
接着添加如下信息到project.reg:
; HIVE BOOT SECTION
[HKEY_LOCAL_MACHINE/init/BootVars]
"SYSTEMHIVE"="Documents and Settings//system.hv"
"PROFILEDIR"="Documents and Settings"
"Start DevMgr"=dword:1
"Registryflags"=dword:1
[HKEY_LOCAL_MACHINE/init/BootVars]
"DefaultUser"="default"
[HKEY_LOCAL_MACHINE/System/StorageManager/FATFS]
"FriendlyName"="FAT FileSystem"
"Dll"="fatfsd.dll"
"Flags"=dword:00000064
"Paging"=dword:1
"EnableCache"=dword:1
"CacheSize"=dword:0
"Util"="fatutil.dll"
"CacheDll"="diskcache.dll"
[HKEY_LOCAL_MACHINE/Drivers/PCMCIA/ATADisk]
"Dll"="ATADISK.DLL"
"Prefix"="DSK"
"Ioctl"=dword:4
"Profile"="PCMCIA"
; Indicate we are a power manageable interface and a storage driver
"IClass"=multi_sz:"{8DD679CE-8AB4-43c8-A14A-EA4963FAA715}","{A4E7EDDA-E575-4252-9D6B-4195D48BB865}"
[HKEY_LOCAL_MACHINE/Drivers/PCMCIA/Detect/50]
"Dll"="ATADISK.DLL"
"Entry"="DetectATADisk"
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile]
"MountAsRoot"=dword:1
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile]
"MountAsBootable"=dword:1
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile]
"Name"="IDE Hard Disk Drive"
"Folder"="hard disk"
[HKEY_LOCAL_MACHINE/System/StorageManager/Profiles/HDProfile/FATFS]
"EnableCacheWarm"=dword:0
; END HIVE BOOT SECTION
结果就OK了! Documents and Settings这个文件夹就出现在了Hard disk1 的下面了!
这样一来应用平台就搭建好了,接着就使用这个NK的工程做了一个SDK,基本上就是默认选项,就是在选择开发语言时 加了个.net framework的选项。
三、应用开发
接着就是应用程序了,对于我没用过VC的人来说VC真是很陌生,但是要开发WINCE,没办法,下载了EVC,装了自己的SDK,胡乱写个程序,哈哈,同样不能远程……
接下来怎么把我的程序弄到系统里呢?
·简单的方法,将程序通过U盘考到DOM盘上,做一个批处理每次启动运行DOM盘上的文件,把批处理放进WINCE的startup文件夹中。
新建一个Autoexec.bat文件添加:
cd..
cd hard disk1
DEMO.exe
·要么就是直接在定制时直接绑进NK里
在PROJECT.BIB中加入程序的名字按照格式,中间一空格分开
FILES
; Name Path Memory Type
; -------------- --------------------------------------------- -----------
DEMO.exe E:/WINCE500/Driver/Program/DEMO.exe NK
DEMO.LNK E:/WINCE500/Driver/Program/DEMO.LNK NK
然后将这个文件拷到Startup文件夹中,在project.dat添加
Directory("/Windows/Startup"):-File("DEMO.lnk","/Windows/DEMO.lnk")
顺道说一下LNK的创建
说来很奇怪,没研究过WINDOWS的快捷方式的结构,只是看到大家都这么用
新建一个文本文件比如:DEMO.lnk.txt添加
10#/Windows/demo.exe
DEMO.exe存放在目标板的windows文件夹下。保存后,重命名为DEMO.LNK 即可[图]
这样一来一切都完成了!!
剩下的就是应用程序的开发了!
四、偷懒
·在这之中有些地方觉得很麻烦,首先是NK的拷贝,总要把DOM插了拔,拔了插,总要不停的关机开机很麻烦!!
我想了一个方法,使用U盘,制作一个引导盘,将NK考到U盘上在主板上插入U盘,系统从U盘启动,执行Autoexec.bat 将NK考到DOM盘上
从网上下载了一个U盘引导工具,使用HDD模式将U盘格式化,加入一个Autoexec.bat的批处理文件即可。
·每次写的应用程序有不用能远程调试或者仿真,每次都只能使用U盘来回插拔,着实不方便,但是现在串口、网口都不能用,还没想到什么好的方法解决。
·每次[sysgen]都需要很长时间,一位好心的网友提供了一种快速的方法:
选择"Open Release Directory",[图]
进入到bsp所在的目录(就是我的BSP包的目录)[图]
用命令行 build来编译bsp[图]
编译好了以后,在PB菜单中运行"Copy Files to Release Directory"[图]
完了以后 再"Make Run-Time Image"[图]
速度要比正常sysgen快很多。
问题还在继续,这样至少平台已经构建好了,新的问题回头继续吧!
Green Wolf