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); }
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); }
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; }
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; }
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; }
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; }
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; }