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
32 /* Get current GPIO register from PL2303 */
33 char gpio_read_reg(usb_dev_handle
*h
)
36 int bytes
= usb_control_msg(
37 h
, // handle obtained with usb_open()
38 VENDOR_READ_REQUEST_TYPE
, // bRequestType
39 VENDOR_READ_REQUEST
, // bRequest
42 &buf
, // pointer to destination buffer
50 void gpio_write_reg(usb_dev_handle
*h
, unsigned char reg
)
52 int bytes
= usb_control_msg(
53 h
, // handle obtained with usb_open()
54 VENDOR_WRITE_REQUEST_TYPE
, // bRequestType
55 VENDOR_WRITE_REQUEST
, // bRequest
58 0, // pointer to destination buffer
66 int gpio_dir_shift(int gpio
) {
71 return 4; /* default to 0 */
74 int gpio_val_shift(int gpio
) {
79 return 6; /* default to 0 */
83 void gpio_out(usb_dev_handle
*h
, int gpio
, int value
)
85 int shift_dir
= gpio_dir_shift(gpio
);
86 int shift_val
= gpio_val_shift(gpio
);
87 unsigned char reg
= gpio_read_reg(h
);
88 reg
|= (1 << shift_dir
);
89 reg
&= ~(1 << shift_val
);
90 reg
|= (value
<< shift_val
);
91 gpio_write_reg(h
, reg
);
94 void gpio_in(usb_dev_handle
*h
, int gpio
, int pullup
)
96 int shift_dir
= gpio_dir_shift(gpio
);
97 int shift_val
= gpio_val_shift(gpio
);
99 unsigned char reg
= gpio_read_reg(h
);
100 reg
&= ~(1 << shift_dir
);
101 reg
&= ~(1 << shift_val
);
102 reg
|= (pullup
<< shift_val
);
103 gpio_write_reg(h
, reg
);
106 int gpio_read(usb_dev_handle
*h
, int gpio
)
108 unsigned char r
= gpio_read_reg(h
);
109 int shift
= gpio_val_shift(gpio
);
110 return (r
& (1<<shift
));
113 extern usb_dev_handle
*nc_usb_open(int vendor
, int product
, char *vendor_name
, char *product_name
, char *serial
);
114 void check_handle(usb_dev_handle
**h
, const char* manuf
, const char* product
, const char* serial
)
119 *h
= nc_usb_open(I_VENDOR_NUM
, I_PRODUCT_NUM
, manuf
, product
, serial
);
121 fprintf(stderr
, "No PL2303 USB device %04x:%04x found ;(\n", I_VENDOR_NUM
, I_PRODUCT_NUM
);