diff options
author | Daniel Friesel <derf@finalrewind.org> | 2016-01-09 21:58:53 +0100 |
---|---|---|
committer | Daniel Friesel <derf@finalrewind.org> | 2016-01-09 21:58:53 +0100 |
commit | 554d78c9c73731705ab536e009ef47760dd2df3f (patch) | |
tree | 03637579a0c1ffc9df25181d5f2bf201bb9be91f /commandline/i2c-util.c | |
parent | 3541c176f24f8daee3b0bc35f71e1521daa7137a (diff) |
move software I2C implementation to ATTiny
Diffstat (limited to 'commandline/i2c-util.c')
-rw-r--r-- | commandline/i2c-util.c | 70 |
1 files changed, 70 insertions, 0 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() |