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
30 #define GPIO_01_RD_CTRL 0x0081
31 #define GPIO_01_WR_CTRL 0x0001
32 #define GPIO_23_DIR_RD_CTRL 0x8c8c
33 #define GPIO_23_DIR_WR_CTRL 0x0c0c
34 #define GPIO_23_VAL_RD_CTRL 0x8d8d
35 #define GPIO_23_VAL_WR_CTRL 0x0d0d
47 /* Get current GPIO register from PL2303 */
48 char gpio_read_reg(libusb_device_handle
*h
, unsigned short ctrl
)
51 int bytes
= libusb_control_transfer(
52 h
, // handle obtained with usb_open()
53 VENDOR_READ_REQUEST_TYPE
, // bRequestType
54 VENDOR_READ_REQUEST
, // bRequest
57 &buf
, // pointer to destination buffer
65 void gpio_write_reg(libusb_device_handle
*h
, unsigned short ctrl
, unsigned char reg
)
67 int bytes
= libusb_control_transfer(
68 h
, // handle obtained with usb_open()
69 VENDOR_WRITE_REQUEST_TYPE
, // bRequestType
70 VENDOR_WRITE_REQUEST
, // bRequest
73 0, // pointer to destination buffer
80 int gpio_dir_mask(int gpio
) {
87 return 0x10; /* default to gpio 0 */
90 int gpio_val_shift(int gpio
) {
97 return 6; /* default to gpio 0 */
101 void gpio_out(libusb_device_handle
*h
, int gpio
, int value
)
103 int shift_val
= gpio_val_shift(gpio
);
107 reg
= gpio_read_reg(h
, GPIO_01_RD_CTRL
);
108 reg
|= gpio_dir_mask(gpio
); /* set output direction */
109 reg
&= ~(1 << shift_val
); /* reset gpio */
110 reg
|= (value
<< shift_val
); /* set gpio to value */
111 gpio_write_reg(h
, GPIO_01_WR_CTRL
, reg
);
113 reg
= gpio_read_reg(h
, GPIO_23_VAL_RD_CTRL
);
114 reg
&= ~(1 << shift_val
); /* reset gpio */
115 reg
|= (value
<< shift_val
); /* set gpio to value */
116 gpio_write_reg(h
, GPIO_23_VAL_WR_CTRL
, reg
);
118 reg
= gpio_read_reg(h
, GPIO_23_DIR_RD_CTRL
);
119 reg
|= gpio_dir_mask(gpio
); /* set output direction */
120 gpio_write_reg(h
, GPIO_23_DIR_WR_CTRL
, reg
);
124 void gpio_in(libusb_device_handle
*h
, int gpio
, int pullup
)
126 int shift_val
= gpio_val_shift(gpio
);
130 reg
= gpio_read_reg(h
, GPIO_01_RD_CTRL
);
131 reg
&= ~(gpio_dir_mask(gpio
)); /* set input direction */
132 reg
&= ~(1 << shift_val
); /* reset gpio value */
133 reg
|= (pullup
<< shift_val
); /* pullup gpio value */
134 gpio_write_reg(h
, GPIO_01_WR_CTRL
, reg
);
136 reg
= gpio_read_reg(h
, GPIO_23_DIR_RD_CTRL
);
137 reg
&= ~(gpio_dir_mask(gpio
)); /* set input direction */
138 gpio_write_reg(h
, GPIO_23_DIR_WR_CTRL
, reg
);
140 reg
= gpio_read_reg(h
, GPIO_23_VAL_RD_CTRL
);
141 reg
&= ~(1 << shift_val
); /* reset gpio value */
142 reg
|= (pullup
<< shift_val
); /* pullup gpio value */
143 gpio_write_reg(h
, GPIO_23_VAL_WR_CTRL
, reg
);
147 int gpio_read(libusb_device_handle
*h
, int gpio
)
149 unsigned char r
= gpio_read_reg(h
, (2 > gpio
) ? GPIO_01_RD_CTRL
: GPIO_23_VAL_RD_CTRL
);
150 int shift
= gpio_val_shift(gpio
);
151 return (r
& (1 << shift
));