summaryrefslogtreecommitdiffstats
path: root/src/host/osmocon
diff options
context:
space:
mode:
authorIngo Albrecht <prom@berlin.ccc.de>2010-03-07 19:00:31 +0100
committerIngo Albrecht <prom@berlin.ccc.de>2010-07-20 14:41:19 +0200
commit311847997f7e60ba46de9636ccd47fccd6b52f9d (patch)
tree3c459449ad58b58cab4cb54692729f3803d2d88a /src/host/osmocon
parent32b60f0c0ec22eb2a48feb6f4c4b016aecddf883 (diff)
osmoload: Added a jump command.
Diffstat (limited to 'src/host/osmocon')
-rw-r--r--src/host/osmocon/osmoload.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/host/osmocon/osmoload.c b/src/host/osmocon/osmoload.c
index f70f9ccf..700d7d74 100644
--- a/src/host/osmocon/osmoload.c
+++ b/src/host/osmocon/osmoload.c
@@ -74,6 +74,7 @@ static int usage(const char *name)
puts(" memread <hex-length> <hex-address>");
puts(" memdump <hex-length> <hex-address> <file>");
puts(" memload <hex-address> <file>");
+ puts(" jump <hex-address");
puts(" flashloader");
puts(" romloader");
puts(" ping");
@@ -160,6 +161,9 @@ loader_handle_reply(struct msgb *msg) {
length = msgb_get_u8(msg);
address = msgb_get_u32(msg);
break;
+ case LOADER_JUMP:
+ address = msgb_get_u32(msg);
+ break;
default:
printf("Received unknown reply %d:\n", cmd);
hexdump(msg->data, msg->len);
@@ -192,6 +196,9 @@ loader_handle_reply(struct msgb *msg) {
case LOADER_MEM_WRITE:
printf("Confirmed memory write of %d bytes at 0x%x.\n", length, address);
break;
+ case LOADER_JUMP:
+ printf("Confirmed jump to 0x%x.\n", address);
+ break;
default:
break;
}
@@ -333,6 +340,19 @@ loader_send_memwrite(uint8_t length, uint32_t address, void *data) {
osmoload.command = LOADER_MEM_WRITE;
}
+static void
+loader_send_jump(uint32_t address) {
+ struct msgb *msg = msgb_alloc(MSGB_MAX, "loader");
+ msgb_put_u8(msg, LOADER_JUMP);
+ msgb_put_u32(msg, address);
+ loader_send_request(msg);
+ msgb_free(msg);
+
+ osmoload.operation = OPERATION_QUERY;
+ osmoload.command = LOADER_JUMP;
+}
+
+
#define MEM_MSG_MAX (MSGB_MAX - 16)
static void
@@ -497,6 +517,16 @@ loader_command(char *name, int cmdc, char **cmdv) {
address = strtoul(cmdv[1], NULL, 16);
loader_start_memload(address, cmdv[2]);
+ } else if(!strcmp(cmd, "jump")) {
+ uint32_t address;
+
+ if(cmdc < 2) {
+ usage(name);
+ }
+
+ address = strtoul(cmdv[1], NULL, 16);
+
+ loader_send_jump(address);
} else if(!strcmp(cmd, "memwrite")) {
loader_send_memwrite(128, 0x810000, buf);
} else if(!strcmp(cmd, "off")) {