windows-nt/Source/XPSP1/NT/drivers/wdm/input/tabletpc/cpl/smbdev.c
2020-09-26 16:20:57 +08:00

314 lines
7.8 KiB
C

/*++
Copyright (c) 2000,2001 Microsoft Corporation
Module Name:
smbdev.c
Abstract: This module contains SMBus Device related functions.
Environment:
User mode
Author:
Michael Tsang (MikeTs) 23-Jan-2001
Revision History:
--*/
#include "pch.h"
#ifdef SYSACC
/*++
@doc INTERNAL
@func BOOL | GetSMBDevInfo | Call the SysAccess driver to get the
SMBus device info.
@parm IN UCHAR | bDevAddr | SMB device address.
@parm IN PSMBCMD_INFO | SmbCmd | Points to the SMB device command.
@parm OUT PBYTE | pbBuff | To hold the device info.
@rvalue SUCCESS | Returnes TRUE.
@rvalue FAILURE | Returnes FALSE.
--*/
BOOL
GetSMBDevInfo(
IN UCHAR bDevAddr,
IN PSMBCMD_INFO SmbCmd,
OUT PBYTE pbBuff
)
{
TRACEPROC("GetSMBDevInfo", 3)
BOOL rc;
SMB_REQUEST SmbReq;
DWORD dwcbReturned;
TRACEENTER(("(DevAddr=%x,SmbCmd=%p,Cmd=%s,pbBuff=%p)\n",
bDevAddr, SmbCmd, SmbCmd->pszLabel, pbBuff));
TRACEASSERT(ghSysAcc != INVALID_HANDLE_VALUE);
TRACEASSERT(SmbCmd->bProtocol <= SMB_MAXIMUM_PROTOCOL);
SmbReq.Status = SMB_UNKNOWN_FAILURE;
SmbReq.Address = bDevAddr;
SmbReq.Protocol = SmbCmd->bProtocol;
SmbReq.Command = SmbCmd->bCmd;
rc = DeviceIoControl(ghSysAcc,
IOCTL_SYSACC_SMBUS_REQUEST,
&SmbReq,
sizeof(SmbReq),
&SmbReq,
sizeof(SmbReq),
&dwcbReturned,
NULL);
if (rc && (SmbReq.Status == SMB_STATUS_OK))
{
if (SmbReq.Protocol == SMB_READ_BLOCK)
{
PBLOCK_DATA Block = (PBLOCK_DATA)pbBuff;
Block->bBlockLen = SmbReq.BlockLength;
memset(Block->BlockData, 0, sizeof(Block->BlockData));
memcpy(Block->BlockData, SmbReq.Data, SmbReq.BlockLength);
}
else
{
memcpy(pbBuff, SmbReq.Data, SmbCmd->iDataSize);
}
}
else
{
ErrorMsg(IDSERR_SYSACC_DEVIOCTL, GetLastError());
}
TRACEEXIT(("=%x (Data=%x)\n", rc, *((PWORD)pbBuff)));
return rc;
} //GetSMBDevInfo
/*++
@doc INTERNAL
@func BOOL | DisplaySMBDevInfo | Display SMBus device info.
@parm IN HWND | hwndEdit | Edit window handle.
@parm IN PSMBCMD_INFO | SmbCmd | Points to the SMB device command.
@parm IN PBYTE | pbBuff | SMB device data to display.
@rvalue SUCCESS | Returns TRUE if it handles it.
@rvalue FAILURE | Returns FALSE if it doesn't handle it.
--*/
BOOL
DisplaySMBDevInfo(
IN HWND hwndEdit,
IN PSMBCMD_INFO SmbCmd,
IN PBYTE pbBuff
)
{
TRACEPROC("DisplaySMBDevInfo", 3)
BOOL rc = TRUE;
WORD wData;
BYTE bData;
char *pszUnit = SmbCmd->pszUnit? SmbCmd->pszUnit: "";
TRACEENTER(("(hwndEdit=%x,SmbCmd=%p,Cmd=%s,pbBuff=%p)\n",
hwndEdit, SmbCmd, SmbCmd->pszLabel, pbBuff));
switch (SmbCmd->bType)
{
case TYPEF_BYTE_HEX:
bData = *pbBuff;
EditPrintf(hwndEdit,
" 0x%02x %s\r\n",
bData,
pszUnit);
break;
case TYPEF_BYTE_DEC:
bData = *pbBuff;
EditPrintf(hwndEdit,
"%6d %s\r\n",
bData,
pszUnit);
break;
case TYPEF_BYTE_INT:
bData = *pbBuff;
EditPrintf(hwndEdit,
"%6d %s\r\n",
(signed char)bData,
pszUnit);
break;
case TYPEF_WORD_HEX:
wData = *((PWORD)pbBuff);
EditPrintf(hwndEdit,
"0x%04x %s\r\n",
wData,
pszUnit);
break;
case TYPEF_WORD_DEC:
wData = *((PWORD)pbBuff);
EditPrintf(hwndEdit,
"%6d %s\r\n",
wData,
pszUnit);
break;
case TYPEF_WORD_INT:
wData = *((PWORD)pbBuff);
EditPrintf(hwndEdit,
"%6d %s\r\n",
(SHORT)wData,
pszUnit);
break;
case TYPEF_BYTE_BITS:
bData = *pbBuff;
EditPrintf(hwndEdit, " 0x%02x", bData);
DisplayDevBits(hwndEdit,
SmbCmd->dwData,
(PSZ *)SmbCmd->pvData,
(DWORD)bData);
EditPrintf(hwndEdit, "\r\n");
break;
case TYPEF_WORD_BITS:
wData = *((PWORD)pbBuff);
EditPrintf(hwndEdit, "0x%04x", wData);
DisplayDevBits(hwndEdit,
SmbCmd->dwData,
(PSZ *)SmbCmd->pvData,
(DWORD)wData);
EditPrintf(hwndEdit, "\r\n");
break;
case TYPEF_BLOCK_STRING:
EditPrintf(hwndEdit,
"\"%.*s\"\r\n",
((PBLOCK_DATA)pbBuff)->bBlockLen,
((PBLOCK_DATA)pbBuff)->BlockData);
break;
case TYPEF_BLOCK_BUFFER:
{
PBLOCK_DATA BlockData = (PBLOCK_DATA)pbBuff;
char szSpaces[32];
int i, iLen;
iLen = lstrlenA(SmbCmd->pszLabel);
for (i = 0; i < iLen; ++i)
{
szSpaces[i] = ' ';
}
szSpaces[i] = '\0';
for (i = 0;
(i < BlockData->bBlockLen) &&
(i < sizeof(BlockData->BlockData));
++i)
{
if ((i > 0) && ((i % 8) == 0))
{
EditPrintf(hwndEdit, "\r\n%s ", szSpaces);
}
EditPrintf(hwndEdit, " %02x", BlockData->BlockData[i]);
}
EditPrintf(hwndEdit, "\r\n");
break;
}
default:
rc = FALSE;
}
TRACEEXIT(("=%x\n", rc));
return rc;
} //DisplaySMBDevInfo
/*++
@doc INTERNAL
@func VOID | DisplayDevBits | Display device bits info.
@parm IN HWND | hwndEdit | Edit window handle.
@parm IN DWORD | dwBitMask | Bit mask of relevant data bits.
@parm IN PSZ * | apszBitNames | Points to array of bit names.
@parm IN DWORD | dwData | device data.
@rvalue None.
--*/
VOID
DisplayDevBits(
IN HWND hwndEdit,
IN DWORD dwBitMask,
IN PSZ *apszBitNames,
IN DWORD dwData
)
{
TRACEPROC("DisplayDevBits", 3)
ULONG dwBit;
int i;
TRACEENTER(("(hwndEdit=%x,BitMask=%x,apszBitNames=%p,Data=%x)\n",
hwndEdit, dwBitMask, apszBitNames, dwData));
for (dwBit = 0x80000000, i = 0; dwBit != 0; dwBit >>= 1)
{
if (dwBitMask & dwBit)
{
if (dwData & dwBit)
{
EditPrintf(hwndEdit, ",%s", apszBitNames[i]);
}
i++;
}
}
TRACEEXIT(("!\n"));
return;
} //DisplayDevBits
/*++
@doc INTERNAL
@func VOID | EditPrintf | Append text to edit control.
@parm IN HWND | hwndEdit | Edit window handle.
@parm IN PSZ | pszFormat | Points to format string.
@parm ... | Arguments
@rvalue None.
--*/
VOID
__cdecl
EditPrintf(
IN HWND hwndEdit,
IN PSZ pszFormat,
...
)
{
TRACEPROC("EditPrintf", 3)
va_list arglist;
char szText[256];
TRACEENTER(("(hwndEdit=%x,Format=%s)\n", hwndEdit, pszFormat));
va_start(arglist, pszFormat);
vsprintf(szText, pszFormat, arglist);
va_end(arglist);
SendMessage(hwndEdit, EM_SETSEL, -1, -1);
SendMessage(hwndEdit, EM_REPLACESEL, 0, (LPARAM)szText);
TRACEEXIT(("!\n"));
return;
} //EditPrintf
#endif //ifdef SYSACC