#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;
{
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;
}
static int sigcount=0;
void cleanup(int dummy)
{
+ (void) dummy;
sigcount++;
keep_running = 0;
printf("\n\nGot a signal\n");
int main(int ac, char** av) {
stlink_t* sl;
-
- /* unused */
- ac = ac;
- av = av;
+ 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");
/* 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");