/* functions used commonly in each hardware monitor module */
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef DEBUG
#define SMB_DEBUG
#endif
#include <stdio.h>
#define INCLUDE_HWM_MODULE
#include "sensors.h"
#undef INCLUDE_HWM_MODULE
/* external (global) data */
extern int debug_flag;
extern int smb_base;
extern int smb_slave;
extern int smb_wbtemp1, smb_wbtemp2;
extern LM_METHODS method_smb;
/* SMBus Slave Address Candidates, global */
int numSMBSlave = 0;
int canSMBSlave[128];
int chkReg_Probe(int slave, char *comment, int Reg[], LM_METHODS *method)
{
int i, n, r, ret = 0;
if (slave > 0 && debug_flag > 1)
fprintf(stderr, "Set SMBus slave address: 0x%02X\n", slave);
if (debug_flag > 1)
fprintf(stderr, "%s", comment);
for (i = 0; (r = Reg[i]) != -1; i++) {
n = method->Read(r);
if (n != 0xFF)
++ret;
if (debug_flag > 1) {
if ((i + 1) % 4 == 0)
fprintf(stderr, " CR%02X:0x%02X\n", r, n);
else
fprintf(stderr, " CR%02X:0x%02X,", r, n);
}
}
if (debug_flag > 1) {
if(( i & 3 ) != 0 )
fprintf( stderr, "\n" ) ;
}
#if 0
if (debug_flag > 1)
fprintf(stderr, "\n");
#endif
return ret;
}
int chkReg_Probe_strict(int Reg[], LM_METHODS *method)
{
int i, r;
for (i = 0; (r = Reg[i]) != -1; i++) {
if (method->Read(r) == 0xFF)
return 0;
}
return 1;
}
/* Register checked for scanning smbus */
static int smb_scanReg[] = {
0x00, 0x01, 0x20, 0x40, 0x48,
-1 };
/* Blacklist slave address, do not access */
static int blacklist[] = {
0xD2,
-1 };
int scan_smbus(int addr_start, int addr_end, int result[])
{
int i, j, n, r, save, reg, ret = 0;
LM_METHODS *method = &method_smb;
#if !defined(LINUX) && defined(HAVE_SMBUS) && defined(SMBUS_IOCTL)
#else
if (smb_base <= 0)
return ret;
#endif
addr_start = 2 * (addr_start/2);
if (addr_start <= 0)
addr_start = 2;
if (addr_end > 0xFE)
addr_end = 0xFE;
save = smb_slave;
method->Open();
for (j = addr_start, ret = 0; j <= addr_end; j += 2) {
smb_slave = j;
for (i = 0; blacklist[i] != -1; i++)
if (j == blacklist[i])
goto skip;
#ifdef SMB_DEBUG
if (debug_flag > 1)
fprintf(stderr, "SLAVE::0x%02X\n", j);
#endif
for (i = 0, n = 0; (r = smb_scanReg[i]) != -1; i++) {
/* != 0xFF is not enough; need to check more, but ... */
if (((reg = method->Read(r)) & 0xFF) != 0xFF)
++n;
#ifdef SMB_DEBUG
if (debug_flag > 1)
fprintf(stderr, " 0x%02X:0x%02X\n", r, reg);
#endif
}
if (n) {
result[ret++] = j;
if (debug_flag > 1)
fprintf(stderr,
" SMBus slave 0x%02X(0x%02X) found...\n", j, j/2);
}
skip:
continue;
}
method->Close();
smb_slave = save;
return ret;
}
int find_smb_dev(void)
{
return (numSMBSlave = scan_smbus(0x00, 0xFE, canSMBSlave));
}
int get_smb_slave(int start, int end)
{
int i;
for (i = 0; i < numSMBSlave; i++) {
if (start <= canSMBSlave[i] && canSMBSlave[i] <= end)
break;
}
if (i >= numSMBSlave)
return 0;
else
return canSMBSlave[i];
}
void kill_smb_slave(int slave)
{
int i;
for (i = 0; i < numSMBSlave; i++) {
if (slave == canSMBSlave[i]) {
canSMBSlave[i] = 0xFF;
break;
}
}
}
int set_smb_Extemp(int start, int end, int *temp1, int *temp2)
{
int i, temp1_flag = 1, temp2_flag = 1; /* disable! */
for (i = 0; i < numSMBSlave; i++) {
if (start <= canSMBSlave[i] && canSMBSlave[i] <= end) {
if (temp1_flag) {
temp1_flag = 0; /* enabled! */
*temp1 = canSMBSlave[i];
} else if (temp2_flag) {
temp2_flag = 0; /* enabled! */
*temp2 = canSMBSlave[i];
}
}
}
return ((temp1_flag << 1) + temp2_flag);
}
void info_Extemp(LM_METHODS *method, int temp1, int temp2)
{
if (!temp1) {
if (debug_flag > 1) {
if (method == &method_smb)
fprintf(stderr,"* Temp1 exists at 0x%02X,", smb_wbtemp1);
else
fprintf(stderr,"* Temp1 exists at Bank 1,");
}
} else {
if (debug_flag > 1)
fprintf(stderr,"* NO Temp1,");
}
if (!temp2) {
if (debug_flag > 1) {
if (method == &method_smb)
fprintf(stderr," Temp2 exists at 0x%02X.\n", smb_wbtemp2);
else
fprintf(stderr," Temp2 exists at Bank 2.\n");
}
} else {
if (debug_flag > 1)
fprintf(stderr," NO Temp2.\n");
}
}
syntax highlighted by Code2HTML, v. 0.9.1