📄 host_811.lst
字号:
155 // s = return buffer address where data are to be save/read
156 // c = buffer data length
157 //*****************************************************************************************
158 void SL811BufRead(BYTE addr, BYTE *s, BYTE c)
159 {
160 1 SL811H_ADDR = addr;
161 1 while (c--)
162 1 *s++ = SL811H_DATA;
163 1 }
164
165 //*****************************************************************************************
166 // Buffer Write to SL811H
167 // addr = buffer start address
168 // s = buffer address where data are to be written
169 // c = buffer data length
170 //*****************************************************************************************
171 void SL811BufWrite(BYTE addr, BYTE *s, BYTE c)
172 {
173 1 SL811H_ADDR = addr;
174 1 while (c--)
175 1 SL811H_DATA = *s++;
176 1 }
177
178 //*****************************************************************************************
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 4
179 // Swap high and low byte
180 //*****************************************************************************************
181 WORD WordSwap(WORD input)
182 {
183 1 return(((input&0x00FF)<<8)|((input&0xFF00)>>8));
184 1 }
185
186 //*****************************************************************************************
187 // UsbReset during enumeration of device attached directly to SL811HS
188 //*****************************************************************************************
189 void USBReset()
190 {
191 1 BYTE tmp;
192 1 tmp = SL811Read(CtrlReg);
193 1 SL811Write(CtrlReg,tmp|0x08);
194 1 EZUSB_Delay(25);
195 1 SL811Write(CtrlReg,tmp);
196 1 }
197
198 //*****************************************************************************************
199 // usbXfer:
200 // successful transfer = return TRUE
201 // fail transfer = return FALSE
202 //*****************************************************************************************
203 int usbXfer(BYTE usbaddr, BYTE endpoint, BYTE pid, BYTE iso, WORD wPayload, WORD wLen, BYTE *buffer)
204 {
205 1 xdata BYTE cmd, result, timeout, intr;
206 1 xdata BYTE xferLen, bufLen, data0, data1, dataX, addr;
207 1
208 1 //------------------------------------------------
209 1 // Default setting for usb trasnfer
210 1 //------------------------------------------------
211 1 bufLen = dataX = timeout = 0; //reset all
212 1 data0 = EP0_Buf; // DATA0 buffer address
213 1 data1 = data0 + (BYTE)wPayload; // DATA1 buffer address
214 1 DATA_STOP = TIMEOUT_ERR = FALSE; // set default conditions
215 1
216 1 //------------------------------------------------
217 1 // Define data transfer payload
218 1 //------------------------------------------------
219 1 if (wLen >= wPayload) // select proper data payload
220 1 xferLen = wPayload; // limit to wPayload size
221 1 else // else take < payload len
222 1 xferLen = wLen; //
223 1
224 1 //------------------------------------------------
225 1 // For IN token
226 1 //------------------------------------------------
227 1 if (pid==PID_IN) // for current IN tokens
228 1 { //
229 2 if(FULL_SPEED) //
230 2 cmd = sDATA0_RD; // FS/FS on Hub, sync to sof
231 2 else // LS, no sync to sof for IN
232 2 cmd = DATA0_RD; //
233 2 //-------------------------------------------- response to OUT can propagate to SL811HS
234 2 // handling LS device on HUB
235 2 //--------------------------------------------
236 2 if(HUB_DEVICE && usbaddr!=HUB_ADDR) // Transfer on Hub, USB addr #0, #2..#5 only
237 2 {
238 3 if(uHub.bPortSpeed[usbaddr]) // If transfer of LS on Hub & previous is
239 3 cmd = psDATA0_RD; // SETUP & current is IN, no sync to sof,
240 3 }
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 5
241 2 }
242 1 //------------------------------------------------
243 1 // For OUT token
244 1 //------------------------------------------------
245 1 else if(pid==PID_OUT) // for OUT tokens
246 1 {
247 2 if(xferLen) // only when there are
248 2 SL811BufWrite(data0,buffer,xferLen); // data to transfer on USB
249 2
250 2 if(FULL_SPEED)
251 2 cmd = sDATA0_WR; // FS/FS on Hub, sync to sof
252 2 else // LS, no sync to sof for OUT
253 2 cmd = DATA0_WR;
254 2 //--------------------------------------------
255 2 // handling LS device on HUB
256 2 //--------------------------------------------
257 2 if(HUB_DEVICE && usbaddr!=HUB_ADDR) // Transfer on Hub, USB addr #0, #2..#5 only
258 2 {
259 3 if(uHub.bPortSpeed[usbaddr]) // If transfer of LS on Hub, previous
260 3 cmd = psDATA0_WR;
261 3 }
262 2 // implement data toggle
263 2 bData1 = uDev[usbaddr].bData1[endpoint];
264 2 uDev[usbaddr].bData1[endpoint] = (uDev[usbaddr].bData1[endpoint] ? 0 : 1); // DataToggle
265 2 if(bData1)
266 2 cmd |= 0x40; // Set Data1 bit in command
267 2 }
268 1 //------------------------------------------------
269 1 // For SETUP/OUT token
270 1 //------------------------------------------------
271 1 else // for current SETUP/OUT tokens
272 1 {
273 2 if(xferLen) // only when there are
274 2 SL811BufWrite(data0,buffer,xferLen); // data to transfer on USB
275 2
276 2 if(FULL_SPEED)
277 2 cmd = sDATA0_WR; // FS/FS on Hub, sync to sof
278 2 else // LS, no sync to sof for OUT
279 2 cmd = DATA0_WR;
280 2 //--------------------------------------------
281 2 // handling LS device on HUB
282 2 //--------------------------------------------
283 2 if(HUB_DEVICE && usbaddr!=HUB_ADDR) // Transfer on Hub, USB addr #0, #2..#5 only
284 2 {
285 3 if(uHub.bPortSpeed[usbaddr]) // If transfer of LS on Hub, previous
286 3 cmd = psDATA0_WR;
287 3 }
288 2 }
289 1
290 1 //------------------------------------------------
291 1 // Isochronous data transfer setting
292 1 //------------------------------------------------
293 1 if (iso)
294 1 cmd |= ISO_BIT; // if iso setup ISO mode
295 1
296 1 //------------------------------------------------
297 1 // For EP0's IN/OUT token data, start with DATA1
298 1 // Control Endpoint0's status stage.
299 1 // For data endpoint, IN/OUT data, start ????
300 1 //------------------------------------------------
301 1 if (endpoint == 0 && pid != PID_SETUP) // for Ep0's IN/OUT token
302 1 cmd |= 0x40; // always set DATA1
C51 COMPILER V7.50 HOST_811 10/27/2005 20:00:37 PAGE 6
303 1
304 1 //------------------------------------------------
305 1 // Arming of USB data transfer for the first pkt
306 1 //------------------------------------------------
307 1 SL811Write(EP0Status,((endpoint&0x0F)|pid)); // PID + EP address
308 1 SL811Write(EP0Counter,usbaddr); // USB address
309 1 SL811Write(EP0Address,data0); // buffer address, start with "data0"
310 1 SL811Write(EP0XferLen,xferLen); // data transfer length
311 1 SL811Write(IntStatus,INT_CLEAR); // clear interrupt status
312 1 SL811Write(EP0Control,cmd); // Enable ARM and USB transfer start here
313 1
314 1 //------------------------------------------------
315 1 // Main loop for completing a wLen data trasnfer
316 1 //------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -