-/* This program is distributed under the GPL, version 2 */
+/* bitbang_ft2232.c
+
+ Output some flickering in bitbang mode to the FT2232
+
+ Thanks to max@koeln.ccc.de for fixing and extending
+ the example for the second channel.
+
+ This program is distributed under the GPL, version 2
+*/
#include <stdio.h>
+#include <stdlib.h>
#include <unistd.h>
#include <ftdi.h>
int main(int argc, char **argv)
{
- struct ftdi_context ftdic,ftdic2;
+ struct ftdi_context *ftdi, *ftdi2;
+ unsigned char buf[1];
int f,i;
- ftdi_init(&ftdic);
-
- f = ftdi_usb_open(&ftdic, 0x0403, 0x6001);
-
- if(f < 0 && f != -5) {
- fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic));
- exit(-1);
+ // Init 1. channel
+ if ((ftdi = ftdi_new()) == 0)
+ {
+ fprintf(stderr, "ftdi_new failed\n");
+ return EXIT_FAILURE;
}
- printf("ftdi open succeeded: %d\n",f);
-
- printf("enabling bitbang mode\n");
- ftdi_enable_bitbang(&ftdic, 0xFF);
-
- ftdic2.interface=1;
- ftdic2.index=1;
- ftdic2.out_ep=0x83;
- ftdic2.in_ep=0x4;
-
- f = ftdi_usb_open(&ftdic2, 0x0403, 0x6001);
-
- if(f < 0 && f != -5) {
- fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic));
+ ftdi_set_interface(ftdi, INTERFACE_A);
+ f = ftdi_usb_open(ftdi, 0x0403, 0x6001);
+ if (f < 0 && f != -5)
+ {
+ fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
+ ftdi_free(ftdi);
exit(-1);
}
+ printf("ftdi open succeeded(channel 1): %d\n",f);
- printf("ftdi open succeeded: %d\n",f);
+ printf("enabling bitbang mode(channel 1)\n");
+ ftdi_set_bitmode(ftdi, 0xFF, BITMODE_BITBANG);
- printf("enabling bitbang mode\n");
- ftdi_enable_bitbang(&ftdic2, 0xFF);
-
-
- char buf[1];
-
- sleep(3);
-
- buf[0] = 0x0;
- printf("turning everything on\n");
- f = ftdi_write_data(&ftdic, buf, 1);
- if(f < 0) {
- fprintf(stderr,"write failed for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(&ftdic));
+ // Init 2. channel
+ if ((ftdi2 = ftdi_new()) == 0)
+ {
+ fprintf(stderr, "ftdi_new failed\n");
+ return EXIT_FAILURE;
}
-
- sleep(3);
-
- buf[0] = 0xFF;
- printf("turning everything off\n");
- f = ftdi_write_data(&ftdic, buf, 1);
- if(f < 0) {
- fprintf(stderr,"write failed for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(&ftdic));
+ ftdi_set_interface(ftdi2, INTERFACE_B);
+ f = ftdi_usb_open(ftdi2, 0x0403, 0x6001);
+ if (f < 0 && f != -5)
+ {
+ fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi2));
+ ftdi_free(ftdi2);
+ exit(-1);
}
-
- sleep(3);
-
- for(i = 0; i < 32; i++) {
- buf[0] = 0 | (0xFF ^ 1 << (i % 8));
- if( i > 0 && (i % 8) == 0) {
- printf("\n");
- }
- printf("%02hhx ",buf[0]);
- fflush(stdout);
- f = ftdi_write_data(&ftdic, buf, 1);
- if(f < 0) {
- fprintf(stderr,"write failed for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(&ftdic));
- }
- sleep(1);
+ printf("ftdi open succeeded(channel 2): %d\n",f);
+
+ printf("enabling bitbang mode (channel 2)\n");
+ ftdi_set_bitmode(ftdi2, 0xFF, BITMODE_BITBANG);
+
+ // Write data
+ printf("startloop\n");
+ for (i = 0; i < 23; i++)
+ {
+ buf[0] = 0x1;
+ printf("porta: %02i: 0x%02x \n",i,buf[0]);
+ f = ftdi_write_data(ftdi, buf, 1);
+ if (f < 0)
+ fprintf(stderr,"write failed on channel 1 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi));
+ usleep(1 * 1000000);
+
+ buf[0] = 0x2;
+ printf("porta: %02i: 0x%02x \n",i,buf[0]);
+ f = ftdi_write_data(ftdi, buf, 1);
+ if (f < 0)
+ fprintf(stderr,"write failed on channel 1 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi));
+ usleep(1 * 1000000);
+
+ buf[0] = 0x1;
+ printf("portb: %02i: 0x%02x \n",i,buf[0]);
+ f = ftdi_write_data(ftdi2, buf, 1);
+ if (f < 0)
+ fprintf(stderr,"write failed on channel 2 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi2));
+ usleep(1 * 1000000);
+
+ buf[0] = 0x2;
+ printf("portb: %02i: 0x%02x \n",i,buf[0]);
+ f = ftdi_write_data(ftdi2, buf, 1);
+ if (f < 0)
+ fprintf(stderr,"write failed on channel 2 for 0x%x, error %d (%s)\n", buf[0], f, ftdi_get_error_string(ftdi2));
+ usleep(1 * 1000000);
}
-
printf("\n");
- printf("disabling bitbang mode\n");
- ftdi_disable_bitbang(&ftdic);
+ printf("disabling bitbang mode(channel 1)\n");
+ ftdi_disable_bitbang(ftdi);
+ ftdi_usb_close(ftdi);
+ ftdi_free(ftdi);
+
+ printf("disabling bitbang mode(channel 2)\n");
+ ftdi_disable_bitbang(ftdi2);
+ ftdi_usb_close(ftdi2);
+ ftdi_free(ftdi2);
- ftdi_usb_close(&ftdic);
- ftdi_deinit(&ftdic);
+ return 0;
}