void showUSAEnding() { int loop; EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabusavsch1Palette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabusavsch1data[loop]; } WaitForVblank(); Flip(); Sleep(6000); EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabusavsch2Palette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabusavsch2data[loop]; } WaitForVblank(); Flip(); Sleep(6000); EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabfinalusaPalette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabfinalusadata[loop]; } WaitForVblank(); Flip(); Sleep(6000); WaitForStart(); EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabmaonixPalette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabmaonixdata[loop]; } WaitForVblank(); Flip(); Sleep(6500); }
void showChinaEnding() { int loop; EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabchvsusa1Palette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabchvsusa1data[loop]; } WaitForVblank(); Flip(); Sleep(6000); EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabchvsusa2Palette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabchvsusa2data[loop]; } WaitForVblank(); Flip(); Sleep(6000); EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabfinalchPalette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabfinalchdata[loop]; } WaitForVblank(); Flip(); Sleep(6000); WaitForStart(); EraseScreen(); for(loop=0;loop<256;loop++) { ScreenPal[loop] = tabmaonixPalette[loop]; } for(loop=0;loop<19200;loop++) { ScreenBuffer[loop] = tabmaonixdata[loop]; } WaitForVblank(); Flip(); Sleep(6500); }
bool CRecorder::Work() { while (1) { if (GetStopFlag()) { // top of loop stop check return(WaitForStart()); } else { if (m_Engine->GetPluginCount()) { QREAD(&m_InputQueue, m_Frame); // read input frame if (!IsDone()) { m_SurfDesc.lpSurface = m_Frame->Buf; if (FAILED(m_FrameSurf->SetSurfaceDesc(&m_SurfDesc, 0))) { AfxMessageBox(IDS_REC_CANT_SET_SURFACE); return(FALSE); } HDC sdc; if (m_FrameSurf->GetDC(&sdc) != DD_OK) { AfxMessageBox(IDS_REC_CANT_GET_SURFACE); return(FALSE); } CSize FrameSize = GetEngine()->GetFrameSize(); if (FrameSize != m_RecInfo.m_OutFrameSize) { StretchBlt(m_OutDC, 0, 0, m_RecInfo.m_OutFrameSize.cx, m_RecInfo.m_OutFrameSize.cy, sdc, 0, 0, FrameSize.cx, FrameSize.cy, SRCCOPY); } else { // no stretching BitBlt(m_OutDC, 0, 0, m_RecInfo.m_OutFrameSize.cx, m_RecInfo.m_OutFrameSize.cy, sdc, 0, 0, SRCCOPY); // ordinary blit performs better } m_FrameSurf->ReleaseDC(sdc); m_RecAvi.AddFrame(m_OutDib); m_FrameCounter++; } else { // reached end of recording if (!m_RecInfo.m_Unlimited && !m_IsEnding) { theApp.GetMain()->PostMessage(UWM_ENDRECORD); m_IsEnding = TRUE; // only one notification } } QWRITE(m_Engine->GetRenderQueue(), m_Frame); // write frame to render queue m_Frame = NULL; // so unhook knows current frame was written } else { // no plugins, nothing to record Sleep(NO_PLUGINS_PAUSE); // yield CPU } } } }
signed WaitForRestart (struct plc * plc) { if (_allclr (plc->flags, PLC_QUICK_FLASH)) { char firmware [PLC_VERSION_STRING]; if (WaitForReset (plc, firmware, sizeof (firmware))) { error (PLC_EXIT (plc), 0, "Device did not Reset"); return (-1); } if (WaitForStart (plc, firmware, sizeof (firmware))) { error (PLC_EXIT (plc), 0, "Device did not Start"); return (-1); } } return (0); }
signed BootDevice1 (struct plc * plc) { char string [PLC_VERSION_STRING]; if (BootParameters1 (plc)) { return (-1); } if (BootFirmware1 (plc)) { return (-1); } if (WaitForStart (plc, string, sizeof (string))) { return (-1); } Confirm (plc, "%s is running", string); return (0); }
task main(){ init(); //Initiate pieces WaitForStart(); //Wait for the FCS to say go StartTask(joystickOne); //Start joystick polling tasks StartTask(joystickTwo); while(true){ //Main execution loop if(DEBUGMODE){DEBUG();} if(bDisconnected){ //Stop Robot if disconnected allStop(); continue; } updateSensors(); //Place any autonomous executions during teleop here } }
int main (int argc, const char * argv []) { extern struct channel channel; static const char *optv [] = { "C:i:eFN:p:P:qt:vx", "-C file -P file -N file", "Atheros Powerline Device Flash Utility for INT6300", "C f\twrite CFG file to device using VS_SET_SDRAM", "e\tredirect stderr messages to stdout", #if defined (WINPCAP) || defined (LIBPCAP) "i n\thost interface number [2]", #else "i s\thost interface name [" CHANNEL_ETHDEVICE "]", #endif "F[F]\tflash [force] NVRAM after firmware start using VS_MOD_NVM", "N f\twrite NVM file to device using VS_WR_MEM", "P f\twrite PIB file to device using VS_WR_MEM", "q\tquiet mode", #if defined (WINPCAP) || defined (LIBPCAP) "t n\tread capture time is (n) milliseconds [50]", #else "t n\tread timeout is (n) milliseconds [50]", #endif "v\tverbose mode", "x\texit on error", (const char *) (0) }; #include "../plc/plc.c" char firmware [PLC_VERSION_STRING]; signed c; if (getenv (PLCDEVICE)) { #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (getenv (PLCDEVICE)); #else channel.ifname = strdup (getenv (PLCDEVICE)); #endif } optind = 1; opterr = 1; while ((c = getoptv (argc, argv, optv)) != -1) { switch ((char) (c)) { case 'i': #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (optarg); #else channel.ifname = optarg; #endif break; case 'q': _setbits (channel.flags, CHANNEL_SILENCE); break; case 't': channel.timeout = (unsigned)(uintspec (optarg, 0, UINT_MAX)); break; case 'v': _setbits (channel.flags, CHANNEL_VERBOSE); break; } } openchannel (&channel); desuid (); optind = 1; opterr = 1; while ((c = getoptv (argc, argv, optv)) != -1) { switch ((char) (c)) { case 'C': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.CFG.file = open (optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", optarg); } if (sdramfile (plc.CFG.file, optarg, plc.flags)) { error (1, ECANCELED, "CFG file %s is corrupt", optarg); } _setbits (plc.flags, PLC_SDRAM_CONFIG); plc.CFG.name = optarg; break; case 'e': dup2 (STDOUT_FILENO, STDERR_FILENO); break; case 'F': _setbits (plc.module, PLC_MODULE_NVM_PIB); if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { _setbits (plc.module, VS_MODULE_FORCE); } _setbits (plc.flags, PLC_FLASH_DEVICE); break; case 'N': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.NVM.file = open (optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", optarg); } plc.NVM.name = optarg; if (nvmfile1 (&plc.NVM)) { error (1, errno, "Bad firmware file: %s", plc.NVM.name); } _setbits (plc.flags, PLC_WRITE_MAC); break; case 'P': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.PIB.file = open (optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", optarg); } plc.PIB.name = optarg; if (pibfile1 (&plc.PIB)) { error (1, errno, "Bad parameter file: %s", plc.PIB.name); } _setbits (plc.flags, PLC_WRITE_PIB); break; case 'q': _setbits (plc.flags, PLC_SILENCE); break; case 'v': _setbits (plc.flags, PLC_VERBOSE); break; case 'x': _setbits (plc.flags, PLC_BAILOUT); break; default: break; } } argc -= optind; argv += optind; if (argc) { error (1, ECANCELED, "Too many arguments"); } if (plc.CFG.file == -1) { error (1, ECANCELED, "No CFG file specified"); } if (plc.PIB.file == -1) { error (1, ECANCELED, "No PIB file specified"); } if (plc.NVM.file == -1) { error (1, ECANCELED, "No NVM file specified"); } if (!(plc.message = malloc (sizeof (struct message)))) { error (1, errno, PLC_NOMEMORY); } if (WaitForStart (&plc, firmware, sizeof (firmware))) { Failure (&plc, "Device must be connected"); return (-1); } if (plc.hardwareID > CHIPSET_INT6300) { Failure (&plc, "Device must be %s or earlier; try using int6kboot.", chipsetname (CHIPSET_INT6300)); return (-1); } if (strcmp (firmware, "BootLoader")) { Failure (&plc, "Bootloader must be running"); return (-1); } if (!StartDevice1 (&plc)) { if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { UpgradeDevice1 (&plc); } } free (plc.message); closechannel (&channel); exit (0); }
signed EmulateHost (struct plc * plc) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); static char const * actions [] = { "start device", "store firmware", "store parameters", "update host", "config memory", "restore defaults", "unknown" }; #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_host_action_ind { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MACTION; uint8_t MAJOR_VERSION; uint8_t MINOR_VERSION; } * indicate = (struct vs_host_action_ind *) (message); #if 0 struct __packed vs_host_action_rsp { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MSTATUS; } * response = (struct vs_host_action_rsp *) (message); #endif #ifndef __GNUC__ #pragma pack (pop) #endif struct nvm_header1 nvm_header; struct pib_header pib_header; uint32_t offset; char const * PIB = plc->PIB.name; char const * NVM = plc->NVM.name; signed timer = channel->timeout; signed status = 0; Request (plc, "Waiting for Host Action"); while (1) { channel->timeout = plc->timer; status = ReadMME (plc, 0, (VS_HOST_ACTION | MMTYPE_IND)); channel->timeout = timer; if (status < 0) { break; } if (status > 0) { printf ("\n"); if (indicate->MACTION < (sizeof (actions) / sizeof (char const *))) { Confirm (plc, "Host Action Request is (%d) %s.", indicate->MACTION, actions [indicate->MACTION]); } else { error (0, ENOTSUP, "Host Action 0x%0X", indicate->MACTION); continue; } memcpy (channel->peer, indicate->ethernet.OSA, sizeof (channel->peer)); channel->timeout = timer; if (indicate->MACTION == 0x00) { unsigned module = 0; char firmware [PLC_VERSION_STRING]; if (HostActionResponse (plc)) { return (-1); } if (lseek (plc->PIB.file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, plc->PIB.name); } if (read (plc->PIB.file, &pib_header, sizeof (pib_header)) != sizeof (pib_header)) { error (1, errno, FILE_CANTREAD, plc->PIB.name); } if (lseek (plc->PIB.file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, plc->PIB.name); } if (BE16TOH (*(uint16_t *)(&pib_header)) < 0x0305) { offset = LEGACY_PIBOFFSET; } else if (BE16TOH (*(uint16_t *)(&pib_header)) < 0x0500) { offset = INT6x00_PIBOFFSET; } else { offset = AR7x00_PIBOFFSET; } if (WriteMEM (plc, &plc->PIB, 0, offset, LE16TOH (pib_header.PIBLENGTH))) { return (-1); } if (lseek (plc->NVM.file, 0, SEEK_SET)) { error (1, errno, FILE_CANTHOME, plc->NVM.name); } if (read (plc->NVM.file, &nvm_header, sizeof (nvm_header)) != sizeof (nvm_header)) { error (1, errno, FILE_CANTREAD, plc->NVM.name); } while (nvm_header.NEXTHEADER) { lseek (plc->NVM.file, LE32TOH (nvm_header.NEXTHEADER), SEEK_SET); if (read (plc->NVM.file, &nvm_header, sizeof (nvm_header)) != sizeof (nvm_header)) { error (1, errno, FILE_CANTREAD, plc->NVM.name); } module++; } if (WriteFirmware1 (plc, module, &nvm_header)) { return (-1); } if (StartFirmware1 (plc, module, &nvm_header)) { return (-1); } if (WaitForStart (plc, firmware, sizeof (firmware))) { return (-1); } if (_anyset (plc->flags, PLC_FLASH_DEVICE)) { if (WriteNVM (plc)) { return (-1); } if (WritePIB (plc)) { return (-1); } if (FlashNVM (plc)) { return (-1); } } continue; } if (indicate->MACTION == 0x01) { if (HostActionResponse (plc)) { return (-1); } close (plc->NVM.file); if (ReadFirmware1 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (indicate->MACTION == 0x02) { if (HostActionResponse (plc)) { return (-1); } close (plc->PIB.file); if (ReadParameters1 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (indicate->MACTION == 0x03) { if (HostActionResponse (plc)) { return (-1); } close (plc->NVM.file); if (ReadFirmware1 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } close (plc->PIB.file); if (ReadParameters1 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (indicate->MACTION == 0x04) { #if 0 /* * Due to an omission in the INT6300 BootLoader, responding to this VS_HOST_ACTION * indication will suppress subsequent VS_HOST_ACTION messages and the device will * not request firmware and parameters; this may be corrected on the INT6400; */ if (HostActionResponse (plc)) { return (-1); } #endif if (WriteCFG (plc)) { return (-1); } /* * At this point, one could download firmware and parameters without waiting for * further requests from the device; however, we elect to wait for them since it * is 'good form'; a device should send code 0x00 within 10 seconds of this one; */ continue; } if (indicate->MACTION == 0x05) { if (HostActionResponse (plc)) { return (-1); } close (plc->NVM.file); if ((plc->NVM.file = open (plc->NVM.name = NVM, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } close (plc->PIB.file); if ((plc->PIB.file = open (plc->PIB.name = PIB, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } error (0, ENOSYS, "Host Action 0x%0X", indicate->MACTION); } } return (0); }
int main(void) { //Enable background 2 and set mode to MODE_4 setMode(MODE_4 | OBJ_MAP_1D | BG2_ENABLE); showGameIntro(); WaitForStart(); EraseScreen(); initGameBasicParameters(); //game loop while(1) { if(score1 != MAX_POINTS_TO_WIN && score2 != MAX_POINTS_TO_WIN){ waitRetrace(); eraseBall(); erasePaddle1(); erasePaddle2(); updatePaddle1(); updatePaddle2(); updateBall(); drawPaddle1(); drawPaddle2(); checkCollisions(); drawBall(); printScores(); }else{ if(score1 == MAX_POINTS_TO_WIN && state == 0){ // PLAYER-CHINA score1 = 0; score2 = 0; //Enable background 2 and set mode to MODE_4 setMode(MODE_4 | OBJ_MAP_1D | BG2_ENABLE); showChinaEnding(); EraseScreen(); } if(score1 == MAX_POINTS_TO_WIN && state == 1){ // PLAYER-USA score1 = 0; score2 = 0; //Enable background 2 and set mode to MODE_4 setMode(MODE_4 | OBJ_MAP_1D | BG2_ENABLE); showUSAEnding(); EraseScreen(); } if(score2 == MAX_POINTS_TO_WIN && state == 0){ // CPU-CHINA score2 = 0; score1 = 0; //Enable background 2 and set mode to MODE_4 setMode(MODE_4 | OBJ_MAP_1D | BG2_ENABLE); //showChinaEnding(); showPlayerDefeatedByEEUU(); EraseScreen(); } if(score2 == MAX_POINTS_TO_WIN && state == 1){ // CPU-USA score2 = 0; score1 = 0; //Enable background 2 and set mode to MODE_4 setMode(MODE_4 | OBJ_MAP_1D | BG2_ENABLE); //showUSAEnding(); showPlayerDefeatedByChina(); EraseScreen(); } initGameBasicParameters(); } } return 0; }
int main (int argc, char const * argv []) { extern struct channel channel; char firmware [PLC_VERSION_STRING]; static char const * optv [] = { "ei:lqt:vw:xX", "file [file] [...]", "Qualcomm Atheros PLC Test Applet Loader", "e\tredirect stderr to stdout", #if defined (WINPCAP) || defined (LIBPCAP) "i n\thost interface is (n) [" OPTSTR (CHANNEL_ETHNUMBER) "]", #else "i s\thost interface is (s) [" OPTSTR (CHANNEL_ETHDEVICE) "]", #endif "l\tloop until program is terminated", "q\tquiet mode", "t n\tread timeout is (n) milliseconds [" OPTSTR (CHANNEL_TIMEOUT) "]", "v\tverbose mode", "w n\twait time is (n) seconds [" OPTSTR (PLC_TIMER) "]", "x\texit on error", "X\texit on start", (char const *) (0) }; #include "../plc/plc.c" signed loop = 0; signed c; if (getenv (PLCDEVICE)) { #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (getenv (PLCDEVICE)); #else channel.ifname = strdup (getenv (PLCDEVICE)); #endif } optind = 1; while ((c = getoptv (argc, argv, optv)) != -1) { switch (c) { case 'e': dup2 (STDOUT_FILENO, STDERR_FILENO); break; case 'i': #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (optarg); #else channel.ifname = optarg; #endif break; case 'l': loop = 1; break; case 'q': _setbits (channel.flags, CHANNEL_SILENCE); _setbits (plc.flags, PLC_SILENCE); break; case 't': channel.timeout = (signed)(uintspec (optarg, 0, UINT_MAX)); break; case 'v': _setbits (channel.flags, CHANNEL_VERBOSE); _setbits (plc.flags, PLC_VERBOSE); break; case 'w': plc.timer = (unsigned)(uintspec (optarg, 0, 3600)); break; case 'x': _setbits (plc.flags, PLC_BAILOUT); break; case 'X': _setbits (plc.flags, PLC_QUICK_FLASH); break; } } argc -= optind; argv += optind; openchannel (&channel); if (!(plc.message = malloc (sizeof (* plc.message)))) { error (1, errno, PLC_NOMEMORY); } if (WaitForStart (&plc, firmware, sizeof (firmware))) { error (1, ECANCELED, PLC_NODETECT); } if (strcmp (firmware, "BootLoader")) { error (1, ECANCELED, "BootLoader must be running"); } do { sequence (&plc, argc, argv); } while (loop); free (plc.message); closechannel (&channel); return (plc.state); }
int main (int argc, char const * argv []) { extern struct channel channel; static char const * optv [] = { "eFi:N:p:P:qS:t:vx", "-N file -P file [device] [device] [...]", "Qualcomm Atheros Panther/Lynx Powerline Device Bootstrapper", "e\tredirect stderr to stdout", "F[F]\tFlash [Force] non-volatile memory after boot", #if defined (WINPCAP) || defined (LIBPCAP) "i n\thost interface is (n) [" OPTSTR (CHANNEL_ETHNUMBER) "]", #else "i s\thost interface is (s) [" OPTSTR (CHANNEL_ETHDEVICE) "]", #endif "N f\tfirmware file is (f)", "P f\tparameter file is (f)", "q\tquiet mode", "S f\tsoftloader file is (f)", "t n\tread timeout is (n) milliseconds [" OPTSTR (CHANNEL_TIMEOUT) "]", "v\tverbose mode", "x\texit on error", (char const *) (0) }; #include "../plc/plc.c" char firmware [PLC_VERSION_STRING]; signed c; if (getenv (PLCDEVICE)) { #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (getenv (PLCDEVICE)); #else channel.ifname = strdup (getenv (PLCDEVICE)); #endif } optind = 1; while ((c = getoptv (argc, argv, optv)) != -1) { switch (c) { case 'e': dup2 (STDOUT_FILENO, STDERR_FILENO); break; case 'F': _setbits (plc.module, (VS_MODULE_MAC | VS_MODULE_PIB)); if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { _setbits (plc.module, VS_MODULE_FORCE); } _setbits (plc.flags, PLC_FLASH_DEVICE); break; case 'i': #if defined (WINPCAP) || defined (LIBPCAP) channel.ifindex = atoi (optarg); #else channel.ifname = optarg; #endif break; case 'N': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.NVM.file = open (plc.NVM.name = optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc.NVM.name); } if (nvmfile2 (&plc.NVM)) { error (1, errno, "Bad NVM file: %s", plc.NVM.name); } _setbits (plc.flags, PLC_WRITE_MAC); break; case 'P': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.PIB.file = open (plc.PIB.name = optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc.PIB.name); } if (pibfile2 (&plc.PIB)) { error (1, errno, "Bad PIB file: %s", plc.PIB.name); } _setbits (plc.flags, PLC_WRITE_PIB); break; case 'q': _setbits (channel.flags, CHANNEL_SILENCE); _setbits (plc.flags, PLC_SILENCE); break; case 'S': if (!checkfilename (optarg)) { error (1, EINVAL, "%s", optarg); } if ((plc.CFG.file = open (plc.CFG.name = optarg, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc.CFG.name); } if (nvmfile2 (&plc.CFG)) { error (1, errno, "Bad NVM file: %s", plc.CFG.name); } break; case 't': channel.timeout = (signed)(uintspec (optarg, 0, UINT_MAX)); break; case 'v': _setbits (channel.flags, CHANNEL_VERBOSE); _setbits (plc.flags, PLC_VERBOSE); break; case 'x': _setbits (plc.flags, PLC_BAILOUT); break; default: break; } } argc -= optind; argv += optind; if (argc) { error (1, ENOTSUP, ERROR_TOOMANY); } openchannel (&channel); if (!(plc.message = malloc (sizeof (* plc.message)))) { error (1, errno, PLC_NOMEMORY); } if (WaitForStart (&plc, firmware, sizeof (firmware))) { Failure (&plc, PLC_NODETECT); exit (1); } if (plc.hardwareID < CHIPSET_INT6400) { Failure (&plc, "Device must be %s or later; Use program int6kboot instead.", chipsetname (CHIPSET_INT6400)); exit (1); } if (strcmp (firmware, "BootLoader")) { Failure (&plc, "Bootloader must be running"); exit (1); } if (plc.PIB.file == -1) { error (1, ECANCELED, "No Parameter file named"); } if (plc.NVM.file == -1) { error (1, ECANCELED, "No Firmware file named"); } if (plc.CFG.file == -1) { if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { error (1, ECANCELED, "No Softloader file named"); } } if (!InitDevice2 (&plc)) { if (!BootDevice2 (&plc)) { if (_anyset (plc.flags, PLC_FLASH_DEVICE)) { FlashDevice2 (&plc); } } } free (plc.message); closechannel (&channel); exit (0); }
signed function (struct plc * plc, char const * socket) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); static char const * actions [] = { "start device", "store firmware", "store parameters", "update host", "config memory", "restore defaults", "unknown" }; #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_host_action_ind { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MACTION; uint8_t MAJOR_VERSION; uint8_t MINOR_VERSION; } * indicate = (struct vs_host_action_ind *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif signed fd = opensocket (socket); char firmware [PLC_VERSION_STRING]; char const * FactoryNVM = plc->NVM.name; char const * FactoryPIB = plc->PIB.name; signed action; signed status; write (fd, MESSAGE, strlen (MESSAGE)); while (!done) { status = ReadMME (plc, 0, (VS_HOST_ACTION | MMTYPE_IND)); if (status < 0) { break; } if (status < 1) { continue; } action = indicate->MACTION; if (action < SIZEOF (actions)) { fprintf(stderr, "plchostd2: action = %s\n", actions[action]); } else { fprintf(stderr, "plchostd2: action = %d\n", action); } memcpy (channel->peer, indicate->ethernet.OSA, sizeof (channel->peer)); if (HostActionResponse (plc)) { return (-1); } if (action == 0x00) { if (BootDevice2 (plc)) { return (-1); } if (WaitForStart (plc, firmware, sizeof (firmware))) { return (-1); } if (_anyset (plc->flags, PLC_FLASH_DEVICE)) { FlashDevice2 (plc, (PLC_COMMIT_FORCE | PLC_COMMIT_NORESET | PLC_COMMIT_FACTPIB)); } continue; } if (action == 0x01) { close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } continue; } if (action == 0x02) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x03) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x04) { if (InitDevice2 (plc)) { return (-1); } continue; } if (action == 0x05) { close (plc->NVM.file); if ((plc->NVM.file = open (plc->NVM.name = FactoryNVM, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } close (plc->PIB.file); if ((plc->PIB.file = open (plc->PIB.name = FactoryPIB, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x06) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } continue; } error (0, ENOSYS, "Host Action 0x%02X", action); } close (fd); return (0); }
signed ResetAndWait (struct int6k * int6k) { struct channel * channel = (struct channel *)(int6k->channel); struct message * message = (struct message *)(int6k->message); #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_rs_dev_confirm { struct header_eth ethernet; struct header_int intellon; uint8_t MSTATUS; } * confirm = (struct vs_rs_dev_confirm *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif char string [INT6K_VERSTRING]; Request (int6k, "Reset Device"); memset (message, 0, sizeof (struct message)); EthernetHeader (&message->ethernet, channel->peer, channel->host); IntellonHeader (&message->intellon, (VS_RS_DEV | MMTYPE_REQ)); int6k->packetsize = ETHER_MIN_LEN; if (SendMME (int6k) <= 0) { error ((int6k->flags & INT6K_BAILOUT), ECANCELED, INT6K_CANTSEND); return (-1); } #if 0 if (ReadMME (int6k, (VS_RS_DEV | MMTYPE_CNF)) <= 0) { error ((int6k->flags & INT6K_BAILOUT), ECANCELED, INT6K_CANTREAD); return (-1); } if (confirm->MSTATUS) { Failure (int6k, INT6K_WONTDOIT); return (-1); } Confirm (int6k, "Resetting ..."); if (WaitForReset (int6k)) { return (-1); } if (WaitForStart (int6k, string, sizeof (string))) { return (-1); } #else while (ReadMME (int6k, (VS_RS_DEV | MMTYPE_CNF)) > 0) { if (confirm->MSTATUS) { continue; } Confirm (int6k, "Start %s", string); return (0); } #endif return (-1); }
signed ResetAndWait (struct plc * plc) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_rs_dev_request { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MSTATUS; } * request = (struct vs_rs_dev_request *) (message); struct __packed vs_rs_dev_confirm { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MSTATUS; uint8_t MDEVICEID; uint8_t MVERLENGTH; char MVERSION [PLC_VERSION_STRING]; } * confirm = (struct vs_rs_dev_confirm *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif char firmware [PLC_VERSION_STRING]; Request (plc, "Reset Device"); memset (message, 0, sizeof (* message)); EthernetHeader (&request->ethernet, channel->peer, channel->host, channel->type); QualcommHeader (&request->qualcomm, 0, (VS_RS_DEV | MMTYPE_REQ)); plc->packetsize = (ETHER_MIN_LEN - ETHER_CRC_LEN); if (SendMME (plc) <= 0) { error (PLC_EXIT (plc), errno, CHANNEL_CANTSEND); return (-1); } memset (firmware, 0, sizeof (firmware)); #if 0 if (ReadMME (plc, (VS_RS_DEV | MMTYPE_CNF)) <= 0) { error (PLC_EXIT (plc), errno, CHANNEL_CANTREAD); return (-1); } if (confirm->MSTATUS) { Failure (plc, PLC_WONTDOIT); return (-1); } Confirm (plc, "Resetting ..."); if (WaitForReset (plc)) { Failure (plc, "Device did not Reset"); return (-1); } if (WaitForStart (plc, firmware, sizeof (firmware))) { Failure (plc, "Device did not Start"); return (-1); } #else while (ReadMME (plc, 0, (VS_RS_DEV | MMTYPE_CNF)) > 0) { if (confirm->MSTATUS) { continue; } return (0); } #endif return (-1); }
signed function (struct plc * plc) { struct channel * channel = (struct channel *)(plc->channel); struct message * message = (struct message *)(plc->message); #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_host_action_ind { struct ethernet_hdr ethernet; struct qualcomm_hdr qualcomm; uint8_t MACTION; uint8_t MAJOR_VERSION; uint8_t MINOR_VERSION; } * indicate = (struct vs_host_action_ind *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif char firmware [PLC_VERSION_STRING]; char const * FactoryNVM = plc->NVM.name; char const * FactoryPIB = plc->PIB.name; signed status; while (true) { status = ReadMME (plc, 0, (VS_HOST_ACTION | MMTYPE_IND)); if (status < 0) { break; } if (status > 0) { signed action = indicate->MACTION; memcpy (channel->peer, indicate->ethernet.OSA, sizeof (channel->peer)); if (HostActionResponse (plc)) { return (-1); } if (action == 0x00) { if (BootDevice2 (plc)) { return (-1); } if (WaitForStart (plc, firmware, sizeof (firmware))) { return (-1); } if (_anyset (plc->flags, PLC_FLASH_DEVICE)) { FlashDevice2 (plc, (PLC_COMMIT_FORCE | PLC_COMMIT_NORESET | PLC_COMMIT_FACTPIB)); } continue; } if (action == 0x01) { close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } continue; } if (action == 0x02) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x03) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } close (plc->NVM.file); if (ReadFirmware2 (plc)) { return (-1); } if ((plc->NVM.file = open (plc->NVM.name = plc->nvm.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x04) { if (InitDevice2 (plc)) { return (-1); } continue; } if (action == 0x05) { close (plc->NVM.file); if ((plc->NVM.file = open (plc->NVM.name = FactoryNVM, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->NVM.name); } close (plc->PIB.file); if ((plc->PIB.file = open (plc->PIB.name = FactoryPIB, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } if (ResetDevice (plc)) { return (-1); } continue; } if (action == 0x06) { close (plc->PIB.file); if (ReadParameters2 (plc)) { return (-1); } if ((plc->PIB.file = open (plc->PIB.name = plc->pib.name, O_BINARY|O_RDONLY)) == -1) { error (1, errno, "%s", plc->PIB.name); } continue; } error (0, ENOSYS, "Host Action 0x%02X", action); } } return (0); }
int StartFirmware (struct int6k * int6k, struct header_nvm * header_nvm) { char firmware [INT6K_VERSTRING]; struct channel * channel = (struct channel *)(int6k->channel); struct message * message = (struct message *)(int6k->message); #ifndef __GNUC__ #pragma pack (push,1) #endif struct __packed vs_st_mac_request { struct header_eth ethernet; struct header_int intellon; uint8_t MODULEID; uint8_t RESERVED [3]; uint32_t IMAGELOAD; uint32_t IMAGELENGTH; uint32_t IMAGECHECKSUM; uint32_t IMAGESTART; } * request = (struct vs_st_mac_request *) (message); struct __packed vs_st_mac_confirm { struct header_eth ethernet; struct header_int intellon; uint8_t MSTATUS; uint8_t MODULEID; } * confirm = (struct vs_st_mac_confirm *) (message); #ifndef __GNUC__ #pragma pack (pop) #endif memset (message, 0, sizeof (struct message)); EthernetHeader (&message->ethernet, channel->peer, channel->host); IntellonHeader (&message->intellon, (VS_ST_MAC | MMTYPE_REQ)); int6k->packetsize = ETHER_MIN_LEN; request->MODULEID = VS_MODULE_MAC; request->IMAGELOAD = header_nvm->IMAGEADDR; request->IMAGELENGTH = header_nvm->IMAGELENGTH; request->IMAGECHECKSUM = header_nvm->IMAGECHECKSUM; request->IMAGESTART = header_nvm->ENTRYPOINT; if (SendMME (int6k) <= 0) { error ((int6k->flags & INT6K_BAILOUT), ECANCELED, INT6K_CANTSEND); return (-1); } if (ReadMME (int6k, (VS_ST_MAC | MMTYPE_CNF)) <= 0) { error ((int6k->flags & INT6K_BAILOUT), ECANCELED, INT6K_CANTREAD); return (-1); } if (confirm->MSTATUS) { Failure (int6k, "Firmware will not Start."); return (-1); } if (WaitForStart (int6k, firmware, sizeof (firmware))) { return (-1); } Confirm (int6k, "Started %s", firmware); return (0); }