📄 usb.lst
字号:
95 =1 // Standard EndPoint Descriptor 7 bytes
96 =1 typedef struct
97 =1 { BYTE bLength;
98 =1 BYTE bType; //the constant endpoint(05h);
99 =1 BYTE bEPAdd; //includes the endpoint number(bits 0 through 3) and direction(bit 7);
100 =1 BYTE bAttr; //bits 1 and 0 specify the type of transfer the endpoint supports.00=control,10=bulk...
-;
101 =1 WORD wPayLoad; //maximum packet size supported; low-speed this must be 0x08
102 =1 BYTE bInterval; //for full-speed bulk and control transfers,the value is ignored.
103 =1 } sEPDesc, *pEPDesc;
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 9
104 =1
105 =1 /*-------------------------------------------------------------------------
106 =1 * Standard Chapter 9 definition
107 =1 *-------------------------------------------------------------------------
108 =1 */
109 =1 #define GET_STATUS 0x00
110 =1 #define CLEAR_FEATURE 0x01
111 =1 #define SET_FEATURE 0x03
112 =1 #define SET_ADDRESS 0x05
113 =1 #define GET_DESCRIPTOR 0x06
114 =1 #define SET_DESCRIPTOR 0x07
115 =1 #define GET_CONFIG 0x08
116 =1 #define SET_CONFIG 0x09
117 =1 #define GET_INTERFACE 0x0a
118 =1 #define SET_INTERFACE 0x0b
119 =1 #define SYNCH_FRAME 0x0c
120 =1
121 =1
122 =1 #define DEVICE 0x01
123 =1 #define CONFIGURATION 0x02
124 =1 #define STRING 0x03
125 =1 #define INTERFACE 0x04
126 =1 #define ENDPOINT 0x05
127 =1
128 =1 #define STDCLASS 0x00
129 =1 /*-------------------------------------------------------------------------
130 =1 * USB Host control command definitions
131 =1 *-------------------------------------------------------------------------
132 =1 */
133 =1 //cmd
134 =1 #define WRITE0 0x42
135 =1 #define WRITE1 0xc2
136 =1 #define READ 0x04
137 =1
138 =1 #define SETUP 0x41
139 =1 #define SEND_ACK 0x20
140 =1 //pid
141 =1 #define PID_SETUP 0xD0
142 =1 #define PID_IN 0x90
143 =1 #define PID_OUT 0x10
144 =1 //flag
145 =1 #define DEV_TGL 0x01
146 =1 #define PKT_VLD 0x04
147 =1 #define PKT_ERR 0x02
148 =1 #define PKT_DATA 0x40
149 =1 #define PKT_SENT 0x02
150 =1 #define DEV_ACK 0x20
151 =1 #define DEV_NAK 0x10
152 =1 #define DEV_STALL 0x08
153 =1 #define DEV_TO 0x80
154 =1
155 =1
156 =1 // Alarms
157 =1 #define MP3_REQ 0x02
158 =1
159 =1 void usbBufRead(unsigned char *s, unsigned char c);
160 =1 void usbBufWrite(unsigned char *s, unsigned char c);
161 =1 void usbReset(void);
162 =1 unsigned char usbXfer(unsigned char endPoint);
163 =1 unsigned char ep0Xfer(void);
164 =1 unsigned char epBulkSend(unsigned char *pBuffer,unsigned int len);
165 =1 unsigned char epBulkRcv(unsigned char *pBuffer,unsigned int len);
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 10
166 =1 unsigned char setAddress(unsigned char addr);
167 =1 unsigned char setConfiguration(void);
168 =1 unsigned char setDesc(void);
169 =1 unsigned char enumUsbDev(BYTE usbaddr);
170 =1 void usbInit(void);
171 =1 void checkKeyLED(void);
172 =1
3
4 unsigned char PassToggleCheckSoftware();
5
6 extern XXGFLAGS bdata bXXGFlags; //union XXGFLAGS is defined in common.h
7 XXGPKG usbstack; //struct XXGPKG is defined in usb.h
8 //usbstack holds parameters to be passed to low-level functions
9
10 extern UINT8 xdata DBUF[SECT_LEN];
11 //???\|/
12 USBDEV data uDev;
13 //pUSBDEV xdata uDev; // Multiple USB devices attributes, Max 5 devices
14
15 void usbBufRead(unsigned char *s, unsigned char c)
16 {
17 1 unsigned char i;
18 1 unsigned char *addr;
19 1 addr = s;
20 1 // if(BufStatusAddr&0x01) //bufstatus[0]=1:empty
21 1 // {
22 1 // Scratch = 0xab;
23 1 // }
24 1 // else
25 1 // {
26 1 for(i=0;i<c;i++)
27 1 {
28 2 ACC = BufAddr;
29 2 *addr = ACC;
30 2 addr++;
31 2 }
32 1 // }
33 1 }
34
35 void usbBufWrite(unsigned char *s, unsigned char c)
36 {
37 1 unsigned char *addr;
38 1 addr = s;
39 1 if(BufStatusAddr&0x02) //bufstatus[1]=1:full
40 1 return;
41 1 else
42 1 {
43 2 while(c)
44 2 {
45 3 ACC = *addr;
46 3 BufAddr = ACC;
47 3 addr++;
48 3 c--;
49 3 }
50 2 }
51 1 }
52
53 //*****************************************************************************************
54 // USB variables initialization
55 //*****************************************************************************************
56 void usbReset(void)
57 {
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 11
58 1 unsigned char temp;
59 1 temp = SieCtrl;
60 1 SieCtrl = temp|0x04; // SE0 reset
61 1 DelayMs(20);
62 1 SieCtrl = temp;
63 1 DelayMs(20); // reset recovery
64 1 SieStat0 = 0xff; // clear status regs
65 1 SieStat1 = 0xff;
66 1 }
67
68 //*****************************************************************************************
69 // usbXfer:
70 // successful transfer = return TRUE
71 // fail transfer = return FALSE
72 //*****************************************************************************************
73 #define MAX_NAK_CNT 200
74 static unsigned char ConsecutiveNAKCount = 0;
75 unsigned char usbXfer(unsigned char endPoint)
76 {
77 1 unsigned char xferLen, cmd;
78 1 unsigned char intr, result;
79 1 unsigned char devTglSt; // device toggle state
80 1
81 1 bXXGFlags.DATA_STOP=FALSE;
82 1 bXXGFlags.TIMEOUT_ERR=FALSE;
83 1 //------------------------------------------------
84 1 // Define data transfer payload
85 1 //------------------------------------------------
86 1 if (usbstack.wLen >= usbstack.wPayload) // select proper data payload
87 1 xferLen = usbstack.wPayload; // limit to wPayload size
88 1 else // else take < payload len
89 1 xferLen = usbstack.wLen;
90 1
91 1 TxPktlen = xferLen; // data transfer length
92 1
93 1 // For IN token, simply send IN token
94 1 if (usbstack.pid==PID_IN)
95 1 {
96 2 // BufRst = 0x00;
97 2 BufSel = USB2MCU; //src=USB,dest=CPU
98 2 BufRst = 0x01; // reset wr ptr
99 2 BufRst = 0x00;
100 2 cmd = READ;
101 2 }
102 1 // For OUT token
103 1 else if(usbstack.pid==PID_OUT) // for OUT tokens
104 1 {
105 2 if(xferLen)
106 2 {
107 3 BufRst = 0x03;
108 3 BufRst = 0x00;
109 3 BufSel = MCU2USB; //src=CPU,dest=USB
110 3 usbBufWrite(usbstack.buffer,xferLen); // data to transfer on USB
111 3 if (xferLen < 64)
112 3 {
113 4 BufRst = 0x03; // flip buffer state for bus read
114 4 BufRst = 0x00;
115 4 }
116 3 }
117 2
118 2 if (bXXGFlags.bToggle) // DATA0 or DATA1
119 2 cmd = WRITE1;
C51 COMPILER V8.02 USB 09/19/2006 15:01:22 PAGE 12
120 2 else
121 2 cmd = WRITE0;
122 2 }
123 1 // For SETUP token
124 1 else
125 1 {
126 2 if(xferLen)
127 2 {
128 3 intr=usbstack.setup.wLength;
129 3 usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
130 3 usbstack.setup.wIndex=WordSwap(usbstack.setup.wIndex);
131 3 usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
132 3 BufRst = 0x03;
133 3 BufRst = 0x00;
134 3 BufSel = MCU2USB; //src=CPU,dest=USB
135 3 usbBufWrite((unsigned char *)&usbstack.setup,xferLen);
136 3 if (xferLen < 64)
137 3 {
138 4 BufRst = 0x03;
139 4 BufRst = 0x00;
140 4 }
141 3 usbstack.setup.wLength=intr;
142 3 }
143 2 cmd = SETUP;
144 2 }
145 1 // here goes the packet.....
146 1 SieStat0 = 0xff; // clear status register before each transfer
147 1 SieStat1 = 0xff;
148 1 TxCtrl = cmd; // Send packet
149 1 //------------------------------------------------
150 1 // Main loop for completing a wLen data trasnfer
151 1 //------------------------------------------------
152 1 DelayUs(20); // add some delay here...
153 1
154 1 ConsecutiveNAKCount = 0;
155 1
156 1 while(TRUE) //
157 1 {
158 2 DelayUs(10); // more delay before polling the status.
159 2 intr = SieStat0;
160 2
161 2 if(usbstack.pid==PID_IN)
162 2 {
163 3 //
164 3 // if (intr & PKT_DATA) // got data packet
165 3 // {
166 3 // SieStat0 = PKT_DATA;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -