Exemplo n.º 1
0
Arquivo: uart.c Projeto: babuenir/mraa
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;
}
Exemplo n.º 2
0
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;
}