@ -43,7 +43,6 @@ static void help(void)
" b (byte, default) \n "
" w (word) \n "
" W (word on even register addresses) \n "
" s (SMBus block, deprecated) \n "
" i (I2C block) \n "
" c (consecutive byte) \n "
" Append p for SMBus PEC \n " ) ;
@ -86,13 +85,6 @@ static int check_funcs(int file, int size, int pec)
}
break ;
case I2C_SMBUS_BLOCK_DATA :
if ( ! ( funcs & I2C_FUNC_SMBUS_READ_BLOCK_DATA ) ) {
fprintf ( stderr , MISSING_FUNC_FMT , " SMBus block read " ) ;
return - 1 ;
}
break ;
case I2C_SMBUS_I2C_BLOCK_DATA :
if ( ! ( funcs & I2C_FUNC_SMBUS_READ_I2C_BLOCK ) ) {
fprintf ( stderr , MISSING_FUNC_FMT , " I2C block read " ) ;
@ -116,7 +108,7 @@ int main(int argc, char *argv[])
int i , j , res , i2cbus , address , size , file ;
int bank = 0 , bankreg = 0x4E , old_bank = 0 ;
char filename [ 20 ] ;
int block [ 256 ] , s_length = 0 ;
int block [ 256 ] ;
int pec = 0 , even = 0 ;
int flags = 0 ;
int force = 0 , yes = 0 , version = 0 , all_addrs = 0 ;
@ -180,10 +172,9 @@ int main(int argc, char *argv[])
size = I2C_SMBUS_WORD_DATA ;
even = 1 ;
} else if ( ! strncmp ( argv [ flags + 3 ] , " s " , 1 ) ) {
size = I2C_SMBUS_BLOCK_DATA ;
fprintf ( stderr ,
" SMBus block mode is depreca ted, please use i2cget instead \n " ) ;
pec = argv [ flags + 3 ] [ 1 ] = = ' p ' ;
" SMBus block mode is no longer suppor ted, please use i2cget instead \n " ) ;
exit ( 1 ) ;
} else if ( ! strncmp ( argv [ flags + 3 ] , " c " , 1 ) ) {
size = I2C_SMBUS_BYTE ;
pec = argv [ flags + 3 ] [ 1 ] = = ' p ' ;
@ -208,16 +199,10 @@ int main(int argc, char *argv[])
help ( ) ;
exit ( 1 ) ;
}
if ( size = = I2C_SMBUS_BLOCK_DATA
& & ( bank < 0 | | bank > 0xff ) ) {
fprintf ( stderr , " Error: block command out of range! \n " ) ;
help ( ) ;
exit ( 1 ) ;
}
if ( argc > flags + 5 ) {
bankreg = strtol ( argv [ flags + 5 ] , & end , 0 ) ;
if ( * end | | size = = I2C_SMBUS_BLOCK_DATA ) {
if ( * end ) {
fprintf ( stderr , " Error: Invalid bank register "
" number! \n " ) ;
help ( ) ;
@ -250,16 +235,7 @@ int main(int argc, char *argv[])
}
/* Check mode constraints */
switch ( size ) {
case I2C_SMBUS_BYTE :
case I2C_SMBUS_BYTE_DATA :
case I2C_SMBUS_I2C_BLOCK_DATA :
break ;
case I2C_SMBUS_WORD_DATA :
if ( ! even | | ( ! ( first % 2 ) & & last % 2 ) )
break ;
/* Fall through */
default :
if ( size = = I2C_SMBUS_WORD_DATA & & even & & ( first % 2 | | ! ( last % 2 ) ) ) {
fprintf ( stderr ,
" Error: Range parameter not compatible with selected mode! \n " ) ;
exit ( 1 ) ;
@ -286,7 +262,6 @@ int main(int argc, char *argv[])
fprintf ( stderr , " I will probe file %s, address 0x%x, mode "
" %s \n " , filename , address ,
size = = I2C_SMBUS_BLOCK_DATA ? " smbus block " :
size = = I2C_SMBUS_I2C_BLOCK_DATA ? " i2c block " :
size = = I2C_SMBUS_BYTE ? " byte consecutive read " :
size = = I2C_SMBUS_BYTE_DATA ? " byte " : " word " ) ;
@ -296,12 +271,8 @@ int main(int argc, char *argv[])
fprintf ( stderr , " Only probing even register "
" addresses. \n " ) ;
if ( bank ) {
if ( size = = I2C_SMBUS_BLOCK_DATA )
fprintf ( stderr , " Using command 0x%02x. \n " ,
bank ) ;
else
fprintf ( stderr , " Probing bank %d using bank "
" register 0x%02x. \n " , bank , bankreg ) ;
fprintf ( stderr , " Probing bank %d using bank "
" register 0x%02x. \n " , bank , bankreg ) ;
}
if ( range ) {
fprintf ( stderr ,
@ -318,7 +289,7 @@ int main(int argc, char *argv[])
}
/* See Winbond w83781d data sheet for bank details */
if ( bank & & size ! = I2C_SMBUS_BLOCK_DATA ) {
if ( bank ) {
res = i2c_smbus_read_byte_data ( file , bankreg ) ;
if ( res > = 0 ) {
old_bank = res ;
@ -334,25 +305,15 @@ int main(int argc, char *argv[])
/* handle all but word data */
if ( size ! = I2C_SMBUS_WORD_DATA | | even ) {
/* do the block transaction */
if ( size = = I2C_SMBUS_BLOCK_DATA
| | size = = I2C_SMBUS_I2C_BLOCK_DATA ) {
if ( size = = I2C_SMBUS_I2C_BLOCK_DATA ) {
unsigned char cblock [ 288 ] ;
if ( size = = I2C_SMBUS_BLOCK_DATA ) {
res = i2c_smbus_read_block_data ( file , bank ,
cblock ) ;
/* Remember returned block length for a nicer
display later */
s_length = res ;
last = res - 1 ;
} else {
for ( res = first ; res < = last ; res + = i ) {
i = i2c_smbus_read_i2c_block_data ( file ,
res , 32 , cblock + res ) ;
if ( i < = 0 ) {
res = i ;
break ;
}
for ( res = first ; res < = last ; res + = i ) {
i = i2c_smbus_read_i2c_block_data ( file ,
res , 32 , cblock + res ) ;
if ( i < = 0 ) {
res = i ;
break ;
}
}
if ( res < = 0 ) {
@ -376,8 +337,6 @@ int main(int argc, char *argv[])
printf ( " 0 1 2 3 4 5 6 7 8 9 a b c d e f "
" 0123456789abcdef \n " ) ;
for ( i = 0 ; i < 256 ; i + = 16 ) {
if ( size = = I2C_SMBUS_BLOCK_DATA & & i > = s_length )
break ;
if ( i / 16 < first / 16 )
continue ;
if ( i / 16 > last / 16 )
@ -415,10 +374,7 @@ int main(int argc, char *argv[])
} else
res = block [ i + j ] ;
if ( size = = I2C_SMBUS_BLOCK_DATA
& & i + j > = s_length ) {
printf ( " " ) ;
} else if ( res < 0 ) {
if ( res < 0 ) {
printf ( " XX " ) ;
if ( size = = I2C_SMBUS_WORD_DATA )
printf ( " XX " ) ;
@ -433,9 +389,6 @@ int main(int argc, char *argv[])
printf ( " " ) ;
for ( j = 0 ; j < 16 ; j + + ) {
if ( size = = I2C_SMBUS_BLOCK_DATA
& & i + j > = s_length )
break ;
/* Skip unwanted registers */
if ( i + j < first | | i + j > last ) {
printf ( " " ) ;
@ -483,7 +436,7 @@ int main(int argc, char *argv[])
printf ( " \n " ) ;
}
}
if ( bank & & size ! = I2C_SMBUS_BLOCK_DATA ) {
if ( bank ) {
i2c_smbus_write_byte_data ( file , bankreg , old_bank ) ;
}
exit ( 0 ) ;