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: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Tested-by: Finn Thain <fthain@telegraphics.com.au> Acked-by: Laurent Vivier <laurent@vivier.eu> Message-Id: <20200623204936.24064-14-mark.cave-ayland@ilande.co.uk>
This commit is contained in:
parent
244a0ee965
commit
3fe02cc8b3
|
@ -42,7 +42,7 @@ int adb_request(ADBBusState *s, uint8_t *obuf, const uint8_t *buf, int len)
|
||||||
{
|
{
|
||||||
ADBDevice *d;
|
ADBDevice *d;
|
||||||
ADBDeviceClass *adc;
|
ADBDeviceClass *adc;
|
||||||
int devaddr, cmd, i;
|
int devaddr, cmd, olen, i;
|
||||||
|
|
||||||
cmd = buf[0] & 0xf;
|
cmd = buf[0] & 0xf;
|
||||||
if (cmd == ADB_BUSRESET) {
|
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];
|
d = s->devices[i];
|
||||||
adb_device_reset(d);
|
adb_device_reset(d);
|
||||||
}
|
}
|
||||||
|
s->status = 0;
|
||||||
return 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;
|
devaddr = buf[0] >> 4;
|
||||||
for (i = 0; i < s->nb_devices; i++) {
|
for (i = 0; i < s->nb_devices; i++) {
|
||||||
d = s->devices[i];
|
d = s->devices[i];
|
||||||
adc = ADB_DEVICE_GET_CLASS(d);
|
adc = ADB_DEVICE_GET_CLASS(d);
|
||||||
|
|
||||||
if (d->devaddr == devaddr) {
|
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;
|
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);
|
olen = adb_request(s, obuf + 1, buf, 1);
|
||||||
/* if there is data, we poll again the same device */
|
/* if there is data, we poll again the same device */
|
||||||
if (olen > 0) {
|
if (olen > 0) {
|
||||||
|
s->status |= ADB_STATUS_POLLREPLY;
|
||||||
obuf[0] = buf[0];
|
obuf[0] = buf[0];
|
||||||
olen++;
|
olen++;
|
||||||
break;
|
return olen;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s->poll_index++;
|
s->poll_index++;
|
||||||
|
|
|
@ -70,6 +70,9 @@ typedef struct ADBDeviceClass {
|
||||||
#define TYPE_ADB_BUS "apple-desktop-bus"
|
#define TYPE_ADB_BUS "apple-desktop-bus"
|
||||||
#define ADB_BUS(obj) OBJECT_CHECK(ADBBusState, (obj), TYPE_ADB_BUS)
|
#define ADB_BUS(obj) OBJECT_CHECK(ADBBusState, (obj), TYPE_ADB_BUS)
|
||||||
|
|
||||||
|
#define ADB_STATUS_BUSTIMEOUT 0x1
|
||||||
|
#define ADB_STATUS_POLLREPLY 0x2
|
||||||
|
|
||||||
struct ADBBusState {
|
struct ADBBusState {
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
BusState parent_obj;
|
BusState parent_obj;
|
||||||
|
@ -79,6 +82,7 @@ struct ADBBusState {
|
||||||
uint16_t pending;
|
uint16_t pending;
|
||||||
int nb_devices;
|
int nb_devices;
|
||||||
int poll_index;
|
int poll_index;
|
||||||
|
uint8_t status;
|
||||||
|
|
||||||
QEMUTimer *autopoll_timer;
|
QEMUTimer *autopoll_timer;
|
||||||
bool autopoll_enabled;
|
bool autopoll_enabled;
|
||||||
|
|
Loading…
Reference in a new issue