* Merge st-probe tool into st-info
[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 --probe");
17 }
18
19 static void stlink_print_info(stlink_t *sl)
20 {
21     const chip_params_t *params = NULL;
22
23     if (!sl)
24         return;
25
26     for (int n = 0; n < sl->serial_size; n++)
27         printf("%02x", sl->serial[n]);
28     printf("\n");
29
30     printf("\t flash: %zu (pagesize: %zu)\n", sl->flash_size, sl->flash_pgsz);
31     printf("\t  sram: %zu\n",       sl->sram_size);
32     printf("\tchipid: 0x%.4x\n",    sl->chip_id);
33
34     for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
35         if (devices[i].chip_id == sl->chip_id) {
36             params = &devices[i];
37             break;
38         }
39     }
40
41     if (params)
42         printf("\t descr: %s\n", params->description);
43 }
44
45 static void stlink_probe(void)
46 {
47     stlink_t **stdevs;
48     size_t size;
49
50     size = stlink_probe_usb(&stdevs);
51
52     printf("Found %zu stlink programmers\n", size);
53
54     for (size_t n = 0; n < size; n++)
55         stlink_print_info(stdevs[n]);
56
57     stlink_probe_usb_free(&stdevs, size);
58 }
59
60 static int print_data(stlink_t *sl, char **av)
61 {
62     int ret = 0;
63     if (strcmp(av[1], "--flash") == 0)
64         printf("0x%zx\n", sl->flash_size);
65     else if (strcmp(av[1], "--sram") == 0)
66         printf("0x%zx\n", sl->sram_size);
67     else if (strcmp(av[1], "--pagesize") == 0)
68         printf("0x%zx\n", sl->flash_pgsz);
69     else if (strcmp(av[1], "--chipid") == 0)
70         printf("0x%.4x\n", sl->chip_id);
71     else if (strcmp(av[1], "--probe") == 0)
72         stlink_probe();
73     else if (strcmp(av[1], "--serial") == 0) {
74         for (int n = 0; n < sl->serial_size; n++)
75             printf("%02x", sl->serial[n]);
76         printf("\n");
77     } else if (strcmp(av[1], "--descr") == 0) {
78         const chip_params_t *params = NULL;
79         for (size_t i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) {
80             if(devices[i].chip_id == sl->chip_id) {
81                 params = &devices[i];
82                 break;
83             }
84         }
85         if (params == NULL) {
86             return -1;
87         }
88         printf("%s\n", params->description);
89     }
90     return ret;
91 }
92
93
94 stlink_t* open_sl(void)
95 {
96     stlink_t* sl;
97     sl = stlink_v1_open(0, 1);
98     if (sl == NULL)
99         sl = stlink_open_usb(0, 1, NULL);
100     return sl;
101 }
102
103
104 int main(int ac, char** av)
105 {
106     stlink_t* sl = NULL;
107     int err = -1;
108     if (ac < 2) {
109         usage();
110         return -1;
111     }
112
113     sl = open_sl();
114
115     if (sl == NULL) {
116         return -1;
117     }
118     sl->verbose=0;
119     if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE)
120         stlink_exit_dfu_mode(sl);
121
122     if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE)
123         stlink_enter_swd_mode(sl);
124
125     err = print_data(sl, av);
126
127     if (sl != NULL)
128     {
129         stlink_exit_debug_mode(sl);
130         stlink_close(sl);
131     }
132
133     return err;
134 }