Initial import of using libusb-1.0.
[libftdi] / examples / bitbang_cbus.c
CommitLineData
cb2d4d24
TJ
1/* bitbang_cbus.c
2
3 Example to use CBUS bitbang mode of newer chipsets.
4 You must enable CBUS bitbang mode in the EEPROM first.
5
6 Thanks to Steve Brown <sbrown@ewol.com> for the
7 the information how to do it.
8
9 The top nibble controls input/output and the bottom nibble
10 controls the state of the lines set to output. The datasheet isn't clear
11 what happens if you set a bit in the output register when that line is
12 conditioned for input. This is described in more detail
13 in the FT232R bitbang app note.
14
15 BITMASK
16 CBUS Bits
17 3210 3210
18 xxxx xxxx
19 |    |------ Output Control 0->LO, 1->HI
20 |----------- Input/Output   0->Input, 1->Output
21
22 Example:
23 All pins to output with 0 bit high: 0xF1 (11110001)
24 Bits 0 and 1 to input, 2 and 3 to output and masked high: 0xCC (11001100)
25
c84c9109
TJ
26 The input is standard "0x" hex notation.
27 A carriage return terminates the program.
28
cb2d4d24
TJ
29 This program is distributed under the GPL, version 2
30*/
31
32#include <stdio.h>
33#include <unistd.h>
c84c9109 34#include <stdlib.h>
cb2d4d24
TJ
35#include <ftdi.h>
36
6ac169ea 37int main(void)
cb2d4d24
TJ
38{
39 struct ftdi_context ftdic;
6ac169ea 40 int f;
c84c9109 41 unsigned char buf[1];
cb2d4d24 42 unsigned char bitmask;
579b006f 43 char input[10];
cb2d4d24 44
6ac169ea
TJ
45 if (ftdi_init(&ftdic) < 0)
46 {
47 fprintf(stderr, "ftdi_init failed\n");
48 return EXIT_FAILURE;
49 }
cb2d4d24
TJ
50
51 f = ftdi_usb_open(&ftdic, 0x0403, 0x6001);
22d12cda
TJ
52 if (f < 0 && f != -5)
53 {
cb2d4d24
TJ
54 fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic));
55 exit(-1);
56 }
57 printf("ftdi open succeeded: %d\n",f);
58
22d12cda
TJ
59 while (1)
60 {
c84c9109
TJ
61 // Set bitmask from input
62 fgets(input, sizeof(input) - 1, stdin);
63 if (input[0] == '\n') break;
64 bitmask = strtol(input, NULL, 0);
65 printf("Using bitmask 0x%02x\n", bitmask);
66 f = ftdi_set_bitmode(&ftdic, bitmask, BITMODE_CBUS);
22d12cda
TJ
67 if (f < 0)
68 {
c84c9109
TJ
69 fprintf(stderr, "set_bitmode failed for 0x%x, error %d (%s)\n", bitmask, f, ftdi_get_error_string(&ftdic));
70 exit(-1);
71 }
cb2d4d24 72
c84c9109
TJ
73 // read CBUS
74 f = ftdi_read_pins(&ftdic, &buf[0]);
22d12cda
TJ
75 if (f < 0)
76 {
c84c9109
TJ
77 fprintf(stderr, "read_pins failed, error %d (%s)\n", f, ftdi_get_error_string(&ftdic));
78 exit(-1);
79 }
80 printf("Read returned 0x%01x\n", buf[0] & 0x0f);
cb2d4d24 81 }
cb2d4d24
TJ
82 printf("disabling bitbang mode\n");
83 ftdi_disable_bitbang(&ftdic);
84
85 ftdi_usb_close(&ftdic);
86 ftdi_deinit(&ftdic);
579b006f
JZ
87
88 return 0;
cb2d4d24 89}