From d0c244621ff65a51d1116ff78b7faa358b74f4e9 Mon Sep 17 00:00:00 2001 From: linuxandroid Date: Wed, 25 May 2016 14:23:01 +0800 Subject: [PATCH] nit iu tools --- .gitignore | 2 + Makefile | 15 +++++ i2c.h | 16 +++++ i2c_file.c | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++ i2c_msg.c | 161 ++++++++++++++++++++++++++++++++++++++++++++++++++ iu.c | 158 +++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 522 insertions(+) create mode 100644 .gitignore create mode 100755 Makefile create mode 100755 i2c.h create mode 100755 i2c_file.c create mode 100755 i2c_msg.c create mode 100755 iu.c diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9bfd18a --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*.o +iu diff --git a/Makefile b/Makefile new file mode 100755 index 0000000..2b3fab4 --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ + +CFLAGS= -Wall -O2 -static +CC=arm-none-linux-gnueabi-gcc + +iu: pre + $(CC) $(CFLAGS) iu.o i2c_msg.o -o $@ + + +pre: i2c_msg.o iu.o + +all: iu + +clean: + rm -f i2c_msg.o i2c_file.o iu.o iu + diff --git a/i2c.h b/i2c.h new file mode 100755 index 0000000..7988b4e --- /dev/null +++ b/i2c.h @@ -0,0 +1,16 @@ + +#ifndef __I2C_H__ +#define __I2C_H__ + +#define PLEN 32 + +typedef unsigned char U8; +typedef unsigned int U16; + +extern void i2c_bus_set(const char* ibus); +extern int i2c_read(const U8 addr, const U8 reg, U8* buff, const U8 len); +extern int i2c_write(const U8 addr, const U8 reg, const U8* buff, const U8 len); +extern int probe_bus(U8* pbuff); +extern int probe_regs(const U8 addr, U8* pbuff); +extern void print_hex(const U8* pbuff, const U16 len); +#endif diff --git a/i2c_file.c b/i2c_file.c new file mode 100755 index 0000000..e885343 --- /dev/null +++ b/i2c_file.c @@ -0,0 +1,170 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +// set default i2c bus. +static char i2c_bus[PLEN] = "/dev/i2c-0"; + +// open i2c bus +static int i2c_bus_open() +{ + int fd = open(i2c_bus, O_RDWR); + if (fd < 0){ + printf("open i2c bus %s failed\n",i2c_bus); + } + return fd; +} + +// close i2c bus +static void i2c_bus_close(int fd) +{ + if (fd < 0) + return; + close(fd); +} + +// set i2c bus +void i2c_bus_set(const char* ibus) +{ + int i=0; + for(i=0; i>1); + if(ret<0){ + printf("ioctl address failed!\n"); + i2c_bus_close(fd); + return -1; + } + + sendbuff[0]=reg; + sendbuff[1]=0; + ret = write(fd, sendbuff,1); + //printf("write(%d): ret=%d\n", addr,ret); + + ret = read(fd,buff,len); + //printf("read(%d,%d): ret=%d:\n", addr,len,ret); + + //for(i=0;i>1); + if(ret<0){ + printf("ioctl address failed!\n"); + i2c_bus_close(fd); + return -1; + } + + + puchar = (U8*)malloc(len+1); + if(!puchar){ + printf("malloc failed\n"); + i2c_bus_close(fd); + return -1; + } + + puchar[0] = reg; + memcpy(puchar+1,buff,len); + ret = write(fd, puchar,len+1); + //printf("write(%d,%d): ret=%d\n",offset,len,ret); + + //for(i=0;i<(len+1);i++){ + // printf("%x ", pchar[i]); + //} + //printf("\n"); + + + free(puchar); + i2c_bus_close(fd); + + return !(ret==(len+1)); +} + + +// search devices on bus. +int probe_bus(U8* pbuff) +{ + int i,count=0; + U8 value; + + for(i=2; i<0xFF;i=i+2){ + if(!i2c_read(i,0,&value,1)){ + pbuff[count++] = i; + } + usleep(100); + } + return count; +} + + +// probe registers on device +int probe_regs(const U8 addr, U8* pbuff) +{ + int i,count=0; + U8 value; + + for(i=0; i<0x100;i++){ + if(!i2c_read(addr,i,&value,1)){ + pbuff[count++] = i; + } + usleep(100); + } + return count; +} + +// print buffer in hex +void print_hex(const U8* pbuff, const U16 len) +{ + int i=0; + for(i=0; i +#include +#include +#include +#include +#include +#include +#include +#include "i2c.h" + +// set default i2c bus. +static char i2c_bus[PLEN] = "/dev/i2c-0"; + +// open i2c bus +static int i2c_bus_open() +{ + int fd = open(i2c_bus, O_RDWR); + if (fd < 0){ + printf("open i2c bus %s failed\n",i2c_bus); + } + return fd; +} + +// close i2c bus +static void i2c_bus_close(int fd) +{ + if (fd < 0) + return; + close(fd); +} + +// set i2c bus +void i2c_bus_set(const char* ibus) +{ + int i=0; + for(i=0; i>1; + msgs[0].len= 1; + msgs[0].flags= 0; + msgs[0].buf= &outbuff; + + msgs[1].addr= addr>>1; + msgs[1].len= len; + msgs[1].flags = I2C_M_RD; + msgs[1].buf= buff; + + ioctl_data.nmsgs= 2; + ioctl_data.msgs= msgs; + ret = ioctl(fd, I2C_RDWR, &ioctl_data); + + i2c_bus_close(fd); + + return !(ret==2); +} + +// write chip addr into reg from buff with len bytes +int i2c_write(const U8 addr, const U8 reg, const U8* buff, const U8 len) +{ + int fd,ret; + U8* puchar; + struct i2c_msg msgs; + struct i2c_rdwr_ioctl_data ioctl_data; + + fd = i2c_bus_open(); + if(fd<0) return -1; + + puchar = (U8*)malloc(len+1); + if(!puchar){ + printf("malloc failed\n"); + i2c_bus_close(fd); + return -1; + } + + puchar[0] = reg; + memcpy(puchar+1,buff,len); + + msgs.addr= addr>>1; + msgs.len= len+1; + msgs.flags= 0; + msgs.buf= puchar; + + ioctl_data.nmsgs= 1; + ioctl_data.msgs= &msgs; + ret = ioctl(fd, I2C_RDWR, &ioctl_data); + + free(puchar); + i2c_bus_close(fd); + + return !(ret==1); +} + +// search devices on bus. +int probe_bus(U8* pbuff) +{ + int i,count=0; + U8 value; + + for(i=2; i<0xFF;i=i+2){ + if(!i2c_read(i,0,&value,1)){ + pbuff[count++] = i; + } + usleep(100); + } + return count; +} + +// probe registers on device +int probe_regs(const U8 addr, U8* pbuff) +{ + int i,count=0; + U8 value; + + for(i=0; i<0x100;i++){ + if(!i2c_read(addr,i,&value,1)){ + pbuff[count++] = i; + } + usleep(100); + } + return count; +} + +// print buffer in hex +void print_hex(const U8* pbuff, const U16 len) +{ + int i=0; + for(i=0; i +#include +#include +#include "i2c.h" +#include +#include +#include + +void print_usage(char* name){ + printf( + "Usage:\n" \ + " %s -d /dev/i2c-1 \n" \ + " set i2c bus as /dev/i2c-1 [default:/dev/i2c-0] \n" \ + " %s -w [addr],[reg],[val] \n" \ + " write a value [val] to register [reg] \n" \ + " %s -r [addr],[reg],[len] \n" \ + " read len bytes from [reg] \n" \ + " %s -s [addr] \n" \ + " search i2c valid regiser for device [addr] \n" \ + " %s -S \n" \ + " search i2c devices on bus \n" \ + ,name,name,name,name,name); +} + +int set_bus(char* path) +{ + int ret=0; + // check path exist + + // check path is char device + + // check path can be read/write + return ret; +} + +int search_registers(U16 addr) +{ + int ret=0; + // check add is valid address + + return ret; +} + +void search_devices() +{ + // set devices on bus +} + +int main (int argc, char **argv) +{ + int ret=0; + int foptd=0,foptw=0,foptr=0, fopts=0,foptS=0; + char* path=NULL; + U16 waddr=0, wreg=0, wval=0; + U16 raddr=0, rreg=0, rlen=0; + U16 saddr=0; + + while((ret=getopt(argc, argv, "d:w:r:s:S"))!= -1) + { + switch(ret) + { + case 'd': + foptd = 1; + path = optarg; + break; + case 'w': + if(3==sscanf(optarg,"%x,%x,%x",&waddr,&wreg,&wval)){ + foptw = 1; + } + break; + case 'r': + if(3==sscanf(optarg,"%x,%x,%x",&raddr,&rreg,&rlen)){ + foptr = 1; + } + break; + case 's': + fopts = 1; + saddr = strtol(optarg,NULL,16); + break; + case 'S': + foptS = 1; + break; + } + } + + if(0==(foptd || foptw || foptr || fopts || foptS)){ + print_usage(argv[0]); + ret = -1; + goto RET; + } + + if(foptd){ + if(access(path, F_OK)){ + printf("%s is not exist!\n",path); + ret= -1; + goto RET; + } + if(access(path, R_OK|W_OK|F_OK)){ + printf("%s can not be read/write!\n",path); + ret= -1; + goto RET; + } + i2c_bus_set(path); + } + + if(foptw){ + int ret = i2c_write(waddr, wreg, (U8*)&wval, 1); + if(!ret){ + printf("write: %02X[%02X]=%02X",waddr,wreg,wval); + } + else{ + printf("write failed!\n"); + } + } + + if(foptr){ + U8 buf[256]; + int ret = i2c_read(raddr, rreg, buf, rlen); + if(!ret){ + printf("read: %02X[%02X],%02X bytes",raddr,rreg,rlen); + print_hex(buf,rlen); + } + else{ + printf("read failed!\n"); + } + } + + if(fopts){ + U8 buff[256]; + int count = probe_regs(saddr,buff); + printf("probe resutl: %d registers",count); + if(count>0){ + print_hex(buff,count); + } + else{ + printf("\n"); + } + } + + if(foptS){ + U8 buff[128]; + int count = probe_bus(buff); + printf("probe resutl: %d devices",count); + if(count>0){ + print_hex(buff,count); + } + else{ + printf("\n"); + } + } + +RET: + return ret; +} + + +