USB鼠标驱动框架结构



usb总线驱动程序:
1、识别设备,发出描述符请求
2、获得描述符
3、找到相应的驱动程序


usb总线在内核中的实际调用过程:
hub_irq()
->kick_khubd()
->wake_up(&khubd_wait)     //唤醒队列
**********************************************
  如果插入新usb设备会调用hub_irq,是其调用,使得event_bits改变,同时唤醒hub_thread进程,
然后执行hub_events,对Port状态进行种种检测后,在这个函数中检测到event_bits的改变,终于
执行hub_port_connect_change。如果在hub_events中未检测到变化,发现无事可做,执行空。退出
执行wait_event_freezble函数,该函数等待usb总线上的事件,如usb插入、拔出等。没有事件发生
则退出。
  这里的等待是等待【khubd_wait队列】满足【!list_empty(&hub_event_list) || kthread_should_stop()】
这个条件。而条件又是【hub_event_list队列】不为空。即,如果队列空,我就一直等,直到非空。
**********************************************
hub_thread
hub_events
hub_port_connect_change()
hub_port_init()
hub_set_address  //设置地址
usb_get_device_descriptor   //获取设备描述符
usb_new_device
usb_configure_device
usb_get_configuration  //将所有配置描述符读出 
  usb_parse_configuration   //解析描述符
device_add     //把device放入usb_bus_type的dev链表
      //从usb_bus_type的driver链表中取出usb_driver
      //把usb_interface和usb_driver的id_table比较
      //如果能匹配,调用driver的probe。
在linux内核中的bus_type有很多中,有IIC和PCI、USB总线等,其中都具有的是
一条总线挂设备,一条总线挂驱动。
        wait_event_freezable(khubd_wait,!list_empty(&hub_event_list) || kthread_should_stop())
        //使队列休眠


目的:USB鼠标用作按键;
左键  -》  L
右键  -》  S
中建  -》  Enter


1.分配input_dev
2.设置
3.注册 (思路:按键是注册中断,在中断程序中读取io   在触摸屏程序中设置adc控制器  这个程序通过usb总线驱动程


     序中的读写函数来实现)  以前是在ADC控制器中得到数据,而对于usb则要发usb包才能得到数据。
4.硬件操作    在probe函数不一样
  
怎么写usb驱动程序?
1.分配/配置usb_driver结构体
       .id_table
       .probe
       .disconnect
2.注册


实现过程中,对于linux3.4.2内核,在编译usb.ko过程中的Makefile时,要注意一定要将KERN_DIR = 


/work/system/linux-3.4.2对应的内核目录,因为开发板中的内核是3.4.2。


usbmouse.c函数分析:
static int usb_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id)
有传入参数参数usb_interface *intf,该类型定义为:
struct usb_interface {
/* array of alternate settings for this interface,
* stored in no particular order */
struct usb_host_interface *altsetting;


struct usb_host_interface *cur_altsetting; /* the currently
* active alternate setting */
unsigned num_altsetting; /* number of alternate settings */
        ....
}
  函数中将interface = intf->cur_altsetting;其中struct usb_host_interface *interface;
另外:
struct usb_host_interface {
struct usb_interface_descriptor desc;


/* array of desc.bNumEndpoint endpoints associated with this
* interface setting.  these will be in no particular order.
*/
struct usb_host_endpoint *endpoint;


char *string; /* iInterface string, if present */
unsigned char *extra;   /* Extra descriptors */
int extralen;
};
  函数中将if (interface->desc.bNumEndpoints != 1)   //如果该接口的端点除了端点0外的个数不是1 ,返回错误
return -ENODEV;                    
          endpoint = &interface->endpoint[0].desc;  //把端点0外的描述赋给endpoint
   if (!usb_endpoint_is_int_in(endpoint))    //如果端点不是输入型的端点,则返回错误。
return -ENODEV;


linux3.4.2鼠标驱动实验打印数值:
data cnt 66401 01 00 00 00 00 00   //鼠标左键usb_buf[0]的bit0
data cnt 66501 00 00 00 00 00 00 
data cnt 66601 01 00 00 00 00 00 
data cnt 66701 00 00 00 00 00 00 


data cnt 66801 02 00 00 00 00 00   //鼠标右键usb_buf[0]的bit1
data cnt 66901 00 00 00 00 00 00 
data cnt 67001 02 00 00 00 00 00 
data cnt 67101 00 00 00 00 00 00 




data cnt 67501 00 ff 0f 00 00 00   //鼠标左移
data cnt 67601 00 ff 0f 00 00 00  
data cnt 68601 00 00 00 00 00 00 


data cnt 68701 00 01 00 00 00 00   //鼠标右移
data cnt 68801 00 01 00 00 00 00 
data cnt 68901 00 01 00 00 00 00 
data cnt 69201 00 00 00 00 00 00 


data cnt 69501 00 00 f0 ff 00 00   //鼠标上移
data cnt 69601 00 00 f0 ff 00 00 
data cnt 69701 00 00 f0 ff 00 00 
data cnt 70301 00 00 00 00 00 00 


data cnt 70401 00 00 10 00 00 00   //鼠标下移 
data cnt 70501 00 00 10 00 00 00 
data cnt 70601 00 00 10 00 00 00 
data cnt 70701 00 00 10 00 00 00 


data cnt 234501 00 00 00 00 ff 00   //滚轮下移
data cnt 234601 00 00 00 00 ff 00 
data cnt 234701 00 00 00 00 ff 00 
data cnt 234801 00 00 00 00 ff 00 


data cnt 235001 00 00 00 00 01 00   //滚轮上移 
data cnt 235101 00 00 00 00 01 00 
data cnt 235201 00 00 00 00 01 00 
data cnt 235301 00 00 00 00 01 00 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值