void ApplePS2SynapticsTouchPad::interruptOccurred( UInt8 data ) { // // This will be invoked automatically from our device when asynchronous // events need to be delivered. Process the trackpad data. Do NOT issue // any BLOCKING commands to our device in this context. // // Ignore all bytes until we see the start of a packet, otherwise the // packets may get out of sequence and things will get very confusing. // if (_packetByteCount == 0 && ((data == kSC_Acknowledge) || !(data & 0x08))) { return; } // // Add this byte to the packet buffer. If the packet is complete, that is, // we have the three bytes, dispatch this packet for processing. // _packetBuffer[_packetByteCount++] = data; if (_packetByteCount == 3) { dispatchRelativePointerEventWithPacket(_packetBuffer, 3); _packetByteCount = 0; } }
void ApplePS2Mouse::interruptOccurred(UInt8 data) // PS2InterruptAction { // // This will be invoked automatically from our device when asynchronous mouse // needs to be delivered. Process the mouse data. // // We ignore all bytes until we see the start of a packet, otherwise the mouse // packets may get out of sequence and things will get very confusing. // if (_packetByteCount == 0 && ((data == kSC_Acknowledge) || !(data & 0x08))) { IOLog("%s: Unexpected data from PS/2 controller.\n", getName()); // // Reset the mouse when packet synchronization is lost. Limit the number // of consecutive resets to guard against flaky hardware. // if (_mouseResetCount < 5) { _mouseResetCount++; scheduleMouseReset(); } return; } // // Add this byte to the packet buffer. If the packet is complete, that is, // we have the three (or four) bytes, dispatch this packet for processing. // _packetBuffer[_packetByteCount++] = data; if (_packetByteCount == _packetLength) { dispatchRelativePointerEventWithPacket(_packetBuffer, _packetLength); _packetByteCount = 0; _mouseResetCount = 0; } else if (_packetByteCount == 2 && _packetBuffer[0] == 0xAA) { // // "0xAA 0x00" 2-byte packet is sent following a mouse hardware reset. // This can happen if the user removed and then inserted the same or a // different mouse to the mouse port. Reset the mouse and hope for the // best. KVM switches should not trigger this when switching stations. // scheduleMouseReset(); } }