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