3 /* According to POSIX.1-2001 */
4 #include <sys/select.h>
20 #define I_VENDOR_NUM 0x0403
21 #define I_PRODUCT_NUM 0x6001
22 #define BITMODE_CBUS 0x20
23 #define BITMODE_RESET 0x00
25 #define FTDI_SIO_SET_BITMODE 11 /* Set the bitmode */
26 #define FTDI_SIO_READ_PINS 12 /* Read pins in bitmode */
28 #define FTDI_SIO_SET_BITMODE_REQUEST FTDI_SIO_SET_BITMODE
29 #define FTDI_SIO_SET_BITMODE_REQUEST_TYPE 0x40
31 #define FTDI_SIO_READ_PINS_REQUEST FTDI_SIO_READ_PINS
32 #define FTDI_SIO_READ_PINS_REQUEST_TYPE 0xC0
44 /* Get current GPIO register from PL2303 */
45 unsigned char gpio_read_reg(libusb_device_handle
*h
)
48 int bytes
= libusb_control_transfer(
49 h
, // handle obtained with usb_open()
50 FTDI_SIO_READ_PINS_REQUEST_TYPE
, // bRequestType
51 FTDI_SIO_READ_PINS_REQUEST
, // bRequest
54 &buf
, // pointer to destination buffer
62 void gpio_write_reg(libusb_device_handle
*h
, unsigned short reg
)
64 int bytes
= libusb_control_transfer(
65 h
, // handle obtained with usb_open()
66 FTDI_SIO_SET_BITMODE_REQUEST_TYPE
, //bRequestType
67 FTDI_SIO_SET_BITMODE_REQUEST
, // bRequest
70 0, // pointer to destination buffer
78 void gpio_out(libusb_device_handle
*h
, int gpio
, int value
)
80 unsigned char cbus_mask
;
82 if ((gpio
< 0) || (gpio
> 3))
85 cbus_mask
= gpio_read_reg(h
);
86 cbus_mask
|= ((1 << gpio
) << 4);
88 cbus_mask
|= (1 << gpio
);
90 cbus_mask
&= ~(1 << gpio
);
91 gpio_write_reg(h
, (BITMODE_CBUS
<< 8) | cbus_mask
);
94 void gpio_in(libusb_device_handle
*h
, int gpio
, int pullup
)
96 unsigned char cbus_mask
;
98 if ((gpio
< 0) || (gpio
> 3))
101 cbus_mask
= gpio_read_reg(h
);
102 cbus_mask
&= ~((1 << gpio
) << 4);
103 gpio_write_reg(h
, (BITMODE_CBUS
<< 8) | cbus_mask
);
106 int gpio_read(libusb_device_handle
*h
, int gpio
)
108 unsigned char r
= gpio_read_reg(h
);
110 if ((gpio
< 0) || (gpio
> 3))
112 return (r
& (1 << gpio
)) ?
1 : 0;