From: Andrew 'Necromant' Andrianov Date: Sun, 8 Feb 2015 13:51:13 +0000 (+0300) Subject: Add cp2103 stuff X-Git-Tag: v0.1~20 X-Git-Url: http://git.linex4red.de/pub/pl2303-ft232-gpio.git/commitdiff_plain/ab4642a6138a9032e796cfca32aefcd518814148 Add cp2103 stuff Signed-off-by: Andrew 'Necromant' Andrianov --- diff --git a/10-pl2303userspace.rules b/10-pl2303userspace.rules index fe6af93..15fb336 100755 --- a/10-pl2303userspace.rules +++ b/10-pl2303userspace.rules @@ -1,5 +1,5 @@ # PL2303 rules to allow userspace access to the dongle # Copy this file to /etc/udev/rules.d, reload udev rules and replug -SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="67b", ATTR{idProduct}=="2303", GROUP="users", MODE="0666" - +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="67b", ATTR{idProduct}=="2303", GROUP="users", MODE="0666" +SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea60", GROUP="users", MODE="0666" diff --git a/Makefile b/Makefile index c7f3d1f..1fa1faa 100644 --- a/Makefile +++ b/Makefile @@ -3,15 +3,19 @@ LDFLAGS = $(shell pkg-config --libs libusb-1.0) PREFIX?=/usr/local -all: pl2303gpio +all: pl2303gpio cp2103gpio OBJS=usb.c main.c -pl2303gpio: $(OBJS) +pl2303gpio: $(OBJS) pl2303.o + $(CC) $(CFLAGS) -Wall -Werror -I"../include" -o $(@) $(^) $(LDFLAGS) -lusb + +cp2103gpio: $(OBJS) cp2103.o $(CC) $(CFLAGS) -Wall -Werror -I"../include" -o $(@) $(^) $(LDFLAGS) -lusb clean: - -rm pl2303gpio + -rm pl2303gpio cp2103gpio -install: pl2303gpio +install: pl2303gpio cp2103gpio cp pl2303gpio $(PREFIX)/bin - cp 10-pl2303userspace.rules /etc/udev/rules.d \ No newline at end of file + cp cp2103gpio $(PREFIX)/bin + cp 10-pl2303userspace.rules /etc/udev/rules.d diff --git a/cp2103.c b/cp2103.c new file mode 100644 index 0000000..5e4f61e --- /dev/null +++ b/cp2103.c @@ -0,0 +1,141 @@ +#include +#include +/* According to POSIX.1-2001 */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define _GNU_SOURCE +#include + + +#define I_VENDOR_NUM 0x10c4 +#define I_PRODUCT_NUM 0xea60 + + +#define VENDOR_READ_REQUEST_TYPE 0xc0 +#define VENDOR_READ_REQUEST 0x01 + +#define VENDOR_WRITE_REQUEST_TYPE 0x40 +#define VENDOR_WRITE_REQUEST 0x01 + +/* CP2103 GPIO */ +#define GPIO_0 0x01 +#define GPIO_1 0x02 +#define GPIO_2 0x04 +#define GPIO_3 0x08 +#define GPIO_MASK (GPIO_0|GPIO_1|GPIO_2|GPIO_3) + + + +//GPIO_READ +//ret = cp210x_ctlmsg(port, 0xff, 0xc0, 0x00c2, 0, gpio, 1); +//type c0 +//value c2 +//index 0 +//buffer 1 bytes +//length 1 + + +/* Get current GPIO register from PL2303 */ +char gpio_read_reg(usb_dev_handle *h) +{ + char buf; + int bytes = usb_control_msg( + h, // handle obtained with usb_open() + 0xc0, // bRequestType + 0xff, // bRequest + 0xc2, // wValue + 0, // wIndex + &buf, // pointer to destination buffer + 1, // wLength + 100 + ); + handle_error(bytes); + return buf; +} + +// GPIO_WRITE +//request 0xff +//type 0x40 +//value 0x37e1 +//index gpioreg +//data NULL +//len 0 +void gpio_write_reg(usb_dev_handle *h, uint16_t reg) +{ + int bytes = usb_control_msg( + h, // handle obtained with usb_open() + 0x40, // bRequestType + 0xff, // bRequest + 0x37e1, // wValue + reg, // wIndex + 0, // pointer to destination buffer + 0, // wLength + 6000 + ); + handle_error(bytes); +} + + +void gpio_out(usb_dev_handle *h, int gnum, int value) +{ + + uint16_t gpio = 0; + switch (gnum) { + case 0: + gpio |= GPIO_0; + if (value) + gpio |= (GPIO_0 << 8); + break; + case 1: + gpio |= GPIO_1; + if (value) + gpio |= (GPIO_1 << 8); + break; + case 2: + gpio |= GPIO_2; + if (value) + gpio |= (GPIO_2 << 8); + break; + case 3: + gpio |= GPIO_3; + if (value) + gpio |= (GPIO_3 << 8); + break; + } + gpio_write_reg(h, gpio); +} + +void gpio_in(usb_dev_handle *h, int gpio, int pullup) +{ + printf("FixMe: don't know how to make pins input on cp2103\n"); +} + +int gpio_read(usb_dev_handle *h, int gpio) +{ + printf("FixMe: don't know how to read pins on cp2103\n"); +} + + +extern usb_dev_handle *nc_usb_open(int vendor, int product, + const char *vendor_name, const char *product_name, const char *serial); +void check_handle(usb_dev_handle **h, const char* manuf, const char* product, const char* serial) +{ + if (*h) + return; + + *h = nc_usb_open(I_VENDOR_NUM, I_PRODUCT_NUM, manuf, product, serial); + if (!(*h)) { + fprintf(stderr, "No CP2103 USB device %04x:%04x found ;(\n", I_VENDOR_NUM, I_PRODUCT_NUM); + exit(1); + } +} diff --git a/main.c b/main.c index f24e40f..8efa7cb 100644 --- a/main.c +++ b/main.c @@ -17,15 +17,10 @@ #include -#define I_VENDOR_NUM 0x67b -#define I_PRODUCT_NUM 0x2303 - - -#define VENDOR_READ_REQUEST_TYPE 0xc0 -#define VENDOR_READ_REQUEST 0x01 - -#define VENDOR_WRITE_REQUEST_TYPE 0x40 -#define VENDOR_WRITE_REQUEST 0x01 +void check_handle(usb_dev_handle **h, const char* manuf, const char* product, const char* serial); +int gpio_read(usb_dev_handle *h, int gpio); +void gpio_in(usb_dev_handle *h, int gpio, int pullup); +void gpio_out(usb_dev_handle *h, int gpio, int value); void handle_error(int ret) @@ -37,111 +32,35 @@ void handle_error(int ret) } } - -/* Get current GPIO register from PL2303 */ -char gpio_read_reg(usb_dev_handle *h) -{ - char buf; - int bytes = usb_control_msg( - h, // handle obtained with usb_open() - VENDOR_READ_REQUEST_TYPE, // bRequestType - VENDOR_READ_REQUEST, // bRequest - 0x0081, // wValue - 0, // wIndex - &buf, // pointer to destination buffer - 1, // wLength - 100 - ); - handle_error(bytes); - return buf; -} - -void gpio_write_reg(usb_dev_handle *h, unsigned char reg) -{ - int bytes = usb_control_msg( - h, // handle obtained with usb_open() - VENDOR_WRITE_REQUEST_TYPE, // bRequestType - VENDOR_WRITE_REQUEST, // bRequest - 1, // wValue - reg, // wIndex - 0, // pointer to destination buffer - 0, // wLength - 6000 - ); - handle_error(bytes); - -} - -int gpio_dir_shift(int gpio) { - if (gpio == 0) - return 4; - if (gpio == 1) - return 5; - return 4; /* default to 0 */ -} - -int gpio_val_shift(int gpio) { - if (gpio == 0) - return 6; - if (gpio == 1) - return 7; - return 6; /* default to 0 */ -} - - -void gpio_out(usb_dev_handle *h, int gpio, int value) -{ - int shift_dir = gpio_dir_shift(gpio); - int shift_val = gpio_val_shift(gpio); - unsigned char reg = gpio_read_reg(h); - reg |= (1 << shift_dir); - reg &= ~(1 << shift_val); - reg |= (value << shift_val); - gpio_write_reg(h, reg); -} - -void gpio_in(usb_dev_handle *h, int gpio, int pullup) -{ - int shift_dir = gpio_dir_shift(gpio); - int shift_val = gpio_val_shift(gpio); - - unsigned char reg = gpio_read_reg(h); - reg &= ~(1 << shift_dir); - reg &= ~(1 << shift_val); - reg |= (pullup << shift_val); - gpio_write_reg(h, reg); -} - -int gpio_read(usb_dev_handle *h, int gpio) -{ - unsigned char r = gpio_read_reg(h); - int shift = gpio_val_shift(gpio); - return (r & (1< +#include +/* According to POSIX.1-2001 */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define _GNU_SOURCE +#include + + +#define I_VENDOR_NUM 0x67b +#define I_PRODUCT_NUM 0x2303 + + +#define VENDOR_READ_REQUEST_TYPE 0xc0 +#define VENDOR_READ_REQUEST 0x01 + +#define VENDOR_WRITE_REQUEST_TYPE 0x40 +#define VENDOR_WRITE_REQUEST 0x01 + + + +/* Get current GPIO register from PL2303 */ +char gpio_read_reg(usb_dev_handle *h) +{ + char buf; + int bytes = usb_control_msg( + h, // handle obtained with usb_open() + VENDOR_READ_REQUEST_TYPE, // bRequestType + VENDOR_READ_REQUEST, // bRequest + 0x0081, // wValue + 0, // wIndex + &buf, // pointer to destination buffer + 1, // wLength + 100 + ); + handle_error(bytes); + return buf; +} + +void gpio_write_reg(usb_dev_handle *h, unsigned char reg) +{ + int bytes = usb_control_msg( + h, // handle obtained with usb_open() + VENDOR_WRITE_REQUEST_TYPE, // bRequestType + VENDOR_WRITE_REQUEST, // bRequest + 1, // wValue + reg, // wIndex + 0, // pointer to destination buffer + 0, // wLength + 6000 + ); + handle_error(bytes); + +} + +int gpio_dir_shift(int gpio) { + if (gpio == 0) + return 4; + if (gpio == 1) + return 5; + return 4; /* default to 0 */ +} + +int gpio_val_shift(int gpio) { + if (gpio == 0) + return 6; + if (gpio == 1) + return 7; + return 6; /* default to 0 */ +} + + +void gpio_out(usb_dev_handle *h, int gpio, int value) +{ + int shift_dir = gpio_dir_shift(gpio); + int shift_val = gpio_val_shift(gpio); + unsigned char reg = gpio_read_reg(h); + reg |= (1 << shift_dir); + reg &= ~(1 << shift_val); + reg |= (value << shift_val); + gpio_write_reg(h, reg); +} + +void gpio_in(usb_dev_handle *h, int gpio, int pullup) +{ + int shift_dir = gpio_dir_shift(gpio); + int shift_val = gpio_val_shift(gpio); + + unsigned char reg = gpio_read_reg(h); + reg &= ~(1 << shift_dir); + reg &= ~(1 << shift_val); + reg |= (pullup << shift_val); + gpio_write_reg(h, reg); +} + +int gpio_read(usb_dev_handle *h, int gpio) +{ + unsigned char r = gpio_read_reg(h); + int shift = gpio_val_shift(gpio); + return (r & (1<