diff options
Diffstat (limited to 'commandline')
-rw-r--r-- | commandline/i2c-util.c | 70 | ||||
-rw-r--r-- | commandline/i2c-util.h | 7 | ||||
-rw-r--r-- | commandline/i2cdetect.c | 6 | ||||
-rw-r--r-- | commandline/i2cget.c | 22 | ||||
-rw-r--r-- | commandline/i2cset.c | 14 |
5 files changed, 98 insertions, 21 deletions
diff --git a/commandline/i2c-util.c b/commandline/i2c-util.c index 03b2fad..3608e36 100644 --- a/commandline/i2c-util.c +++ b/commandline/i2c-util.c @@ -308,6 +308,24 @@ unsigned char i2c_tx_byte(unsigned char byte) return ack; } +unsigned char i2c_hw_tx_byte(unsigned char byte) +{ + unsigned char buffer[8]; + + int nBytes = usb_control_msg(handle, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, + USBCMD_TX, 0, byte, + (char *)buffer, sizeof(buffer), 5000); + + if (nBytes < 1) { + fprintf(stderr, "ERR: tx: got %d bytes, expected 1\n", + nBytes); + exit(1); + } + + return buffer[0]; +} + unsigned char i2c_rx_byte(unsigned char send_ack) { signed char i; @@ -330,6 +348,24 @@ unsigned char i2c_rx_byte(unsigned char send_ack) return ret; } +unsigned char i2c_hw_rx_byte(unsigned char send_ack) +{ + unsigned char buffer[8]; + + int nBytes = usb_control_msg(handle, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, + USBCMD_RX, 0, send_ack, + (char *)buffer, sizeof(buffer), 5000); + + if (nBytes < 1) { + fprintf(stderr, "ERR: tx: got %d bytes, expected 1\n", + nBytes); + exit(1); + } + + return buffer[0]; +} + void i2c_start() { set_sda(1); @@ -342,6 +378,17 @@ void i2c_start() verify_scl_low(); } +void i2c_hw_start() +{ + // discarded + unsigned char buffer[8]; + + usb_control_msg(handle, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, + USBCMD_START, 0, 0, + (char *)buffer, sizeof(buffer), 5000); +} + void i2c_stop() { set_scl(1); @@ -352,6 +399,17 @@ void i2c_stop() verify_sda_high(); } +void i2c_hw_stop() +{ + // discarded + unsigned char buffer[8]; + + usb_control_msg(handle, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, + USBCMD_STOP, 0, 0, + (char *)buffer, sizeof(buffer), 5000); +} + void i2c_init() { usb_init(); @@ -365,6 +423,18 @@ void i2c_init() USBDEV_VERSION_MAJOR, USBDEV_VERSION_MINOR); exit(1); } + i2c_hw_setbits(); +} + +void i2c_hw_setbits() +{ + // discarded + unsigned char buffer[8]; + + usb_control_msg(handle, + USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN, + USBCMD_SETBITS, 0, ((1 << bit_scl) << 8) | (1 << bit_sda), + (char *)buffer, sizeof(buffer), 5000); } void i2c_deinit() diff --git a/commandline/i2c-util.h b/commandline/i2c-util.h index 9be466a..0f47b6e 100644 --- a/commandline/i2c-util.h +++ b/commandline/i2c-util.h @@ -10,8 +10,15 @@ unsigned char get_status(); unsigned char i2c_tx_byte(unsigned char byte); unsigned char i2c_rx_byte(unsigned char send_ack); +unsigned char i2c_hw_tx_byte(unsigned char byte); +unsigned char i2c_hw_rx_byte(unsigned char send_ack); + void i2c_getopt(int argc, char **argv); void i2c_start(); void i2c_stop(); void i2c_init(); void i2c_deinit(); + +void i2c_hw_setbits(); +void i2c_hw_start(); +void i2c_hw_stop(); diff --git a/commandline/i2cdetect.c b/commandline/i2cdetect.c index 88e5d2e..341900f 100644 --- a/commandline/i2cdetect.c +++ b/commandline/i2cdetect.c @@ -24,9 +24,9 @@ int main(int argc, char **argv) } - i2c_start(); + i2c_hw_start(); - if (i2c_tx_byte(i2cid)) + if (i2c_hw_tx_byte(i2cid)) printf(" %02x", id); else fputs(" --", stdout); @@ -35,7 +35,7 @@ int main(int argc, char **argv) fputs("\n", stdout); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 0; } diff --git a/commandline/i2cget.c b/commandline/i2cget.c index 9ed8bbd..f2bdb15 100644 --- a/commandline/i2cget.c +++ b/commandline/i2cget.c @@ -25,11 +25,11 @@ int main(int argc, char **argv) } i2c_init(); - i2c_start(); + i2c_hw_start(); - if (!i2c_tx_byte((address << 1) | 0)) { + if (!i2c_hw_tx_byte((address << 1) | 0)) { fprintf(stderr, "Received NAK from slave 0x%02x, aborting\n", address); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 3; } @@ -38,29 +38,29 @@ int main(int argc, char **argv) cmdbuf = strtol(argv[i], &conv_err, 0); if (conv_err && *conv_err) { fprintf(stderr, "read command: Conversion error at '%s'\n", conv_err); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 2; } - if (!i2c_tx_byte(cmdbuf)) { + if (!i2c_hw_tx_byte(cmdbuf)) { fprintf(stderr, "Received NAK after byte %d (0x%02x)\n", i-1, cmdbuf); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 4; } } - i2c_start(); - if (!i2c_tx_byte((address << 1) | 1)) { + i2c_hw_start(); + if (!i2c_hw_tx_byte((address << 1) | 1)) { fprintf(stderr, "Received NAK after reSTART from slave 0x%02x, aborting\n", address); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 3; } - ret = i2c_rx_byte(0); + ret = i2c_hw_rx_byte(0); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); printf("%i\n", ret); diff --git a/commandline/i2cset.c b/commandline/i2cset.c index 2d7567f..bdcd3cc 100644 --- a/commandline/i2cset.c +++ b/commandline/i2cset.c @@ -24,11 +24,11 @@ int main(int argc, char **argv) } i2c_init(); - i2c_start(); + i2c_hw_start(); - if (!i2c_tx_byte(address << 1)) { + if (!i2c_hw_tx_byte(address << 1)) { fprintf(stderr, "Received NAK from slave 0x%02x, aborting\n", address); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 3; } @@ -37,19 +37,19 @@ int main(int argc, char **argv) cmdbuf = strtol(argv[i], &conv_err, 0); if (conv_err && *conv_err) { fprintf(stderr, "write command: conversion error at '%s'\n", conv_err); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 2; } - if (!i2c_tx_byte(cmdbuf)) { + if (!i2c_hw_tx_byte(cmdbuf)) { fprintf(stderr, "Received NAK after byte %d (0x%02x)\n", i-1, cmdbuf); - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 4; } } - i2c_stop(); + i2c_hw_stop(); i2c_deinit(); return 0; |