Free Software, Open Source Hardware keyboard controller. https://www.forksand.com/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

148 lines
4.0 KiB

#include <stdio.h>
#include <stdlib.h>
#include <mpsse.h>
#include <../libftdi1/src/ftdi.h>
struct vid_pid supported_devices[] = {
{ 0x0403, 0x6010, "FT2232 Future Technology Devices International, Ltd" },
{ 0x0403, 0x6011, "FT4232 Future Technology Devices International, Ltd" },
{ 0x0403, 0x6014, "FT232H Future Technology Devices International, Ltd" },
/* These devices are based on FT2232 chips, but have not been tested. */
{ 0x0403, 0x8878, "Bus Blaster v2 (channel A)" },
{ 0x0403, 0x8879, "Bus Blaster v2 (channel B)" },
{ 0x0403, 0xBDC8, "Turtelizer JTAG/RS232 Adapter A" },
{ 0x0403, 0xCFF8, "Amontec JTAGkey" },
{ 0x0403, 0x8A98, "TIAO Multi Protocol Adapter"},
{ 0x15BA, 0x0003, "Olimex Ltd. OpenOCD JTAG" },
{ 0x15BA, 0x0004, "Olimex Ltd. OpenOCD JTAG TINY" },
{ 0, 0, NULL }
};
struct mpsse_context *i2c_dev = NULL;
char i2c_adress;
int i;
struct ftdi_context *ftdi;
int f;//,i;
int i2c_open (int clockrate, int index, int port)
// PORT A - 1, PORT B - 2, ANY PORT - 0
// CLOCKRATE IN HERZ
// INDEX IS FOR SITUATION WHEN NO ONE FTDI MPSSE DEVICE IS CONNECTED TO PC (IF ONE DEVICE IS CONNECTED PLEASE SET INDEX TO ZERO, IF MULTIPLE DEVICES - INDEX MAY BE NOT ZERO)
{
i2c_dev = OpenIndex(0x0403, 0x6010, I2C, clockrate, MSB, port, NULL, NULL, index);
if (i2c_dev->open)
return 0; // ALL OK, RETURN ZERO
// NOT OK, CLOSING AND RETURNING NON-ZERO
Close(i2c_dev);
i2c_dev = NULL;
return 1;
}
void i2c_close ()
{
Close(i2c_dev);
i2c_dev = NULL;
}
int i2c_tx (char adress, char* data, int len, int stt, int stp)
{
if ((i2c_dev == NULL) || (i2c_dev->open == 0))
return 1; // NO OPENED DEVICE
if (stt)
Start (i2c_dev);
i2c_adress = (adress << 1) & (~0x01) ;
Write (i2c_dev, &i2c_adress, 1);
if (GetAck (i2c_dev) != ACK) {
if (stp)
Stop (i2c_dev);
return 10; // NO ACK ADRESS
}
Write (i2c_dev, data, len);
i = GetAck(i2c_dev);
if (stp)
Stop (i2c_dev);
if (i != ACK)
return 11; // NO ACK DATA
return 0;
}
int i2c_rx (char adress, char* data, int len, int stt, int stp)
{
char* temp_data;
if ((i2c_dev == NULL) || (i2c_dev->open == 0))
return 1;
if (stt)
Start (i2c_dev);
i2c_adress = (adress << 1) | (0x01) ;
Write (i2c_dev, &i2c_adress, 1);
if (GetAck (i2c_dev) != ACK) {
if (stp)
Stop (i2c_dev);
return 10; // NO ACK ADRESS
}
SendAcks (i2c_dev); // SEND ACKS WHEN DATA PROCESSING
temp_data = Read (i2c_dev, len);
/* Tell libmpsse to send NACKs after reading data */
SendNacks(i2c_dev);
/* Read in one dummy byte, with a NACK */
Read(i2c_dev, 1);
if (stp)
Stop (i2c_dev);
if (data) {
for (int i = 0; i < len; i++)
data[i] = temp_data[i];
free(temp_data);
return 0; // ALL GOOD
}
return 12; // UNKNOWN ERROR, NO DATA
}
int bitbang_open (int index, int port, int mask)
{
if ((ftdi = ftdi_new()) == 0)
{
fprintf(stderr, "ftdi_new failed\n");
return EXIT_FAILURE;
}
f = ftdi_usb_open_desc_index (ftdi, 0x0403, 0x6010, NULL, NULL, index);
if (f < 0 && f != -5)
{
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
ftdi_free(ftdi);
return 2;
}
f = ftdi_set_interface(ftdi, port);
if (f < 0 && f != -5)
{
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
ftdi_free(ftdi);
return 3;
}
ftdi_set_bitmode(ftdi, mask, BITMODE_BITBANG);
char buf[1] = {0xFF};
ftdi_write_data(ftdi, buf, 1);
buf[0] = 0x00;
ftdi_write_data(ftdi, buf, 1);
return 0;
}
void bitbang_close ()
{
ftdi_disable_bitbang(ftdi);
ftdi_usb_close(ftdi);
ftdi_free(ftdi);
}
int bitbang_read (char* pins)
{
return ftdi_read_pins(ftdi, pins);
}