Skip to content

Commit 58eb546

Browse files
committed
Attempt to use udev ecap path for pwm path
Example of pwm and ecap paths for pwm outputs in the 4.14 kernel: /sys/devices/platform/ocp/48300000.epwmss/48300100.ecap/pwm/pwmchip0/pwm-0:0/duty_cycle /sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/pwmchip1/pwm-1:0/duty_cycle /sys/devices/platform/ocp/48300000.epwmss/48300200.pwm/pwm/pwmchip1/pwm-1:1/duty_cycle /sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/pwmchip3/pwm-3:0/duty_cycle /sys/devices/platform/ocp/48302000.epwmss/48302200.pwm/pwm/pwmchip3/pwm-3:1/duty_cycle /sys/devices/platform/ocp/48304000.epwmss/48304100.ecap/pwm/pwmchip5/pwm-5:0/duty_cycle Note that the ecap path is longer than pwm path by 1 character
1 parent 705368d commit 58eb546

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

source/c_pwm.c

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ BBIO_err pwm_setup(const char *key, __attribute__ ((unused)) float duty, __attri
315315
char pwm_export_path[80]; // "/sys/devices/platform/ocp/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0/export"
316316
char pwm_path[85]; // "/sys/devices/platform/ocp/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0/pwm1"
317317
char pwm_path_udev[85]; // "/sys/devices/platform/ocp/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0/pwm-0:1"
318+
char ecap_path_udev[85];// "/sys/devices/platform/ocp/48300000.epwmss/48300100.ecap/pwm/pwmchip0/pwm-0:0/"
318319
char duty_path[95]; // "/sys/devices/platform/ocp/48300000.epwmss/48300200.ehrpwm/pwm/pwmchip0/pwm1/duty_cycle"
319320
char period_path[95];
320321
char polarity_path[95];
@@ -389,11 +390,14 @@ BBIO_err pwm_setup(const char *key, __attribute__ ((unused)) float duty, __attri
389390
}
390391

391392
snprintf(pwm_path, sizeof(pwm_path), "%s/pwm%d", pwm_chip_path, p->index);
392-
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: %s, %s", key, pwm_path);
393+
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: key: %s, pwm_path: %s", key, pwm_path);
393394

394395
//pwm with udev patch
395396
snprintf(pwm_path_udev, sizeof(pwm_path_udev), "%s/pwm-%c:%d", pwm_chip_path, pwm_path[66], p->index);
396-
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: %s, %s", key, pwm_path_udev);
397+
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: key: %s, pwm_path_udev: %s", key, pwm_path_udev);
398+
//ecap output with udev patch
399+
snprintf(ecap_path_udev, sizeof(ecap_path_udev), "%s/pwm-%c:%d", pwm_chip_path, pwm_path[67], p->index);
400+
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: key: %s, ecap_path_udev: %s", key, ecap_path_udev);
397401

398402
// Export PWM if hasn't already been
399403
e = stat(pwm_path, &s);
@@ -427,21 +431,32 @@ BBIO_err pwm_setup(const char *key, __attribute__ ((unused)) float duty, __attri
427431
e = stat(pwm_path, &s);
428432
if (-1 == e) {
429433
if (ENOENT == errno) {
430-
// Directory still doesn't exist, exit with error
431-
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: %s %s doesn't exist", key, pwm_path);
432-
//return BBIO_GEN;
434+
// Directory still doesn't exist, try the new udev pwm path format in 4.14 kernel
435+
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_setup: key: %s pwm_path: %s doesn't exist", key, pwm_path);
433436

434437
e = stat(pwm_path_udev, &s);
435438
if (-1 == e) {
436439
if (ENOENT == errno) {
437-
// Directory still doesn't exist, exit with error
438-
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: %s %s doesn't exist", key, pwm_path_udev);
439-
return BBIO_GEN;
440+
// Directory still doesn't exist, try the new udev ecap path format in 4.14 kernel
441+
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_setup: key: %s pwm_path_udev: %s doesn't exist", key, pwm_path_udev);
442+
e = stat(ecap_path_udev, &s);
443+
if (-1 == e) {
444+
if (ENOENT == errno) {
445+
// Directory still doesn't exist, exit with error
446+
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_setup: key: %s ecap_path_udev: %s doesn't exist", key, ecap_path_udev);
447+
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: path for %s doesn't exist", key);
448+
return BBIO_GEN;
449+
}
450+
} else {
451+
strncpy(pwm_path, ecap_path_udev, sizeof(ecap_path_udev));
452+
}
440453
}
454+
} else {
455+
strncpy(pwm_path, pwm_path_udev, sizeof(pwm_path_udev));
441456
}
442-
strncpy(pwm_path, pwm_path_udev, sizeof(pwm_path_udev));
443457
}
444458
}
459+
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_setup: pwm_path=%s\n", pwm_path);
445460

446461
snprintf(duty_path, sizeof(duty_path), "%s/duty_cycle", pwm_path);
447462
snprintf(enable_path, sizeof(enable_path), "%s/enable", pwm_path);

0 commit comments

Comments
 (0)