编写USB鼠标驱动程序,并测试

您所在的位置:网站首页 鼠标驱动怎么下 编写USB鼠标驱动程序,并测试

编写USB鼠标驱动程序,并测试

2024-07-13 20:18| 来源: 网络整理| 查看: 265

转载自:https://www.cnblogs.com/lxl-lennie/p/10189188.html

8.1 编写USB鼠标驱动程序,并测试

学习目标:编写USB鼠标驱动程序,并测试(将USB鼠标的左键当作L按键,将USB鼠标的右键当作S按键,中键当作回车按键).

一、怎么写USB设备驱动程序?步骤如下:

1. 首先先定义全局变量usb_driver结构体,并在入口函数中通过usb_register()函数进行注册;

2. 分别写usb_driver结构体的成员函数:myusb_mouseprobe、myusb_mousedisconnect、myusb_mouseid_table

--> 2.1 usb_driver的probe函数

  1) 分配一个input_dev结构体

  2) 设置input_dev结构体,使它支持L、S、回车3个按键事件;

  3) 注册input_dev结构体

  4) 硬件相关的操作,即设置USB数据传输3要素和urb结构体:

   ->4.1) 通过usb_rcvintpipe()创建一个接收中断类型的端点管道,用来端点和数据缓冲区之间的连接

   ->4.2) 通过usb_buffer_alloc()申请USB缓冲区

   ->4.3) 申请urb结构体,并利用usb_fill_int_urb()初始化,用来传输数据

   ->4.4) 因为我们2440支持DMA,所以要告诉urb结构体,使用DMA缓冲区地址

   ->4.5) 使用usb_submit_urb()提交urb.

--> 2.2 编写probe函数调用的鼠标中断函数

  1)判断缓存区数据是否改变,若改变,则通过input_event上传鼠标事件

  2)使用usb_submit_urb()提交urb

--> 2.3 usb_driver的disconnect函数中

  1) 通过usb_kill_urb()杀掉提交到内核中的urb

  2) 释放urb结构体

  3 )释放USB缓存区

  4)注销并释放input_device结构体

3. 出口函数通过usb_deregister ()函数注销usb_driver结构体

二、程序源码

复制代码

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 8 static struct input_dev *uk_dev; //input_dev 9 static char *usb_buf; //虚拟地址缓存区 10 static dma_addr_t usb_buf_phys; //DMA缓存区 11 static int len; //数据包长度 12 static struct urb *uk_urb; //urb数据传输所用结构体 13 14 static struct usb_device_id myusb_mouseid_table [] = { 15 { USB_INTERFACE_INFO( 16 USB_INTERFACE_CLASS_HID, //接口类:hid类 17 USB_INTERFACE_SUBCLASS_BOOT, //子类:启动设备类 18 USB_INTERFACE_PROTOCOL_MOUSE) }, // USB协议:鼠标协议 19 }; 20 21 static void myusb_mouseirq(struct urb *urb) 22 { 23 static unsigned char pre_val; 25 /* USB鼠标数据含义* data[0]: bit0-左键, 1-按下, 0-松开 26 * bit1-右键, 1-按下, 0-松开 27 * bit2-中键, 1-按下, 0-松开 29 */ 30 if ((pre_val & (1context结构成员中,用来给中断函数用,本节不需要,填NULL即可

interval:间隔时间,表示间隔多少时间读一次数据,填入endpoint-> bInterval即可

3.7 usb_submit_urb(uk_urb, GFP_KERNEL);

1 int usb_submit_urb(struct urb *urb,gfp_t mem_flags);

提交urb到内核,初始化urb和中断函数退出时,都要重新提交一次,告诉内核初始化内存缓存等.

三、测试

1. 在源码下去除原先的usb鼠标驱动,执行 make menuconfig

  --> Device Drivers       --> HID Devices          USB Human Interface Device (full HID) support

make uImage编译内核,并烧写,启动。

2. ubuntu环境下编译生成驱动模块:myusbmouse.ko

3. 开发板挂载ubuntu的/work/nfs_root/first_fs目录: # mount -t nfs -o nolock,vers=2 10.70.12.103:/work/nfs_root/ /mnt

4. 加载驱动:# insmod myusbmouse.ko

5. 插入USB鼠标,查看设备节点: ls /dev/event*

6.  cat /dev/tty1    点击鼠标按键

(注意:出现乱码,需要关掉QT,#vi /etc/init.d/rcs   屏蔽一行 #/bin/qpe.sh &)

执行命令 # exec 0



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3