WinCE6.0 KITL調試

來源:互聯網
上載者:User

 

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的代碼。文中有不貼切的地方,歡迎您指正!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.