00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00025 #include "korebot.h"
00026 #include "knet_i2c.h"
00027 #include "i2ccom.h"
00028
00029 static int knet_i2c_exit( knet_bus_t * bus );
00030
00031 static struct knet_dev_s * knet_i2c_open( struct knet_bus_s * bus ,
00032 knet_ext_t ext ,
00033 knet_mod_t mod ,
00034 const char * name ,
00035 int argc , char * argv[] );
00036
00037 static int knet_i2c_transfer( knet_bus_t * bus ,
00038 knet_dev_t * dev ,
00039 const char * write_buf ,
00040 unsigned int write_len ,
00041 char * read_buf ,
00042 unsigned int read_len );
00043
00044 static int knet_i2c_read( knet_bus_t * bus ,
00045 knet_dev_t * dev ,
00046 char * buf , unsigned int len );
00047
00048 static int knet_i2c_write( knet_bus_t * bus ,
00049 knet_dev_t * dev ,
00050 const char * buf , unsigned int len );
00051
00052
00056 static int knet_i2c_scan_callback( i2c_t * i2c ,
00057 i2c_dev_t dev ,
00058 void * context )
00059 {
00060 knet_bus_t * bus = (knet_bus_t * ) context;
00061
00062 pthread_mutex_lock( &bus->lock );
00063 knet_device_create( bus , 0 , dev , NULL );
00064 pthread_mutex_unlock( &bus->lock );
00065 return 0;
00066 }
00067
00068
00069
00080 int knet_i2c_init( knet_bus_t * bus , int argc , char * argv [] )
00081 {
00082 int i, rc;
00083 i2c_t * i2c;
00084 char * device = NULL;
00085 int scan_bus = 0;
00086
00087 bus->exit = knet_i2c_exit;
00088 bus->open = knet_i2c_open;
00089 bus->close = NULL;
00090 bus->transfer = knet_i2c_transfer;
00091 bus->read = knet_i2c_read;
00092 bus->write = knet_i2c_write;
00093
00094 i2c = KB_ALLOC( i2c_t , 1 );
00095
00096
00097 for (i=1; i<argc; i++) {
00098
00099
00100 if (!strcmp(argv[i],"--i2c-device")) {
00101 device = argv[i];
00102 i++;
00103 }
00104 else if (!strcmp(argv[i],"--i2c-scan")) {
00105 scan_bus = 1;
00106 }
00107 }
00108
00109 if ((rc=i2c_open( i2c , device )) < 0) {
00110 kb_free( i2c );
00111 return kb_error( __FILE__ ,
00112 __LINE__ ,
00113 "knet_i2c_open" ,
00114 KB_ERROR_OPENBUS ,
00115 "I²C" );
00116
00117 }
00118 bus->bus_info = i2c;
00119
00120
00121 if ( scan_bus > 0 ) {
00122
00123 rc = i2c_scan( i2c ,
00124 knet_i2c_scan_callback ,
00125 bus );
00126 if ( rc < 0 ) {
00127 i2c_close( i2c );
00128 kb_free( i2c );
00129 return kb_error( __FILE__ ,
00130 __LINE__ ,
00131 "knet_i2c_open" ,
00132 KB_ERROR_SCANBUS ,
00133 "I²C" );
00134 }
00135 }
00136 return rc;
00137 }
00138
00139
00148 static int knet_i2c_exit( knet_bus_t * bus )
00149 {
00150 i2c_close( (i2c_t *) bus->bus_info );
00151 kb_free( bus->bus_info );
00152 return 0;
00153 }
00154
00155
00168 static struct knet_dev_s * knet_i2c_open( struct knet_bus_s * bus ,
00169 knet_ext_t ext ,
00170 knet_mod_t mod ,
00171 const char * name ,
00172 int argc , char * argv[] )
00173 {
00174 knet_dev_t * dev;
00175 int ok;
00176 i2c_dev_t adr;
00177
00178 adr = mod;
00179
00180 dev = knet_bus_find_device( bus , 0 , adr );
00181 if ( dev == NULL ) {
00182
00183
00184
00185
00186
00187 if ( i2c_exists( (i2c_t *)bus->bus_info , adr ) ) {
00188 dev = knet_device_create( bus , 0 , adr , NULL );
00189 }
00190
00191 }
00192
00193 if ( dev == NULL ) {
00194 kb_error( __FILE__ ,
00195 __LINE__ ,
00196 "knet_i2c_open" ,
00197 KB_ERROR_NODEVFOUND , 0 , adr );
00198 return NULL;
00199 }
00200
00201
00202 return dev;
00203 }
00204
00205
00223 static int knet_i2c_transfer( knet_bus_t * bus ,
00224 knet_dev_t * dev ,
00225 const char * write_buf , unsigned int write_len ,
00226 char * read_buf , unsigned int read_len )
00227 {
00228 return i2c_lltransfer( (i2c_t *)bus->bus_info ,
00229 dev->mod_addr ,
00230 write_buf , write_len ,
00231 read_buf , read_len );
00232
00233 }
00234
00235
00250 static int knet_i2c_read( knet_bus_t * bus ,
00251 knet_dev_t * dev ,
00252 char * buf , unsigned int len )
00253 {
00254 return i2c_llread( (i2c_t *)bus->bus_info ,
00255 dev->mod_addr ,
00256 buf , len );
00257 }
00258
00259
00260
00276 static int knet_i2c_write( knet_bus_t * bus ,
00277 knet_dev_t * dev ,
00278 const char * buf , unsigned int len )
00279 {
00280 return i2c_llwrite( (i2c_t *)bus->bus_info ,
00281 dev->mod_addr ,
00282 buf , len );
00283 }