static mraa_result_t mraa_pwm_write_duty(mraa_pwm_context dev, int duty) { if (!dev) { syslog(LOG_ERR, "pwm: write_duty: context is NULL"); return MRAA_ERROR_INVALID_HANDLE; } if (IS_FUNC_DEFINED(dev, pwm_write_replace)) { return dev->advance_func->pwm_write_replace(dev, duty); } if (dev->duty_fp == -1) { if (mraa_pwm_setup_duty_fp(dev) == 1) { syslog(LOG_ERR, "pwm%i write_duty: Failed to open duty_cycle for writing: %s", dev->pin, strerror(errno)); return MRAA_ERROR_INVALID_RESOURCE; } } char bu[64]; int length = sprintf(bu, "%d", duty); if (write(dev->duty_fp, bu, length * sizeof(char)) == -1) { syslog(LOG_ERR, "pwm%i write_duty: Failed to write to duty_cycle: %s", dev->pin, strerror(errno)); return MRAA_ERROR_INVALID_RESOURCE; } return MRAA_SUCCESS; }
static int mraa_pwm_read_duty(mraa_pwm_context dev) { if (dev->duty_fp == -1) { mraa_pwm_setup_duty_fp(dev); } else { lseek(dev->duty_fp, 0, SEEK_SET); } off_t size = lseek(dev->duty_fp, 0, SEEK_END); lseek(dev->duty_fp, 0, SEEK_SET); char output[MAX_SIZE]; read(dev->duty_fp, output, size+1); char *endptr; long int ret = strtol(output, &endptr, 10); if ('\0' != *endptr && '\n' != *endptr) { syslog(LOG_ERR, "pwm: Error in string converstion"); return -1; } else if (ret > INT_MAX || ret < INT_MIN) { syslog(LOG_ERR, "pwm: Number is invalid"); return -1; } return (int) ret; }
static int mraa_pwm_read_duty(mraa_pwm_context dev) { if (IS_FUNC_DEFINED(dev, pwm_read_duty_replace)) { return dev->advance_func->pwm_read_duty_replace(dev); } if (dev->duty_fp == -1) { if (mraa_pwm_setup_duty_fp(dev) == 1) { return MRAA_ERROR_INVALID_HANDLE; } } else { lseek(dev->duty_fp, 0, SEEK_SET); } off_t size = lseek(dev->duty_fp, 0, SEEK_END); lseek(dev->duty_fp, 0, SEEK_SET); char output[MAX_SIZE]; ssize_t rb = read(dev->duty_fp, output, size + 1); if (rb < 0) { syslog(LOG_ERR, "pwm: Error in reading duty"); return -1; } char* endptr; long int ret = strtol(output, &endptr, 10); if ('\0' != *endptr && '\n' != *endptr) { syslog(LOG_ERR, "pwm: Error in string converstion"); return -1; } else if (ret > INT_MAX || ret < INT_MIN) { syslog(LOG_ERR, "pwm: Number is invalid"); return -1; } return (int) ret; }
static mraa_result_t mraa_pwm_write_duty(mraa_pwm_context dev, int duty) { if (dev->duty_fp == -1) { mraa_pwm_setup_duty_fp(dev); } char bu[64]; int length = sprintf(bu, "%d", duty); if (write(dev->duty_fp, bu, length * sizeof(char)) == -1) return MRAA_ERROR_INVALID_RESOURCE; return MRAA_SUCCESS; }
mraa_pwm_context mraa_pwm_init_raw(int chipin, int pin) { mraa_pwm_context dev = mraa_pwm_init_internal(plat == NULL ? NULL : plat->adv_func , chipin, pin); if (dev == NULL) { syslog(LOG_CRIT, "pwm: Failed to allocate memory for context"); return NULL; } if (IS_FUNC_DEFINED(dev, pwm_init_raw_replace)) { if (dev->advance_func->pwm_init_raw_replace(dev, pin) == MRAA_SUCCESS) { return dev; } else { free(dev); return NULL; } } char directory[MAX_SIZE]; snprintf(directory, MAX_SIZE, SYSFS_PWM "/pwmchip%d/pwm%d", dev->chipid, dev->pin); struct stat dir; if (stat(directory, &dir) == 0 && S_ISDIR(dir.st_mode)) { syslog(LOG_NOTICE, "pwm_init: pwm%i already exported, continuing", pin); dev->owner = 0; // Not Owner } else { char buffer[MAX_SIZE]; snprintf(buffer, MAX_SIZE, "/sys/class/pwm/pwmchip%d/export", dev->chipid); int export_f = open(buffer, O_WRONLY); if (export_f == -1) { syslog(LOG_ERR, "pwm_init: pwm%i. Failed to open export for writing: %s", pin, strerror(errno)); free(dev); return NULL; } char out[MAX_SIZE]; int size = snprintf(out, MAX_SIZE, "%d", dev->pin); if (write(export_f, out, size * sizeof(char)) == -1) { syslog(LOG_WARNING, "pwm_init: pwm%i. Failed to write to export! (%s) Potentially already in use.", pin, strerror(errno)); close(export_f); free(dev); return NULL; } dev->owner = 1; mraa_pwm_period_us(dev, plat->pwm_default_period); close(export_f); } mraa_pwm_setup_duty_fp(dev); return dev; }
static mraa_result_t mraa_pwm_write_duty(mraa_pwm_context dev, int duty) { if (IS_FUNC_DEFINED(dev, pwm_write_replace)) { return dev->advance_func->pwm_write_replace(dev, duty); } if (dev->duty_fp == -1) { if (mraa_pwm_setup_duty_fp(dev) == 1) { return MRAA_ERROR_INVALID_HANDLE; } } char bu[64]; int length = sprintf(bu, "%d", duty); if (write(dev->duty_fp, bu, length * sizeof(char)) == -1) return MRAA_ERROR_INVALID_RESOURCE; return MRAA_SUCCESS; }
mraa_pwm_context mraa_pwm_init_raw(int chipin, int pin) { mraa_pwm_context dev = (mraa_pwm_context) malloc(sizeof(struct _pwm)); if (dev == NULL) return NULL; dev->duty_fp = -1; dev->chipid = chipin; dev->pin = pin; char directory[MAX_SIZE]; snprintf(directory, MAX_SIZE, SYSFS_PWM "/pwmchip%d/pwm%d", dev->chipid, dev->pin); struct stat dir; if (stat(directory, &dir) == 0 && S_ISDIR(dir.st_mode)) { syslog(LOG_NOTICE, "pwm: Pin already exported, continuing"); dev->owner = 0; // Not Owner } else { char buffer[MAX_SIZE]; snprintf(buffer, MAX_SIZE, "/sys/class/pwm/pwmchip%d/export", dev->chipid); int export_f = open(buffer, O_WRONLY); if (export_f == -1) { syslog(LOG_ERR, "pwm: Failed to open export for writing"); free(dev); return NULL; } char out[MAX_SIZE]; int size = snprintf(out, MAX_SIZE, "%d", dev->pin); if (write(export_f, out, size*sizeof(char)) == -1) { syslog(LOG_WARNING, "pwm: Failed to write to export! Potentially already enabled"); close(export_f); free(dev); return NULL; } dev->owner = 1; mraa_pwm_period_us(dev, plat->pwm_default_period); close(export_f); } mraa_pwm_setup_duty_fp(dev); return dev; }
static int mraa_pwm_read_duty(mraa_pwm_context dev) { if (!dev) { syslog(LOG_ERR, "pwm: read_duty: context is NULL"); return MRAA_ERROR_INVALID_HANDLE; } if (IS_FUNC_DEFINED(dev, pwm_read_replace)) { return dev->advance_func->pwm_read_replace(dev); } if (dev->duty_fp == -1) { if (mraa_pwm_setup_duty_fp(dev) == 1) { syslog(LOG_ERR, "pwm%i read_duty: Failed to open duty_cycle for reading: %s", dev->pin, strerror(errno)); return -1; } } else { lseek(dev->duty_fp, 0, SEEK_SET); } char output[MAX_SIZE]; ssize_t rb = read(dev->duty_fp, output, MAX_SIZE); if (rb < 0) { syslog(LOG_ERR, "pwm%i read_duty: Failed to read duty_cycle: %s", dev->pin, strerror(errno)); return -1; } char* endptr; long int ret = strtol(output, &endptr, 10); if ('\0' != *endptr && '\n' != *endptr) { syslog(LOG_ERR, "pwm%i read_duty: Error in string conversion", dev->pin); return -1; } else if (ret > INT_MAX || ret < INT_MIN) { syslog(LOG_ERR, "pwm%i read_duty: Number is invalid", dev->pin); return -1; } return (int) ret; }