📄 isr.lst
字号:
C51 COMPILER V7.09 ISR 05/11/2005 17:30:29 PAGE 1
C51 COMPILER V7.09, COMPILATION OF MODULE ISR
OBJECT MODULE PLACED IN ISR.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE ISR.C BROWSE DEBUG OBJECTEXTEND
line level source
1 //#include <reg51.h> /* special function register declarations */
2 #include <stdio.h>
3 #include <string.h>
4
5 #include "d12ci.h"
6 #include "main.h"
*** ERROR C129 IN LINE 101 OF MAIN.H: missing ';' before 'struct'
7 #include "USB100.h"
8 #include "isr.h"
9 //#include "..\inc\44b.h"
10
11 #include "bulk_only.h"
12
13 /*
14 //*************************************************************************
15 // Public static data
16 //*************************************************************************
17 */
18
19 /* Control endpoint TX/RX buffers */
20 extern CONTROL_XFER ControlData;
21 extern EPPFLAGS bEPPflags;
22
23 // ISR static vars ;
24
25 unsigned char EpBuf[EP2_PACKET_SIZE];
26 unsigned char GenEpBuf[EP1_PACKET_SIZE];
27 IO_REQUEST ioRequest;
28 unsigned char ioSize, ioCount;
29
30 unsigned long ClockTicks = 0;
31 unsigned char MainEpBuf[256];
32
33 extern unsigned char bulk_state;
34
35
36
37 void usb_isr()
38 {
39 int i;
40 unsigned int i_st;
41 DISABLE;
42 rI_ISPC=BIT_EINT2;//clear regiester
43
44 //fn_usb_isr() begin;
45 bEPPflags.bits.in_isr = 1;
46
47 i_st = D12_ReadInterruptRegister();
48
49 if(i_st != 0) {
50
51 if(i_st & D12_INT_ENDP0IN){
52 ep0_txdone();
53 }
54 if(i_st & D12_INT_ENDP0OUT){
C51 COMPILER V7.09 ISR 05/11/2005 17:30:29 PAGE 2
55 ep0_rxdone();
56 }
57
58 if(i_st & D12_INT_ENDP2IN){
59 main_txdone();
60 }
61 if(i_st & D12_INT_ENDP2OUT){
62 main_rxdone();
63 }
64 }
65 bEPPflags.bits.in_isr = 0;
66
67 ENABLE;
68 }
69
70 void bus_reset(void)
71 {
72 ;
73 }
74 void dma_eot(void)
75 {
76 ;
77 }
78 //---------------------------------
79 void ep0_rxdone(void)
80 {
81 unsigned char ep_last, i;
82 ep_last = D12_ReadLastTransactionStatus(0); // Clear interrupt flag
83 if (ep_last & D12_SETUPPACKET) {
84
85 ControlData.wLength = 0;
86 ControlData.wCount = 0;
87 //判断端点是否满,如是,则取出
88 if( D12_ReadEndpoint(0, sizeof(ControlData.DeviceRequest),
89 (unsigned char *)(&(ControlData.DeviceRequest))) != sizeof(DEVICE_REQUEST) ) {
90
91 D12_SetEndpointStatus(0, 1);
92 D12_SetEndpointStatus(1, 1);
93 bEPPflags.bits.control_state = USB_IDLE;
94
95 return;
96 }
97
98 Uart_Printf("bmRequestType=0x%x,bRequest=0x%x,wValue=0x%x,wIndex=0x%x,wLength=0x%x\n",
99 ControlData.DeviceRequest.bmRequestType,
100 ControlData.DeviceRequest.bRequest,
101 ControlData.DeviceRequest.wValue,
102 ControlData.DeviceRequest.wIndex,
103 ControlData.DeviceRequest.wLength);
104
105
106 // Acknowledge setup here to unlock in/out endp
107 //向控制输出端点发送应答建立命令以重新使能下一个建立阶段
108 D12_AcknowledgeEndpoint(0);
109 D12_AcknowledgeEndpoint(1);
110
111 ControlData.wLength = ControlData.DeviceRequest.wLength;
112 ControlData.wCount = 0;
113 //需要证实控制传输是控制读还是写,如果是读:
114 //如果控制传输是一个控制读类型那就是说器件需要在下一个数据阶段向
115 //主机发回数据包.MCU需要设置一个标志以指示USB 设备现在正处于传输
116 //模式即准备在主机发送请求时发送数据
C51 COMPILER V7.09 ISR 05/11/2005 17:30:29 PAGE 3
117
118 if (ControlData.DeviceRequest.bmRequestType & (unsigned char)USB_ENDPOINT_DIRECTION_MASK) {
119 bEPPflags.bits.setup_packet = 1;
120 bEPPflags.bits.control_state = USB_IDLE; /* get command */
121 }
122 //如果是写
123 else {
124 if (ControlData.DeviceRequest.wLength == 0) {
125 bEPPflags.bits.setup_packet = 1;
126 bEPPflags.bits.control_state = USB_IDLE; /* set command */
127 }
128 else {
129 if(ControlData.DeviceRequest.wLength > MAX_CONTROLDATA_SIZE) {
130 bEPPflags.bits.control_state = USB_IDLE;
131 D12_SetEndpointStatus(0, 1);
132 D12_SetEndpointStatus(1, 1);
133 }
134 else {
135 bEPPflags.bits.control_state = USB_RECEIVE; /* set command with OUT token */
136 }
137 } // set command with data
138 } // else set command
139 } // if setup packet
140
141 else if (bEPPflags.bits.control_state == USB_RECEIVE) {
142 i = D12_ReadEndpoint(0, EP0_PACKET_SIZE,
143 ControlData.dataBuffer + ControlData.wCount);
144
145 ControlData.wCount += i;
146 if( i != EP0_PACKET_SIZE || ControlData.wCount >= ControlData.wLength) {
147 bEPPflags.bits.setup_packet = 1;
148 bEPPflags.bits.control_state = USB_IDLE;
149 }
150 }
151
152 else {
153 bEPPflags.bits.control_state = USB_IDLE;
154 }
155
156 }
157 //----------------------------------
158 void ep0_txdone(void)
159 {
160 short i = ControlData.wLength - ControlData.wCount;
161 D12_ReadLastTransactionStatus(1); // Clear interrupt flag
162 if (bEPPflags.bits.control_state != USB_TRANSMIT)
163 return;
164 //-------------------------
165 if( i >= EP0_PACKET_SIZE) {
166 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData + ControlData.wCount);
167 ControlData.wCount = ControlData.wCount + EP0_PACKET_SIZE;
168
169 bEPPflags.bits.control_state = USB_TRANSMIT;
170 }
171 else if( i != 0) {
172 D12_WriteEndpoint(1, i, ControlData.pData + ControlData.wCount);
173 ControlData.wCount = ControlData.wCount + i;
174
175 bEPPflags.bits.control_state = USB_IDLE;
176 }
177 else if (i == 0){
178 D12_WriteEndpoint(1, 0, 0); // Send zero packet at the end ???
C51 COMPILER V7.09 ISR 05/11/2005 17:30:29 PAGE 4
179
180 bEPPflags.bits.control_state = USB_IDLE;
181 }
182
183 }
184
185 void main_txdone(void)
186 {
187
188 D12_ReadLastTransactionStatus(5); /* Clear interrupt flag */
189
190 switch(bulk_state){
191 case BULK_DATA_TRANS:
192 TransDataGoOn();
193 break;
194 case BULK_DATA_END:
195 TransmitCSW();
196 break;
197 case BULK_REQEST_TRANS:
198 TransRequestGoOn();
199 break;
200 case BULK_CSW_END:
201 break;
202 default: return;
203 }
204
205 }
206
207 void main_rxdone(void)
208 {
209 int i;
210 D12_ReadLastTransactionStatus(4); /* Clear interrupt flag */
211
212 D12_ReadEndpoint(4, 64, EpBuf);
213 for(i=0;i<0x40;i++) Uart_Printf("%x ",EpBuf[i]);
214 if((bulk_state != BULK_DATA_RECIEVE) &&(EpBuf[0] == 0x55)) InterpretCBW();
215 else Trans_Data2PC();
216
217 }
218
C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -