KITL移植错误

今天下午把OAL给编译通过了,下面的一步显然应该是KITL的调试,很早以前就听过KITL的大名,刚开始的时候并没有把它当做一回事,因为看见一些资深人士说过,在最终发布的产品中,可以带也可以不带KITL,而且不带KITL带来的好处是内核的减小,这对于嵌入式来说好处是显而易见的。所以给我留下个印象就是:既然这样为什么要KITL呢,我不用也不学不去沾就行了嘛!
可是事实并非如此,在调试驱动的时候,并不是靠LCD的视觉给你带来的感官,最多你只能知道成功与否,如果失败,你却不知道失败在哪?那我们怎么去找错呢?有了,就是KITL,正是因为它的存在使我们可以从串口看见许多有用的调试信息。这也是我坚定信念做KITL移植的原因。
在下午调试OAL的基础上,我又
编译,果然出现错误:
BUILD: [Thrd:Sequence:Type  ] Message
BUILD: [01:0000000052:ERRORE] D:\WINCE600\PLATFORM\Micro2440\SRC\KITL\.\kitl.c(47) : error C2065: 'BSP_BASE_REG_PA_CS8900A_IOBASE' : undeclared identifier
有错误很正常,我也没有想一下子成功,那样没有挑战性!呵呵,有点得瑟了。
打开kitl.c这个文件,发现里面的内容如下:
// -----------------------------------------------------------------------------
#include <windows.h>
#include <bsp.h>
#include <kitl_cfg.h>

OAL_KITL_DEVICE g_kitlDevice;

const OAL_KITL_SERIAL_DRIVER *GetKitlSerialDriver (void);
const OAL_KITL_SERIAL_DRIVER *GetKitlUSBSerialDriver (void);
static OAL_KITL_ETH_DRIVER g_kitlEthCS8900A = OAL_ETHDRV_CS8900A;

volatile S3C2440A_MEMCTRL_REG *g_pMEMCTRLReg;
volatile S3C2440A_IOPORT_REG *g_pIOPortReg;

BOOL USBSerKitl_POLL = FALSE;

BOOL InitKitlEtherArgs (OAL_KITL_ARGS *pKitlArgs)
{
    // init flags
    pKitlArgs->flags = OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_VMINI;
#ifdef CS8900A_KITL_POLLMODE
    pKitlArgs->flags |= OAL_KITL_FLAGS_POLL;
#endif //CS8900A_KITL_POLLMODE
#ifdef CS8900A_KITL_DHCP
    pKitlArgs->flags |= OAL_KITL_FLAGS_DHCP;
#endif //CS8900A_KITL_DHCP

    pKitlArgs->devLoc.IfcType     = Internal;
    pKitlArgs->devLoc.BusNumber     = 0;
    pKitlArgs->devLoc.LogicalLoc    = BSP_BASE_REG_PA_CS8900A_IOBASE;  // base address,只是的错误在这里,显然这里应该修改为DM9000,照这样推理,下面的CS89000A是不是都要换成DM8900,二者有什么联系和区别呢?
    pKitlArgs->devLoc.Pin           = 0;
   
    OALKitlStringToMAC(CS8900A_MAC,pKitlArgs->mac);

#ifndef CS8900A_KITL_DHCP
    pKitlArgs->ipAddress            = OALKitlStringToIP(CS8900A_IP_ADDRESS);
    pKitlArgs->ipMask             = OALKitlStringToIP(CS8900A_IP_MASK);
    pKitlArgs->ipRoute             = OALKitlStringToIP(CS8900A_IP_ROUTER);
#endif CS8900A_KITL_DHCP

 g_kitlDevice.ifcType   = Internal;
    g_kitlDevice.type               = OAL_KITL_TYPE_ETH;
    g_kitlDevice.pDriver            = (void *)&g_kitlEthCS8900A;

 //configure nCS3 for cs8900a
    g_pMEMCTRLReg = (S3C2440A_MEMCTRL_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_MEMCTRL, FALSE);
 g_pMEMCTRLReg->BWSCON = (g_pMEMCTRLReg->BWSCON & ~(0xf<<12)) | (0xd<<12);

 //setting EINT9 as IRQ_LAN
 if (!(pKitlArgs->flags & OAL_KITL_FLAGS_POLL))
 {
     g_pIOPortReg = (S3C2440A_IOPORT_REG *)OALPAtoVA(S3C2440A_BASE_REG_PA_IOPORT, FALSE);
  g_pIOPortReg->GPGCON = (g_pIOPortReg->GPGCON & ~(0x3<<2)) | (0x2<<2);
  g_pIOPortReg->GPGUP |= 0x1<<1;
  g_pIOPortReg->EXTINT1 = (g_pIOPortReg->EXTINT1 & ~(0x7<<4)) | (0x1<<4);
            }
    return TRUE;
}

BOOL InitKitlSerialArgs (OAL_KITL_ARGS *pKitlArgs)
{
 DWORD dwIoBase = UART_Kitl;

    // init flags
    pKitlArgs->flags = OAL_KITL_FLAGS_ENABLED | OAL_KITL_FLAGS_POLL;

    pKitlArgs->devLoc.LogicalLoc    = dwIoBase;
    pKitlArgs->devLoc.Pin           = OAL_INTR_IRQ_UNDEFINED;
    pKitlArgs->baudRate             = CBR_115200;
    pKitlArgs->dataBits             = DATABITS_8;
    pKitlArgs->parity               = PARITY_NONE;
    pKitlArgs->stopBits             = STOPBITS_10;

    g_kitlDevice.type               = OAL_KITL_TYPE_SERIAL;
    g_kitlDevice.pDriver            = (VOID*) GetKitlSerialDriver ();
   
    return TRUE;
}

BOOL InitKitlUSBSerialArgs (OAL_KITL_ARGS *pKitlArgs)
{
 DWORD dwIoBase = S3C2440A_BASE_REG_PA_USBD + 0x140;

    // init flags
    pKitlArgs->flags = OAL_KITL_FLAGS_ENABLED;
#ifdef USBSER_KITL_POLL
    pKitlArgs->flags |= OAL_KITL_FLAGS_POLL;
    USBSerKitl_POLL = TRUE;
#endif

    pKitlArgs->devLoc.LogicalLoc    = dwIoBase;
    pKitlArgs->devLoc.Pin           = IRQ_USBD;
 
    g_kitlDevice.type               = OAL_KITL_TYPE_SERIAL;
    g_kitlDevice.pDriver            = (VOID*) GetKitlUSBSerialDriver ();
   
    return TRUE;
}

//------------------------------------------------------------------------------
//
// Platform entry point for KITL. Called when KITLIoctl (IOCTL_KITL_STARTUP, ...) is called.
//

BOOL OEMKitlStartup (void)
{
    OAL_KITL_ARGS   kitlArgs, *pArgs;
    BOOL            fRet = FALSE;
    UCHAR   *szDeviceId,buffer[OAL_KITL_ID_SIZE]="\0";

    OALMSG(OAL_KITL&&OAL_FUNC, (L"+OEMKitlStartup\r\n"));
   
    memset (&kitlArgs, 0, sizeof (kitlArgs));

    pArgs = (OAL_KITL_ARGS *)OALArgsQuery(OAL_ARGS_QUERY_KITL);
    szDeviceId = (CHAR*)OALArgsQuery(OAL_ARGS_QUERY_DEVID);

    // common parts
   // kitlArgs.devLoc.IfcType = g_kitlDevice.ifcType
   //                         = InterfaceTypeUndefined;
   // g_kitlDevice.name       = g_oalIoCtlPlatformType;


   
#ifdef KITL_SERIAL
    KITLOutputDebugString ("SERIAL\n");
 RETAILMSG(1,(TEXT("KITL_SERIAL!!\r\n")));
 fRet = InitKitlSerialArgs (&kitlArgs);
 strcpy(buffer,"2440SerKitl");
 szDeviceId = buffer;
    g_kitlDevice.id = kitlArgs.devLoc.LogicalLoc;
#endif //KITL_SERIAL
#ifdef KITL_USBSERIAL
    KITLOutputDebugString ("USB SERIAL\n");
 RETAILMSG(1,(TEXT("SERIAL!!\r\n")));
 fRet = InitKitlUSBSerialArgs (&kitlArgs);
 strcpy(buffer,"2440USBSerKitl");
 szDeviceId = buffer;
    g_kitlDevice.id = kitlArgs.devLoc.LogicalLoc;
#endif //KITL_USBSERIAL
#ifdef KITL_ETHERNET
    KITLOutputDebugString ("ETHERNET\n");
 RETAILMSG(1,(TEXT("KITL_ETHETNET!!\r\n")));
 if (pArgs->devLoc.LogicalLoc == 0)
 { 
  KITLOutputDebugString ("pArgs = NULL\n");
  fRet = InitKitlEtherArgs (&kitlArgs);
     OALKitlCreateName(BSP_DEVICE_PREFIX, kitlArgs.mac, buffer);
  szDeviceId = buffer;
     g_kitlDevice.id = kitlArgs.devLoc.LogicalLoc;
    }
    else
    {
     KITLOutputDebugString ("Kitl args bring from argument setting of RAM\n");
  g_kitlDevice.ifcType   = Internal;
     g_kitlDevice.id        = BSP_BASE_REG_PA_DM9000_IOBASE;  // base address
     g_kitlDevice.type               = OAL_KITL_TYPE_ETH;
     g_kitlDevice.pDriver            = (void *)&g_kitlEthCS8900A;

  memcpy(&kitlArgs, pArgs, sizeof (kitlArgs));
  OALKitlCreateName(BSP_DEVICE_PREFIX, kitlArgs.mac, buffer);
  szDeviceId = buffer;

  fRet = TRUE;
    }
    RETAILMSG(KITL_DBON, (
        L"DeviceId................. %hs\r\n", szDeviceId
    ));
    RETAILMSG(KITL_DBON, (
        L"kitlArgs.flags............. 0x%x\r\n", kitlArgs.flags
    ));
    RETAILMSG(KITL_DBON, (
        L"kitlArgs.devLoc.IfcType.... %d\r\n",   kitlArgs.devLoc.IfcType
    ));
    RETAILMSG(KITL_DBON, (
        L"kitlArgs.devLoc.LogicalLoc. 0x%x\r\n", kitlArgs.devLoc.LogicalLoc
    ));
    RETAILMSG(KITL_DBON, (
        L"kitlArgs.devLoc.PhysicalLoc 0x%x\r\n", kitlArgs.devLoc.PhysicalLoc
    ));
    RETAILMSG(KITL_DBON, (
        L"kitlArgs.devLoc.Pin........ %d\r\n",   kitlArgs.devLoc.Pin
    ));
    RETAILMSG(KITL_DBON, (
        L"kitlArgs.ip4address........ %s\r\n",   OALKitlIPtoString(kitlArgs.ipAddress)
    ));
   
#endif //KITL_ETHERNET

 if (fRet == FALSE)
 {
     KITLOutputDebugString ("NONE\n");
  RETAILMSG(1, (TEXT("KITL Argument Setting INIT fail.\n")));
  return FALSE;
 }
 
 if ((kitlArgs.flags & OAL_KITL_FLAGS_ENABLED) == 0)
 RETAILMSG(1, (TEXT("KITL is disabled.\r\n")));
 else
 RETAILMSG(1, (TEXT("KITL is enabeld.\r\n")));
 KITLOutputDebugString ("Call OALKitlInit().\n");
 fRet = OALKitlInit (szDeviceId, &kitlArgs, &g_kitlDevice);
    return fRet;
}

DWORD OEMKitlGetSecs (void)
{
    SYSTEMTIME st;
    DWORD dwRet;
    static DWORD dwBias;
    static DWORD dwLastTime;

    OEMGetRealTime( &st );
    dwRet = ((60UL * (60UL * (24UL * (31UL * st.wMonth + st.wDay) + st.wHour) + st.wMinute)) + st.wSecond);
    dwBias = dwRet;

    if (dwRet < dwLastTime) {
        KITLOutputDebugString("! Time went backwards (or wrapped): cur: %u, last %u\n",
                              dwRet,dwLastTime);
    }
    dwLastTime = dwRet;
    return (dwRet);
}


//------------------------------------------------------------------------------
//
//  Function:  OALGetTickCount
//
//  This function is called by some KITL libraries to obtain relative time
//  since device boot. It is mostly used to implement timeout in network
//  protocol.
//

UINT32 OALGetTickCount()
{
    return OEMKitlGetSecs () * 1000;
}
看样子我还有许多的工作去做,接下来我是这么想的:
1,把KITL.C里面的CS8900A都替换成DM9000,这个方法可以一试,但是总觉得没有技术含量,直觉告诉我也不是这样,应该按照KITL的流程走。
2,我在SRC\INC目录下把所有的文件都遍历搜寻包含有CS8900A的函数,功夫不负有心人,终于有所收获:kitl_cfg.h,oal_ethdrv.h,在OAL/OALLIB目录下的intr.c。这里得说明一下,因为我在编译OAL的时候,intr.c里面的中断时DM9000,而网上流传的或者许多现成的KITL移植都是基于CS8900A进行移植的。这里让我有一个想法:A计划,把OAL/OALLIB目录下的intr.c中的DM9000换成CS8900A的Intr.c,然后重新编译OAL,这个后面有时间再试下,觉得应该行得通。B计划,就是硬着头皮,挑战一下自己的能力,进行DM9000的移植。而要完成这个艰巨的任务,我必须回到书本,熟悉整个KITL流程,这个gooogleman倒是有篇博客介绍,只是它是基于5.0的KITL介绍。呵呵,这个明天再来看。今天到这里,明天继续奋斗!

 晕!昨天写好没有发!补上!

你可能感兴趣的:(it)