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; }
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) 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: 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; }