恒同外设:利用Linux开发USB HID设备应用 (linux u hid设备应用开发)

技术

恒同外设是指任何连接到电脑的设备,都能够作系统识别为同一种类型的设备。在这个过程中,万能驱动程序扮演了关键角色,可支持不同类型的USB设备。而恒同外设系统就是一种USB HID设备,在这个系统中,所有的设备都被当做是HID(Human Interface Device)设备进行识别和处理。

HID设备可供许多用途,例如输入设备、鼠标、键盘等等。利用Linux开发USB HID设备应用技术是一项非常有意义和挑战性的操作,为了支持不同类型的USB设备,必须仔细研究硬件设备和操作系统之间的交互过程,以及如何将新设备添加到系统中。

一般而言,USB设备可能会通过多个接口与计算机通讯。不同的接口可能会具有不同的功能,例如音频、数据传输等等。对于HID设备来说,它们需要使用一种“报告”类型的接口进行通讯。这种报告接口可支持任何种类的HID应用,开发者可编写自己的报告模式和处理程序,以满足特定的用户需求。

为了开发恒同外设,一般需要使用Linux开发环境。Linux是目前应用最广泛和更受欢迎的开源操作系统之一,在开发USB设备应用时具有很大的优势。Linux操作系统内置了一些USB设备驱动程序,通过这些驱动程序可以很方便地进行USB设备的控制和操作。

另外,Linux环境还提供了一些基于字符设备的接口,可以自由地创建和操作字符设备。这些字符设备可用于实现许多不同类型的应用,尤其是针对USB HID设备的应用。

在Linux环境中,开发者可以使用C或C++等编程语言编写程序代码,利用Linux的内核接口访问设备驱动程序。这样可以更加灵活地构建设备应用程序。开发者可以编写自己的驱动程序和应用程序,以支持各种不同类型的USB设备。

为了支持HID设备,开发者需要编写一种称为“USB HID驱动程序”的特殊类型的驱动程序。这种驱动程序必须能够处理报告类型的接口以及生产商定义的报告描述符。它还必须能够解析和处理设备发送到主机的报告。

在进行恒同外设的开发时,开发者还需要确保设备的驱动程序能够与操作系统相兼容。这可以通过在操作系统中添加设备的信息来实现。在添加新设备时,开发者需要定义正确的设备信息,以便系统能够正确地管理这些设备。

恒同外设在USB设备应用中扮演着非常重要的角色,它支持各种不同类型的USB设备,并促进了开发者之间的信息共享和技术进步。利用Linux开发USB HID设备应用技术,则为USB设备应用的创新和发展提供了更大的空间和机会。

相关问题拓展阅读:

  • 如何在嵌入式linux开发板上使用USB键盘

如何在嵌入式linux开发板上使用USB键盘

首先u键盘驱动的源代码位于一下目录:

drivers/u/input/ukbd.c

将u键盘驱动编译进内核:

#make menuconfig

Device Drivers—>USB support—->USB HIDBP Keyboard (simple Boot) support

(注意:有可能默认设置USB键盘驱动是不可见的,需修改当前目录下的Kconfig文件,在此不做详细介绍,Kconfig语法有待进一步熟悉:))

保存设置后,重新编译内核:

#source setenv

#make uImage

uImage生成后位于目录:arch/arm/boot/uImage;

(或者直接将u键盘驱动编译为驱动模块,进行加载也可);

启动系统后,确定u键盘加载到了那个设备文件,一般为/dev/input/event0设备,可通过cat命令进行确认:

#cat /dev/input/event0

操作u键盘,会有乱码出现;

然后应用层用这个程序来获取u键尘掘液盘的输入:

#include

#include

#include

#include

struct input_event buff;

int fd;

int read_nu;

int main(int argc, char *argv)

{

fd = open(“/dev/input/event0″散租, O_RDON);

if (fd 40)

printf(“type:%d code:%d value:%d\n”,buff.type,buff.code,buff.value);

//#if 0

//i++;

//if(i > 12)

//{

//break;

//}

/派物/#endif

}

close(fd);

return 1;

}

运行程序后,按下A键,可见如下输出:

–fd:3–

type:1 code:30 value:1

type:0 code:0 value:0

鼠标驱动可分为几个部分:驱动加载部分、伏亏probe部分、open部分、urb回调函数处理部分。

下文阴影部分为注解。

一、驱动加载部分

static int __init u_mouse_init(void)

{

int retval = u_register(&u_mouse_driver);//注册鼠标驱动

if (retval == 0)

info(DRIVER_VERSION “:” DRIVER_DESC);

return retval;

}

其中u_mouse_driver的定义为:

static struct u_driver u_mouse_driver = {

.owner = THIS_MODULE,

.name = “umouse”,

.probe = u_mouse_probe,

.disconnect= u_mouse_disconnect,

.id_table= u_mouse_id_table,

};

如果注册成功的话,将会调用u_mouse_probe。那么什么时候才算注册成功呢?

和其它驱动注册过程一样,只有在其对应的“总线”上发现匹配的“设备”才会调用probe。总线匹配的方历碰法和具体总线相关,如:缺烂神platform_bus_type中是判断驱动名称和平台设备名称是否相同;那如何确认u总线的匹配方法呢?

U设备是注册在u_bus_type总线下的。查看u_bus_type的匹配方法。

struct bus_type u_bus_type = {

.name = “u”,

.match = u_device_match,

.hotplug =u_hotplug,

.suspend =u_generic_suspend,

.resume =u_generic_resume,

};

其中u_device_match定义了匹配方法

static int u_device_match (struct device *dev, struct device_driver *drv)

{

struct u_interface *intf;

struct u_driver *u_drv;

const struct u_device_id *id;

/* check for generic driver, which we don’t match any device with */

if (drv == &u_generic_driver)

return 0;

intf = to_u_interface(dev);

u_drv = to_u_driver(drv);

id = u_match_id (intf, u_drv->id_table);

if (id)

return 1;

return 0;

}

可以看出u的匹配方法是u_match_id (intf, u_drv->id_table),也就是说通过比对“dev中intf信息”和“u_drv->id_table信息”,如果匹配则说明驱动所对应的设备已经添加到总线上了,所以接下了就会调用drv中的probe方法注册u设备驱动。

u_mouse_id_table的定义为:

static struct u_device_id u_mouse_id_table = {

{ USB_INTERFACE_INFO(3, 1, 2) },

{ } /* Terminating entry */

};

#define USB_INTERFACE_INFO(cl,sc,pr) /

.match_flags = USB_DEVICE_ID_MATCH_INT_INFO, /

.bInterfaceClass = (cl), /

.bInterfaceSubClass = (sc), /

.bInterfaceProtocol = (pr)

鼠标设备遵循USB人机接口设备(HID),在HID规范中规定鼠标接口类码为:

接口类:0x03

接口子类:0x01

接口协议:0x02

这样分类的好处是设备厂商可以直接利用标准的驱动程序。除了HID类以外还有Mass storage、printer、audio等

#define USB_DEVICE_ID_MATCH_INT_INFO /

(USB_DEVICE_ID_MATCH_INT_CLASS | USB_DEVICE_ID_MATCH_INT_SUBCLASS | USB_DEVICE_ID_MATCH_INT_PROTOCOL)

匹配的过程为:

u_match_id(struct u_interface *interface, const struct u_device_id *id)

{

struct u_host_interface *intf;

struct u_device *dev;

/* proc_connectinfo in devio.c may call us with id == NULL. */

if (id == NULL)

return NULL;

intf = interface->cur_altsetting;

dev = interface_to_udev(interface);

/* It is important to check that id->driver_info is nonzero,

since an entry that is all zeroes except for a nonzero

id->driver_info is the way to create an entry that

indicates that the driver want to examine every

device and interface. */

for (; id->idVendor || id->bDeviceClass || id->bInterfaceClass ||

id->driver_info; id++) {

if ((id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) &&

id->idVendor != le16_to_cpu(dev->descriptor.idVendor))

continue;

if ((id->match_flags & USB_DEVICE_ID_MATCH_PRODUCT) &&

id->idProduct != le16_to_cpu(dev->descriptor.idProduct))

continue;

/* No need to test id->bcdDevice_lo != 0, since 0 is never greater than any unsigned number. */

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_LO) &&

(id->bcdDevice_lo > le16_to_cpu(dev->descriptor.bcdDevice)))

continue;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_HI) &&

(id->bcdDevice_hi descriptor.bcdDevice)))

continue;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_CLASS) &&

(id->bDeviceClass != dev->descriptor.bDeviceClass))

continue;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_SUBCLASS) &&

(id->bDeviceSubClass!= dev->descriptor.bDeviceSubClass))

continue;

if ((id->match_flags & USB_DEVICE_ID_MATCH_DEV_PROTOCOL) &&

(id->bDeviceProtocol != dev->descriptor.bDeviceProtocol))

continue;

//接口类

if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) &&

(id->bInterfaceClass != intf->desc.bInterfaceClass))

continue;

//接口子类

if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_SUBCLASS) &&

(id->bInterfaceSubClass != intf->desc.bInterfaceSubClass))

continue;

//遵循的协议

if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_PROTOCOL) &&

(id->bInterfaceProtocol != intf->desc.bInterfaceProtocol))

continue;

return id;

}

return NULL;

}

从中可以看出,只有当设备的接口类、接口子类、接口协议匹配鼠标驱动时鼠标驱动才会调用probe方法。

linux u hid设备应用开发的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux u hid设备应用开发,恒同外设:利用Linux开发USB HID设备应用,如何在嵌入式linux开发板上使用USB键盘的信息别忘了在本站进行查找喔。

香港服务器首选树叶云,2H2G首月10元开通。
树叶云(shuyeidc.com)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/190825.html<

(0)
运维的头像运维
上一篇2025-03-31 20:26
下一篇 2025-03-31 20:28

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注