Fix all leak in the examples shown with no device connected
[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];
4cc3fa8a 44 int retval = 0;
cb2d4d24 45
6ac169ea
TJ
46 if (ftdi_init(&ftdic) < 0)
47 {
48 fprintf(stderr, "ftdi_init failed\n");
49 return EXIT_FAILURE;
50 }
cb2d4d24
TJ
51
52 f = ftdi_usb_open(&ftdic, 0x0403, 0x6001);
22d12cda
TJ
53 if (f < 0 && f != -5)
54 {
cb2d4d24 55 fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic));
4cc3fa8a 56 ftdi_deinit(&ftdic);
cb2d4d24
TJ
57 exit(-1);
58 }
59 printf("ftdi open succeeded: %d\n",f);
60
22d12cda
TJ
61 while (1)
62 {
c84c9109
TJ
63 // Set bitmask from input
64 fgets(input, sizeof(input) - 1, stdin);
65 if (input[0] == '\n') break;
66 bitmask = strtol(input, NULL, 0);
67 printf("Using bitmask 0x%02x\n", bitmask);
68 f = ftdi_set_bitmode(&ftdic, bitmask, BITMODE_CBUS);
22d12cda
TJ
69 if (f < 0)
70 {
c84c9109 71 fprintf(stderr, "set_bitmode failed for 0x%x, error %d (%s)\n", bitmask, f, ftdi_get_error_string(&ftdic));
4cc3fa8a
UB
72 ftdi_usb_close(&ftdic);
73 ftdi_deinit(&ftdic);
74 retval = -1;
c84c9109 75 }
cb2d4d24 76
c84c9109
TJ
77 // read CBUS
78 f = ftdi_read_pins(&ftdic, &buf[0]);
22d12cda
TJ
79 if (f < 0)
80 {
c84c9109 81 fprintf(stderr, "read_pins failed, error %d (%s)\n", f, ftdi_get_error_string(&ftdic));
4cc3fa8a
UB
82 ftdi_usb_close(&ftdic);
83 ftdi_deinit(&ftdic);
c84c9109
TJ
84 exit(-1);
85 }
86 printf("Read returned 0x%01x\n", buf[0] & 0x0f);
cb2d4d24 87 }
cb2d4d24
TJ
88 printf("disabling bitbang mode\n");
89 ftdi_disable_bitbang(&ftdic);
90
91 ftdi_usb_close(&ftdic);
92 ftdi_deinit(&ftdic);
579b006f
JZ
93
94 return 0;
cb2d4d24 95}