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); | |
48 | if(f < 0 && f != -5) { | |
49 | fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(&ftdic)); | |
50 | exit(-1); | |
51 | } | |
52 | printf("ftdi open succeeded: %d\n",f); | |
53 | ||
c84c9109 TJ |
54 | while (1) { |
55 | // Set bitmask from input | |
56 | fgets(input, sizeof(input) - 1, stdin); | |
57 | if (input[0] == '\n') break; | |
58 | bitmask = strtol(input, NULL, 0); | |
59 | printf("Using bitmask 0x%02x\n", bitmask); | |
60 | f = ftdi_set_bitmode(&ftdic, bitmask, BITMODE_CBUS); | |
61 | if (f < 0) { | |
62 | fprintf(stderr, "set_bitmode failed for 0x%x, error %d (%s)\n", bitmask, f, ftdi_get_error_string(&ftdic)); | |
63 | exit(-1); | |
64 | } | |
cb2d4d24 | 65 | |
c84c9109 TJ |
66 | // read CBUS |
67 | f = ftdi_read_pins(&ftdic, &buf[0]); | |
68 | if (f < 0) { | |
69 | fprintf(stderr, "read_pins failed, error %d (%s)\n", f, ftdi_get_error_string(&ftdic)); | |
70 | exit(-1); | |
71 | } | |
72 | printf("Read returned 0x%01x\n", buf[0] & 0x0f); | |
cb2d4d24 | 73 | } |
cb2d4d24 TJ |
74 | printf("disabling bitbang mode\n"); |
75 | ftdi_disable_bitbang(&ftdic); | |
76 | ||
77 | ftdi_usb_close(&ftdic); | |
78 | ftdi_deinit(&ftdic); | |
79 | } |