📄 chap_9.lst
字号:
188 1
189 1 //挂起处理
190 1 if(USB_Int_Flag.BITS.SUSP)
191 1 {
192 2 //清除挂起标志
193 2 EA_DISABLE;
194 2 USB_Int_Flag.BITS.SUSP = 0;
195 2 EA_ENABLE;
196 2 //ISP1581进入挂起状态
197 2 D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 1;
198 2 D14_Cntrl_Reg.D14_MODE.BITS.GOSUSP = 0;
199 2 }
200 1
201 1 //挂起恢复处理
202 1 if(USB_Int_Flag.BITS.RESUME)
203 1 {
204 2 //清除恢复标志
205 2 EA_DISABLE;
206 2 USB_Int_Flag.BITS.RESUME = 0;
207 2 EA_ENABLE;
208 2 //产生一个恢复信号
209 2 D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 1;
210 2 D14_Cntrl_Reg.D14_MODE.BITS.SNDRSU = 0;
211 2 }
212 1
213 1 //高速状态
214 1 if(USB_Int_Flag.BITS.HS_STAT)
215 1 {
216 2 //清除高速状态标志
217 2 EA_DISABLE;
218 2 USB_Int_Flag.BITS.HS_STAT = 0;
219 2 EA_ENABLE;
220 2 if(Kernel_Flag.BITS.HS_FS_State == FULL_SPEED)
221 2 {
222 3 //切换高速指示
223 3 HS_FS_LED = HIGH_SPEED_LED;
224 3 //设置高速模式状态
225 3 Kernel_Flag.BITS.HS_FS_State = HIGH_SPEED;
226 3 //重新配置高速端点
227 3 Init_Endpoint();
228 3
229 3 // PIO_Count = 64;
230 3 PIO_Count = 512;
231 3 }
232 2 }
233 1 }
234
235
236 //***********************************************************************
237 //* *
238 //* Routine : *
239 //* Input : None *
240 //* Output : None *
241 //* Function : *
C51 COMPILER V7.01 CHAP_9 03/28/2003 14:38:29 PAGE 5
242 //* *
243 //***********************************************************************
244 //建立包处理
245 void USB_Setup(void)
246 {
247 1 unsigned char type, req;
248 1
249 1 //清除EP0SETUP中断标志
250 1 USB_Int_Flag.BITS.EP0SETUP = 0;
251 1 //清除总线复位标志
252 1 Kernel_Flag.BITS.Bus_Reset = 0;
253 1 //选择端点0SETUP缓冲区
254 1 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0x20;
255 1
256 1 //读取USB请求
257 1 //读取请求类型
258 1 USB_Device_Request.bmRequestType = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
259 1 //读取请求号
260 1 USB_Device_Request.bRequest = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
261 1 //读取16bit请求数据
262 1 USB_Device_Request.wValue = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
263 1 USB_Device_Request.wValue <<= 8;
264 1 USB_Device_Request.wValue |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
265 1 //读取16bit请求索引
266 1 USB_Device_Request.wIndex = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
267 1 USB_Device_Request.wIndex <<= 8;
268 1 USB_Device_Request.wIndex |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
269 1 //读取16bit长度
270 1 USB_Device_Request.wLength = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
271 1 USB_Device_Request.wLength <<= 8;
272 1 USB_Device_Request.wLength |= D14_Cntrl_Reg.D14_DATA_PORT_LSB;
273 1
274 1 //长度处理(高低8位对调)
275 1 Temp = USB_Device_Request.wLength;
276 1 USB_Device_Request.wLength = 0;
277 1 USB_Device_Request.wLength = (UC) Temp;
278 1 USB_Device_Request.wLength <<= 8;
279 1 Temp >>= 8;
280 1 USB_Device_Request.wLength |= Temp;
281 1
282 1 type = USB_Device_Request.bmRequestType & 0x60;
283 1 req = USB_Device_Request.bRequest & 0x0f;
284 1
285 1 //厂商请求
286 1 if (type == 0x40)
287 1 {
288 2 Vendor_Specific_Command();//厂商请求处理
289 2 }
290 1 else if (type == 0x00)
291 1 (*StandardDeviceRequest[req])();//调用标准请求
292 1 }
293
294 //***********************************************************************
295 //* *
296 //* Routine : *
297 //* Input : None *
298 //* Output : None *
299 //* Function : *
300 //* *
301 //***********************************************************************
302 //厂商请求处理
303 void Vendor_Specific_Command(void)
C51 COMPILER V7.01 CHAP_9 03/28/2003 14:38:29 PAGE 6
304 {
305 1 if(USB_Device_Request.bRequest == 0x0C)
306 1 {
307 2 switch (USB_Device_Request.wIndex)
308 2 {
309 3 case GET_FIRMWARE_VERSION ://获取固件版本
310 3 if(USB_Device_Request.wLength == 1)
311 3 {
312 4 //select endpoint
313 4 D14_Cntrl_Reg.D14_ENDPT_INDEX = 1;
314 4 //set the data length to 1 byte
315 4 D14_Cntrl_Reg.D14_BUFFER_LENGTH_LSB = 1;
316 4 D14_Cntrl_Reg.D14_BUFFER_LENGTH_MSB = 0;
317 4 //sent 0x21 as data
318 4 D14_Cntrl_Reg.D14_DATA_PORT_LSB = 0x21;//版本号
319 4 wait_ep0tx();
320 4 ep0out_ack();
321 4 // ep0in_ack();
322 4 break;
323 4 }
324 3
325 3 case SETUP_DMA_REQUEST :
326 3 //Out Token Ack detected
327 3 wait_ep0rx();
328 3 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
329 3 //
330 3 FileSize.Size.Address[0] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
331 3 FileSize.Size.Address[1] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
332 3 FileSize.Size.Address[2] = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
333 3 //读取传输字节数
334 3 Temp = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
335 3 bytecount = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
336 3 bytecount <<= 8;
337 3 bytecount |= Temp;
338 3 //读取传输方式
339 3 FileSize.Size.DIR = D14_Cntrl_Reg.D14_DATA_PORT_LSB;
340 3 ep0in_ack();
341 3 Kernel_Flag.BITS.Transfer_Start = 1;//标志传输数据开始
342 3 break;
343 3
344 3 default :
345 3 if(USB_Device_Request.bmRequestType == 0xC0)
346 3 {
347 4 ep0in_ack();
348 4 break;
349 4 }
350 3 if(USB_Device_Request.bmRequestType == 0x40)
351 3 {
352 4 D14_Cntrl_Reg.D14_ENDPT_INDEX = 0;
353 4 D14_Cntrl_Reg.D14_CONTROL_FUNCTION.BITS.STALL = 1;
354 4 while(!USB_Int_Flag.BITS.EP0SETUP)
355 4 {
356 5 //读取ISP1581中断寄存器
357 5 USB_Int_Flag.VALUE |= D14_Cntrl_Reg.D14_INT.VALUE;
358 5 //回写ISP1581中断寄存器
359 5 D14_Cntrl_Reg.D14_INT.VALUE = USB_Int_Flag.VALUE;
360 5 if(USB_Int_Flag.BITS.SUSP || USB_Int_Flag.BITS.RESET)
361 5 return;
362 5 }
363 4 USB_Int_Flag.BITS.EP0TX = 0;
364 4 break;
365 4 }
C51 COMPILER V7.01 CHAP_9 03/28/2003 14:38:29 PAGE 7
366 3 }
367 2 }
368 1 }
369
370 //***********************************************************************
371 //* *
372 //* Routine : *
373 //* Input : None *
374 //* Output : None *
375 //* Function : *
376 //* *
377 //***********************************************************************
378
379 void reserved(void)
380 {
381 1 }
382
383
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -