pwm: added -m option

this allows setting of the channel mask directly, which is useful for
testing
This commit is contained in:
Andrew Tridgell 2013-04-25 20:13:03 +10:00
parent fc572906b7
commit ff7712ca3e
1 changed files with 17 additions and 2 deletions

View File

@ -71,13 +71,14 @@ usage(const char *reason)
warnx("%s", reason); warnx("%s", reason);
errx(1, errx(1,
"usage:\n" "usage:\n"
"pwm [-v] [-d <device>] [-u <alt_rate>] [-c <channel group>] [arm|disarm] [<channel_value> ...]\n" "pwm [-v] [-d <device>] [-u <alt_rate>] [-c <channel group>] [-m chanmask ] [arm|disarm] [<channel_value> ...]\n"
" -v Print information about the PWM device\n" " -v Print information about the PWM device\n"
" <device> PWM output device (defaults to " PWM_OUTPUT_DEVICE_PATH ")\n" " <device> PWM output device (defaults to " PWM_OUTPUT_DEVICE_PATH ")\n"
" <alt_rate> PWM update rate for channels in <alt_channel_mask>\n" " <alt_rate> PWM update rate for channels in <alt_channel_mask>\n"
" <channel_group> Channel group that should update at the alternate rate (may be specified more than once)\n" " <channel_group> Channel group that should update at the alternate rate (may be specified more than once)\n"
" arm | disarm Arm or disarm the ouptut\n" " arm | disarm Arm or disarm the ouptut\n"
" <channel_value>... PWM output values in microseconds to assign to the PWM outputs\n" " <channel_value>... PWM output values in microseconds to assign to the PWM outputs\n"
" <chanmask> Directly supply alt rate channel mask\n"
"\n" "\n"
"When -c is specified, any channel groups not listed with -c will update at the default rate.\n" "When -c is specified, any channel groups not listed with -c will update at the default rate.\n"
); );
@ -96,11 +97,12 @@ pwm_main(int argc, char *argv[])
int ret; int ret;
char *ep; char *ep;
unsigned group; unsigned group;
int32_t set_mask = -1;
if (argc < 2) if (argc < 2)
usage(NULL); usage(NULL);
while ((ch = getopt(argc, argv, "c:d:u:v")) != EOF) { while ((ch = getopt(argc, argv, "c:d:u:vm:")) != EOF) {
switch (ch) { switch (ch) {
case 'c': case 'c':
group = strtoul(optarg, &ep, 0); group = strtoul(optarg, &ep, 0);
@ -120,6 +122,12 @@ pwm_main(int argc, char *argv[])
usage("bad alt_rate value"); usage("bad alt_rate value");
break; break;
case 'm':
set_mask = strtol(optarg, &ep, 0);
if (*ep != '\0')
usage("bad set_mask value");
break;
case 'v': case 'v':
print_info = true; print_info = true;
break; break;
@ -143,6 +151,13 @@ pwm_main(int argc, char *argv[])
err(1, "PWM_SERVO_SET_UPDATE_RATE (check rate for sanity)"); err(1, "PWM_SERVO_SET_UPDATE_RATE (check rate for sanity)");
} }
/* directly supplied channel mask */
if (set_mask != -1) {
ret = ioctl(fd, PWM_SERVO_SELECT_UPDATE_RATE, set_mask);
if (ret != OK)
err(1, "PWM_SERVO_SELECT_UPDATE_RATE");
}
/* assign alternate rate to channel groups */ /* assign alternate rate to channel groups */
if (alt_channels_set) { if (alt_channels_set) {
uint32_t mask = 0; uint32_t mask = 0;