Preserve state across resets by putting Wormhole to the newly added .noinit section. Rename The jump to bootloader USB command to reenumerate and generalize accordingly by handling the passed reenumeration mode.
This commit is contained in:
@@ -61,7 +61,8 @@ MEMORY
|
||||
m_interrupts (RX) : ORIGIN = 0x0000c000, LENGTH = 0x00000400
|
||||
m_text (RX) : ORIGIN = 0x0000c400, LENGTH = 0x00073BF0 /* SGF Linker adjusted for app */
|
||||
m_data (RW) : ORIGIN = 0x1FFF0000, LENGTH = 0x00010000
|
||||
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x00010000
|
||||
m_data_2 (RW) : ORIGIN = 0x20000000, LENGTH = 0x0000FF00
|
||||
m_noinit (RW) : ORIGIN = 0x2000FF00, LENGTH = 0x000000FF
|
||||
}
|
||||
|
||||
/* Define output sections */
|
||||
@@ -250,5 +251,21 @@ SECTIONS
|
||||
.ARM.attributes 0 : { *(.ARM.attributes) }
|
||||
|
||||
ASSERT(__StackLimit >= __HeapLimit, "region m_data_2 overflowed with stack and heap")
|
||||
}
|
||||
|
||||
.noinit (NOLOAD):
|
||||
{
|
||||
. = ALIGN(4);
|
||||
_noinit = .;
|
||||
|
||||
*(.noinit .noinit.*)
|
||||
|
||||
. = ALIGN(4) ;
|
||||
_end_noinit = .;
|
||||
} > m_noinit
|
||||
|
||||
/* Mandatory to be word aligned, _sbrk assumes this */
|
||||
PROVIDE ( end = _end_noinit ); /* was _ebss */
|
||||
PROVIDE ( _end = _end_noinit );
|
||||
PROVIDE ( __end = _end_noinit );
|
||||
PROVIDE ( __end__ = _end_noinit );
|
||||
}
|
||||
|
||||
@@ -72,16 +72,12 @@ void UpdateUsbReports()
|
||||
IsUsbBasicKeyboardReportSent = false;
|
||||
}
|
||||
|
||||
wormhole_t wormhole;
|
||||
|
||||
void main() {
|
||||
InitPeripherials();
|
||||
InitClock();
|
||||
Wormhole = &wormhole; // TODO: Remove this as soon as the wormhole stabilizes.
|
||||
Wormhole->enumerationMode = EnumerationMode_NormalKeyboard;
|
||||
// Wormhole->enumerationMode = EnumerationMode_BusPal;
|
||||
if (/*Wormhole->magicNumber == WORMHOLE_MAGIC_NUMBER && */ Wormhole->enumerationMode == EnumerationMode_BusPal) {
|
||||
//Wormhole->magicNumber = 0;
|
||||
|
||||
if (Wormhole.magicNumber == WORMHOLE_MAGIC_NUMBER && Wormhole.enumerationMode == EnumerationMode_BusPal) {
|
||||
Wormhole.magicNumber = 0;
|
||||
init_hardware();
|
||||
handleUsbBusPalCommand();
|
||||
} else {
|
||||
|
||||
@@ -101,7 +101,7 @@ static usb_status_t UsbDeviceCallback(usb_device_handle handle, uint32_t event,
|
||||
|
||||
void USB0_IRQHandler(void)
|
||||
{
|
||||
USB_DeviceKhciIsrFunction(Wormhole->enumerationMode == EnumerationMode_BusPal
|
||||
USB_DeviceKhciIsrFunction(Wormhole.enumerationMode == EnumerationMode_BusPal
|
||||
? BuspalCompositeUsbDevice.device_handle
|
||||
: UsbCompositeDevice.deviceHandle);
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@ void setError(uint8_t error);
|
||||
void setGenericError();
|
||||
void usbProtocolHandler();
|
||||
void getSystemProperty();
|
||||
void jumpToBootloader();
|
||||
void reenumerate();
|
||||
void setTestLed();
|
||||
void writeLedDriver();
|
||||
void readLedDriver();
|
||||
@@ -55,8 +55,8 @@ void usbProtocolHandler()
|
||||
case USB_COMMAND_GET_SYSTEM_PROPERTY:
|
||||
getSystemProperty();
|
||||
break;
|
||||
case USB_COMMAND_JUMP_TO_BOOTLOADER:
|
||||
jumpToBootloader();
|
||||
case USB_COMMAND_REENUMERATE:
|
||||
reenumerate();
|
||||
break;
|
||||
case USB_COMMAND_SET_TEST_LED:
|
||||
setTestLed();
|
||||
@@ -114,8 +114,9 @@ void getSystemProperty() {
|
||||
}
|
||||
}
|
||||
|
||||
void jumpToBootloader() {
|
||||
// Wormhole->magicNumber = WORMHOLE_MAGIC_NUMBER;
|
||||
void reenumerate() {
|
||||
Wormhole.magicNumber = WORMHOLE_MAGIC_NUMBER;
|
||||
Wormhole.enumerationMode = GenericHidInBuffer[1];
|
||||
SCB->AIRCR = 0x5FA<<SCB_AIRCR_VECTKEY_Pos | SCB_AIRCR_SYSRESETREQ_Msk; // Reset the MCU.
|
||||
for (;;);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#define SYSTEM_PROPERTY_BRIDGE_PROTOCOL_VERSION_ID 1
|
||||
#define SYSTEM_PROPERTY_DATA_MODEL_VERSION_ID 2
|
||||
#define SYSTEM_PROPERTY_FIRMWARE_VERSION_ID 3
|
||||
#define USB_COMMAND_JUMP_TO_BOOTLOADER 1
|
||||
#define USB_COMMAND_REENUMERATE 1
|
||||
#define USB_COMMAND_SET_TEST_LED 2
|
||||
#define USB_COMMAND_WRITE_LED_DRIVER 3
|
||||
#define WRITE_LED_DRIVER_RESPONSE_INVALID_ADDRESS 1
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
#include "wormhole.h"
|
||||
|
||||
wormhole_t *Wormhole NO_INIT_GCC;
|
||||
wormhole_t Wormhole NO_INIT_GCC;
|
||||
|
||||
@@ -26,6 +26,6 @@
|
||||
|
||||
// Variables:
|
||||
|
||||
extern wormhole_t *Wormhole NO_INIT_GCC;
|
||||
extern wormhole_t Wormhole NO_INIT_GCC;
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user