Lines Matching +full:stop +full:- +full:ack

1 /*-
36 * Calls to DELAY() are needed per Application Note AN-179 "TWSI Software
86 #define debugf(sc, fmt, args...) if ((sc)->debug) \
87 device_printf((sc)->dev, "%s: " fmt, __func__, ##args)
92 { -1, 0 }
100 val = bus_read_4(sc->res[0], off);
101 if (sc->debug > 1)
110 if (sc->debug > 1)
112 bus_write_4(sc->res[0], off, val);
120 val = TWSI_READ(sc, sc->reg_control);
125 TWSI_WRITE(sc, sc->reg_control, val);
133 val = TWSI_READ(sc, sc->reg_control);
138 TWSI_WRITE(sc, sc->reg_control, val);
147 if (sc->iflag_w1c)
159 * non-zero on timeout
167 while (!(TWSI_READ(sc, sc->reg_control) & mask)) {
169 if (--timeout < 0)
178 * 'timeout' is given in us. Note also that timeout handling is not exact --
190 mtx_assert(&sc->mutex, MA_OWNED);
194 iflg_set = TWSI_READ(sc, sc->reg_control) & TWSI_CONTROL_IFLG;
216 status = TWSI_READ(sc, sc->reg_status);
225 TWSI_WRITE(sc, sc->reg_data, slave);
235 status = TWSI_READ(sc, sc->reg_status);
238 debugf(sc, "no ACK (status: %02x) after sending slave address\n",
247 #define ABSSUB(a,b) (((a) > (b)) ? (a) - (b) : (b) - (a))
260 if (clk_get_freq(sc->clk_core, &clk) < 0)
261 return (-1);
293 busfreq = IICBUS_GET_FREQUENCY(sc->iicbus, speed);
295 if (twsi_calc_baud_rate(sc, busfreq, &param) == -1) {
299 param = sc->baud_rate[speed].param;
305 param = sc->baud_rate[IIC_FAST].param;
313 mtx_lock(&sc->mutex);
314 TWSI_WRITE(sc, sc->reg_soft_reset, 0x1);
315 TWSI_WRITE(sc, sc->reg_baud_rate, param);
316 TWSI_WRITE(sc, sc->reg_control, TWSI_CONTROL_TWSIEN);
318 mtx_unlock(&sc->mutex);
331 mtx_lock(&sc->mutex);
336 mtx_unlock(&sc->mutex);
353 mtx_lock(&sc->mutex);
356 mtx_unlock(&sc->mutex);
377 mtx_lock(&sc->mutex);
379 mtx_unlock(&sc->mutex);
397 mtx_lock(&sc->mutex);
402 * do not send ACK then, per I2C specs
404 last_byte = ((*read == len - 1) && last) ? 1 : 0;
419 status = TWSI_READ(sc, sc->reg_status);
427 *buf++ = TWSI_READ(sc, sc->reg_data);
432 mtx_unlock(&sc->mutex);
445 mtx_lock(&sc->mutex);
448 TWSI_WRITE(sc, sc->reg_data, *buf++);
458 status = TWSI_READ(sc, sc->reg_status);
468 mtx_unlock(&sc->mutex);
476 * Must send stop condition to abort the current transfer.
478 debugf(sc, "Sending STOP condition for error %d\n", err);
479 sc->transfer = 0;
480 sc->error = err;
481 sc->control_val = 0;
482 TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_STOP);
494 if (!sc->have_intr)
497 mtx_lock(&sc->mutex);
498 KASSERT(sc->transfer == 0,
502 status = TWSI_READ(sc, sc->reg_status);
510 sc->nmsgs = nmsgs;
511 sc->msgs = msgs;
512 sc->msg_idx = 0;
513 sc->transfer = 1;
514 sc->error = 0;
521 /* Send start and re-enable interrupts */
522 sc->control_val = TWSI_CONTROL_TWSIEN | TWSI_CONTROL_INTEN;
523 TWSI_WRITE(sc, sc->reg_control, sc->control_val | TWSI_CONTROL_START);
524 msleep_sbt(sc, &sc->mutex, 0, "twsi", 3000 * SBT_1MS, SBT_1MS, 0);
526 if (sc->error == 0 && sc->transfer != 0) {
527 device_printf(sc->dev, "transfer timeout\n");
528 sc->error = IIC_ETIMEOUT;
529 sc->transfer = 0;
532 if (sc->error != 0)
533 debugf(sc, "Error: %d\n", sc->error);
537 debugf(sc, "status=0x%x\n", TWSI_READ(sc, sc->reg_status));
538 TWSI_WRITE(sc, sc->reg_control, 0);
539 debugf(sc, "status=0x%x\n", TWSI_READ(sc, sc->reg_status));
540 error = sc->error;
541 mtx_unlock(&sc->mutex);
557 mtx_lock(&sc->mutex);
558 debugf(sc, "Got interrupt, current msg=%u\n", sc->msg_idx);
560 status = TWSI_READ(sc, sc->reg_status);
562 TWSI_READ(sc, sc->reg_control), status);
564 if (sc->transfer == 0) {
565 device_printf(sc->dev, "interrupt without active transfer, "
567 TWSI_WRITE(sc, sc->reg_control, sc->control_val |
580 sc->msgs[sc->msg_idx].slave);
582 if (sc->msgs[sc->msg_idx].flags & IIC_M_RD)
583 TWSI_WRITE(sc, sc->reg_data,
584 sc->msgs[sc->msg_idx].slave | LSB);
586 TWSI_WRITE(sc, sc->reg_data,
587 sc->msgs[sc->msg_idx].slave & ~LSB);
591 debugf(sc, "Address ACK-ed (write)\n");
593 if (sc->msgs[sc->msg_idx].len > 0) {
595 sc->sent_bytes = 1;
597 sc->msgs[sc->msg_idx].len,
598 sc->msgs[sc->msg_idx].buf[0]);
599 TWSI_WRITE(sc, sc->reg_data,
600 sc->msgs[sc->msg_idx].buf[0]);
602 debugf(sc, "Zero-length write, sending STOP\n");
603 TWSI_WRITE(sc, sc->reg_control,
604 sc->control_val | TWSI_CONTROL_STOP);
609 debugf(sc, "Address ACK-ed (read)\n");
610 sc->recv_bytes = 0;
612 if (sc->msgs[sc->msg_idx].len == 0) {
613 debugf(sc, "Zero-length read, sending STOP\n");
614 TWSI_WRITE(sc, sc->reg_control,
615 sc->control_val | TWSI_CONTROL_STOP);
616 } else if (sc->msgs[sc->msg_idx].len == 1) {
617 sc->control_val &= ~TWSI_CONTROL_ACK;
619 sc->control_val |= TWSI_CONTROL_ACK;
625 debugf(sc, "Address NACK-ed\n");
629 debugf(sc, "Data byte NACK-ed\n");
633 KASSERT(sc->sent_bytes <= sc->msgs[sc->msg_idx].len,
635 debugf(sc, "ACK received after transmitting data\n");
636 if (sc->sent_bytes == sc->msgs[sc->msg_idx].len) {
639 /* Send stop, no interrupts on stop */
640 if (!(sc->msgs[sc->msg_idx].flags & IIC_M_NOSTOP)) {
641 TWSI_WRITE(sc, sc->reg_control,
642 sc->control_val | TWSI_CONTROL_STOP);
651 sc->sent_bytes,
652 sc->msgs[sc->msg_idx].len,
653 sc->msgs[sc->msg_idx].buf[sc->sent_bytes]);
654 TWSI_WRITE(sc, sc->reg_data,
655 sc->msgs[sc->msg_idx].buf[sc->sent_bytes]);
656 sc->sent_bytes++;
660 debugf(sc, "Received and ACK-ed data\n");
661 KASSERT(sc->recv_bytes < sc->msgs[sc->msg_idx].len,
664 sc->msgs[sc->msg_idx].buf[sc->recv_bytes] =
665 TWSI_READ(sc, sc->reg_data);
667 sc->recv_bytes,
668 sc->msgs[sc->msg_idx].len,
669 sc->msgs[sc->msg_idx].buf[sc->recv_bytes]);
670 sc->recv_bytes++;
672 /* If we only have one byte left, disable ACK */
673 if (sc->msgs[sc->msg_idx].len - sc->recv_bytes == 1) {
674 sc->control_val &= ~TWSI_CONTROL_ACK;
675 } else if (sc->msgs[sc->msg_idx].len == sc->recv_bytes) {
677 * We should not have ACK-ed the last byte.
686 debugf(sc, "Received and NACK-ed data\n");
687 KASSERT(sc->recv_bytes == sc->msgs[sc->msg_idx].len - 1,
689 sc->msgs[sc->msg_idx].buf[sc->recv_bytes] =
690 TWSI_READ(sc, sc->reg_data);
692 sc->recv_bytes,
693 sc->msgs[sc->msg_idx].len,
694 sc->msgs[sc->msg_idx].buf[sc->recv_bytes]);
695 sc->recv_bytes++;
697 if (sc->msgs[sc->msg_idx].len == sc->recv_bytes) {
699 if (!(sc->msgs[sc->msg_idx].flags & IIC_M_NOSTOP)) {
700 debugf(sc, "Send STOP\n");
701 TWSI_WRITE(sc, sc->reg_control,
702 sc->control_val | TWSI_CONTROL_STOP);
707 * We should not have NACK-ed yet.
710 debugf(sc, "NACK-ed before receving all bytes?\n");
730 sc->msg_idx++;
731 if (sc->msg_idx == sc->nmsgs) {
733 sc->transfer = 0;
734 sc->error = 0;
735 } else if ((sc->msgs[sc->msg_idx].flags & IIC_M_NOSTART) == 0) {
740 KASSERT((sc->msgs[sc->msg_idx - 1].flags & IIC_M_NOSTOP) != 0,
741 ("NOSTART message after STOP"));
742 KASSERT((sc->msgs[sc->msg_idx].flags & IIC_M_RD) ==
743 (sc->msgs[sc->msg_idx - 1].flags & IIC_M_RD),
746 sc->sent_bytes = 0;
747 sc->recv_bytes = 0;
748 if ((sc->msgs[sc->msg_idx].flags & IIC_M_RD) == 0) {
762 TWSI_WRITE(sc, sc->reg_control, sc->control_val |
763 (sc->iflag_w1c ? TWSI_CONTROL_IFLG : 0) |
766 debugf(sc, "Done with interrupt, transfer = %d\n", sc->transfer);
767 if (sc->transfer == 0)
769 mtx_unlock(&sc->mutex);
779 if ((bus_setup_intr(pdev, sc->res[1], INTR_TYPE_MISC | INTR_MPSAFE,
780 NULL, twsi_intr, sc, &sc->intrhand)))
783 sc->have_intr = true;
795 sc->dev = dev;
797 mtx_init(&sc->mutex, device_get_nameunit(dev), "twsi", MTX_DEF);
799 if (bus_alloc_resources(dev, res_spec, sc->res)) {
806 sc->debug = 1;
812 &sc->debug, 0, "Set debug level (zero to disable)");
815 if ((sc->iicbus = device_add_child(dev, "iicbus", -1)) == NULL) {
838 if (sc->intrhand != NULL)
839 bus_teardown_intr(sc->dev, sc->res[1], sc->intrhand);
841 bus_release_resources(dev, res_spec, sc->res);
843 mtx_destroy(&sc->mutex);