diff options
author | Ingo Albrecht <prom@berlin.ccc.de> | 2010-03-07 19:00:31 +0100 |
---|---|---|
committer | Ingo Albrecht <prom@berlin.ccc.de> | 2010-07-20 14:41:19 +0200 |
commit | 311847997f7e60ba46de9636ccd47fccd6b52f9d (patch) | |
tree | 3c459449ad58b58cab4cb54692729f3803d2d88a /src/host/osmocon | |
parent | 32b60f0c0ec22eb2a48feb6f4c4b016aecddf883 (diff) |
osmoload: Added a jump command.
Diffstat (limited to 'src/host/osmocon')
-rw-r--r-- | src/host/osmocon/osmoload.c | 30 |
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")) { |