?? chap_9.lst
字號:
186 1 //端點0接收到setup包處理
187 1 if(USB_Int_Flag.BITS.EP0SETUP)
188 1 {
189 2 EA_DISABLE;
190 2 USB_Setup();
191 2 EA_ENABLE;
192 2 }
193 1
194 1 //掛起處理
195 1 if(USB_Int_Flag.BITS.SUSP)
196 1 {
197 2 //清除掛起標志
198 2 EA_DISABLE;
199 2 USB_Int_Flag.BITS.SUSP = 0;
200 2 EA_ENABLE;
201 2 //ISP1581進入掛起狀態
202 2 D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 1;
203 2 D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 0;
204 2 }
205 1
206 1 //掛起恢復處理
207 1 if(USB_Int_Flag.BITS.RESUME)
208 1 {
209 2 //清除恢復標志
210 2 EA_DISABLE;
211 2 USB_Int_Flag.BITS.RESUME = 0;
212 2 EA_ENABLE;
213 2 //產生一個恢復信號
214 2 D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 1;
215 2 D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 0;
216 2 }
217 1
218 1 //高速狀態
219 1 if(USB_Int_Flag.BITS.HS_STAT)
220 1 {
221 2 //清除高速狀態標志
222 2 EA_DISABLE;
223 2 USB_Int_Flag.BITS.HS_STAT = 0;
224 2 EA_ENABLE;
225 2 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
226 2 {
227 3 //切換高速指示
228 3 HS_FS_LED = HIGH_SPEED_LED;
229 3 //設置高速模式狀態
230 3 Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
231 3 //重新配置高速端點
232 3 Init_Endpoint();
233 3
234 3 // PIO_Count = 64;
235 3 PIO_Count = 512;
236 3 }
237 2 }
238 1 }
239
240
241 //***********************************************************************
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 5
242 //* *
243 //* Routine : *
244 //* Input : None *
245 //* Output : None *
246 //* Function : *
247 //* *
248 //***********************************************************************
249 //建立包處理
250 void USB_Setup(void)
251 {
252 1 unsigned char type, req;
253 1
254 1 //清除EP0SETUP中斷標志
255 1 USB_Int_Flag.BITS.EP0SETUP = 0;
256 1 //清除總線復位標志
257 1 Kernel_Flag.BITS.Bus_Reset = 0;
258 1 //選擇端點0SETUP緩沖區
259 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
260 1
261 1 //讀取USB請求
262 1 //讀取請求類型
263 1 USB_Device_Request.bmRequestType = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
264 1 //讀取請求號
265 1 USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
266 1 //讀取16bit請求數據
267 1 USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
268 1 USB_Device_Request.wValue <<= 8;
269 1 USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
270 1 //讀取16bit請求索引
271 1 USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
272 1 USB_Device_Request.wIndex <<= 8;
273 1 USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
274 1 //讀取16bit長度
275 1 USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
276 1 USB_Device_Request.wLength <<= 8;
277 1 USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
278 1
279 1 //長度處理(高低8位對調)
280 1 Temp = USB_Device_Request.wLength;
281 1 USB_Device_Request.wLength = 0;
282 1 USB_Device_Request.wLength = (UC) Temp;
283 1 USB_Device_Request.wLength <<= 8;
284 1 Temp >>= 8;
285 1 USB_Device_Request.wLength |= Temp;
286 1
287 1 type = USB_Device_Request.bmRequestType & 0x60;
288 1 req = USB_Device_Request.bRequest & 0x0f;
289 1
290 1 //廠商請求
291 1 if (type == 0x40)
292 1 {
293 2 Vendor_Specific_Command();//廠商請求處理
294 2 }
295 1 else if (type == 0x00)
296 1 (*StandardDeviceRequest[req])();//調用標準請求
297 1 }
298
299 //***********************************************************************
300 //* *
301 //* Routine : *
302 //* Input : None *
303 //* Output : None *
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 6
304 //* Function : *
305 //* *
306 //***********************************************************************
307 //廠商請求處理
308 void Vendor_Specific_Command(void)
309 {
310 1 if(USB_Device_Request.bRequest == 0x0C)
311 1 {
312 2 switch (USB_Device_Request.wIndex)
313 2 {
314 3 case GET_FIRMWARE_VERSION ://獲取固件版本
315 3 if(USB_Device_Request.wLength == 1)
316 3 {
317 4 //select endpoint
318 4 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
319 4 //set the data length to 1 byte
320 4 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
321 4 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
322 4 //sent 0x21 as data
323 4 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x22;//版本號
324 4 wait_ep0tx();
325 4 ep0out_ack();
326 4 // ep0in_ack();
327 4 break;
328 4 }
329 3
330 3 case SETUP_DMA_REQUEST :
331 3 //Out Token Ack detected
332 3 wait_ep0rx();
333 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
334 3 //
335 3 FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
336 3 FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
337 3 FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
338 3 //讀取傳輸字節數
339 3 Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
340 3 bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
341 3 bytecount <<= 8;
342 3 bytecount |= Temp;
343 3 //讀取傳輸方式
344 3 FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
345 3 ep0in_ack();
346 3 Kernel_Flag.BITS.Transfer_Start = 1;//標志傳輸數據開始
347 3 break;
348 3
349 3 case GET_SET_EEPROM_REQUEST ://對EEPROM操作的請求
350 3 //Out Token Ack detected
351 3 wait_ep0rx();
352 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
353 3 //
354 3 FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
355 3 FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
356 3 FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
357 3 //讀取傳輸字節數
358 3 Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
359 3 bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
360 3 bytecount <<= 8;
361 3 bytecount |= Temp;
362 3 bytecouter=(UC)bytecount;
363 3 //讀取傳輸方式
364 3 FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
365 3 ep0in_ack();
C51 COMPILER V7.06 CHAP_9 07/02/2003 10:05:13 PAGE 7
366 3 Kernel_Flag.BITS.Transfer_Start = 1;//標志傳輸數據開始
367 3 break;
368 3 default :
369 3 if(USB_Device_Request.bmRequestType == 0xC0)
370 3 {
371 4 ep0in_ack();
372 4 break;
373 4 }
374 3 if(USB_Device_Request.bmRequestType == 0x40)
375 3 {
376 4 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
377 4 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
378 4 while(!USB_Int_Flag.BITS.EP0SETUP)
379 4 {
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -