/** * \brief Create a SPI socket. * \param client SPI chip client. * \param flags I/O flags. */ PUBLIC int spidev_socket(struct spi_client *client, uint16_t flags) { int rc; FILE *stream = malloc(sizeof(*stream)); if(!stream) { return -1; } rc = iob_add(stream); if(rc < 0) { free(stream); return -1; } client->stream = stream; stream->flags = flags; stream->data = client; stream->write = &spidev_write; stream->read = &spidev_read; stream->close = &spidev_close; stream->flush = &spidev_flush; return rc; }
/** * \brief Request an I2C I/O file. * \param client I2C driver client. * \param flags File flags. * \return The file descriptor associated with this client. */ PUBLIC int i2cdev_socket(struct i2c_client *client, uint16_t flags) { FILE *socket; i2c_features_t features; struct i2c_shared_info *shinfo = i2c_shinfo(client); int rc = -1; if(client == NULL) { goto out; } if(BermudaEventWait(event(&(shinfo->mutex)), I2C_MASTER_TMO) != 0) { goto out; } socket = BermudaHeapAlloc(sizeof(*socket)); if(!socket) { rc = -1; BermudaEventSignal(event(&(shinfo->mutex))); goto out; } rc = iob_add(socket); if(rc < 0) { BermudaHeapFree(socket); BermudaEventSignal(event(&(shinfo->mutex))); goto out; } features = i2c_client_features(client); features |= I2C_CLIENT_HAS_LOCK_FLAG; i2c_client_set_features(client, features); shinfo->socket = socket; socket->data = client; socket->name = "I2C"; socket->write = &i2cdev_write; socket->read = &i2cdev_read; socket->flush = &i2cdev_flush; socket->close = &i2cdev_close; socket->flags = flags; out: return rc; }
/** * \brief Setup the USART file streams used by functions such as printf. * \see BermudaUsartWriteByte * \see BermudaUsartReadByte * * Stdout will be redirected to BermudaUsartWriteByte. Stdin is redirected to * the function BermudaUsartReadByte. */ PUBLIC void BermudaUsartSetupStreams() { stdout = &usart0_io; stdin = &usart0_io; iob_add(&usart0_io); }