25
#include "qemu/osdep.h"
26
#include "ui/console.h"
27
#include "hw/input/adb.h"
28
#include "migration/vmstate.h"
29
#include "qemu/module.h"
30
#include "adb-internal.h"
32
#include "qom/object.h"
34
OBJECT_DECLARE_TYPE(MouseState, ADBMouseClass, ADB_MOUSE)
41
int buttons_state, last_buttons_state;
48
ADBDeviceClass parent_class;
51
DeviceRealize parent_realize;
54
static void adb_mouse_event(void *opaque,
55
int dx1, int dy1, int dz1, int buttons_state)
57
MouseState *s = opaque;
62
s->buttons_state = buttons_state;
66
static int adb_mouse_poll(ADBDevice *d, uint8_t *obuf)
68
MouseState *s = ADB_MOUSE(d);
71
if (s->last_buttons_state == s->buttons_state &&
72
s->dx == 0 && s->dy == 0) {
92
s->last_buttons_state = s->buttons_state;
97
if (!(s->buttons_state & MOUSE_EVENT_LBUTTON)) {
100
if (!(s->buttons_state & MOUSE_EVENT_RBUTTON)) {
109
static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
110
const uint8_t *buf, int len)
112
MouseState *s = ADB_MOUSE(d);
115
if ((buf[0] & 0x0f) == ADB_FLUSH) {
117
s->buttons_state = s->last_buttons_state;
121
trace_adb_device_mouse_flush();
130
trace_adb_device_mouse_writereg(reg, buf[1]);
146
case ADB_CMD_SELF_TEST:
148
case ADB_CMD_CHANGE_ID:
149
case ADB_CMD_CHANGE_ID_AND_ACT:
150
case ADB_CMD_CHANGE_ID_AND_ENABLE:
151
d->devaddr = buf[1] & 0xf;
152
trace_adb_device_mouse_request_change_addr(d->devaddr);
155
d->devaddr = buf[1] & 0xf;
168
if (buf[2] == 1 || buf[2] == 2) {
172
trace_adb_device_mouse_request_change_addr_and_handler(
173
d->devaddr, d->handler);
181
olen = adb_mouse_poll(d, obuf);
186
obuf[0] = d->devaddr;
187
obuf[1] = d->handler;
191
trace_adb_device_mouse_readreg(reg, obuf[0], obuf[1]);
197
static bool adb_mouse_has_data(ADBDevice *d)
199
MouseState *s = ADB_MOUSE(d);
201
return !(s->last_buttons_state == s->buttons_state &&
202
s->dx == 0 && s->dy == 0);
205
static void adb_mouse_reset(DeviceState *dev)
207
ADBDevice *d = ADB_DEVICE(dev);
208
MouseState *s = ADB_MOUSE(dev);
211
d->devaddr = ADB_DEVID_MOUSE;
212
s->last_buttons_state = s->buttons_state = 0;
213
s->dx = s->dy = s->dz = 0;
216
static const VMStateDescription vmstate_adb_mouse = {
219
.minimum_version_id = 2,
220
.fields = (const VMStateField[]) {
221
VMSTATE_STRUCT(parent_obj, MouseState, 0, vmstate_adb_device,
223
VMSTATE_INT32(buttons_state, MouseState),
224
VMSTATE_INT32(last_buttons_state, MouseState),
225
VMSTATE_INT32(dx, MouseState),
226
VMSTATE_INT32(dy, MouseState),
227
VMSTATE_INT32(dz, MouseState),
228
VMSTATE_END_OF_LIST()
232
static void adb_mouse_realizefn(DeviceState *dev, Error **errp)
234
MouseState *s = ADB_MOUSE(dev);
235
ADBMouseClass *amc = ADB_MOUSE_GET_CLASS(dev);
237
amc->parent_realize(dev, errp);
239
qemu_add_mouse_event_handler(adb_mouse_event, s, 0, "QEMU ADB Mouse");
242
static void adb_mouse_initfn(Object *obj)
244
ADBDevice *d = ADB_DEVICE(obj);
246
d->devaddr = ADB_DEVID_MOUSE;
249
static void adb_mouse_class_init(ObjectClass *oc, void *data)
251
DeviceClass *dc = DEVICE_CLASS(oc);
252
ADBDeviceClass *adc = ADB_DEVICE_CLASS(oc);
253
ADBMouseClass *amc = ADB_MOUSE_CLASS(oc);
255
device_class_set_parent_realize(dc, adb_mouse_realizefn,
256
&amc->parent_realize);
257
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
259
adc->devreq = adb_mouse_request;
260
adc->devhasdata = adb_mouse_has_data;
261
dc->reset = adb_mouse_reset;
262
dc->vmsd = &vmstate_adb_mouse;
265
static const TypeInfo adb_mouse_type_info = {
266
.name = TYPE_ADB_MOUSE,
267
.parent = TYPE_ADB_DEVICE,
268
.instance_size = sizeof(MouseState),
269
.instance_init = adb_mouse_initfn,
270
.class_init = adb_mouse_class_init,
271
.class_size = sizeof(ADBMouseClass),
274
static void adb_mouse_register_types(void)
276
type_register_static(&adb_mouse_type_info);
279
type_init(adb_mouse_register_types)