注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小白的博客

嵌入式爱好者

 
 
 

日志

 
 

USB驱动程序  

2012-09-19 00:36:04|  分类: 韦东山视频第二轮 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/usb/input.h>
#include <linux/hid.h>
#include <linux/usb.h>

static char *usb_buff;
static int len;
static struct input_dev *usb_input_dev;
static dma_addr_t dma_usb_buff;
static struct urb *uk_urb;


static void usb_mouse_as_key(struct urb *urb)
{
#if 0
int i;
static int cnt = 0;
printk("data cnt %d: ",++cnt);
for(i = 0; i<len ; i++)
{
printk("%02x ",usb_buff[i]);
}
printk("\n");
#endif
static unsigned char pre_val;

if((pre_val & (1<<0)) != (usb_buff[0] & (1<<0)))
{
input_event(usb_input_dev , EV_KEY , KEY_L , usb_buff[0] & (1<<0));
input_sync(usb_input_dev);
}

if((pre_val & (1<<1)) != (usb_buff[0] & (1<<1)))
{
input_event(usb_input_dev , EV_KEY , KEY_S, usb_buff[0] & (1<<1));
input_sync(usb_input_dev);
}

if((pre_val & (1<<2)) != (usb_buff[0] & (1<<2)))
{
input_event(usb_input_dev , EV_KEY , KEY_ENTER, usb_buff[0] & (1<<2));
input_sync(usb_input_dev);
}
pre_val = usb_buff[0];

usb_submit_urb(uk_urb, GFP_KERNEL);
}

static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
int pipe;
struct usb_device *usb_dev = interface_to_usbdev(intf);
struct usb_endpoint_descriptor *endpoint;
struct usb_host_interface *interface;

interface = intf->cur_altsetting;
endpoint = &interface->endpoint[0].desc;

usb_input_dev = input_allocate_device();
set_bit(EV_KEY , usb_input_dev->evbit);
set_bit(EV_REP , usb_input_dev->evbit);

set_bit(KEY_L     , usb_input_dev->keybit);
set_bit(KEY_S     , usb_input_dev->keybit);
set_bit(KEY_ENTER , usb_input_dev->keybit);

input_register_device(usb_input_dev);

pipe = usb_rcvintpipe(usb_dev ,endpoint->bEndpointAddress);
len = endpoint->wMaxPacketSize;
usb_buff = usb_alloc_coherent(usb_dev ,len , GFP_ATOMIC , &dma_usb_buff);

uk_urb = usb_alloc_urb(0 , GFP_KERNEL);
usb_fill_int_urb(uk_urb , usb_dev , pipe, usb_buff , len , usb_mouse_as_key , NULL ,endpoint->bInterval);
uk_urb->transfer_dma = dma_usb_buff;
uk_urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;

usb_submit_urb(uk_urb , GFP_KERNEL);
return 0;
}

static void usb_mouse_disconnect(struct usb_interface *intf)
{
struct usb_device *dev = interface_to_usbdev(intf);
usb_kill_urb(uk_urb);
usb_free_urb(uk_urb);
usb_free_coherent(dev, len, usb_buff, dma_usb_buff);
input_unregister_device(usb_input_dev);
input_free_device(usb_input_dev);
}

static struct usb_device_id usb_mouse_id_table [] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_MOUSE) },
{ }
};

static struct usb_driver usb_mouse_drv = {
.name       =   "usb_mouse",
.probe      =   usb_mouse_probe,
.disconnect =   usb_mouse_disconnect,
.id_table   =   usb_mouse_id_table,
};

static int usb_key_init(void)
{
usb_register(&usb_mouse_drv);

return 0;
}

static void usb_key_exit(void)
{
usb_deregister(&usb_mouse_drv);
}

module_init(usb_key_init);
module_exit(usb_key_exit);
MODULE_LICENSE("GPL");

编程思想:
在probe函数里面分配请求块,设置请求块的源、目的、长度,然后提交请求块!
  评论这张
 
阅读(691)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017