summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2013-07-28 19:27:23 +0200
committerDaniel Friesel <derf@finalrewind.org>2013-07-28 19:27:23 +0200
commit33b42c688eaea23c14abe8d57b5b0f68c9373b86 (patch)
tree8088b2b201e7a156529b3dc94832d31f84301953
parentc3521ef27bb1fd049f87b1bb0da158842565e8c6 (diff)
further abstraction
-rw-r--r--commandline/Makefile2
-rw-r--r--commandline/i2c-util.c51
-rw-r--r--commandline/i2c-util.h3
-rw-r--r--commandline/i2c.c29
-rw-r--r--commandline/i2cdetect.c49
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 <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -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);