Properly detect and warn if multiple stlinky magic bytes are detected
authorOnno Kortmann <onno@gmx.net>
Sat, 7 Dec 2013 04:30:01 +0000 (20:30 -0800)
committerOnno Kortmann <onno@gmx.net>
Sat, 7 Dec 2013 04:30:01 +0000 (20:30 -0800)
Stlinky can silently fail if its magic bytes are present anywhere else
in the SRAM. This change makes st-term detect all stlinky structures,
warn about multiple occurences and will use the last one detected.

src/st-term.c

index bbf7ea37ef714a7e39062c5ee6ee5f173d44e0b0..a6a97fc1c4e6988fc2970c0c651c3262c3e91c3b 100644 (file)
@@ -30,6 +30,7 @@ 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%zx\n", sl->sram_base, sl->sram_size);
        uint32_t off;
@@ -37,14 +38,22 @@ struct stlinky*  stlinky_detect(stlink_t* sl)
                stlink_read_mem32(sl, sram_base + off, 4);
                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;
 }