00001
00002
00014
00015
00016
00017
00018
00019
00020
00021
00022 #define BOOTUP_C
00023 #include "bootup.h"
00024 #include "mdns.h"
00025 #include "TCPIP.h"
00026 #include "stringtable.h"
00027 #include "sralloc.h"
00028
00029 #include "projectdefs.h"
00030
00031
00032
00033
00034
00035
00036
00037 typedef enum
00038 {
00039 BOOTUP_SM_STARTUP = 0,
00040 BOOTUP_SM_STARTUP_WAIT,
00041 BOOTUP_SM_STARTUP_LANGUAGE,
00042 BOOTUP_SM_STARTUP_FINI,
00043 BOOTUP_SM_IPSET,
00044 BOOTUP_SM_NOLINK,
00045 BOOTUP_SM_NOLINK_WAIT,
00046 BOOTUP_SM_WAIT_FOR_IP,
00047 BOOTUP_SM_START_CHECK_IP,
00048 BOOTUP_SM_CHECK_IP,
00049 BOOTUP_SM_IP_ERROR,
00050 BOOTUP_SM_SHOW_IP_ERROR,
00051 BOOTUP_SM_DISPLAY_IPDATA,
00052 BOOTUP_SM_WAIT_FOR_USER,
00053 BOOTUP_SM_WAIT_FOR_NAMESERVICE,
00054 BOOTUP_SM_WAIT_FOR_USER2,
00055 BOOTUP_SM_READY
00056 } SM_BOOTUP;
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00070 static SM_BOOTUP _eBootUpSM;
00071
00075 static BOOL _bFirstTime;
00076
00077
00081 static BYTE _au8NetworkDataForBootloader[12];
00082
00083
00084
00085
00086
00087
00088 static void BootupCheckVersionTag(void);
00089
00090
00091
00092
00093
00094 void BootupInit(void)
00095 {
00096 _bFirstTime = TRUE;
00097 _eBootUpSM = BOOTUP_SM_STARTUP;
00098
00099
00100
00101
00102
00103
00104 {
00105 XEEReadArray(BOOTUP_EEPROM_ADD, (BYTE *)(&sPCommonConfig), sizeof(PCOMMON_CONFIG));
00106 }
00107
00108
00109
00110
00111 BootupCheckVersionTag();
00112
00113
00114
00115
00116
00117 if (sPCommonConfig.Flags.bIsDHCPEnabled == TRUE)
00118 {
00119
00120 DHCPEnable();
00121 DHCPReset(FALSE);
00122 }
00123 else
00124 {
00125
00126 DHCPDisable();
00127 sIPConfig.MyIPAddr.Val = sPCommonConfig.ManIPAddr.Val;
00128 sIPConfig.MyMask.Val = IPConvertSubnetToMask(sPCommonConfig.ManMask);
00129 sIPConfig.MyGateway.Val = sPCommonConfig.ManGateway.Val;
00130 sIPConfig.Flags.bIPunique = FALSE;
00131 }
00132 }
00133
00134
00135
00136
00137
00138 void BootupSetIP(void)
00139 {
00140
00141 _eBootUpSM = BOOTUP_SM_IPSET;
00142 }
00143
00144
00145
00146
00147 BOOL bBootupMain(void)
00148 {
00149
00150 if ((_eBootUpSM > BOOTUP_SM_NOLINK_WAIT) && (MACIsLinked()) == 0)
00151 {
00152 OutSwitchOffAllLEDs();
00153 u16GlobalFlags &= ~(LINKISUP_MASK);
00154 _eBootUpSM = BOOTUP_SM_NOLINK;
00155
00156 SRAMInitHeap();
00157 }
00158
00159
00160
00161
00162
00163 switch(_eBootUpSM)
00164 {
00165 case BOOTUP_SM_STARTUP:
00166
00167
00168
00169 strcpypgm2ram(lcdram_row1, (ROM char *) "eWicht " PROJECT_NAME);
00170
00171 strcpypgm2ram(lcdram_row2, (ROM char *) FIRMWARE_VERSION_STRING);
00172 lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00173 LCD_ROW2_MASK | LCD_CENTER2_MASK;
00174
00175 if (_bFirstTime == TRUE)
00176 {
00177 u8ApplTimer = 250;
00178 }
00179 else
00180 {
00181 u8ApplTimer = 50;
00182 }
00183
00184 InputButtonReset(ENC_BTN);
00185 _eBootUpSM = BOOTUP_SM_STARTUP_WAIT;
00186
00187
00188 case BOOTUP_SM_STARTUP_WAIT:
00189
00190
00191
00192 #ifndef DEBEXT_MODE
00193 if (_bFirstTime == TRUE)
00194 {
00195 switch (u8ApplTimer)
00196 {
00197 case 250:
00198 OutSetLED(LED_ACC, LED_ON);
00199 break;
00200
00201 case 240:
00202 OutSetLED(LED_FL, LED_ON);
00203 break;
00204
00205 case 230:
00206 OutSetLED(LED_F1, LED_ON);
00207 break;
00208
00209 case 220:
00210 OutSetLED(LED_F2, LED_ON);
00211 break;
00212
00213 case 210:
00214 OutSetLED(LED_F3, LED_ON);
00215 break;
00216
00217 case 200:
00218 OutSetLED(LED_F4, LED_ON);
00219 break;
00220
00221 case 190:
00222 OutSetLED(LED_PWR, LED_ON);
00223 break;
00224
00225 case 180:
00226 OutSetLED(LED_SEL, LED_ON);
00227 break;
00228
00229 case 170:
00230 OutSetLED(LED_ACC, LED_OFF);
00231 break;
00232
00233 case 160:
00234 OutSetLED(LED_FL, LED_OFF);
00235 break;
00236
00237 case 150:
00238 OutSetLED(LED_F1, LED_OFF);
00239 break;
00240
00241 case 140:
00242 OutSetLED(LED_F2, LED_OFF);
00243 break;
00244
00245 case 130:
00246 OutSetLED(LED_F3, LED_OFF);
00247 break;
00248
00249 case 120:
00250 OutSetLED(LED_F4, LED_OFF);
00251 break;
00252
00253 case 110:
00254 OutSetLED(LED_PWR, LED_OFF);
00255 break;
00256
00257 case 100:
00258 OutSetLED(LED_SEL, LED_OFF);
00259 break;
00260 }
00261 }
00262 #endif
00263
00264 if (u8ApplTimer == 0)
00265 {
00266 if (sPCommonConfig.u8LanguageID != LANGID_NOTSPECIFIED)
00267 {
00268
00269 StrTbl_SetLanguage(sPCommonConfig.u8LanguageID);
00270 _eBootUpSM = BOOTUP_SM_STARTUP_FINI;
00271 break;
00272 }
00273
00274 InputEncoderInit(0, 0, LANGID_MAX, 0);
00275 _eBootUpSM = BOOTUP_SM_STARTUP_LANGUAGE;
00276 }
00277 break;
00278
00279 case BOOTUP_SM_STARTUP_LANGUAGE:
00280 if (bInputButtonPushed(ENC_BTN)||bInputButtonPushed(F4_BTN))
00281 {
00282
00283 sPCommonConfig.u8LanguageID = (BYTE)s16InputEncoderGetValue();
00284
00285 XEEWriteArray(BOOTUP_EEPROM_ADD, (BYTE *)&sPCommonConfig, sizeof(PCOMMON_CONFIG));
00286 InputButtonReset(ENC_BTN);
00287 _eBootUpSM = BOOTUP_SM_STARTUP_FINI;
00288 }
00289 else if (bInputEncoderValueChanged() == TRUE)
00290 {
00291 strcpypgm2ram(lcdram_row1, (ROM char *) "eWicht");
00292 StrTbl_SetLanguage((BYTE)s16InputEncoderGetValue());
00293 StrTbl_GetString(lcdram_row2, STRTBLID_LANGUAGE_NAME);
00294 lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK | LCD_ROW2_MASK | LCD_CENTER2_MASK;
00295 }
00296 break;
00297
00298 case BOOTUP_SM_STARTUP_FINI:
00299
00300 _bFirstTime = FALSE;
00301 StackInit();
00302 bInitMDNSResponder();
00303 u16GlobalFlags |= LINKISUP_MASK;
00304
00305 if (bInputButtonPushed(ENC_BTN) == TRUE)
00306 {
00307
00308 IPSetInit(FALSE);
00309 _eBootUpSM = BOOTUP_SM_IPSET;
00310 }
00311 else if (sPCommonConfig.Flags.bIsDHCPEnabled == TRUE)
00312 {
00313
00314
00315 StrTbl_GetString(lcdram_row1, STRTBLID_ALLOCATE);
00316 StrTbl_GetString(lcdram_row2, STRTBLID_IP_ADDRESS);
00317
00318 lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00319 LCD_ROW2_MASK | LCD_CENTER2_MASK | LCD_PROGRESS_MASK;
00320 _eBootUpSM = BOOTUP_SM_WAIT_FOR_IP;
00321 InputButtonReset(ENC_BTN);
00322 }
00323 else
00324 {
00325
00326 _eBootUpSM = BOOTUP_SM_START_CHECK_IP;
00327 }
00328 break;
00329
00330 case BOOTUP_SM_WAIT_FOR_IP:
00331 if (bInputButtonPushed(ENC_BTN) == TRUE)
00332 {
00333
00334
00335 IPSetInit(FALSE);
00336 _eBootUpSM = BOOTUP_SM_IPSET;
00337 break;
00338 }
00339
00340 if (DHCPIsBound())
00341 {
00342
00343
00344
00345
00346 StartMDNSResponder();
00347 _eBootUpSM = BOOTUP_SM_DISPLAY_IPDATA;
00348 }
00349 else if (sIPConfig.MyIPAddr.Val)
00350 {
00351
00352
00353 _eBootUpSM = BOOTUP_SM_START_CHECK_IP;
00354 }
00355 break;
00356
00357 case BOOTUP_SM_START_CHECK_IP:
00358
00359
00360
00361
00362
00363 if (sIPConfig.Flags.bIPunique == TRUE)
00364 {
00365 _eBootUpSM = BOOTUP_SM_DISPLAY_IPDATA;
00366 break;
00367 }
00368 else
00369 {
00370 u8ApplTimer = 255;
00371 _eBootUpSM = BOOTUP_SM_CHECK_IP;
00372 }
00373
00374
00375 case BOOTUP_SM_CHECK_IP:
00376
00377 {
00378 MAC_ADDR dummy;
00379 if (u8ApplTimer == 0)
00380 {
00381
00382
00383
00384 sIPConfig.Flags.bIPunique = TRUE;
00385
00386
00387 StartMDNSResponder();
00388
00389
00390 _eBootUpSM = BOOTUP_SM_DISPLAY_IPDATA;
00391 break;
00392 }
00393
00394 if (ARPIsResolved(&sIPConfig.MyIPAddr, &dummy) == FALSE)
00395 {
00396
00397 switch(u8ApplTimer)
00398 {
00399 case 255:
00400 case 192:
00401 case 129:
00402 ARPResolve(&sIPConfig.MyIPAddr);
00403 }
00404 }
00405 else
00406
00407 _eBootUpSM = BOOTUP_SM_SHOW_IP_ERROR;
00408
00409 break;
00410 }
00411
00412 case BOOTUP_SM_SHOW_IP_ERROR:
00413
00414
00415
00416 sIPConfig.MyIPAddr.Val = 0;
00417 sIPConfig.MyMask.Val = 0;
00418 sIPConfig.MyGateway.Val = 0;
00419
00420
00421 StrTbl_GetString(lcdram_row1, STRTBLID_ADDRESS_CONFLICT1);
00422 StrTbl_GetString(lcdram_row2, STRTBLID_ADDRESS_CONFLICT2);
00423 lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00424 LCD_ROW2_MASK | LCD_CENTER2_MASK;
00425
00426 InputButtonReset(ENC_BTN);
00427 _eBootUpSM = BOOTUP_SM_IP_ERROR;
00428 break;
00429
00430 case BOOTUP_SM_IP_ERROR:
00431
00432
00433 if (bInputButtonPushed(ENC_BTN) == TRUE)
00434 {
00435 IPSetInit(FALSE);
00436 _eBootUpSM = BOOTUP_SM_IPSET;
00437 }
00438 break;
00439
00440 case BOOTUP_SM_IPSET:
00441
00442 if (IPSetMain() == TRUE)
00443 {
00444
00445 _eBootUpSM = BOOTUP_SM_STARTUP;
00446 }
00447 break;
00448
00449 case BOOTUP_SM_NOLINK:
00450
00451 StrTbl_GetString(lcdram_row1, STRTBLID_CABEL_UNPLUGGED1);
00452 StrTbl_GetString(lcdram_row2, STRTBLID_CABEL_UNPLUGGED2);
00453 lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00454 LCD_ROW2_MASK | LCD_CENTER2_MASK;
00455 _eBootUpSM = BOOTUP_SM_NOLINK_WAIT;
00456 break;
00457
00458 case BOOTUP_SM_NOLINK_WAIT:
00459
00460
00461
00462 if (bInputButtonPushed(ENC_BTN) == TRUE)
00463 {
00464 IPSetInit(FALSE);
00465 _eBootUpSM = BOOTUP_SM_IPSET;
00466 }
00467 else if (MACIsLinked())
00468 {
00469 if (sPCommonConfig.Flags.bIsDHCPEnabled)
00470 {
00471 DHCPReset(FALSE);
00472 }
00473 else
00474 {
00475 sIPConfig.Flags.bIPunique = FALSE;
00476 }
00477
00478 _eBootUpSM = BOOTUP_SM_STARTUP;
00479 }
00480 break;
00481
00482 case BOOTUP_SM_DISPLAY_IPDATA:
00483
00484
00485 if (sPCommonConfig.Flags.bIsDHCPEnabled == TRUE)
00486 {
00487 StrTbl_GetString(lcdram_row1, STRTBLID_OBTAINED_IP);
00488 }
00489 else
00490 {
00491 StrTbl_GetString(lcdram_row1, STRTBLID_MANUAL_IP);
00492 }
00493
00494 sprintf(lcdram_row2, (ROM char *) "%hhu.%hhu.%hhu.%hhu",
00495 sIPConfig.MyIPAddr.v[0], sIPConfig.MyIPAddr.v[1],
00496 sIPConfig.MyIPAddr.v[2], sIPConfig.MyIPAddr.v[3]);
00497 lcd_addr2 = 0;
00498 lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00499 LCD_CENTER2_MASK | LCD_ROW2_MASK;
00500
00501 InputButtonReset(ENC_BTN);
00502 u8ApplTimer = 250;
00503 _eBootUpSM = BOOTUP_SM_WAIT_FOR_USER;
00504 break;
00505
00506 case BOOTUP_SM_WAIT_FOR_USER:
00507 if ((u8ApplTimer == 0) || (bInputButtonPushed(ENC_BTN) == TRUE))
00508 {
00509 _eBootUpSM = BOOTUP_SM_WAIT_FOR_NAMESERVICE;
00510 }
00511 break;
00512
00513 case BOOTUP_SM_WAIT_FOR_NAMESERVICE:
00514 if(eGetMDNSState() == MDNS_HAS_STOPPED)
00515 {
00516
00517
00518
00519
00520
00521
00522
00523 StrTbl_GetString(lcdram_row1, STRTBLID_NAMESERVICE);
00524 StrTbl_GetString(lcdram_row2, STRTBLID_STOPPED);
00525 lcd_status = LCD_CLR_MASK | LCD_ROW1_MASK | LCD_CENTER1_MASK |
00526 LCD_ROW2_MASK | LCD_CENTER2_MASK;
00527
00528 InputButtonReset(ENC_BTN);
00529 u8ApplTimer = 250;
00530 _eBootUpSM = BOOTUP_SM_WAIT_FOR_USER2;
00531 }
00532 else if(eGetMDNSState() == MDNS_IS_RUNNING)
00533 {
00534 _eBootUpSM = BOOTUP_SM_READY;
00535 }
00536
00537 break;
00538
00539 case BOOTUP_SM_WAIT_FOR_USER2:
00540 if ((u8ApplTimer == 0) || (bInputButtonPushed(ENC_BTN) == TRUE))
00541 {
00542 _eBootUpSM = BOOTUP_SM_READY;
00543 }
00544 break;
00545
00546 case BOOTUP_SM_READY:
00547
00548 return TRUE;
00549 }
00550
00551 return FALSE;
00552 }
00553
00554
00555
00556
00557 void BootupEnterBootloader(void)
00558 {
00559
00560 memcpypgm2ram(_au8NetworkDataForBootloader, pu8MAC, 6);
00561 memcpy((void *)&_au8NetworkDataForBootloader[6], (void *)&sIPConfig.MyIPAddr, 4);
00562 *(WORD *)(&_au8NetworkDataForBootloader[10]) = CalcIPChecksum(_au8NetworkDataForBootloader, 6+4);
00563
00564 PROD = (WORD) _au8NetworkDataForBootloader;
00565 }
00566
00567
00568
00569
00570 void BootupRestoreState(void)
00571 {
00572
00573 XEEWriteArray(BOOTUP_EEPROM_ADD, (BYTE *)(&sPCommonConfig), sizeof(PCOMMON_CONFIG));
00574 }
00575
00576
00577
00578
00579 void BootupResetToFactory(void)
00580 {
00581 int i = 0;
00582
00583
00584
00585
00586
00587 sPCommonConfig.Flags.bIsDHCPEnabled = TRUE;
00588
00589 sPCommonConfig.ManIPAddr.v[0] = 192;
00590 sPCommonConfig.ManIPAddr.v[1] = 168;
00591 sPCommonConfig.ManIPAddr.v[2] = 0;
00592 sPCommonConfig.ManIPAddr.v[3] = 10;
00593 sPCommonConfig.ManMask = 24;
00594 sPCommonConfig.ManGateway.v[0] = 192;
00595 sPCommonConfig.ManGateway.v[1] = 168;
00596 sPCommonConfig.ManGateway.v[2] = 0;
00597 sPCommonConfig.ManGateway.v[3] = 1;
00598
00599 sPCommonConfig.LastAutoIP = GenerateAutoIP(0);
00600
00601 sPCommonConfig.u8LCDLight = 20;
00602
00603 sPCommonConfig.u32VersionTag = FIRMWARE_VERSION;
00604
00605 sPCommonConfig.TargetProject = PROJECT_ID;
00606
00607
00608 sPCommonConfig.u8LanguageID = 0xFF;
00609
00610 BootupRestoreState();
00611 }
00612
00613
00614
00615
00616 static void BootupCheckVersionTag(void)
00617 {
00618 if (sPCommonConfig.u32VersionTag == 0xFFFFFFFF)
00619 {
00620
00621
00622 ApplResetToFactory(FALSE);
00623 }
00624 else if (sPCommonConfig.u32VersionTag < FIRMWARE_VERSION)
00625 {
00626
00627
00628
00629 sPCommonConfig.u32VersionTag = FIRMWARE_VERSION;
00630 XEEWriteArray(BOOTUP_EEPROM_ADD+offsetof(PCOMMON_CONFIG, u32VersionTag), (BYTE *)&sPCommonConfig.u32VersionTag, 4);
00631 }
00632
00633 if (sPCommonConfig.TargetProject != PROJECT_ID)
00634 {
00635
00636 sPCommonConfig.TargetProject = PROJECT_ID;
00637
00638
00639 ApplResetToFactory(TRUE);
00640 }
00641 }
00642
00643
00644