Skip to content

Commit 0c7cdaf

Browse files
authored
Merge pull request #340 from MLH-Fellowship/229-enable-pwm
Enable DMTimer PWM pins on BBB and PB
2 parents dbecfcd + af9ea51 commit 0c7cdaf

File tree

2 files changed

+48
-20
lines changed

2 files changed

+48
-20
lines changed

source/c_pwm.c

Lines changed: 30 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,14 @@ void export_pwm(struct pwm_exp *new_pwm)
9494
}
9595
}
9696

97+
int is_dmtimer_pin(pwm_t *p) {
98+
char temp[6];
99+
strncpy(temp, p->module, 5);
100+
temp[5] = '\0';
101+
102+
return (strcmp(temp, "timer") == 0);
103+
}
104+
97105
BBIO_err initialize_pwm(void)
98106
{
99107
#ifdef BBBVERSION41 // don't load overlay in 4.1+
@@ -375,16 +383,27 @@ BBIO_err pwm_setup(const char *key, __attribute__ ((unused)) float duty, __attri
375383
return err;
376384
}
377385

378-
err = build_path(ocp_dir, p->chip, pwm_dev_path, sizeof(pwm_dev_path));
379-
if (err != BBIO_OK) {
380-
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: %s couldn't build pwm_dev_path: %i", key, err);
381-
return err;
382-
}
386+
int dmtimer_pin = is_dmtimer_pin(p);
383387

384-
err = build_path(pwm_dev_path, p->addr, pwm_addr_path, sizeof(pwm_addr_path));
385-
if (err != BBIO_OK) {
386-
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: %s couldn't build pwm_addr_path: %i", key, err);
387-
return err;
388+
if(!dmtimer_pin) {
389+
err = build_path(ocp_dir, p->chip, pwm_dev_path, sizeof(pwm_dev_path));
390+
if (err != BBIO_OK) {
391+
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: %s couldn't build pwm_dev_path: %i", key, err);
392+
return err;
393+
}
394+
395+
err = build_path(pwm_dev_path, p->addr, pwm_addr_path, sizeof(pwm_addr_path));
396+
if (err != BBIO_OK) {
397+
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: %s couldn't build pwm_addr_path: %i", key, err);
398+
return err;
399+
}
400+
}
401+
else {
402+
err = build_path("/sys/devices/platform", p->addr, pwm_addr_path, sizeof(pwm_addr_path));
403+
if (err != BBIO_OK) {
404+
syslog(LOG_ERR, "Adafruit_BBIO: pwm_setup: %s couldn't build pwm_addr_path, are you sure you've loaded the correct dmtimer device tree overlay?: %i", key, err);
405+
return err;
406+
}
388407
}
389408

390409
err = build_path(pwm_addr_path, "pwm/pwmchip", pwm_chip_path, sizeof(pwm_chip_path));
@@ -397,10 +416,10 @@ BBIO_err pwm_setup(const char *key, __attribute__ ((unused)) float duty, __attri
397416
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: key: %s, pwm_path: %s", key, pwm_path);
398417

399418
//pwm with udev patch
400-
snprintf(pwm_path_udev, sizeof(pwm_path_udev), "%s/pwm-%c:%d", pwm_chip_path, pwm_path[66], p->index);
419+
snprintf(pwm_path_udev, sizeof(pwm_path_udev), "%s/pwm-%c:%d", pwm_chip_path, dmtimer_pin ? pwm_path[47] : pwm_path[66], p->index);
401420
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: key: %s, pwm_path_udev: %s", key, pwm_path_udev);
402421
//ecap output with udev patch
403-
snprintf(ecap_path_udev, sizeof(ecap_path_udev), "%s/pwm-%c:%d", pwm_chip_path, pwm_path[66], p->index);
422+
snprintf(ecap_path_udev, sizeof(ecap_path_udev), "%s/pwm-%c:%d", pwm_chip_path, dmtimer_pin ? pwm_path[47] : pwm_path[66], p->index);
404423
syslog(LOG_DEBUG, "Adafruit_BBIO: pwm_start: key: %s, ecap_path_udev: %s", key, ecap_path_udev);
405424

406425
// Export PWM if hasn't already been

source/common.c

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -81,10 +81,10 @@ pins_t table[] = {
8181
{ "GPIO1_7", "P8_4", 39, -1, -1},
8282
{ "GPIO1_2", "P8_5", 34, -1, -1},
8383
{ "GPIO1_3", "P8_6", 35, -1, -1},
84-
{ "TIMER4", "P8_7", 66, -1, -1},
85-
{ "TIMER7", "P8_8", 67, -1, -1},
86-
{ "TIMER5", "P8_9", 69, -1, -1},
87-
{ "TIMER6", "P8_10", 68, -1, -1},
84+
{ "TIMER4", "P8_7", 66, 2, -1},
85+
{ "TIMER7", "P8_8", 67, 2, -1},
86+
{ "TIMER5", "P8_9", 69, 2, -1},
87+
{ "TIMER6", "P8_10", 68, 2, -1},
8888
{ "GPIO1_13", "P8_11", 45, -1, -1},
8989
{ "GPIO1_12", "P8_12", 44, -1, -1},
9090
{ "EHRPWM2B", "P8_13", 23, 4, -1},
@@ -206,15 +206,15 @@ pins_t table[] = {
206206
{ "VREFN", "P1_17", 0, -1, -1},
207207
{ "VREFP", "P1_18", 0, -1, -1},
208208
{ "AIN0", "P1_19", 0, -1, 0},
209-
{ "GPIO0_20", "P1_20", 20, -1, -1},
209+
{ "GPIO0_20", "P1_20", 20, 4, -1},
210210
{ "AIN1", "P1_21", 0, -1, 1},
211211
{ "GND", "P1_22", 0, -1, -1},
212212
{ "AIN2", "P1_23", 0, -1, 2},
213213
{ "VOUT-5V", "P1_24", 0, -1, -1},
214214
{ "AIN3", "P1_25", 0, -1, 3},
215-
{ "I2C2_SDA", "P1_26", 12, -1, -1},
215+
{ "I2C2_SDA", "P1_26", 12, 1, -1},
216216
{ "AIN4", "P1_27", 0, -1, 4},
217-
{ "I2C2_SCL", "P1_28", 13, -1, -1},
217+
{ "I2C2_SCL", "P1_28", 13, 1, -1},
218218
{ "GPIO3_21", "P1_29", 117, -1, -1},
219219
{ "UART0_TXD", "P1_30", 43, -1, -1},
220220
{ "GPIO3_18", "P1_31", 114, -1, -1},
@@ -249,11 +249,11 @@ pins_t table[] = {
249249
{ "GPIO1_12", "P2_24", 44, -1, -1},
250250
{ "SPI1_CS0", "P2_25", 41, -1, -1},
251251
{ "RESET#", "P2_26", 0, -1, -1},
252-
{ "SPI1_D0", "P2_27", 40, -1, -1},
252+
{ "SPI1_D0", "P2_27", 40, 5, -1},
253253
{ "GPIO3_20", "P2_28", 116, -1, -1},
254254
{ "SPI1_SCLK", "P2_29", 7, -1, -1},
255255
{ "GPIO3_17", "P2_30", 113, -1, -1},
256-
{ "SPI1_CS1", "P2_31", 19, -1, -1},
256+
{ "SPI1_CS1", "P2_31", 19, 2, -1},
257257
{ "GPIO3_16", "P2_32", 112, -1, -1},
258258
{ "GPIO1_13", "P2_33", 45, -1, -1},
259259
{ "GPIO3_19", "P2_34", 115, -1, -1},
@@ -305,12 +305,21 @@ pwm_t pwm_table[] = {
305305
{ "ehrpwm0", 1, 1, 1, "ehrpwm.0:1", "EHRPWM0B", "48300000", "48300200", "P9_29"},
306306
{ "ehrpwm0", 0, 0, 1, "ehrpwm.0:0", "EHRPWM0A", "48300000", "48300200", "P9_31"},
307307
{ "ecap0", 2, 0, 0, "ecap.0", "ECAPPWM0", "48300000", "48300100", "P9_42"},
308+
{ "timer4", 0, 0, 2, "", "", "", "dmtimer-pwm-4", "P8_7" },
309+
{ "timer7", 0, 0, 2, "", "", "", "dmtimer-pwm-7", "P8_8" },
310+
{ "timer5", 0, 0, 2, "", "", "", "dmtimer-pwm-5", "P8_9" },
311+
{ "timer6", 0, 0, 2, "", "", "", "dmtimer-pwm-6", "P8_10" },
308312
{ "ehrpwm0", 0, 0, 1, "ehrpwm.0:0", "EHRPWM0A", "48300000", "48300200", "P1_8"},
309313
{ "ehrpwm0", 0, 0, 1, "ehrpwm.0:0", "EHRPWM0A", "48300000", "48300200", "P1_36"},
310314
{ "ehrpwm0", 1, 1, 1, "ehrpwm.0:1", "EHRPWM0B", "48300000", "48300200", "P1_10"},
311315
{ "ehrpwm0", 1, 1, 1, "ehrpwm.0:1", "EHRPWM0B", "48300000", "48300200", "P1_33"},
312316
{ "ehrpwm1", 3, 0, 6, "ehrpwm.1:0", "EHRPWM1A", "48302000", "48302200", "P2_1"},
313317
{ "ehrpwm2", 6, 1, 3, "ehrpwm.2:1", "EHRPWM2B", "48304000", "48304200", "P2_3"},
318+
{ "timer7", 0, 0, 4, "", "", "", "dmtimer-pwm-7", "P1_20" },
319+
{ "timer6", 0, 0, 1, "", "", "", "dmtimer-pwm-6", "P1_26" },
320+
{ "timer5", 0, 0, 1, "", "", "", "dmtimer-pwm-5", "P1_28" },
321+
{ "timer7", 0, 0, 5, "", "", "", "dmtimer-pwm-7", "P2_27" },
322+
{ "timer4", 0, 0, 2, "", "", "", "dmtimer-pwm-4", "P2_31" },
314323
{ NULL, 0, 0, 0, NULL, NULL, NULL, NULL, NULL }
315324
};
316325

0 commit comments

Comments
 (0)