Index: usr.sbin/gpioctl/gpioctl.8 =================================================================== --- usr.sbin/gpioctl/gpioctl.8 +++ usr.sbin/gpioctl/gpioctl.8 @@ -41,11 +41,11 @@ .Nm .Op Fl f Ar ctldev .Cm -t -.Ar pin +.Ar .Nm .Op Fl f Ar ctldev .Cm -c -.Ar pin +.Ar .Ar flag .Op flag ... .Nm @@ -55,7 +55,7 @@ .Ar pin-name .Nm .Op Cm -f Ar ctldev -.Ar pin +.Ar .Ar [0|1] .Sh DESCRIPTION The @@ -99,6 +99,8 @@ toggle value of provided pin number .It Fl v be verbose: for each listed pin print current configuration +.It Fl N +Use the pin name instead of the pin number .El .Sh EXAMPLES .Bl -bullet @@ -114,6 +116,14 @@ Configure pin 12 to be input pin .Pp gpioctl -f /dev/gpioc0 -c 12 IN +.It +Set the name of pin 12 to test +.Pp +gpioctl -f /dev/gpioc0 -n 12 test +.It +Toggle the value the pin named test +.Pp +gpioctl -f /dev/gpioc0 -t -N test .El .Sh SEE ALSO .Xr gpio 4 , Index: usr.sbin/gpioctl/gpioctl.c =================================================================== --- usr.sbin/gpioctl/gpioctl.c +++ usr.sbin/gpioctl/gpioctl.c @@ -1,6 +1,7 @@ /*- * Copyright (c) 2009, Oleksandr Tymoshenko * Copyright (c) 2014, Rui Paulo + * Copyright (c) 2015, Emmanuel Vadot * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -66,10 +67,10 @@ { fprintf(stderr, "Usage:\n"); fprintf(stderr, "\tgpioctl [-f ctldev] -l [-v]\n"); - fprintf(stderr, "\tgpioctl [-f ctldev] -t pin\n"); - fprintf(stderr, "\tgpioctl [-f ctldev] -c pin flag ...\n"); + fprintf(stderr, "\tgpioctl [-f ctldev] -t \n"); + fprintf(stderr, "\tgpioctl [-f ctldev] -c flag ...\n"); fprintf(stderr, "\tgpioctl [-f ctldev] -n pin pin-name\n"); - fprintf(stderr, "\tgpioctl [-f ctldev] pin [0|1]\n"); + fprintf(stderr, "\tgpioctl [-f ctldev] [0|1]\n"); exit(1); } @@ -163,6 +164,32 @@ free(cfgs); } +static int +get_pinnum_by_name(gpio_handle_t handle, const char *name) { + int i, maxpin, pinn; + gpio_config_t *cfgs; + gpio_config_t *pin; + + pinn = -1; + maxpin = gpio_pin_list(handle, &cfgs); + if (maxpin < 0) { + perror("gpio_pin_list"); + exit(1); + } + + for (i = 0; i <= maxpin; i++) { + pin = cfgs + i; + gpio_pin_get(handle, pin->g_pin); + if (!strcmp(name, pin->g_name)) { + pinn = i; + break; + } + } + free(cfgs); + + return pinn; +} + static void fail(const char *fmt, ...) { @@ -181,19 +208,16 @@ gpio_config_t pin; gpio_handle_t handle; char *ctlfile = NULL; - int pinn, pinv, ch; + int pinn, pinv, byname, ch; int flags, flag, ok; int config, list, name, toggle, verbose; - config = toggle = verbose = list = name = pinn = 0; + config = toggle = verbose = list = name = byname = 0; - while ((ch = getopt(argc, argv, "c:f:ln:t:v")) != -1) { + while ((ch = getopt(argc, argv, "cf:ln:tvN")) != -1) { switch (ch) { case 'c': config = 1; - pinn = str2int(optarg, &ok); - if (!ok) - fail("Invalid pin number: %s\n", optarg); break; case 'f': ctlfile = optarg; @@ -207,11 +231,11 @@ if (!ok) fail("Invalid pin number: %s\n", optarg); break; + case 'N': + byname = 1; + break; case 't': toggle = 1; - pinn = str2int(optarg, &ok); - if (!ok) - fail("Invalid pin number: %s\n", optarg); break; case 'v': verbose = 1; @@ -234,10 +258,8 @@ /* Set the pin name. */ if (name) { - if (argc == 0) { + if (argc == 0) usage(); - exit(1); - } if (gpio_pin_set_name(handle, pinn, argv[0]) < 0) { perror("gpio_pin_set_name"); exit(1); @@ -251,14 +273,27 @@ exit(0); } + if (argc == 0) + usage(); + + /* Find the pin number by the name */ + if (byname) { + if ((pinn = get_pinnum_by_name(handle, argv[0])) == -1) { + fprintf(stderr, "Can't find pin named \"%s\"\n", argv[0]); + exit(1); + } + } else { + pinn = str2int(argv[0], &ok); + if (!ok) + fail("Invalid pin number: %s\n", argv[0]); + } + if (toggle) { /* - * -t pin assumes no additional arguments - */ - if (argc > 0) { + * -t pin assumes no additional arguments + */ + if (argc > 1) usage(); - exit(1); - } if (gpio_pin_toggle(handle, pinn) < 0) { perror("gpio_pin_toggle"); exit(1); @@ -269,7 +304,7 @@ if (config) { flags = 0; - for (i = 0; i < argc; i++) { + for (i = 1; i < argc; i++) { flag = str2cap(argv[i]); if (flag < 0) fail("Invalid flag: %s\n", argv[i]); @@ -287,14 +322,8 @@ /* * Last two cases - set value or print value */ - if ((argc == 0) || (argc > 2)) { + if ((argc == 0) || (argc > 2)) usage(); - exit(1); - } - - pinn = str2int(argv[0], &ok); - if (!ok) - fail("Invalid pin number: %s\n", argv[0]); /* * Read pin value