In the function SCI_Boot at line 119 it is looking for the keyword from the packet and then throws away 16 bytes via ReadReservedFn()
uint32_t SCI_Boot(uint32_t bootMode) { uint32_t entryAddress; uint16_t byteData; // // CPU1 Patch/Escape Point 13 // entryAddress = CPU1BROM_TI_OTP_ESCAPE_POINT_13; if((entryAddress != 0xFFFFFFFFUL) && (entryAddress != 0x00000000UL)) { // // If OTP is programmed, then call OTP patch function // ((void (*)(void))entryAddress)(); } // // Check if SCI is enabled on device or not // if((HWREG(DEVCFG_BASE + SYSCTL_O_DC8) & SYSCTL_DC8_SCI_A) == 0U) { return(FLASH_ENTRY_POINT); } // // Assign GetWordData to the SCI-A version of the // function. GetWordData is a pointer to a function. // GetWordData = SCIA_GetWordData; // // Initialize the SCI-A port for communications // with the host. // // // Enable the SCI-A clocks // SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_SCIA); SysCtl_setLowSpeedClock(SYSCTL_LSPCLK_PRESCALE_4); EALLOW; HWREGH(SCIA_BASE + SCI_O_FFTX) = SCI_FFTX_SCIRST; // // 1 stop bit, No parity, 8-bit character // No loopback // HWREGH(SCIA_BASE + SCI_O_CCR) = (SCI_CONFIG_WLEN_8 | SCI_CONFIG_STOP_ONE); SCI_setParityMode(SCIA_BASE,SCI_CONFIG_PAR_NONE); // // Enable TX, RX, Use internal SCICLK // HWREGH(SCIA_BASE + SCI_O_CTL1) = (SCI_CTL1_TXENA | SCI_CTL1_RXENA); // // Disable RxErr, Sleep, TX Wake, // Disable Rx Interrupt, Tx Interrupt // HWREGB(SCIA_BASE + SCI_O_CTL2) = 0x0U; // // Relinquish SCI-A from reset and enable TX/RX // SCI_enableModule(SCIA_BASE); EDIS; // // GPIO INIT // SCIBOOT_configure_gpio(bootMode); // // CPU1 Patch/Escape Point 13 // entryAddress = CPU1BROM_TI_OTP_ESCAPE_POINT_13; if((entryAddress != 0xFFFFFFFFUL) && (entryAddress != 0x00000000UL)) { // // If OTP is programmed, then call OTP patch function // ((void (*)(void))entryAddress)(); } // // Perform autobaud lock with the host. // Note that if autobaud never occurs // the program will hang in this routine as there // is no timeout mechanism included. // SCI_lockAutobaud(SCIA_BASE); // // Read data // byteData = SCI_readCharBlockingNonFIFO(SCIA_BASE); // // Configure TX pin after autobaud lock // (Performed here to allow SCI to double as wait boot) // GPIO_setPadConfig(SCI_gpioTx,GPIO_PIN_TYPE_PULLUP); GPIO_setPinConfig(SCI_gpioTxPinConfig); // // Write data to request key // SCI_writeCharNonBlocking(SCIA_BASE,byteData); // // If the KeyValue was invalid, abort the load // and return the flash entry point. // if(SCIA_GetWordData() != SCI_DATA_WORD_KEY) { return FLASH_ENTRY_POINT; } ReadReservedFn(); entryAddress = GetLongData(); CopyData(); return entryAddress; }
In serial_flash_programmer.cpp after the parsing and the comm state is set my program reaches this line:
if (g_bf021 == true && g_bf2838x == true) //F021
and f021_DownloadKernel() is called, which opens the kernel file, runs autobaudLock() and calls loadProgram().
The function loadProgram() just starts downloading bytes. It seems that f021_SendPacket() should be called somewhere. Am I missing it?
Also SCI_Boot() calls CopyData() which just reads data, while loadProgram() wants each byte echoed back.
Thanks,
John