95 lines
2.6 KiB
C
95 lines
2.6 KiB
C
/* bitbang_cbus.c
|
||
|
||
Example to use CBUS bitbang mode of newer chipsets.
|
||
You must enable CBUS bitbang mode in the EEPROM first.
|
||
|
||
Thanks to Steve Brown <sbrown@ewol.com> for the
|
||
the information how to do it.
|
||
|
||
The top nibble controls input/output and the bottom nibble
|
||
controls the state of the lines set to output. The datasheet isn't clear
|
||
what happens if you set a bit in the output register when that line is
|
||
conditioned for input. This is described in more detail
|
||
in the FT232R bitbang app note.
|
||
|
||
BITMASK
|
||
CBUS Bits
|
||
3210 3210
|
||
xxxx xxxx
|
||
| |------ Output Control 0->LO, 1->HI
|
||
|----------- Input/Output 0->Input, 1->Output
|
||
|
||
Example:
|
||
All pins to output with 0 bit high: 0xF1 (11110001)
|
||
Bits 0 and 1 to input, 2 and 3 to output and masked high: 0xCC (11001100)
|
||
|
||
The input is standard "0x" hex notation.
|
||
A carriage return terminates the program.
|
||
|
||
This program is distributed under the GPL, version 2
|
||
*/
|
||
|
||
#include <stdio.h>
|
||
#include <unistd.h>
|
||
#include <stdlib.h>
|
||
#include <ftdi.h>
|
||
|
||
int main(void)
|
||
{
|
||
struct ftdi_context *ftdi;
|
||
int f;
|
||
unsigned char buf[1];
|
||
unsigned char bitmask;
|
||
char input[10];
|
||
|
||
if ((ftdi = ftdi_new()) == 0)
|
||
{
|
||
fprintf(stderr, "ftdi_new failed\n");
|
||
return EXIT_FAILURE;
|
||
}
|
||
|
||
f = ftdi_usb_open(ftdi, 0x0403, 0x6001);
|
||
if (f < 0 && f != -5)
|
||
{
|
||
fprintf(stderr, "unable to open ftdi device: %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||
ftdi_deinit(ftdi);
|
||
exit(-1);
|
||
}
|
||
printf("ftdi open succeeded: %d\n",f);
|
||
|
||
while (1)
|
||
{
|
||
// Set bitmask from input
|
||
fgets(input, sizeof(input) - 1, stdin);
|
||
if (input[0] == '\n') break;
|
||
bitmask = strtol(input, NULL, 0);
|
||
printf("Using bitmask 0x%02x\n", bitmask);
|
||
f = ftdi_set_bitmode(ftdi, bitmask, BITMODE_CBUS);
|
||
if (f < 0)
|
||
{
|
||
fprintf(stderr, "set_bitmode failed for 0x%x, error %d (%s)\n", bitmask, f, ftdi_get_error_string(ftdi));
|
||
ftdi_usb_close(ftdi);
|
||
ftdi_deinit(ftdi);
|
||
exit(-1);
|
||
}
|
||
|
||
// read CBUS
|
||
f = ftdi_read_pins(ftdi, &buf[0]);
|
||
if (f < 0)
|
||
{
|
||
fprintf(stderr, "read_pins failed, error %d (%s)\n", f, ftdi_get_error_string(ftdi));
|
||
ftdi_usb_close(ftdi);
|
||
ftdi_deinit(ftdi);
|
||
exit(-1);
|
||
}
|
||
printf("Read returned 0x%01x\n", buf[0] & 0x0f);
|
||
}
|
||
printf("disabling bitbang mode\n");
|
||
ftdi_disable_bitbang(ftdi);
|
||
|
||
ftdi_usb_close(ftdi);
|
||
ftdi_free(ftdi);
|
||
|
||
return 0;
|
||
}
|