static PyObject *py_set_run(PyObject *self, PyObject *args, PyObject *kwargs){ char key[8]; char *channel; int run = 0; static char *kwlist[] = {"channel", "run", NULL}; if(!PyArg_ParseTupleAndKeywords(args, kwargs, "s|i", kwlist, &channel, &run)) return NULL; if (run != 0 && run != 1) { PyErr_SetString(PyExc_ValueError, "run must be either 0 or 1"); return NULL; } if (!get_pwm_key(channel, key)) { PyErr_SetString(PyExc_ValueError, "Invalid PWM key or name."); return NULL; } if (pwm_set_run(key, run) == -1) { PyErr_SetString(PyExc_RuntimeError, "You must start() the PWM channel first"); return NULL; } Py_RETURN_NONE; }
int pwm_disable(PwmChannel_t *pwm) { pwm_set_run(pwm, 0); //close the fds close(pwm->period_fd); close(pwm->duty_fd); close(pwm->polarity_fd); close(pwm->run_fd); return 0; }
int pwm_start(const char *pinName, int exportNumber, char *pwmDir, float duty, float freq, int polarity, PwmChannel_t *pwm) { char pwm_control_path[PATHLEN]; char pwm_path[PATHLEN]; //pwm channel control folder char export[2]; int fd; strncpy(pwm->key, pinName, KEYLEN); if (set_pinmux(pinName, "pwm") < 0) { return -1; } //export pwm channel if ((fd = open("/sys/class/pwm/export", O_WRONLY)) < 0) { LogError("pwm open(/sys/class/pwm/export) fail (%s)\n", strerror(errno)); return -1; } snprintf(export, 2, "%i", exportNumber); write(fd,export,1); close(fd); snprintf(pwm_path, sizeof(pwm_path), "/sys/class/pwm/%s", pwmDir); //create the path for period control snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/period_ns", pwm_path); if ((pwm->period_fd = open(pwm_control_path, O_WRONLY)) < 0) { LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno)); return -1; } snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/duty_ns", pwm_path); if ((pwm->duty_fd = open(pwm_control_path, O_WRONLY)) < 0) { //error, close already opened period_fd. LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno)); close(pwm->period_fd); return -1; } snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/polarity", pwm_path); if ((pwm->polarity_fd = open(pwm_control_path, O_WRONLY)) < 0) { LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno)); //error, close already opened period_fd and duty_fd. close(pwm->period_fd); close(pwm->duty_fd); return -1; } snprintf(pwm_control_path, sizeof(pwm_control_path), "%s/run", pwm_path); if ((pwm->run_fd = open(pwm_control_path, O_WRONLY)) < 0) { LogError("pwm open(%s) fail (%s)\n", pwm_control_path, strerror(errno)); //error, close already opened period_fd and duty_fd. close(pwm->polarity_fd); close(pwm->period_fd); close(pwm->duty_fd); return -1; } pwm_set_frequency(pwm, freq); pwm_set_polarity(pwm, polarity); pwm_set_duty_cycle(pwm, duty); pwm_set_run(pwm, 1); return 0; }