⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdc_enumerate.lst

📁 高性能USB转串口(可高达10Mbps)完整的源代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
   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 + -