diff --git a/usr.sbin/pwm/pwm.8 b/usr.sbin/pwm/pwm.8 index 207dca407c8e..57a8071cdc3d 100644 --- a/usr.sbin/pwm/pwm.8 +++ b/usr.sbin/pwm/pwm.8 @@ -22,7 +22,7 @@ .\" .\" $FreeBSD$ .\" -.Dd January 12, 2019 +.Dd June 17, 2019 .Dt PWM 8 .Os .Sh NAME @@ -61,8 +61,11 @@ Channel number to operate on .It Fl f Ar device Device to operate on. If not specified, -.Pa /dev/pwmc0 +.Pa /dev/pwm/pwmc0.0 is used. +If an unqualified name is provided, +.Pa /dev/pwm +is automatically prepended. .It Fl E Enable the pwm channel .It Fl D @@ -79,17 +82,21 @@ Configure the duty (in nanoseconds or percentage) of the pwm channel .It Show the configuration of the pwm channel: .Bd -literal -pwm -f /dev/pwmc0 -C +pwm -f /dev/pwm/pwmc0.1 -C .Ed .It -Configure a 50000 ns period and a 25000 duty cycle: +Configure a 50000 ns period and a 25000 ns duty cycle: .Bd -literal -pwm -f /dev/pwmc0 -p 50000 -d 25000 +pwm -f pwmc1.1 -p 50000 -d 25000 .Ed .It -Configure a 50% duty cycle: +Configure a 50% duty cycle on the device and channel which +were configured in +.Xr pwmc 4 +to have the label +.Pa backlight : .Bd -literal -pwm -f /dev/pwmc0 -d 50% +pwm -f backlight -d 50% .Ed .El .Sh SEE ALSO diff --git a/usr.sbin/pwm/pwm.c b/usr.sbin/pwm/pwm.c index 52ea1b79e6ac..3d3de2018979 100644 --- a/usr.sbin/pwm/pwm.c +++ b/usr.sbin/pwm/pwm.c @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -49,6 +50,18 @@ #define PWM_PERIOD 0x0008 #define PWM_DUTY 0x0010 +static char device_name[PATH_MAX] = "/dev/pwm/pwmc0.0"; + +static void +set_device_name(const char *name) +{ + + if (name[0] == '/') + strlcpy(device_name, name, sizeof(device_name)); + else + snprintf(device_name, sizeof(device_name), "/dev/pwm/%s", name); +} + static void usage(void) { @@ -72,8 +85,10 @@ main(int argc, char *argv[]) cap_rights_t right_ioctl; const unsigned long pwm_ioctls[] = {PWMGETSTATE, PWMSETSTATE, PWMMAXCHANNEL}; char *percent; + bool setname; action = 0; + setname = false; fd = -1; channel = -1u; period = duty = -1; @@ -115,25 +130,24 @@ main(int argc, char *argv[]) channel = strtoul(optarg, NULL, 10); break; case 'f': - if ((fd = open(optarg, O_RDWR)) < 0) { - fprintf(stderr, "pwm: cannot open %s %s\n", - optarg, strerror(errno)); - exit(1); - } + setname = true; + set_device_name(optarg); + break; } } - if (fd == -1) { - if ((fd = open("/dev/pwmc0", O_RDWR)) < 0) { - fprintf(stderr, "pwm: cannot open %s %s\n", - optarg, strerror(errno)); - exit(1); - } - } - - if (action == 0 || fd == -1) + if (action == 0) usage(); + if ((fd = open(device_name, O_RDWR)) == -1) { + fprintf(stderr, "pwm: cannot open %s: %s\n", + device_name, strerror(errno)); + if (setname) + exit(1); + else + usage(); + } + if (caph_limit_stdio() < 0) { fprintf(stderr, "can't limit stdio rights"); goto fail;