mraa_uart_context mraa_uart_init_raw(const char* path) { mraa_uart_context dev = mraa_uart_init_internal(plat == NULL ? NULL : plat->adv_func); if (dev == NULL) { syslog(LOG_ERR, "uart: Failed to allocate memory for context"); return NULL; } dev->path = path; if (!dev->path) { syslog(LOG_ERR, "uart: device path undefined, open failed"); free(dev); return NULL; } // now open the device if ((dev->fd = open(dev->path, O_RDWR)) == -1) { syslog(LOG_ERR, "uart: open() failed"); free(dev); return NULL; } // now setup the tty and the selected baud rate struct termios termio; // get current modes if (tcgetattr(dev->fd, &termio)) { syslog(LOG_ERR, "uart: tcgetattr() failed"); close(dev->fd); free(dev); return NULL; } // setup for a 'raw' mode. 8N1, no echo or special character // handling, such as flow control or line editing semantics. // cfmakeraw is not POSIX! cfmakeraw(&termio); if (tcsetattr(dev->fd, TCSAFLUSH, &termio) < 0) { syslog(LOG_ERR, "uart: tcsetattr() failed after cfmakeraw()"); close(dev->fd); free(dev); return NULL; } if (mraa_uart_set_baudrate(dev, 9600) != MRAA_SUCCESS) { close(dev->fd); free(dev); return NULL; } return dev; }
mraa_uart_context mraa_uart_init_raw(const char* path) { mraa_result_t status = MRAA_SUCCESS; mraa_uart_context dev = NULL; if (!path) { syslog(LOG_ERR, "uart: device path undefined"); status = MRAA_ERROR_INVALID_PARAMETER; goto init_raw_cleanup; } dev = mraa_uart_init_internal(plat == NULL ? NULL : plat->adv_func); if (dev == NULL) { syslog(LOG_ERR, "uart: Failed to allocate memory for context"); status = MRAA_ERROR_NO_RESOURCES; goto init_raw_cleanup; } dev->path = (char*) calloc(strlen(path)+1, sizeof(char)); if (dev->path == NULL) { syslog(LOG_ERR, "uart: Failed to allocate memory for path"); status = MRAA_ERROR_NO_RESOURCES; goto init_raw_cleanup; } strncpy((char *) dev->path, path, strlen(path)); if (IS_FUNC_DEFINED(dev, uart_init_raw_replace)) { status = dev->advance_func->uart_init_raw_replace(dev, path); if (status == MRAA_SUCCESS) { return dev; } else { goto init_raw_cleanup; } } // now open the device if ((dev->fd = open(dev->path, O_RDWR)) == -1) { syslog(LOG_ERR, "uart: open(%s) failed: %s", path, strerror(errno)); status = MRAA_ERROR_INVALID_RESOURCE; goto init_raw_cleanup; } // now setup the tty and the selected baud rate struct termios termio; // get current modes if (tcgetattr(dev->fd, &termio)) { syslog(LOG_ERR, "uart: tcgetattr(%s) failed: %s", path, strerror(errno)); status = MRAA_ERROR_INVALID_RESOURCE; goto init_raw_cleanup; } // setup for a 'raw' mode. 8N1, no echo or special character // handling, such as flow control or line editing semantics. // cfmakeraw is not POSIX! cfmakeraw(&termio); if (tcsetattr(dev->fd, TCSAFLUSH, &termio) < 0) { syslog(LOG_ERR, "uart: tcsetattr(%s) failed after cfmakeraw(): %s", path, strerror(errno)); status = MRAA_ERROR_INVALID_RESOURCE; goto init_raw_cleanup; } if (mraa_uart_set_baudrate(dev, 9600) != MRAA_SUCCESS) { status = MRAA_ERROR_INVALID_RESOURCE; goto init_raw_cleanup; } init_raw_cleanup: if (status != MRAA_SUCCESS) { if (dev != NULL) { if (dev->fd >= 0) { close(dev->fd); } if (dev->path != NULL) { free((void *) dev->path); } free(dev); } return NULL; } return dev; }