static int parse_dts(struct ckb_softc *sc) { phandle_t node; pcell_t dts_value; pcell_t *keymap; int len, ret; const char *keymap_prop = NULL; if ((node = ofw_bus_get_node(sc->dev)) == -1) return (ENXIO); if ((len = OF_getproplen(node, "google,key-rows")) <= 0) return (ENXIO); OF_getencprop(node, "google,key-rows", &dts_value, len); sc->rows = dts_value; if ((len = OF_getproplen(node, "google,key-columns")) <= 0) return (ENXIO); OF_getencprop(node, "google,key-columns", &dts_value, len); sc->cols = dts_value; if ((len = OF_getproplen(node, "freebsd,intr-gpio")) <= 0) return (ENXIO); OF_getencprop(node, "freebsd,intr-gpio", &dts_value, len); sc->gpio = dts_value; if (OF_hasprop(node, "freebsd,keymap")) { keymap_prop = "freebsd,keymap"; device_printf(sc->dev, "using FreeBSD-specific keymap from FDT\n"); } else if (OF_hasprop(node, "linux,keymap")) { keymap_prop = "linux,keymap"; device_printf(sc->dev, "using Linux keymap from FDT\n"); } else { device_printf(sc->dev, "using built-in keymap\n"); } if (keymap_prop != NULL) { if ((ret = read_keymap(node, keymap_prop, &keymap, &len))) { device_printf(sc->dev, "failed to read keymap from FDT: %d\n", ret); return (ret); } ret = parse_keymap(sc, keymap, len); free(keymap, M_DEVBUF); if (ret) { return (ret); } } else { if ((ret = parse_keymap(sc, default_keymap, KEYMAP_LEN))) { return (ret); } } if ((sc->rows == 0) || (sc->cols == 0) || (sc->gpio == 0)) return (ENXIO); return (0); }
int main(int argc, char *argv[]) { struct input_state in = { }; int fd_out; char const *event_filename = NULL; int rc; int repeat_params[2] = { 250 ,100 }; for (;;) { int c; c = getopt_long(argc, argv, "e:D:R:", CMDLINE_OPTIONS, NULL); if (c == -1) break; switch (c) { case 'k': rc = read_keymap(optarg); if (rc != EX_OK) return rc; break; case 'D': repeat_params[0] = atoi(optarg); break; case 'R': repeat_params[1] = atoi(optarg); break; default: fprintf(stderr, "unknown option\n"); return EX_USAGE; } } if (argc < optind + 1) { fprintf(stderr, "missing parameters\n"); return EX_USAGE; } else { event_filename = argv[optind + 0]; } if (!open_input(&in, event_filename, repeat_params)) return EX_OSERR; fd_out = open_uinput(&in); if (fd_out < 0) return EX_OSERR; while (handle_input(&in, fd_out)) ; }