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