WinCE6.0 KITL概要

KITL(Kernel Independent Transport Layer)即内核独立传输层,它为我们提供了一种调试WinCE的简便方法。KITL将通信服务协议和用于通信的硬件分离开来。所以我们在创建硬件传输层时就省去很多麻烦,否则我们自己必须实现与设备进行数据交互的协议。KITL工作在硬件传输层之上,因此,它无须关心用于通信的具体硬件,我们可以用USB、Serial或者Ethernet作为KITL的调试通道。具体选择哪一个,由硬件平台和软件资源决定。有些设备没有Ethernet和Serial接口,所以只能采用USB,如Mobile设备。如果系统采用了EBOOT,则建议使用Ethernet作为调试通道。这时,配置KITL的代价相对来说也很小。无论如何,KITL相当强大,在BSP的移植过程中,花一些时间来实现KITL的功能是完全值得的。完成KITL之后,你会发现所有的时间都没有白花。由于KITL的实现,后续的调试节省了很多时间。磨刀不误砍柴工!工欲善其事,必先利其器!我深有体会!:-D以前没有认识到KITL的强大,一直没有碰它。最近在实现KITL的功能之后,随即顺利调通了几个顽固的驱动。虽然问题本身不值一提,但没有KITL时,驱动出了状况,内核就挂了,不知道挂在哪里,无从下手,也不好分析。而KITL可以帮助我们定位出现问题的位置。KITL,一用就知道是我想要的。BTW:按启动顺序来说,KITL启动应该在OAL之后,内核之前。所以,必须先完成OAL的移植,才能进一步移植KITL。

闲话少说,接下来介绍WinCE6.0 KITL的基本情况。WinCE6.0中,KITL从OAL中独立出来,单独编译成kitl.dll。在BSP中的目录一般为%_WINCEROOT%"PLATFORM" BSPNAME"SRC"kitl。在该目录下有一个kitl.c的文件,这是BSP中有关KITL的主要代码所在。核心代码如下:     

Code
//------------------------------------------------------------------------------
//
// Platform entry point for KITL.  Called when KITLIoctl (IOCTL_KITL_STARTUP, ) is called.
//
BOOL OEMKitlStartup(void)
{
    BOOL rc;
    OAL_KITL_ARGS *pArgs, args;
    CHAR *szDeviceId, buffer[OAL_KITL_ID_SIZE];

    KITL_RETAILMSG(ZONE_KITL_OAL, ("+OEMKitlStartup\r\n"));

    // Print banner.  Will remove when KITL-over-ethernet support is dropped
    // (in M3)
    KITLOutputDebugString("\n*********************************************\n");
    KITLOutputDebugString("*                                           *\n");
    KITLOutputDebugString("*  This image uses KITL-over-ethernet       *\n");
    KITLOutputDebugString("*                                           *\n");
    KITLOutputDebugString("*  PB Connectivity Options must be set to:  *\n");
    KITLOutputDebugString("*  Download:  \"Device Emulator\"             *\n");
    KITLOutputDebugString("*  Transport: \"Ethernet\"                    *\n");
    KITLOutputDebugString("*                                           *\n");
    KITLOutputDebugString("*********************************************\n\n");

    // Look for bootargs left by the bootloader or left over from an earlier boot.
    //
    pArgs      = (OAL_KITL_ARGS*)OALArgsQuery(OAL_ARGS_QUERY_KITL);
    szDeviceId = (CHAR*)OALArgsQuery(OAL_ARGS_QUERY_DEVID);

    // If we don't have bootargs in RAM, look first in NOR flash for the information
    // otherwise look on the SmartMedia NAND card (in case we're performing a NAND-only) boot.
    //
    if (pArgs == NULL)
    {
        SectorInfo si;
        UINT8 maccount = 0;

        // Get MAC address from NAND flash
        //
        if (FMD_Init(NULL, NULL, NULL) == NULL)
        {
            KITL_RETAILMSG(ZONE_ERROR, ("ERROR: Failed to initialize NAND flash controller.\r\n"));
            return(FALSE);
        }

        // If block 0 isn't reserved, we can't trust that the values we read for the MAC address are
        // correct.  They may actually be valid logical sector numbers (we're overloading the use
        // of the logical sector number field).
        //
        if (!(FMD_GetBlockStatus(0) & BLOCK_STATUS_RESERVED))
        {
            KITL_RETAILMSG(ZONE_ERROR, ("ERROR: Block 0 isn't reserved - can't trust MAC address values stored in NAND.\r\n"));
            return(FALSE);
        }

        KITL_RETAILMSG(ZONE_KITL_OAL, ("INFO: Using KITL arguments stored on SmartMedia.\r\n"));
        memset(&args, 0, sizeof(args));
        args.flags = OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_DHCP | OAL_KITL_FLAGS_VMINI;
        args.devLoc.IfcType = Internal;
        args.devLoc.BusNumber = 0;
        args.devLoc.LogicalLoc = BSP_BASE_REG_PA_CS8900A_IOBASE;
        args.ipAddress = 0;

        // We know the first block of NAND flash must be good, so we needn't worry about bad blocks when reading.
        //
        maccount = 0;
        do
        {
            if (!FMD_ReadSector(maccount, NULL, &si, 1))
            {
                KITL_RETAILMSG(ZONE_ERROR, ("ERROR: NAND flash read error (sector = 0x%x).\r\n", maccount));
                return(FALSE);
            }

            args.mac[maccount] = (UINT16)(si.dwReserved1 & 0xFFFF);

        } while(++maccount < 3);

        pArgs = &args;
    }        

    // If there isn't a device ID from the bootloader create one.
    //
    if (szDeviceId == NULL)
    {
        OALKitlCreateName(BSP_DEVICE_PREFIX, pArgs->mac, buffer);
        szDeviceId = buffer;
    }

    // Finally call KITL library.
    //
    rc = OALKitlInit(szDeviceId, pArgs, g_kitlDevices);

    KITL_RETAILMSG(ZONE_KITL_OAL, ("-OEMKitlStartup(rc = %d)\r\n", rc));
    return(rc);
}

       上面的代码是WinCE6.0中模拟器的基于Ethernet的KITL实现部分,可以看到,OEMKitlStartup()先获取关于KITL的相关信息,然后调用OALKitlInit()初始化KITL的功能。参数g_kitlDevices的定义在文件kitl_cfg.h中,代码如下:     

Code
#ifndef __KITL_CFG_H
#define __KITL_CFG_H

//------------------------------------------------------------------------------

OAL_KITL_ETH_DRIVER g_kitlEthCS8900A = OAL_ETHDRV_CS8900A;

OAL_KITL_DEVICE g_kitlDevices[] = {
    { 
        L"CS8900A", Internal, BSP_BASE_REG_PA_CS8900A_IOBASE, 0, OAL_KITL_TYPE_ETH, 
        &g_kitlEthCS8900A
    }, {
        NULL, 0, 0, 0, 0, NULL
    }
};    
//------------------------------------------------------------------------------
#endif

     根据硬件平台的不同,设置相应的配置。到这里,代码部分就基本完成了。接下来配置OS Design,如下图所示:     
               
     重新编译OS Design。下载之前,设置Connectivity Options。万事俱备,下载测试。顺利的话会在超级终端打印如下图所示信息:
          
     系统启动完成后,会在网络连接里看到VMINI的连接图标,如下图所示。这里补充一点,在启用KITL时必须将原来的网络驱动停掉,否则会与KITL冲突,导致系统启动不了。VMINI应该是一个桥接的网卡设备,它和KITL共享硬件网络接口。这时你可以通过KITL进行调试,也可以通过VMINI1访问Internet。不过,建议不要尝试打开网页,因为一般会造成网络堵塞而死机。

    

至此,KITL的功能就实现了,接下来开始调试WinCE系统,也是KITL大显身手的时候了。调试截图如下:

    
     可以看到文件ufnmdd.cpp中有一个DEBUGCHK failed了,这里给出了详细的说明,一看就知道问题在哪。在调试WinCE6.0时经常会出现yzkiqfe等字样的目录,这是WinCE6.0的研发代号(yamazaki),好像是一种日本葡萄酒的名字(WinCE的研发代号似乎一直用葡萄酒的名字来命名)。我们不用管它,在需要定位目录时,浏览到PB6.0的安装目录即可。通过KITL,还可以设置断点,单步运行,查看寄存器等等。总之,KITL在调试OAL和驱动尤其是本地驱动时有不可替代的作用。
    本文简要介绍了WinCE6.0中KITL的相关内容,以Ethernet为例简单分析了KITL的代码。文中有不贴切的地方,欢迎您指正!

时间: 2024-10-25 23:54:50

WinCE6.0 KITL概要的相关文章

WinCE6.0的EBOOT概要

     为一个新的硬件设备定制WinCE6.0操作系统,一般需要完成以下几个主要步骤: 1.       针对特定的硬件设备创建板级支持包(Board Support Package缩写为BSP),BSP必须包括BOOTLOADER.OEM适配层(OEM Adaptation Layer缩写为OAL)和一些必要的驱动. 2.       利用创建的BSP,定制一个系统设计(OS Design).即通过VS2005创建一个Platform Builder的工程.该工程可编译产生最终的运行时映像文

Windows XP下安装WinCE6.0开发环境

Windows下如何编译WinCE6.0及开发应用程序,下面介绍(安装之前必须保证C盘有足够的空间!20g左右!主要是因为在安装程序在安装过程中要解压): 在Visual Studio 2005之前,开发WinCE嵌入式程序需要安装Platform Builder,不过Platform Builder已经作为一个插件集成在Visual Studio 2005里了. 1.下载并安装Visual Studio 2005(Visual Studio 2008只支持开发应用程序,不能用来定制WinCE内

S3C2410下WinCE6.0的启动过程详解

通过前两篇文章的介绍,我们已经知道NBOOT用来引导EBOOT,继而EBOOT加载并引导WinCE操作系统(NK).那么,WinCE6.0的启动过程又是怎样的呢?本文基于S3C2410的平台做一个详细的分析.需要说明的是,WinCE6.0的整个启动过程对于同一类型的MCU来说大同小异,如S3C2410和PXA270同属ARM平台的MCU,所以他们的启动过程是类似的,可以说唯一的不同就在OAL处,而WinCE操作系统的启动正是从OAL开始的.      OAL(OEM Adaptation Lay

WinCE6.0 OAL的特点

     WinCE6.0的OAL跟WinCE5.0中的有较大差别.了解这些差别,对我们移植OAL部分很有帮助.本文将简要介绍WinCE6.0 OAL的特点.      WinCE5.0将内核.OAL和KITL链接成一个内核可执行文件NK.exe.而WinCE6.0将这三者分开,分别对应Kernel.dll.OAL.exe和KITL.dll.显而易见,这样做最大的好处是可以单独升级这三者中的任何一个,而先前的结构则是牵一发而动全身的.WinCE5.0的OAL结构如图1所示:           

图标-WinCE6.0电池电量显示的不正确,求有经验的牛人指教

问题描述 WinCE6.0电池电量显示的不正确,求有经验的牛人指教 我用的WinCE6.0系统,现在电池显示这一块有一些问题,我在"控制面板"里看电池信息,在"电池"这个标签下显示剩余电量100%,在"方案"标签下显示"电池电源".可是为什么我的WinCE桌面右下角的电源信息图标是个"小插头",而不是一个小电池图标呢. 我的电池电量检测芯片是DS2782,电池驱动的PDD层我看了也没多大问题,就是这里有点不

wince6.0模拟器的问题

问题描述 wince6.0模拟器的问题 奇怪模拟器ip地址怎么会是55段的呢,我的电脑是1段的,我试过把模拟器改成1段,但是同步连去就会断开了,如果使用55段的时候,又访问不了我电脑上的数据库,有什么配置让模拟器连接的时候使用的就1段的呢或者说跟电脑ip段相同, 下面是模拟器ip地址 下面是我电脑的ip地址(window2003sp2) 解决方案 这个可以自己设置的,检查下配置文件. 解决方案二: WinCE 的模拟器,功能是有限的. 模拟器运行在 PC 上,可以使用 PC 的网络,但这只是一个

c# wince6.0 可以部署到真机上,但是不能调试,设置的断点处不停。

问题描述 c# wince6.0 可以部署到真机上,但是不能调试,设置的断点处不停. wince5.0 可以部署到真机上,正常运行调试,但是换wince6.0 就不能调试了,其它都很正常,不知道什么原因? 不知道是软件安装问题还是同步软件的问题?

wince6 0-想要在wince6.0下添加一个软关机的功能,就像xp一样

问题描述 想要在wince6.0下添加一个软关机的功能,就像xp一样 请教诸位大神,小弟用vs2005编译一个intel_X86芯片上的wince6.0系统,本身系统只有一个suspend功能,我就想添加一个关机的功能,今天看了一点电源管理方面的知识,想用直接调用setsystempowerstate()函数,但是没啥效果,求各位大神给个思路或步骤啥地,明天争取做出来,跪谢啊...... 解决方案 wince中实现关机功能 http://blog.csdn.net/ymzhou117/artic

wince6.0怎么设置为竖屏内核

问题描述 wince6.0怎么设置为竖屏内核 请问如何修改驱动参数使之变成竖屏.通过修改注册表只能把显示调整成竖屏,即LCD旋转90度,但是触摸点的位置还是原来的.所以真能通过调整驱动来实现,