00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #include "i2ccom.h"
00024
00025 #include <stdlib.h>
00026 #include <unistd.h>
00027 #include <fcntl.h>
00028 #include <sys/types.h>
00029 #include <sys/errno.h>
00030 #include <sys/ioctl.h>
00031 #include <errno.h>
00032
00033
00034
00035 #include "i2c-dev.h"
00036
00053
00066 int i2c_open( i2c_t *i2c , char const *device )
00067 {
00068
00069 i2c->dev = -1;
00070
00071
00072 if (!device)
00073 device = "/dev/i2c-0";
00074
00075 if ((i2c->fd = open( device , O_RDWR )) < 0 )
00076 return i2c->fd;
00077
00078 return 0;
00079 }
00080
00081
00087 void i2c_close( i2c_t *i2c )
00088 {
00089 if (i2c->fd>0) {
00090 close(i2c->fd);
00091 i2c->fd = -1;
00092 }
00093 }
00094
00095
00109 static int i2c_priv_select_device( i2c_t * i2c , i2c_dev_t address )
00110 {
00111 int rc;
00112
00113
00114 if (i2c->dev != address ) {
00115
00116 if ((rc=ioctl( i2c->fd , I2C_SLAVE , address )) < 0)
00117 return rc;
00118
00119 i2c->dev = address;
00120 }
00121 return 0;
00122 }
00123
00124
00138 int i2c_llread( i2c_t * i2c ,
00139 i2c_dev_t dev ,
00140 char * buf ,
00141 unsigned int len )
00142 {
00143 int rc;
00144
00145 i2c_priv_select_device( i2c , dev );
00146
00147 rc = read( i2c->fd , buf , len );
00148
00149 return rc;
00150 }
00151
00152
00166 int i2c_llwrite( i2c_t * i2c ,
00167 i2c_dev_t dev ,
00168 const char * buf ,
00169 unsigned int len )
00170 {
00171 int rc;
00172 int i;
00173
00174 i2c_priv_select_device( i2c , dev );
00175
00176 rc = write( i2c->fd , buf , len );
00177
00178 return rc;
00179 }
00180
00181
00182
00202 int i2c_lltransfer( i2c_t * i2c , i2c_dev_t dev ,
00203 const char * write_buf , unsigned int write_len ,
00204 char * read_buf , unsigned int read_len )
00205 {
00206 struct i2c_msg msgs[2];
00207 struct i2c_rdwr_ioctl_data msgset;
00208 int rc;
00209
00210
00211 msgs[0].addr = dev;
00212 msgs[0].flags = 0;
00213 msgs[0].buf = (char *)write_buf;
00214 msgs[0].len = write_len;
00215
00216
00217 msgs[1].addr = dev;
00218 msgs[1].flags = I2C_M_RD;
00219 msgs[1].buf = read_buf;
00220 msgs[1].len = read_len;
00221
00222 msgset.msgs = msgs;
00223 msgset.nmsgs = 2;
00224
00225 rc = ioctl( i2c->fd , I2C_RDWR , &msgset );
00226
00227 return rc;
00228 }
00229
00230
00243 int i2c_exists( i2c_t * i2c , i2c_dev_t dev )
00244 {
00245 int rc, adr, found=0;
00246 struct i2c_msg msg;
00247 struct i2c_rdwr_ioctl_data msgset;
00248
00249 msg.addr = dev;
00250 msg.flags = 0;
00251 msg.buf = 0;
00252 msg.len = 0;
00253
00254 msgset.msgs = &msg;
00255 msgset.nmsgs = 1;
00256
00257 rc = ioctl( i2c->fd , I2C_RDWR , &msgset );
00258
00259
00260 if ( rc == 1 ) return 1;
00261
00262 return 0;
00263 }
00264
00265
00280 int i2c_scan( i2c_t * i2c ,
00281 int (*callback)( i2c_t * i2c ,
00282 i2c_dev_t dev ,
00283 void * context ) ,
00284 void * context)
00285 {
00286 int rc, adr, found=0;
00287 struct i2c_msg msg;
00288 struct i2c_rdwr_ioctl_data msgset;
00289
00290
00291 for (adr=2; adr<128; adr++) {
00292 msg.addr = adr;
00293 msg.flags = 0;
00294 msg.buf = 0;
00295 msg.len = 0;
00296
00297 msgset.msgs = &msg;
00298 msgset.nmsgs = 1;
00299
00300 rc = ioctl( i2c->fd , I2C_RDWR , &msgset );
00301
00302 if ( rc == 1 ) {
00303 found++;
00304 if ( callback != NULL ) {
00305 if ((rc=callback( i2c , adr , context ))<0)
00306 return rc;
00307 }
00308 }
00309 }
00310
00311 return found;
00312 }
00313