summaryrefslogtreecommitdiff
path: root/Debugger/debug_comm.S
diff options
context:
space:
mode:
authorTat-Chee Wan (USM)2011-03-22 14:34:30 +0800
committerTat-Chee Wan (USM)2011-03-22 14:34:30 +0800
commitcb09675818731776be4129ba19fb90e299c130aa (patch)
treeaa9b98a7f7763c3a6dbb83a37c9059c5c00ce837 /Debugger/debug_comm.S
parentaeed76722e533adb7f46210eb0c2e1a65fdfec60 (diff)
rework message handling logic to take care of packet acknowledgements sent by gdb server
Diffstat (limited to 'Debugger/debug_comm.S')
-rw-r--r--Debugger/debug_comm.S51
1 files changed, 43 insertions, 8 deletions
diff --git a/Debugger/debug_comm.S b/Debugger/debug_comm.S
index 6a7aa11..a43cc5f 100644
--- a/Debugger/debug_comm.S
+++ b/Debugger/debug_comm.S
@@ -578,14 +578,11 @@ _hasMsg2Copy:
ldr r5, =debug_msgRxBufPtr
ldr r5, [r5] /* Rx buffer Start Address */
-#ifdef CHECK_GDBSTARTCHAR
- /* Checked in dbg__bkpt_waitCMD */
- ldrb r0, [r5]
- teq r0, #MSGBUF_STARTCHAR /* Look for '$' */
- bne exit_dbg__getMsgError /* No start char '$', exit with error */
-#endif
-
- sub r2, r4, #MSGBUF_CHKSUMOFFSET /* Look for '#': Message Length - 3 = '#' offset */
+ /* Note: Here we assume that we won't get a single ACK '+' or NAK '-' character message.
+ * If we do, it'll be flagged as an error
+ */
+ subs r2, r4, #MSGBUF_CHKSUMOFFSET /* Look for '#': Message Length - 3 = '#' offset */
+ blt exit_dbg__getMsgError /* Message Length is too short, exit with error */
ldrb r0, [r5, r2]
teq r0, #MSGBUF_CHKSUMCHAR
bne exit_dbg__getMsgError /* No checksum char '#', exit with error */
@@ -593,6 +590,21 @@ _hasMsg2Copy:
mov r1, #0
strb r1, [r5, r2] /* Zero out '#' char for checksum calc later */
+/* Need to account for Packet Acknowledgement */
+ ldrb r0, [r5]
+ teq r0, #MSGBUF_NAKCHAR /* Look for '-' */
+ beq exit_dbg__getMsgError /* FIXME: We can't handle retransmission, flag message error */
+ teq r0, #MSGBUF_ACKCHAR /* Look for '+' */
+ addeq r5, r5, #1 /* Adjust Buffer Start Pointer (excl '+') */
+ subeq r4, r4, #1 /* Adjust Message Length */
+
+#ifdef CHECK_GDBSTARTCHAR
+ /* Checked in dbg__bkpt_waitCMD */
+ ldrb r0, [r5]
+ teq r0, #MSGBUF_STARTCHAR /* Look for '$' */
+ bne exit_dbg__getMsgError /* No start char '$', exit with error */
+#endif
+
add r0, r5, #1 /* Checksum packet data (excl '$') */
bl _msgbuf_checksum /* R2: length (excl '$'), R1: calculated checksum, R0: pointer to checksum in receive buffer */
mov r3, r1 /* Keep calculated checksum in R3 (R1 destroyed by ascii2byte) */
@@ -762,4 +774,27 @@ exit_dbg__putMsgError:
exit_dbg__putDebugMsg:
ldmfd sp!, {r4,r5,pc}
+ .global dbg__requestRetransmission
+/* dbg__requestRetransmission
+ * Request for Retransmission due to received message Checksum error (Blocking) .
+ * On entry:
+ * No parameters (assume pointers were initialized previously using dbg__comm_init)
+ * On exit:
+ * r0: status (0: success, -1: error)
+ * r1: destroyed
+ * Note: A Retransmission is indicated by '-', which is prepended with the USB header and sent (without checksum)
+ */
+dbg__requestRetransmission:
+ stmfd sp!, {lr}
+ ldr r1, =debug_msgTxBufPtr /* R2: data structure base pointer */
+ ldr r0, [r1] /* Tx buffer Start Address */
+ str r0, [r1, #TXAPPENDPTR_OFFSET] /* Reset Tx buffer Append Pointer */
+
+ mov r1, #0 /* Initialize Segment Number = 0 (last segment) */
+ mov r0, #1 /* Retransmission message length = 1 */
+ bl _copy_msg_to_usbbuf /* R0: cummulative message length, R1: segment number */
+ cmp r0, #1 /* Check if we managed to transmit the previous message */
+ moveq r0, #0 /* R0: Exit status (success) */
+ movne r0, #MSGBUF_MSGERROR /* R0: Exit status (error) */
+ ldmfd sp!, {pc}