Align loader to 32-bit boundary
[fw/stlink] / src / st-info.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <sys/types.h>
5
6 #include <stlink-common.h>
7
8 static void usage(void)
9 {
10     puts("st-info --flash");
11     puts("st-info --sram");
12     puts("st-info --descr");
13     puts("st-info --pagesize");
14     puts("st-info --chipid");
15     puts("st-info --serial");
16     puts("st-info --hla-serial");
17     puts("st-info --probe");
18 }
19
20 /* Print normal or OpenOCD hla_serial with newline */
21 static void stlink_print_serial(stlink_t *sl, bool openocd)
22 {
23     const char *fmt;
24
25     if (openocd) {
26        printf("\"");
27        fmt = "\\x%02x";
28     } else {
29        fmt = "%02x";
30     }
31
32     for (int n = 0; n < sl->serial_size; n++)
33         printf(fmt, sl->serial[n]);
34
35     if (openocd)
36        printf("\"");
37     printf("\n");
38 }
39
40 static void stlink_print_info(stlink_t *sl)
41 {
42     const chip_params_t *params = NULL;
43
44     if (!sl)
45         return;
46
47     printf(" serial: ");
48     stlink_print_serial(sl, false);
49     printf("openocd: ");
50     stlink_print_serial(sl, true);
51
52     printf("  flash: %zu (pagesize: %zu)\n", sl->flash_size, sl->flash_pgsz);
53     printf("   sram: %zu\n",       sl->sram_size);
54     printf(" chipid: 0x%.4x\n",    sl->chip_id);
55
56     for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
57         if (devices[i].chip_id == sl->chip_id) {
58             params = &devices[i];
59             break;
60         }
61     }
62
63     if (params)
64         printf("  descr: %s\n", params->description);
65 }
66
67 static void stlink_probe(void)
68 {
69     stlink_t **stdevs;
70     size_t size;
71
72     size = stlink_probe_usb(&stdevs);
73
74     printf("Found %zu stlink programmers\n", size);
75
76     for (size_t n = 0; n < size; n++)
77         stlink_print_info(stdevs[n]);
78
79     stlink_probe_usb_free(&stdevs, size);
80 }
81
82 static stlink_t *stlink_open_first(void)
83 {
84     stlink_t* sl = NULL;
85     sl = stlink_v1_open(0, 1);
86     if (sl == NULL)
87         sl = stlink_open_usb(0, 1, NULL);
88
89     return sl;
90 }
91
92 static int print_data(char **av)
93 {
94     stlink_t* sl = NULL;
95
96     // Probe needs all devices unclaimed
97     if (strcmp(av[1], "--probe") == 0) {
98         stlink_probe();
99         return 0;
100     }
101
102     sl = stlink_open_first();
103
104     if (sl == NULL) {
105         return -1;
106     }
107
108     sl->verbose = 0;
109
110     if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE)
111         stlink_exit_dfu_mode(sl);
112
113     if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE)
114         stlink_enter_swd_mode(sl);
115
116     if (strcmp(av[1], "--flash") == 0)
117         printf("0x%zx\n", sl->flash_size);
118     else if (strcmp(av[1], "--sram") == 0)
119         printf("0x%zx\n", sl->sram_size);
120     else if (strcmp(av[1], "--pagesize") == 0)
121         printf("0x%zx\n", sl->flash_pgsz);
122     else if (strcmp(av[1], "--chipid") == 0)
123         printf("0x%.4x\n", sl->chip_id);
124     else if (strcmp(av[1], "--serial") == 0)
125         stlink_print_serial(sl, false);
126     else if (strcmp(av[1], "--hla-serial") == 0)
127         stlink_print_serial(sl, true);
128     else if (strcmp(av[1], "--descr") == 0) {
129         const chip_params_t *params = NULL;
130         for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
131             if(devices[i].chip_id == sl->chip_id) {
132                 params = &devices[i];
133                 break;
134             }
135         }
136         if (params == NULL) {
137             return -1;
138         }
139         printf("%s\n", params->description);
140     }
141
142     if (sl)
143     {
144         stlink_exit_debug_mode(sl);
145         stlink_close(sl);
146     }
147
148     return 0;
149 }
150
151 int main(int ac, char** av)
152 {
153     int err = -1;
154     if (ac < 2) {
155         usage();
156         return -1;
157     }
158
159     err = print_data(av);
160
161     return err;
162 }