关于这个驱动的源码,我看了几遍,每一次都有不同的感悟,只要自己本来就是菜鸟,慢慢领悟linux中包含的智慧...

本来一开始看的一本书,叫《Linux那些事》,但是太长了,实在看不下去,索性就自己找到这个鼠标的源码,自己研究得了。看完之后对驱动的整个框架有了了解,贴到这里,我在里面可能很多时候提到USB鼠标驱动来说事...(到目前为止,我就看了这个  ) 希望大神指点!

驱动一般分为两部分,一部分跟所在的总线有关,鼠标作为USB总线上的一个device,需要实现usb_device这个结构体,然后挂到USB总线上去;然后另外一部分就是设备本身的功能,可以分为3类:char、block、网络设备(我对网络设备一点不懂,略过),所以需要实现这一类设备的结构体,到了鼠标这里就是input_device了,然后挂载到input core上面;还有一点,每个设备都会有自己的一个结构体,这里就是usb_mouse

struct usb_mouse {char name[128];char phys[64];struct usb_device *usbdev;struct input_dev *dev;struct urb *irq;signed char *data;dma_addr_t data_dma;
};

但是这个结构体没有现成的core可以挂,所以linux内核中提供了私有结构体的指针,这里就是input_device和device:


struct input_dev {const char *name;const char *phys;const char *uniq;struct input_id id;unsigned long evbit[BITS_TO_LONGS(EV_CNT)];unsigned long keybit[BITS_TO_LONGS(KEY_CNT)];unsigned long relbit[BITS_TO_LONGS(REL_CNT)];unsigned long absbit[BITS_TO_LONGS(ABS_CNT)];unsigned long mscbit[BITS_TO_LONGS(MSC_CNT)];unsigned long ledbit[BITS_TO_LONGS(LED_CNT)];unsigned long sndbit[BITS_TO_LONGS(SND_CNT)];unsigned long ffbit[BITS_TO_LONGS(FF_CNT)];unsigned long swbit[BITS_TO_LONGS(SW_CNT)];unsigned int keycodemax;unsigned int keycodesize;void *keycode;int (*setkeycode)(struct input_dev *dev,unsigned int scancode, unsigned int keycode);int (*getkeycode)(struct input_dev *dev,unsigned int scancode, unsigned int *keycode);struct ff_device *ff;unsigned int repeat_key;struct timer_list timer;int sync;int abs[ABS_MAX + 1];int rep[REP_MAX + 1];unsigned long key[BITS_TO_LONGS(KEY_CNT)];unsigned long led[BITS_TO_LONGS(LED_CNT)];unsigned long snd[BITS_TO_LONGS(SND_CNT)];unsigned long sw[BITS_TO_LONGS(SW_CNT)];int absmax[ABS_MAX + 1];int absmin[ABS_MAX + 1];int absfuzz[ABS_MAX + 1];int absflat[ABS_MAX + 1];int absres[ABS_MAX + 1];int (*open)(struct input_dev *dev);void (*close)(struct input_dev *dev);int (*flush)(struct input_dev *dev, struct file *file);int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);struct input_handle *grab;spinlock_t event_lock;struct mutex mutex;unsigned int users;bool going_away;struct device dev;          //重点在这里!!!struct list_head h_list;struct list_head node;
};
然后就是device的结构体定义


struct device {struct device       *parent;struct device_private   *p;        //HERE!!此处指向usb_mousestruct kobject kobj;const char        *init_name; /* initial name of the device */struct device_type  *type;struct semaphore  sem;    /* semaphore to synchronize calls to* its driver.*/struct bus_type  *bus;       /* type of bus device is on */struct device_driver *driver; /* which driver has allocated thisdevice */void     *platform_data; /* Platform specific data, devicecore doesn't touch it */struct dev_pm_info    power;#ifdef CONFIG_NUMAint     numa_node;  /* NUMA node this device is close to */
#endifu64       *dma_mask;  /* dma mask (if dma'able device) */u64     coherent_dma_mask;/* Like dma_mask, but foralloc_coherent mappings asnot all hardware supports64 bit addresses for consistentallocations such descriptors. */struct device_dma_parameters *dma_parms;struct list_head   dma_pools;  /* dma pools (if dma'ble) */struct dma_coherent_mem    *dma_mem; /* internal for coherent memoverride *//* arch specific additions */struct dev_archdata   archdata;dev_t          devt;   /* dev_t, creates the sysfs "dev" */spinlock_t        devres_lock;struct list_head    devres_head;struct klist_node   knode_class;struct class        *class;const struct attribute_group **groups;   /* optional groups */void   (*release)(struct device *dev);
};
一环扣一环,最后的最后,原来device是幕后老大!!然后就是一系列的probe初始化,初始化这三个结构体自身的属性,以及之间的关联...先写到这里吧,有空再续,最重要的urb还没有完全看懂...



												

Linux USB鼠标驱动程序笔记 A相关推荐

  1. 自己写Linux Usb鼠标驱动程序

    USB子系统相关内容参考<精通Linux设备驱动程序>第11章. USB鼠标驱动程序可以参考内核中的鼠标驱动,路径为linux-3.0.86\drivers\hid\usbhid\usbm ...

  2. Linux USB鼠标驱动程序详解

    USB 总线引出两个重要的链表! 一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 ...

  3. Linux USB 鼠标驱动程序解析

    USB 总线引出两个重要的链表! 一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 ...

  4. 编写USB鼠标驱动程序

    编写USB鼠标驱动程序 文章目录 编写USB鼠标驱动程序 参考资料: 1. 目标 2. 编程 2.1 驱动框架 2.2 实现usb_driver 2.2.1 id_table 2.2.2 probe函 ...

  5. hdb interface驱动是什么_Linux USB 鼠标驱动程序详解

    USB 总线引出两个重要的链表! 一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 ...

  6. linux usb 总线驱动程序,Linux下的USB总线驱动

    一.USB理论 1.      USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB)  USB2.0版本速度480Mbps(高速USB) U ...

  7. Linux USB鼠标驱动入门以及处理流程

    1 需要 禁用掉 CONFIG_USB_HID,不然下面的驱动不会被探测. 2 下面的驱动模块代码只打印了鼠标左键是否被按下,左键没有被按下打印0,左键被按下打印1. 3 参考了这里 4 内核版本 4 ...

  8. USB协议与Windows USB设备驱动程序笔记

    USB概述 USB主控制器负责数据处理,USB根集线器(ROOT HUB)提供一个连接USB主控制器与USB设备之间的接口和通路.USB集线器(USB HUB)可以对原有的USB端口在数量上进行扩展. ...

  9. usb鼠标驱动(一)

    Linux USB 鼠标驱动程序详解 注册一个usb driver,这个drvier不是usb设备driver,而是接口driver. /* use a define to avoid include ...

最新文章

  1. Minkowski修剪
  2. mysql 大写 小写_Mysql大小写敏感的问题
  3. oralce之 10046对Hash Join分析
  4. Linux高级编程(四)
  5. [BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线
  6. SpringMVC创建用户信息(一)
  7. 如何修改RubyOnRails中ActiveRecord默认的表格名和外键字段映射关系?
  8. 首次公开专利并且专利数量最多公司(2022.07.25-2022.7.31)
  9. 快速开发:普元EOS平台简介
  10. trados 有道api_塔多思翻译附插件下载-外语准确机翻工具插件(TRADOS)下载2019版-西西软件下载...
  11. html下划线无阴影效果,CSS | 实现下划线的N个姿势
  12. 看完必会的正则表达式和递归
  13. 中国移动--九天毕昇平台使用测试(薅Telsa V100)
  14. Java Web项目中使用Freemarker生成Word文档
  15. Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片
  16. 最低2000多,中国房价最低的30城,你会选择吗?
  17. killall 命令使用
  18. SOPC教学笔记01——绪论
  19. Android AbsoluteLayout布局(绝对布局)
  20. 通达信交易接口api的基本定义

热门文章

  1. SQL SERVER LEAD和LAG函数
  2. python 对数坐标_python3绘制股票K线图--pyQtgraph绘制精美股票K线图--之对数坐标(log Y)呈现...
  3. 【FPS】处理视频时帧率计算及显示
  4. 数据挖掘的十八般武艺,咳咳,十八个重要算法
  5. 博图SCL编程——提升代码界面的美观性和易读性
  6. 大学生在校是做兼职好还是做副业好
  7. qcustomplot使用教程--基本绘图
  8. 自媒体账号数据分析从何入手?
  9. 记一次尴尬的中期答辩
  10. FPGA 之 时钟,时钟域, 以及复位系统的设计