aboutsummaryrefslogtreecommitdiff
path: root/usr.sbin/pwm
diff options
context:
space:
mode:
Diffstat (limited to 'usr.sbin/pwm')
-rw-r--r--usr.sbin/pwm/pwm.821
-rw-r--r--usr.sbin/pwm/pwm.c40
2 files changed, 41 insertions, 20 deletions
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 <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));
+ 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 (action == 0 || fd == -1)
- usage();
-
if (caph_limit_stdio() < 0) {
fprintf(stderr, "can't limit stdio rights");
goto fail;