DEFINE SERVICE_TEXT,space=code,align=01H SEGMENT SERVICE_TEXT FILE "C:\USB\930CODE\ALTXFA~1\SERVICE.C" MODE=BINARY ; 1 /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ; 2 (C) Copyright Intel Corp., 1996 ; 3 ; 4 File: service.c ; 5 ; 6 Universal Serial Bus 930 Test firmware ; 7 ; 8 Revision History ; 9 --------------------------------------------- ; 10 0.1 05-27-96 Abdul Rahman Ismail ; 11 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ ; 12 ; 13 #include <8x930ax.h> ; 14 #include "defs.h" ; 15 ; 16 #include "service.h" ; 17 ; 18 #define EPINDEX (*((volatile sfr char *)0xf1)) ; 19 ; 20 // external functions. ; 21 extern void FillEP1Fifo( void ); ; 22 extern void FillEP2Fifo( void ); ; 23 ; 24 // external variables ; 25 extern BYTE gbEP1Running; ; 26 extern BYTE gbEP2Running; ; 27 ; 28 // function prototypes ; 29 reentrant void ServiceEndPoints( void ); ; 30 reentrant void CheckEPRunning( void ); ; 31 reentrant void CheckEPOverflow( void ); ; 32 ; 33 /*------------------------------------------------------------------- ; 34 Function name : ServiceEndPoints ; 35 Brief Description : Called whenever a new SOF is recd. Updates the ; 36 : TX fifos on all endpoints running. ; 37 -------------------------------------------------------------------*/ ; 38 ; 39 reentrant void ServiceEndPoints( void ) ; 40 { _ServiceEndPoints: ; 41 if (gbEP1Running == TRUE) MOV R15,00:_gbEP1Running CMP R15,#01H JMPNE L_2 ; 42 FillEP1Fifo(); LCALL _FillEP1Fifo L_2: ; 43 ; 44 if (gbEP2Running == TRUE) MOV R15,00:_gbEP2Running CMP R15,#01H JMPNE L_3 ; 45 FillEP2Fifo(); LCALL _FillEP2Fifo ; 46 } L_3: RET ; ;**************************** _ServiceEndPoints *************************** ;Name Addr/Register Size Type ;_FillEP2Fifo IMPORT ----- function ;_gbEP2Running IMPORT 1 variable ;_FillEP1Fifo IMPORT ----- function ;_gbEP1Running IMPORT 1 variable ; ;Local Frame Size: 4 (bytes) ; .FRAME ServiceEndPoints,_$_ServiceEndPoints,pdata .FCALL FillEP1Fifo .FCALL FillEP2Fifo SEGMENT SERVICE_TEXT ; 47 ; 48 /*------------------------------------------------------------------- ; 49 Function name : CheckEPRunning ; 50 Brief Description : Checks whether an endpoint has started sending data ; 51 to the host. If so then sets the gbEP1Running to ; 52 true. ; 53 --------------------------------------------------------------------*/ ; 54 ; 55 reentrant void CheckEPRunning( void ) ; 56 { _CheckEPRunning: ; 57 if (gbEP1Running == FALSE) MOV R15,00:_gbEP1Running CMP R15,#00H JMPNE L_8 ; 58 { ; 59 EPINDEX = 1; MOV R15,#01H MOV 0f1H,R15 ; 60 if ((TXFLG & GET_FIFO_BITS) != FIFO_FULL) MOV R15,0f5H MOVS WR14,R15 ANL WR14,#0c0H CMP WR14,#0c0H JMPE L_8 ; 61 gbEP1Running = TRUE; MOV R15,#01H MOV 00:_gbEP1Running,R15 ; 62 } L_8: ; 63 ; 64 if (gbEP2Running == FALSE) MOV R15,00:_gbEP2Running CMP R15,#00H JMPNE L_9 ; 65 { ; 66 EPINDEX = 2; MOV R15,#02H MOV 0f1H,R15 ; 67 if ((TXFLG & GET_FIFO_BITS) != FIFO_FULL) MOV R15,0f5H MOVS WR14,R15 ANL WR14,#0c0H CMP WR14,#0c0H JMPE L_9 ; 68 gbEP2Running = TRUE; MOV R15,#01H MOV 00:_gbEP2Running,R15 ; 69 } ; 70 } L_9: RET ; ;**************************** _CheckEPRunning *************************** ;Name Addr/Register Size Type ;_gbEP2Running IMPORT 1 variable ;_gbEP1Running IMPORT 1 variable ; ;Local Frame Size: 4 (bytes) ; .FRAME CheckEPRunning,_$_CheckEPRunning,pdata SEGMENT SERVICE_TEXT ; 71 ; 72 /*------------------------------------------------------------------- ; 73 Function name : CheckEPOverflow ; 74 Brief Description : Continuously called to check whether an overflow ; 75 has occured on any endpoint. If it has then the ; 76 endpoint is reset, and new data primed into the ; 77 fifos. ; 78 --------------------------------------------------------------------*/ ; 79 ; 80 reentrant void CheckEPOverflow( void ) ; 81 { _CheckEPOverflow: ; 82 EPINDEX = 1; MOV R15,#01H MOV 0f1H,R15 ; 83 if (TXOVF == TRUE) JMPNB S:0f5H.0,L_11 ; 84 { ; 85 gbEP1Running = FALSE; // Assume that the ep has stopped running MOV R15,#00H MOV 00:_gbEP1Running,R15 ; 86 ; 87 TXCLR = TRUE; // Clear the fifo. SETB S:0f4H.7 ; 88 ; 89 /* Fill the fifo with a known pattern */ ; 90 asm( "mov R8, #00h" ); mov R8, #00h ; 91 FillEP1Fifo(); LCALL _FillEP1Fifo ; 92 asm( "mov R8, #01h" ); mov R8, #01h ; 93 FillEP1Fifo(); LCALL _FillEP1Fifo ; 94 } L_11: ; 95 ; 96 EPINDEX = 2; MOV R15,#02H MOV 0f1H,R15 ; 97 if (TXOVF == TRUE ) JMPNB S:0f5H.0,L_13 ; 98 { ; 99 gbEP2Running = FALSE; MOV R15,#00H MOV 00:_gbEP2Running,R15 ; 100 ; 101 TXCLR = TRUE; SETB S:0f4H.7 ; 102 asm( "mov R8, #00h" ); mov R8, #00h ; 103 FillEP2Fifo(); LCALL _FillEP2Fifo ; 104 ; 105 asm( "mov R8, #01h" ); mov R8, #01h ; 106 FillEP2Fifo(); LCALL _FillEP2Fifo ; 107 } ; 108 } L_13: RET ; ;**************************** _CheckEPOverflow *************************** ;Name Addr/Register Size Type ;_FillEP2Fifo IMPORT ----- function ;_gbEP2Running IMPORT 1 variable ;_FillEP1Fifo IMPORT ----- function ;_gbEP1Running IMPORT 1 variable ; ;Local Frame Size: 4 (bytes) ; .FRAME CheckEPOverflow,_$_CheckEPOverflow,pdata .FCALL FillEP1Fifo .FCALL FillEP2Fifo XREF _gbEP2Running:pdata XREF _gbEP1Running:pdata XREF _FillEP2Fifo:code XREF _FillEP1Fifo:code XDEF _CheckEPOverflow XDEF _CheckEPRunning XDEF _ServiceEndPoints END