Esempio n. 1
0
EN_RESULT CurrentMonitor_WriteCalibration(uint16_t value)
{
	uint16_t tempValue = ChangeByteOrder(value);
    return I2cWrite(CURRENT_MONITOR_DEVICE_ADDRESS,
                    CURRENT_MONITOR_REGISTER_ADDRESS_CALIBRATION,
                    EI2cSubAddressMode_OneByte,
                    (uint8_t*)&tempValue,
                    2);
}
Esempio n. 2
0
EN_RESULT CurrentMonitor_ReadConfig(uint16_t* pConfig)
{
	uint16_t tempValue;
    return I2cRead(CURRENT_MONITOR_DEVICE_ADDRESS,
                   CURRENT_MONITOR_REGISTER_ADDRESS_CONFIG,
                   EI2cSubAddressMode_OneByte,
                   2,
                   (uint8_t*)&tempValue);
    *pConfig = ChangeByteOrder(tempValue);
}
Esempio n. 3
0
EN_RESULT CurrentMonitor_ReadCalibration(uint16_t* pValue)
{
	uint16_t tempValue;
	EN_RETURN_IF_FAILED(I2cRead(CURRENT_MONITOR_DEVICE_ADDRESS,
                   CURRENT_MONITOR_REGISTER_ADDRESS_CALIBRATION,
                   EI2cSubAddressMode_OneByte,
                   2,
                   (uint8_t*)&tempValue));
	*pValue = ChangeByteOrder(tempValue);
    return EN_SUCCESS;
}
Esempio n. 4
0
EN_RESULT CurrentMonitor_ReadVSense(uint16_t* pVSense)
{
	uint16_t tempValue;
	EN_RETURN_IF_FAILED(I2cRead(CURRENT_MONITOR_DEVICE_ADDRESS,
                   CURRENT_MONITOR_REGISTER_ADDRESS_VSENS,
                   EI2cSubAddressMode_OneByte,
                   2,
                   (uint8_t*)&tempValue));

	// uV. One ADC bit is 10 micro volt
    *pVSense = ChangeByteOrder(tempValue)*10; // in micro volt
    return EN_SUCCESS;
}
Esempio n. 5
0
EN_RESULT CurrentMonitor_ReadVBus(uint16_t* pValue)
{
    uint16_t tempValue;
    EN_RETURN_IF_FAILED(I2cRead(CURRENT_MONITOR_DEVICE_ADDRESS,
                                CURRENT_MONITOR_REGISTER_ADDRESS_VBUS,
                                EI2cSubAddressMode_OneByte,
                                2,
                                (uint8_t*)&tempValue));

    // mV. Calculate /2 to cut off the last bit
    *pValue = ChangeByteOrder(tempValue) / 2;

    return EN_SUCCESS;
}
Esempio n. 6
0
EN_RESULT CurrentMonitor_ReadPower(uint16_t* pValue)
{
    uint16_t tempValue;
    EN_RETURN_IF_FAILED(I2cRead(CURRENT_MONITOR_DEVICE_ADDRESS,
                                CURRENT_MONITOR_REGISTER_ADDRESS_POWER,
                                EI2cSubAddressMode_OneByte,
                                2,
                                (uint8_t*)&tempValue));

    // mW. Calculate *20 because the Power LSB is 20*Current LSB
    *pValue = ChangeByteOrder(tempValue) * 20;

    return EN_SUCCESS;
}
Esempio n. 7
0
NTSTATUS IdentifyDevice(PDEVICE_OBJECT pDevice, PDISK_ID_INFO pOutInfo)
{
	NTSTATUS ntStatus = STATUS_UNSUCCESSFUL;
    PSENDCMDINPARAMS pSCIP;
    PSENDCMDOUTPARAMS pSCOP;
    DWORD dwOutBytes;

	PIRP					Irp;
	KIRQL					currentIrql;
	IO_STATUS_BLOCK			ioStatus;
	KEVENT					event;

	RtlZeroMemory(pOutInfo, sizeof(DISK_ID_INFO));

    pSCIP = (PSENDCMDINPARAMS) ExAllocatePoolWithTag(NonPagedPool, sizeof(SENDCMDINPARAMS) - 1, '?bos');
    pSCOP = (PSENDCMDOUTPARAMS) ExAllocatePoolWithTag(NonPagedPool, sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1, '?bos');

	if (pSCIP && pSCOP)
	{
		KeInitializeEvent(&event, NotificationEvent, FALSE);

		RtlZeroMemory(pSCIP, sizeof(SENDCMDINPARAMS) - 1);
		RtlZeroMemory(pSCOP, sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1);
  
		pSCIP->irDriveRegs.bCommandReg = IDE_ATA_IDENTIFY;
  
		pSCIP->cBufferSize = 0;
		pSCOP->cBufferSize = sizeof(IDINFO);

		if(Irp = IoBuildDeviceIoControlRequest(DFP_RECEIVE_DRIVE_DATA/*IRP_MJ_DEVICE_CONTROL*/, pDevice, pSCIP, sizeof(SENDCMDINPARAMS) - 1, 
			pSCOP, sizeof(SENDCMDOUTPARAMS) + sizeof(IDINFO) - 1, FALSE, &event, &ioStatus)) 
		{
			ntStatus = IoCallDriver(pDevice, Irp);
			if(ntStatus == STATUS_PENDING)
			{
				KeWaitForSingleObject(&event, Suspended, KernelMode, FALSE, NULL);
				ntStatus = ioStatus.Status;
			}

			if (NT_SUCCESS(ntStatus) && !ioStatus.Information)
			{
				ntStatus = STATUS_UNSUCCESSFUL;
				DbgBreakPoint();
			}
			
			if (NT_SUCCESS(ntStatus))
			{
				PIDINFO pinfo = (PIDINFO) pSCOP->bBuffer;

				ChangeByteOrder(pinfo->sModelNumber, sizeof(pinfo->sModelNumber));
				ChangeByteOrder(pinfo->sFirmwareRev, sizeof(pinfo->sFirmwareRev));
				ChangeByteOrder(pinfo->sSerialNumber, sizeof(pinfo->sSerialNumber));

				memcpy(pOutInfo->m_ModelNumber, pinfo->sModelNumber, sizeof(pinfo->sModelNumber));
				memcpy(pOutInfo->m_FirmwareRev, pinfo->sFirmwareRev, sizeof(pinfo->sFirmwareRev));
				memcpy(pOutInfo->m_SerialNumber, pinfo->sSerialNumber, sizeof(pinfo->sSerialNumber));
			}
		}
	}
  
	if (pSCOP)
		ExFreePool(pSCOP);
	if (pSCIP)
		ExFreePool(pSCIP);
  
    return ntStatus;
}