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