Fix eeprom decoding of BM chip type: The previous code resulted in a temporary 1...
[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
37int main(int argc, char **argv)
38{
39 struct ftdi_context ftdic;
40 int f,i;
c84c9109 41 unsigned char buf[1];
cb2d4d24 42 unsigned char bitmask;
c84c9109 43 unsigned char input[10];
cb2d4d24
TJ
44
45 ftdi_init(&ftdic);
46
47 f = ftdi_usb_open(&ftdic, 0x0403, 0x6001);
22d12cda
TJ
48 if (f < 0 && f != -5)
49 {
cb2d4d24
TJ
50 fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic));
51 exit(-1);
52 }
53 printf("ftdi open succeeded: %d\n",f);
54
22d12cda
TJ
55 while (1)
56 {
c84c9109
TJ
57 // Set bitmask from input
58 fgets(input, sizeof(input) - 1, stdin);
59 if (input[0] == '\n') break;
60 bitmask = strtol(input, NULL, 0);
61 printf("Using bitmask 0x%02x\n", bitmask);
62 f = ftdi_set_bitmode(&ftdic, bitmask, BITMODE_CBUS);
22d12cda
TJ
63 if (f < 0)
64 {
c84c9109
TJ
65 fprintf(stderr, "set_bitmode failed for 0x%x, error %d (%s)\n", bitmask, f, ftdi_get_error_string(&ftdic));
66 exit(-1);
67 }
cb2d4d24 68
c84c9109
TJ
69 // read CBUS
70 f = ftdi_read_pins(&ftdic, &buf[0]);
22d12cda
TJ
71 if (f < 0)
72 {
c84c9109
TJ
73 fprintf(stderr, "read_pins failed, error %d (%s)\n", f, ftdi_get_error_string(&ftdic));
74 exit(-1);
75 }
76 printf("Read returned 0x%01x\n", buf[0] & 0x0f);
cb2d4d24 77 }
cb2d4d24
TJ
78 printf("disabling bitbang mode\n");
79 ftdi_disable_bitbang(&ftdic);
80
81 ftdi_usb_close(&ftdic);
82 ftdi_deinit(&ftdic);
83}