Commit 3fe02cc8 authored by Mark Cave-Ayland's avatar Mark Cave-Ayland
Browse files

adb: add status field for holding information about the last ADB request



Currently only 2 bits are defined: one to indicate if the request timed out (no
reply) and another to indicate whether the request was the result of an autopoll
operation.

Signed-off-by: default avatarMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Acked-by: default avatarLaurent Vivier <laurent@vivier.eu>
Message-Id: <20200623204936.24064-14-mark.cave-ayland@ilande.co.uk>
parent 244a0ee9
Loading
Loading
Loading
Loading
+11 −3
Original line number Diff line number Diff line
@@ -42,7 +42,7 @@ int adb_request(ADBBusState *s, uint8_t *obuf, const uint8_t *buf, int len)
{
    ADBDevice *d;
    ADBDeviceClass *adc;
    int devaddr, cmd, i;
    int devaddr, cmd, olen, i;

    cmd = buf[0] & 0xf;
    if (cmd == ADB_BUSRESET) {
@@ -50,6 +50,7 @@ int adb_request(ADBBusState *s, uint8_t *obuf, const uint8_t *buf, int len)
            d = s->devices[i];
            adb_device_reset(d);
        }
        s->status = 0;
        return 0;
    }

@@ -63,16 +64,22 @@ int adb_request(ADBBusState *s, uint8_t *obuf, const uint8_t *buf, int len)
        }
    }

    s->status = 0;
    devaddr = buf[0] >> 4;
    for (i = 0; i < s->nb_devices; i++) {
        d = s->devices[i];
        adc = ADB_DEVICE_GET_CLASS(d);

        if (d->devaddr == devaddr) {
            return adc->devreq(d, obuf, buf, len);
            olen = adc->devreq(d, obuf, buf, len);
            if (!olen) {
                s->status |= ADB_STATUS_BUSTIMEOUT;
            }
            return olen;
        }
    }

    s->status |= ADB_STATUS_BUSTIMEOUT;
    return ADB_RET_NOTPRESENT;
}

@@ -94,9 +101,10 @@ int adb_poll(ADBBusState *s, uint8_t *obuf, uint16_t poll_mask)
            olen = adb_request(s, obuf + 1, buf, 1);
            /* if there is data, we poll again the same device */
            if (olen > 0) {
                s->status |= ADB_STATUS_POLLREPLY;
                obuf[0] = buf[0];
                olen++;
                break;
                return olen;
            }
        }
        s->poll_index++;
+4 −0
Original line number Diff line number Diff line
@@ -70,6 +70,9 @@ typedef struct ADBDeviceClass {
#define TYPE_ADB_BUS "apple-desktop-bus"
#define ADB_BUS(obj) OBJECT_CHECK(ADBBusState, (obj), TYPE_ADB_BUS)

#define ADB_STATUS_BUSTIMEOUT  0x1
#define ADB_STATUS_POLLREPLY   0x2

struct ADBBusState {
    /*< private >*/
    BusState parent_obj;
@@ -79,6 +82,7 @@ struct ADBBusState {
    uint16_t pending;
    int nb_devices;
    int poll_index;
    uint8_t status;

    QEMUTimer *autopoll_timer;
    bool autopoll_enabled;