資源簡介
? i2cdetect :檢測i2c芯片是否存在
? i2cdump :檢測i2c寄存器
? i2cget :從i2c芯片寄存器種讀取數據
? i2cset :設置i2c寄存器
? isadump:監測isa寄存器
代碼片段和文件信息
/***************************************************************************
????copyright????????????:?(C)?by?2002-2003?Stefano?Barbato
????email????????????????:?stefano@codesink.org
????$Id:?24cXX.c?4230?2006-11-10?09:22:12Z?khali?$
?***************************************************************************/
/***************************************************************************
?*?????????????????????????????????????????????????????????????????????????*
?*???This?program?is?free?software;?you?can?redistribute?it?and/or?modify??*
?*???it?under?the?terms?of?the?GNU?General?Public?License?as?published?by??*
?*???the?Free?Software?Foundation;?either?version?2?of?the?License?or?????*
?*???(at?your?option)?any?later?version.???????????????????????????????????*
?*?????????????????????????????????????????????????????????????????????????*
?***************************************************************************/
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?
#include?“24cXX.h“
static?int?i2c_write_1b(struct?eeprom?*e?__u8?buf)
{
int?r;
//?we?must?simulate?a?plain?I2C?byte?write?with?SMBus?functions
r?=?i2c_smbus_write_byte(e->fd?buf);
if(r?0)
fprintf(stderr?“Error?i2c_write_1b:?%s\n“?strerror(errno));
usleep(10);
return?r;
}
static?int?i2c_write_2b(struct?eeprom?*e?__u8?buf[2])
{
int?r;
//?we?must?simulate?a?plain?I2C?byte?write?with?SMBus?functions
r?=?i2c_smbus_write_byte_data(e->fd?buf[0]?buf[1]);
if(r?0)
fprintf(stderr?“Error?i2c_write_2b:?%s\n“?strerror(errno));
usleep(10);
return?r;
}
static?int?i2c_write_3b(struct?eeprom?*e?__u8?buf[3])
{
int?r;
//?we?must?simulate?a?plain?I2C?byte?write?with?SMBus?functions
//?the?__u16?data?field?will?be?byte?swapped?by?the?SMBus?protocol
r?=?i2c_smbus_write_word_data(e->fd?buf[0]?buf[2]?<8?|?buf[1]);
if(r?0)
fprintf(stderr?“Error?i2c_write_3b:?%s\n“?strerror(errno));
usleep(10);
return?r;
}
#define?CHECK_I2C_FUNC(?var?label?)?\
do?{? if(0?==?(var?&?label))?{?\
fprintf(stderr?“\nError:?“?\
#label?“?function?is?required.?Program?halted.\n\n“);?\
exit(1);?}?\
}?while(0);
int?eeprom_open(char?*dev_fqn?int?addr?int?type?struct?eeprom*?e)
{
int?fd?r;
unsigned?long?funcs;
e->fd?=?e->addr?=?0;
e->dev?=?0;
fd?=?open(dev_fqn?O_RDWR);
if(fd?<=?0)
return?-1;
//?get?funcs?list
if((r?=?ioctl(fd?I2C_FUNCS?&funcs)?0))
return?r;
//?check?for?req?funcs
CHECK_I2C_FUNC(?funcs?I2C_FUNC_SMBUS_READ_BYTE?);
CHECK_I2C_FUNC(?funcs?I2C_FUNC_SMBUS_WRITE_BYTE?);
CHECK_I2C_FUNC(?funcs?I2C_FUNC_SMBUS_READ_BYTE_DATA?);
CHECK_I2C_FUNC(?funcs?I2C_FUNC_SMBUS_WRITE_BYTE_DATA?);
CHECK_I2C_FUNC(?funcs?I2C_FUNC_SMBUS_READ_WORD_DATA?);
CHECK_I2C_FUNC(?funcs?I2C_FUNC_SMBUS_WRITE_WORD_DATA?);
//?set?working?device
if(?(?r?=?ioctl(fd?I2C_SLAVE?addr))?0)
return?r;
e->fd?=?
評論
共有 條評論