we inherently cannot implement this auto reboot properly
This commit is contained in:
+1
-23
@@ -161,14 +161,9 @@ extern volatile uint32_t USB_EP1_IN[32];
|
|||||||
|
|
||||||
extern uint32_t CSWTAG_LO;
|
extern uint32_t CSWTAG_LO;
|
||||||
extern uint32_t CSWTAG_HI;
|
extern uint32_t CSWTAG_HI;
|
||||||
extern uint32_t BLOCKNUM_LO;
|
|
||||||
extern uint32_t BLOCKNUM_HI;
|
|
||||||
extern uint32_t TOTBLOCKS_LO;
|
|
||||||
extern uint32_t TOTBLOCKS_HI;
|
|
||||||
extern uint32_t ADDRESS_LO;
|
extern uint32_t ADDRESS_LO;
|
||||||
extern uint32_t ADDRESS_HI;
|
extern uint32_t ADDRESS_HI;
|
||||||
extern uint32_t ACTIVE_CONFIG;
|
extern uint32_t ACTIVE_CONFIG;
|
||||||
extern uint32_t UF2_BLOCKS_LEFT;
|
|
||||||
extern uint32_t CTRL_XFER_STATE;
|
extern uint32_t CTRL_XFER_STATE;
|
||||||
extern uint32_t CTRL_XFER_STATE_X;
|
extern uint32_t CTRL_XFER_STATE_X;
|
||||||
extern uint32_t CTRL_XFER_DESC_SZ;
|
extern uint32_t CTRL_XFER_DESC_SZ;
|
||||||
@@ -376,8 +371,6 @@ __attribute__((naked)) int main(void) {
|
|||||||
// [15:0] = blocks left
|
// [15:0] = blocks left
|
||||||
uint32_t scsi_xfer_lba_blocks = 0;
|
uint32_t scsi_xfer_lba_blocks = 0;
|
||||||
|
|
||||||
UF2_BLOCKS_LEFT = 0;
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
uint32_t usb_int_status = R16_USBD_ISTR;
|
uint32_t usb_int_status = R16_USBD_ISTR;
|
||||||
if (usb_int_status & (1 << 10)) {
|
if (usb_int_status & (1 << 10)) {
|
||||||
@@ -600,7 +593,6 @@ __attribute__((naked)) int main(void) {
|
|||||||
CSWTAG_HI = USB_EP1_OUT[3];
|
CSWTAG_HI = USB_EP1_OUT[3];
|
||||||
uint32_t dCSWTag = CSWTAG_LO | (CSWTAG_HI << 16);
|
uint32_t dCSWTag = CSWTAG_LO | (CSWTAG_HI << 16);
|
||||||
uint32_t dCBWDataTransferLength = USB_EP1_OUT[4] | (USB_EP1_OUT[5] << 16);
|
uint32_t dCBWDataTransferLength = USB_EP1_OUT[4] | (USB_EP1_OUT[5] << 16);
|
||||||
uint32_t bmCBWFlags = USB_EP1_OUT[6] & 0xff;
|
|
||||||
uint32_t operation_code = USB_EP1_OUT[7] >> 8;
|
uint32_t operation_code = USB_EP1_OUT[7] >> 8;
|
||||||
|
|
||||||
switch (operation_code) {
|
switch (operation_code) {
|
||||||
@@ -736,10 +728,6 @@ __attribute__((naked)) int main(void) {
|
|||||||
if (!(flags & 1) && bytes == 256 && (address & 0xff) == 0) {
|
if (!(flags & 1) && bytes == 256 && (address & 0xff) == 0) {
|
||||||
if (flags & (0x2000) && familyid == FAMILY_ID) {
|
if (flags & (0x2000) && familyid == FAMILY_ID) {
|
||||||
// uf2 good so far!
|
// uf2 good so far!
|
||||||
BLOCKNUM_LO = USB_EP1_OUT[10];
|
|
||||||
BLOCKNUM_HI = USB_EP1_OUT[11];
|
|
||||||
TOTBLOCKS_LO = USB_EP1_OUT[12];
|
|
||||||
TOTBLOCKS_HI = USB_EP1_OUT[13];
|
|
||||||
ADDRESS_LO = USB_EP1_OUT[6];
|
ADDRESS_LO = USB_EP1_OUT[6];
|
||||||
ADDRESS_HI = USB_EP1_OUT[7];
|
ADDRESS_HI = USB_EP1_OUT[7];
|
||||||
|
|
||||||
@@ -766,15 +754,8 @@ __attribute__((naked)) int main(void) {
|
|||||||
if (msc_state & 0x1000) {
|
if (msc_state & 0x1000) {
|
||||||
if (USB_EP1_OUT[30] == 0x6F30 && USB_EP1_OUT[31] == 0x0AB1) {
|
if (USB_EP1_OUT[30] == 0x6F30 && USB_EP1_OUT[31] == 0x0AB1) {
|
||||||
// uf2 all magics are good!
|
// uf2 all magics are good!
|
||||||
uint32_t blocknum = BLOCKNUM_LO | (BLOCKNUM_HI << 16);
|
|
||||||
uint32_t totblocks = TOTBLOCKS_LO | (TOTBLOCKS_HI << 16);
|
|
||||||
uint32_t address = ADDRESS_LO | (ADDRESS_HI << 16);
|
uint32_t address = ADDRESS_LO | (ADDRESS_HI << 16);
|
||||||
|
|
||||||
if (UF2_BLOCKS_LEFT == 0)
|
|
||||||
UF2_BLOCKS_LEFT = (totblocks - 1) | 0x8000;
|
|
||||||
else
|
|
||||||
UF2_BLOCKS_LEFT--;
|
|
||||||
|
|
||||||
// todo flash the file
|
// todo flash the file
|
||||||
// todo ram download mode
|
// todo ram download mode
|
||||||
R32_FLASH_KEYR = 0x45670123;
|
R32_FLASH_KEYR = 0x45670123;
|
||||||
@@ -803,10 +784,7 @@ __attribute__((naked)) int main(void) {
|
|||||||
if (blocks_left == 0) {
|
if (blocks_left == 0) {
|
||||||
uint32_t dCSWTag = CSWTAG_LO | (CSWTAG_HI << 16);
|
uint32_t dCSWTag = CSWTAG_LO | (CSWTAG_HI << 16);
|
||||||
make_msc_csw(dCSWTag, 0);
|
make_msc_csw(dCSWTag, 0);
|
||||||
if (UF2_BLOCKS_LEFT == 0x8000)
|
msc_state = STATE_SENT_CSW;
|
||||||
msc_state = STATE_SENT_CSW_REBOOT;
|
|
||||||
else
|
|
||||||
msc_state = STATE_SENT_CSW;
|
|
||||||
} else {
|
} else {
|
||||||
scsi_xfer_lba_blocks = blocks_left;
|
scsi_xfer_lba_blocks = blocks_left;
|
||||||
set_ep_mode(1, 1, USB_EPTYPE_BULK, USB_STAT_ACK, USB_STAT_STALL, 0, 0);
|
set_ep_mode(1, 1, USB_EPTYPE_BULK, USB_STAT_ACK, USB_STAT_STALL, 0, 0);
|
||||||
|
|||||||
+6
-10
@@ -42,16 +42,12 @@ SECTIONS
|
|||||||
PROVIDE( USB_EP0_IN = 0x40006030 );
|
PROVIDE( USB_EP0_IN = 0x40006030 );
|
||||||
PROVIDE( USB_EP1_OUT = 0x40006040 );
|
PROVIDE( USB_EP1_OUT = 0x40006040 );
|
||||||
PROVIDE( USB_EP1_IN = 0x400060c0 );
|
PROVIDE( USB_EP1_IN = 0x400060c0 );
|
||||||
PROVIDE( CSWTAG_LO = 0x400061cc );
|
|
||||||
PROVIDE( CSWTAG_HI = 0x400061d0 );
|
PROVIDE( CSWTAG_LO = 0x400061e0 );
|
||||||
PROVIDE( BLOCKNUM_LO = 0x400061d4 );
|
PROVIDE( CSWTAG_HI = 0x400061e4 );
|
||||||
PROVIDE( BLOCKNUM_HI = 0x400061d8 );
|
PROVIDE( ADDRESS_LO = 0x400061e8 );
|
||||||
PROVIDE( TOTBLOCKS_LO = 0x400061dc );
|
PROVIDE( ADDRESS_HI = 0x400061ec );
|
||||||
PROVIDE( TOTBLOCKS_HI = 0x400061e0 );
|
PROVIDE( ACTIVE_CONFIG = 0x400061f0 );
|
||||||
PROVIDE( ADDRESS_LO = 0x400061e4 );
|
|
||||||
PROVIDE( ADDRESS_HI = 0x400061e8 );
|
|
||||||
PROVIDE( ACTIVE_CONFIG = 0x400061ec );
|
|
||||||
PROVIDE( UF2_BLOCKS_LEFT = 0x400061f0 );
|
|
||||||
PROVIDE( CTRL_XFER_STATE = 0x400061f4 );
|
PROVIDE( CTRL_XFER_STATE = 0x400061f4 );
|
||||||
PROVIDE( CTRL_XFER_STATE_X = 0x400061f8 );
|
PROVIDE( CTRL_XFER_STATE_X = 0x400061f8 );
|
||||||
PROVIDE( CTRL_XFER_DESC_SZ = 0x400061fc );
|
PROVIDE( CTRL_XFER_DESC_SZ = 0x400061fc );
|
||||||
|
|||||||
Reference in New Issue
Block a user