📄 mainloop.lst
字号:
C51 COMPILER V7.01 MAINLOOP 09/18/2003 10:10:15 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE MAINLOOP
OBJECT MODULE PLACED IN Mainloop.OBJ
COMPILER INVOKED BY: C:\KEIL\C51\BIN\C51.EXE Mainloop.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <stdio.h>
2 #include <string.h>
3
4 #include <reg51.h> /* special function register declarations */
5
6 #include "epphal.h"
7 #include "d12ci.h"
8 #include "mainloop.h"
9 #include "usb100.h"
10 #include "chap_9.h"
11 #include "protodma.h"
12 /*
13 //*************************************************************************
14 // USB protocol function pointer arrays
15 //*************************************************************************
16 */
17
18
19 //USB标准请求
20 code void (*StandardDeviceRequest[])(void) =
21 {
22 get_status,
23 clear_feature,
24 reserved,
25 set_feature,
26 reserved,
27 set_address,
28 get_descriptor,
29 reserved,
30 get_configuration,
31 set_configuration,
32 get_interface,
33 set_interface,
34 reserved,
35 reserved,
36 reserved,
37 reserved
38 };
39
40 //用户厂商请求
41 code void (*VendorDeviceRequest[])(void) =
42 {
43 reserved,
44 reserved,
45 reserved,
46 reserved,
47 reserved,
48 reserved,
49 reserved,
50 reserved,
51 reserved,
52 reserved,
53 reserved,
54 reserved,
55 read_write_register,
C51 COMPILER V7.01 MAINLOOP 09/18/2003 10:10:15 PAGE 2
56 reserved,
57 reserved,
58 reserved
59 };
60
61 /*
62 //*************************************************************************
63 // Public static data
64 //*************************************************************************
65 */
66
67 extern EPPFLAGS bEPPflags;
68 extern unsigned long ClockTicks;
69 extern unsigned char idata GenEpBuf[];
70 extern IO_REQUEST idata ioRequest;
71
72 extern unsigned char ioSize, ioCount;
73 extern unsigned char idata EpBuf[];
74
75 CONTROL_XFER ControlData;
76 BOOL bNoRAM;
77
78 /* Configure Timer 0
79 - Mode = 1
80 - Interrupt = ENABLED
81 - Clock Source = INTERNAL
82 - Enable Gating Control = DISABLED
83 */
84 //定时器0初始化程序
85 //定时器用来定时检测按键状态
86 void init_timer0(void)
87 {
88 1 TMOD &= 0XF0; /* clear Timer 0 */
89 1 TMOD |= 0X1;
90 1 TL0 = 0X0; /* value set by user */
91 1 TH0 = 0X0; /* value set by user */
92 1 ET0 = 1; /* IE.1*/
93 1 TR0 = 1; /* TCON.4 start timer */
94 1 PT0 = 0;
95 1 EA = 1;
96 1 }
97
98 /* Interrupt Control Unit */
99 /* **** Enabled interrupts in Interrupt Enable Register ****
100 **** GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER
101 **** INTERRUPT TO WORK!
102 */
103 /* GLOBAL INTERRUPT DISABLED ALL INTERRUPTS
104 ARE DISABLED */
105 /* External interrupt 0 */
106 /* Priority Level = 0 */
107 /* Timer 0 interrupt */
108 /* Priority Level = 0 */
109 //中断设置
110 void init_special_interrupts(void)
111 {
112 1 IT1 = 0;
113 1 EX1 = 1;
114 1 PX1 = 0;
115 1 }
116
117 //I/O口初始化程序
C51 COMPILER V7.01 MAINLOOP 09/18/2003 10:10:15 PAGE 3
118 void init_port()
119 {
120 1 P0 = 0xFF;
121 1 P1 = 0xFF;
122 1 P2 = 0xFF;
123 1 P3 = 0xFF;
124 1 D12SUSPD = 0;
125 1 }
126
127 void main(void)
128 {
129 1 init_port();//初始化I/O口
130 1
131 1 init_timer0();//初始化定时器0
132 1 init_special_interrupts();//设置中断
133 1
134 1 bEPPflags.value = 0;
135 1
136 1 reconnect_USB();//重新连接USB
137 1
138 1 /* Main program loop */
139 1
140 1 while( TRUE ){
141 2
142 2 if (bEPPflags.bits.setup_packet){//Setup包处理
143 3 DISABLE;
144 3 bEPPflags.bits.setup_packet = 0;
145 3 ENABLE;
146 3 control_handler();//调用请求处理子程序
147 3 D12SUSPD = 1;
148 3 } // if setup_packet
149 2
150 2 if (bEPPflags.bits.bus_reset) {//设备复位处理
151 3 DISABLE;
152 3 bEPPflags.bits.bus_reset = 0;
153 3 ENABLE;
154 3 // Release D12's SUSPEND pin after bus reset
155 3 // Enable 74HCT123 pulse generation before disconnect
156 3 D12SUSPD = 1;
157 3 } // if bus reset
158 2
159 2 if(bEPPflags.bits.setup_dma != 0) {//DMA状态改变处理
160 3 DISABLE;
161 3 bEPPflags.bits.setup_dma --;
162 3 ENABLE;
163 3 setup_dma();
164 3 } // if setup_dma
165 2 } // Main Loop
166 1 }
167
168 //返回stall应答
169 void stall_ep0(void)
170 {
171 1 D12_SetEndpointStatus(0, 1);
172 1 D12_SetEndpointStatus(1, 1);
173 1 }
174
175 //断开USB总线
176 void disconnect_USB(void)
177 {
178 1 // Initialize D12 configuration
179 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
C51 COMPILER V7.01 MAINLOOP 09/18/2003 10:10:15 PAGE 4
180 1 }
181
182 //连接USB总线
183 void connect_USB(void)
184 {
185 1 // reset event flags
186 1 DISABLE;
187 1 bEPPflags.value = 0;//清除所有状态
188 1 ENABLE;
189 1
190 1 // V2.1 enable normal+sof interrupt
191 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
192 1
193 1 // Initialize D12 configuration
194 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
195 1 }
196
197 //重新连接到USB总线
198 void reconnect_USB(void)
199 {
200 1 unsigned long clk_cnt;
201 1
202 1 // Pull-down D12's SUSPEND pin
203 1 // Disable 74HCT123 pulse generation before disconnect
204 1 // Release D12's SUSPEND pin after receiving bus reset from host
205 1 D12SUSPD = 0;
206 1 disconnect_USB();
207 1
208 1 clk_cnt = ClockTicks;
209 1 while(ClockTicks < clk_cnt + 20)
210 1 ;
211 1
212 1 connect_USB();
213 1
214 1 }
215
216 //恢复到未配置状态
217 void init_unconfig(void)
218 {
219 1 // unsigned char i;
220 1
221 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
222 1 }
223
224 //设置配置状态
225 void init_config(void)
226 {
227 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
228 1 }
229
230 //从端点号1发送数据
231 void single_transmit(unsigned char * buf, unsigned char len)
232 {
233 1 if( len <= EP0_PACKET_SIZE) {
234 2 D12_WriteEndpoint(1, len, buf);
235 2 }
236 1 }
237
238 //发送端点号1建立代码
239 void code_transmit(unsigned char code * pRomData, unsigned short len)
240 {
241 1 ControlData.wCount = 0;
C51 COMPILER V7.01 MAINLOOP 09/18/2003 10:10:15 PAGE 5
242 1 if(ControlData.wLength > len)
243 1 ControlData.wLength = len;
244 1
245 1 ControlData.pData = pRomData;
246 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
247 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
248 2 ControlData.wCount += EP0_PACKET_SIZE;
249 2 DISABLE;
250 2 bEPPflags.bits.control_state = USB_TRANSMIT;
251 2 ENABLE;
252 2 }
253 1 else {
254 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
255 2 ControlData.wCount += ControlData.wLength;
256 2 DISABLE;
257 2 bEPPflags.bits.control_state = USB_IDLE;
258 2 ENABLE;
259 2 }
260 1 }
261
262
263
264 //DMA建立子程序
265 void setup_dma()
266 {
267 1 ioSize = ioRequest.uSize;
268 1 ioCount = 0;
269 1
270 1 DISABLE;
271 1 bEPPflags.bits.dma_state = DMA_RUNNING;
272 1 ENABLE;
273 1
274 1 single_transmit(0, 0);
275 1
276 1 if(ioRequest.bCommand & 0x1) {
277 2 if(ioSize > 64 || ioSize == 0) {
278 3 //传输大于64字节数据
279 3 D12_WriteEndpoint(5, 64, EpBuf);
280 3 ioCount += 64;
281 3 }
282 2 else {
283 3 //传输64字节数据
284 3 D12_WriteEndpoint(5, ioSize, EpBuf);
285 3 ioCount += ioSize;
286 3 }
287 2 }
288 1 }
289
290 //请求处理子程序
291 void control_handler()
292 {
293 1 unsigned char type, req;
294 1
295 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
296 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
297 1
298 1 if (type == USB_STANDARD_REQUEST)
299 1 (*StandardDeviceRequest[req])();//调用标准请求
300 1 else if (type == USB_VENDOR_REQUEST)
301 1 (*VendorDeviceRequest[req])();//调用厂商请求
302 1 else
303 1 stall_ep0();
C51 COMPILER V7.01 MAINLOOP 09/18/2003 10:10:15 PAGE 6
304 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 533 ----
CONSTANT SIZE = 96 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 24 8
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 + -