📄 mainloop.lst
字号:
C51 COMPILER V8.02 MAINLOOP 12/19/2007 17:51:25 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAINLOOP
OBJECT MODULE PLACED IN Mainloop.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Mainloop.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "define.h"
2 #include "epphal.h"
3 #include "d12ci.h"
4 #include "mainloop.h"
5 #include "usb100.h"
6 #include "chap_9.h"
7 #include "protodma.h"
8 #include "otp.h"
9
10
11 /*
12 //*************************************************************************
13 // USB protocol function pointer arrays
14 //*************************************************************************
15 */
16
17 //USB标准请求
18 code void (*StandardDeviceRequest[])(void) =
19 {
20 get_status,
21 clear_feature,
22 reserved,
23 set_feature,
24 reserved,
25 set_address,
26 get_descriptor,
27 reserved,
28 get_configuration,
29 set_configuration,
30 get_interface,
31 set_interface,
32 reserved,
33 reserved,
34 reserved,
35 reserved
36 };
37
38 /*
39 //*************************************************************************
40 // Public static data
41 //*************************************************************************
42 */
43
44 extern EPPFLAGS bEPPflags;
45 bit _want_connect=1;
46 CONTROL_XFER ControlData;
47
48
49 code char * _NAME_USB_REQUEST_DIRECTION[] =
50 {
51 "Host_to_device",
52 "Device_to_host"
53 };
54
55 code char * _NAME_USB_REQUEST_RECIPIENT[] =
C51 COMPILER V8.02 MAINLOOP 12/19/2007 17:51:25 PAGE 2
56 {
57 "Device",
58 "Interface",
59 "Endpoint(0)",
60 "Other"
61 };
62
63 code char * _NAME_USB_REQUEST_TYPE[] =
64 {
65 "Standard",
66 "Class",
67 "Vendor",
68 "Reserved"
69 };
70
71 code char * _NAME_USB_STANDARD_REQUEST[] =
72 {
73 "GET_STATUS",
74 "CLEAR_FEATURE",
75 "RESERVED",
76 "SET_FEATURE",
77 "RESERVED",
78 "SET_ADDRESS",
79 "GET_DESCRIPTOR",
80 "SET_DESCRIPTOR",
81 "GET_CONFIGURATION",
82 "SET_CONFIGURATION",
83 "GET_INTERFACE",
84 "SET_INTERFACE",
85 "SYNC_FRAME"
86 };
87
88 /* Interrupt Control Unit */
89 /* **** Enabled interrupts in Interrupt Enable Register ****
90 **** GLOBAL INTERRUPT MUST BE ENABLED FOR ANY OTHER
91 **** INTERRUPT TO WORK!
92 */
93 /* GLOBAL INTERRUPT DISABLED ALL INTERRUPTS
94 ARE DISABLED */
95 /* External interrupt 0 */
96 /* Priority Level = 0 */
97 /* Timer 0 interrupt */
98 /* Priority Level = 0 */
99 //中断设置
100 void init_special_interrupts(void)
101 {
102 1 IT0 = 0;
103 1 EX0 = 1;
104 1 PX0 = 0;
105 1 }
106
107 void InitialUart(unsigned int baudrate)
108 {
109 1 SCON=0X50;
110 1 TMOD=0X21;
111 1 TH1=TL1=256-(28800*2/baudrate);
112 1 TR1=1;
113 1 ET1=0;
114 1 ES=0;
115 1 }
116
117
C51 COMPILER V8.02 MAINLOOP 12/19/2007 17:51:25 PAGE 3
118
119 void main(void)
120 {
121 1 DelayNms(200);
122 1 bEPPflags.bits.configuration = 0;
123 1 init_sub();
124 1 initial_timer0();
125 1 InitialUart(19200); //???test
126 1 init_special_interrupts();//设置中断
127 1 buzzer_1();
128 1 reconnect_USB();//重新连接USB
129 1
130 1 while( TRUE )
131 1 {
132 2 //=============================== 自动检测USB设备
133 2 P3_2=1;
134 2 if (P3_2)
135 2 {
136 3 if (!bEPPflags.bits.configuration)
137 3 {
138 4 if (_want_connect)
139 4 {
140 5 _want_connect=0;
141 5 reconnect_USB();//重新连接USB
142 5 }
143 4 }
144 3 IT0=1;
145 3 }
146 2 else
147 2 {
148 3 IT0=0;
149 3 }
150 2 //==================================
151 2
152 2 check_buttton();
153 2
154 2 if (bEPPflags.bits.setup_packet){//Setup包处理
155 3 DISABLE;
156 3 bEPPflags.bits.setup_packet = 0;
157 3 ENABLE;
158 3 control_handler();//调用请求处理子程序
159 3 // D12SUSPD = 1;
160 3 } // if setup_packet
161 2 } // Main Loop
162 1 }
163
164 //返回stall应答
165 void stall_ep0(void)
166 {
167 1 D12_SetEndpointStatus(0, 1);
168 1 D12_SetEndpointStatus(1, 1);
169 1 }
170
171 //断开USB总线
172 void disconnect_USB(void)
173 {
174 1 // Initialize D12 configuration
175 1 D12_SetMode(D12_NOLAZYCLOCK, D12_SETTOONE | D12_CLOCK_12M);
176 1 }
177
178 //连接USB总线
179 void connect_USB(void)
C51 COMPILER V8.02 MAINLOOP 12/19/2007 17:51:25 PAGE 4
180 {
181 1
182 1 // V2.1 enable normal+sof interrupt
183 1 D12_SetDMA(D12_ENDP4INTENABLE | D12_ENDP5INTENABLE);
184 1
185 1 // Initialize D12 configuration
186 1 D12_SetMode(D12_NOLAZYCLOCK|D12_SOFTCONNECT, D12_SETTOONE | D12_CLOCK_12M);
187 1 }
188
189 //重新连接到USB总线
190 void reconnect_USB(void)
191 {
192 1 disconnect_USB();
193 1 // printf("Wait for 1 second ...\n");
194 1
195 1 connect_USB();
196 1 }
197
198 //恢复到未配置状态
199 void init_unconfig(void)
200 {
201 1 // unsigned char i;
202 1
203 1 D12_SetEndpointEnable(0); /* Disable all endpoints but EPP0. */
204 1 }
205
206 //设置配置状态
207 void init_config(void)
208 {
209 1 D12_SetEndpointEnable(1); /* Enable generic/iso endpoints. */
210 1 }
211
212 //从端点号1发送数据
213 void single_transmit(unsigned char * buf, unsigned char len)
214 {
215 1 if( len <= EP0_PACKET_SIZE) {
216 2 D12_WriteEndpoint(1, len, buf);
217 2 }
218 1 }
219
220 //发送端点号1建立代码
221 void code_transmit(unsigned char code * pRomData, unsigned short len)
222 {
223 1 ControlData.wCount = 0;
224 1 if(ControlData.wLength > len)
225 1 ControlData.wLength = len;
226 1
227 1 ControlData.pData = pRomData;
228 1 if( ControlData.wLength >= EP0_PACKET_SIZE) {
229 2 D12_WriteEndpoint(1, EP0_PACKET_SIZE, ControlData.pData);//发送16字节数据
230 2 ControlData.wCount += EP0_PACKET_SIZE;
231 2 DISABLE;
232 2 bEPPflags.bits.control_state = USB_TRANSMIT;
233 2 ENABLE;
234 2 }
235 1 else {
236 2 D12_WriteEndpoint(1, ControlData.wLength, pRomData);//发送16字节内数据
237 2 ControlData.wCount += ControlData.wLength;
238 2 DISABLE;
239 2 bEPPflags.bits.control_state = USB_IDLE;
240 2 ENABLE;
241 2 }
C51 COMPILER V8.02 MAINLOOP 12/19/2007 17:51:25 PAGE 5
242 1 }
243 //请求处理子程序
244 void control_handler()
245 {
246 1 unsigned char type, req;
247 1
248 1 type = ControlData.DeviceRequest.bmRequestType & USB_REQUEST_TYPE_MASK;
249 1 req = ControlData.DeviceRequest.bRequest & USB_REQUEST_MASK;
250 1
251 1 if (type == USB_STANDARD_REQUEST)
252 1 (*StandardDeviceRequest[req])();//调用标准请求
253 1 else
254 1 stall_ep0();
255 1 }
256
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 344 ----
CONSTANT SIZE = 376 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 23 2
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -