summaryrefslogtreecommitdiffstats
path: root/scripts
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2018-03-05 08:53:56 +0100
committerSascha Hauer <s.hauer@pengutronix.de>2018-03-05 08:53:56 +0100
commit3347d0327b4e2d46e6f601d4d14054ec37b44272 (patch)
tree1bd2c198dc893e645bfe2052f402a6e8d9574711 /scripts
parentcce3ed31230cf60ddbc653b3ace1fb64e05bbddb (diff)
parent0d008a21d006e9541999fe2429c2112c53cd1992 (diff)
downloadbarebox-3347d0327b4e2d46e6f601d4d14054ec37b44272.tar.gz
barebox-3347d0327b4e2d46e6f601d4d14054ec37b44272.tar.xz
Merge branch 'for-next/ratp'
Diffstat (limited to 'scripts')
-rw-r--r--scripts/remote/controller.py27
-rw-r--r--scripts/remote/main.py51
-rw-r--r--scripts/remote/messages.py105
3 files changed, 183 insertions, 0 deletions
diff --git a/scripts/remote/controller.py b/scripts/remote/controller.py
index a7257ecc97..2ed834613e 100644
--- a/scripts/remote/controller.py
+++ b/scripts/remote/controller.py
@@ -46,6 +46,18 @@ def unpack(data):
elif p_type == BBType.fs_return:
logging.debug("received: fs_return")
return BBPacketFSReturn(raw=data)
+ elif p_type == BBType.md_return:
+ logging.debug("received: md_return")
+ return BBPacketMdReturn(raw=data)
+ elif p_type == BBType.mw:
+ logging.debug("received: mw")
+ return BBPacketMw(raw=data)
+ elif p_type == BBType.mw_return:
+ logging.debug("received: mw_return")
+ return BBPacketMwReturn(raw=data)
+ elif p_type == BBType.reset:
+ logging.debug("received: reset")
+ return BBPacketReset(raw=data)
else:
logging.debug("received: UNKNOWN")
return BBPacket(raw=data)
@@ -112,6 +124,21 @@ class Controller(Thread):
r = self._expect(BBPacketGetenvReturn)
return r.text
+ def md(self, path, addr, size):
+ self._send(BBPacketMd(path=path, addr=addr, size=size))
+ r = self._expect(BBPacketMdReturn)
+ logging.info("Md return: %r", r)
+ return (r.exit_code,r.data)
+
+ def mw(self, path, addr, data):
+ self._send(BBPacketMw(path=path, addr=addr, data=data))
+ r = self._expect(BBPacketMwReturn)
+ logging.info("Mw return: %r", r)
+ return (r.exit_code,r.written)
+
+ def reset(self, force):
+ self._send(BBPacketReset(force=force))
+
def close(self):
self.conn.close()
diff --git a/scripts/remote/main.py b/scripts/remote/main.py
index 79203df05a..38d280bfee 100644
--- a/scripts/remote/main.py
+++ b/scripts/remote/main.py
@@ -5,6 +5,7 @@ from __future__ import absolute_import, division, print_function
import sys
import os
import argparse
+import binascii
import logging
from Queue import Queue
from .ratp import RatpError
@@ -76,6 +77,34 @@ def handle_getenv(args):
return res
+def handle_md(args):
+ ctrl = get_controller(args)
+ (res,data) = ctrl.md(args.path, args.address, args.size)
+ if res == 0:
+ print(binascii.hexlify(data))
+ ctrl.close()
+ return res
+
+
+def handle_mw(args):
+ ctrl = get_controller(args)
+ data=args.data
+ if ((len(data) % 2) != 0):
+ data="0"+data
+ (res,written) = ctrl.mw(args.path, args.address, binascii.unhexlify(data))
+ if res == 0:
+ print("%i bytes written" % written)
+ ctrl.close()
+ return res
+
+
+def handle_reset(args):
+ ctrl = get_controller(args)
+ ctrl.reset(args.force)
+ ctrl.close()
+ return 0
+
+
def handle_listen(args):
port = serial.serial_for_url(args.port, args.baudrate)
conn = SerialRatpConnection(port)
@@ -118,6 +147,10 @@ def handle_console(args):
ctrl.conn.total_retransmits,
ctrl.conn.total_crc_errors))
+# Support base 10 or base 16 numbers automatically
+def auto_int(x):
+ return int(x, 0)
+
VERBOSITY = {
0: logging.WARN,
1: logging.INFO,
@@ -143,6 +176,24 @@ parser_getenv = subparsers.add_parser('getenv', help="get a barebox environment
parser_getenv.add_argument('arg', nargs='+', help="variable name")
parser_getenv.set_defaults(func=handle_getenv)
+parser_md = subparsers.add_parser('md', help="run md command")
+parser_md.add_argument('path', help="path")
+parser_md.add_argument('address', type=auto_int, help="address")
+parser_md.add_argument('size', type=auto_int, help="size")
+parser_md.set_defaults(func=handle_md)
+
+parser_mw = subparsers.add_parser('mw', help="run mw command")
+parser_mw.add_argument('path', help="path")
+parser_mw.add_argument('address', type=auto_int, help="address")
+parser_mw.add_argument('data', help="data")
+parser_mw.set_defaults(func=handle_mw)
+
+parser_reset = subparsers.add_parser('reset', help="run reset command")
+parser_reset_force = parser_reset.add_mutually_exclusive_group(required=False)
+parser_reset_force.add_argument('--force', dest='force', action='store_true')
+parser_reset_force.add_argument('--no-force', dest='force', action='store_false')
+parser_reset.set_defaults(func=handle_reset,force=False)
+
parser_listen = subparsers.add_parser('listen', help="listen for an incoming connection")
parser_listen.set_defaults(func=handle_listen)
diff --git a/scripts/remote/messages.py b/scripts/remote/messages.py
index 8e8495b12e..729f2e6177 100644
--- a/scripts/remote/messages.py
+++ b/scripts/remote/messages.py
@@ -4,6 +4,7 @@
from __future__ import absolute_import, division, print_function
import struct
+import binascii
class BBType(object):
@@ -16,6 +17,11 @@ class BBType(object):
getenv_return = 7
fs = 8
fs_return = 9
+ md = 10
+ md_return = 11
+ mw = 12
+ mw_return = 13
+ reset = 14
class BBPacket(object):
@@ -152,3 +158,102 @@ class BBPacketFSReturn(BBPacket):
def __repr__(self):
return "BBPacketFSReturn(payload=%r)" % self.payload
+
+
+class BBPacketMd(BBPacket):
+ def __init__(self, raw=None, path=None, addr=None, size=None):
+ self.path = path
+ self.addr = addr
+ self.size = size
+ super(BBPacketMd, self).__init__(BBType.md, raw=raw)
+
+ def __repr__(self):
+ return "BBPacketMd(path=%r,addr=0x%x,size=%u)" % (self.path, self.addr, self.size)
+
+ def _unpack_payload(self, payload):
+ buffer_offset, self.addr, self.size, path_size, path_offset = struct.unpack("!HHHHH", payload[:10])
+ # header size is always 4 bytes (HH), so adjust the absolute data offset without the header size
+ absolute_path_offset = buffer_offset + path_offset - 4
+ self.path = payload[absolute_path_offset:absolute_path_offset+path_size]
+
+ def _pack_payload(self):
+ # header size is always 4 bytes (HH) and we have 10 bytes of fixed data (HHHHH), so buffer offset is 14
+ return struct.pack("!HHHHH%ds" % len(self.path), 14, self.addr, self.size, len(self.path), 0, self.path)
+
+
+class BBPacketMdReturn(BBPacket):
+ def __init__(self, raw=None, exit_code=None, data=None):
+ self.exit_code = exit_code
+ self.data = data
+ super(BBPacketMdReturn, self).__init__(BBType.md_return, raw=raw)
+
+ def __repr__(self):
+ return "BBPacketMdReturn(exit_code=%i, data=%s)" % (self.exit_code, binascii.hexlify(self.data))
+
+ def _unpack_payload(self, payload):
+ buffer_offset, self.exit_code, data_size, data_offset = struct.unpack("!HLHH", payload[:10])
+ # header size is always 4 bytes (HH), so adjust the absolute data offset without the header size
+ absolute_data_offset = buffer_offset + data_offset - 4
+ self.data = payload[absolute_data_offset:absolute_data_offset + data_size]
+
+ def _pack_payload(self):
+ # header size is always 4 bytes (HH) and we have 10 bytes of fixed data (HLHH), so buffer offset is 14
+ return struct.pack("!HLHH%ds" % len(self.data), 14, self.exit_code, len(self.data), 0, self.data)
+ return self.text
+
+
+class BBPacketMw(BBPacket):
+ def __init__(self, raw=None, path=None, addr=None, data=None):
+ self.path = path
+ self.addr = addr
+ self.data = data
+ super(BBPacketMw, self).__init__(BBType.mw, raw=raw)
+
+ def __repr__(self):
+ return "BBPacketMw(path=%r,addr=0x%x,data=%r)" % (self.path, self.addr, self.data)
+
+ def _unpack_payload(self, payload):
+ buffer_offset, self.addr, path_size, path_offset, data_size, data_offset = struct.unpack("!HHHHHH", payload[:12])
+ # header size is always 4 bytes (HH), so adjust the absolute data offset without the header size
+ absolute_path_offset = buffer_offset + path_offset - 4
+ self.path = payload[absolute_path_offset:absolute_path_offset+path_size]
+ absolute_data_offset = buffer_offset + data_offset - 4
+ self.data = payload[absolute_data_offset:absolute_data_offset+data_size]
+
+ def _pack_payload(self):
+ # header size is always 4 bytes (HH) and we have 12 bytes of fixed data (HHHHHH), so buffer offset is 16
+ path_size = len(self.path)
+ data_size = len(self.data)
+ return struct.pack("!HHHHHH%ds%ds" % (path_size, path_size), 16, self.addr, path_size, 0, data_size, path_size, self.path, self.data)
+
+
+class BBPacketMwReturn(BBPacket):
+ def __init__(self, raw=None, exit_code=None, written=None):
+ self.exit_code = exit_code
+ self.written = written
+ super(BBPacketMwReturn, self).__init__(BBType.mw_return, raw=raw)
+
+ def __repr__(self):
+ return "BBPacketMwReturn(exit_code=%i, written=%i)" % (self.exit_code, self.written)
+
+ def _unpack_payload(self, payload):
+ buffer_offset, self.exit_code, self.written = struct.unpack("!HLH", payload[:8])
+
+ def _pack_payload(self):
+ # header size is always 4 bytes (HH) and we have 8 bytes of fixed data (HLH), so buffer offset is 14
+ return struct.pack("!HLH", 12, self.exit_code, self.written)
+
+
+class BBPacketReset(BBPacket):
+ def __init__(self, raw=None, force=None):
+ self.force = force
+ super(BBPacketReset, self).__init__(BBType.reset, raw=raw)
+
+ def __repr__(self):
+ return "BBPacketReset(force=%c)" % (self.force)
+
+ def _unpack_payload(self, payload):
+ self.force = struct.unpack("?", payload[:1])
+
+ def _pack_payload(self):
+ return struct.pack("?", self.force)