📄 usb.lst
字号:
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 5
241 1 {
242 2 if(i_st & D12_INT_BUSRESET)
243 2 {
244 3 bus_reset();//USB总线服务
245 3 bEPPflags.bits.bus_reset = 1;
246 3 }
247 2 if(i_st & D12_INT_EOT)
248 2 dma_eot();//DMA传输结束
249 2 if(i_st & D12_INT_SUSPENDCHANGE)
250 2 bEPPflags.bits.suspend = 1;//挂起改变
251 2 if(i_st & D12_INT_ENDP0IN)
252 2 ep0_txdone();//端点0IN中断
253 2 if(i_st & D12_INT_ENDP0OUT)
254 2 ep0_rxdone();//端点0OUT中断
255 2 if(i_st & D12_INT_ENDP1IN)
256 2 ep1_txdone();//端点1IN中断
257 2 if(i_st & D12_INT_ENDP1OUT)
258 2 ep1_rxdone();//端点1OUT中断
259 2 if(i_st & D12_INT_ENDP2IN)
260 2 main_txdone();//端点2IN中断
261 2 if(i_st & D12_INT_ENDP2OUT)
262 2 main_rxdone();//端点2OUT中断
263 2 }
264 1 bEPPflags.bits.in_isr = 0;
265 1 }
266
267 //总线复位处理子程序
268 void bus_reset(void)
269 {
270 1 }
271
272 //端点0OUT中断
273 void ep0_rxdone(void)
274 {
275 1 unsigned char ep_last, i;
276 1 ep_last = D12_ReadLastTransactionStatus(0); //清中断标志
277 1 if (ep_last & D12_SETUPPACKET)
278 1 {
279 2 //接收到SETUP包
280 2 ControlData.wLength = 0;
281 2 ControlData.wCount = 0;
282 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
283 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) )
284 2 {
285 3 //SETUP包出错,返回
286 3 D12_SetEndpointStatus(0, 1);
287 3 D12_SetEndpointStatus(1, 1);
288 3 bEPPflags.bits.control_state = USB_IDLE;
289 3 return;
290 3 }
291 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
292 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
293 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
294 2
295 2 //对控制端点的输入/输出进行应答
296 2 D12_AcknowledgeEndpoint(0);
297 2 D12_AcknowledgeEndpoint(1);
298 2
299 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
300 2 ControlData.wCount = 0;
301 2
302 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 6
303 2 {
304 3 //从主机传输数据
305 3 bEPPflags.bits.setup_packet = 1;
306 3 bEPPflags.bits.control_state = USB_TRANSMIT; /* get command */
307 3 }
308 2 else
309 2 {
310 3 if (ControlData.DeviceRequest.wLength == 0)
311 3 {
312 4 bEPPflags.bits.setup_packet = 1;
313 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
314 4 }
315 3 else
316 3 {
317 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE)
318 4 {
319 5 //接收数据长度为0
320 5 bEPPflags.bits.control_state = USB_IDLE;
321 5 D12_SetEndpointStatus(0, 1);
322 5 D12_SetEndpointStatus(1, 1);
323 5 }
324 4 else
325 4 {
326 5 bEPPflags.bits.control_state = USB_RECEIVE; //设置接收状态
327 5 }
328 4 } // set command with data
329 3 } // else set command
330 2 } // if setup packet
331 1 else if (bEPPflags.bits.control_state == USB_RECEIVE)
332 1 {
333 2 //接收数据
334 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
335 2 ControlData.dataBuffer + ControlData.wCount);
336 2 ControlData.wCount += i;
337 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
338 2 {
339 3 //数据接收完毕
340 3 bEPPflags.bits.setup_packet = 1;
341 3 bEPPflags.bits.control_state = USB_IDLE;
342 3 }
343 2 }
344 1 else
345 1 {
346 2 bEPPflags.bits.control_state = USB_IDLE;//进入等待状态
347 2 }
348 1 }
349
350 //端点0IN处理
351 void ep0_txdone(void)
352 {
353 1
354 1 short i = ControlData.wLength - ControlData.wCount;
355 1
356 1 D12_ReadLastTransactionStatus(1); //清中断标志位
357 1 if (bEPPflags.bits.control_state != USB_TRANSMIT) return;//非发送状态,返回
358 1 if( i >= EP0_PACKET_SIZE)
359 1 {
360 2 //剩下数据大于16字节,发送16字节
361 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
362 2 ControlData.wCount += EP0_PACKET_SIZE;
363 2 bEPPflags.bits.control_state = USB_TRANSMIT;
364 2 }
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 7
365 1 else if( i != 0)
366 1 {
367 2 //发送剩下数据
368 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
369 2 ControlData.wCount += i;
370 2 bEPPflags.bits.control_state = USB_IDLE;
371 2
372 2 }
373 1 else if (i == 0)
374 1 {
375 2 D12_WriteEndpoint(1, 0, 0); //发送完毕,发送0字节
376 2 bEPPflags.bits.control_state = USB_IDLE;
377 2 }
378 1 }
379
380 //DMA结束处理
381 void dma_eot(void)
382 {
383 1 }
384
385 //端点1OUT处理
386 void ep1_txdone(void)
387 {
388 1 D12_ReadLastTransactionStatus(3); //清中断标志位
389 1 }
390
391 //端点1IN处理
392 void ep1_rxdone(void)
393 {
394 1 unsigned char len;
395 1
396 1 D12_ReadLastTransactionStatus(2); //清中断标志位
397 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);//读取数据
398 1 if(len != 0) bEPPflags.bits.ep1_rxdone = 1;//标志接收到数据
399 1 rcv_data_len = len ;
400 1 }
401
402 //主端点OUT控制
403 void main_txdone(void)
404 {
405 1 D12_ReadLastTransactionStatus(5); //清中断标志位
406 1 }
407
408 //主端点IN控制
409 void main_rxdone(void)
410 {
411 1 unsigned char len,epstatus;
412 1
413 1 D12_ReadLastTransactionStatus(4); //清中断标志位
414 1 len = D12_ReadEndpoint(4, 64, EpBuf); //接收数据
415 1 epstatus=D12_ReadEndpointStatus(4);
416 1 epstatus &= 0x60;
417 1 if (epstatus == 0x60) len = D12_ReadEndpoint(4, 64, EpBuf);//读取双缓冲区数据
418 1 rcv_data_len = len ;
419 1 bEPPflags.bits.ep2_rxdone = 1 ;
420 1 }
421 void reserved(void)
422 {
423 1 stall_ep0();
424 1 }
425
426
C51 COMPILER V7.20 USB 07/30/2004 10:23:30 PAGE 8
427 //获取设备状态
428 void get_status(void)
429 {
430 1 unsigned char endp, txdat[2];
431 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
432 1 unsigned char c;
433 1 if (bRecipient == USB_RECIPIENT_DEVICE)
434 1 {
435 2 if(bEPPflags.bits.remote_wakeup == 1) //获取远程唤醒状态
436 2 txdat[0] = 3;
437 2 else
438 2 txdat[0] = 1;
439 2 txdat[1]=0;
440 2 single_transmit(txdat, 2);
441 2 }
442 1 else if (bRecipient == USB_RECIPIENT_INTERFACE)
443 1 { //获取接口状态
444 2 txdat[0]=0;
445 2 txdat[1]=0;
446 2 single_transmit(txdat, 2);
447 2 }
448 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT)
449 1 { //获取端点状态
450 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
451 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
452 2 c = D12_SelectEndpoint(endp*2 + 1); /* Control-in */
453 2 else
454 2 c = D12_SelectEndpoint(endp*2); /* Control-out */
455 2 if(c & D12_STALL)
456 2 txdat[0] = 1;
457 2 else
458 2 txdat[0] = 0;
459 2 txdat[1] = 0;
460 2 single_transmit(txdat, 2);
461 2 }
462 1 else
463 1 stall_ep0();
464 1 }
465
466 //特性清除
467 void clear_feature(void)
468 {
469 1 unsigned char endp;
470 1 unsigned char bRecipient = ControlData.DeviceRequest.bmRequestType & USB_RECIPIENT;
471 1
472 1 if (bRecipient == USB_RECIPIENT_DEVICE && ControlData.DeviceRequest.wValue == USB_FEATURE_REMOTE_WAKEUP)
473 1 { //清除远程唤醒功能
474 2 DISABLE;
475 2 bEPPflags.bits.remote_wakeup = 0;
476 2 ENABLE;
477 2 single_transmit(0, 0);
478 2 }
479 1 else if (bRecipient == USB_RECIPIENT_ENDPOINT && ControlData.DeviceRequest.wValue == USB_FEATURE_ENDPOINT
-_STALL)
480 1 { //清除端点stall
481 2 endp = (unsigned char)(ControlData.DeviceRequest.wIndex & MAX_ENDPOINTS);
482 2 if (ControlData.DeviceRequest.wIndex & (unsigned char)USB_ENDPOINT_DIRECTION_MASK)
483 2 /* clear TX stall for IN on EPn. */
484 2 D12_SetEndpointStatus(endp*2 + 1, 0);
485 2 else
486 2 /* clear RX stall for OUT on EPn. */
487 2 D12_SetEndpointStatus(endp*2, 0);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -