annotate packages/io/usb/serial/slave/current/src/usbs_serial.c @ 2729:74dbf4c3f2e1 after-copyright-change-20090129

Update all copyright banners to reflect FSF ownership; fix and improve licence text.
author jlarmour
date Thu, 29 Jan 2009 17:47:46 +0000
parents de43e04cf3a5
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
1 //==========================================================================
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
2 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
3 // usbs_serial.c
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
4 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
5 // Support for slave-side USB serial devices.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
6 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
7 //==========================================================================
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
9 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
11 // Copyright (C) 2008 Free Software Foundation, Inc.
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
12 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
14 // the terms of the GNU General Public License as published by the Free
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
16 // version.
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
17 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
21 // for more details.
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
22 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
23 // You should have received a copy of the GNU General Public License
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
26 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
27 // As a special exception, if other files instantiate templates or use
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
28 // macros or inline functions from this file, or you compile this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
29 // and link it with other works to produce a work based on this file,
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
31 // the GNU General Public License. However the source code for this file
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
33 // General Public License v2.
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
34 //
2729
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
35 // This exception does not invalidate any other reasons why a work based
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
36 // on this file might be covered by the GNU General Public License.
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
37 // -------------------------------------------
74dbf4c3f2e1 Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents: 2577
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
39 //==========================================================================
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
41 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
42 // Author(s): Frank M. Pagliughi (fmp), SoRo Systems, Inc.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
43 // Date: 2008-06-02
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
44 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
45 //####DESCRIPTIONEND####
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
46 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
47 //==========================================================================
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
48
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
49 #include <cyg/infra/cyg_type.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
50 #include <cyg/infra/cyg_ass.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
51 #include <cyg/infra/cyg_trac.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
52 #include <cyg/infra/diag.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
53 #include <cyg/hal/hal_arch.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
54 #include <cyg/hal/drv_api.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
55 #include <cyg/kernel/kapi.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
56
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
57 #include <pkgconf/io_usb_slave_serial.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
58 #include <cyg/io/usb/usbs_serial.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
59 #include <string.h>
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
60
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
61 #if defined(CYGBLD_IO_USB_SLAVE_SERIAL_DEBUG)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
62 #define DBG diag_printf
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
63 #else
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
64 #define DBG (1) ? (void)0 : diag_printf
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
65 #endif
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
66
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
67 #define EP0_MAX_PACKET_SIZE CYGNUM_IO_USB_SLAVE_SERIAL_EP0_MAX_PACKET_SIZE
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
68
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
69 extern usbs_control_endpoint CYGDAT_IO_USB_SLAVE_SERIAL_EP0;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
70 extern usbs_tx_endpoint CYGDAT_IO_USB_SLAVE_SERIAL_TX_EP;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
71 extern usbs_rx_endpoint CYGDAT_IO_USB_SLAVE_SERIAL_RX_EP;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
72
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
73 #define TX_EP_NUM CYGNUM_IO_USB_SLAVE_SERIAL_TX_EP_NUM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
74 #define RX_EP_NUM CYGNUM_IO_USB_SLAVE_SERIAL_RX_EP_NUM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
75 #define INTR_EP_NUM CYGNUM_IO_USB_SLAVE_SERIAL_INTR_EP_NUM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
76 #define EP0 (&CYGDAT_IO_USB_SLAVE_SERIAL_EP0)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
77 #define TX_EP (&CYGDAT_IO_USB_SLAVE_SERIAL_TX_EP)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
78 #define RX_EP (&CYGDAT_IO_USB_SLAVE_SERIAL_RX_EP)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
79 #define INTR_EP (&CYGDAT_IO_USB_SLAVE_SERIAL_INTR_EP)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
80
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
81
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
82 #define VENDOR_ID CYGNUM_IO_USB_SLAVE_SERIAL_VENDOR_ID
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
83 #define PRODUCT_ID CYGNUM_IO_USB_SLAVE_SERIAL_PRODUCT_ID
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
84
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
85 #define USB_MAX_STR_LEN 256
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
86
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
87 #define LO_BYTE_16(word16) ((cyg_uint8) ((word16) & 0xFF))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
88 #define HI_BYTE_16(word16) ((cyg_uint8) (((word16) >> 8) & 0xFF))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
89
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
90 #define BYTE0_32(word32) ((cyg_uint8) ((word32) & 0xFF))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
91 #define BYTE1_32(word32) ((cyg_uint8) (((word32) >> 8) & 0xFF))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
92 #define BYTE2_32(word32) ((cyg_uint8) (((word32) >> 16) & 0xFF))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
93 #define BYTE3_32(word32) ((cyg_uint8) (((word32) >> 24) & 0xFF))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
94
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
95
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
96 #define MFG_STR_INDEX '\x01'
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
97 #define PRODUCT_STR_INDEX '\x02'
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
98
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
99 #define USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH(interfaces, endpoints) \
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
100 (USB_CONFIGURATION_DESCRIPTOR_LENGTH + \
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
101 ((interfaces) * USB_INTERFACE_DESCRIPTOR_LENGTH) + \
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
102 ((endpoints) * USB_ENDPOINT_DESCRIPTOR_LENGTH))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
103
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
104
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
105 #ifdef CYGDAT_IO_USB_SLAVE_CLASS_TYPE_ACM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
106 #define USBS_SERIAL_DEVICE_CLASS 2
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
107 #define USBS_SERIAL_NUM_IFACE 2
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
108 #define USBS_SERIAL_NUM_ENDP 3
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
109 #define USBS_SERIAL_DATA_IFACE_CLASS 0x0A // Data
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
110 #else
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
111 #define USBS_SERIAL_DEVICE_CLASS 0
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
112 #define USBS_SERIAL_NUM_IFACE 1
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
113 #define USBS_SERIAL_NUM_ENDP 2
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
114 #define USBS_SERIAL_DATA_IFACE_CLASS 0xFF // Vendor
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
115 #endif
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
116
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
117 // ----- Configuration Descriptor -----
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
118
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
119 static const usb_configuration_descriptor usb_configuration = {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
120 length: sizeof(usb_configuration_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
121 type: USB_CONFIGURATION_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
122 total_length_lo:
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
123 USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_LO(USBS_SERIAL_NUM_IFACE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
124 USBS_SERIAL_NUM_ENDP),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
125 total_length_hi:
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
126 USB_CONFIGURATION_DESCRIPTOR_TOTAL_LENGTH_HI(USBS_SERIAL_NUM_IFACE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
127 USBS_SERIAL_NUM_ENDP),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
128 number_interfaces: USBS_SERIAL_NUM_IFACE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
129 configuration_id: 1,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
130 configuration_str: 0,
2577
de43e04cf3a5 * cdl/usbs_serial.cdl:
asl
parents: 2493
diff changeset
131 #ifdef CYGOPT_IO_USB_SLAVE_SERIAL_BUSPOWERED
de43e04cf3a5 * cdl/usbs_serial.cdl:
asl
parents: 2493
diff changeset
132 attributes: (USB_CONFIGURATION_DESCRIPTOR_ATTR_REQUIRED),
de43e04cf3a5 * cdl/usbs_serial.cdl:
asl
parents: 2493
diff changeset
133 #else
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
134 attributes: (USB_CONFIGURATION_DESCRIPTOR_ATTR_REQUIRED |
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
135 USB_CONFIGURATION_DESCRIPTOR_ATTR_SELF_POWERED),
2577
de43e04cf3a5 * cdl/usbs_serial.cdl:
asl
parents: 2493
diff changeset
136 #endif
de43e04cf3a5 * cdl/usbs_serial.cdl:
asl
parents: 2493
diff changeset
137 max_power: (CYGNUM_IO_USB_SLAVE_SERIAL_CURRENTDRAW+1)/2
2493
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
138 };
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
139
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
140 // ----- Interface Descriptor -----
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
141
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
142 static const usb_interface_descriptor usb_interface[] = {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
143
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
144 #ifdef CYGDAT_IO_USB_SLAVE_CLASS_TYPE_ACM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
145 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
146 length: sizeof(usb_interface_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
147 type: USB_INTERFACE_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
148 interface_id: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
149 alternate_setting: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
150 number_endpoints: 1,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
151 interface_class: 0x02, // Comm class
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
152 interface_subclass: 0x02,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
153 interface_protocol: 0x01,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
154 interface_str: 0x00
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
155 },
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
156 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
157 length: sizeof(usb_interface_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
158 type: USB_INTERFACE_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
159 interface_id: 1,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
160 alternate_setting: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
161 number_endpoints: 2,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
162 interface_class: USBS_SERIAL_DATA_IFACE_CLASS,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
163 interface_subclass: 0x00,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
164 interface_protocol: 0x00,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
165 interface_str: 0x00
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
166 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
167 #else
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
168 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
169 length: sizeof(usb_interface_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
170 type: USB_INTERFACE_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
171 interface_id: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
172 alternate_setting: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
173 number_endpoints: 2,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
174 interface_class: USBS_SERIAL_DATA_IFACE_CLASS,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
175 interface_subclass: 0x00,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
176 interface_protocol: 0x00,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
177 interface_str: 0x00
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
178 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
179 #endif
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
180 };
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
181
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
182 // ----- Endpoint Descriptors -----
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
183
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
184 static const usb_endpoint_descriptor usb_endpoints[] =
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
185 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
186 #ifdef CYGDAT_IO_USB_SLAVE_CLASS_TYPE_ACM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
187 // Interrupt in endpoint
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
188 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
189 sizeof(usb_endpoint_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
190 USB_ENDPOINT_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
191 USB_ENDPOINT_DESCRIPTOR_ENDPOINT_IN | INTR_EP_NUM,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
192 USB_ENDPOINT_DESCRIPTOR_ATTR_INTERRUPT,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
193 0x40,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
194 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
195 255
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
196 },
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
197 #endif
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
198
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
199 // Tx (Bulk IN) Endpoint Descriptor
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
200 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
201 sizeof(usb_endpoint_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
202 USB_ENDPOINT_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
203 USB_ENDPOINT_DESCRIPTOR_ENDPOINT_IN | TX_EP_NUM,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
204 USB_ENDPOINT_DESCRIPTOR_ATTR_BULK,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
205 0x40,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
206 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
207 0
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
208 },
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
209
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
210 // Rx (Bulk OUT) Endpoint Descriptor
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
211 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
212 sizeof(usb_endpoint_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
213 USB_ENDPOINT_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
214 USB_ENDPOINT_DESCRIPTOR_ENDPOINT_OUT | RX_EP_NUM,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
215 USB_ENDPOINT_DESCRIPTOR_ATTR_BULK,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
216 0x40,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
217 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
218 0
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
219 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
220 };
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
221
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
222 // ----- String Descriptors -----
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
223
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
224 static char mfg_str_descr[USB_MAX_STR_LEN],
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
225 product_str_descr[USB_MAX_STR_LEN];
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
226
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
227
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
228 static const char* usb_strings[] = {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
229 "\x04\x03\x09\x04",
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
230 mfg_str_descr,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
231 product_str_descr
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
232 };
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
233
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
234 // ----- Enumeration Data w/ Device Descriptor -----
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
235
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
236 static usbs_enumeration_data usb_enum_data = {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
237 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
238 length: sizeof(usb_device_descriptor),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
239 type: USB_DEVICE_DESCRIPTOR_TYPE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
240 usb_spec_lo: 0x00,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
241 usb_spec_hi: 0x02,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
242 device_class: USBS_SERIAL_DEVICE_CLASS,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
243 device_subclass: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
244 device_protocol: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
245 max_packet_size: EP0_MAX_PACKET_SIZE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
246 vendor_lo: LO_BYTE_16(VENDOR_ID),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
247 vendor_hi: HI_BYTE_16(VENDOR_ID),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
248 product_lo: LO_BYTE_16(PRODUCT_ID),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
249 product_hi: HI_BYTE_16(PRODUCT_ID),
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
250 device_lo: 0x00,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
251 device_hi: 0x00,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
252 manufacturer_str: MFG_STR_INDEX,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
253 product_str: PRODUCT_STR_INDEX,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
254 serial_number_str: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
255 number_configurations: 1
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
256 },
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
257
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
258 total_number_interfaces: USBS_SERIAL_NUM_IFACE,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
259 total_number_endpoints: USBS_SERIAL_NUM_ENDP,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
260 total_number_strings: 3,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
261 configurations: &usb_configuration,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
262 interfaces: usb_interface,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
263 endpoints: usb_endpoints,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
264 strings: (const unsigned char **) usb_strings
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
265 };
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
266
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
267 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
268 // USBS Serial Data
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
269 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
270
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
271 usbs_control_endpoint* usbs_serial_ep0 = EP0;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
272
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
273 // Lock for the state.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
274 cyg_mutex_t usbs_serial_lock;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
275
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
276 // Condition variable for state changes
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
277 cyg_cond_t usbs_serial_state_cond;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
278
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
279 int usbs_serial_state;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
280
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
281 usbs_serial usbs_ser0 = {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
282 tx_ep: TX_EP,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
283 rx_ep: RX_EP,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
284 tx_result: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
285 rx_result: 0,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
286 };
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
287
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
288 static void (*usbs_serial_app_state_change_fn)(struct usbs_control_endpoint*,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
289 void*, usbs_state_change, int)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
290 = 0;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
291
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
292 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
293 // Create a USB String Descriptor from a C string.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
294
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
295 void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
296 usbs_serial_create_str_descriptor(char descr[], const char *str)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
297 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
298 int i, n = strlen(str);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
299
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
300 if (n > (USB_MAX_STR_LEN/2 - 2))
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
301 n = USB_MAX_STR_LEN/2 - 2;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
302
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
303 descr[0] = (cyg_uint8) (2*n + 2);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
304 descr[1] = USB_DEVREQ_DESCRIPTOR_TYPE_STRING;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
305
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
306 for (i=0; i<n; i++) {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
307 descr[i*2+2] = str[i];
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
308 descr[i*2+3] = '\x00';
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
309 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
310 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
311
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
312 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
313 // ACM Class Handler
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
314 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
315 // For a Windows host, the device must, at least, respond to a SetLineCoding
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
316 // request (0x20), otherwise Windows will report that it's unable to open the
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
317 // port. This request normally sets the standard serial parameters:
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
318 // baud rate, # stop bits, parity, and # data bits
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
319 // If we're just making believe that we're a serial port to communicate with
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
320 // the host via USB, then these values don't matter. So we ACK the request,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
321 // but ignore the parameters.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
322 // If we were actually creating a USB-serial converter, then we would need to
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
323 // read these values and configure the serial port accordingly.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
324 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
325 // Similarly, the host can request the current settings through a
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
326 // GetLineCoding request (0x21). Since we're just faking it, we return some
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
327 // arbitrary values: 38400,1,N,8
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
328
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
329 #ifdef CYGDAT_IO_USB_SLAVE_CLASS_TYPE_ACM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
330
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
331 static usbs_control_return
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
332 usbs_serial_acm_class_handler(usbs_control_endpoint* ep0, void* data)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
333 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
334 usbs_control_return result = USBS_CONTROL_RETURN_UNKNOWN;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
335 usb_devreq *req = (usb_devreq *) ep0->control_buffer;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
336 static cyg_uint8 rsp_buf[32];
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
337 cyg_uint32 baud = 38400; // Arbitrary, fake value to return to the host.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
338
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
339 DBG("USB Serial ACM Class Handler: ");
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
340
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
341 switch (req->request) {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
342
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
343 case USBS_SERIAL_SET_LINE_CODING :
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
344 DBG("ACM Request: Set Line Coding\n");
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
345 result = USBS_CONTROL_RETURN_HANDLED;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
346 break;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
347
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
348 case USBS_SERIAL_GET_LINE_CODING :
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
349 DBG("ACM Request: Get Line Coding\n");
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
350 rsp_buf[0] = BYTE0_32(baud);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
351 rsp_buf[1] = BYTE1_32(baud);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
352 rsp_buf[2] = BYTE2_32(baud);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
353 rsp_buf[3] = BYTE3_32(baud);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
354 rsp_buf[4] = 0; // One stop bit
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
355 rsp_buf[5] = 0; // No parity
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
356 rsp_buf[6] = 8; // 8 data bits
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
357 ep0->buffer = rsp_buf;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
358 ep0->buffer_size = 7;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
359 result = USBS_CONTROL_RETURN_HANDLED;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
360 break;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
361
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
362 default :
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
363 DBG("*** Unhandled ACM Request: 0x%02X ***\n",
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
364 (unsigned) req->request);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
365 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
366
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
367 return result;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
368 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
369 #endif // CYGDAT_IO_USB_SLAVE_CLASS_TYPE_ACM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
370
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
371 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
372 // Callback for a USB state change
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
373
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
374 void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
375 usbs_serial_state_change_handler(usbs_control_endpoint* ep, void* data,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
376 usbs_state_change change, int prev_state)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
377 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
378 #if defined(CYGBLD_IO_USB_SLAVE_SERIAL_DEBUG)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
379 const char *STATE_CHG_STR[] = { "Detached", "Attached", "Powered", "Reset",
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
380 "Addressed", "Configured", "Deconfigured",
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
381 "Suspended", "Resumed" };
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
382
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
383 if (change > 0) {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
384 DBG("### %d:%s ###\n", change, STATE_CHG_STR[(int) change-1]);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
385 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
386 #endif
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
387
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
388 // Called from DSR, cond broadcast should be ok without mutex lock
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
389 usbs_serial_state = usbs_serial_ep0->state;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
390 cyg_cond_broadcast(&usbs_serial_state_cond);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
391
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
392 if (usbs_serial_app_state_change_fn)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
393 (*usbs_serial_app_state_change_fn)(ep, data, change, prev_state);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
394 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
395
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
396 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
397 // Block the calling thread until the USB is configured.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
398
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
399 void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
400 usbs_serial_wait_until_configured(void)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
401 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
402 cyg_mutex_lock(&usbs_serial_lock);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
403 while (usbs_serial_state != USBS_STATE_CONFIGURED)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
404 cyg_cond_wait(&usbs_serial_state_cond);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
405 cyg_mutex_unlock(&usbs_serial_lock);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
406 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
407
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
408 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
409 // Determine if the device is currently configured.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
410
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
411 cyg_bool
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
412 usbs_serial_is_configured(void)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
413 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
414 return usbs_serial_state == USBS_STATE_CONFIGURED;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
415 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
416
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
417 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
418 // Callback for when a transmit is complete
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
419
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
420 static void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
421 usbs_serial_tx_complete(void *p, int result)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
422 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
423 usbs_serial* ser = (usbs_serial*) p;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
424 ser->tx_result = result;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
425 cyg_semaphore_post(&ser->tx_ready);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
426 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
427
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
428 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
429 // Callback for when a receive is complete
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
430
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
431 static void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
432 usbs_serial_rx_complete(void *p, int result)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
433 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
434 usbs_serial* ser = (usbs_serial*) p;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
435 ser->rx_result = result;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
436 cyg_semaphore_post(&ser->rx_ready);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
437 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
438
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
439 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
440 // Start an asynchronous transmit of a buffer.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
441 //
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
442
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
443 void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
444 usbs_serial_start_tx(usbs_serial* ser, const void* buf, int n)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
445 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
446 usbs_start_tx_buffer(ser->tx_ep, (unsigned char*) buf, n,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
447 usbs_serial_tx_complete, ser);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
448 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
449
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
450 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
451 // Block the caller until the transmit is complete
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
452
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
453 int
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
454 usbs_serial_wait_for_tx(usbs_serial* ser)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
455 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
456 cyg_semaphore_wait(&ser->tx_ready);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
457 return ser->tx_result;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
458 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
459
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
460 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
461 // Perform a synchronous transmit and wait for it to complete.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
462
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
463 int
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
464 usbs_serial_tx(usbs_serial* ser, const void* buf, int n)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
465 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
466 usbs_serial_start_tx(ser, buf, n);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
467 return usbs_serial_wait_for_tx(ser);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
468 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
469
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
470 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
471 // Start an asynchronous receive of a buffer.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
472
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
473 void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
474 usbs_serial_start_rx(usbs_serial* ser, void* buf, int n)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
475 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
476 usbs_start_rx_buffer(ser->rx_ep, (unsigned char*) buf, n,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
477 usbs_serial_rx_complete, ser);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
478 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
479
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
480 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
481 // Block the caller until the receive is complete
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
482
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
483 int
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
484 usbs_serial_wait_for_rx(usbs_serial* ser)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
485 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
486 cyg_semaphore_wait(&ser->rx_ready);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
487 return ser->rx_result;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
488 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
489
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
490 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
491 // Perform a synchronous receive and wait for it to complete.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
492
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
493 int
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
494 usbs_serial_rx(usbs_serial* ser, void* buf, int n)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
495 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
496 usbs_serial_start_rx(ser, buf, n);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
497 return usbs_serial_wait_for_rx(ser);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
498 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
499
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
500 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
501 // Initialize a serial port structure.
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
502
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
503 void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
504 usbs_serial_init(usbs_serial* ser, usbs_tx_endpoint* tx_ep,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
505 usbs_rx_endpoint* rx_ep)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
506 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
507 ser->tx_ep = tx_ep;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
508 ser->rx_ep = rx_ep;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
509
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
510 cyg_semaphore_init(&ser->tx_ready, 0);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
511 cyg_semaphore_init(&ser->rx_ready, 0);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
512 }
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
513
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
514 // --------------------------------------------------------------------------
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
515 // Start the USB subsystem
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
516
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
517 void
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
518 usbs_serial_start(void)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
519 {
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
520 usbs_serial_init(&usbs_ser0, TX_EP, RX_EP);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
521
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
522 cyg_mutex_init(&usbs_serial_lock);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
523 cyg_cond_init(&usbs_serial_state_cond, &usbs_serial_lock);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
524
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
525 // Make the mfg & product names into USB string descriptors
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
526
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
527 usbs_serial_create_str_descriptor(mfg_str_descr,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
528 CYGDAT_IO_USB_SLAVE_SERIAL_MFG_STR);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
529 usbs_serial_create_str_descriptor(product_str_descr,
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
530 CYGDAT_IO_USB_SLAVE_SERIAL_PRODUCT_STR);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
531
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
532 // ----- Set up enumeration & USB callbacks -----
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
533
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
534 usbs_serial_state = usbs_serial_ep0->state;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
535
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
536 usbs_serial_ep0->enumeration_data = &usb_enum_data;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
537
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
538 if (usbs_serial_ep0->state_change_fn)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
539 usbs_serial_app_state_change_fn = usbs_serial_ep0->state_change_fn;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
540
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
541 usbs_serial_ep0->state_change_fn = usbs_serial_state_change_handler;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
542
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
543 #ifdef CYGDAT_IO_USB_SLAVE_CLASS_TYPE_ACM
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
544 if (!usbs_serial_ep0->class_control_fn)
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
545 usbs_serial_ep0->class_control_fn = usbs_serial_acm_class_handler;
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
546 #endif
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
547
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
548 // ----- Start USB subsystem -----
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
549
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
550 usbs_start(usbs_serial_ep0);
3adca3f92ff7 * Generic USB Serial package created.
asl
parents:
diff changeset
551 }