static void tx_callback(uint32_t id, uint32_t len) { struct sol_i2c *i2c = buses[id]; qm_rc_t ret; if ((i2c->xfer.type != WRITE) && (i2c->xfer.type != WRITE_REG)) return; if (i2c->xfer.multiple_count != i2c->xfer.multiple_done) { ret = begin_transfer(i2c->bus, i2c->slave_addr, id, i2c->xfer.data, i2c->xfer.length, NULL, 0, true); if (ret != QM_RC_OK) { i2c->xfer.status = -ret; process_post(&soletta_app_process, i2c_irq_event, i2c); return; } i2c->xfer.multiple_done++; return; } i2c->xfer.status = len; process_post(&soletta_app_process, i2c_irq_event, i2c); }
SOL_API struct sol_i2c_pending * sol_i2c_write_register(struct sol_i2c *i2c, uint8_t reg, const uint8_t *data, size_t count, void (*write_reg_cb)(void *cb_data, struct sol_i2c *i2c, uint8_t reg, uint8_t *data, ssize_t status), const void *cb_data) { qm_rc_t ret; errno = EINVAL; SOL_NULL_CHECK(i2c, NULL); SOL_NULL_CHECK(data, NULL); SOL_INT_CHECK(count, == 0, NULL); if (qm_i2c_get_status(i2c->bus) != QM_I2C_IDLE) { errno = EBUSY; return NULL; } i2c->xfer.type = WRITE_REG; i2c->xfer.rw_reg = write_reg_cb; i2c->xfer.user_data = cb_data; i2c->xfer.data = data; i2c->xfer.length = count; i2c->xfer.multiple_count = 1; i2c->xfer.multiple_done = 0; i2c->xfer.reg = reg; i2c->xfer.status = 0; ret = begin_transfer(i2c->bus, i2c->slave_addr, i2c->bus, &i2c->xfer.reg, 1, NULL, 0, false); errno = EINVAL; SOL_EXP_CHECK(ret != QM_RC_OK, NULL); errno = 0; return (struct sol_i2c_pending *)i2c; }
SOL_API struct sol_i2c_pending * sol_i2c_read(struct sol_i2c *i2c, uint8_t *data, size_t count, void (*read_cb)(void *cb_data, struct sol_i2c *i2c, uint8_t *data, ssize_t status), const void *cb_data) { qm_rc_t ret; errno = EINVAL; SOL_NULL_CHECK(i2c, NULL); SOL_NULL_CHECK(data, NULL); SOL_INT_CHECK(count, == 0, NULL); if (qm_i2c_get_status(i2c->bus) != QM_I2C_IDLE) { errno = EBUSY; return NULL; } i2c->xfer.type = READ; i2c->xfer.rw = read_cb; i2c->xfer.user_data = cb_data; i2c->xfer.data = data; i2c->xfer.length = count; i2c->xfer.status = 0; ret = begin_transfer(i2c->bus, i2c->slave_addr, i2c->bus, NULL, 0, data, i2c->xfer.length, true); errno = EINVAL; SOL_EXP_CHECK(ret != QM_RC_OK, NULL); errno = 0; return (struct sol_i2c_pending *)i2c; }
static void rx_callback(uint32_t id, uint32_t len) { struct sol_i2c *i2c = buses[id]; uint32_t offset; qm_rc_t ret; bool stop; if (i2c->xfer.type != READ_REG_MULTIPLE) { i2c->xfer.status = len; process_post(&soletta_app_process, i2c_irq_event, i2c); return; } if (i2c->xfer.multiple_done == i2c->xfer.multiple_count) { i2c->xfer.status = i2c->xfer.length * i2c->xfer.multiple_count; process_post(&soletta_app_process, i2c_irq_event, i2c); return; } offset = i2c->xfer.multiple_done * i2c->xfer.length; i2c->xfer.multiple_done++; stop = i2c->xfer.multiple_done == i2c->xfer.multiple_count; ret = begin_transfer(i2c->bus, i2c->slave_addr, id, &i2c->xfer.reg, 1, i2c->xfer.data + offset, i2c->xfer.length, stop); if (ret == QM_RC_OK) return; i2c->xfer.status = -ret; process_post(&soletta_app_process, i2c_irq_event, i2c); }
static void connect_cb(gpointer data, gint source, GaimInputCondition condition) { GaimXfer *xfer = (GaimXfer *)data; xfer->fd = source; begin_transfer(xfer, condition); }
static void connect_cb(gpointer data, gint source, const gchar *error_message) { PurpleXfer *xfer = (PurpleXfer *)data; if (source < 0) { purple_xfer_cancel_local(xfer); return; } xfer->fd = source; begin_transfer(xfer, PURPLE_INPUT_READ); }
void purple_xfer_start(PurpleXfer *xfer, int fd, const char *ip, unsigned int port) { PurpleInputCondition cond; PurpleXferType type; g_return_if_fail(xfer != NULL); g_return_if_fail(purple_xfer_get_type(xfer) != PURPLE_XFER_UNKNOWN); type = purple_xfer_get_type(xfer); purple_xfer_set_status(xfer, PURPLE_XFER_STATUS_STARTED); /* * FIXME 3.0.0 -- there's too much broken code depending on fd == 0 * meaning "don't use a real fd" */ if (fd == 0) fd = -1; if (type == PURPLE_XFER_RECEIVE) { cond = PURPLE_INPUT_READ; if (ip != NULL) { xfer->remote_ip = g_strdup(ip); xfer->remote_port = port; /* Establish a file descriptor. */ purple_proxy_connect(NULL, xfer->account, xfer->remote_ip, xfer->remote_port, connect_cb, xfer); return; } else { xfer->fd = fd; } } else { cond = PURPLE_INPUT_WRITE; xfer->fd = fd; } begin_transfer(xfer, cond); }
void gaim_xfer_start(GaimXfer *xfer, int fd, const char *ip, unsigned int port) { GaimInputCondition cond; GaimXferType type; g_return_if_fail(xfer != NULL); g_return_if_fail(gaim_xfer_get_type(xfer) != GAIM_XFER_UNKNOWN); type = gaim_xfer_get_type(xfer); xfer->bytes_remaining = gaim_xfer_get_size(xfer); xfer->bytes_sent = 0; if (type == GAIM_XFER_RECEIVE) { cond = GAIM_INPUT_READ; if (ip != NULL) { xfer->remote_ip = g_strdup(ip); xfer->remote_port = port; /* Establish a file descriptor. */ gaim_proxy_connect(xfer->account, xfer->remote_ip, xfer->remote_port, connect_cb, xfer); return; } else { xfer->fd = fd; } } else { cond = GAIM_INPUT_WRITE; xfer->fd = fd; } begin_transfer(xfer, cond); }