📄 cdc_enumerate.lst
字号:
1 .code 16
2 .file "cdc_enumerate.c"
10 .Ltext0:
11 .section .text.AT91F_CDC_Open,"ax",%progbits
12 .align 2
13 .global AT91F_CDC_Open
14 .code 16
15 .thumb_func
17 AT91F_CDC_Open:
18 .LFB290:
19 .file 1 "cdc_enumerate.c"
1:cdc_enumerate.c **** //*----------------------------------------------------------------------------
2:cdc_enumerate.c **** //* ATMEL Microcontroller Software Support - ROUSSET -
3:cdc_enumerate.c **** //*----------------------------------------------------------------------------
4:cdc_enumerate.c **** //* The software is delivered "AS IS" without warranty or condition of any
5:cdc_enumerate.c **** //* kind, either express, implied or statutory. This includes without
6:cdc_enumerate.c **** //* limitation any warranty or condition with respect to merchantability or
7:cdc_enumerate.c **** //* fitness for any particular purpose, or against the infringements of
8:cdc_enumerate.c **** //* intellectual property rights of others.
9:cdc_enumerate.c **** //*----------------------------------------------------------------------------
10:cdc_enumerate.c **** //* File Name : cdc_enumerate.c
11:cdc_enumerate.c **** //* Object : Handle CDC enumeration
12:cdc_enumerate.c **** //*
13:cdc_enumerate.c **** //* 1.0 Apr 20 200 : ODi Creation
14:cdc_enumerate.c **** //* 1.1 14/Sep/2004 JPP : Minor change
15:cdc_enumerate.c **** //* 1.1 15/12/2004 JPP : suppress warning
16:cdc_enumerate.c **** //* 1.2 30-Jun-2006 JPP : Set in AT91C_UDP_EPTYPE_INT_IN
17:cdc_enumerate.c **** //*----------------------------------------------------------------------------
18:cdc_enumerate.c **** #include "project.h"
19:cdc_enumerate.c **** #include "cdc_enumerate.h"
20:cdc_enumerate.c ****
21:cdc_enumerate.c **** typedef unsigned char uchar;
22:cdc_enumerate.c **** typedef unsigned short ushort;
23:cdc_enumerate.c **** typedef unsigned int uint;
24:cdc_enumerate.c ****
25:cdc_enumerate.c **** #define MIN(a, b) (((a) < (b)) ? (a) : (b))
26:cdc_enumerate.c ****
27:cdc_enumerate.c **** #define AT91C_EP_IN_SIZE 0x40
28:cdc_enumerate.c ****
29:cdc_enumerate.c **** const char devDescriptor[] = {
30:cdc_enumerate.c **** /* Device descriptor */
31:cdc_enumerate.c **** 0x12, // bLength
32:cdc_enumerate.c **** 0x01, // bDescriptorType
33:cdc_enumerate.c **** 0x10, // bcdUSBL
34:cdc_enumerate.c **** 0x01, //
35:cdc_enumerate.c **** 0x02, // bDeviceClass: CDC class code
36:cdc_enumerate.c **** 0x00, // bDeviceSubclass: CDC class sub code
37:cdc_enumerate.c **** 0x00, // bDeviceProtocol: CDC Device protocol
38:cdc_enumerate.c **** 0x08, // bMaxPacketSize0
39:cdc_enumerate.c **** 0xEB, // idVendorL
40:cdc_enumerate.c **** 0x03, //
41:cdc_enumerate.c **** // mtmt 0x24, // idProductL
42:cdc_enumerate.c **** 0x25, // idProductL
43:cdc_enumerate.c **** 0x61, //
44:cdc_enumerate.c **** 0x10, // bcdDeviceL
45:cdc_enumerate.c **** 0x01, //
46:cdc_enumerate.c **** 0x00, // iManufacturer // 0x01
47:cdc_enumerate.c **** 0x00, // iProduct
48:cdc_enumerate.c **** 0x00, // SerialNumber
49:cdc_enumerate.c **** 0x01 // bNumConfigs
50:cdc_enumerate.c **** };
51:cdc_enumerate.c ****
52:cdc_enumerate.c **** const char cfgDescriptor[] = {
53:cdc_enumerate.c **** /* ============== CONFIGURATION 1 =========== */
54:cdc_enumerate.c **** /* Configuration 1 descriptor */
55:cdc_enumerate.c **** 0x09, // CbLength
56:cdc_enumerate.c **** 0x02, // CbDescriptorType
57:cdc_enumerate.c **** 0x43, // CwTotalLength 2 EP + Control
58:cdc_enumerate.c **** 0x00,
59:cdc_enumerate.c **** 0x02, // CbNumInterfaces
60:cdc_enumerate.c **** 0x01, // CbConfigurationValue
61:cdc_enumerate.c **** 0x00, // CiConfiguration
62:cdc_enumerate.c **** 0xC0, // CbmAttributes 0xA0
63:cdc_enumerate.c **** 0x00, // CMaxPower
64:cdc_enumerate.c ****
65:cdc_enumerate.c **** /* Communication Class Interface Descriptor Requirement */
66:cdc_enumerate.c **** 0x09, // bLength
67:cdc_enumerate.c **** 0x04, // bDescriptorType
68:cdc_enumerate.c **** 0x00, // bInterfaceNumber
69:cdc_enumerate.c **** 0x00, // bAlternateSetting
70:cdc_enumerate.c **** 0x01, // bNumEndpoints
71:cdc_enumerate.c **** 0x02, // bInterfaceClass
72:cdc_enumerate.c **** 0x02, // bInterfaceSubclass
73:cdc_enumerate.c **** 0x00, // bInterfaceProtocol
74:cdc_enumerate.c **** 0x00, // iInterface
75:cdc_enumerate.c ****
76:cdc_enumerate.c **** /* Header Functional Descriptor */
77:cdc_enumerate.c **** 0x05, // bFunction Length
78:cdc_enumerate.c **** 0x24, // bDescriptor type: CS_INTERFACE
79:cdc_enumerate.c **** 0x00, // bDescriptor subtype: Header Func Desc
80:cdc_enumerate.c **** 0x10, // bcdCDC:1.1
81:cdc_enumerate.c **** 0x01,
82:cdc_enumerate.c ****
83:cdc_enumerate.c **** /* ACM Functional Descriptor */
84:cdc_enumerate.c **** 0x04, // bFunctionLength
85:cdc_enumerate.c **** 0x24, // bDescriptor Type: CS_INTERFACE
86:cdc_enumerate.c **** 0x02, // bDescriptor Subtype: ACM Func Desc
87:cdc_enumerate.c **** 0x00, // bmCapabilities
88:cdc_enumerate.c ****
89:cdc_enumerate.c **** /* Union Functional Descriptor */
90:cdc_enumerate.c **** 0x05, // bFunctionLength
91:cdc_enumerate.c **** 0x24, // bDescriptorType: CS_INTERFACE
92:cdc_enumerate.c **** 0x06, // bDescriptor Subtype: Union Func Desc
93:cdc_enumerate.c **** 0x00, // bMasterInterface: Communication Class Interface
94:cdc_enumerate.c **** 0x01, // bSlaveInterface0: Data Class Interface
95:cdc_enumerate.c ****
96:cdc_enumerate.c **** /* Call Management Functional Descriptor */
97:cdc_enumerate.c **** 0x05, // bFunctionLength
98:cdc_enumerate.c **** 0x24, // bDescriptor Type: CS_INTERFACE
99:cdc_enumerate.c **** 0x01, // bDescriptor Subtype: Call Management Func Desc
100:cdc_enumerate.c **** 0x00, // bmCapabilities: D1 + D0
101:cdc_enumerate.c **** 0x01, // bDataInterface: Data Class Interface 1
102:cdc_enumerate.c ****
103:cdc_enumerate.c **** /* Endpoint 1 descriptor */
104:cdc_enumerate.c **** 0x07, // bLength
105:cdc_enumerate.c **** 0x05, // bDescriptorType
106:cdc_enumerate.c **** 0x83, // bEndpointAddress, Endpoint 03 - IN
107:cdc_enumerate.c **** 0x03, // bmAttributes INT
108:cdc_enumerate.c **** 0x08, // wMaxPacketSize
109:cdc_enumerate.c **** 0x00,
110:cdc_enumerate.c **** 0xFF, // bInterval
111:cdc_enumerate.c ****
112:cdc_enumerate.c **** /* Data Class Interface Descriptor Requirement */
113:cdc_enumerate.c **** 0x09, // bLength
114:cdc_enumerate.c **** 0x04, // bDescriptorType
115:cdc_enumerate.c **** 0x01, // bInterfaceNumber
116:cdc_enumerate.c **** 0x00, // bAlternateSetting
117:cdc_enumerate.c **** 0x02, // bNumEndpoints
118:cdc_enumerate.c **** 0x0A, // bInterfaceClass
119:cdc_enumerate.c **** 0x00, // bInterfaceSubclass
120:cdc_enumerate.c **** 0x00, // bInterfaceProtocol
121:cdc_enumerate.c **** 0x00, // iInterface
122:cdc_enumerate.c ****
123:cdc_enumerate.c **** /* First alternate setting */
124:cdc_enumerate.c **** /* Endpoint 1 descriptor */
125:cdc_enumerate.c **** 0x07, // bLength
126:cdc_enumerate.c **** 0x05, // bDescriptorType
127:cdc_enumerate.c **** 0x01, // bEndpointAddress, Endpoint 01 - OUT
128:cdc_enumerate.c **** 0x02, // bmAttributes BULK
129:cdc_enumerate.c **** AT91C_EP_OUT_SIZE, // wMaxPacketSize
130:cdc_enumerate.c **** 0x00,
131:cdc_enumerate.c **** 0x00, // bInterval
132:cdc_enumerate.c ****
133:cdc_enumerate.c **** /* Endpoint 2 descriptor */
134:cdc_enumerate.c **** 0x07, // bLength
135:cdc_enumerate.c **** 0x05, // bDescriptorType
136:cdc_enumerate.c **** 0x82, // bEndpointAddress, Endpoint 02 - IN
137:cdc_enumerate.c **** 0x02, // bmAttributes BULK
138:cdc_enumerate.c **** AT91C_EP_IN_SIZE, // wMaxPacketSize
139:cdc_enumerate.c **** 0x00,
140:cdc_enumerate.c **** 0x00 // bInterval
141:cdc_enumerate.c **** };
142:cdc_enumerate.c ****
143:cdc_enumerate.c **** /* USB standard request code */
144:cdc_enumerate.c **** #define STD_GET_STATUS_ZERO 0x0080
145:cdc_enumerate.c **** #define STD_GET_STATUS_INTERFACE 0x0081
146:cdc_enumerate.c **** #define STD_GET_STATUS_ENDPOINT 0x0082
147:cdc_enumerate.c ****
148:cdc_enumerate.c **** #define STD_CLEAR_FEATURE_ZERO 0x0100
149:cdc_enumerate.c **** #define STD_CLEAR_FEATURE_INTERFACE 0x0101
150:cdc_enumerate.c **** #define STD_CLEAR_FEATURE_ENDPOINT 0x0102
151:cdc_enumerate.c ****
152:cdc_enumerate.c **** #define STD_SET_FEATURE_ZERO 0x0300
153:cdc_enumerate.c **** #define STD_SET_FEATURE_INTERFACE 0x0301
154:cdc_enumerate.c **** #define STD_SET_FEATURE_ENDPOINT 0x0302
155:cdc_enumerate.c ****
156:cdc_enumerate.c **** #define STD_SET_ADDRESS 0x0500
157:cdc_enumerate.c **** #define STD_GET_DESCRIPTOR 0x0680
158:cdc_enumerate.c **** #define STD_SET_DESCRIPTOR 0x0700
159:cdc_enumerate.c **** #define STD_GET_CONFIGURATION 0x0880
160:cdc_enumerate.c **** #define STD_SET_CONFIGURATION 0x0900
161:cdc_enumerate.c **** #define STD_GET_INTERFACE 0x0A81
162:cdc_enumerate.c **** #define STD_SET_INTERFACE 0x0B01
163:cdc_enumerate.c **** #define STD_SYNCH_FRAME 0x0C82
164:cdc_enumerate.c ****
165:cdc_enumerate.c **** /* CDC Class Specific Request Code */
166:cdc_enumerate.c **** #define GET_LINE_CODING 0x21A1
167:cdc_enumerate.c **** #define SET_LINE_CODING 0x2021
168:cdc_enumerate.c **** #define SET_CONTROL_LINE_STATE 0x2221
169:cdc_enumerate.c ****
170:cdc_enumerate.c ****
171:cdc_enumerate.c **** typedef struct {
172:cdc_enumerate.c **** unsigned int dwDTERRate;
173:cdc_enumerate.c **** char bCharFormat;
174:cdc_enumerate.c **** char bParityType;
175:cdc_enumerate.c **** char bDataBits;
176:cdc_enumerate.c **** } AT91S_CDC_LINE_CODING, *AT91PS_CDC_LINE_CODING;
177:cdc_enumerate.c ****
178:cdc_enumerate.c **** AT91S_CDC_LINE_CODING line = {
179:cdc_enumerate.c **** 38400, // baudrate
180:cdc_enumerate.c **** 0, // 1 Stop Bit
181:cdc_enumerate.c **** 0, // None Parity
182:cdc_enumerate.c **** 8}; // 8 Data bits
183:cdc_enumerate.c ****
184:cdc_enumerate.c **** // mtmt uint currentReceiveBank = AT91C_UDP_RX_DATA_BK0;
185:cdc_enumerate.c ****
186:cdc_enumerate.c ****
187:cdc_enumerate.c **** static uchar AT91F_UDP_IsConfigured(AT91PS_CDC pCdc);
188:cdc_enumerate.c **** static uint AT91F_UDP_Read(AT91PS_CDC pCdc, char *pData, uint length);
189:cdc_enumerate.c **** static uint AT91F_UDP_Write(AT91PS_CDC pCdc, const char *pData, uint length);
190:cdc_enumerate.c **** static void AT91F_CDC_Enumerate(AT91PS_CDC pCdc);
191:cdc_enumerate.c ****
192:cdc_enumerate.c ****
193:cdc_enumerate.c **** //*----------------------------------------------------------------------------
194:cdc_enumerate.c **** //* \fn AT91F_CDC_Open
195:cdc_enumerate.c **** //* \brief
196:cdc_enumerate.c **** //*----------------------------------------------------------------------------
197:cdc_enumerate.c **** AT91PS_CDC AT91F_CDC_Open(AT91PS_CDC pCdc, AT91PS_UDP pUdp)
198:cdc_enumerate.c **** {
20 :
21 @ lr needed for prologue
22 .loc 1 199 0
199:cdc_enumerate.c **** pCdc->pUdp = pUdp;
23 r r1, [r0]
24 0000 0160 .loc 1 200 0
200:cdc_enumerate.c **** pCdc->currentConfiguration = 0;
25 ov r3, #0
26 0002 0023 strb r3, [r0, #4]
27 0004 0371 .loc 1 201 0
201:cdc_enumerate.c **** pCdc->currentConnection = 0;
28 rb r3, [r0, #5]
29 0006 4371 .loc 1 202 0
202:cdc_enumerate.c **** pCdc->currentRcvBank = AT91C_UDP_RX_DATA_BK0;
30 ov r3, #2
31 0008 0223 str r3, [r0, #8]
32 000a 8360 .loc 1 203 0
203:cdc_enumerate.c **** pCdc->IsConfigured = AT91F_UDP_IsConfigured;
33 r r3, .L3
34 000c 034B str r3, [r0, #12]
35 000e C360 .loc 1 204 0
204:cdc_enumerate.c **** pCdc->Write = AT91F_UDP_Write;
36 r r3, .L3+4
37 0010 034B str r3, [r0, #16]
38 0012 0361 .loc 1 205 0
205:cdc_enumerate.c **** pCdc->Read = AT91F_UDP_Read;
39 r r3, .L3+8
40 0014 034B str r3, [r0, #20]
41 0016 4361 .LVL1:
42 .loc 1 207 0
206:cdc_enumerate.c **** return pCdc;
207:cdc_enumerate.c **** }
43 p needed for prologue
44 bx lr
45 0018 7047 .L4:
46 .align 2
47 001a 0000 .L3:
48 .word AT91F_UDP_IsConfigured
49 001c 00000000 .word AT91F_UDP_Write
50 0020 00000000 .word AT91F_UDP_Read
51 0024 00000000 .LFE290:
53 .section .text.AT91F_USB_SendData,"ax",%progbits
54 .align 2
55 .code 16
56 .thumb_func
58 AT91F_USB_SendData:
59 .LFB294:
60 .loc 1 311 0
208:cdc_enumerate.c ****
209:cdc_enumerate.c **** //*----------------------------------------------------------------------------
210:cdc_enumerate.c **** //* \fn AT91F_UDP_IsConfigured
211:cdc_enumerate.c **** //* \brief Test if the device is configured and handle enumeration
212:cdc_enumerate.c **** //*----------------------------------------------------------------------------
213:cdc_enumerate.c **** static uchar AT91F_UDP_IsConfigured(AT91PS_CDC pCdc)
214:cdc_enumerate.c **** {
215:cdc_enumerate.c **** AT91PS_UDP pUDP = pCdc->pUdp;
216:cdc_enumerate.c **** AT91_REG isr = pUDP->UDP_ISR;
217:cdc_enumerate.c ****
218:cdc_enumerate.c **** if (isr & AT91C_UDP_ENDBUSRES) {
219:cdc_enumerate.c **** pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
220:cdc_enumerate.c **** // reset all endpoints
221:cdc_enumerate.c **** pUDP->UDP_RSTEP = (unsigned int)-1;
222:cdc_enumerate.c **** pUDP->UDP_RSTEP = 0;
223:cdc_enumerate.c **** // Enable the function
224:cdc_enumerate.c **** pUDP->UDP_FADDR = AT91C_UDP_FEN;
225:cdc_enumerate.c **** // Configure endpoint 0
226:cdc_enumerate.c **** pUDP->UDP_CSR[0] = (AT91C_UDP_EPEDS | AT91C_UDP_EPTYPE_CTRL);
227:cdc_enumerate.c **** }
228:cdc_enumerate.c **** else if (isr & AT91C_UDP_EPINT0) {
229:cdc_enumerate.c **** pUDP->UDP_ICR = AT91C_UDP_EPINT0;
230:cdc_enumerate.c **** AT91F_CDC_Enumerate(pCdc);
231:cdc_enumerate.c **** }
232:cdc_enumerate.c **** return pCdc->currentConfiguration;
233:cdc_enumerate.c **** }
234:cdc_enumerate.c ****
235:cdc_enumerate.c **** //*----------------------------------------------------------------------------
236:cdc_enumerate.c **** //* \fn AT91F_UDP_Read
237:cdc_enumerate.c **** //* \brief Read available data from Endpoint OUT
238:cdc_enumerate.c **** //*----------------------------------------------------------------------------
239:cdc_enumerate.c **** static uint AT91F_UDP_Read(AT91PS_CDC pCdc, char *pData, uint length)
240:cdc_enumerate.c **** {
241:cdc_enumerate.c **** AT91PS_UDP pUdp = pCdc->pUdp;
242:cdc_enumerate.c **** uint packetSize, nbBytesRcv = 0, currentReceiveBank = pCdc->currentRcvBank;
243:cdc_enumerate.c ****
244:cdc_enumerate.c **** while (length) {
245:cdc_enumerate.c **** if ( !AT91F_UDP_IsConfigured(pCdc) )
246:cdc_enumerate.c **** break;
247:cdc_enumerate.c **** if ( pUdp->UDP_CSR[AT91C_EP_OUT] & currentReceiveBank ) {
248:cdc_enumerate.c **** packetSize = MIN(pUdp->UDP_CSR[AT91C_EP_OUT] >> 16, length);
249:cdc_enumerate.c **** length -= packetSize;
250:cdc_enumerate.c **** if (packetSize < AT91C_EP_OUT_SIZE)
251:cdc_enumerate.c **** length = 0;
252:cdc_enumerate.c **** while(packetSize--)
253:cdc_enumerate.c **** pData[nbBytesRcv++] = pUdp->UDP_FDR[AT91C_EP_OUT];
254:cdc_enumerate.c **** pUdp->UDP_CSR[AT91C_EP_OUT] &= ~(currentReceiveBank);
255:cdc_enumerate.c **** if (currentReceiveBank == AT91C_UDP_RX_DATA_BK0)
256:cdc_enumerate.c **** currentReceiveBank = AT91C_UDP_RX_DATA_BK1;
257:cdc_enumerate.c **** else
258:cdc_enumerate.c **** currentReceiveBank = AT91C_UDP_RX_DATA_BK0;
259:cdc_enumerate.c ****
260:cdc_enumerate.c **** }
261:cdc_enumerate.c **** }
262:cdc_enumerate.c **** pCdc->currentRcvBank = currentReceiveBank;
263:cdc_enumerate.c **** return nbBytesRcv;
264:cdc_enumerate.c ****
265:cdc_enumerate.c **** }
266:cdc_enumerate.c ****
267:cdc_enumerate.c **** //*----------------------------------------------------------------------------
268:cdc_enumerate.c **** //* \fn AT91F_CDC_Write
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -