Merge pull request #400 from xor-gate/st-info-add-openocd-hla-serial
[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 int print_data(stlink_t *sl, char **av)
83 {
84     if (strcmp(av[1], "--flash") == 0)
85         printf("0x%zx\n", sl->flash_size);
86     else if (strcmp(av[1], "--sram") == 0)
87         printf("0x%zx\n", sl->sram_size);
88     else if (strcmp(av[1], "--pagesize") == 0)
89         printf("0x%zx\n", sl->flash_pgsz);
90     else if (strcmp(av[1], "--chipid") == 0)
91         printf("0x%.4x\n", sl->chip_id);
92     else if (strcmp(av[1], "--probe") == 0)
93         stlink_probe();
94     else if (strcmp(av[1], "--serial") == 0)
95         stlink_print_serial(sl, false);
96     else if (strcmp(av[1], "--hla-serial") == 0)
97         stlink_print_serial(sl, true);
98     else if (strcmp(av[1], "--descr") == 0) {
99         const chip_params_t *params = NULL;
100         for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
101             if(devices[i].chip_id == sl->chip_id) {
102                 params = &devices[i];
103                 break;
104             }
105         }
106         if (params == NULL) {
107             return -1;
108         }
109         printf("%s\n", params->description);
110     }
111
112     return 0;
113 }
114
115
116 stlink_t* open_sl(void)
117 {
118     stlink_t* sl;
119     sl = stlink_v1_open(0, 1);
120     if (sl == NULL)
121         sl = stlink_open_usb(0, 1, NULL);
122     return sl;
123 }
124
125
126 int main(int ac, char** av)
127 {
128     stlink_t* sl = NULL;
129     int err = -1;
130     if (ac < 2) {
131         usage();
132         return -1;
133     }
134
135     sl = open_sl();
136
137     if (sl == NULL) {
138         return -1;
139     }
140
141     sl->verbose = 0;
142
143     if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE)
144         stlink_exit_dfu_mode(sl);
145
146     if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE)
147         stlink_enter_swd_mode(sl);
148
149     err = print_data(sl, av);
150
151     if (sl != NULL)
152     {
153         stlink_exit_debug_mode(sl);
154         stlink_close(sl);
155     }
156
157     return err;
158 }