From 33b42c688eaea23c14abe8d57b5b0f68c9373b86 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sun, 28 Jul 2013 19:27:23 +0200 Subject: further abstraction --- commandline/Makefile | 2 +- commandline/i2c-util.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++ commandline/i2c-util.h | 3 +++ commandline/i2c.c | 29 +++++----------------------- commandline/i2cdetect.c | 49 ++++++++++------------------------------------- 5 files changed, 70 insertions(+), 64 deletions(-) diff --git a/commandline/Makefile b/commandline/Makefile index 3870114..6c51294 100644 --- a/commandline/Makefile +++ b/commandline/Makefile @@ -9,7 +9,7 @@ LIBS = $(USBLIBS) PREFIX ?= /usr/local bin_dir = ${DESTDIR}${PREFIX}/bin -PROGRAMS = vusb-i2c +PROGRAMS = vusb-i2c vusb-i2cdetect all: $(PROGRAMS) diff --git a/commandline/i2c-util.c b/commandline/i2c-util.c index 753160e..3971721 100644 --- a/commandline/i2c-util.c +++ b/commandline/i2c-util.c @@ -16,6 +16,7 @@ Linux, FreeBSD, Mac OS X and other Unix operating systems. Libusb can be obtained from http://libusb.sourceforge.net/. */ +#include #include #include #include @@ -238,6 +239,56 @@ void set_scl(char value) (char *)buffer, sizeof(buffer), 5000); } +unsigned char i2c_tx_byte(unsigned char byte) +{ + signed char i; + unsigned char ack = 0; + + for (i = 7; i >= -1; i--) { + if ((i < 0) || (byte & (1 << i))) { + set_sda(1); + } + else { + set_sda(0); + } + usleep(10); + set_scl(1); + usleep(10); + if (i < 0) { + if (get_status() & (1 << BIT_SDA)) + ack = 0; + else + ack = 1; + } + set_scl(0); + usleep(10); + } + + return ack; +} + +void i2c_start() +{ + set_sda(1); + set_scl(1); + usleep(1000); + set_sda(0); + usleep(1000); + set_scl(0); + verify_sda_low(); + verify_scl_low(); +} + +void i2c_stop() +{ + set_scl(1); + usleep(100); + verify_scl_high(); + set_sda(1); + usleep(100); + verify_sda_high(); +} + void i2c_init() { usb_init(); diff --git a/commandline/i2c-util.h b/commandline/i2c-util.h index bd5fe34..2b2f57b 100644 --- a/commandline/i2c-util.h +++ b/commandline/i2c-util.h @@ -10,6 +10,9 @@ void set_sda(char value); void set_scl(char value); unsigned char get_status(); +unsigned char i2c_tx_byte(unsigned char byte); +void i2c_start(); +void i2c_stop(); void i2c_init(); void i2c_deinit(); diff --git a/commandline/i2c.c b/commandline/i2c.c index ee0b264..8d28347 100644 --- a/commandline/i2c.c +++ b/commandline/i2c.c @@ -6,20 +6,12 @@ int main(int argc, char **argv) { - i2c_init(); - char line[8]; signed char i; short int number; - set_sda(1); - set_scl(1); - usleep(1000); - set_sda(0); - usleep(1000); - set_scl(0); - verify_sda_low(); - verify_scl_low(); + i2c_init(); + i2c_start(); puts("ready"); while (fgets(line, 8, stdin) != NULL) { @@ -60,23 +52,12 @@ int main(int argc, char **argv) } } if (strcmp(line, "push\n") == 0) { - set_scl(1); - usleep(30000); - set_sda(1); - usleep(100000); - set_sda(0); - usleep(100000); - set_scl(0); + i2c_stop(); + i2c_start(); } } - set_scl(1); - usleep(10); - verify_scl_high(); - set_sda(1); - usleep(10); - verify_sda_high(); - + i2c_stop(); i2c_deinit(); return 0; } diff --git a/commandline/i2cdetect.c b/commandline/i2cdetect.c index ee55528..60a72ac 100644 --- a/commandline/i2cdetect.c +++ b/commandline/i2cdetect.c @@ -10,12 +10,11 @@ int main(int argc, char **argv) { - - i2c_init(); - signed char i; unsigned char id, i2cid; + i2c_init(); + fputs(" 0 1 2 3 4 5 6 7 8 9 a b c d e f", stdout); for (id = 0; id < 128; id++) { @@ -27,43 +26,15 @@ int main(int argc, char **argv) printf("\n%02x:", id); } - set_sda(1); - set_scl(1); - usleep(1000); - set_sda(0); - usleep(1000); - set_scl(0); - verify_sda_low(); - verify_scl_low(); - for (i = 7; i >= -1; i--) { - if ((i < 0) || (i2cid & (1 << i))) { - set_sda(1); - //verify_sda_high(); - } else { - set_sda(0); - //verify_sda_low(); - } - usleep(10); - set_scl(1); - usleep(10); - //verify_scl_high(); - if (i < 0) { - if (get_status() & (1 << BIT_SDA)) - fputs(" --", stdout); - else - printf(" %02x", id); - } - set_scl(0); - usleep(10); - //verify_scl_low(); - } - set_scl(1); - usleep(100); - //verify_scl_high(); - set_sda(1); - usleep(100); - //verify_sda_high(); + i2c_start(); + + if (i2c_tx_byte(i2cid)) + printf(" %02x", id); + else + fputs(" --", stdout); + + i2c_stop(); } fputs("\n", stdout); -- cgit v1.2.3