X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fst-term.c;h=4f2f9f77cf6722f450502db38b4ca4785ea62f9b;hb=93c070d84c00bf3f6fa75d41ddacbdd0bb757f5a;hp=f4643933c015d0316242df4cabf13c9dc7c359e4;hpb=fba302af0c12ddb62e0157c5cf439a205fbf88fa;p=fw%2Fstlink diff --git a/src/st-term.c b/src/st-term.c index f464393..4f2f9f7 100644 --- a/src/st-term.c +++ b/src/st-term.c @@ -1,4 +1,5 @@ #include +#include /* According to POSIX.1-2001 */ #include #include @@ -12,6 +13,11 @@ #define STLINKY_MAGIC 0xDEADF00D +#define READ_UINT32_LE(buf) ((uint32_t) ( buf[0] \ + | buf[1] << 8 \ + | buf[2] << 16 \ + | buf[3] << 24)) + struct stlinky { stlink_t *sl; uint32_t off; @@ -24,20 +30,29 @@ struct stlinky* stlinky_detect(stlink_t* sl) { static const uint32_t sram_base = 0x20000000; struct stlinky* st = malloc(sizeof(struct stlinky)); + int multiple=0; st->sl = sl; - printf("sram: 0x%x bytes @ 0x%x\n", sl->sram_base, sl->sram_size); + printf("sram: 0x%x bytes @ 0x%zx\n", sl->sram_base, sl->sram_size); uint32_t off; for (off = 0; off < sl->sram_size; off += 4) { stlink_read_mem32(sl, sram_base + off, 4); - if ( STLINKY_MAGIC== *(uint32_t*) sl->q_buf) + if (STLINKY_MAGIC == READ_UINT32_LE(sl->q_buf)) { + if (multiple > 0) + printf("WARNING: another "); printf("stlinky detected at 0x%x\n", sram_base + off); st->off = sram_base + off; stlink_read_mem32(sl, st->off + 4, 4); st->bufsize = (size_t) *(unsigned char*) sl->q_buf; printf("stlinky buffer size 0x%zu \n", st->bufsize); - return st; + multiple++; + } + } + if (multiple > 0) { + if (multiple > 1) { + printf("Using last stlinky structure detected\n"); } + return st; } return NULL; } @@ -120,6 +135,7 @@ static int keep_running = 1; static int sigcount=0; void cleanup(int dummy) { + (void) dummy; sigcount++; keep_running = 0; printf("\n\nGot a signal\n"); @@ -132,11 +148,9 @@ void cleanup(int dummy) int main(int ac, char** av) { stlink_t* sl; - - /* unused */ - ac = ac; - av = av; - sl = stlink_open_usb(10); + struct stlinky *st; + + sl = stlink_open_usb(10, 1); if (sl != NULL) { printf("ST-Linky proof-of-concept terminal :: Created by Necromant for lulz\n"); stlink_version(sl); @@ -158,7 +172,19 @@ int main(int ac, char** av) { /* TODO: Make timeout adjustable via command line */ sleep(1); - struct stlinky *st = stlinky_detect(sl); + if(ac == 1){ + st = stlinky_detect(sl); + }else if(ac == 2){ + st = malloc(sizeof(struct stlinky)); + st->sl = sl; + st->off = (int)strtol(av[1], NULL, 16); + printf("using stlinky at 0x%x\n", st->off); + stlink_read_mem32(sl, st->off + 4, 4); + st->bufsize = (size_t) *(unsigned char*) sl->q_buf; + printf("stlinky buffer size 0x%zu \n", st->bufsize); + }else{ + goto bailout; + } if (st == NULL) { printf("stlinky magic not found in sram :(\n");