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
						David Gibson
					
				
			
			
				
	
			
			
			
						parent
						
							fb6649f172
						
					
				
				
					commit
					84051eb400
				
			| @@ -261,18 +261,21 @@ static int adb_kbd_request(ADBDevice *d, uint8_t *obuf, | ||||
|                 trace_adb_kbd_request_change_addr(d->devaddr); | ||||
|                 break; | ||||
|             default: | ||||
|                 d->devaddr = buf[1] & 0xf; | ||||
|                 /* we support handlers: | ||||
|                  * 1: Apple Standard Keyboard | ||||
|                  * 2: Apple Extended Keyboard (LShift = RShift) | ||||
|                  * 3: Apple Extended Keyboard (LShift != RShift) | ||||
|                  */ | ||||
|                 if (buf[2] == 1 || buf[2] == 2 || buf[2] == 3) { | ||||
|                     d->handler = buf[2]; | ||||
|                 } | ||||
|                 if (!d->disable_direct_reg3_writes) { | ||||
|                     d->devaddr = buf[1] & 0xf; | ||||
|  | ||||
|                 trace_adb_kbd_request_change_addr_and_handler(d->devaddr, | ||||
|                                                               d->handler); | ||||
|                     /* we support handlers: | ||||
|                      * 1: Apple Standard Keyboard | ||||
|                      * 2: Apple Extended Keyboard (LShift = RShift) | ||||
|                      * 3: Apple Extended Keyboard (LShift != RShift) | ||||
|                      */ | ||||
|                     if (buf[2] == 1 || buf[2] == 2 || buf[2] == 3) { | ||||
|                         d->handler = buf[2]; | ||||
|                     } | ||||
|  | ||||
|                     trace_adb_kbd_request_change_addr_and_handler(d->devaddr, | ||||
|                                                                   d->handler); | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|   | ||||
| @@ -142,24 +142,27 @@ static int adb_mouse_request(ADBDevice *d, uint8_t *obuf, | ||||
|                 trace_adb_mouse_request_change_addr(d->devaddr); | ||||
|                 break; | ||||
|             default: | ||||
|                 d->devaddr = buf[1] & 0xf; | ||||
|                 /* we support handlers: | ||||
|                  * 0x01: Classic Apple Mouse Protocol / 100 cpi operations | ||||
|                  * 0x02: Classic Apple Mouse Protocol / 200 cpi operations | ||||
|                  * we don't support handlers (at least): | ||||
|                  * 0x03: Mouse systems A3 trackball | ||||
|                  * 0x04: Extended Apple Mouse Protocol | ||||
|                  * 0x2f: Microspeed mouse | ||||
|                  * 0x42: Macally | ||||
|                  * 0x5f: Microspeed mouse | ||||
|                  * 0x66: Microspeed mouse | ||||
|                  */ | ||||
|                 if (buf[2] == 1 || buf[2] == 2) { | ||||
|                     d->handler = buf[2]; | ||||
|                 } | ||||
|                 if (!d->disable_direct_reg3_writes) { | ||||
|                     d->devaddr = buf[1] & 0xf; | ||||
|  | ||||
|                 trace_adb_mouse_request_change_addr_and_handler(d->devaddr, | ||||
|                                                                 d->handler); | ||||
|                     /* we support handlers: | ||||
|                      * 0x01: Classic Apple Mouse Protocol / 100 cpi operations | ||||
|                      * 0x02: Classic Apple Mouse Protocol / 200 cpi operations | ||||
|                      * we don't support handlers (at least): | ||||
|                      * 0x03: Mouse systems A3 trackball | ||||
|                      * 0x04: Extended Apple Mouse Protocol | ||||
|                      * 0x2f: Microspeed mouse | ||||
|                      * 0x42: Macally | ||||
|                      * 0x5f: Microspeed mouse | ||||
|                      * 0x66: Microspeed mouse | ||||
|                      */ | ||||
|                     if (buf[2] == 1 || buf[2] == 2) { | ||||
|                         d->handler = buf[2]; | ||||
|                     } | ||||
|  | ||||
|                     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