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;
|
|||
|
}
|