恒同外设:利用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键盘

首先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键盘的信息别忘了在本站进行查找喔。


数据运维技术 » 恒同外设:利用Linux开发USB HID设备应用 (linux u hid设备应用开发)