⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 ARM9基于WINDOWSCE的BSP源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    //
    EdbgOutputDebugString("begin WriteFlashSettings %x-\r\n",BLDR_SETTINGS_FLASH_BASE);
     
    if (CFI_Erase_Block((unsigned16*)BLDR_SETTINGS_FLASH_BASE) != PASS)
    {
        EdbgOutputDebugString("ERROR: WriteFlashSettings - erase failed (0x%x).\r\n", 
                BLDR_SETTINGS_FLASH_BASE);
        EdbgOutputDebugString("error eraseFlash -\r\n");
        bRet = FALSE;
    }
    else
    {
        if (CFI_Write_Block((unsigned16*)BLDR_SETTINGS_FLASH_BASE, 
                            (unsigned16*)pSettings, sizeof(BLDR_SETTINGS)) != PASS)
        {
            
            EdbgOutputDebugString("ERROR: WriteFlashSettings - write failed (0x%x).\r\n", 
                    BLDR_SETTINGS_FLASH_BASE);
                            EdbgOutputDebugString("error Writeblock -\r\n");
            bRet = FALSE;
        }
    }

    return(bRet);
}

static BOOLEAN WriteDefaultFlashSettings(void)
{
    BLDR_SETTINGS Settings;

    memset(&Settings, 0, sizeof(BLDR_SETTINGS));

    Settings.nCheckSum   = 0;
    Settings.nVerMaj     = BLDR_SETTINGS_MAJOR;
    Settings.nVerMin     = BLDR_SETTINGS_MINOR;
    Settings.nFlags      = 0x06;//BLDR_SETTINGS_FLAGS_DHCP;
    Settings.nSubnetMask = ntohl(0xfffe0000);
    Settings.nJumpAddr   = FLASH_JUMP_ADDR;
   Settings.nIPAddress = ntohl(0x0a0a053c);
   // Settings.nSubnetMask = 0x0000feff;
	//Settings.nIPAddress = 0x3c050a0a;

    return(WriteFlashSettings(&Settings));
}

static BOOLEAN VerifyFlashSettings(PBLDR_SETTINGS pSettings)
{
    ULONG nCheckSum = 0;
    UCHAR nCount = 0;

    // Start just after checksum field.
    for (nCheckSum = 0, nCount = sizeof(ULONG); 
         nCount < sizeof(BLDR_SETTINGS) ; nCount++)
    {
        nCheckSum += (UCHAR)*(((PUCHAR)pSettings) + nCount);
    }
       
    return((nCheckSum == pSettings->nCheckSum)); 
}


//////////////////////////////////////////////////////////////////////
// User input and menu functions
//
static void GetStringFromSerial(PUCHAR pBuff, USHORT nLen)
{
    int nChar = 0;
    USHORT nCount = 0;

    do
    {
        while((nChar = OEMReadDebugByte()) == OEM_DEBUG_READ_NODATA)
        {
            ;
        }
        if (nChar == OEM_DEBUG_COM_ERROR)
            return;

        if (nChar == BACKSPACE && nCount)
        {
            OEMWriteDebugByte((UCHAR)BACKSPACE);
            OEMWriteDebugByte((UCHAR)' ');
            OEMWriteDebugByte((UCHAR)BACKSPACE);
            --nCount;
        }
        else if ((UCHAR)nChar != '\n' && (UCHAR)nChar != '\r')
        {
            *(pBuff + nCount) = (UCHAR)nChar;
            ++nCount;
            OEMWriteDebugByte((UCHAR)nChar);
        }
    }
    while(nCount < (nLen - 1) && (UCHAR)nChar != '\n' && (UCHAR)nChar != '\r');

    *(pBuff + nCount) = '\0';

    return;
}


static BOOLEAN UserInterrupt(void)
{
    UCHAR nCount = 5;   // Wait for 5 seconds...
    ULONG nWait  = 0;
    unsigned char sOut[12] = "Config 5...";

    while(nCount)
    {
        EdbgOutputDebugString("\rPress any key to break into configuration menu %d ...", 
                nCount);

        
        // Poll keyboard 10 times per second
        for (nWait = 0 ; nWait < 10 ; nWait++)
        {
            uSecsWait( OEM_COUNT_1MS*50, 0 );    // Wait for 50ms
       
            if (OEMReadDebugByte() != OEM_DEBUG_READ_NODATA)
            {
                return(TRUE);
            }
        }

        sOut[7]--;  // Alter the count-down in the string
        nCount--;
    }

    EdbgOutputDebugString("\r\n\r\n");

    return(FALSE);
}


static BOOLEAN ToggleFlagSetting( ULONG nFlag, PCHAR pcFlagName, 
                                  PCHAR pcFlagOn, PCHAR pcFlagOff )
{
    BLDR_SETTINGS Settings;

    memset(&Settings, 0, sizeof(BLDR_SETTINGS));

    if (!ReadFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: ToggleFlagSetting - unable to read flash settings.\r\n");
        return(FALSE);
    }
  
    //
    // Toggle the flag.
    // 
    Settings.nFlags ^= nFlag;

    EdbgOutputDebugString("%s is now %s.\r\n", pcFlagName, 
                          ((Settings.nFlags & nFlag) ? pcFlagOn : pcFlagOff));

    if (!WriteFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: ToggleFlagSetting - unable to write modified flash settings.\r\n");
        return(FALSE);
    }

    return(TRUE);
}


static void DisplayNetworkSettings(void)
{
    BLDR_SETTINGS Settings;

    memset(&Settings, 0, sizeof(BLDR_SETTINGS));

    if (!ReadFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: DisplayNetworkSettings - unable to read flash settings.\r\n");
        return;
    }

    EdbgOutputDebugString("Network Settings:\r\n");
    EdbgOutputDebugString("----------------------------------------\r\n");
    EdbgOutputDebugString("DHCP     = %s\r\n", 
            ((Settings.nFlags & BLDR_SETTINGS_FLAGS_DHCP) ? 
             "ENABLED" : "DISABLED"));
    EdbgOutputDebugString("IP       = %s\r\n", inet_ntoa(Settings.nIPAddress));
    EdbgOutputDebugString("Subnet   = %s\r\n", inet_ntoa(Settings.nSubnetMask));
    EdbgOutputDebugString("MAC      = %x.%x.%x.%x.%x.%x\r\n", (Settings.nMAC[1]>>8)&0xff,Settings.nMAC[1]&0xff,
						(Settings.nMAC[0]>>24)&0xff,(Settings.nMAC[0]>>16)&0xff,(Settings.nMAC[0]>>8)&0xff,Settings.nMAC[0]&0xff);

}


static BOOLEAN StoreIPAndSubnet(void)
{
    BLDR_SETTINGS Settings;
    CHAR szIPAddr[IPADDR_MAX];
    CHAR szSubnetMask[IPADDR_MAX];

    memset(&Settings, 0, sizeof(BLDR_SETTINGS));

    if (!ReadFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: StoreIPAndSubnet - unable to read flash settings.\r\n");
        return(FALSE);
    }

    EdbgOutputDebugString("\r\nEnter IP Address (xxx.xxx.xxx.xxx): ");
    GetStringFromSerial(&szIPAddr[0], IPADDR_MAX);
    EdbgOutputDebugString("\r\nEnter Subnet Mask (xxx.xxx.xxx.xxx): ");
    GetStringFromSerial(&szSubnetMask[0], IPADDR_MAX);
    EdbgOutputDebugString("\r\n");

    Settings.nIPAddress  = inet_addr(&szIPAddr[0]);
    Settings.nSubnetMask = inet_addr(&szSubnetMask[0]);

    if (!WriteFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: StoreIPAndSubnet - unable to write modified flash settings.\r\n");
        return(FALSE);
    }

    return(TRUE);
}

void StoreMAC(void)
{
	//random read timer value to produce MAC address
	BLDR_SETTINGS Settings;
	ULONG tick = *(ULONG *)0x20022004;  //timer0
	
       memset(&Settings, 0, sizeof(BLDR_SETTINGS));
	   if (!ReadFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: StoreIPAndSubnet - unable to read flash settings.\r\n");
        return;
    }
	Settings.nMAC[0] = tick;  
	Settings.nMAC[1] = tick<<2;
	Settings.nMAC[2] = Settings.nMAC[1];
	EdbgOutputDebugString("A random MAC address is made\r\n");
	 if (!WriteFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: StoreIPAndSubnet - unable to write modified flash settings.\r\n");
      
    }
			
}

static void LoaderNetworkMenu(void)
{
    CHAR c = 0;
    BOOLEAN bExit = FALSE;
    
    do
    {
        EdbgOutputDebugString("\r\nNetwork Settings Menu:\r\n");
        EdbgOutputDebugString("----------------------------------------\r\n");
        EdbgOutputDebugString("1.  Show Current Settings\r\n");
        EdbgOutputDebugString("2.  Toggle DHCP Enabled Setting\r\n");
        EdbgOutputDebugString("3.  Store Static IP Address And Subnet Mask\r\n");
	 EdbgOutputDebugString("4.  Store MAC Address\r\n");
        EdbgOutputDebugString("\r\n");
        EdbgOutputDebugString("9.  Return To Main Menu\r\n\r\n");
        EdbgOutputDebugString("Please make a selection: ");

        do
        {
            c = OEMReadDebugByte();
        } while(c == OEM_DEBUG_READ_NODATA || 
                ((c < '1' || c > '4') && c != '9'));

        EdbgOutputDebugString("\r\n");

        switch(c)
        {
        case '1':   // Show Current Settings.
            DisplayNetworkSettings();
            break;
        case '2':   // Toggle DHCP Enabled Setting.
            ToggleFlagSetting(BLDR_SETTINGS_FLAGS_DHCP, "DHCP", "<ENABLED>", 
                              "<DISABLED>");
            break;
        case '3':   // Store Static IP Address And Subnet Mask.
            StoreIPAndSubnet();
            break;
	case '4':   // Store MAC Address.
	     StoreMAC();
		
            break;
        case '9':   // Return To Main Menu.
            bExit = TRUE;
            break;
        default:
            EdbgOutputDebugString("\'%c\' isn't a valid menu selection\r\n", c);
        }

    } while (!bExit);
    
}

static void DisplayKitlSettings(void)
{
    BLDR_SETTINGS Settings;

    memset(&Settings, 0, sizeof(BLDR_SETTINGS));

    if (!ReadFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: DisplayKitlSettings - unable to read flash settings.\r\n");
        return;
    }

    EdbgOutputDebugString("Kitl Settings:\r\n");
    EdbgOutputDebugString("----------------------------------------\r\n");
    EdbgOutputDebugString("Kitl     = %s\r\n", 
            ((Settings.nFlags & BLDR_SETTINGS_FLAGS_NOKITL) ? 
              "DISABLED" : "ENABLED"));
    EdbgOutputDebugString("Mode     = %s\r\n", 
            ((Settings.nFlags & BLDR_SETTINGS_FLAGS_PSVKITL) ? 
              "PASSIVE" : "ACTIVE"));
}


static void LoaderKitlMenu(void)
{
    CHAR c = 0;
    BOOLEAN bExit = FALSE;
    
    do
    {
        EdbgOutputDebugString("\r\nKitl Settings Menu:\r\n");
        EdbgOutputDebugString("----------------------------------------\r\n");
        EdbgOutputDebugString("1.  Show Current Settings\r\n");
        EdbgOutputDebugString("2.  Toggle Kitl Enabled Setting\r\n");
        EdbgOutputDebugString("3.  Toggle Kitl Active Mode Setting\r\n");
        EdbgOutputDebugString("\r\n");
        EdbgOutputDebugString("9.  Return To Main Menu\r\n\r\n");
        EdbgOutputDebugString("Please make a selection: ");

        do
        {
            c = OEMReadDebugByte();
        } while(c == OEM_DEBUG_READ_NODATA || ((c < '1' || c > '3') && c != '9'));

        EdbgOutputDebugString("\r\n");

        switch(c)
        {
        case '1':   // Show Current Settings.
            DisplayKitlSettings();
            break;
        case '2':   // Toggle Kitl Enabled Setting.
            ToggleFlagSetting(BLDR_SETTINGS_FLAGS_NOKITL, "Kitl", 
                              "<DISABLED>", "<ENABLED>");
            break;
        case '3':   // Toggle Kitl Active Mode Setting.
            ToggleFlagSetting(BLDR_SETTINGS_FLAGS_PSVKITL, "Kitl Mode", 
                              "<PASSIVE>", "<ACTIVE>");
            break;
        case '9':   // Return To Main Menu.
            bExit = TRUE;
            break;
        default:
            EdbgOutputDebugString("\'%c\' isn't a valid menu selection\r\n", c);
        }

    } while (!bExit);
    
}

static void DisplayFlashSettings(void)
{
    BLDR_SETTINGS Settings;

    memset(&Settings, 0, sizeof(BLDR_SETTINGS));

    if (!ReadFlashSettings(&Settings))
    {
        EdbgOutputDebugString("ERROR: DisplayFlashSettings - unable to read flash settings.\r\n");
        return;
    }

    EdbgOutputDebugString("Flash Settings:\r\n");
    EdbgOutputDebugString("----------------------------------------\r\n");
    EdbgOutputDebugString("Force PB Flash Download/Boot = %s\r\n", 
            ((Settings.nFlags & BLDR_SETTINGS_FLAGS_FSHDLOAD) ? 
              "ENABLED" : "DISABLED"));

}


static void LoaderFlashMenu(void)
{
    CHAR c = 0;
    BOOLEAN bExit = FALSE;
    
    do
    {
        EdbgOutputDebugString("\r\nFlash Settings Menu:\r\n");
        EdbgOutputDebugString("----------------------------------------\r\n");
        EdbgOutputDebugString("1.  Show Current Settings\r\n");
        EdbgOutputDebugString("2.  Toggle Force PB Flash Download/Boot Setting\r\n");
        EdbgOutputDebugString("\r\n");
        EdbgOutputDebugString("9.  Return To Main Menu\r\n\r\n");
        EdbgOutputDebugString("Please make a selection: ");

        do
        {
            c = OEMReadDebugByte();
        } while(c == OEM_DEBUG_READ_NODATA || 
                ((c < '1' || c > '2') && c != '9'));

        EdbgOutputDebugString("\r\n");

        switch(c)
        {
        case '1':   // Show Current Settings.
            DisplayFlashSettings();
            break;
        case '2':   // Toggle Kitl Enabled Setting.
            ToggleFlagSetting(BLDR_SETTINGS_FLAGS_FSHDLOAD, 
                              "Force PB Flash Download/Boot", "<ENABLED>", 
                              "<DISABLED>");
            break;
        case '9':   // Return To Main Menu.
            bExit = TRUE;
            break;
        default:
            EdbgOutputDebugString("\'%c\' isn't a valid menu selection\r\n", c);
        }

    } while (!bExit);
    
}

static void LoaderMainMenu(void)
{
    CHAR c = 0;
    BOOLEAN bExit = FALSE;

  //  apCHARLCD_PrintXY(0, 0, "Config Menu");

    do
    {
        EdbgOutputDebugString("\r\nMain Menu:\r\n");
        EdbgOutputDebugString("----------------------------------------\r\n");
        EdbgOutputDebugString("1.  Network Settings\r\n");
        EdbgOutputDebugString("2.  Kitl Settings\r\n");
        EdbgOutputDebugString("3.  Flash Settings\r\n");
        EdbgOutputDebugString("\r\n");
        EdbgOutputDebugString("9.  Exit (Continue)\r\n\r\n");
        EdbgOutputDebugString("Please make a selection: ");

        do
        {
            c = OEMReadDebugByte();
        } while(c == OEM_DEBUG_READ_NODATA || 
                ((c < '1' || c > '3') && c != '9'));

        EdbgOutputDebugString("\r\n");

        switch(c)
        {
        case '1':   // Network Settings.
            LoaderNetworkMenu();
            break;
        case '2':   // Kitl Settings.
            LoaderKitlMenu();
            break;
        case '3':   // Flash Settings.
            LoaderFlashMenu();
            break;
        case '9':   // Exit.
            bExit = TRUE;
            break;
        default:
            EdbgOutputDebugString("\'%c\' isn't a valid menu selection\r\n", c);
        }

    } while (!bExit);

  //  apCHARLCD_PrintXY(0, 0, "           ");
}

/* EOF main.c */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -