📄 d12_isr.lst
字号:
C51 COMPILER V8.01 D12_ISR 04/19/2006 16:02:46 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE D12_ISR
OBJECT MODULE PLACED IN d12_isr.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE d12_isr.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "hardware.h"
2 #include "d12_driver.h"
3 #include "USB100.h"
4 #include "UFmain.h"
5
6 void ep0_txdone(void);
7 void ep0_rxdone(void);
8 void ep1_txdone(void);
9 void ep1_rxdone(void);
10 void main_txdone(void);
11 void main_rxdone(void);
12
13
14 /*
15 //*************************************************************************
16 // Public static data
17 //*************************************************************************
18 */
19 EPPFLAGS bEPPflags;
20
21 /* Control endpoint TX/RX buffers */
22 extern CONTROL_XFER ControlData;
23
24 /* ISR static vars */
25 unsigned char idata GenEpBuf[EP1_PACKET_SIZE];
26
27 void fn_usb_isr()
28 {
29 1 unsigned int i_st;
30 1
31 1 bEPPflags.bits.in_isr = 1;
32 1
33 1
34 1 i_st = D12_ReadInterruptRegister();
35 1
36 1 if(i_st != 0) {
37 2 if(i_st & D12_INT_BUSRESET) {
38 3 bEPPflags.bits.bus_reset = 1;
39 3 }
40 2
41 2 if(i_st & D12_INT_SUSPENDCHANGE)
42 2 bEPPflags.bits.suspend = 1;
43 2
44 2
45 2 if(i_st & D12_INT_ENDP0IN)
46 2 ep0_txdone();
47 2 if(i_st & D12_INT_ENDP0OUT)
48 2 ep0_rxdone();
49 2 if(i_st & D12_INT_ENDP1IN)
50 2 ep1_txdone();
51 2 if(i_st & D12_INT_ENDP1OUT)
52 2 ep1_rxdone();
53 2 if(i_st & D12_INT_ENDP2IN)
54 2 main_txdone();
55 2 if(i_st & D12_INT_ENDP2OUT)
C51 COMPILER V8.01 D12_ISR 04/19/2006 16:02:46 PAGE 2
56 2 main_rxdone();
57 2
58 2 }
59 1
60 1 bEPPflags.bits.in_isr = 0;
61 1
62 1 }
63
64 void usb_isr(void) interrupt 2
65 {
66 1 bEPPflags.bits.timer=1;
67 1 fn_usb_isr();
68 1 }
69
70 //---------------------------------
71 void ep0_rxdone(void)
72 {
73 1 unsigned char ep_last, i;
74 1
75 1 ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
76 1 if (ep_last & D12_SETUPPACKET) {
77 2
78 2 ControlData.wLength = 0;
79 2 ControlData.wCount = 0;
80 2 //判断端点是否满,如是,则取出
81 2 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
82 2 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
83 3
84 3 D12_SetEndpointStatus(0, 1);
85 3 D12_SetEndpointStatus(1, 1);
86 3 bEPPflags.bits.control_state = USB_IDLE;
87 3
88 3 return;
89 3 }
90 2
91 2 ControlData.DeviceRequest.wValue = SWAP(ControlData.DeviceRequest.wValue);
92 2 ControlData.DeviceRequest.wIndex = SWAP(ControlData.DeviceRequest.wIndex);
93 2 ControlData.DeviceRequest.wLength = SWAP(ControlData.DeviceRequest.wLength);
94 2
95 2 // Acknowledge setup here to unlock in/out endp
96 2 //向控制输出端点发送应答建立命令以重新使能下一个建立阶段
97 2 D12_AcknowledgeEndpoint(0);
98 2 D12_AcknowledgeEndpoint(1);
99 2
100 2 ControlData.wLength = ControlData.DeviceRequest.wLength;
101 2 ControlData.wCount = 0;
102 2 //需要证实控制传输是控制读还是写,如果是读:
103 2 //如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
104 2 //主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
105 2 //模式即准备在主机发送请求时发送数据
106 2
107 2 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
108 3 bEPPflags.bits.setup_packet = 1;
109 3 bEPPflags.bits.control_state = USB_IDLE; /* get command */
110 3 }
111 2 //如果是写
112 2 else {
113 3 if (ControlData.DeviceRequest.wLength == 0) {
114 4 bEPPflags.bits.setup_packet = 1;
115 4 bEPPflags.bits.control_state = USB_IDLE; /* set command */
116 4 }
117 3 else {
C51 COMPILER V8.01 D12_ISR 04/19/2006 16:02:46 PAGE 3
118 4 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
119 5 bEPPflags.bits.control_state = USB_IDLE;
120 5 D12_SetEndpointStatus(0, 1);
121 5 D12_SetEndpointStatus(1, 1);
122 5 }
123 4 else {
124 5 bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
125 5 }
126 4 } // set command with data
127 3 } // else set command
128 2 } // if setup packet
129 1
130 1 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
131 2 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
132 2 ControlData.dataBuffer + ControlData.wCount);
133 2
134 2 ControlData.wCount += i;
135 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
136 3 bEPPflags.bits.setup_packet = 1;
137 3 bEPPflags.bits.control_state = USB_IDLE;
138 3 }
139 2 }
140 1
141 1 else {
142 2 bEPPflags.bits.control_state = USB_IDLE;
143 2 }
144 1 }
145
146 //----------------------------------
147 void ep0_txdone(void)
148 {
149 1 short i = ControlData.wLength - ControlData.wCount;
150 1
151 1 D12_ReadLastTransactionStatus(1); // Clear interrupt flag
152 1
153 1 if (bEPPflags.bits.control_state != USB_TRANSMIT)
154 1 return;
155 1 //-------------------------
156 1 if( i >= EP0_PACKET_SIZE) {
157 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
158 2 ControlData.wCount += EP0_PACKET_SIZE;
159 2
160 2 bEPPflags.bits.control_state = USB_TRANSMIT;
161 2 }
162 1 else if( i != 0) {
163 2 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
164 2 ControlData.wCount += i;
165 2
166 2 bEPPflags.bits.control_state = USB_IDLE;
167 2 }
168 1 else if (i == 0){
169 2 D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
170 2
171 2 bEPPflags.bits.control_state = USB_IDLE;
172 2 }
173 1
174 1 }
175 //----------------------------------
176 void ep1_txdone(void)
177 {
178 1 D12_ReadLastTransactionStatus(3); /* Clear interrupt flag */
179 1 }
C51 COMPILER V8.01 D12_ISR 04/19/2006 16:02:46 PAGE 4
180
181 void ep1_rxdone(void)
182 {
183 1 unsigned char len;
184 1
185 1 D12_ReadLastTransactionStatus(2); /* Clear interrupt flag */
186 1
187 1 len = D12_ReadEndpoint(2, sizeof(GenEpBuf), GenEpBuf);
188 1
189 1 if(len != 0)
190 1 bEPPflags.bits.ep1_rxdone = 1;
191 1 }
192 //---------------------------------
193 void main_txdone(void)
194 {
195 1 D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
196 1 }
197
198 void main_rxdone(void)
199 {
200 1 D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
201 1 }
202
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 586 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 2 4
IDATA SIZE = 4 ----
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 + -