移植wince 5.0到2440

时间:2021-12-08 17:51:37
从网上下载的smdk2440 bsp,自己修改在platform builder 5.0下编译,历经千辛万苦,编译出了nk.nb0,nk.bin,自己写的boot程序先启动硬件,再用j-link的loadbin命令下载nk.nb0到0x80200000地址,运行后桌面显示出几个排列在一起的图标,图质粗糙,比例看起来也不对,没有任务栏,都不太像wince桌面。运行时串口输出的内容很多(因为我打开了多个日志选项),这里只把最后面的贴出来。现在运行的debug版,nk.nb0大小为44M,试过release版,效果相同。

wince 5.0 桌面照片
  移植wince 5.0到2440

wince 5.0运行时串口输出

移植wince 5.0到2440


安装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的驱动代码。
移植wince 5.0到2440


2014-4-7

现在桌面显示完整了,是S3C2440Disp.cpp里的设置问题,原先设置成24位,实际应该设置成32位,因为,为了地址对齐,24位数据实际占用32位空间,高8位空着未用。


移植wince 5.0到2440


背景怎么是红的,应该是标准桌面颜色才对。

修改了2440 lcd寄存器rLCDCON5的配置,原来配置有很多项,现在清空成0就正常了。

移植wince 5.0到2440


屏幕上有箭头形式的光标,用笔点下屏幕光标不见了,再也不出来了。应该是还没有校准触摸屏的原因。

校准触摸屏需要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鼠标可以用了。开始菜单-设置--控制面板--笔针--再校准,完成后。。。。


移植wince 5.0到2440


需要按“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的范围:


移植wince 5.0到2440


实地址范围:0x1800-0000到0x2000-0000,对应的地址范围应该是:

移植wince 5.0到2440


虚地址范围: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版编译出错提示:


移植wince 5.0到2440

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文件。

移植wince 5.0到2440


实在没办法了,选中clean before building,然后build and sysgen

移植wince 5.0到2440

移植wince 5.0到2440


代价是,编译时间为:1个半小时。

编译完成后下载运行,wince中出现cs8900了。

移植wince 5.0到2440

移植wince 5.0到2440


注册表里设置为使能dhcp,赶快登录宽带路由器查看。

移植wince 5.0到2440

移植wince 5.0到2440


排在第一位,mac地址比较特殊的那个是wince,主机名叫“none",还不知道如何修改这个主机名,让它看起来好看些,比如改成"wince 5.0"之类的。

在pc上ping下wince,就是ping 192.168.3.7,是通的。

移植wince 5.0到2440

移植wince 5.0到2440


CS8900的串口输出也可以看到了

移植wince 5.0到2440


上面这些连续出现的"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个中断源

移植wince 5.0到2440


在这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被检测到了。

移植wince 5.0到2440


---------------华丽丽的分隔线-----------------------------------------------------------------------------------------------------------

2014-4-10 移植activesync