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 | ||
37 | int 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 | } |