Follow changes in the pwmc(4) driver in relation to device filenames.

The driver now names its cdev nodes pwmcX.Y where X is unit number and
Y is the channel within that unit.  Change the default device name from
pwmc0 to pwmc0.0.  The driver now puts cdev files and label aliases in
the /dev/pwm directory, so allow the user to provide unqualified names
with -f and automatically prepend the /dev/pwm part for them.

Update the examples in the manpage to show the new device name format
and location within /dev/pwm.
This commit is contained in:
Ian Lepore 2019-06-17 16:43:33 +00:00
parent b5d67730ee
commit 7d763870e4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=349144
2 changed files with 42 additions and 21 deletions

View File

@ -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

View File

@ -37,6 +37,7 @@
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -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;