# HG changeset patch # User Mychaela Falconia # Date 1694454084 0 # Node ID a5c4a82d01ab3dd8363a98e7029aff3a417c3408 # Parent 9ca4f9fa415ba032ed96f434905550d2b5825433 cp2102-read-partno program written, compiles diff -r 9ca4f9fa415b -r a5c4a82d01ab .hgignore --- a/.hgignore Mon Sep 11 04:55:27 2023 +0000 +++ b/.hgignore Mon Sep 11 17:41:24 2023 +0000 @@ -2,6 +2,8 @@ \.[oa]$ +^cp2102/cp2102-read-partno$ + ^duart28/fc-duart28-conf$ ^fteeprom/ftee-gen2232c$ diff -r 9ca4f9fa415b -r a5c4a82d01ab cp2102/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cp2102/Makefile Mon Sep 11 17:41:24 2023 +0000 @@ -0,0 +1,20 @@ +CC= gcc +CFLAGS= -O2 +PROGS= cp2102-read-partno +LIBS= ../libuwrap/libuwrap.a + +INSTALL_PREFIX= /opt/freecalypso + +INSTBIN=${INSTALL_PREFIX}/bin + +all: ${PROGS} + +cp2102-read-partno: read_partno.o ${LIBS} + ${CC} ${CFLAGS} -o $@ read_partno.o ${LIBS} -lusb + +install: + mkdir -p ${INSTBIN} + install -c ${PROGS} ${INSTBIN} + +clean: + rm -f ${PROGS} *.o *errs *.out diff -r 9ca4f9fa415b -r a5c4a82d01ab cp2102/cp210x_defs.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cp2102/cp210x_defs.h Mon Sep 11 17:41:24 2023 +0000 @@ -0,0 +1,35 @@ +/* + * Definitions for talking to CP2102 and perhaps other CP210x chips, + * taken from Python-based cp210x-program-1.0 tool from 2014, + * translated from Python to C. + */ + +#define CP210x_CONFIG 0xFF + +#define REG_VENDOR_ID 0x3701 +#define REG_PRODUCT_ID 0x3702 +#define REG_PRODUCT_STRING 0x3703 +#define REG_SERIAL_NUMBER 0x3704 +#define REG_CFG_ATTRIBUTES 0x3705 +#define REG_MAX_POWER 0x3706 +#define REG_VERSION 0x3707 +#define REG_UNKNOWN 0x3708 +#define REG_EEPROM 0x3709 +#define REG_LOCK_VALUE 0x370A +#define REG_PART_NUMBER 0x370B + +#define SIZE_EEPROM 0x0400 +#define SIZE_PRODUCT_STRING 255 +#define SIZE_SERIAL_NUMBER 128 +#define SIZE_BAUDRATES 32 +#define SIZE_BAUDRATE_CFG 10 +#define SIZE_BAUDRATE_TABLE (SIZE_BAUDRATES * SIZE_BAUDRATE_CFG) +#define SIZE_VENDOR_STRING 50 + +/* a little bit adapted from libftdi */ + +#define DEVICE_OUT_REQTYPE (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT) +#define DEVICE_IN_REQTYPE (USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN) + +#define USB_READ_TIMEOUT 5000 +#define USB_WRITE_TIMEOUT 5000 diff -r 9ca4f9fa415b -r a5c4a82d01ab cp2102/read_partno.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cp2102/read_partno.c Mon Sep 11 17:41:24 2023 +0000 @@ -0,0 +1,51 @@ +/* + * This program locates a presumed-CP2102 device via libusb and reads its + * vendor-specific part number register, seeking to distinguish between + * the original CP2102 and the later CP2102N. + */ + +#include +#include +#include +#include +#include +#include +#include +#include "../libuwrap/find_dev.h" +#include "cp210x_defs.h" + +main(argc, argv) + char **argv; +{ + struct usb_device *dev; + usb_dev_handle *usbh; + u_char partno; + int rc; + + if (argc != 2) { + fprintf(stderr, "usage: %s device-selector\n", argv[0]); + exit(1); + } + dev = find_usbdev_by_desc_string(argv[1]); + if (!dev) { + fprintf(stderr, "error: specified USB device not found\n"); + exit(1); + } + usbh = usb_open(dev); + if (!usbh) { + fprintf(stderr, "error: usb_open() failed\n"); + exit(1); + } + rc = usb_control_msg(usbh, DEVICE_IN_REQTYPE, CP210x_CONFIG, 0, + REG_PART_NUMBER, (char *) &partno, 1, + USB_READ_TIMEOUT); + if (rc != 1) { + fprintf(stderr, + "REG_PART_NUMBER read error: usb_control_msg() returned %d\n", + rc); + exit(1); + } + usb_close(usbh); + printf("0x%02X\n", partno); + exit(0); +}