# ft260hid
This unofficial library controls FT260 USB-I2C/UART bridge IC made by FTDI.
The library depends on "hidapi" crate mainly.
## About FT260
- [Product Page](https://ftdichip.com/products/ft260q/)
- [Application Note](https://ftdichip.com/wp-content/uploads/2020/07/AN_394_User_Guide_for_FT260.pdf)
This USB device does not have virtual COM port. Instead, it has HID interface.
For example, HID Input/Output Reports are converted into I2C/UART communication between the FT260 and its external devices.
## Examples
Unit tests are executed on the evaluation board [UMFT260EV1A](https://ftdichip.com/products/umft260ev1a/).
### GPIO
```rust
use ft260hid::device;
use ft260hid::io::gpio::{Dir, Group, Pin, Val};
// . . .
let dev = device::open(0).unwrap();
let gpio = dev.gpio();
gpio.enable_pin(Group::Gpio_0_1);
gpio.set_dir(Pin::Gpio0, Dir::Out);
gpio.write(Pin::Gpio0, Val::Low);
gpio.set_dir(Pin::Gpio1, Dir::In);
gpio.set_pull_up(Pin::Gpio1);
```
### I2C
I2C EEPROM ([AT24C02D_SOT23](https://ww1.microchip.com/downloads/en/DeviceDoc/AT24C01D-AT24C02D-I2C-Compatible-Two-Wire-Serial-EEPROM-1Kbit-2Kbit-20006100A.pdf)) is mounted on UMFT260EV1A board,
and it can be used for unit tests.
```rust
use ft260hid::device;
use ft260hid::io::i2c;
// . . .
/// I2C address of EEPROM on UMFT260EV1A
const EEPROM_ADDRESS: u8 = 0x50;
/// page size of EEPROM
const EEPROM_PAGE_SIZE: usize = 8;
// . . .
let dev = device::open(0).unwrap();
let mut i2c = dev.i2c();
i2c.init(i2c::KBPS_DEFAULT);
// address value to read EEPROM page out
let addr = [0u8];
let mut data_read = [0u8; EEPROM_PAGE_SIZE];
i2c.write_read(EEPROM_ADDRESS,
&addr,
1,
&mut buf,
EEPROM_PAGE_SIZE,
i2c::DURATION_WAIT_DEFAULT
);
```
### UART
The TXD-RXD pins on UMFT260EV1A are shorted for unit tests.
```rust
use ft260hid::device;
use ft260hid::io::uart;
// . . .
// interface number is `1` !!
let dev = device::open(1).unwrap();
let mut uart = dev.uart();
uart.init();
uart.set_config(&uart::Config::default());
// UART TX
let mut buf_tx = [0u8; 256];
let size_sent = uart.write(&buf_tx, len).unwrap();
// RX data in FIFO
let size_to_read = uart.size_to_read();
// UART RX
let mut buf_rx = [0u8; 256];
let size_rec = uart.read(&mut buf_rx, size_to_read, uart::DURATION_WAIT_DEFAULT).unwrap();
```