📄 usbhw.lst
字号:
300 1 AT91C_UDP_RX_DATA_BK0 | AT91C_UDP_RX_DATA_BK1 |
301 1 AT91C_UDP_TXPKTRDY | AT91C_UDP_FORCESTALL |
302 1 AT91C_UDP_STALLSENT);
303 1 pUDP->UDP_RSTEP |= 1 << EPNum;
304 1 pUDP->UDP_RSTEP &= ~(1 << EPNum);
305 1 RxDataBank[EPNum] = 0;
306 1 TxDataBank[EPNum] = 0;
307 1 }
308
309
310 /*
311 * Set Stall for USB Endpoint
312 * Parameters: EPNum: Endpoint Number
313 * EPNum.0..3: Address
314 * EPNum.7: Dir
315 * Return Value: None
316 */
317
318 void USB_SetStallEP (DWORD EPNum) {
319 1 pUDP->UDP_CSR[EPNum & 0x0F] |= AT91C_UDP_FORCESTALL;
320 1 }
321
322
323 /*
ARM COMPILER V2.51a, usbhw 16/08/06 09:38:29 PAGE 6
324 * Clear Stall for USB Endpoint
325 * Parameters: EPNum: Endpoint Number
326 * EPNum.0..3: Address
327 * EPNum.7: Dir
328 * Return Value: None
329 */
330
331 void USB_ClrStallEP (DWORD EPNum) {
332 1 pUDP->UDP_CSR[EPNum & 0x0F] &= ~AT91C_UDP_FORCESTALL;
333 1 }
334
335
336 /*
337 * Read USB Endpoint Data
338 * Parameters: EPNum: Endpoint Number
339 * EPNum.0..3: Address
340 * EPNum.7: Dir
341 * pData: Pointer to Data Buffer
342 * Return Value: Number of bytes read
343 */
344
345 DWORD USB_ReadEP (DWORD EPNum, BYTE *pData) {
346 1 DWORD cnt, n;
347 1
348 1 EPNum &= 0x0F;
349 1 cnt = (pUDP->UDP_CSR[EPNum] >> 16) & 0x07FF;
350 1 for (n = 0; n < cnt; n++) {
351 2 *pData++ = (BYTE)pUDP->UDP_FDR[EPNum];
352 2 }
353 1 return (cnt);
354 1 }
355
356
357 /*
358 * Write USB Endpoint Data
359 * Parameters: EPNum: Endpoint Number
360 * EPNum.0..3: Address
361 * EPNum.7: Dir
362 * pData: Pointer to Data Buffer
363 * cnt: Number of bytes to write
364 * Return Value: Number of bytes written
365 */
366
367 DWORD USB_WriteEP (DWORD EPNum, BYTE *pData, DWORD cnt) {
368 1 DWORD n;
369 1
370 1 EPNum &= 0x0F;
371 1 if (pUDP->UDP_CSR[EPNum] & AT91C_UDP_TXPKTRDY) {
372 2 if ((DualBankEP & (1 << EPNum)) && (TxDataBank[EPNum] == 0)) {
373 3 TxDataBank[EPNum] = 1;
374 3 } else {
375 3 return (0);
376 3 }
377 2 }
378 1 for (n = 0; n < cnt; n++) {
379 2 pUDP->UDP_FDR[EPNum] = *pData++;
380 2 }
381 1 pUDP->UDP_CSR[EPNum] |= AT91C_UDP_TXPKTRDY;
382 1
383 1 return (cnt);
384 1 }
385
386
387 /*
388 * Get USB Last Frame Number
389 * Parameters: None
ARM COMPILER V2.51a, usbhw 16/08/06 09:38:29 PAGE 7
390 * Return Value: Frame Number
391 */
392
393 DWORD USB_GetFrame (void) {
394 1 DWORD val;
395 1
396 1 while ((pUDP->UDP_NUM & (AT91C_UDP_FRM_OK | AT91C_UDP_FRM_ERR)) == 0);
397 1 if (pUDP->UDP_NUM & AT91C_UDP_FRM_OK) {
398 2 val = pUDP->UDP_NUM & AT91C_UDP_FRM_NUM;
399 2 } else {
400 2 val = 0xFFFFFFFF;
401 2 }
402 1
403 1 return (val);
404 1 }
405
406
407
408 /*
409 * USB Interrupt Service Routine
410 */
411
412 void USB_ISR (void) __irq {
413 1 DWORD isr, csr, bkm, n;
414 1
415 1 while (isr = pUDP->UDP_ISR) {
416 2
417 2 /* End of Bus Reset Interrupt */
418 2 if (isr & AT91C_UDP_ENDBUSRES) {
419 3 USB_Reset();
420 3 #if USB_RESET_EVENT
421 3 USB_Reset_Event();
422 3 #endif
423 3 pUDP->UDP_ICR = AT91C_UDP_ENDBUSRES;
424 3 }
425 2
426 2 /* USB Suspend Interrupt */
427 2 if (isr & AT91C_UDP_RXSUSP) {
428 3 USB_Suspend();
429 3 #if USB_SUSPEND_EVENT
430 3 USB_Suspend_Event();
431 3 #endif
432 3 pUDP->UDP_ICR = AT91C_UDP_RXSUSP;
433 3 }
434 2
435 2 /* USB Resume Interrupt */
436 2 if (isr & AT91C_UDP_RXRSM) {
437 3 USB_Resume();
438 3 #if USB_RESUME_EVENT
439 3 USB_Resume_Event();
440 3 #endif
441 3 pUDP->UDP_ICR = AT91C_UDP_RXRSM;
442 3 }
443 2
444 2 /* External Resume Interrupt */
445 2 if (isr & AT91C_UDP_EXTRSM) {
446 3 USB_WakeUp();
447 3 #if USB_WAKEUP_EVENT
USB_WakeUp_Event();
#endif
450 3 pUDP->UDP_ICR = AT91C_UDP_EXTRSM;
451 3 }
452 2
453 2 /* Start of Frame Interrupt */
454 2 if (isr & AT91C_UDP_SOFINT) {
455 3 #if USB_SOF_EVENT
ARM COMPILER V2.51a, usbhw 16/08/06 09:38:29 PAGE 8
USB_SOF_Event();
#endif
458 3 pUDP->UDP_ICR = AT91C_UDP_SOFINT;
459 3 }
460 2
461 2 /* Endpoint Interrupts */
462 2 for (n = 0; n < USB_EP_NUM; n++) {
463 3 if (isr & (1 << n)) {
464 4
465 4 csr = pUDP->UDP_CSR[n];
466 4
467 4 /* Setup Packet Received Interrupt */
468 4 if (csr & AT91C_UDP_RXSETUP) {
469 5 if (USB_P_EP[n]) {
470 6 USB_P_EP[n](USB_EVT_SETUP);
471 6 }
472 5 /* Setup Flag is already cleared in USB_DirCtrlEP */
473 5 /* pUDP->UDP_CSR[n] &= ~AT91C_UDP_RXSETUP; */
474 5 }
475 4
476 4 /* Data Packet Received Interrupt */
477 4 bkm = RX_DATA_BK[RxDataBank[n]];
478 4 if (csr & bkm) {
479 5 if (USB_P_EP[n]) {
480 6 USB_P_EP[n](USB_EVT_OUT);
481 6 }
482 5 pUDP->UDP_CSR[n] &= ~bkm;
483 5 if (DualBankEP & (1 << n)) {
484 6 RxDataBank[n] ^= 1;
485 6 }
486 5 }
487 4
488 4 /* Data Packet Sent Interrupt */
489 4 if (csr & AT91C_UDP_TXCOMP) {
490 5 pUDP->UDP_CSR[n] &= ~AT91C_UDP_TXCOMP;
491 5 if (TxDataBank[n]) {
492 6 pUDP->UDP_CSR[n] |= AT91C_UDP_TXPKTRDY;
493 6 TxDataBank[n] = 0;
494 6 }
495 5 if (USB_P_EP[n]) {
496 6 USB_P_EP[n](USB_EVT_IN);
497 6 }
498 5 }
499 4
500 4 /* STALL Packet Sent Interrupt */
501 4 if (csr & AT91C_UDP_STALLSENT) {
502 5 if ((csr & AT91C_UDP_EPTYPE) == AT91C_UDP_EPTYPE_CTRL) {
503 6 if (USB_P_EP[n]) {
504 7 USB_P_EP[n](USB_EVT_IN_STALL);
505 7 /* USB_P_EP[n](USB_EVT_OUT_STALL); */
506 7 }
507 6 }
508 5 pUDP->UDP_CSR[n] &= ~AT91C_UDP_STALLSENT;
509 5 }
510 4
511 4 }
512 3 }
513 2
514 2 }
515 1
516 1 *AT91C_AIC_EOICR = 0; /* End of Interrupt */
517 1 }
ARM COMPILER V2.51a, usbhw 16/08/06 09:38:29 PAGE 9
ASSEMBLY LISTING OF GENERATED OBJECT CODE
*** EXTERNALS:
EXTERN CODE16 (USB_Reset_Event?T)
EXTERN CODE16 (USB_Suspend_Event?T)
EXTERN CODE16 (USB_Resume_Event?T)
EXTERN DATA (USB_P_EP)
EXTERN CODE32 (USB_Reset_Event?A)
EXTERN CODE32 (USB_Suspend_Event?A)
EXTERN CODE32 (USB_Resume_Event?A)
*** PUBLICS:
PUBLIC USB_Init?T
PUBLIC USB_Connect?T
PUBLIC USB_Reset?T
PUBLIC USB_Reset?A
PUBLIC USB_Suspend?T
PUBLIC USB_Suspend?A
PUBLIC USB_Resume?T
PUBLIC USB_Resume?A
PUBLIC USB_WakeUp?T
PUBLIC USB_WakeUp?A
PUBLIC USB_WakeUpCfg?T
PUBLIC USB_SetAddress?T
PUBLIC USB_Configure?T
PUBLIC USB_ConfigEP?T
PUBLIC USB_DirCtrlEP?T
PUBLIC USB_EnableEP?T
PUBLIC USB_DisableEP?T
PUBLIC USB_ResetEP?T
PUBLIC USB_SetStallEP?T
PUBLIC USB_ClrStallEP?T
PUBLIC USB_ReadEP?T
PUBLIC USB_WriteEP?T
PUBLIC USB_GetFrame?T
PUBLIC USB_ISR?A
PUBLIC DualBankEP
PUBLIC RX_DATA_BK
PUBLIC pUDP
PUBLIC RxDataBank
PUBLIC TxDataBank
*** DATA SEGMENT '?CON?usbhw':
00000000 RX_DATA_BK:
00000000 BEGIN_INIT
00000000 00000002 DD 0x2
00000004 00000040 DD 0x40
00000008 END_INIT
00000008 DualBankEP:
00000008 BEGIN_INIT
00000008 06 DB 0x6
00000009 END_INIT
*** DATA SEGMENT '?DT0?usbhw':
00000000 pUDP:
00000000 BEGIN_INIT
00000000 FFFB0000 DD 0xFFFB0000
00000004 END_INIT
00000004 RxDataBank:
00000004 DS 4
00000008 TxDataBank:
00000008 DS 4
*** CODE SEGMENT '?PR?USB_Init?T?usbhw':
48: AT91C_BASE_PMC->PMC_SCER = AT91C_PMC_UDP;
00000000 2180 MOV R1,#0x80
ARM COMPILER V2.51a, usbhw 16/08/06 09:38:29 PAGE 10
00000002 4800 LDR R0,=0xFFFFFC00
00000004 6001 STR R1,[R0,#0x0]
49: AT91C_BASE_PMC->PMC_PCER = (1 << AT91C_ID_UDP);
00000006 4800 LDR R1,=0x800
00000008 4800 LDR R0,=0xFFFFFC10
0000000A 6001 STR R1,[R0,#0x0]
53: AT91C_AIC_PRIOR_HIGHEST;
0000000C 2227 MOV R2,#0x27
0000000E 4800 LDR R0,=0xFFFFF02C
00000010 6002 STR R2,[R0,#0x0]
54: AT91C_BASE_AIC->AIC_SVR[AT91C_ID_UDP] = (unsigned long) USB_ISR;
00000012 4A00 LDR R2,=USB_ISR?A ; USB_ISR?A
00000014 4800 LDR R0,=0xFFFFF0AC
00000016 6002 STR R2,[R0,#0x0]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -