summaryrefslogtreecommitdiff
path: root/utils/imxtools/misc/io_pins.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/imxtools/misc/io_pins.c')
-rw-r--r--utils/imxtools/misc/io_pins.c88
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
9bool 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
21int 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}