diff options
author | AJM <poslathian@poslathian.(none)> | 2010-06-09 15:52:29 -0400 |
---|---|---|
committer | AJM <poslathian@poslathian.(none)> | 2010-06-09 15:52:29 -0400 |
commit | 8afc89be1da70c2776333b3858532c6b753e11ce (patch) | |
tree | 35999d67dfd3f31f0d531f849336148f8d6c9daf /libmaple/usb/usb.c | |
parent | a89cddd05ea3fb09513a8fb96b9cd963efbffab3 (diff) | |
download | librambutan-8afc89be1da70c2776333b3858532c6b753e11ce.tar.gz librambutan-8afc89be1da70c2776333b3858532c6b753e11ce.zip |
first approach at modding the reset scheme
now we reset from recv bytes. After receiving the DTR/RTS toggle the next byte in from usb is parsed as the program_delay. For now, this just delays the reset for a period to close the serial port gracefully. Later, this delay will perhaps inform the bootloader of how long to live for...
Diffstat (limited to 'libmaple/usb/usb.c')
-rw-r--r-- | libmaple/usb/usb.c | 33 |
1 files changed, 2 insertions, 31 deletions
diff --git a/libmaple/usb/usb.c b/libmaple/usb/usb.c index 6c144ba..09b51ea 100644 --- a/libmaple/usb/usb.c +++ b/libmaple/usb/usb.c @@ -332,40 +332,11 @@ if (wIstr & ISTR_CTR & wInterrupt_Mask) } #endif -/* if we are about to reset from the DTR signal, then dont return - to user, instead return from the ISR into a wait slide */ - if (reset_state == RESET_NOW) { - reset_state = START; - unsigned int target = (unsigned int)usbWaitReset | 0x1; - - asm volatile("mov r0, %[stack_top] \n\t" // Reset the stack - "mov sp, r0 \n\t" - "mov r0, #1 \n\t" - "mov r1, %[target_addr] \n\t" - "mov r2, %[cpsr] \n\t" - "push {r2} \n\t" // Fake xPSR - "push {r1} \n\t" // Target address for PC - "push {r0} \n\t" // Fake LR - "push {r0} \n\t" // Fake R12 - "push {r0} \n\t" // Fake R3 - "push {r0} \n\t" // Fake R2 - "push {r0} \n\t" // Fake R1 - "push {r0} \n\t" // Fake R0 - "mov lr, %[exc_return] \n\t" - "bx lr" - : - : [stack_top] "r" (STACK_TOP), - [target_addr] "r" (target), - [exc_return] "r" (EXC_RETURN), - [cpsr] "r" (DEFAULT_CPSR) - : "r0", "r1", "r2"); - // Should never get here. - } } void usbWaitReset(void) { - static count=1000000; - while (count-- >0); + int count = program_delay*100000000; + delay(program_delay*10); systemHardReset(); } |