adb: add property to disable direct reg 3 writes
MacOS 9 has a bug in its PMU driver whereby after configuring the ADB bus devices it sends another write to reg 3 on both devices resetting them both back to the same address. Add a new disable_direct_reg3_writes property to ADBDevice to disable these direct writes which can enabled just for the upcoming pmu-adb support. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
		
				
					committed by
					
						
						David Gibson
					
				
			
			
				
	
			
			
			
						parent
						
							fb6649f172
						
					
				
				
					commit
					84051eb400
				
			@@ -261,7 +261,9 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,
 | 
			
		||||
                trace_adb_kbd_request_change_addr(d->devaddr);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                if (!d->disable_direct_reg3_writes) {
 | 
			
		||||
                    d->devaddr = buf[1] & 0xf;
 | 
			
		||||
 | 
			
		||||
                    /* we support handlers:
 | 
			
		||||
                     * 1: Apple Standard Keyboard
 | 
			
		||||
                     * 2: Apple Extended Keyboard (LShift = RShift)
 | 
			
		||||
@@ -273,6 +275,7 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf,
 | 
			
		||||
 | 
			
		||||
                    trace_adb_kbd_request_change_addr_and_handler(d->devaddr,
 | 
			
		||||
                                                                  d->handler);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -142,7 +142,9 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
 | 
			
		||||
                trace_adb_mouse_request_change_addr(d->devaddr);
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                if (!d->disable_direct_reg3_writes) {
 | 
			
		||||
                    d->devaddr = buf[1] & 0xf;
 | 
			
		||||
 | 
			
		||||
                    /* we support handlers:
 | 
			
		||||
                     * 0x01: Classic Apple Mouse Protocol / 100 cpi operations
 | 
			
		||||
                     * 0x02: Classic Apple Mouse Protocol / 200 cpi operations
 | 
			
		||||
@@ -158,8 +160,9 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf,
 | 
			
		||||
                        d->handler = buf[2];
 | 
			
		||||
                    }
 | 
			
		||||
 | 
			
		||||
                trace_adb_mouse_request_change_addr_and_handler(d->devaddr,
 | 
			
		||||
                                                                d->handler);
 | 
			
		||||
                    trace_adb_mouse_request_change_addr_and_handler(
 | 
			
		||||
                        d->devaddr, d->handler);
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -113,11 +113,18 @@ static void adb_device_realizefn(DeviceState *dev, Error **errp)
 | 
			
		||||
    bus->devices[bus->nb_devices++] = d;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static Property adb_device_properties[] = {
 | 
			
		||||
    DEFINE_PROP_BOOL("disable-direct-reg3-writes", ADBDevice,
 | 
			
		||||
                     disable_direct_reg3_writes, false),
 | 
			
		||||
    DEFINE_PROP_END_OF_LIST(),
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static void adb_device_class_init(ObjectClass *oc, void *data)
 | 
			
		||||
{
 | 
			
		||||
    DeviceClass *dc = DEVICE_CLASS(oc);
 | 
			
		||||
 | 
			
		||||
    dc->realize = adb_device_realizefn;
 | 
			
		||||
    dc->props = adb_device_properties;
 | 
			
		||||
    dc->bus_type = TYPE_ADB_BUS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -49,6 +49,7 @@ struct ADBDevice {
 | 
			
		||||
 | 
			
		||||
    int devaddr;
 | 
			
		||||
    int handler;
 | 
			
		||||
    bool disable_direct_reg3_writes;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define ADB_DEVICE_CLASS(cls) \
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user