Change in osmo-ccid-firmware[master]: Re-structure USB descriptors

Harald Welte gerrit-no-reply at lists.osmocom.org
Sat May 11 18:19:47 UTC 2019


Harald Welte has uploaded this change for review. ( https://gerrit.osmocom.org/13998


Change subject: Re-structure USB descriptors
......................................................................

Re-structure USB descriptors

Use structures to define the USB descriptors of the sysmoOCTSIM device.

While at it, turn it from a pure CDC-ACM to a CDC-ACM + CCID interface,
so we can expose a virtual UART at the same time as the chip card reader
device.

Change-Id: I0423d733476f37c16bdb6abc651b7ad5ca7ac63e
---
M sysmoOCTSIM/atmel_start.c
M sysmoOCTSIM/config/hpl_usb_config.h
M sysmoOCTSIM/gcc/Makefile
A sysmoOCTSIM/usb_descriptors.c
M sysmoOCTSIM/usb_start.c
5 files changed, 250 insertions(+), 25 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/98/13998/1

diff --git a/sysmoOCTSIM/atmel_start.c b/sysmoOCTSIM/atmel_start.c
index fd566dd..bee1ed2 100644
--- a/sysmoOCTSIM/atmel_start.c
+++ b/sysmoOCTSIM/atmel_start.c
@@ -12,8 +12,8 @@
 void atmel_start_init(void)
 {
 	system_init();
-	usb_init();
 	dma_memory_init();
 	dma_memory_register_callback(DMA_MEMORY_COMPLETE_CB, M2M_DMA_complete_cb);
 	stdio_redirect_init();
+	usb_init();
 }
diff --git a/sysmoOCTSIM/config/hpl_usb_config.h b/sysmoOCTSIM/config/hpl_usb_config.h
index 73a9fea..bbfd99d 100644
--- a/sysmoOCTSIM/config/hpl_usb_config.h
+++ b/sysmoOCTSIM/config/hpl_usb_config.h
@@ -39,7 +39,7 @@
 // <CONF_USB_D_N_EP_MAX"> Max possible (by "Max Endpoint Number" config)
 // <id> usbd_num_ep_sp
 #ifndef CONF_USB_D_NUM_EP_SP
-#define CONF_USB_D_NUM_EP_SP CONF_USB_N_4
+#define CONF_USB_D_NUM_EP_SP CONF_USB_N_6
 #endif
 
 // </h>
@@ -60,7 +60,7 @@
 // <i> The number of physical endpoints - 1
 // <id> usbd_arch_max_ep_n
 #ifndef CONF_USB_D_MAX_EP_N
-#define CONF_USB_D_MAX_EP_N CONF_USB_N_2
+#define CONF_USB_D_MAX_EP_N CONF_USB_N_4
 #endif
 
 // <y> USB Speed Limit
diff --git a/sysmoOCTSIM/gcc/Makefile b/sysmoOCTSIM/gcc/Makefile
index 080aa41..7684204 100644
--- a/sysmoOCTSIM/gcc/Makefile
+++ b/sysmoOCTSIM/gcc/Makefile
@@ -84,6 +84,7 @@
 main.o \
 manual_test.o \
 talloc.o \
+usb_descriptors.o \
 i2c_bitbang.o \
 octsim_i2c.o \
 ncn8025.o \
@@ -136,6 +137,7 @@
 "main.o" \
 "manual_test.o" \
 "talloc.o" \
+"usb_descriptors.o" \
 "i2c_bitbang.o" \
 "octsim_i2c.o" \
 "ncn8025.o" \
@@ -194,6 +196,7 @@
 "main.d" \
 "manual_test.d" \
 "talloc.d" \
+"usb_descriptors.d" \
 "i2c_bitbang.d" \
 "octsim_i2c.d" \
 "ncn8025.d" \
diff --git a/sysmoOCTSIM/usb_descriptors.c b/sysmoOCTSIM/usb_descriptors.c
new file mode 100644
index 0000000..429e8c2
--- /dev/null
+++ b/sysmoOCTSIM/usb_descriptors.c
@@ -0,0 +1,241 @@
+#include "usbd_config.h"
+#include "usbdc.h"
+#include "usb_protocol.h"
+#include "usb_protocol_cdc.h"
+#include "ccid_proto.h"
+#include "cdcdf_acm_desc.h"
+
+/* aggregate descriptors for the combined CDC-ACM + CCID device that we expose
+ * from sysmoQMOD */
+
+enum str_desc_num {
+	STR_DESC_MANUF = 1,
+	STR_DESC_PRODUCT,
+	STR_DESC_CONFIG,
+	STR_DESC_INTF_ACM_COMM,
+	STR_DESC_INTF_ACM_DATA,
+	STR_DESC_INTF_CCID,
+	STR_DESC_SERIAL,
+};
+
+/* a struct of structs representing the concatenated collection of USB descriptors */
+struct usb_desc_collection {
+	struct usb_dev_desc dev;
+	struct usb_config_desc cfg;
+
+	/* CDC-ACM: Two interfaces, one with IRQ EP and one with BULK IN + OUT */
+	struct {
+		struct {
+			struct usb_iface_desc iface;
+			struct usb_cdc_hdr_desc cdc_hdr;
+			struct usb_cdc_call_mgmt_desc cdc_call_mgmt;
+			struct usb_cdc_acm_desc cdc_acm;
+			struct usb_cdc_union_desc cdc_union;
+			struct usb_ep_desc ep[1];
+		} comm;
+		struct {
+			struct usb_iface_desc iface;
+			struct usb_ep_desc ep[2];
+		} data;
+	} cdc;
+
+	/* CCID: One interface with CCID class descriptor and three endpoints */
+	struct {
+		struct usb_iface_desc iface;
+		struct usb_ccid_class_descriptor class;
+		struct usb_ep_desc ep[3];
+	} ccid;
+	uint8_t str[116];
+} __attribute__((packed));
+
+static const struct usb_desc_collection usb_fs_descs = {
+	.dev = {
+		.bLength = sizeof(struct usb_dev_desc),
+		.bDescriptorType = USB_DT_DEVICE,
+		.bcdUSB = USB_V2_0,
+		.bDeviceClass = 0x02,
+		.bDeviceSubClass = 0,
+		.bDeviceProtocol = 0,
+		.bMaxPacketSize0 = CONF_USB_CDCD_ACM_BMAXPKSZ0,
+		.idVendor = CONF_USB_CDCD_ACM_IDVENDER,
+		.idProduct = CONF_USB_CDCD_ACM_IDPRODUCT,
+		.iManufacturer = STR_DESC_MANUF,
+		.iProduct = STR_DESC_PRODUCT,
+		.iSerialNumber = STR_DESC_SERIAL,
+		.bNumConfigurations = 1,
+	},
+	.cfg = {
+		.bLength = sizeof(struct usb_config_desc),
+		.bDescriptorType = USB_DT_CONFIG,
+		.wTotalLength = sizeof(usb_fs_descs.cfg) +
+				sizeof(usb_fs_descs.cdc) +
+				sizeof(usb_fs_descs.ccid),
+		.bNumInterfaces = 3,
+		.bConfigurationValue = CONF_USB_CDCD_ACM_BCONFIGVAL,
+		.iConfiguration = STR_DESC_CONFIG,
+		.bmAttributes = CONF_USB_CDCD_ACM_BMATTRI,
+		.bMaxPower = CONF_USB_CDCD_ACM_BMAXPOWER,
+	},
+	.cdc = {
+		.comm = {
+			.iface = {
+				.bLength = sizeof(struct usb_iface_desc),
+				.bDescriptorType = USB_DT_INTERFACE,
+				.bInterfaceNumber = CONF_USB_CDCD_ACM_COMM_BIFCNUM,
+				.bAlternateSetting = CONF_USB_CDCD_ACM_COMM_BALTSET,
+				.bNumEndpoints = 1,
+				.bInterfaceClass = CDC_CLASS_COMM,
+				.bInterfaceSubClass = CDC_SUBCLASS_ACM,
+				.bInterfaceProtocol = 0x00,
+				.iInterface = STR_DESC_INTF_ACM_COMM,
+			},
+			.cdc_hdr = {
+				.bFunctionLength = sizeof(struct usb_cdc_hdr_desc),
+				.bDescriptorType = CDC_CS_INTERFACE,
+				.bDescriptorSubtype = CDC_SCS_HEADER,
+				.bcdCDC = LE16(0x1001),
+			},
+			.cdc_call_mgmt = {
+				.bFunctionLength = sizeof(struct usb_cdc_call_mgmt_desc),
+				.bDescriptorType = CDC_CS_INTERFACE,
+				.bDescriptorSubtype = CDC_SCS_CALL_MGMT,
+				.bmCapabilities = 0x01,
+				.bDataInterface = 0x00,
+			},
+			.cdc_acm = {
+				.bFunctionLength = sizeof(struct usb_cdc_acm_desc),
+				.bDescriptorType = CDC_CS_INTERFACE,
+				.bDescriptorSubtype = CDC_SCS_ACM,
+				.bmCapabilities = 0x02,
+			},
+			.cdc_union = {
+				.bFunctionLength = sizeof(struct usb_cdc_union_desc),
+				.bDescriptorType = CDC_CS_INTERFACE,
+				.bDescriptorSubtype = CDC_SCS_UNION,
+				.bMasterInterface = CONF_USB_CDCD_ACM_COMM_BIFCNUM,
+				.bSlaveInterface0 = 0x01,
+			},
+			.ep = {
+				{
+					.bLength = sizeof(struct usb_ep_desc),
+					.bDescriptorType = USB_DT_ENDPOINT,
+					.bEndpointAddress = CONF_USB_CDCD_ACM_COMM_INT_EPADDR,
+					.bmAttributes = USB_EP_TYPE_INTERRUPT,
+					.wMaxPacketSize = CONF_USB_CDCD_ACM_COMM_INT_MAXPKSZ,
+					.bInterval = CONF_USB_CDCD_ACM_COMM_INT_INTERVAL,
+				},
+			},
+		},
+		.data = {
+			.iface = {
+				.bLength = sizeof(struct usb_iface_desc),
+				.bDescriptorType = USB_DT_INTERFACE,
+				.bInterfaceNumber = CONF_USB_CDCD_ACM_DATA_BIFCNUM,
+				.bAlternateSetting = CONF_USB_CDCD_ACM_DATA_BALTSET,
+				.bNumEndpoints = 2,
+				.bInterfaceClass = CDC_CLASS_DATA,
+				.bInterfaceSubClass = 0x00,
+				.bInterfaceProtocol = 0x00,
+				.iInterface = STR_DESC_INTF_ACM_DATA,
+			},
+			.ep = {
+				{
+					.bLength = sizeof(struct usb_ep_desc),
+					.bDescriptorType = USB_DT_ENDPOINT,
+					.bEndpointAddress = CONF_USB_CDCD_ACM_DATA_BULKOUT_EPADDR,
+					.bmAttributes = USB_EP_TYPE_BULK,
+					.wMaxPacketSize = CONF_USB_CDCD_ACM_DATA_BULKOUT_MAXPKSZ,
+					.bInterval = 0,
+				},
+				{
+					.bLength = sizeof(struct usb_ep_desc),
+					.bDescriptorType = USB_DT_ENDPOINT,
+					.bEndpointAddress = CONF_USB_CDCD_ACM_DATA_BULKIN_EPADDR,
+					.bmAttributes = USB_EP_TYPE_BULK,
+					.wMaxPacketSize = CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ,
+					.bInterval = 0,
+				},
+			},
+		},
+	},
+	.ccid = {
+		.iface = {
+			.bLength = sizeof(struct usb_iface_desc),
+			.bDescriptorType = USB_DT_INTERFACE,
+			.bInterfaceNumber = 2,
+			.bAlternateSetting = 0,
+			.bNumEndpoints = 3,
+			.bInterfaceClass = 11,
+			.bInterfaceSubClass = 0,
+			.bInterfaceProtocol = 0,
+			.iInterface = STR_DESC_INTF_CCID,
+		},
+		.class = {
+			.bLength = sizeof(struct usb_ccid_class_descriptor),
+			.bDescriptorType = 33,
+			.bcdCCID = LE16(0x0110),
+			.bMaxSlotIndex = 7,
+			.dwProtocols = 0x07, /* 5/3/1.8V */
+			.dwDefaultClock = LE32(2500),
+			.dwMaximumClock = LE32(20000),
+			.bNumClockSupported = 4,
+			.dwDataRate = LE32(9600),
+			.dwMaxDataRate = LE32(921600),
+			.bNumDataRatesSupported = 0,
+			.dwMaxIFSD = LE32(0),
+			.dwSynchProtocols = LE32(0),
+			.dwMechanical = LE32(0),
+			.dwFeatures = LE32(0x10),
+			.dwMaxCCIDMessageLength = 272,
+			.bClassGetResponse = 0xff,
+			.bClassEnvelope = 0xff,
+			.wLcdLayout = LE16(0),
+			.bPINSupport = 0,
+			.bMaxCCIDBusySlots = 8,
+		},
+		.ep = {
+			{	/* Bulk-OUT descriptor */
+				.bLength = sizeof(struct usb_ep_desc),
+				.bDescriptorType = USB_DT_ENDPOINT,
+				.bEndpointAddress = 0x02,
+				.bmAttributes = USB_EP_TYPE_BULK,
+				.wMaxPacketSize = 64,
+				.bInterval = 0,
+			},
+			{ 	/* Bulk-IN descriptor */
+				.bLength = sizeof(struct usb_ep_desc),
+				.bDescriptorType = USB_DT_ENDPOINT,
+				.bEndpointAddress = 0x83,
+				.bmAttributes = USB_EP_TYPE_BULK,
+				.wMaxPacketSize = 64,
+				.bInterval = 0,
+			},
+			{	/* Interrupt dscriptor */
+				.bLength = sizeof(struct usb_ep_desc),
+				.bDescriptorType = USB_DT_ENDPOINT,
+				.bEndpointAddress = 0x84,
+				.bmAttributes = USB_EP_TYPE_INTERRUPT,
+				.wMaxPacketSize = 64,
+				.bInterval = 0x10,
+			},
+		},
+	},
+	//DFURT_IF_DESCRIPTOR,
+	.str = {
+#if 0
+		CDCD_ACM_STR_DESCES
+#else
+		 4,  3, 0x09, 0x04,
+		18,  3, 's',0, 'y',0, 's',0, 'm',0, 'o',0, 'c',0, 'o',0, 'm',0,
+		24,  3, 's',0, 'y',0, 's',0, 'm',0, 'o',0, 'O',0, 'C',0, 'T',0, 'S',0, 'I',0, 'M',0,
+		 4,  3, 'A', 0,
+		22,  3, 'd',0, 'e',0, 'b',0, 'u',0, 'g',0, ' ',0, 'U',0, 'A',0, 'R',0, 'T',0,
+		22,  3, 'd',0, 'e',0, 'b',0, 'u',0, 'g',0, ' ',0, 'U',0, 'A',0, 'R',0, 'T',0,
+		10,  3, 'C',0, 'C',0, 'I',0, 'D',0,
+		12,  3, 'F',0, 'I',0, 'X',0, 'M',0, 'E',0,
+#endif
+	}
+};
+
+const struct usbd_descriptors usb_descs[]
+    = {{ (uint8_t *)&usb_fs_descs, (uint8_t *)&usb_fs_descs + sizeof(usb_fs_descs) }};
diff --git a/sysmoOCTSIM/usb_start.c b/sysmoOCTSIM/usb_start.c
index d02edc0..83fac81 100644
--- a/sysmoOCTSIM/usb_start.c
+++ b/sysmoOCTSIM/usb_start.c
@@ -8,28 +8,7 @@
 #include "atmel_start.h"
 #include "usb_start.h"
 
-#if CONF_USBD_HS_SP
-static uint8_t single_desc_bytes[] = {
-    /* Device descriptors and Configuration descriptors list. */
-    CDCD_ACM_HS_DESCES_LS_FS};
-static uint8_t single_desc_bytes_hs[] = {
-    /* Device descriptors and Configuration descriptors list. */
-    CDCD_ACM_HS_DESCES_HS};
-#define CDCD_ECHO_BUF_SIZ CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ_HS
-#else
-static uint8_t single_desc_bytes[] = {
-    /* Device descriptors and Configuration descriptors list. */
-    CDCD_ACM_DESCES_LS_FS};
 #define CDCD_ECHO_BUF_SIZ CONF_USB_CDCD_ACM_DATA_BULKIN_MAXPKSZ
-#endif
-
-static struct usbd_descriptors single_desc[]
-    = {{single_desc_bytes, single_desc_bytes + sizeof(single_desc_bytes)}
-#if CONF_USBD_HS_SP
-       ,
-       {single_desc_bytes_hs, single_desc_bytes_hs + sizeof(single_desc_bytes_hs)}
-#endif
-};
 
 /** Buffers to receive and echo the communication bytes. */
 static uint32_t usbd_cdc_buffer[CDCD_ECHO_BUF_SIZ / 4];
@@ -77,6 +56,8 @@
 	return false;
 }
 
+extern const struct usbd_descriptors usb_descs[];
+
 /**
  * \brief CDC ACM Init
  */
@@ -88,7 +69,7 @@
 	/* usbdc_register_funcion inside */
 	cdcdf_acm_init();
 
-	usbdc_start(single_desc);
+	usbdc_start((struct usbd_descriptors *) usb_descs);
 	usbdc_attach();
 }
 

-- 
To view, visit https://gerrit.osmocom.org/13998
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings

Gerrit-Project: osmo-ccid-firmware
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I0423d733476f37c16bdb6abc651b7ad5ca7ac63e
Gerrit-Change-Number: 13998
Gerrit-PatchSet: 1
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20190511/9125e874/attachment.html>


More information about the gerrit-log mailing list