diff options
Diffstat (limited to 'utils/imxtools/misc/io_pins.c')
-rw-r--r-- | utils/imxtools/misc/io_pins.c | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/utils/imxtools/misc/io_pins.c b/utils/imxtools/misc/io_pins.c new file mode 100644 index 0000000000..37e0331141 --- /dev/null +++ b/utils/imxtools/misc/io_pins.c | |||
@@ -0,0 +1,88 @@ | |||
1 | #include <stdio.h> | ||
2 | #include <stdlib.h> | ||
3 | #include <stdbool.h> | ||
4 | #include <stdint.h> | ||
5 | #include <string.h> | ||
6 | |||
7 | #include "map.h" | ||
8 | |||
9 | bool read_number(const char *str, uint32_t *value) | ||
10 | { | ||
11 | char *end; | ||
12 | long int ret = strtol(str, &end, 0); | ||
13 | if((str + strlen(str)) != end) | ||
14 | return false; | ||
15 | if(ret < 0) | ||
16 | return false; | ||
17 | *value = ret; | ||
18 | return true; | ||
19 | } | ||
20 | |||
21 | int main(int argc, char **argv) | ||
22 | { | ||
23 | if(argc != 6) | ||
24 | { | ||
25 | printf("usage: %s <soc> <ver> <mux> <clr mask> <set mask>\n", argv[0]); | ||
26 | printf(" where <soc> is stmp3700 or imx233\n"); | ||
27 | printf(" where <ver> is bga169 or lqfp128\n"); | ||
28 | printf(" where <mux> is between 0 and 7"); | ||
29 | printf(" where <mask> is a number or ~number\n"); | ||
30 | return 1; | ||
31 | } | ||
32 | |||
33 | const char *soc = argv[1]; | ||
34 | const char *ver = argv[2]; | ||
35 | const char *s_mux = argv[3]; | ||
36 | const char *s_clr_mask = argv[4]; | ||
37 | const char *s_set_mask = argv[5]; | ||
38 | uint32_t mux, clr_mask, set_mask; | ||
39 | |||
40 | if(!read_number(s_mux, &mux) || mux >= NR_BANKS * 2) | ||
41 | { | ||
42 | printf("invalid mux number\n"); | ||
43 | return 1; | ||
44 | } | ||
45 | if(!read_number(s_clr_mask, &clr_mask)) | ||
46 | { | ||
47 | printf("invalid clear mask\n"); | ||
48 | return 2; | ||
49 | } | ||
50 | if(!read_number(s_set_mask, &set_mask)) | ||
51 | { | ||
52 | printf("invalid set mask\n"); | ||
53 | return 3; | ||
54 | } | ||
55 | |||
56 | struct bank_map_t *map = NULL; | ||
57 | for(unsigned i = 0; i < NR_SOCS; i++) | ||
58 | if(strcmp(soc, socs[i].soc) == 0 && strcmp(ver, socs[i].ver) == 0) | ||
59 | map = socs[i].map; | ||
60 | if(map == NULL) | ||
61 | { | ||
62 | printf("no valid map found\n"); | ||
63 | return 4; | ||
64 | } | ||
65 | |||
66 | if(clr_mask & set_mask) | ||
67 | printf("warning: set and clear mask intersect!\n"); | ||
68 | unsigned bank = mux / 2; | ||
69 | unsigned offset = 16 * (mux % 2); | ||
70 | for(unsigned i = 0; i < 16; i++) | ||
71 | { | ||
72 | unsigned pin = offset + i; | ||
73 | uint32_t pin_shift = 2 * i; | ||
74 | uint32_t set_fn = (set_mask >> pin_shift) & 3; | ||
75 | uint32_t clr_fn = (clr_mask >> pin_shift) & 3; | ||
76 | if(set_fn == 0 && clr_fn == 0) | ||
77 | continue; | ||
78 | bool partial_mask = (set_fn | clr_fn) != 3; | ||
79 | |||
80 | printf("B%dP%02d => %s (select = %d)", bank, pin, | ||
81 | map[bank].pins[pin].function[set_fn].name, set_fn); | ||
82 | if(partial_mask) | ||
83 | printf(" (warning: partial mask)"); | ||
84 | printf("\n"); | ||
85 | } | ||
86 | |||
87 | return 0; | ||
88 | } | ||