📄 isr.lst
字号:
C51 COMPILER V7.01 ISR 09/27/2003 23:46:50 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN isr.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE isr.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //#include <reg51.h> /* special function register declarations */
2 #include <stdio.h>
3 #include <string.h>
4
5 #include "Epphal.h"
6 #include "d12ci.h"
7 #include "mainloop.h"
8 #include "USB100.h"
9
10 void bus_reset(void);
11
12 void ep0_txdone(void);
13 void ep0_rxdone(void);
14 void ep1_txdone(void);
15 void ep1_rxdone(void);
16 void main_txdone(void);
17 void main_rxdone(void);
18
19 void dma_eot(void);
20
21 /*
22 //*************************************************************************
23 // Public static data
24 //*************************************************************************
25 */
26 EPPFLAGS bEPPflags;
27
28 /* Control endpoint TX/RX buffers */
29 extern CONTROL_XFER ControlData;
30
31 /* ISR static vars */
32 unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
33 unsigned char idata EpBuf[EP2_PACKET_SIZE];
34 IO_REQUEST idata ioRequest;
35 unsigned char ioSize, ioCount;
36
37 unsigned long ClockTicks = 0;
38 unsigned char xdata MainEpBuf[256];
39
40 extern BOOL bNoRAM;
41
42 timer_isr() interrupt 1
43 {
44 1 DISABLE;
45 1 ClockTicks++;
46 1 bEPPflags.bits.timer = 1;
47 1 ENABLE;
48 1 }
49
50
51 void fn_usb_isr()
52 {
53 1 unsigned int i_st;
54 1
55 1 bEPPflags.bits.in_isr = 1;
C51 COMPILER V7.01 ISR 09/27/2003 23:46:50 PAGE 2
56 1
57 1
58 1 i_st = D12_ReadInterruptRegister();
59 1
60 1 if(i_st != 0) {
61 2 if(i_st & D12_INT_BUSRESET) {
62 3 bus_reset();
63 3 bEPPflags.bits.bus_reset = 1;
64 3 }
65 2
66 2 if(i_st & D12_INT_EOT)
67 2 dma_eot();
68 2
69 2 if(i_st & D12_INT_SUSPENDCHANGE)
70 2 bEPPflags.bits.suspend = 1;
71 2
72 2
73 2 if(i_st & D12_INT_ENDP0IN)
74 2 ep0_txdone();
75 2 if(i_st & D12_INT_ENDP0OUT)
76 2 ep0_rxdone();
77 2 if(i_st & D12_INT_ENDP1IN)
78 2 ep1_txdone();
79 2 if(i_st & D12_INT_ENDP1OUT)
80 2 ep1_rxdone();
81 2 if(i_st & D12_INT_ENDP2IN)
82 2 main_txdone();
83 2 if(i_st & D12_INT_ENDP2OUT)
84 2 main_rxdone();
85 2
86 2 }
87 1
88 1 bEPPflags.bits.in_isr = 0;
89 1
90 1 }
91
92 usb_isr() interrupt 0
93 {
94 1 DISABLE;
95 1 fn_usb_isr();
96 1 ENABLE;
97 1 }
98 void bus_reset(void)
99 {
100 1 }
101 void dma_eot(void)
102 {
103 1 }
104 //---------------------------------
105 void ep0_rxdone(void)
106 {
107 1 unsigned char ep_last, i;
108 1
109 1 ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
110 1 if (ep_last & D12_SETUPPACKET) {
111 2
112 2 ControlData.wLength = 0;
113 2 ControlData.wCount = 0;
114 2 //判断端点是否满,如是,则取出
115 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
116 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
117 3
C51 COMPILER V7.01 ISR 09/27/2003 23:46:50 PAGE 3
118 3 D12_SetEndpointStatus(0, 1);
119 3 D12_SetEndpointStatus(1, 1);
120 3 bEPPflags.bits.control_state = USB_IDLE;
121 3
122 3 return;
123 3 }
124 2
125 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
126 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
127 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
128 2
129 2 // Acknowledge setup here to unlock in/out endp
130 2 //向控制输出端点发送应答建立命令以重新使能下一个建立阶段
131 2 D12_AcknowledgeEndpoint(0);
132 2 D12_AcknowledgeEndpoint(1);
133 2
134 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
135 2 ControlData.wCount = 0;
136 2 //需要证实控制传输是控制读还是写,如果是读:
137 2 //如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
138 2 //主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
139 2 //模式即准备在主机发送请求时发送数据
140 2
141 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
142 3 bEPPflags.bits.setup_packet = 1;
143 3 bEPPflags.bits.control_state = USB_IDLE; /* get command */
144 3 }
145 2 //如果是写
146 2 else {
147 3 if (ControlData.DeviceRequest.wLength == 0) {
148 4 bEPPflags.bits.setup_packet = 1;
149 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
150 4 }
151 3 else {
152 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
153 5 bEPPflags.bits.control_state = USB_IDLE;
154 5 D12_SetEndpointStatus(0, 1);
155 5 D12_SetEndpointStatus(1, 1);
156 5 }
157 4 else {
158 5 bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
159 5 }
160 4 } // set command with data
161 3 } // else set command
162 2 } // if setup packet
163 1
164 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
165 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
166 2 ControlData.dataBuffer + ControlData.wCount);
167 2
168 2 ControlData.wCount += i;
169 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
170 3 bEPPflags.bits.setup_packet = 1;
171 3 bEPPflags.bits.control_state = USB_IDLE;
172 3 }
173 2 }
174 1
175 1 else {
176 2 bEPPflags.bits.control_state = USB_IDLE;
177 2 }
178 1
179 1 }
C51 COMPILER V7.01 ISR 09/27/2003 23:46:50 PAGE 4
180 //----------------------------------
181 void ep0_txdone(void)
182 {
183 1 short i = ControlData.wLength - ControlData.wCount;
184 1
185 1 D12_ReadLastTransactionStatus(1); // Clear interrupt flag
186 1
187 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
188 1 return;
189 1 //-------------------------
190 1 if( i >= EP0_PACKET_SIZE) {
191 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
192 2 ControlData.wCount += EP0_PACKET_SIZE;
193 2
194 2 bEPPflags.bits.control_state = USB_TRANSMIT;
195 2 }
196 1 else if( i != 0) {
197 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
198 2 ControlData.wCount += i;
199 2
200 2 bEPPflags.bits.control_state = USB_IDLE;
201 2 }
202 1 else if (i == 0){
203 2 D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
204 2
205 2 bEPPflags.bits.control_state = USB_IDLE;
206 2 }
207 1
208 1 }
209 //----------------------------------
210 void ep1_txdone(void)
211 {
212 1 D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
213 1 }
214
215 void ep1_rxdone(void)
216 {
217 1 unsigned char len;
218 1
219 1 D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
220 1
221 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);
222 1
223 1 if(len != 0)
224 1 bEPPflags.bits.ep1_rxdone = 1;
225 1 }
226 //---------------------------------
227 void main_txdone(void)
228 {
229 1 unsigned char len;
230 1
231 1 D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
232 1
233 1 len = ioSize - ioCount;
234 1 if(len == 0) {
235 2 if(bEPPflags.bits.dma_state == DMA_PENDING)
236 2 bEPPflags.bits.setup_dma ++;
237 2 else
238 2 bEPPflags.bits.dma_state = DMA_IDLE;
239 2 }
240 1 else {
241 2 if(len > 64)
C51 COMPILER V7.01 ISR 09/27/2003 23:46:50 PAGE 5
242 2 len = 64;
243 2 if(bNoRAM)
244 2 len = D12_WriteEndpoint(5, len, EpBuf + ioCount);
245 2 else
246 2 len = D12_WriteEndpoint(5, len, MainEpBuf + ioCount);
247 2 ioCount += len;
248 2 }
249 1 }
250
251 void main_rxdone(void)
252 {
253 1 unsigned char len;
254 1
255 1 D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
256 1
257 1 if(bNoRAM)
258 1 len = D12_ReadEndpoint(4, 64, EpBuf + ioCount);
259 1 else
260 1 len = D12_ReadEndpoint(4, 64, MainEpBuf + ioCount);
261 1 ioCount += len;
262 1 if(bNoRAM)
263 1 len = D12_ReadEndpoint(4, 64, EpBuf + ioCount);
264 1 else
265 1 len = D12_ReadEndpoint(4, 64, MainEpBuf + ioCount);
266 1 ioCount += len;
267 1 if(ioCount >= ioSize) {
268 2 if(bEPPflags.bits.dma_state == DMA_PENDING)
269 2 bEPPflags.bits.setup_dma ++;
270 2 else
271 2 bEPPflags.bits.dma_state = DMA_IDLE;
272 2 }
273 1
274 1 }
275
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 873 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 256 ----
PDATA SIZE = ---- ----
DATA SIZE = 8 5
IDATA SIZE = 74 ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -