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