mirror of https://github.com/rusefi/wideband.git
this probably doesn't work
This commit is contained in:
parent
8ab95e18c1
commit
98fc25540f
|
@ -39,9 +39,10 @@ void boot_app() {
|
||||||
((ResetVectorFunction)reset_vector)();
|
((ResetVectorFunction)reset_vector)();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t appFlashAddr = (uint32_t)&__appflash_start__;
|
||||||
|
|
||||||
void EraseAppPages()
|
void EraseAppPages()
|
||||||
{
|
{
|
||||||
uint32_t appFlashAddr = (uint32_t)&__appflash_start__;
|
|
||||||
uintptr_t blSize = (uintptr_t)(appFlashAddr - 0x08000000);
|
uintptr_t blSize = (uintptr_t)(appFlashAddr - 0x08000000);
|
||||||
size_t pageIdx = blSize / 1024;
|
size_t pageIdx = blSize / 1024;
|
||||||
|
|
||||||
|
@ -54,6 +55,129 @@ void EraseAppPages()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool holdBoot = false;
|
||||||
|
|
||||||
|
void WaitForBootloaderCmd()
|
||||||
|
{
|
||||||
|
while(true)
|
||||||
|
{
|
||||||
|
CANRxFrame frame;
|
||||||
|
msg_t result = canReceiveTimeout(&CAND1, CAN_ANY_MAILBOX, &frame, TIME_INFINITE);
|
||||||
|
|
||||||
|
// Ignore non-ok results
|
||||||
|
if (result != MSG_OK)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we got a bootloader-init message, here we go!
|
||||||
|
if (frame.EID == 0xEF0'0000)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendAck()
|
||||||
|
{
|
||||||
|
CANTxFrame frame;
|
||||||
|
|
||||||
|
frame.IDE = CAN_IDE_EXT;
|
||||||
|
frame.EID = 0x727573; // ascii "rus"
|
||||||
|
frame.RTR = CAN_RTR_DATA;
|
||||||
|
frame.DLC = 0;
|
||||||
|
|
||||||
|
canTransmitTimeout(&CAND1, CAN_ANY_MAILBOX, &frame, TIME_INFINITE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sendNak()
|
||||||
|
{
|
||||||
|
// TODO: implement
|
||||||
|
}
|
||||||
|
|
||||||
|
void RunBootloaderLoop()
|
||||||
|
{
|
||||||
|
// First ack that the bootloader is alive
|
||||||
|
sendAck();
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
CANRxFrame frame;
|
||||||
|
msg_t result = canReceiveTimeout(&CAND1, CAN_ANY_MAILBOX, &frame, TIME_INFINITE);
|
||||||
|
|
||||||
|
// Ignore non-ok results
|
||||||
|
if (result != MSG_OK)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 29-bit extended ID:
|
||||||
|
// 0 xxxy zzzz
|
||||||
|
// xx = header, always equals 0xEF
|
||||||
|
// y = opcode
|
||||||
|
// zzzz = extra 2 data bytes hidden in the address!
|
||||||
|
|
||||||
|
uint16_t header = frame.EID >> 20;
|
||||||
|
|
||||||
|
// All rusEfi bootloader packets start with 0x0EF, ignore other traffic on the bus
|
||||||
|
if (header != 0x0EF)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t opcode = (frame.EID >> 16) & 0xFF;
|
||||||
|
uint16_t embeddedData = frame.EID & 0xFFFF;
|
||||||
|
|
||||||
|
switch (opcode) {
|
||||||
|
case 0x00: // opcode 0 is simply the "enter BL" command, but we're already here. Send an ack.
|
||||||
|
sendAck();
|
||||||
|
break;
|
||||||
|
case 0x01: // opcode 1 is "erase app flash"
|
||||||
|
// embedded data must be 0x5A5A
|
||||||
|
if (embeddedData == 0x5A5A)
|
||||||
|
{
|
||||||
|
EraseAppPages();
|
||||||
|
sendAck();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
sendNak();
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x02: // opcode 2 is "write flash data"
|
||||||
|
// Embedded data is the flash address
|
||||||
|
|
||||||
|
Flash::Write(appFlashAddr + embeddedData, &frame.data8[0], frame.DLC);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 0x03: // opcode 3 is "boot app"
|
||||||
|
// Clear the flag
|
||||||
|
holdBoot = false;
|
||||||
|
// Kill this thread
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
THD_WORKING_AREA(waBootloaderThread, 512);
|
||||||
|
THD_FUNCTION(BootloaderThread, arg)
|
||||||
|
{
|
||||||
|
WaitForBootloaderCmd();
|
||||||
|
|
||||||
|
// We've rx'd a BL command, don't load the app!
|
||||||
|
holdBoot = true;
|
||||||
|
|
||||||
|
RunBootloaderLoop();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Threads creation table, one entry per thread.
|
||||||
|
*/
|
||||||
|
THD_TABLE_BEGIN
|
||||||
|
THD_TABLE_THREAD(0, "bootloader", waBootloaderThread, BootloaderThread, nullptr)
|
||||||
|
THD_TABLE_END
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Application entry point.
|
* Application entry point.
|
||||||
*/
|
*/
|
||||||
|
@ -69,7 +193,8 @@ int main(void) {
|
||||||
chThdSleepMilliseconds(40);
|
chThdSleepMilliseconds(40);
|
||||||
}
|
}
|
||||||
|
|
||||||
//EraseAppPages();
|
// Block until booting the app is allowed
|
||||||
|
while (holdBoot) ;
|
||||||
|
|
||||||
boot_app();
|
boot_app();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue