做游戏手柄的方法,游戏神器制作手柄

首页 > 生活 > 作者:YD1662024-11-28 05:44:19

做游戏手柄的方法,游戏神器制作手柄(1)

第10章 USB主机如何识别设备

虽然游戏操纵杆已经能够正常工作,但是非常好学的你肯定很想知道:为什么开发板上的按键可以控制PC鼠标的移动方向呢?为什么在PC任意一个USB接口依次插入的鼠标、键盘或其他USB设备都能够被正确识别呢?这就是总线枚举(Bus Enumeration)的功劳。

什么是枚举呢?以公司招聘面试为例,面试官通常会根据面试者的简历提出一些问题,然后针对回复提出另一个有一定关联的问题,依次循环,继而达到全面考查面试者业务水平的目的,经过综合评估才能判断是否符合公司的录用标准。当面试者通过面试顺利入职公司后,相关部门通常会在管理系统中增加一条代表“面试者就职于该公司”的记录,同时分配一个工号。例如,“1”号通常就是意气风发的老板,“7259”号就是籍籍无名的你。

整个面试与入职过程就是一次完整的枚举过程。在面试的场景中,你就是USB设备,公司就是USB主机,而面试官则负责建立一套“是否符合公司录用标准”的判断流程。所以简单地说,枚举就是“识别”或“鉴别”的同义词,而员工的工号就相当于主机给设备分配的地址(一个USB主机最多可以扩展127个设备,而每个设备都会有一个唯一的地址),如图10.1所示。

做游戏手柄的方法,游戏神器制作手柄(2)

图10.1 面试与枚举

同样的道理,当USB设备连接到PC(主机)时,PC也需要询问一些关于它的信息,以确定到底是个什么东西。PC当然是不能说话的,它只会发送一些命令,USB设备必须对这些命令进行响应,否则枚举就会失败(问话你一声不吭,面试失败)。当然,USB设备必须进行正确响应,“乱弹琴”也会导致枚举失败(回答问题牛头不对马嘴,面试失败)。当然,即便枚举成功了,也不一定代表USB设备肯定能够正常工作(有些人面试时能说会道,但真正做起事来却完全不行,失败中的失败),就像每个人(USB设备)进出城门需要特定令牌一样,令牌本身代表着一定的特权,拿着它就能够自由进出城门(枚举成功了),但是令牌本身可能是抢来或骗来的,这个人本身并不具备享有该特权的合法资格,也就无法真正实施与该特权相当的事情(USB设备不能正常工作),只不过用来欺骗守城门人(枚举流程)而已。

概括来讲,如果我们要让自己的USB设备成功与主机传输数据,关键的两个步骤是必须进行的。其一,让USB设备遵循USB规范正确回应主机的命令,以成功完成枚举过程。其二,在枚举成功后,将数据按正确的格式进行传输。

有些人可能会想:怎么还要响应命令呢?粗看了一下貌似很复杂,玩不了,回家洗洗睡了!这里必须得打击你一下,USB底层的实现确实有点复杂,因为USB的简易性是以协议的复杂性为代价的。但幸运的是,通常厂商都会将底层的核心实现打包成了固件库,我们只要修改应用方面的一些数据即可。也就是说,如果只是使用USB传输数据,你没机会(也不需要)去修改底层那些复杂的源代码。

那到底需要修改什么地方才能成功完成总线枚举呢?其实道理跟工程师做项目一样!例如,当我们使用单片机编程来控制新的元器件时,首先需要了解元器件的基本原理,包括硬件电路的连接要求、通信时序、寄存器定义等。厂家为了方便用户使用,通常都会准备好相应的数据手册,它包含了用户应用该元器件的所有信息。

同样的道理,如果将你当成一台PC,当USB鼠标与某个USB接口相连时,你又是怎么知道它是鼠标,而不是键盘或其他设备呢?很明显,你(PC)也需要数据手册之类能够描述插入设备所有信息的媒介,对不对?USB规范中定义的描述符(Descriptor)就是这个目的。

描述符本身就是一些常量数据。例如,现在要定义一个员工的描述符,它应该包含姓名、性别、年龄、工号等信息,我们可以称这些信息为字段(Field),相应可供使用的结构体类似如清单10.1所示。

清单10.1 员工描述符结构体

做游戏手柄的方法,游戏神器制作手柄(3)

为了方便数据的传输,我们也可以统一使用无符号8位整型(uint8_t)数组来描述员工信息,只要约定好字符串与字段之间的对应关系即可,类似...

清单10.2 员工描述符数组

做游戏手柄的方法,游戏神器制作手柄(4)

首页 123下一页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.