linux中USB鼠标的驱动和应用代码示例_linux usb 鼠标 用户态代码?linux 鼠标设置

linux中USB鼠标的驱动和应用代码示例_linux usb 鼠标 用户态代码input_sync(dev);resubmit: status usb_submit_urb (urb, GFP_ATOMIC); if (status)

输入同步(开发);

重新发送:

状态=usb_submit_urb (urb, GFP_ATOMIC);

如果(状态)

dev_err(鼠标-usbdev-dev,

“无法重新发送intr,%s-%s/input0,状态%d\\n”,

鼠标-usbdev-总线-总线名称,

鼠标-usbdev-dev路径,状态);

}

静态int usb_mouse_open(struct input_dev *dev)

{

struct usb_mouse *mouse=input_get_drvdata(dev);

mouseirq-dev=mouseusbdev;

if (usb_submit_urb(鼠标中断, GFP_KERNEL))

-返回EIO。

返回0。

}

静态无效usb_mouse_close(struct input_dev *dev)

{

struct usb_mouse *mouse=input_get_drvdata(dev);

usb_kill_urb(鼠标中断);

}

静态int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)

{

struct usb_device *dev=Interface_to_usbdev(intf);

结构usb_host_interface *接口;

结构usb_endpoint_descriptor *端点;

结构usb_mouse *鼠标;

结构输入_dev *输入_dev;

int 管道,maxp;

整数错误=-ENOMEM;

接口=intf-cur_altsetting;

//由于鼠标只有一个端点

if (接口描述.bNumEndpoints !=1)

-返回ENODEV。

端点=接口端点[0].desc;

if (!usb_endpoint_is_int_in(端点))

-返回ENODEV。

管道=usb_rcvintpipe(dev, 端点-bEndpointAddress);

maxp=usb_maxpacket(dev, 管道, usb_pipeout(管道));

鼠标=kzalloc(sizeof(struct usb_mouse), GFP_KERNEL);

input_dev=input_allocate_device();

if (!mouse || !input_dev)

继续失败1。

鼠标数据=usb_alloc_coherent(dev, 8, GFP_ATOMIC, 鼠标data_dma);

if (!鼠标数据)

继续失败1。

鼠标中断=usb_alloc_urb(0, GFP_KERNEL);

if (!mouse-irq)

继续失败2。

mouse-usbdev=开发;

鼠标设备=输入设备;

if(开发商-制造商)

strlcpy(鼠标名称,开发厂商,sizeof(鼠标名称));

if(开发产品){

if(开发商-制造商)

strlcat(鼠标名称, \’ \’, sizeof(鼠标名称));

strlcat(鼠标名称,开发产品,sizeof(鼠标名称));

}

if (!strlen(鼠标名))

snprintf(鼠标名称, sizeof(鼠标名称),

\’USB HIDBP 鼠标%04x:%04x\’,

le16_to_cpu(dev-descriptor.idVendor),

le16_to_cpu(dev-descriptor.idProduct));

usb_make_path(dev, 鼠标物理, sizeof(鼠标物理));

strlcat(鼠标-phys, \’/input0\’, sizeof(鼠标-phys));

input_dev-name=鼠标名称;

input_dev-phys=鼠标物理;

usb_to_input_id(dev, input_dev-id);

input_dev-dev.parent=intf-dev;

input_dev-evbit[0]=BIT_MASK(EV_KEY) | BIT_MASK(EV_REL);

input_dev-keybit[BIT_WORD(BTN_MOUSE)]=BIT_MASK(BTN_LEFT) |

BIT_MASK(BTN_RIGHT)| BIT_MASK(BTN_MIDDLE);

input_dev-relbit[0]=BIT_MASK(REL_X) | BIT_MASK(REL_Y);

input_dev-keybit[BIT_WORD(BTN_MOUSE)] |=BIT_MASK(BTN_SIDE) |

BIT_MASK(BTN_EXTRA);

input_dev-relbit[0] |=BIT_MASK(REL_WHEEL);

input_set_drvdata(input_dev, 鼠标);

input_dev-open=usb_mouse_open;

input_dev-close=usb_mouse_close;

usb_fill_int_urb(鼠标IRQ, dev, 管道, 鼠标数据,

(最多8 至8 :),

usb_mouse_irq,鼠标,端点-bInterval);

mouseirq-transfer_dma=mousedata_dma;

鼠标irq-transfer_flags |=URB_NO_TRANSFER_DMA_MAP;

错误=input_register_device(鼠标设备);

如果(错误)

继续失败3.

usb_set_intfdata(intf, 鼠标);

返回0。

失败3:

usb_free_urb(鼠标中断);

失败2:

usb_free_coherent(dev, 8, 鼠标数据, 鼠标data_dma);

故障1:

input_free_device(input_dev);

kfree(鼠标);

返回错误。

}

静态无效usb_mouse_disconnect(struct usb_interface *intf)

{

struct usb_mouse *mouse=usb_get_intfdata (intf);

usb_set_intfdata(intf,NULL);

如果(鼠标){

usb_kill_urb(鼠标中断);

input_unregister_device(鼠标设备);

usb_free_urb(鼠标中断);

usb_free_coherent(interface_to_usbdev(intf), 8, 鼠标数据, 鼠标data_dma);

kfree(鼠标);

}

}

静态结构体usb_device_id usb_mouse_id_table[]={

{

USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID,USB_INTERFACE_SUBCLASS_BOOT,

USB_INTERFACE_PROTOCOL_MOUSE)

},

{ } /* 条目结束*/

};

MODULE_DEVICE_TABLE (usb, usb_mouse_id_table);

静态结构usb_driver usb_mouse_driver={

.name=“USB 鼠标”,

.probe=usb_mouse_probe,

.disconnect=usb_mouse_disconnect,

.id_table=usb_mouse_id_table,

};

module_usb_driver(usb_mouse_driver);

应用层USB测试代码:

#include 字符串.h

#include stdio.h

#包括stdlib.h

#include unistd.h

#包括fcntl.h

#include stdio.h

#include sys/types.h

#include unistd.h

#包括fcntl.h

#include linux/input.h

#define MACH_NAME \”mouse\” //要匹配的名称

#define EVENT_X_FORMAT “/dev/event%d” //dev目录下的设备文件路径

int test_mouse(char *mousedev);

//根据设备名查找输入设备下标

int get_event_x(char *mach_name);

int 主函数(无效)

{

int ret=0;

整数x=0;

char file_path_buffer[100]={0};

x=get_event_x(MACH_NAME);

如果(x0){

printf(\’%s 不存在!\\n\’,MACH_NAME);

结束(0);

}

sprintf(文件路径缓冲区,EVENT_X_FORMAT,x);

ret=test_mouse(file_path_buffer);

返回ret。

}

int init_device(char *dev)

{

int fd;

if((fd=open(dev, O_RDONLY)) 0) {

printf(“打开%s\\n\\n 时出错”, dev);

返回-1。

}

返回fd。

}

int test_mouse(char *mousedev)

{

静态结构体input_event数据;

int fd;

fd=init_device(mousedev);

如果(FD 0){

返回-1。

}

而(1){

读取(fd,数据,sizeof(数据));

if (data.type==EV_KEY) {

printf(\’类型=EV_KEY,代码=%s,值=%d\\n\’,

数据.code==BTN_LEFT\’:

数据代码==BTN_RIGHT\’:

数据.code==BTN_MIDDLE \’:

数据.code==\’MOUSE_SIDE\’ :

\’未知\’,数据.值);

else if(data.type==EV_REL) {

printf(\’类型=EV_REL,代码=%s,值=%d\\n\’,

数据.code==\’REL_X\’ :

数据代码==\’REL_Y\’:

数据.code==\’ABS_WHEEL\’ :

数据.code==\’ABS_压力\’ :

\’未知\’,数据.值);

}

}

返回0。

}

//判断文件是否保存

int file_is_exist(char *文件路径)

{

int ret;

if((访问(文件路径,F_OK))!=-1) {

printf(\”文件%s 存在。\\n\”,文件路径);

ret=0;

} 除此之外{

printf(\”%s不存在!\\n\”, 文件路径);

ret=-1;

}

我们专门整理了上百道【运维技术栈面试题】,成为您运维面试路上的好助手。这样,你就可以毫无惊慌地参加面试并获得高薪offer。

这些面试题涵盖了从Shell、MySQL到K8s等云原生技术栈,适合运维行业新人以及运维行业新人的面试需求。升职或换工作以增加薪水。

本次访谈集内容为

174 运维工程师面试题128 k8s 面试题108 shell 脚本面试题200 Linux 面试题51 Docker 面试题35 Jenkis 面试题78 MongoDB 面试题17 ansible 面试题60 dubbo 面试题53 Kafka 面试题18 mysql 面试题40 nginx面试题题77 redis面试题Zookeeper题28

总共1000多道面试题,内容全面且有价值。

174道运维工程师面试题

1.什么是运维?

2、运维人员在工作场所经常需要与操作人员进行交互。运营人员做什么工作?

3. 您目前有300台服务器,您如何管理它们?

4. 简要说明RAID0和Raid1raid5这两种工作模式的工作原理和特点。

5、LVS、Nginx、HAproxy有什么区别?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9、Tomcat中的8005、8009、8080这三个端口是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

6. Squid、Varinsh、Nginx 有什么区别,你在工作中如何选择?

7.Tomcat和Resin有什么区别?

8.什么是中间件?

9、Tomcat中的8005、8009、8080这三个端口是什么意思?

10.什么是CDN?

11.什么是网站灰度发布?

12、请简单说明一下DNS域名解析的过程。

13.什么是RabbitMQ?

14.Keepalived如何工作?

15.描述LVS工作流程的三种模式。

16、mysql的innodb如何识别锁定问题以及mysql如何减少主从复制延迟?

17.如何重置mysql root密码?

#以上Linux_linux上USB鼠标驱动及应用代码示例USB鼠标用户态代码相关内容来源网络,仅供参考。相关信息请参见官方公告。

原创文章,作者:CSDN,如若转载,请注明出处:https://www.sudun.com/ask/92045.html

(0)
CSDN's avatarCSDN
上一篇 2024年6月24日 下午5:33
下一篇 2024年6月24日 下午5:33

相关推荐

发表回复

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