Commit | Line | Data |
---|---|---|
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 | 37 | int 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 | } |