📄 usbcore.lst
字号:
264 //wTotalLength字段。配置描述符集合的总长度,
265 //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
266 sizeof(ConfigurationDescriptor)&0xFF, //低字节
267 (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
268
269 //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
270 0x01,
271
272 //bConfiguration字段。该配置的值为1。
273 0x01,
274
275 //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
276 0x00,
277
278 //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
279 //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
280 0x80,
281
282 //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
283 //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
284 //电流为2mA,所以这里设置为50(0x32)。
285 0x32,
286
287 /*******************接口描述符*********************/
288 //bLength字段。接口描述符的长度为9字节。
289 0x09,
290
291 //bDescriptorType字段。接口描述符的编号为0x04。
292 0x04,
293
294 //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
295 0x00,
296
297 //bAlternateSetting字段。该接口的备用编号,为0。
298 0x00,
299
300 //bNumEndpoints字段。非0端点的数目。该USB键盘需要二个
301 //中断端点(一个输入一个输出),因此该值为2。
302 0x02,
303
C51 COMPILER V8.02 USBCORE 06/17/2010 09:51:39 PAGE 6
304 //bInterfaceClass字段。该接口所使用的类。USB键盘是HID类,
305 //HID类的编码为0x03。
306 0x03,
307
308 //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,
309 //只规定了一种子类:支持BIOS引导启动的子类。
310 //USB键盘、鼠标属于该子类,子类代码为0x01。
311 0x01,
312
313 //bInterfaceProtocol字段。如果子类为支持引导启动的子类,
314 //则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。
315 0x01,
316
317 //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
318 0x00,
319
320 /******************HID描述符************************/
321 //bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。
322 0x09,
323
324 //bDescriptorType字段。HID描述符的编号为0x21。
325 0x21,
326
327 //bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。
328 0x10,
329 0x01,
330
331 //bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。
332 0x21,
333
334 //bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。
335 0x01,
336
337 //bDescritporType字段。下级描述符的类型,为报告描述符,编号为0x22。
338 0x22,
339
340 //bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。
341 sizeof(ReportDescriptor)&0xFF,
342 (sizeof(ReportDescriptor)>>8)&0xFF,
343
344 /**********************输入端点描述符***********************/
345 //bLength字段。端点描述符长度为7字节。
346 0x07,
347
348 //bDescriptorType字段。端点描述符编号为0x05。
349 0x05,
350
351 //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
352 //D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。
353 0x81,
354
355 //bmAttributes字段。D1~D0为端点传输类型选择。
356 //该端点为中断端点。中断端点的编号为3。其它位保留为0。
357 0x03,
358
359 //wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
360 //注意低字节在先。
361 0x10,
362 0x00,
363
364 //bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。
365 0x0A,
C51 COMPILER V8.02 USBCORE 06/17/2010 09:51:39 PAGE 7
366
367 /**********************输出端点描述符***********************/
368 //bLength字段。端点描述符长度为7字节。
369 0x07,
370
371 //bDescriptorType字段。端点描述符编号为0x05。
372 0x05,
373
374 //bEndpointAddress字段。端点的地址。我们使用D12的输出端点1。
375 //D7位表示数据方向,输出端点D7为0。所以输出端点1的地址为0x01。
376 0x01,
377
378 //bmAttributes字段。D1~D0为端点传输类型选择。
379 //该端点为中断端点。中断端点的编号为3。其它位保留为0。
380 0x03,
381
382 //wMaxPacketSize字段。该端点的最大包长。端点1的最大包长为16字节。
383 //注意低字节在先。
384 0x10,
385 0x00,
386
387 //bInterval字段。端点查询的时间,我们设置为10个帧时间,即10ms。
388 0x0A
389 };
390 ////////////////////////配置描述符集合完毕//////////////////////////
391
392 /************************语言ID的定义********************/
393 code uint8 LanguageId[4]=
394 {
395 0x04, //本描述符的长度
396 0x03, //字符串描述符
397 //0x0409为美式英语的ID
398 0x09,
399 0x04
400 };
401 ////////////////////////语言ID完毕//////////////////////////////////
402
403
404 //字符串““天祥电子” Http:www.txmcu.cn”的Unicode编码
405 //8位小端格式
406 code uint8 ManufacturerStringDescriptor[52]={
407 52, //该描述符的长度为82字节
408 0x03, //字符串描述符的类型编码为0x03
409 0x1c, 0x20, //“
410 0x29, 0x59, //天
411 0x65, 0x79, //祥
412 0x35, 0x75, //电
413 0x50, 0x5b, //子
414 0x1d, 0x20, //”
415 0x20, 0x00, //
416 0x48, 0x00, //H
417 0x74, 0x00, //t
418 0x74, 0x00, //t
419 0x70, 0x00, //p
420 0x3a, 0x00, //:
421 0x77, 0x00, //w
422 0x77, 0x00, //w
423 0x77, 0x00, //w
424 0x2e, 0x00, //.
425 0x74, 0x00, //t
426 0x78, 0x00, //x
427 0x6d, 0x00, //m
C51 COMPILER V8.02 USBCORE 06/17/2010 09:51:39 PAGE 8
428 0x63, 0x00, //c
429 0x75, 0x00, //u
430 0x2e, 0x00, //.
431 0x63, 0x00, //c
432 0x6f, 0x00, //o
433 0x6d, 0x00 //m
434 };
435 /////////////////////////厂商字符串结束/////////////////////////////
436
437 //字符串““天祥电子”之USB键盘”的Unicode编码
438 //8位小端格式
439 code uint8 ProductStringDescriptor[34]={
440 34, //该描述符的长度为34字节
441 0x03, //字符串描述符的类型编码为0x03
442 0x1c, 0x20, //“
443 0x29, 0x59, //天
444 0x65, 0x79, //祥
445 0x35, 0x75, //电
446 0x50, 0x5b, //子
447 0x1d, 0x20, //”
448 0x4b, 0x4e, //之
449 0x55, 0x00, //U
450 0x53, 0x00, //S
451 0x42, 0x00, //B
452 0x2e, 0x95, //键
453 0xd8, 0x76 //盘
454 };
455 ////////////////////////产品字符串结束////////////////////////////
456
457 //字符串“2008-07-12”的Unicode编码
458 //8位小端格式
459 code uint8 SerialNumberStringDescriptor[22]={
460 22, //该描述符的长度为22字节
461 0x03, //字符串描述符的类型编码为0x03
462 0x32, 0x00, //2
463 0x30, 0x00, //0
464 0x31, 0x00, //0
465 0x30, 0x00, //8
466 0x2d, 0x00, //-
467 0x30, 0x00, //0
468 0x36, 0x00, //7
469 0x2d, 0x00, //-
470 0x31, 0x00, //1
471 0x32, 0x00 //2
472 };
473 //////////////////////产品序列号字符串结束/////////////////////////
474
475 /********************************************************************
476 函数功能:延时x毫秒函数。
477 入口参数:x:延时的毫秒数。
478 返 回:无。
479 备 注:无。
480 ********************************************************************/
481 void DelayXms(uint16 x)
482 {
483 1 uint16 i;
484 1 uint16 j;
485 1 for(i=0;i<x;i++)
486 1 for(j=0;j<227;j++); //循环语句延时
487 1 }
488 ////////////////////////End of function//////////////////////////////
489
C51 COMPILER V8.02 USBCORE 06/17/2010 09:51:39 PAGE 9
490 /********************************************************************
491 函数功能:USB断开连接函数。
492 入口参数:无。
493 返 回:无。
494 备 注:无。
495 ********************************************************************/
496 void UsbDisconnect(void)
497 {
498 1 #ifdef DEBUG0
499 1 Prints("断开USB连接。\r\n");
500 1 #endif
501 1 outportb(D12COMMAND, 0xF3); //写设置模式命令
502 1 outportb(D12DATA, 0x06);
503 1 outportb(D12DATA, 0x47);
504 1
505 1 DelayXms(1000); //延迟1秒
506 1 }
507 ////////////////////////End of function//////////////////////////////
508
509 /********************************************************************
510 函数功能:USB连接函数。
511 入口参数:无。
512 返 回:无。
513 备 注:无。
514 ********************************************************************/
515 void UsbConnect(void)
516 {
517 1 #ifdef DEBUG0
518 1 Prints("连接USB。\r\n");
519 1 #endif
520 1 outportb(D12COMMAND, 0xF3);
521 1 //写设置模式命令
522 1 outportb(D12DATA, 0x16);
523 1 outportb(D12DATA, 0x47);
524 1 }
525 ////////////////////////End of function//////////////////////////////
526
527 /********************************************************************
528 函数功能:总线挂起中断处理函数。
529 入口参数:无。
530 返 回:无。
531 备 注:无。
532 ********************************************************************/
533 void UsbBusSuspend(void)
534 {
535 1 #ifdef DEBUG0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -