📄 isr.lst
字号:
C51 COMPILER V7.01 ISR 06/30/2007 11:42:51 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 LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <c8051f120.h>
2 #include <d12interface.h>
3 #include <usb.h>
4
5 CONTROL_XFER ControlData;
6
7 #define D12_SETUPPACKET_MASK 0x20
8
9 u8 Ep2OutLen; //len of ep2 out data
10 bool Ep2SendBufferFul = false; //ep2 send buffer has data to send
11
12 /* ep0 out interrupt */
13 void ep0_out()
14 {
15 1 u8 ret, i;
16 1 ret = D12_ReadLastTransactionStatus(D12_EPCTLOUT);
17 1 if (ret & D12_SETUPPACKET_MASK)
18 1 {//setup packet
19 2 ControlData.wLength = 0;
20 2 ControlData.wCount = 0;
21 2 if( D12_ReadEndpointBuffer(0, (u8 *)(&(ControlData.DevRequest)),
22 2 sizeof(ControlData.DevRequest)) != sizeof(DEVICE_REQUEST) )
23 2 {
24 3 //wrong setup packet, set ep0 to stall
25 3 D12_SetEndpointStatus(0, 1);
26 3 D12_SetEndpointStatus(1, 1);
27 3 bEppflags.flags.control_state = USB_IDLE;
28 3 return;
29 3 }
30 2
31 2 //u16 data must be swap because d12 & c51 has different byte order
32 2 ControlData.DevRequest.wValue = SWAP(ControlData.DevRequest.wValue);
33 2 ControlData.DevRequest.wIndex = SWAP(ControlData.DevRequest.wIndex);
34 2 ControlData.DevRequest.wLength = SWAP(ControlData.DevRequest.wLength);
35 2
36 2 // Acknowledge setup here to unlock in/out endp
37 2 D12_AcknowledgeEndpoint(0);
38 2 D12_AcknowledgeEndpoint(1);
39 2 ControlData.wLength = ControlData.DevRequest.wLength;
40 2 ControlData.wCount = 0;
41 2 if (ControlData.DevRequest.bmRequestType & USB_ENDPOINT_DIRECTION_MASK)
42 2 {//device send data to pc
43 3 bEppflags.flags.setup_packet = 1;
44 3 bEppflags.flags.control_state = USB_TRANSMIT; //USB_IDLE;/* get command */
45 3 //control_handler();
46 3 }
47 2 else
48 2 {
49 3 if (ControlData.DevRequest.wLength == 0)
50 3 {
51 4 bEppflags.flags.setup_packet = 1;
52 4 bEppflags.flags.control_state = USB_IDLE; /* set command */
53 4 }
54 3 else
55 3 {
C51 COMPILER V7.01 ISR 06/30/2007 11:42:51 PAGE 2
56 4 if(ControlData.DevRequest.wLength > MAX_CONTROLDATA_SIZE)
57 4 {
58 5 bEppflags.flags.control_state = USB_IDLE;
59 5 D12_SetEndpointStatus(0, 1);
60 5 D12_SetEndpointStatus(1, 1);
61 5 }
62 4 else
63 4 {
64 5 bEppflags.flags.control_state = USB_RECEIVE; /* set command with OUT
65 5 token */
66 5 }
67 4 } // set command with data
68 3 } // else set command
69 2 // if setup packet
70 2 }
71 1 else if (bEppflags.flags.control_state == USB_RECEIVE)
72 1 {
73 2 i = D12_ReadEndpointBuffer(0,
74 2 ControlData.buffer + ControlData.wCount,
75 2 EP0_PACKET_SIZE);
76 2 ControlData.wCount += i;
77 2 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength)
78 2 {
79 3 //data received over
80 3 bEppflags.flags.setup_packet = 1;
81 3 bEppflags.flags.control_state = USB_IDLE;
82 3 }
83 2 }
84 1 else
85 1 {
86 2 bEppflags.flags.control_state = USB_IDLE;
87 2 }
88 1 }
89
90
91 void ep0_in()
92 {
93 1 short i = ControlData.wLength - ControlData.wCount;
94 1 D12_ReadLastTransactionStatus(1); // Clear interrupt flag
95 1 if (bEppflags.flags.control_state != USB_TRANSMIT)
96 1 return;
97 1 if( i >= EP0_PACKET_SIZE) {
98 2 D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, EP0_PACKET_SIZE);
99 2 ControlData.wCount += EP0_PACKET_SIZE;
100 2 bEppflags.flags.control_state = USB_TRANSMIT;
101 2 }
102 1 else if( i != 0) {
103 2 D12_WriteEndpointBuffer(1, ControlData.pData + ControlData.wCount, i);
104 2 ControlData.wCount += i;
105 2 bEppflags.flags.control_state = USB_IDLE;
106 2 }
107 1 else if (i == 0){
108 2 D12_WriteEndpointBuffer(1, 0, 0); // Send zero packet at the end ???
109 2 bEppflags.flags.control_state = USB_IDLE;
110 2 }
111 1 }
112
113
114 //ep1 in
115 void ep1_in(void)
116 {
117 1 D12_ReadLastTransactionStatus(3); // Clear interrupt flag
C51 COMPILER V7.01 ISR 06/30/2007 11:42:51 PAGE 3
118 1 }
119
120 //ep1 out
121 void ep1_out(void)
122 {
123 1 u8 len;
124 1 D12_ReadLastTransactionStatus(2); // Clear interrupt flag
125 1 len = D12_ReadEndpointBuffer(2, Ep1Buf, EP1_PACKET_SIZE);
126 1 if(len != 0)
127 1 bEppflags.flags.ep1_out = 1;
128 1 }
129
130 //ep2 (main ep) in
131 void main_in()
132 {
133 1 D12_ReadLastTransactionStatus(5);
134 1 Ep2SendBufferFul = false;
135 1 }
136
137 //ep2 (main ep) out
138 void main_out()
139 {
140 1 u8 epstatus;
141 1
142 1 DISABLE_INTERRUPT;
143 1
144 1 D12_ReadLastTransactionStatus(4);
145 1 epstatus = D12_ReadEndpointStatus(4);
146 1 epstatus &= 0x60;
147 1 Ep2OutLen = D12_ReadEndpointBuffer(4, Ep2Buf, EP2_PACKET_SIZE);
148 1 if (epstatus == 0x60)
149 1 Ep2OutLen += D12_ReadEndpointBuffer(4, Ep2Buf+EP2_PACKET_SIZE, EP2_PACKET_SIZE); //read double buf data
150 1 if (Ep2OutLen != 0)
151 1 bEppflags.flags.ep2_out = 1;
152 1 else
153 1 ENABLE_INTERRUPT;
154 1 }
155
156 /* external interrupt handle rounter */
157 void D12Int_Handler() interrupt 0
158 {
159 1 u16 ret;
160 1
161 1 bEppflags.flags.in_isr = 1;
162 1
163 1 ret = D12_ReadInterruptRegister();
164 1
165 1 if (ret & 0x1) //control ep out
166 1 {
167 2 ep0_out();
168 2 }
169 1 if (ret & 0x2) //control ep in
170 1 {
171 2 ep0_in();
172 2 }
173 1 if (ret & 0x4) //ep1 out
174 1 {
175 2 ep1_out();
176 2 }
177 1 if (ret & 0x8) //ep1 in
178 1 {
179 2 ep1_in();
C51 COMPILER V7.01 ISR 06/30/2007 11:42:51 PAGE 4
180 2 }
181 1
182 1 if (ret & 0x10) //ep2 out
183 1 {
184 2 main_out();
185 2 }
186 1 if (ret & 0x20) //ep2 in
187 1 {
188 2 main_in();
189 2 }
190 1
191 1 if (ret & 0x40) //system reset
192 1 {
193 2 bEppflags.flags.bus_reset = 1;
194 2 }
195 1 if (ret & 0x80)
196 1 {
197 2 bEppflags.flags.suspend = 1;
198 2 }
199 1
200 1 bEppflags.flags.in_isr = 0;
201 1
202 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 847 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 33 5
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
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 + -