📄 f326_usb0_interruptserviceroutine.lst
字号:
C51 COMPILER V7.50 F326_USB0_INTERRUPTSERVICEROUTINE 12/29/2007 16:03:22 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE F326_USB0_INTERRUPTSERVICEROUTINE
OBJECT MODULE PLACED IN F326_USB0_InterruptServiceRoutine.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe F326_USB0_InterruptServiceRoutine.c DB OE
line level source
1 //-----------------------------------------------------------------------------
2 // F326_USB0_InterruptServiceRoutine.c
3 //-----------------------------------------------------------------------------
4 //
5 // Source file for USB firmware. Includes top level ISR with SETUP,
6 // and Endpoint data handlers. Also includes routine for USB suspend,
7 // reset, and procedural stall.
8 //
9
10 #include "c8051F326.h"
11 #include "F326_USB0_Register.h"
12 #include "F326_USB0_Descriptor.h"
13 #include "F326_USB0_ReportHandler.h"
14 #include "F326_USB0_InterruptServiceRoutine.h"
15 #include "F326_USB0_Uart.h"
16 #include "F326_USB0_Touch.h"
17 //-----------------------------------------------------------------------------
18 // Global Variable Definitions
19 //-----------------------------------------------------------------------------
20 unsigned char USB0_STATE; // Holds the current USB State
21 // def. in F326_USB0_InterruptServiceRoutine.h
22
23 setup_buffer SETUP; // Buffer for current device
24 // request information
25
26 unsigned int DATASIZE; // Size of data to return
27 unsigned int DATASENT; // Amount of data sent so far
28 unsigned char* DATAPTR; // Pointer to data to return
29
30 unsigned char EP_STATUS[3] = {EP_IDLE, EP_HALT, EP_HALT};
31 // Holds the status for each endpoint
32
33
34
35 //-----------------------------------------------------------------------------
36 // Local Function Definitions
37 //-----------------------------------------------------------------------------
38 void Usb_Resume (void); // resumes USB operation
39 void Usb_Reset (void); // Called after USB bus reset
40 void Handle_Control (void); // Handle SETUP packet on EP 0
41 void Handle_In1 (void); // Handle in packet on EP 1
42 void Handle_Out1 (void); // Handle out packet on EP 1
43 void Usb_Suspend (void); // This routine called when
44 // suspend signalling on bus
45 void Fifo_Read (unsigned char, unsigned int, unsigned char *);
46 // Used for multiple byte reads
47 // of Endpoint fifos
48 void Fifo_Write_Foreground (unsigned char, unsigned int, unsigned char *);
49 // Used for multiple byte writes
50 // of Endpoint fifos in foreground
51 void Fifo_Write_InterruptServiceRoutine (unsigned char, unsigned int,
52 unsigned char *);
53 // Used for multiple byte
54 // writes of Endpoint fifos
55
C51 COMPILER V7.50 F326_USB0_INTERRUPTSERVICEROUTINE 12/29/2007 16:03:22 PAGE 2
56
57 //-----------------------------------------------------------------------------
58 // Usb_ISR
59 //-----------------------------------------------------------------------------
60 //
61 // Called after any USB type interrupt, this handler determines which type
62 // of interrupt occurred, and calls the specific routine to handle it.
63 //
64 //-----------------------------------------------------------------------------
65 void Usb_ISR (void) interrupt 8 // Top-level USB ISR
66 {
67 1
68 1 unsigned char bCommon, bIn, bOut;
69 1 POLL_READ_BYTE (CMINT, bCommon); // Read all interrupt registers
70 1 POLL_READ_BYTE (IN1INT, bIn); // this read also clears the register
71 1 POLL_READ_BYTE (OUT1INT, bOut);
72 1 {
73 2 if (bCommon & rbRSUINT) // Handle Resume interrupt
74 2 {
75 3 Usb_Resume ();
76 3 }
77 2 if (bCommon & rbRSTINT) // Handle Reset interrupt
78 2 {
79 3 Usb_Reset ();
80 3 }
81 2 if (bIn & rbEP0) // Handle SETUP packet received
82 2 { // or packet transmitted if Endpoint 0
83 3 Handle_Control (); // is in transmit mode
84 3 }
85 2 if (bIn & rbIN1) // Handle In Packet sent, put new data
86 2 { // on endpoint 1 fifo
87 3 Handle_In1 ();
88 3 }
89 2 if (bOut & rbOUT1) // Handle Out packet received, take
90 2 { // data off endpoint 2 fifo
91 3 Handle_Out1 ();
92 3 }
93 2 if (bCommon & rbSUSINT) // Handle Suspend interrupt
94 2 {
95 3 Usb_Suspend ();
96 3 }
97 2 }
98 1 }
99
100 //-----------------------------------------------------------------------------
101 // Support Routines
102 //-----------------------------------------------------------------------------
103
104 //-----------------------------------------------------------------------------
105 // Usb_Reset
106 //-----------------------------------------------------------------------------
107 //
108 // Return Value : None
109 // Parameters : None
110 //
111 // - Set state to default
112 // - Clear Usb Inhibit bit
113 //
114 //-----------------------------------------------------------------------------
115
116 void Usb_Reset (void)
117 {
C51 COMPILER V7.50 F326_USB0_INTERRUPTSERVICEROUTINE 12/29/2007 16:03:22 PAGE 3
118 1 USB0_STATE = DEV_DEFAULT; // Set device state to default
119 1
120 1 POLL_WRITE_BYTE (POWER, 0x01); // Clear usb inhibit bit to enable USB
121 1 // suspend detection
122 1
123 1 EP_STATUS[0] = EP_IDLE; // Set default Endpoint Status
124 1 EP_STATUS[1] = EP_HALT;
125 1 EP_STATUS[2] = EP_HALT;
126 1 }
127
128
129
130 //-----------------------------------------------------------------------------
131 // Usb_Resume
132 //-----------------------------------------------------------------------------
133 //
134 // Return Value : None
135 // Parameters : None
136 //
137 // Resume normal USB operation
138 //
139 //-----------------------------------------------------------------------------
140
141 void Usb_Resume(void)
142 {
143 1 volatile int k;
144 1
145 1 k++;
146 1
147 1 // Add code for resume
148 1 }
149
150
151 //-----------------------------------------------------------------------------
152 // Handle_Control
153 //-----------------------------------------------------------------------------
154 //
155 // Return Value : None
156 // Parameters : None
157 //
158 // - Decode Incoming SETUP requests
159 // - Load data packets on fifo while in transmit mode
160 //
161 //-----------------------------------------------------------------------------
162
163 void Handle_Control (void)
164 {
165 1 unsigned char ControlReg; // Temporary storage for EP control
166 1 // register
167 1
168 1 POLL_WRITE_BYTE (INDEX, 0); // Set Index to Endpoint Zero
169 1 POLL_READ_BYTE (E0CSR, ControlReg); // Read control register
170 1
171 1 if (EP_STATUS[0] == EP_ADDRESS) // Handle Status Phase of Set Address
172 1 // command
173 1 {
174 2 POLL_WRITE_BYTE (FADDR, SETUP.wValue.c[LSB]);
175 2 EP_STATUS[0] = EP_IDLE;
176 2 }
177 1
178 1 if (ControlReg & rbSTSTL) // If last packet was a sent stall,
179 1 { // reset STSTL bit and return EP0
C51 COMPILER V7.50 F326_USB0_INTERRUPTSERVICEROUTINE 12/29/2007 16:03:22 PAGE 4
180 2 // to idle state
181 2 POLL_WRITE_BYTE (E0CSR, 0);
182 2 EP_STATUS[0] = EP_IDLE;
183 2 return;
184 2 }
185 1
186 1 if (ControlReg & rbSUEND) // If last SETUP transaction was
187 1 { // ended prematurely then set
188 2 POLL_WRITE_BYTE (E0CSR, rbDATAEND);
189 2 // Serviced SETUP End bit and return EP0
190 2 POLL_WRITE_BYTE (E0CSR, rbSSUEND);
191 2 EP_STATUS[0] = EP_IDLE; // to idle state
192 2 }
193 1
194 1 if (EP_STATUS[0] == EP_IDLE) // If Endpoint 0 is in idle mode
195 1 {
196 2 if (ControlReg & rbOPRDY) // Make sure that EP 0 has an Out Packet
197 2 { // ready from host although if EP0
198 3 // is idle, this should always be the
199 3 // case
200 3 Fifo_Read (FIFO_EP0, 8, (unsigned char *)&SETUP);
201 3 // Get SETUP Packet off of Fifo,
202 3 // it is currently Big-Endian
203 3
204 3 // Compiler Specific - these next three
205 3 // statements swap the bytes of the
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -