ApplePS2Mouse * ApplePS2Mouse::probe(IOService * provider, SInt32 * score) { DEBUG_LOG("%s::probe called\n", getName()); // // The driver has been instructed to verify the presence of the actual // hardware we represent. We are guaranteed by the controller that the // mouse clock is enabled and the mouse itself is disabled (thus it // won't send any asynchronous mouse data that may mess up the // responses expected by the commands we send it). // ApplePS2MouseDevice * device = (ApplePS2MouseDevice *)provider; PS2Request * request = device->allocateRequest(); bool success; if (!super::probe(provider, score)) return 0; // // Check to see if acknowledges are being received for commands to the mouse. // // (get information command) request->commands[0].command = kPS2C_WriteCommandPort; request->commands[0].inOrOut = kCP_TransmitToMouse; request->commands[1].command = kPS2C_WriteDataPort; request->commands[1].inOrOut = kDP_GetMouseInformation; request->commands[2].command = kPS2C_ReadDataPortAndCompare; request->commands[2].inOrOut = kSC_Acknowledge; request->commands[3].command = kPS2C_ReadDataPort; request->commands[3].inOrOut = 0; request->commands[4].command = kPS2C_ReadDataPort; request->commands[4].inOrOut = 0; request->commands[5].command = kPS2C_ReadDataPort; request->commands[5].inOrOut = 0; request->commandsCount = 6; device->submitRequestAndBlock(request); // (free the request) success = (request->commandsCount == 6); device->freeRequest(request); return (success) ? this : 0; }
ApplePS2SynapticsTouchPad * ApplePS2SynapticsTouchPad::probe( IOService * provider, SInt32 * score ) { // // The driver has been instructed to verify the presence of the actual // hardware we represent. We are guaranteed by the controller that the // mouse clock is enabled and the mouse itself is disabled (thus it // won't send any asynchronous mouse data that may mess up the // responses expected by the commands we send it). // ApplePS2MouseDevice * device = (ApplePS2MouseDevice *) provider; PS2Request * request = device->allocateRequest(); bool success = false; if (!super::probe(provider, score) || !request) return 0; // // Send an "Identify TouchPad" command and see if the device is // a Synaptics TouchPad based on its response. End the command // chain with a "Set Defaults" command to clear all state. // request->commands[0].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[0].inOrOut = kDP_SetDefaultsAndDisable; request->commands[1].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[1].inOrOut = kDP_SetMouseResolution; request->commands[2].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[2].inOrOut = 0; request->commands[3].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[3].inOrOut = kDP_SetMouseResolution; request->commands[4].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[4].inOrOut = 0; request->commands[5].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[5].inOrOut = kDP_SetMouseResolution; request->commands[6].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[6].inOrOut = 0; request->commands[7].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[7].inOrOut = kDP_SetMouseResolution; request->commands[8].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[8].inOrOut = 0; request->commands[9].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[9].inOrOut = kDP_GetMouseInformation; request->commands[10].command = kPS2C_ReadDataPort; request->commands[10].inOrOut = 0; request->commands[11].command = kPS2C_ReadDataPort; request->commands[11].inOrOut = 0; request->commands[12].command = kPS2C_ReadDataPort; request->commands[12].inOrOut = 0; request->commands[13].command = kPS2C_SendMouseCommandAndCompareAck; request->commands[13].inOrOut = kDP_SetDefaultsAndDisable; request->commandsCount = 14; device->submitRequestAndBlock(request); if ( request->commandsCount == 14 && request->commands[11].inOrOut == 0x47 ) { _touchPadVersion = (request->commands[12].inOrOut & 0x0f) << 8 | request->commands[10].inOrOut; // // Only support 4.x or later touchpads. // if ( _touchPadVersion >= 0x400 ) success = true; } device->freeRequest(request); return (success) ? this : 0; }