Lines Matching refs:i2c

23 static aos_status_t transfer_sequence(aos_i2c_t *i2c, const aos_i2c_msg_t *msgs, size_t num_msgs)  in transfer_sequence()  argument
29 …memcpy(i2c->buf[0], msgs[0].buf, AOS_I2C_BUF_SIZE < msgs[0].count ? AOS_I2C_BUF_SIZE : msgs[0].cou… in transfer_sequence()
41 i2c->x.cfg = msg->cfg; in transfer_sequence()
42 i2c->x.addr = msg->addr; in transfer_sequence()
45 i2c->x.timeout = XFER_TIMEOUT; in transfer_sequence()
46 i2c->x.len = (pos + AOS_I2C_BUF_SIZE < msg->count) ? AOS_I2C_BUF_SIZE : msg->count - pos; in transfer_sequence()
47 i2c->x.pos[0] = 0; in transfer_sequence()
48 i2c->x.pos[1] = 0; in transfer_sequence()
49 msg_tail = (pos + i2c->x.len == msg->count); in transfer_sequence()
50 i2c->x.flags = (j & 0x1) ? AOS_I2C_XF_BUF_IDX : 0; in transfer_sequence()
51 i2c->x.flags |= (pos == 0) ? AOS_I2C_XF_MSG_HEAD : 0; in transfer_sequence()
52 i2c->x.flags |= msg_tail ? AOS_I2C_XF_MSG_TAIL : 0; in transfer_sequence()
53 i2c->x.flags |= (j == 0) ? AOS_I2C_XF_SEQ_HEAD : 0; in transfer_sequence()
54 i2c->x.flags |= (msg_tail && i + 1 == num_msgs) ? AOS_I2C_XF_SEQ_TAIL : 0; in transfer_sequence()
56 ret = i2c->ops->start_xfer(i2c); in transfer_sequence()
68 memcpy(&((uint8_t *)last_msg->buf)[last_pos], i2c->buf[(j - 1) & 0x1], last_len); in transfer_sequence()
76 next_pos = pos + i2c->x.len; in transfer_sequence()
87 memcpy(i2c->buf[(j + 1) & 0x1], &((const uint8_t *)next_msg->buf)[next_pos], next_len); in transfer_sequence()
91 …if (aos_event_get(&i2c->event, mask, AOS_EVENT_OR, &val, i2c->x.timeout) || (val & EVENT_XFER_ERRO… in transfer_sequence()
92 i2c->ops->abort_xfer(i2c); in transfer_sequence()
93 aos_event_set(&i2c->event, 0, AOS_EVENT_AND); in transfer_sequence()
96 i2c->ops->finish_xfer(i2c); in transfer_sequence()
97 aos_event_set(&i2c->event, 0, AOS_EVENT_AND); in transfer_sequence()
107 pos += i2c->x.len; in transfer_sequence()
112 int index = (i2c->x.flags & AOS_I2C_XF_BUF_IDX) ? 1 : 0; in transfer_sequence()
113 memcpy(&((uint8_t *)last_msg->buf)[last_pos], i2c->buf[index], i2c->x.len); in transfer_sequence()
121 aos_i2c_t *i2c; in aos_i2c_transfer() local
127 i2c = aos_container_of(ref->dev, aos_i2c_t, dev); in aos_i2c_transfer()
133 if (!(i2c->flags & AOS_I2C_F_ADDR_10)) in aos_i2c_transfer()
157 ret = transfer_sequence(i2c, &msgs[j], i + 1 - j); in aos_i2c_transfer()
170 aos_i2c_t *i2c = aos_container_of(dev, aos_i2c_t, dev); in dev_i2c_unregister() local
172 aos_event_free(&i2c->event); in dev_i2c_unregister()
174 if (i2c->ops->unregister) in dev_i2c_unregister()
175 i2c->ops->unregister(i2c); in dev_i2c_unregister()
180 aos_i2c_t *i2c = aos_container_of(ref->dev, aos_i2c_t, dev); in dev_i2c_get() local
186 ret = i2c->ops->startup(i2c); in dev_i2c_get()
195 aos_i2c_t *i2c = aos_container_of(ref->dev, aos_i2c_t, dev); in dev_i2c_put() local
200 i2c->ops->shutdown(i2c); in dev_i2c_put()
209 aos_status_t aos_i2c_register(aos_i2c_t *i2c) in aos_i2c_register() argument
213 if (!i2c) in aos_i2c_register()
216 if (!i2c->ops || !i2c->ops->startup || !i2c->ops->shutdown || in aos_i2c_register()
217 !i2c->ops->start_xfer || !i2c->ops->finish_xfer || !i2c->ops->abort_xfer) in aos_i2c_register()
220 if (i2c->hz == 0) in aos_i2c_register()
223 i2c->dev.type = AOS_DEV_TYPE_I2C; in aos_i2c_register()
224 i2c->dev.ops = &dev_i2c_ops; in aos_i2c_register()
226 i2c->dev.vfs_helper.name[0] = '\0'; in aos_i2c_register()
227 i2c->dev.vfs_helper.ops = NULL; in aos_i2c_register()
229 aos_spin_lock_init(&i2c->lock); in aos_i2c_register()
231 ret = aos_event_new(&i2c->event, 0); in aos_i2c_register()
235 ret = aos_dev_register(&i2c->dev); in aos_i2c_register()
237 aos_event_free(&i2c->event); in aos_i2c_register()
249 size_t aos_i2c_hard_push(aos_i2c_t *i2c, void *tx_buf, size_t count) in aos_i2c_hard_push() argument
251 if (i2c->x.pos[0] + count > i2c->x.len) in aos_i2c_hard_push()
252 count = i2c->x.len - i2c->x.pos[0]; in aos_i2c_hard_push()
254 if (!(i2c->x.cfg & AOS_I2C_MCFG_RX) && tx_buf) { in aos_i2c_hard_push()
255 const uint8_t *buf = i2c->buf[(i2c->x.flags & AOS_I2C_XF_BUF_IDX) ? 1 : 0]; in aos_i2c_hard_push()
258 ((uint8_t *)tx_buf)[i] = buf[i2c->x.pos[0] + i]; in aos_i2c_hard_push()
261 i2c->x.pos[0] += count; in aos_i2c_hard_push()
266 bool aos_i2c_hard_pull(aos_i2c_t *i2c, const void *rx_buf, size_t count) in aos_i2c_hard_pull() argument
268 if (i2c->x.pos[1] + count > i2c->x.pos[0]) in aos_i2c_hard_pull()
269 count = i2c->x.pos[0] - i2c->x.pos[1]; in aos_i2c_hard_pull()
271 if ((i2c->x.cfg & AOS_I2C_MCFG_RX) && rx_buf) { in aos_i2c_hard_pull()
272 uint8_t *buf = i2c->buf[(i2c->x.flags & AOS_I2C_XF_BUF_IDX) ? 1 : 0]; in aos_i2c_hard_pull()
275 buf[i2c->x.pos[1] + i] = ((const uint8_t *)rx_buf)[i]; in aos_i2c_hard_pull()
278 i2c->x.pos[1] += count; in aos_i2c_hard_pull()
279 if (i2c->x.pos[1] == i2c->x.len) { in aos_i2c_hard_pull()
280 aos_event_set(&i2c->event, EVENT_XFER_COMPLETE, AOS_EVENT_OR); in aos_i2c_hard_pull()
287 void aos_i2c_hard_fail(aos_i2c_t *i2c) in aos_i2c_hard_fail() argument
289 aos_event_set(&i2c->event, EVENT_XFER_ERROR, AOS_EVENT_OR); in aos_i2c_hard_fail()