3 /* According to POSIX.1-2001 */
4 #include <sys/select.h>
20 #define I_VENDOR_NUM 0x67b
21 #define I_PRODUCT_NUM 0x2303
24 #define VENDOR_READ_REQUEST_TYPE 0xc0
25 #define VENDOR_READ_REQUEST 0x01
27 #define VENDOR_WRITE_REQUEST_TYPE 0x40
28 #define VENDOR_WRITE_REQUEST 0x01
41 /* Get current GPIO register from PL2303 */
42 char gpio_read_reg(libusb_device_handle
*h
)
45 int bytes
= libusb_control_transfer(
46 h
, // handle obtained with usb_open()
47 VENDOR_READ_REQUEST_TYPE
, // bRequestType
48 VENDOR_READ_REQUEST
, // bRequest
51 &buf
, // pointer to destination buffer
59 void gpio_write_reg(libusb_device_handle
*h
, unsigned char reg
)
61 int bytes
= libusb_control_transfer(
62 h
, // handle obtained with usb_open()
63 VENDOR_WRITE_REQUEST_TYPE
, // bRequestType
64 VENDOR_WRITE_REQUEST
, // bRequest
67 0, // pointer to destination buffer
75 int gpio_dir_shift(int gpio
) {
80 return 4; /* default to 0 */
83 int gpio_val_shift(int gpio
) {
88 return 6; /* default to 0 */
92 void gpio_out(libusb_device_handle
*h
, int gpio
, int value
)
94 int shift_dir
= gpio_dir_shift(gpio
);
95 int shift_val
= gpio_val_shift(gpio
);
96 unsigned char reg
= gpio_read_reg(h
);
97 reg
|= (1 << shift_dir
);
98 reg
&= ~(1 << shift_val
);
99 reg
|= (value
<< shift_val
);
100 gpio_write_reg(h
, reg
);
103 void gpio_in(libusb_device_handle
*h
, int gpio
, int pullup
)
105 int shift_dir
= gpio_dir_shift(gpio
);
106 int shift_val
= gpio_val_shift(gpio
);
108 unsigned char reg
= gpio_read_reg(h
);
109 reg
&= ~(1 << shift_dir
);
110 reg
&= ~(1 << shift_val
);
111 reg
|= (pullup
<< shift_val
);
112 gpio_write_reg(h
, reg
);
115 int gpio_read(libusb_device_handle
*h
, int gpio
)
117 unsigned char r
= gpio_read_reg(h
);
118 int shift
= gpio_val_shift(gpio
);
119 return (r
& (1<<shift
));