Commit 244a0ee9 authored by Mark Cave-Ayland's avatar Mark Cave-Ayland
Browse files

adb: keep track of devices with pending data



Add a new pending variable to ADBBusState which is a bitmask indicating which
ADB devices have data to send. Update the bitmask every time that an ADB
request is executed.

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-13-mark.cave-ayland@ilande.co.uk>
parent 969ca2f7
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ static void adb_device_reset(ADBDevice *d)
int adb_request(ADBBusState *s, uint8_t *obuf, const uint8_t *buf, int len)
{
    ADBDevice *d;
    ADBDeviceClass *adc;
    int devaddr, cmd, i;

    cmd = buf[0] & 0xf;
@@ -51,14 +52,27 @@ int adb_request(ADBBusState *s, uint8_t *obuf, const uint8_t *buf, int len)
        }
        return 0;
    }

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

        if (adc->devhasdata(d)) {
            s->pending |= (1 << d->devaddr);
        }
    }

    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) {
            ADBDeviceClass *adc = ADB_DEVICE_GET_CLASS(d);
            return adc->devreq(d, obuf, buf, len);
        }
    }

    return ADB_RET_NOTPRESENT;
}

+1 −0
Original line number Diff line number Diff line
@@ -76,6 +76,7 @@ struct ADBBusState {
    /*< public >*/

    ADBDevice *devices[MAX_ADB_DEVICES];
    uint16_t pending;
    int nb_devices;
    int poll_index;