aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/usb/usb.c
diff options
context:
space:
mode:
authorAJM <poslathian@poslathian.(none)>2010-06-09 15:52:29 -0400
committerAJM <poslathian@poslathian.(none)>2010-06-09 15:52:29 -0400
commit8afc89be1da70c2776333b3858532c6b753e11ce (patch)
tree35999d67dfd3f31f0d531f849336148f8d6c9daf /libmaple/usb/usb.c
parenta89cddd05ea3fb09513a8fb96b9cd963efbffab3 (diff)
downloadlibrambutan-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.c33
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();
}