⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 usbcore.lst

📁 USB多媒体键盘鼠标原程序代码
💻 LST
📖 第 1 页 / 共 5 页
字号:
 242           //这是一个全局条目。定义位域长度为3bit。
 243           0x75, 0x03, //   REPORT_SIZE (3)
 244           
 245           //这是一个主条目,定义输出常量,前面用了5bit,所以这里需要
 246           //3个bit来凑成一字节。
 247           0x91, 0x03, //   OUTPUT (Cnst,Var,Abs)
 248           
 249           //下面这个主条目用来关闭前面的集合。bSize为0,所以后面没数据。
 250           0xc0,        // END_COLLECTION
 251          //以下注释不包括第一字节报告ID。
 252          //通过上面的报告描述符的定义,我们知道返回的输入报告具有8字节。
 253          //第一字节的8个bit用来表示特殊键是否按下(例如Shift、Alt等键)。
 254          //第二字节为保留值,值为常量0。第三到第八字节是一个普通键键值的
 255          //数组,当没有键按下时,全部6个字节值都为0。当只有一个普通键按下时,
 256          //这六个字节中的第一字节值即为该按键的键值(具体的键值请看HID的
 257          //用途表文档),当有多个普通键同时按下时,则同时返回这些键的键值。
 258          //如果按下的键太多,则这六个字节都为0xFF(不能返回0x00,这样会让
 259          //操作系统认为所有键都已经释放)。至于键值在数组中的先后顺序是
 260          //无所谓的,操作系统会负责检查是否有新键按下。我们应该在中断端点1
 261          //中按照上面的格式返回实际的键盘数据。另外,报告中还定义了一个字节
 262          //的输出报告,是用来控制LED情况的。只使用了低7位,高1位是保留值0。
 263          //当某位的值为1时,则表示对应的LED要点亮。操作系统会负责同步各个
 264          //键盘之间的LED,例如你有两块键盘,一块的数字键盘灯亮时,另一块
 265          //也会跟着亮。键盘本身不需要判断各种LED应该何时亮,它只是等待主机
 266          //发送报告给它,然后根据报告值来点亮相应的LED。我们在端点1输出中断
 267          //中读出这1字节的输出报告,然后对它取反(因为学习板上的LED是低电平时
 268          //亮),直接发送到LED上。这样main函数中按键点亮LED的代码就不需要了。
 269          
 270          /*******************用户控制设备部分报告描述符**********************/
 271          /*******************************************************************/
 272          
 273           //这是一个全局(bType为1)条目,选择用途页为Consumer Page (0x0C)
 274           0x05, 0x0c, // USAGE_PAGE (Consumer Page)
 275           
 276           //这是一个局部(bType为2)条目,说明接下来的应用集合用于用户控制
 277           0x09, 0x01, // USAGE (Consumer Control)
 278           
 279           //这是一个主条目(bType为0)条目,开集合,后面跟的数据0x01表示
 280           //该集合是一个应用集合。它的性质在前面由用途页和用途定义为用户控制。
 281           0xa1, 0x01, // COLLECTION (Application)
 282           
 283           //报告ID,这里定义用户控制报告的ID为2
 284           0x85, 0x02, //Report ID (2)
 285           
 286           //这是一个局部条目。说明用途为音量降低
 287           0x09, 0xea, //   USAGE (Volume Decrement) 
 288           
 289           //这是一个局部条目。说明用途为音量提升
 290           0x09, 0xe9, //   USAGE (Volume Increment) 
 291           
 292           //这是一个局部条目。说明用途为静音
 293           0x09, 0xe2, //   USAGE (Mute)
 294          
 295           //这是一个局部条目。说明用途为播放/暂停
 296           0x09, 0xcd, //   USAGE (Play/Pause)
 297           
 298           //这是一个局部条目(注意后面带两字节数据,bSize=2)。
 299           //说明用途为打开主页(实际上是浏览器),即有些键盘上的WWW键。
 300           //另外还有很多功能键也可以在Consumer页中找到,大家可以找来试试。例如:
 301           //AL Consumer Control Configuration(0x183)可以打开Windows Media Player;
 302           //AL Email Reader(0x18A)可以打开发送邮件的Outlook;
 303           //AL Calculator(0x192)可以打开计算器;
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 6   

 304           //AL Local Machine Browser(0x194)可以打开我的电脑;
 305           //AC Search(0x221)可以打开搜索文件窗口。
 306           //如果要增加按键的话,要修改报告字段的数量,同时还要修改报告返回。
 307           //不过,文档中写着这些用途的类型是sel的,也就是说,
 308           //应该用数组来返回(就像键盘普通键那样),但是我把它当作
 309           //OSC的来用也可以,晕,也许是windows驱动也支持这种方式吧。
 310           //不知道键盘的普通按键,是否也可以通过这样的方式来返回呢?
 311           //感兴趣的可以试试看,不过这样搞的话,按键一多就需要很多
 312           //字段了,因为一个按键就要分配一个字段。注意小端结构,低字节在先。
 313           0x0a, 0x23, 0x02, //USAGE (AC Home(0x0223))
 314           
 315           //这是一个全局条目,说明返回的数据的逻辑值最小为0。
 316           //因为我们这里用Bit来表示一个数据域,因此最小为0,最大为1。
 317           0x15, 0x00, //     LOGICAL_MINIMUM (0)
 318           
 319           //这是一个全局条目,说明逻辑值最大为1。
 320           0x25, 0x01, //     LOGICAL_MAXIMUM (1)
 321           
 322           //这是一个全局条目,说明数据域的数量为5个(即前面的5个用途)。
 323           0x95, 0x05, //     REPORT_COUNT (5)
 324           
 325           //这是一个全局条目,说明每个数据域的长度为1个bit。
 326           0x75, 0x01, //     REPORT_SIZE (1)
 327           
 328           //这是一个主条目,说明有5个长度为1bit的数据域(数量和长度
 329           //由前面的两个全局条目所定义)用来做为输入,
 330           //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示
 331           //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
 332           //这样定义的结果就是,第一个数据域bit0表示音量降低,
 333           //第二个数据域bit1表示音量提升,第三个数据域bit2表示静音开关,
 334           //第四个数据域bit3表示播放/暂停,第五个数据域bit4表示打开网页。
 335           0x81, 0x02, //     INPUT (Data,Var,Abs)
 336           
 337           //这是一个全局条目,选择用途页为普通桌面Generic Desktop Page(0x01)
 338           0x05, 0x01, //     USAGE_PAGE (Generic Desktop)
 339           
 340           //这是一个局部条目,说明用途为系统待机
 341           0x09, 0x82, //     USAGE (System Sleep) 
 342           
 343           //这是一个局部条目,说明用途为系统关机
 344           0x09, 0x81, //     USAGE (System Power Down)
 345           
 346           //这是一个全局条目,说明数据域的长度为1bit。
 347           0x75, 0x01, //     REPORT_SIZE (1)
 348           
 349           //这是一个全局条目,说明数据域的个数为2个。
 350           0x95, 0x02, //     REPORT_COUNT (2)
 351           
 352           //这是一个主条目,说明有2个长度为1bit的数据域(数量和长度
 353           //由前面的两个全局条目所定义)用来做为输入,
 354           //属性为:Data,Var,Abs。Data表示这些数据可以变动,Var表示
 355           //这些数据域是独立的,每个域表示一个意思。Abs表示绝对值。
 356           //这样定义的结果就是,第一个数据域表示系统待机,
 357           //第二个数据域表示系统关机。
 358           0x81, 0x02, //     INPUT (Data,Var,Abs)
 359           
 360           //这是一个全局条目,说明数据域数量为1个
 361           0x95, 0x01, //     REPORT_COUNT (1)
 362           
 363           //这是一个全局条目,说明每个数据域的长度为1bit。
 364           0x75, 0x01, //     REPORT_SIZE (1)
 365           
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 7   

 366           //这是一个主条目,输入用,由前面两个全局条目可知,长度为1bit,
 367           //数量为1个。它的属性为常量(即返回的数据一直是0)。
 368           //这个只是为了凑齐一个字节(前面用了7个bit)而填充的一些数据
 369           //而已,所以它是没有实际用途的。
 370           0x81, 0x03, //     INPUT (Cnst,Var,Abs)
 371           
 372           //下面这个主条目用来关闭前面的集合。
 373           0xc0        // END_COLLECTION
 374          //以下注释不包括第一字节报告ID。
 375          //通过上面的报告描述符的定义,我们知道返回的输入报告具有1字节。
 376          //其中bit0对应音量降低,bit1对应音量提升,bit2对应静音控制,
 377          //bit3对应播放/停止,bit4对应打开网页,bit5对应系统待机,
 378          //bit6对应系统关机,bit7为常量0。
 379          /***********************用户控制设备部分报告结束****************/
 380          };
 381          //由于该报告使用了报告ID,因此报告在返回时,需要在最前面增加
 382          //一字节的报告ID。当报告ID为1时,返回的数据是普通键盘数据;
 383          //当报告ID为2时,返回的数据是用户控制设备的数据。
 384          ///////////////////////////报告描述符完毕////////////////////////////
 385          
 386          //USB配置描述符集合的定义
 387          //配置描述符总长度为9+9+9+7+7字节
 388          code uint8 ConfigurationDescriptor[9+9+9+7+7]=
 389          {
 390           /***************配置描述符***********************/
 391           //bLength字段。配置描述符的长度为9字节。
 392           0x09,
 393           
 394           //bDescriptorType字段。配置描述符编号为0x02。
 395           0x02,
 396           
 397           //wTotalLength字段。配置描述符集合的总长度,
 398           //包括配置描述符本身、接口描述符、类描述符、端点描述符等。
 399           sizeof(ConfigurationDescriptor)&0xFF, //低字节
 400           (sizeof(ConfigurationDescriptor)>>8)&0xFF, //高字节
 401           
 402           //bNumInterfaces字段。该配置包含的接口数,只有一个接口。
 403           0x01,
 404           
 405           //bConfiguration字段。该配置的值为1。
 406           0x01,
 407           
 408           //iConfigurationz字段,该配置的字符串索引。这里没有,为0。
 409           0x00,
 410           
 411           //bmAttributes字段,该设备的属性。由于我们的板子是总线供电的,
 412           //并且我们不想实现远程唤醒的功能,所以该字段的值为0x80。
 413           0x80,
 414           
 415           //bMaxPower字段,该设备需要的最大电流量。由于我们的板子
 416           //需要的电流不到100mA,因此我们这里设置为100mA。由于每单位
 417           //电流为2mA,所以这里设置为50(0x32)。
 418           0x32,
 419           
 420           /*******************接口描述符*********************/
 421           //bLength字段。接口描述符的长度为9字节。
 422           0x09,
 423           
 424           //bDescriptorType字段。接口描述符的编号为0x04。
 425           0x04,
 426           
 427           //bInterfaceNumber字段。该接口的编号,第一个接口,编号为0。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 8   

 428           0x00,
 429           
 430           //bAlternateSetting字段。该接口的备用编号,为0。
 431           0x00,
 432           
 433           //bNumEndpoints字段。非0端点的数目。由于USB键盘需要二个
 434           //中断端点(一个输入一个输出),因此该值为2。
 435           0x02,
 436           
 437           //bInterfaceClass字段。该接口所使用的类。USB键盘是HID类,
 438           //HID类的编码为0x03。
 439           0x03,
 440           
 441           //bInterfaceSubClass字段。该接口所使用的子类。在HID1.1协议中,
 442           //只规定了一种子类:支持BIOS引导启动的子类。
 443           //USB键盘、鼠标属于该子类,子类代码为0x01。
 444           0x01,
 445           
 446           //bInterfaceProtocol字段。如果子类为支持引导启动的子类,
 447           //则协议可选择鼠标和键盘。键盘代码为0x01,鼠标代码为0x02。
 448           0x01,
 449           
 450           //iConfiguration字段。该接口的字符串索引值。这里没有,为0。
 451           0x00,
 452           
 453           /******************HID描述符************************/
 454           //bLength字段。本HID描述符下只有一个下级描述符。所以长度为9字节。
 455           0x09,
 456           
 457           //bDescriptorType字段。HID描述符的编号为0x21。
 458           0x21,
 459           
 460           //bcdHID字段。本协议使用的HID1.1协议。注意低字节在先。
 461           0x10,
 462           0x01,
 463           
 464           //bCountyCode字段。设备适用的国家代码,这里选择为美国,代码0x21。
 465           0x21,
 466           
 467           //bNumDescriptors字段。下级描述符的数目。我们只有一个报告描述符。
 468           0x01,
 469           
 470           //bDescritporType字段。下级描述符的类型,为报告描述符,编号为0x22。
 471           0x22,
 472           
 473           //bDescriptorLength字段。下级描述符的长度。下级描述符为报告描述符。
 474           sizeof(ReportDescriptor)&0xFF,
 475           (sizeof(ReportDescriptor)>>8)&0xFF,
 476           
 477           /**********************输入端点描述符***********************/
 478           //bLength字段。端点描述符长度为7字节。
 479           0x07,
 480           
 481           //bDescriptorType字段。端点描述符编号为0x05。
 482           0x05,
 483           
 484           //bEndpointAddress字段。端点的地址。我们使用D12的输入端点1。
 485           //D7位表示数据方向,输入端点D7为1。所以输入端点1的地址为0x81。
 486           0x81,
 487           
 488           //bmAttributes字段。D1~D0为端点传输类型选择。
 489           //该端点为中断端点。中断端点的编号为3。其它位保留为0。
C51 COMPILER V7.06   USBCORE                                                               11/16/2008 15:59:49 PAGE 9   

 490           0x03,
 491           

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -