Wince net系统定制与驱动开发.docx
《Wince net系统定制与驱动开发.docx》由会员分享,可在线阅读,更多相关《Wince net系统定制与驱动开发.docx(47页珍藏版)》请在冰豆网上搜索。
Wincenet系统定制与驱动开发
WindowsCE.Net系统定制与驱动开发
实验指导手册Ver3.1
目录
第一天实验内容2
一、安装SamArmDvk9II型开发板的WinCE.NETBSP2
二、使用BSP在PB4.2中创建一个新的Platform并编译连接生成新的Image文件4
三、将生成的Image烧录到FLASH中安装SamArmDvk9II型开发板的WinCE.NETBSP9
四、添加MFC特性,添加鼠标和U盘驱动19
五、建立一个带kitl特性的系统镜像22
六、导出SDK26
七、通过KITL建立EVC的调试环境30
第二天主要内容35
一、开机logo的实现35
二、通过地址映射操作外部IO,实现LED控制36
三、中断的添加和响应36
第三天主要内容38
第四天主要内容42
一、编译一个调试型的内核42
二、触摸屏驱动校正实验43
三、电源管理驱动实现节电管理43
第一天实验内容
一、安装SamArmDvk9II型开发板的WinCE.NETBSP
1.在WINCE420\PLATFORM目录下新建一个名为“SMDK2410”的目录,如果该目录下已有名为SMDK2410的目录,将其改名备份。
2.拷贝光盘中的2410WINCE\2410WINCE4.2BSP\SMDK2410目录中的内容到步骤一建立的SMDK2410目录。
3.去掉该目录中所有文件的只读属性。
4.将“SMDK2410\_for_Public\oak\drivers\NETCARD”目录下的CS8900R目录拷贝到“WINCE420\PUBLIC\COMMON\OAK\DRIVERS\NETCARD”目录下。
5.在“WINCE420\PUBLIC\COMMON\OAK\DRIVERS\NETCARD”目录下的dirs文件中添加cs8900r,示例如下。
DIRS=
\cs8900r
\dc21x4
6.拷贝“SMDK2410\_for_Public\CESYSGEN”目录下的Makefile文件到“WINCE420\PUBLIC\COMMON\CESYSGEN”目录下。
7.单击【File】>【ManageCatalogFeatures…】菜单项,如图1所示。
图1
8.在Catalog列表中单击选中“smdk2410.cec”文件,如图2所示,然后单击【Remove】按钮,删除PB4.2自带的smdk2410BSP。
图2
9.单击【Import】按钮,导入“PLATFORM\SMDK2410\smdk2410.cec”文件,如图3所示。
图3
10.完成第9步操作后,系统将在Catalog的BSPs文件夹下自动添加“SamsungSMDK2410:
ARMV4项”,如图4所示,此时BSP安装完成。
图4
二、使用BSP在PB4.2中创建一个新的Platform并编译连接生成新的Image文件
1.单击【FILE】>【NewPaltform】菜单项,如图5所示。
图5
2.在弹出的【NewPlatformWizard–Step1】对话框中单击【Next】按钮,如图6所示。
图6
3.在弹出的【NewPlatformWizard–Step2】对话框中选择新安装的BSP,接着单击【Next】按钮,如图7所示。
图7
4.在【NewPlatformWizard–Step3】对话框中选中【Availableconfigurations】单选按钮,在下面的列表框中选择一项Cofiguration(这里选择MobileHandheld),接着在右侧的【Platformname】文本框中输入平台名称,如图8所示,最后单击【next】按钮。
图8
5.在【NewPlatformWizard–Step4】对话框中选择需要的应用,如图9所示,接着单击【Next】按钮。
图9
6.在【NewPlatformWizard–Step5】对话框中选择需要的网络设置,如图10所示,然后单击【Next】按钮。
图10
7.这时进入图11所示的对话框,接着单击【Next】按钮。
图11
8.在【NewPlatformWizard–Step5】对话框中单击【Done】按钮,如图12所示,完成新平台的建立。
图12
9.右键单击SMDK2410features,在弹出的菜单中选择【Settings…】菜单项,如图13所示。
图13
10.这时将弹出【PlatformSettings】对话框,在右侧的【BuildOption】选项卡中,取消【EnableKITL】和【EnableCETargetControlSupport】复选框的选中状态,如图14所示。
最后单击【OK】按钮完成平台设置。
图14
11.单击【Buildplatform】按钮编译新平台,如图15所示。
编译完成后,将得到“EBOOT.BIN”、“EBOOT.NB0”、“NK.BIN”以及“NK.NB0”等文件。
图15
三、将生成的Image烧录到FLASH中安装SamArmDvk9II型开发板的WinCE.NETBSP
1.将目标板和PC机器通过串口和Ethernet(要用交叉网线)相连。
2.用MultiJtag工具和并口电缆,连接PC的并口和目标板的JTAG口,将目标板上电,在PC机端的控制台,准备运行SJF程序。
3.将Nboot_Debug.bin文件烧录到FLASH中(该文件用于调用第2块的EBOOT)。
在控制台下sjf2410.exe(在开发工具光盘中\Flash烧写工具所目录中,应将该程序复制到硬盘中,并将工具光盘2中的NBoot.bin,eboot.nb0文件复制到同一目录下)。
键入“sjf2410/f:
NBoot_Debug.bin”,如图16所示。
图16
回车后进入程序后,如图17所示,接着键入“0”。
图17
回车后如图18所示。
选择将文件烧录到第0号块,选择“0”。
图18
回车后,烧写的过程如图19所示。
图19
烧写完毕后,选择“2”并按回车返回到控制台。
4.烧录完成后,再次单击运行SJF,将通过PlatformBuilder4.2编译生成的EBOOT.NB0文件或是资料盘中附带的EBOOT.NB0文件烧入FLASH的第二块,如图20所示。
图20
烧录方法同上一步骤,但注意:
因为需要将该文件烧在第二块,所以在地址选择中需要选择“2”后回车。
该文件较大,烧录时间可能会稍长些。
5.烧录完成后,运行DNW,然后单击【SerialPort】>【Connect】菜单项,如图21所示。
图21
6.按开发板上的复位键,复位开发板,DNW显示如图22所示。
图22
7.下载完成后按空格键,DNW显示如图23所示。
图23
8.将各选项设置如图24所示。
IPaddress需要和PC机的IP地址在同一个子网内,如PC机为192.192.78.1则IPaddress可设为192.192.78.2~255。
其他各项保持和上图一致即可。
注意设置MAC地址。
图23
9.键入“W”将设置保存。
10.接着键入“F”将NandFlash低级格式化,如图24所示。
这里不会格式化NandFlash的前10块。
图25
11.键入“9“将SMC逻辑格式化为BINFS格式,如图26所示,这一步操作时间会比较长(大约5分钟左右)。
图26
12.完成上一步操作后,键入“D“下载Image文件,如图27所示。
图27
13.接下来需要进行PlatformBuilder4.2中【RemoteConnection】属性的设置。
单击【Target】>【ConfigureRemoteConnection…】菜单项,如图28所示。
图28
14.这时将弹出【ConfigureRemoteConnection】对话框,在【Download】下拉列表框中选择【Ethernet】项,如图29所示。
图29
15.同样在【Services】选项卡的【Kernel】下拉列表框中也选择【Ethernet】项,如图30所示。
图30
16.接着单击【Download】下拉列表框右侧的【Configure】按钮,这时将弹出【ConfigureEthernetDownloadService】对话框,该对话框的【AvailableDevices】文本框中将出现【SMDK2410?
?
?
?
】项(注:
此时目标板需要为等待下载状态),如图31所示。
选中该项,然后单击【OK】按钮即可。
图31
17.回到PlatformBuilder4.2中,接着单击【Target】>【Download/Initlize】菜单项,通过Ethernet即可将NK.BIN下载到目标板中,如图32所示。
图32
18.此时目标板需要在等待下载状态(D),通过DNW能看到反馈信息,如图33所示。
图33
19.下载完后通过DNW可以看到程序正在将下载的Image烧录到NandFlash中,如图34所示。
图34
20.稍等一会儿后,WINCE开始初始化并运行时,烧录工作就已完成了,如图35所示。
图35
21.烧录完成后,按目标板上的复位键,WINCE将自动运行。
四、添加MFC特性,添加鼠标和U盘驱动
1.选中“Catalog/CoreOS/DisplayBasedDevice/ApplicationsandServicesDevelopment”目录下的“MicrosoftFoundationClasses(MFC)”文件,然后单击鼠标右键,在弹出的快捷菜单中选择【AddToPlatform】菜单项,如图36所示。
图36
2.选中“Catalog/CoreOS/DisplayBasedDevice/CoreOSServices/USBHostSupport”目录下的“USBHumanInputDevice(HID)ClassDriver”和“USBStorageClassDriver”两个组件,分别单击鼠标右键,在弹出的快捷菜单中选择【AddToPlatform】菜单项,如图37、图38所示。
图37
图38
3.重新编译并下载,系统即可正常支持MFC程序、U盘和USB鼠标了。
五、建立一个带kitl特性的系统镜像
1.在PlatformBuilder中打开刚才建立的工程,在工程上单击鼠标右键,在弹出的快捷菜单中选择【setting…】菜单项,如图39所示。
图39
2.这时将弹出【PlatformSettings】对话框,接着单击切换到【BuildOption】选项卡中,按照图40所示的完成【BuildOption】属性的设置。
图40
3.单击【OK】按钮完成平台设置,然后Rebuild系统镜像并下载,这样就建立了一个带有KITL特性的系统。
4.如板子掉电重启后,带有KITL特性的系统不能自动启动,需要通过DNW和PlatformBuilder来实现引导启动。
5.首先启动PlatformBuilder,打开带有KITL特性的工程,如图41所示。
图41
6.接着启动DNW,然后给开发板上电,按两下空格进入命令菜单,如图42所示。
图42
7.接着在DNW界面中键入“l”。
8.回到PlatformBuilder中,单击【Target】>【Connect】菜单项,如图43所示。
到此就实现了引导启动,带有KITL特性的系统正常启动了。
图43
六、导出SDK
1.在PlatformBuilder中打开工程,然后单击【Platform】>【ConfigureSDK】菜单项,如图44所示。
图44
2.这时将弹出【ExportSDKWizard】对话框,单击【下一步】按钮,进行生成的SDK的名称和提供者姓名的填写(可随意填写),如图45所示。
图45
3.单击【下一步】按钮,按照图46所示的完成“developmentlanguage”属性的设置(若系统已经加入MFC特性并编译,则MFC相关的两项为灰体必选项)。
图46
4.最后单击【下一步】按钮完成设定。
在PlatformBuilder中打开工程,再次单击【Platform】>【ConfigureSDK】菜单项可以设定SDK文件的输出路径或更改SDK文件名称和提供者信息。
5.在PlatformBuilder中单击【Platform】>【BuildeSDK】菜单项开始创建SDK文件,如图47所示。
图47
6.完成SDK的创建后,双击生成的.msi文件进行SDK的安装。
安装完成后重新启动,打开EVC就可以针对生成的SDK进行编译了。
七、通过KITL建立EVC的调试环境
1.首先通过引导启动带KITL特性的系统,然后将资料光盘中的示范工程IntTest复制到硬盘上,在EVC中单击OpenWorkSpace打开硬盘上刚刚复制过来的IntTest工程文件中的IntTest.vcw。
2.在EVC环境下单击【Tools】>【Configureplatformmanager…】菜单项,如图48所示。
图48
3.在弹出的【WindowsCEPlatformManagerConfiguration】对话框中选择刚才导出的SDK文件,如图49所示,然后单击对话框右侧【Properties】按钮。
图49
4.这时将弹出【DeviceProperties】对话框,按照图50所示的完成设备属性的设置,最后单击【OK】按钮。
图50
5.确认编译的目标SDK的名称和刚才选定的SDK一致,如图51所示。
图51
6.单击【Build】按钮进行编译。
如果在编译过程中出现头文件无法找到的错误,应在电脑中进行搜索,然后将找到的文件的路径复制下来。
接着在EVC中单击【Tool】>【Options】菜单项,在弹出的对话框中切换到【Directory】选项卡中,将刚才找到的文件的路径填入(注意,不可将找到的文件复制到当前工程目录下,否则可能会出现错误),如图52所示。
最后单击【OK】按钮。
图52
7.完成编译成功后,EVC会自动通过KITL和开发板建立联机,至此就可以进行联机调试了。
第二天主要内容
一、开机logo的实现
1.找到\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\cfw.c文件,找到staticvoidInitDisplay()这个函数的实现部分。
2.下面这段代码即为开机logo的实现,其意义为将已经转化为C数组的BMP文件数据拷贝到显示缓冲区中。
memcpy((void*)FRAMEBUF_BASE,ScreenBitmap,
ARRAY_SIZE_TFT_16BIT);”
3.动手修改,首先使用Image2Lcd这个工具将一张人意的BMP图片转化为240x180,16位真彩格式,然后转化为一个C数组。
(注意:
转化后的数组中成员个数应为86400,有些图片文件因为格式上的原因,导致转化后的数组个数不是86400,这种情况下不能正常进行下面的步骤。
推荐使用电脑上“我的文档\图片收藏\示例图片”下的几张图片进行转换)。
4.找到“\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\samsung.c”文件,用上面的数组数据替换掉原始的数组数据。
(注意:
不要改变原始数组的名称,即只将以下代码括号中的部分替换即可。
constunsignedshortScreenBitmap[]={
……….
}
5.屏蔽下面这段代码。
memcpy((void*)FRAMEBUF_BASE,ScreenBitmap,ARRAY_SIZE_TFT_16BIT)
6.接着加入下面这段代码。
FBuf=(structFrameBuffer*)(FRAMEBUF_BASE);
for(i=0;i<180;i++)
{
for(j=0;j<240;j++)
{
FBuf->pixel[i+40][j]=ScreenBitmap[480*i+2*j]|(ScreenBitmap[480*i+2*j+1]<<8);
}
}
7.重新编译内核后即可实现自定义的开机logo。
二、通过地址映射操作外部IO,实现LED控制
详细代码参见资料光盘中的示范程序IntTest,将该程序编译后下载到板子上运行,可以通过单击“打开”、“关闭”来控制LEDD11的亮灭。
三、中断的添加和响应
1.内核处理部分
1.在“:
\WINCE420\PLATFORM\SMDK2410\INC\oalintr.h”中加入
#defineSYSINTR_EINT2(SYSINTR_FIRMWARE+21)
2.在“:
\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\ARM\arminit.c”中找到“OEMInterruptHandler”的实现部分,屏蔽掉以下代码。
elseif(IntPendVal==INTSRC_EINT2)//EINT2
{
s2410INT->rINTMSK|=BIT_EINT2;
s2410INT->rSRCPND=BIT_EINT2;/*InterruptClear*/
if(s2410INT->rINTPND&BIT_EINT2)s2410INT->rINTPND=BIT_EINT2;
//RETAILMSG(1,(TEXT(">>>CPUPowerReset\r\n")));
RETAILMSG(1,(TEXT(">>>>>>ResetButtonPressed<<<<<<\r\n")));
CPUPowerReset();
return(SYSINTR_POWER);
}
3.在下面这三句代码中添加“return(SYSINTR_EINT2);”
RETAILMSG(1,(TEXT(">>>>>>ResetButtonPressed<<<<<<\r\n")));
CPUPowerReset();
return(SYSINTR_POWER);
4.在“:
\WINCE420\PLATFORM\SMDK2410\KERNEL\HAL\ARM\cfw.c”中找到函数OEMInterruptEnable的实现,找到下面这段代码
caseSYSINTR_ETHER:
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
。
break;
在其后添加如下代码。
caseSYSINTR_EINT2:
s2410INT->rSRCPND=BIT_EINT2;
if(s2410INT->rINTPND&BIT_EINT2)s2410INT->rINTPND=BIT_EINT2;
s2410INT->rINTMSK&=~BIT_EINT2;
break;
(注意:
不要对
caseSYSINTR_ETHER:
。
。
。
。
。
。
break;
这段代码中间省略的代码部分进行改动,以下相同)
5.找到OEMInterruptDisable的实现,找到下面这段代码。
caseSYSINTR_ETHER:
。
。
。
。
。
。
。
。
。
。
。
。
break;
在其后添加如下代码。
caseSYSINTR_EINT2:
s2410INT->rINTMSK|=BIT_EINT2;
break;
6.找到OEMInterruptDone的实现,找到下面这段代码。
caseSYSINTR_ETHER:
。
。
。
。
。
。
。
。
。
。
。
。
break;
在其后添加如下代码:
caseSYSINTR_EINT2:
s2410INT->rSRCPND=BIT_EINT2;
if(s2410INT->rINTPND&BIT_EINT2)s2410INT->rINTPND=BIT_EINT2;
s2410INT->rINTMSK&=~BIT_EINT2;
break;
7.至此完成中断在内核中的注册。
2.应用程序部分
编译示范程序,下载到开发板上运行,单击【等待】菜单项,程序进入等待中断状态,当按下板上的按键k7时,中断被触发,程序弹会弹出出提示框。
再次点击后,会再次进入等待状态。
第三天主要内容
流驱动驱动程序部分代码
#define_WIN32_WINNT0x0400
#include
#include
HANDLEg_hInstance;
#defineBUFSIZE256
WCHARachBuffer[BUFSIZE];
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOLWINAPI
DllEntryPoint(HANDLEhinstDLL,
DWORDdwReason,
LPVOID/*lpvReserved*/)
{
switch(dwReason)
{
caseDLL_PROCESS_ATTACH:
g_hInstance=hinstDLL;
RETAILMSG(1,(TEXT("STRINGS:
DLL_PROCESS_ATTACH\n")));
returnTRUE;
caseDLL_THREAD_ATTACH:
RETAILMSG(1,(TEXT("STRINGS:
DLL_THREAD_ATTACH\n")));
break;
caseDLL_THREAD_DETACH:
RETAILMSG(1,(TEXT("STRINGS:
DLL_THREAD_DETACH\n")));
break;
caseDLL_PROCESS_DETACH:
RETAILMSG(1,(TEXT("STRINGS:
DLL_PROCESS_DETACH\n")));
break;
#ifdefUNDER_CE
caseDLL_PROCESS_EXITING:
RETAILMSG(1,(TEXT("STRINGS:
DLL_PROCESS_EXITING\n")));
break;
caseDLL_SYSTEM_STARTED:
RETAILMSG(1,(TEXT("STRINGS:
DLL_SYSTEM_STARTED\n")));
break;
#endif
}
returnTRUE;
}
//-----------------------------------------------------------------------------
//--------------------------------------------------------------