📄 sl811.lst
字号:
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 1
C51 COMPILER V6.20c, COMPILATION OF MODULE SL811
OBJECT MODULE PLACED IN SL811.OBJ
COMPILER INVOKED BY: D:\Hardware\Keilc620\C51\Bin\C51.EXE SL811.C DB OE SMALL ROM(LARGE)
stmt level source
1 #include "common.h"
2 #include "SL811.H"
3 #include "HAL.H"
4 #include "HPI.H"
5
6 extern unsigned char xdata SL811H_ADDR _at_ SL811_ADDR_PORT;
7 extern unsigned char xdata SL811H_DATA _at_ SL811_DATA_PORT;
8
9 extern XXGFLAGS bdata bXXGFlags;
10
11 XXGPKG usbstack;
12 unsigned char remainder;
13 extern UART_CMD_BLOCK xdata UartCmdBlock;
14 extern UART_RSP_BLOCK xdata UartRspBlock;
15 unsigned char xdata DBUF[BUFFER_LENGTH];
16 extern unsigned char xdata UARTBUF[UARTBUF_LENGTH];
17 pUSBDEV idata uDev; // Multiple USB devices attributes, Max 5 devices
18 extern unsigned char opLun;
19 unsigned int idata SL811_ERR_COUNTER=0;
20
21 //*****************************************************************************************
22 // SL811H variables initialization
23 //*****************************************************************************************
24
25 unsigned char SL811_GetRev(void)
26 {
27 1 //SL811Write(SL811_ADDR_PORT, 0x0e);
28 1 return SL811Read(0x0e);
29 1 }
30
31 void USBReset(void)
32 {
33 1 unsigned char temp;
34 1 temp=SL811Read(CtrlReg);
35 1 temp=temp&0xe7;
36 1 SL811Write(CtrlReg,temp|0x08);
37 1 DelayMs(125);
38 1 SL811Write(CtrlReg,temp);
39 1 }
40
41 //*****************************************************************************************
42 // usbXfer:
43 // successful transfer = return TRUE
44 // fail transfer = return FALSE
45 //*****************************************************************************************
46 unsigned char usbXfer(void)
47 {
48 1
49 1 unsigned char xferLen, data0, data1,cmd,offset;
50 1 unsigned char idata intr,result,remainder,dataX,bufLen,addr,timeout;
51 1 unsigned char idata bEnd;
52 1
53 1 //------------------------------------------------
54 1 // Default setting for usb trasnfer
55 1 //------------------------------------------------
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 2
56 1 dataX=timeout=bEnd=0;
57 1 offset=0;
58 1 //result = SL811Read(EP0Status);
59 1 data0 = EP0_Buf; // DATA0 buffer address
60 1 //data1 = data0 + (unsigned char)usbstack.wPayload; // DATA1 buffer address
61 1 data1=EP1_Buf;
62 1 bXXGFlags.DATA_STOP=FALSE;
63 1 bXXGFlags.TIMEOUT_ERR=FALSE;
64 1 //------------------------------------------------
65 1 // Define data transfer payload
66 1 //------------------------------------------------
67 1 if (usbstack.wLen >= usbstack.wPayload) // select proper data payload
68 1 xferLen = usbstack.wPayload; // limit to wPayload size
69 1 else // else take < payload len
70 1 xferLen = usbstack.wLen; //
71 1
72 1 // For IN token
73 1 if (usbstack.pid==PID_IN) // for current IN tokens
74 1 { //
75 2 cmd = sDATA0_RD; // FS/FS on Hub, sync to sof
76 2 }
77 1 // For OUT token
78 1 else if(usbstack.pid==PID_OUT) // for OUT tokens
79 1 {
80 2 SL811BufWrite(data0,usbstack.buffer,xferLen); // data to transfer on USB
81 2 cmd = sDATA0_WR;
82 2 // FS/FS on Hub, sync to sof
83 2 bXXGFlags.bData1 = uDev.bData1[usbstack.endpoint];
84 2 uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
85 2 if(bXXGFlags.bData1==1)
86 2 cmd |= 0x40; // Set Data1 bit in command
87 2 //bXXGFlags.bData1=!bXXGFlags.bData1;
88 2 //dataX++;
89 2
90 2 /*
91 2 usbstack.wLen -= (WORD)xferLen;
92 2 usbstack.buffer += xferLen;
93 2
94 2 if(usbstack.wLen) //write buffer for ping-pong
95 2 {
96 2 SL811BufWrite(data1,usbstack.buffer,64);
97 2 usbstack.wLen-= 64;
98 2 usbstack.buffer+=64;
99 2 dataX++;
100 2 }
101 2 else
102 2 bEnd = 1;
103 2 */
104 2 }
105 1 // For SETUP/OUT token
106 1 else // for current SETUP/OUT tokens
107 1 {
108 2 if(xferLen) // only when there are
109 2 {
110 3 intr=usbstack.setup.wLength;
111 3 usbstack.setup.wValue=WordSwap(usbstack.setup.wValue);
112 3 usbstack.setup.wIndex=WordSwap(usbstack.setup.wIndex);
113 3 usbstack.setup.wLength=WordSwap(usbstack.setup.wLength);
114 3 SL811BufWrite(data0,(unsigned char *)&usbstack.setup,xferLen); // data to transfer on USB
115 3 usbstack.setup.wLength=intr;
116 3 }
117 2 cmd = sDATA0_WR; // FS/FS on Hub, sync to sof
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 3
118 2 }
119 1 //------------------------------------------------
120 1 // For EP0's IN/OUT token data, start with DATA1
121 1 // Control Endpoint0's status stage.
122 1 // For data endpoint, IN/OUT data, start ????
123 1 //------------------------------------------------
124 1 if (usbstack.endpoint == 0 && usbstack.pid != PID_SETUP) // for Ep0's IN/OUT token
125 1 cmd |= 0x40; // always set DATA1
126 1 //------------------------------------------------
127 1 // Arming of USB data transfer for the first pkt
128 1 //------------------------------------------------
129 1 SL811Write(EP0Status,((usbstack.endpoint&0x0F)|usbstack.pid)); // PID + EP address
130 1 SL811Write(EP0Counter,usbstack.usbaddr); // USB address
131 1 SL811Write(EP0Address,data0); // buffer address, start with "data0"
132 1 SL811Write(EP0XferLen,xferLen); // data transfer length
133 1 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
134 1 SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here
135 1
136 1 SL811Write(EP1Status,((usbstack.endpoint&0x0F)|usbstack.pid)); // PID + EP address
137 1 SL811Write(EP1Counter,usbstack.usbaddr); // USB address
138 1 SL811Write(EP1Address,data1); // buffer address, start with "data0"
139 1 SL811Write(EP1XferLen,64); // data transfer length
140 1 //SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
141 1 //SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here
142 1
143 1 //------------------------------------------------
144 1 // Main loop for completing a wLen data trasnfer
145 1 //------------------------------------------------
146 1 while(TRUE)
147 1 {
148 2 //---------------Wait for done interrupt------------------
149 2 while(TRUE) // always ensure requested device is
150 2 { // inserted at all time, then you will
151 3 intr = SL811Read(IntStatus);
152 3 // wait for interrupt to be done, and
153 3 if((intr & USB_RESET) || (intr & INSERT_REMOVE)) // proceed to parse result from slave
154 3 { // device.
155 4 bXXGFlags.DATA_STOP = TRUE; // if device is removed, set DATA_STOP
156 4 return FALSE; // flag true, so that main loop will
157 4 } // know this condition and exit gracefully
158 3 if((intr & USB_A_DONE)&&((offset==0)))
159 3 break;
160 3 if((intr & USB_B_DONE)&&((offset>0)))
161 3 break; // interrupt done !!!
162 3 }
163 2
164 2 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
165 2 result = SL811Read(EP0Status); // read EP0status register
166 2 remainder = SL811Read(EP0Counter); // remainder value in last pkt xfer
167 2 //while
168 2 //-------------------------ACK----------------------------
169 2 if (result & EP0_ACK) // Transmission ACK
170 2 {
171 3
172 3 // SETUP TOKEN
173 3 if(usbstack.pid == PID_SETUP) // do nothing for SETUP/OUT token
174 3 break; // exit while(1) immediately
175 3 // OUT TOKEN
176 3 else if(usbstack.pid == PID_OUT)
177 3 {
178 4 usbstack.wLen -= (WORD)xferLen;
179 4 usbstack.buffer += xferLen;
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 4
180 4
181 4 if(!usbstack.wLen)
182 4 {
183 5 //bXXGFlags.bits.bData1=!bXXGFlags.bits.bData1;
184 5 break;
185 5 }
186 4 ////////////////////////////////////
187 4 if (usbstack.wLen >= usbstack.wPayload) // select proper data payload
188 4 xferLen = usbstack.wPayload; // limit to wPayload size
189 4 else // else take < payload len
190 4 xferLen = usbstack.wLen;
191 4 //addr=(dataX & 1) ? data1:data0;
192 4 addr=data0;
193 4 SL811BufWrite(addr,usbstack.buffer,xferLen);
194 4
195 4 cmd = sDATA0_WR;
196 4 bXXGFlags.bData1 = uDev.bData1[usbstack.endpoint];
197 4 uDev.bData1[usbstack.endpoint] = (uDev.bData1[usbstack.endpoint] ? 0 : 1); // DataToggle
198 4 //bXXGFlags.bits.bData1=!bXXGFlags.bits.bData1;
199 4 //cmd ^=0x40;
200 4 if(bXXGFlags.bData1==1)
201 4 cmd |= 0x40;
202 4 // always sync SOF when FS, regardless
203 4 SL811Write(EP0XferLen, xferLen); // select next xfer length
204 4 SL811Write(EP0Address, addr); // data buffer addr
205 4 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
206 4 SL811Write(EP0Control,cmd); // Enable USB transfer and re-arm
207 4
208 4 /* cmd ^=0x40;
209 4 // always sync SOF when FS, regardless
210 4 //SL811Write(EP0XferLen, 64);
211 4
212 4 offset=(dataX & 1) ? 0x8:0x0;
213 4 //SL811Write(EP0Address, (dataX & 1) ? EP1_Buf:EP0_Buf); // data buffer addr
214 4 SL811Write(EP0Control+offset,cmd);
215 4 bXXGFlags.bData1=!bXXGFlags.bData1;
216 4 if(!usbstack.wLen)
217 4 bEnd =1;
218 4 else
219 4 {
220 4 dataX++;
221 4 SL811BufWrite((dataX & 1) ? EP1_Buf:EP0_Buf,usbstack.buffer,64);
222 4 usbstack.wLen-= 64;
223 4 usbstack.buffer+=64;
224 4 //dataX++;
225 4 }
226 4 */
227 4 } //PID OUT
228 3 // IN TOKEN
229 3 else if(usbstack.pid == PID_IN)
230 3 { // for IN token only
231 4 usbstack.wLen -= (WORD)xferLen; // update remainding wLen value
232 4 cmd ^= 0x40; // toggle DATA0/DATA1
233 4 dataX++; // point to next dataX
234 4
235 4 //------------------------------------------------
236 4 // If host requested for more data than the slave
237 4 // have, and if the slave's data len is a multiple
238 4 // of its endpoint payload size/last xferLen. Do
239 4 // not overwrite data in previous buffer.
240 4 //------------------------------------------------
241 4 if(remainder==xferLen) // empty data detected
C51 COMPILER V6.20c SL811 04/07/2005 10:50:50 PAGE 5
242 4 bufLen = 0; // do not overwriten previous data
243 4 else // reset bufLen to zero
244 4 bufLen = xferLen; // update previous buffer length
245 4
246 4 //------------------------------------------------
247 4 // Arm for next data transfer when requested data
248 4 // length have not reach zero, i.e. wLen!=0, and
249 4 // last xferlen of data was completed, i.e.
250 4 // remainder is equal to zero, not a short pkt
251 4 //------------------------------------------------
252 4 if(!remainder && usbstack.wLen) // remainder==0 when last xferLen
253 4 { // was all completed or wLen!=0
254 5 addr = (dataX & 1) ? data1:data0; // select next address for data
255 5 xferLen = (BYTE)(usbstack.wLen>=usbstack.wPayload) ? usbstack.wPayload:usbstack.wLen; // get data len
-gth required
256 5 //if (FULL_SPEED) // sync with SOF transfer
257 5 cmd |= 0x20; // always sync SOF when FS, regardless
258 5 SL811Write(EP0XferLen, xferLen); // select next xfer length
259 5 SL811Write(EP0Address, addr); // data buffer addr
260 5 SL811Write(IntStatus,INT_CLEAR); // is a LS is on Hub.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -