wince 5.0 桌面照片
wince 5.0运行时串口输出
安装pb5后,打了最新的2012补丁,在启动wince之前运行的boot程序中可以显示一幅静态图片,显示正常。右边不会出黑的部分。
问题有进展了。是这样的:在自己写的boot程序中已调用过lcd的初始化函数InitDisplay,在wince启动时就想可以不用再调用了,避免重复初始化。所以在,bsp: \Src\Kernel\Oal\init.c里OEMInit中调用InitDisplay这行给注释了。现在重新打开它,这个问题算是解决了。2440 cpu时钟的初始化在boot程序中进行过了,在wince oal就注释掉了相应的部分,没有出现问题。套用到lcd驱动初始化出了问题。
现在的新问题是,显示屏右半边是黑的,而且堆了一些莫名其妙的小图标。lcd驱动s3c2440dsp.cpp是lcd的驱动代码。
2014-4-7
现在桌面显示完整了,是S3C2440Disp.cpp里的设置问题,原先设置成24位,实际应该设置成32位,因为,为了地址对齐,24位数据实际占用32位空间,高8位空着未用。
背景怎么是红的,应该是标准桌面颜色才对。
修改了2440 lcd寄存器rLCDCON5的配置,原来配置有很多项,现在清空成0就正常了。
屏幕上有箭头形式的光标,用笔点下屏幕光标不见了,再也不出来了。应该是还没有校准触摸屏的原因。
校准触摸屏需要USB鼠标的支持,还好手头用个USB接口的鼠标,能派上用场。
重新修改BSP,添加组件:
Core OS--Windows CE Devices--Shelland User Interface--USBInterface--Mouse
Core OS--Windows CE devices--CoreOS Services--USB Host Support--USB Human InputDevice (HID) Class Driver--USBHID Keyboard and Mouse HIVE
然后sysgen下载wince后,USB鼠标可以用了。开始菜单-设置--控制面板--笔针--再校准,完成后。。。。
需要按“Enter“键,没有键盘,还需要USB键盘,但手头没有USB键盘。
如果用远程桌面,可以在pc windows里完程操作,这样可以省去开发板接USB键盘,现在
远程桌面--需要以太网支持--去移植以太网驱动
移植CS8900 wince驱动,进行中。。。。
在三星原厂的bsp的cs8900驱动中,未找到片选信号的设置,现在的对cs8900对理解,所有操作前要先设置片选信号有效,然后才能读写。
因为,cs8900是接口驱动的,不像usb device和nand,2440内置有控制器,内置控制器往往片选信号可以通过设置寄存器自动产生。
现在开发板上,cs8900的片选脚接在2440.nGCS3上。。。到这里似乎明白了,nGCSn是内存读写自动产生。
在cs8900hw.h中找到这个宏定义:
#define IO_PACKET_PAGE_BASE_ADDR 0xA7000300
是对cpu对cs8900所有读写操作的基地址,这个地址应该位于nGCS3范围内。
上面的宏定义的地址是MMU后的虚地址,对应的实地址,可以在如下文件中找到:
C:\WINCE500\PLATFORM\AS2440\Src\Inc\oemaddrtab_cfg.inc
2440手册里,定地址nGSC3的范围:
实地址范围:0x1800-0000到0x2000-0000,对应的地址范围应该是:
虚地址范围:0x8600-0000到0x8800-0000。MMU虚地址有2个,cache的和未cache的,未cache的地址=cahce地址+0x2000_0000。cs8900的未cache的IO地址为:0xA600_0000到0xA800_0000。IO_PACKET_PAGE_BASE_ADDR正好在这个范围内。
在cs8900驱动的源文件Miniport.c有这么两行对这个宏义的引用:
ioPacketPage = (volatile unsigned char *)(m_pCS8900IoPort +
(IO_PACKET_PAGE_BASE_ADDR - ((IO_PACKET_PAGE_BASE_ADDR) & 0xFFFFF000)) );
Adapter->IoPAddr = (unsigned long)ioPacketPage;
这部分:(IO_PACKET_PAGE_BASE_ADDR - ((IO_PACKET_PAGE_BASE_ADDR) & 0xFFFFF000)) ,似乎是错误的,是否可以改为:
ioPacketPage = (volatile unsigned char *)(m_pCS8900IoPort |(IO_PACKET_PAGE_BASE_ADDR&0xFFFFF000));
在pb5里设置成debug版,运行看看cs8900驱动输出了哪些信息。原来是release版,改成debug版,ROM的范围超出定义了,去修改config.bib。
pb5, debug版编译出错提示:
cs8900驱动,从头理下:
DriverEntry中设置InitializeHandler回调为MiniportInitialize
MiniportInitialize中调CS8900RegisterAdapter, CS8900RegisterAdapter中设置cs8900的IO地址
MiniportInitialize中,然后再调用CS8900Initialize,CS8900Initialize设置cs8900中断
然后,cs8900开始接收发送数据。
移植时的操作包括:
1。修改AS2440.bat
set BSP_NOCS8900=
2。修改platform.bib
增加如下内容:
IF BSP_NOCS8900 !
IF BSP_KITL !=ETHERNET
cs8900.dll $(_FLATRELEASEDIR)\cs8900.dll NK SH
ENDIF
ENDIF ; BSP_CS8900
3。修改注册表
在[HKEY_LOCAL_MACHINE\Comm\CS89001\Parms]下增加如下键值
"SysIntr"=dword:12 ;SYSINTR_ETHER
"Irq"=dword:25 ;IRQ_EINT9
4。修改intr.c
C:\WINCE500\PLATFORM\AS2440\Src\Kernel\Oal\intr.c
增加如下行:
OALIntrStaticTranslate(SYSINTR_ETHER, IRQ_EINT9);
编译wince,下载后,wince的“网络和拨号连接”里看不到网卡,cs8900的调试信息也看不到,就像是cs8900根本没加上。
反复做各种偿试,最后发现cs8900的目录没有生成任何.o文件,cs8900.dll自然也没有生成。
用build -c命令单独编译cs8900目录,也没有生成.o文件。
实在没办法了,选中clean before building,然后build and sysgen
代价是,编译时间为:1个半小时。
编译完成后下载运行,wince中出现cs8900了。
注册表里设置为使能dhcp,赶快登录宽带路由器查看。
排在第一位,mac地址比较特殊的那个是wince,主机名叫“none",还不知道如何修改这个主机名,让它看起来好看些,比如改成"wince 5.0"之类的。
在pc上ping下wince,就是ping 192.168.3.7,是通的。
CS8900的串口输出也可以看到了
上面这些连续出现的"Receive ARP Request Packet"和"Send ARP Response Packet"是接收ping包和发送ping响应的日志。
ping协议是基于ip的icmp协议之一,对应的包为ARP Request和ARP Response。
注册表中关于系统中断号和物理中断号的配置,跟intr.c中的代码好像是重复的。
另外,intr.c中关于中断的设置,与CS8900Initialize中的设置,也是重复的,是否可以消除这些重复的设置,有待试验。
2014-4-8
wince5.0实现远程桌面有两种方式:
1。基于以太网
2。基于ActiveSync
基于以太网的接口的远程桌面使用的人比较少,做了偿试,但没成功,
添加组件:
Core OS--CEBASE--CoreOS Services--DebuggingTools--Remote DisplayApplication
新增注册表项:
[HKEY_LOCAL_MACHINE\SOFTWARE\CERDISP]
"Hostname"="192.168.3.3"
[HKEY_LOCAL_MACHINE\COMM\TELNETD]
"IsEnabled"=dword:1
"UseAuthentication"=dword:0
主机运行:
C:\WINCE500\Public\Common\Oak\Bin\I386\cerhost.exe
开发板上:
运行:cerdisp
出现提示:unsupported screen depth 32, write more code
主机上没有看到wince窗口,但主机上移动鼠标,开发板上有反应。如果wince上添加了telnet server组件,可以从主机上通过telnet执行cerdisp命令。这比在wince上录入方便多了,在wince中录入是件痛苦的事。
总之,这是一个不成功的偿试(目前是这种状态),有试成功的网友可分享下经验,共同提高。
第二种远程桌面,就是activesync。activesync可以在usb device接口上建立网络连接,使用169.*.*.*这样的内部地址。
wince和主机通过activesync建立网络连接后,主机上会多出一个网络接口,用于和wince通信。
在配置好activesync后,编译wince下载后,发现以太网cs8900出故障了,启动后先是打红叉,后来变正常后,IP地址变成了
169.*.*.*,之前很正常的。输出的debug信息显示获取dhcp时出错,但网络中其他电脑上网都正常。
一种说法是,activesync分配的IP地址会与cs8900冲突,导致以太网不正常,现在把activesync的配置全部删除,恢复成之前的状态,以太网还没好。
恢复之前备份的bsp,无效
pb5中重新新建工程,也无效
重新sysgen了N次,一次半小时,都无效。恶梦已经开始了。。。
重新安装pb5,再次clean before building, build and sysgen,一次一个半小时。还是无效。
重启动路由器,无效。
为了实现触摸屏的校准,战线越来越长,就像个无底洞。快要忘了现在要实现的目标是什么。
问题解决了。以太网cd8900又恢复正常了。
注册表里的2项不能删除,教训深刻!!!
[HKEY_LOCAL_MACHINE\Comm\CS89001\Parms]
"SysIntr"=dword:12 ;SYSINTR_ETHER
"Irq"=dword:25 ;IRQ_EINT9
恢复这两项,网卡正常了。
bsp里中断分三种,也可以认为分成三个级别,我自己给这三级中断取名这:物理中断,扩展物理中断,系统中断
物理中断:2440手册中定义的中断,由中断控制器管理,由32位寄存器管理,所以共有32个中断源
在这32个中断源中有两类比较特殊,第一类:串口,ADC,CAM,AC97,他们包含子中断,比如uart0中断,中断号28,它会包含接收中断和发送中断,这些子中断由sub类寄存器管理,比如收到uart0中断,再去查询subsrcpnd以确定是接收中断,还是发送中断。
第二类是,外部中断,就是中断4和中断5,这2个中断包含了20个外部中断源,也没有sub寄存器,而且由多功能GPIO口来管理。
上面说的都是物理中断,与CPU硬件定义完全一致。
扩展物理中断,是在bsp中为了方便使用,在中断号31以上,就是从32到63又设置了一个中断号范围,用来记录20个外部中断。子中断没有在这个范围内。
这些扩展定义是如下文件中:
C:\WINCE500\PUBLIC\COMMON\OAK\CSP\ARM\SAMSUNG\S3C2410X\INC\s3c2410x_intr.h
。。。
#define IRQ_RTC 30
#define IRQ_ADC 31
#define IRQ_EINT4 32
#define IRQ_EINT5 33
#define IRQ_EINT6 34
#define IRQ_EINT7 35
#define IRQ_EINT8 36
#define IRQ_EINT9 37
#define IRQ_EINT10 38
。。。
对于外部中断9(IRQ_EINT9),中断号人为定义为37,且固定不变,这个中断号37,在cpu的中断控制器的寄存器中是没有的,只是软件的自行定义。
这也是扩展物理中断与物理中断的区别。软件将使用扩展物理中断,不再使用物理中断,软件可以得到简化。
系统中断:bsp面向操作系统一侧,定义与硬件无关的中断,再将扩展物理中断映射过来,这听起来有点抽象。就是bsp定义另外一种中断号,定义时完全不考虑硬件,这样才能使操作系统独立于硬件。在定义系统中断号时,前16个保留做为系统使用,硬件设备的系统中断号将从0x10开始。
系统中断和扩展物理中断存储在2个全局变量:g_oalSysIntr2Irq,g_oalIrq2SysIntr中,它们定义在如下源文件中:
C:\WINCE500\PLATFORM\COMMON\SRC\COMMON\INTR\BASE\map.c
map.c里还包含由扩展物理中断和系统中断互查询的函数,以及建立扩展物理中断和系统中断对映关系的函数。
关于系统中断号,唯一的要求是必需>=16,而且未被其他设备使用,这看起来是可以任意定义,实际实验也确定如此。
来看下,如何给以太网定义系统中断号:
C:\WINCE500\PLATFORM\AS2440\Src\Inc\bsp_cfg.h
#define SYSINTR_OHCI (SYSINTR_FIRMWARE+1)
#define SYSINTR_ETHER (SYSINTR_FIRMWARE+2)
上面的SYSINTR_FIRMWARE即为15,保留系统中断的最大值。
USB占用了第一个,把以太网系统中断按顺序写在第二个,这里可以看到完全不考虑硬件的情况。
对于以太网中断,现在有的三个中断号:
物理中断号:5,寄存器位EINT8_23
扩展物理中断号:37
系统中断号:18
在BSPIntrInit中设置扩展物理中断和系统中断的关联关系:
OALIntrStaticTranslate(SYSINTR_ETHER, IRQ_EINT9);
在注册表中做如下设置
[HKEY_LOCAL_MACHINE\Comm\CS89001\Parms]
"SysIntr"=dword:12 ;SYSINTR_ETHER
"Irq"=dword:25 ;IRQ_EINT9
注册表中使用16进制。
---------------华丽丽的分隔线-----------------------------------------------------------------------------------------------------------
2014-4-9 移植usb device驱动
activesync基于usb device接口,需要先给wince移植usb device驱动,驱动中主要实现usb协议,usb协议是个比较复杂的协议
usb device驱动源文件:
C:\WINCE500\PLATFORM\AS2440\Src\Drivers\Usb\Function\sc2440pdd.cpp
加载驱动的函数调用顺序:
UfnPdd_DllEntry--UFN_Init--UfnPdd_Init--UfnPdd_Start--ISTMain
注册表中定义了IO基地址为:0xB1200000,宏定义BASE_REGISTER_OFFSET代表了0x0140,二者相加后为usb device寄存器组的基地址。
2440的usb device为1.1版的,usb device接口为4线:VBUS,GND,D+,D-,其中D+和D-为usb通信的数据线,是双向的,VBUS是主机输出直流电压给USB设备(比如开发板),这个直流电压为5V,最大500mA。
usb协议和usb驱动都要涉及功耗控制,这里用到两个内容:
1。当usb设备进入stop状态(停机)后,这时可能USB线还连着,这时主机需要切断VBUS的供应,以减少不必要的电流输出。
2。当usb进入sleep状态后,2440的usb device的时钟需要设置为关断状态
主机通过检测开发板上usb device接口D+线上的电拉电阻带决定是否需要给usb设备供电,如果开发板通过设置usb device断开上拉电阻,这时插上usb线,主机没有任何反应,这种情况很多人碰到。为此,我单独做过一个实验,usb线上不接任何设备,给usb线的D+上接一个1.5k的上拉电阻,再把电阻的另一端接到5V直流电源,当然GND也要接到直流电源地线上。这时windows会发现新设备,但枚举失败,设备管理器里出现一个"unknown device",查看这个设备的详细信息,VID/PID为全0。所以,如果在实际接了usb设备到主机上,但主机识别成vid/pid全0的unknown device,表示硬件上D+线上存在一个上拉电阻,但主机和usb设备间的通信是完全中断的,不管中断的原因是什么,主机并不知道,可能电路的问题,firmware的问题等等,可能性很多。
开发板上AS2440上,控制D+上拉电阻的控制IO是GPG12的bit12。如果要关断主机输出的5V直流电,通过设置断开上拉电阻,这时主机会认为usb设备已被拔除了,会关闭VBUS上的直流输出。
上述设置的修改都是在SetPowerState函数中进行的。
注册表中除了增加设置
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SC2440USBFN]
"Irq"=dword:19 ;25"SysIntr"=dword:13 ; (SYSINTR_FIRMWARE+3)
编译wince,下载运行后,出现“找到新硬件向导”窗口表示usb device被检测到了。
---------------华丽丽的分隔线-----------------------------------------------------------------------------------------------------------
2014-4-10 移植activesync