aboutsummaryrefslogtreecommitdiff
path: root/AT91SAM7S256/armdebug
diff options
context:
space:
mode:
authorTat-Chee Wan (USM)2011-01-10 08:10:23 +0800
committerTat-Chee Wan (USM)2011-01-10 08:10:23 +0800
commit8a0b32cabdf541450c2c0ffbff67879c392e5295 (patch)
tree53ce66a30f056e8419e832cf465a29bc0e4d0960 /AT91SAM7S256/armdebug
parentc9927cc89eca050c779bc4f7fb8a5ce85f64e5a8 (diff)
parent2cc2bc2b2e82c663eba157bc4ddd7794eefaff8b (diff)
Merge branch 'master' of ssh://svc.cs.usm.my/~/gitrepo-bare/armdebug
Diffstat (limited to 'AT91SAM7S256/armdebug')
-rw-r--r--AT91SAM7S256/armdebug/Debugger/debug_comm.h2
-rwxr-xr-xAT91SAM7S256/armdebug/Host/nxt-gdb-server.py47
2 files changed, 39 insertions, 10 deletions
diff --git a/AT91SAM7S256/armdebug/Debugger/debug_comm.h b/AT91SAM7S256/armdebug/Debugger/debug_comm.h
index e5747e3..1583d0b 100644
--- a/AT91SAM7S256/armdebug/Debugger/debug_comm.h
+++ b/AT91SAM7S256/armdebug/Debugger/debug_comm.h
@@ -39,6 +39,8 @@
.extern cCommInit
.extern cCommCtrl
.extern cCommExit
+ .extern dUsbWrite
+ .extern dUsbRead
#endif
diff --git a/AT91SAM7S256/armdebug/Host/nxt-gdb-server.py b/AT91SAM7S256/armdebug/Host/nxt-gdb-server.py
index 73e025b..b57a810 100755
--- a/AT91SAM7S256/armdebug/Host/nxt-gdb-server.py
+++ b/AT91SAM7S256/armdebug/Host/nxt-gdb-server.py
@@ -28,34 +28,58 @@ DEBUG = True
class NXTGDBServer:
+ # Socket read size.
+ recv_size = 1024
+
# Maximum message size.
- pack_size = 62
+ pack_size = 61
# Debug command header, no reply.
debug_command = 0x8d
- segment_no = 0
def __init__ (self, port):
"""Initialise server."""
self.port = port
+ self.in_buf = ''
- def pack (self, data):
+ def pack (self, data, segment_no):
"""Return packed data to send to NXT."""
# Insert command and length.
assert len (data) <= self.pack_size
- return struct.pack ('BBB', self.debug_command, self.segment_no, len (data)) + data
+ return struct.pack ('BBB', self.debug_command, segment_no, len (data)) + data
def unpack (self, data):
"""Return unpacked data from NXT."""
# May be improved, for now, check command and announced length.
- if len (data) < 2:
+ if len (data) < 3:
return ''
- header, segment_no, body = data[0:3], data[3:]
- command, self.segment_no, length = struct.unpack ('BBB', header)
- if command != self.debug_command or length != len (body) or (self.segment_no != 0):
+ header, body = data[0:3], data[3:]
+ command, segment_no, length = struct.unpack ('BBB', header)
+ if command != self.debug_command or length != len (body) or segment_no != 0:
return ''
return body
+ def segment (self, data):
+ """Split datas in GDB commands and make segments with each command."""
+ segs = [ ]
+ self.in_buf += data
+ end = self.in_buf.find ('#')
+ # Is # found and enough place for the checkum?
+ while end >= 0 and end < len (self.in_buf) - 2:
+ msg, self.in_buf = self.in_buf[0:end + 3], self.in_buf[end + 3:]
+ assert msg[0] == '$', "not a GDB command"
+ # Make segments.
+ seg_no = 0
+ while msg:
+ seg, msg = msg[0:self.pack_size], msg[self.pack_size:]
+ seg_no += 1
+ if not msg: # Last segment.
+ seg_no = 0
+ segs.append (self.pack (seg, seg_no))
+ # Look for next one.
+ end = self.in_buf.find ('#')
+ return segs
+
def run (self):
"""Endless run loop."""
# Create the listening socket.
@@ -79,15 +103,18 @@ class NXTGDBServer:
for c in rlist:
assert c is client
# Data from client, read it and forward it to NXT brick.
- data = client.recv (self.pack_size)
+ data = client.recv (self.recv_size)
if data:
- brick.sock.send (self.pack (data))
+ segments = self.segment (data)
+ for s in segments:
+ brick.sock.send (s)
else:
client.close ()
client = None
# Is there something from NXT brick?
try:
data = self.unpack (brick.sock.recv ())
+ # We don't handle segmented messages yet!
if data:
client.send (data)
except usb.USBError as e: