/*
 * Send commands to EC just before last close
 */
static NvError
NvEcPrivDeinitHook( NvEcHandle hEc )
{
#if ENABLE_POWER_MODES
    NvEcRequest req;
    NvEcResponse resp;
    NvError e;

    // disable global event reporting

    DISP_MESSAGE(("NvEcPrivDeinitHook: Disabling Event Reporting\n"));

    req.PacketType = NvEcPacketType_Request;
    req.RequestType = NvEcRequestResponseType_Sleep;
    req.RequestSubtype = ((NvEcRequestResponseSubtype) 
                          NvEcSleepSubtype_GlobalConfigureEventReporting);
    req.NumPayloadBytes = 1;
    req.Payload[0] = NVEC_SLEEP_GLOBAL_REPORT_ENABLE_0_ACTION_DISABLE;

    NV_CHECK_ERROR( NvEcSendRequest(hEc, &req, &resp, sizeof(req), sizeof(resp)) );
    
    if ( resp.Status != NvEcStatus_Success )
        return NvError_InvalidState;
#endif // ENABLE_POWER_MODES

    DISP_MESSAGE(("NvEcPrivDeinitHook: Exit success\n"));

    return NvSuccess;
}
Пример #2
0
static void nvec_brightness_set(struct led_classdev *led_cdev,
	enum led_brightness value)
{
	struct nvec_led_data *led_dat =
		container_of(led_cdev, struct nvec_led_data, cdev);

#if 0
    led_cdev->brightness = value;
    led_cdev->blink_mode = BLINK_MODE_OFF;

    NvError NvStatus = NvError_Force32;
    NvEcRequest  EcRequest = {0};
    NvEcResponse EcResponse = {0};
    
    //printk("led======================>nvec_brightness_set value=%d\n", value);

    if ( ghEc )
    {
            EcRequest.PacketType = NvEcPacketType_Request;
            EcRequest.RequestType = NvEcRequestResponseType_Led;
            EcRequest.RequestSubtype = NvEcLedSubtype_Mode_OnOff;

            EcRequest.NumPayloadBytes = 1;
            EcRequest.Payload[0] = value;

                
            NvStatus = NvEcSendRequest( ghEc, &EcRequest, &EcResponse,
                     sizeof(EcRequest), sizeof(EcResponse));
            if (NvStatus != NvSuccess)
            {
                printk("led======================>NvEcSendRequest eror\n");
            }

            if ( EcResponse.Status != NvEcStatus_Success)
            {
                printk("led======================>EcResponse eror\n");
                NvStatus = NvError_Force32;
            }
    }
    else    
    {
        printk("led======================>NVEC handle error\n");
    }

    if (NvStatus == NvSuccess)
    {
        led_dat->brightness = value;
        led_dat->blink_mode = BLINK_MODE_OFF;
    }
#endif

}
/**
 *  Power suspend for mouse.
 *
 */
NvBool NvOdmMousePowerSuspend(NvOdmMouseDeviceHandle hDevice)
{
#if ECI_MOUSE_DISABLE_SUPPORTED
    NvError e;
    NvEcRequest *pRequest = hDevice->pRequest;
    NvEcResponse *pResponse = hDevice->pResponse;
    NvU32 Index = 0;

    if (!hDevice || !pRequest || !pResponse)
        return NV_FALSE;

    NV_ASSERT(hDevice->hEc);
    NV_ASSERT(hDevice->pRequest);
    NV_ASSERT(hDevice->pResponse);

    // cancel auto-receive (disables event reporting)

    NVODM_PRINTF(("NvOdmMousePowerSuspend: Cancel Auto Receive\n"));

    do
    {
        // fill up request structure
        pRequest->PacketType = NvEcPacketType_Request;
        pRequest->RequestType = NvEcRequestResponseType_AuxDevice;
        pRequest->RequestSubtype = 
            ((NvEcRequestResponseSubtype) 
             (NV_DRF_NUM(NVEC,SUBTYPE,AUX_PORT_ID,hDevice->ValidMousePorts[Index]))) |
            ((NvEcRequestResponseSubtype) 
             NvEcAuxDeviceSubtype_CancelAutoReceive);
        pRequest->NumPayloadBytes = 0;

        // Request to EC
        e = NvEcSendRequest(hDevice->hEc, pRequest, pResponse, sizeof(*pRequest),
                        sizeof(*pResponse));
        
        if (NvSuccess != e)
        {
            NVODMMOUSE_PRINTF(("NvOdmMousePowerSuspend: NvEcSendRequest failed !!"));
            return NV_FALSE;
        }

        if (NvEcStatus_Success != pResponse->Status)
        {
            NVODMMOUSE_PRINTF(("NvOdmMousePowerSuspend: EC response failed !!"));
            return NV_FALSE;
        }
     } while(hDevice->ValidMousePorts[++Index] != INVALID_MOUSE_PORT_ID);
#endif
    NVODM_PRINTF(("NvOdmMousePowerSuspend: Exit success\n"));

    return NV_TRUE;
}
NvBool
NvOdmMouseSendRequest(
    NvOdmMouseDeviceHandle hDevice, 
    NvU32 cmd, 
    NvU32 ExpectedResponseSize,
    NvU32 *NumPayLoad, 
    NvU8 *PayLoadBuf)
{
    NvError e;
    NvEcRequest *pRequest = hDevice->pRequest;
    NvEcResponse *pResponse = hDevice->pResponse;
    NvU32 Index = 0;

    do
    {
        // fill up request structure
        pRequest->PacketType = NvEcPacketType_Request;
        pRequest->RequestType = NvEcRequestResponseType_AuxDevice;
        pRequest->RequestSubtype = 
            ((NvEcRequestResponseSubtype) 
             (NV_DRF_NUM(NVEC,SUBTYPE,AUX_PORT_ID,hDevice->ValidMousePorts[Index]))) |
            ((NvEcRequestResponseSubtype) 
             NvEcAuxDeviceSubtype_SendCommand);
        pRequest->NumPayloadBytes = 2;
        pRequest->Payload[0] = cmd; // set the command
        pRequest->Payload[1] = ExpectedResponseSize;

        // Request to EC
        e = NvEcSendRequest(hDevice->hEc, pRequest, pResponse, sizeof(*pRequest),
                        sizeof(*pResponse));
        
        if (NvSuccess != e)
        {
            NVODMMOUSE_PRINTF(("NvEcSendRequest failed !!"));
            return NV_FALSE;
        }

        if (NvEcStatus_Success != pResponse->Status)
        {
            NVODMMOUSE_PRINTF(("EC response failed !!"));
            return NV_FALSE;
        }

        // store/process the Mouse response and return to the client driver
        *NumPayLoad = pResponse->NumPayloadBytes;
        NvOdmOsMemcpy(PayLoadBuf, &pResponse->Payload, *NumPayLoad);
    } while (hDevice->ValidMousePorts[++Index] != INVALID_MOUSE_PORT_ID);

    return NV_TRUE;
}
/*
 * Thread to send no-op commands to EC
 */
static void
NvEcPrivPingThread(void *args)
{
	NvError NvStatus = NvError_Success;
	NvEcRequest req;
	NvEcResponse resp;
	NvEcPrivState *ec = (NvEcPrivState *)args;
//Nvidia_patch_ for_ deviceLockup_and_audio_lost_issue[START]
	//set_freezable_with_signal();
	  set_freezable();
//Nvidia_patch_ for_ deviceLockup_and_audio_lost_issue[END]


	for (;;) {
	NvOsSemaphoreWait(ec->hPingSema);
	if (ec->exitPingThread)
		break;

	// send no-op commands
	DISP_MESSAGE(("NvEcPrivPingThread: Sending no-op command\n"));
	req.PacketType = NvEcPacketType_Request;
	req.RequestType = NvEcRequestResponseType_Control;
	req.RequestSubtype = (NvEcRequestResponseSubtype)
		NvEcControlSubtype_NoOperation;
	req.NumPayloadBytes = 0;

	NvStatus = NvEcSendRequest(
			ec->hEc,
			&req,
			&resp,
			sizeof(req),
			sizeof(resp));
	if (NvStatus != NvError_Success)
	DISP_MESSAGE(("NvEcPrivPingThread: no-op command send fail\n"));

	if (resp.Status != NvEcStatus_Success)
	DISP_MESSAGE(("NvEcPrivPingThread: no-op command fail\n"));

	DISP_MESSAGE(("NvEcPrivPingThread: no-op command sent\n"));
	ec->IsEcActive = NV_FALSE;
	}
}
/*
 * Send commands to EC just before suspend
 */
static NvError
NvEcPrivPowerSuspendHook(
    NvEcHandle hEc,
    NvEcPowerState PowerState)
{
#if ENABLE_POWER_MODES
    NvEcRequest req;
    NvEcResponse resp;
    NvError e;
    NvEcRequestResponseSubtype Subtype;
    
    DISP_MESSAGE(("NvEcPrivPowerSuspendHook: PowerState = %d\n", (NvU32)PowerState));

    // determine operation type
    switch (PowerState)
    {
        case NvEcPowerState_PowerDown:
            Subtype = ((NvEcRequestResponseSubtype) 
                          NvEcSleepSubtype_ApPowerDown);
            break;
        case NvEcPowerState_Suspend:
            Subtype = ((NvEcRequestResponseSubtype) 
                          NvEcSleepSubtype_ApSuspend);
            break;
        case NvEcPowerState_Restart:
            Subtype = ((NvEcRequestResponseSubtype) 
                          NvEcSleepSubtype_ApRestart);
            break;
        default:
            NV_ASSERT(!"NvEcPrivPowerSuspendHook: unknown power state\n");
            NV_CHECK_ERROR(NvError_BadValue);
            break;
    }
    
    // disable global event reporting

    DISP_MESSAGE(("NvEcPrivPowerSuspendHook: Disable Event Reporting\n"));

    req.PacketType = NvEcPacketType_Request;
    req.RequestType = NvEcRequestResponseType_Sleep;
    req.RequestSubtype = ((NvEcRequestResponseSubtype) 
                          NvEcSleepSubtype_GlobalConfigureEventReporting);
    req.NumPayloadBytes = 1;
    req.Payload[0] = NVEC_SLEEP_GLOBAL_REPORT_ENABLE_0_ACTION_DISABLE;

    NV_CHECK_ERROR( NvEcSendRequest(hEc, &req, &resp, sizeof(req), sizeof(resp)) );
    
    if ( resp.Status != NvEcStatus_Success )
        return NvError_InvalidState;
    
    // instruct EC to go to sleep

    DISP_MESSAGE(("NvEcPrivPowerSuspendHook: Go to sleep\n"));

    req.PacketType = NvEcPacketType_Request;
    req.RequestType = NvEcRequestResponseType_Sleep;
    req.RequestSubtype = Subtype;
    req.NumPayloadBytes = 0;

    NV_CHECK_ERROR( NvEcSendRequest(hEc, &req, &resp, sizeof(req), sizeof(resp)) );
    
    if ( resp.Status != NvEcStatus_Success )
        return NvError_InvalidState;
#endif // ENABLE_POWER_MODES
    
    DISP_MESSAGE(("NvEcPrivPowerSuspendHook: Exit success\n"));

    return NvSuccess;

}
NvBool NvOdmKeyboardInit(void)
{
    NvError NvStatus = NvError_Success;
    NvEcRequest Request = {0};
    NvEcResponse Response = {0};

    /* get nvec handle */
    NvStatus = NvEcOpen(&s_NvEcHandle, 0 /* instance */);
    if (NvStatus != NvError_Success)
    {
        goto fail;
    }

    /* reset the EC to start the keyboard scanning */
    Request.PacketType = NvEcPacketType_Request;
    Request.RequestType = NvEcRequestResponseType_Keyboard;
    Request.RequestSubtype = (NvEcRequestResponseSubtype) NvEcKeyboardSubtype_Enable;
    Request.NumPayloadBytes = 0;

    NvStatus = NvEcSendRequest(s_NvEcHandle, &Request, &Response, sizeof(Request), sizeof(Response));
    if (NvStatus != NvError_Success)
    {
        goto cleanup;
    }

    /* check if command passed */
    if (Response.Status != NvEcStatus_Success)
    {
        goto cleanup;
    }

#if WAKE_FROM_KEYBOARD
	hOdm = NvOdmOsAlloc(sizeof(NvOdmKbdContext));
	if (!hOdm) {
		goto cleanup;
	}

	/* Check the supported GPIOs */
	hOdm->GpioPinInfo = NvOdmQueryGpioPinMap(NvOdmGpioPinGroup_EmbeddedController,
					0, &hOdm->PinCount);

	NvRmGpioAcquirePinHandle(s_hGpioGlobal,
		hOdm->GpioPinInfo->Port,
		hOdm->GpioPinInfo->Pin,
		&hOdm->hPin);
	if (!hOdm->hPin) {
		goto cleanup;
	}

	/* register to receive GPIO events */
	NvStatus = NvRmGpioInterruptRegister(s_hGpioGlobal,
		s_hRmGlobal,
		hOdm->hPin,
		(NvOsInterruptHandler)GpioInterruptHandler,
		NvRmGpioPinMode_InputData,
		hOdm,
		&hOdm->GpioIntrHandle,
		DEBOUNCE_TIME_MS);
	if (NvStatus != NvError_Success) {
		goto cleanup;
	}

	NvStatus = NvRmGpioInterruptEnable(hOdm->GpioIntrHandle);
	if (NvStatus != NvError_Success) {
		goto cleanup;
	}

	/* enable keyboard as wake up source */
	Request.PacketType = NvEcPacketType_Request;
	Request.RequestType = NvEcRequestResponseType_Keyboard;
	Request.RequestSubtype = (NvEcRequestResponseSubtype)
	NvEcKeyboardSubtype_ConfigureWake;
	Request.NumPayloadBytes = 2;
	Request.Payload[0] = NVEC_KEYBOARD_WAKE_ENABLE_0_ACTION_ENABLE;
	Request.Payload[1] = NVEC_KEYBOARD_EVENT_TYPE_0_ANY_KEY_PRESS_ENABLE;

	NvStatus = NvEcSendRequest(s_NvEcHandle,
		&Request,
		&Response,
		sizeof(Request),
		sizeof(Response));
	if (NvStatus != NvError_Success) {
		goto cleanup;
        }

	if (Response.Status != NvEcStatus_Success) {
		goto cleanup;
	}

        /* enable key reporting on wake up */
	Request.PacketType = NvEcPacketType_Request;
	Request.RequestType = NvEcRequestResponseType_Keyboard;
	Request.RequestSubtype = (NvEcRequestResponseSubtype)
	NvEcKeyboardSubtype_ConfigureWakeKeyReport;
	Request.NumPayloadBytes = 1;
	Request.Payload[0] = NVEC_KEYBOARD_REPORT_WAKE_KEY_0_ACTION_ENABLE;

	NvStatus = NvEcSendRequest(s_NvEcHandle,
		&Request,
		&Response,
		sizeof(Request),
		sizeof(Response));
	if (NvStatus != NvError_Success) {
		goto cleanup;
        }

	if (Response.Status != NvEcStatus_Success) {
		goto cleanup;
	}
#endif

    /* create semaphore which can be used to send scan codes to the clients */
    s_hKbcKeyScanRecvSema = NvOdmOsSemaphoreCreate(0);
    if (!s_hKbcKeyScanRecvSema)
    {
        goto cleanup;
    }

    /* register for keyboard events */
    NvStatus = NvEcRegisterForEvents(
                    s_NvEcHandle,       // nvec handle
                    &s_hEcEventRegistration,
                    (NvOsSemaphoreHandle)s_hKbcKeyScanRecvSema,
                    sizeof(EventTypes)/sizeof(NvEcEventType),
                    EventTypes, // receive keyboard scan codes
                    1,          // currently buffer only 1 packet from ECI at a time
                    sizeof(NvEcEvent));
    if (NvStatus != NvError_Success)
    {
        goto cleanup;
    }

    /* success */
    return NV_TRUE;

cleanup:
#if WAKE_FROM_KEYBOARD
	NvRmGpioInterruptUnregister(s_hGpioGlobal, s_hRmGlobal, hOdm->GpioIntrHandle);
	hOdm->GpioIntrHandle = NULL;
	NvRmGpioReleasePinHandles(s_hGpioGlobal, &hOdm->hPin, hOdm->PinCount);
	NvOdmOsFree(hOdm);
	hOdm = NULL;
#endif
    (void)NvEcUnregisterForEvents(s_hEcEventRegistration);
    s_hEcEventRegistration = NULL;

    NvOdmOsSemaphoreDestroy(s_hKbcKeyScanRecvSema);
    s_hKbcKeyScanRecvSema = NULL;

    NvEcClose(s_NvEcHandle);
fail:
    s_NvEcHandle = NULL;

    return NV_FALSE;
}
Пример #8
0
//for MTP
static void nvec_test_mode_set(struct led_classdev *led_cdev, enum led_test_mode on_off)
{
	struct nvec_led_data *led_dat =
		container_of(led_cdev, struct nvec_led_data, cdev);
	int level = 0;
    NvError NvStatus = NvError_Force32;
    NvEcRequest  EcRequest = {0};
    NvEcResponse EcResponse = {0};

    
    //printk("led======================>nvec_blink_mode_set value=%d\n", value);

    led_cdev->brightness = LED_OFF;
    led_cdev->blink_mode = BLINK_MODE_OFF;

    
    if ( on_off == TEST_MODE_ON )
		level = TEST_MODE_ON;
	else if( on_off == TEST_MODE_OFF )
		level = TEST_MODE_OFF;
    else
        return;


    if ( ghEc )
    {
            EcRequest.PacketType = NvEcPacketType_Request;
            EcRequest.RequestType = NvEcRequestResponseType_Led;
            EcRequest.RequestSubtype = NvEcLedSubtype_Mode_Test;

            EcRequest.NumPayloadBytes = 1;
			EcRequest.Payload[0] = level & 0xff;
            
                
            NvStatus = NvEcSendRequest( ghEc, &EcRequest, &EcResponse,
                     sizeof(EcRequest), sizeof(EcResponse));
            if (NvStatus != NvSuccess)
            {
                printk("led nvec_test_mode_set======================>NvEcSendRequest eror\n");
            }

            if ( EcResponse.Status != NvEcStatus_Success)
            {
                printk("led nvec_test_mode_set======================>EcResponse eror\n");
                NvStatus = NvError_Force32;
            }
    }
    else    
    {
        printk("led nvec_test_mode_set======================>NVEC handle error\n");
    }


    if (NvStatus == NvSuccess)
    {
        led_dat->testMode_OnOff = level;
        led_dat->brightness = LED_OFF;
        led_dat->blink_mode = BLINK_MODE_OFF;
    }
	
 
}
Пример #9
0
////////////blink
static void nvec_blink_mode_set(struct led_classdev *led_cdev,
	enum led_blink_mode value)
{
	struct nvec_led_data *led_dat =
		container_of(led_cdev, struct nvec_led_data, cdev);
	int level;

    led_cdev->blink_mode = value;
    led_cdev->brightness = LED_OFF;

    NvError NvStatus = NvError_Force32;
    NvEcRequest  EcRequest = {0};
    NvEcResponse EcResponse = {0};

    
    //printk("led======================>nvec_blink_mode_set value=%d\n", value);
    
    if ( value == BLINK_MODE_ON1_OFF1 )
		level = BLINK_MODE_ON1_OFF1;
	else if( value == BLINK_MODE_ON1_OFF2 )
		level = BLINK_MODE_ON1_OFF2;
    else  if( value == BLINK_MODE_OFF )
        level = BLINK_MODE_OFF;
    else
        return;

    if ( ghEc )
    {
            EcRequest.PacketType = NvEcPacketType_Request;
            EcRequest.RequestType = NvEcRequestResponseType_Led;
            EcRequest.RequestSubtype = NvEcLedSubtype_Mode_Blink;

            EcRequest.NumPayloadBytes = 2;

            if( level == BLINK_MODE_ON1_OFF1 )
            {
                EcRequest.Payload[0] = 0x01;
                EcRequest.Payload[1] = 0x01;
            }
            else if( level == BLINK_MODE_ON1_OFF2 )
            {
                EcRequest.Payload[0] = 0x01;
                EcRequest.Payload[1] = 0x02;
            }
            else
            {
                EcRequest.Payload[0] = 0x00;
                EcRequest.Payload[1] = 0x00;
            }

                
            NvStatus = NvEcSendRequest( ghEc, &EcRequest, &EcResponse,
                     sizeof(EcRequest), sizeof(EcResponse));
            if (NvStatus != NvSuccess)
            {
                printk("led nvec_blink_mode_set======================>NvEcSendRequest eror\n");
            }

            if ( EcResponse.Status != NvEcStatus_Success)
            {
                printk("led nvec_blink_mode_set======================>EcResponse eror\n");
                NvStatus = NvError_Force32;
            }
    }
    else    
    {
        printk("led nvec_blink_mode_set======================>NVEC handle error\n");
    }


    if (NvStatus == NvSuccess)
    {
        led_dat->blink_mode = level;
        led_dat->brightness = LED_OFF;
    }
 
}
NvBool
NvOdmMouseDeviceOpen(
    NvOdmMouseDeviceHandle *hDevice)
{
    NvOdmMouseDevice *hMouseDev = NULL;
    NvBool ret = NV_FALSE;
    NvU32 InstanceId = 0, count = 0, MousePort = 0, i = 0;
#if WAKE_FROM_MOUSE
    NvError err = NvError_Success;
    NvEcRequest Request = {0};
    NvEcResponse Response = {0};
#endif

    // Allocate memory for request type structure
    hMouseDev = (NvOdmMouseDevice *)NvOdmOsAlloc(sizeof(NvOdmMouseDevice));
    if (!hMouseDev)
    {
        ret = NV_FALSE;
        NVODMMOUSE_PRINTF(("NvOdmOsAlloc failed to allocate hMouseDev!!"));
        goto fail_safe;
    }
    NvOdmOsMemset(hMouseDev, 0, sizeof(NvOdmMouseDevice));

    // open channel to the EC
    if ((NvEcOpen(&hMouseDev->hEc, InstanceId)) != NvSuccess)
    {
        ret = NV_FALSE;
        NVODMMOUSE_PRINTF(("NvEcOpen failed !!"));
        goto fail_safe;
    }

    hMouseDev->pRequest = NULL;
    hMouseDev->pResponse = NULL;
    hMouseDev->pEvent = NULL;
    hMouseDev->CompressionEnabled = NV_FALSE;
    hMouseDev->CompressionState = 0x0;

    do
    {
        hMouseDev->ValidMousePorts[count] = INVALID_MOUSE_PORT_ID;
        count++;
    } while (count <= MAX_NUM_MOUSE_PORTS);

    // Allocate memory for request type structure
    hMouseDev->pRequest = NvOdmOsAlloc(sizeof(NvEcRequest));
    if (!hMouseDev->pRequest)
    {
        ret = NV_FALSE;
        NVODMMOUSE_PRINTF(("NvOdmOsAlloc failed to allocate pRequest!!"));
        goto fail_safe;
    }
    NvOdmOsMemset(hMouseDev->pRequest, 0, sizeof(NvEcRequest));

    // Allocate memory for response type structure
    hMouseDev->pResponse = NvOdmOsAlloc(sizeof(NvEcResponse));
    if (!hMouseDev->pResponse)
    {
        ret = NV_FALSE;
        NVODMMOUSE_PRINTF(("NvOdmOsAlloc failed to allocate pResponse!!"));
        goto fail_safe;
    }
    NvOdmOsMemset(hMouseDev->pResponse, 0, sizeof(NvEcResponse));

    // Allocate memory for event type structure
    hMouseDev->pEvent = NvOdmOsAlloc(sizeof(NvEcEvent));
    if (!hMouseDev->pEvent)
    {
        ret = NV_FALSE;
        NVODMMOUSE_PRINTF(("NvOdmOsAlloc failed to allocate pEvent!!"));
        goto fail_safe;
    }
    NvOdmOsMemset(hMouseDev->pEvent, 0, sizeof(NvEcEvent));

    MousePort = MOUSE_PS2_PORT_ID_0;
    count = CMD_MAX_RETRIES + 1; i = 0;
    while (count--)
    {
        // fill up request structure
        Request.PacketType = NvEcPacketType_Request;
        Request.RequestType = NvEcRequestResponseType_AuxDevice;
        Request.RequestSubtype = 
            ((NvEcRequestResponseSubtype) 
             (NV_DRF_NUM(NVEC,SUBTYPE,AUX_PORT_ID,MousePort))) |
            ((NvEcRequestResponseSubtype) 
             NvEcAuxDeviceSubtype_SendCommand);
        Request.NumPayloadBytes = 2;
        Request.Payload[0] = 0xFF; // set the reset command
        Request.Payload[1] = 3;

        // Request to EC
        err = NvEcSendRequest(hMouseDev->hEc, &Request, &Response, sizeof(Request),
                        sizeof(Response));

        if (NvSuccess != err)
        {
            NVODMMOUSE_PRINTF(("NvEcSendRequest failed !!"));
            break;
        }

        // mouse not found
        if (NvEcStatus_Success != Response.Status)
        {
            NVODMMOUSE_PRINTF(("EC response failed !!"));
            if (MousePort != MOUSE_PS2_PORT_ID_1)
            {
                count = CMD_MAX_RETRIES + 1;
                MousePort = MOUSE_PS2_PORT_ID_1;
                continue;
            }
            break;
        }

        if (Response.NumPayloadBytes != 3)
            continue;

        // success
        if (Response.Payload[0] == 0xFA)
        {
            hMouseDev->ValidMousePorts[i] = MousePort;
            if (MousePort != MOUSE_PS2_PORT_ID_1)
            {
                count = CMD_MAX_RETRIES + 1;
                MousePort = MOUSE_PS2_PORT_ID_1;
                i++;
                continue;
            }
            break;
        }
    }

#if WAKE_FROM_MOUSE
    i = 0;
    do
    {
        /* enable mouse as wake up source */
        Request.PacketType = NvEcPacketType_Request;
        Request.RequestType = NvEcRequestResponseType_AuxDevice;
        Request.RequestSubtype = ((NvEcRequestResponseSubtype) 
             (NV_DRF_NUM(NVEC,SUBTYPE,AUX_PORT_ID,hMouseDev->ValidMousePorts[i]))) |
             (NvEcRequestResponseSubtype)
             NvEcAuxDeviceSubtype_ConfigureWake;
        Request.NumPayloadBytes = 2;
        Request.Payload[0] = NVEC_AUX_DEVICE_WAKE_ENABLE_0_ACTION_ENABLE;
        Request.Payload[1] = NVEC_AUX_DEVICE_EVENT_TYPE_0_ANY_EVENT_ENABLE;

        err = NvEcSendRequest(
                    hMouseDev->hEc,
                    &Request,
                    &Response,
                    sizeof(Request),
                    sizeof(Response));
        if (err != NvError_Success)
        {
            ret = NV_FALSE;
            goto fail_safe;
        }

        if (Response.Status != NvEcStatus_Success)
        {
            ret = NV_FALSE;
            goto fail_safe;
        }
    } while (hMouseDev->ValidMousePorts[++i] != INVALID_MOUSE_PORT_ID);
#endif

    *hDevice = (NvOdmMouseDeviceHandle)hMouseDev;
    ret = NV_TRUE;
    return ret;

fail_safe:
    NvOdmMouseDeviceClose((NvOdmMouseDeviceHandle)hMouseDev);
    hMouseDev = NULL;
    return ret;
}
NvBool
NvOdmMouseStartStreaming(
    NvOdmMouseDeviceHandle hDevice,
    NvU32 NumBytesPerSample)
{
    NvError e;
    NvEcRequest *pRequest = hDevice->pRequest;
    NvEcResponse *pResponse = hDevice->pResponse;
    NvU32 Index = 0;

    if (!hDevice)
        return NV_FALSE;

    hDevice->NumBytesPerSample = NumBytesPerSample;

#if ENABLE_COMPRESSION
    /**
     * automatically enable compression if sample size is 3 bytes
     *
     * compression is supported only for 3-byte data packets (which is the
     * common case for ps/2 mice and mouses
     *
     * compression reduces communication bandwidth by eliminating the first data
     * byte of the packet when it hasn't changed relative to the previous
     * packet.  Whenever a full-sized packet is sent, the first payload byte is
     * latched so that it can be inserted into an n y following compressed packets.
     */

    if (NumBytesPerSample == 3)
    {
        do
        {
            // prepare Aux Device request for Set Compression
            pRequest->PacketType = NvEcPacketType_Request;
            pRequest->RequestType = NvEcRequestResponseType_AuxDevice;
            pRequest->RequestSubtype = 
                ((NvEcRequestResponseSubtype) 
                 (NV_DRF_NUM(NVEC,SUBTYPE,AUX_PORT_ID,hDevice->ValidMousePorts[Index]))) |
                ((NvEcRequestResponseSubtype) 
                 NvEcAuxDeviceSubtype_SetCompression);
            pRequest->NumPayloadBytes = 1; 
            pRequest->Payload[0] = 1; // enable compression

            // send request to EC
            e = NvEcSendRequest(hDevice->hEc, pRequest, pResponse, sizeof(*pRequest),
                                sizeof(*pResponse));

            if (NvSuccess != e)
            {
                NVODMMOUSE_PRINTF(("NvEcSendRequest (compression) failed !!"));
                return NV_FALSE;
            }

            // check status reported by EC
            if (NvEcStatus_Success != pResponse->Status)
            {
                NVODMMOUSE_PRINTF(("EC response (compression) failed !!"));
                return NV_FALSE;
            }
        } while(hDevice->ValidMousePorts[++Index] != INVALID_MOUSE_PORT_ID);

        hDevice->CompressionEnabled = NV_TRUE;
        hDevice->CompressionState = 0x0;
    }
    else
    {
        // compression not supported due to packet size (!= 3 bytes)
        hDevice->CompressionEnabled = NV_FALSE;
    }
#else // ENABLE_COMPRESSION
    // disable compression
    hDevice->CompressionEnabled = NV_FALSE;
#endif // ENABLE_COMPRESSION

    // prepare Aux Device request for Auto-Receive N Bytes
    Index = 0;
    do
    {
        pRequest->PacketType = NvEcPacketType_Request;
        pRequest->RequestType = NvEcRequestResponseType_AuxDevice;
        pRequest->RequestSubtype = 
            ((NvEcRequestResponseSubtype) 
             (NV_DRF_NUM(NVEC,SUBTYPE,AUX_PORT_ID,hDevice->ValidMousePorts[Index]))) |
            ((NvEcRequestResponseSubtype) 
             NvEcAuxDeviceSubtype_AutoReceiveBytes);
        pRequest->NumPayloadBytes = 1; 
        pRequest->Payload[0] = NumBytesPerSample;

        // send request to EC
        e = NvEcSendRequest(hDevice->hEc, pRequest, pResponse, sizeof(*pRequest),
                        sizeof(*pResponse));

        if (NvSuccess != e)
        {
            NVODMMOUSE_PRINTF(("NvEcSendRequest (auto-receive) failed !!"));
            return NV_FALSE;
        }

        // check status reported by EC
        if (NvEcStatus_Success != pResponse->Status)
        {
            NVODMMOUSE_PRINTF(("EC response (auto-receive) failed !!"));
            return NV_FALSE;
        }
    } while(hDevice->ValidMousePorts[++Index] != INVALID_MOUSE_PORT_ID);

    return NV_TRUE;
}
Пример #12
0
NvBool
NvOdmMouseReset(NvOdmMouseDeviceHandle hDevice)
{
    NvError err = NvError_Success;
    NvEcRequest Request = {0};
    NvEcResponse Response = {0};
    NvU32 count = 0, MousePort = 0, i = 0;
    NvBool ret = NV_FALSE;
    NvOdmMouseDevice *hMouseDev = (NvOdmMouseDevice *)hDevice;

    MousePort = MOUSE_PS2_PORT_ID_0;
    count = CMD_MAX_RETRIES + 1;
    while ((ret==NV_FALSE) && (count--))
    {
        // fill up request structure
        Request.PacketType = NvEcPacketType_Request;
        Request.RequestType = NvEcRequestResponseType_AuxDevice;
        Request.RequestSubtype = 
            ((NvEcRequestResponseSubtype) 
             (NV_DRF_NUM(NVEC,SUBTYPE,AUX_PORT_ID, MousePort))) |
             ((NvEcRequestResponseSubtype)NvEcAuxDeviceSubtype_SendCommand);
        Request.NumPayloadBytes = 2;
        Request.Payload[0] = 0xFF; // set the reset command
        Request.Payload[1] = 3;

        // Request to EC
        err = NvEcSendRequest(hMouseDev->hEc, &Request, 
	              &Response, sizeof(Request), sizeof(Response));
        if (NvSuccess != err)
        {
            //NVODMMOUSE_PRINTF(("NvEcSendRequest failed !!"));
            NvOsDebugPrintf("NvEcSendRequest failed !!\n");
            NvOsWaitUS(100000);
			continue;
        }

        // mouse not found
        if (NvEcStatus_Success != Response.Status)
        {
            //NVODMMOUSE_PRINTF(("EC response failed !!"));
            NvOsDebugPrintf("EC response failed !!\n");
            //if (MousePort != MOUSE_PS2_PORT_ID_1)
            //{
            //    count = CMD_MAX_RETRIES + 1;
            //    MousePort = MOUSE_PS2_PORT_ID_1;
            //}
            NvOsWaitUS(100000);
            continue;
        }

        if (Response.NumPayloadBytes != 3)
            continue;

        // success
        if (Response.Payload[0] == 0xFA)
        {
			ret = NV_TRUE; // at lease one Mouse found!
            hMouseDev->ValidMousePorts[i] = MousePort;
            //if (MousePort != MOUSE_PS2_PORT_ID_1)
            //{
            //    count = CMD_MAX_RETRIES + 1;
            //    MousePort = MOUSE_PS2_PORT_ID_1;
            //    i++;
            //    continue;
            //}
        }
	}
    
	return ret;
}