#include #include #include #include #include #include "map.h" bool read_number(const char *str, uint32_t *value) { char *end; long int ret = strtol(str, &end, 0); if((str + strlen(str)) != end) return false; if(ret < 0) return false; *value = ret; return true; } int main(int argc, char **argv) { if(argc != 6) { printf("usage: %s \n", argv[0]); printf(" where is stmp3700 or imx233\n"); printf(" where is bga169 or lqfp128\n"); printf(" where is between 0 and 7"); printf(" where is a number or ~number\n"); return 1; } const char *soc = argv[1]; const char *ver = argv[2]; const char *s_mux = argv[3]; const char *s_clr_mask = argv[4]; const char *s_set_mask = argv[5]; uint32_t mux, clr_mask, set_mask; if(!read_number(s_mux, &mux) || mux >= NR_BANKS * 2) { printf("invalid mux number\n"); return 1; } if(!read_number(s_clr_mask, &clr_mask)) { printf("invalid clear mask\n"); return 2; } if(!read_number(s_set_mask, &set_mask)) { printf("invalid set mask\n"); return 3; } struct bank_map_t *map = NULL; for(unsigned i = 0; i < NR_SOCS; i++) if(strcmp(soc, socs[i].soc) == 0 && strcmp(ver, socs[i].ver) == 0) map = socs[i].map; if(map == NULL) { printf("no valid map found\n"); return 4; } if(clr_mask & set_mask) printf("warning: set and clear mask intersect!\n"); unsigned bank = mux / 2; unsigned offset = 16 * (mux % 2); for(unsigned i = 0; i < 16; i++) { unsigned pin = offset + i; uint32_t pin_shift = 2 * i; uint32_t set_fn = (set_mask >> pin_shift) & 3; uint32_t clr_fn = (clr_mask >> pin_shift) & 3; if(set_fn == 0 && clr_fn == 0) continue; bool partial_mask = (set_fn | clr_fn) != 3; printf("B%dP%02d => %s (select = %d)", bank, pin, map[bank].pins[pin].function[set_fn].name, set_fn); if(partial_mask) printf(" (warning: partial mask)"); printf("\n"); } return 0; }