Linux USB鼠标驱动程序笔记 A
关于这个驱动的源码,我看了几遍,每一次都有不同的感悟,只要自己本来就是菜鸟,慢慢领悟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相关推荐
- 自己写Linux Usb鼠标驱动程序
USB子系统相关内容参考<精通Linux设备驱动程序>第11章. USB鼠标驱动程序可以参考内核中的鼠标驱动,路径为linux-3.0.86\drivers\hid\usbhid\usbm ...
- Linux USB鼠标驱动程序详解
USB 总线引出两个重要的链表! 一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 ...
- Linux USB 鼠标驱动程序解析
USB 总线引出两个重要的链表! 一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 ...
- 编写USB鼠标驱动程序
编写USB鼠标驱动程序 文章目录 编写USB鼠标驱动程序 参考资料: 1. 目标 2. 编程 2.1 驱动框架 2.2 实现usb_driver 2.2.1 id_table 2.2.2 probe函 ...
- hdb interface驱动是什么_Linux USB 鼠标驱动程序详解
USB 总线引出两个重要的链表! 一个 USB 总线引出两个重要的链表,一个为 USB 设备链表,一个为 USB 驱动链表.设备链表包含各种系统中的 USB 设备以及这些设备的所有接口,驱动链表包含 ...
- linux usb 总线驱动程序,Linux下的USB总线驱动
一.USB理论 1. USB概念概述 USB1.0版本速度1.5Mbps(低速USB) USB1.1版本速度12Mbps(全速USB) USB2.0版本速度480Mbps(高速USB) U ...
- Linux USB鼠标驱动入门以及处理流程
1 需要 禁用掉 CONFIG_USB_HID,不然下面的驱动不会被探测. 2 下面的驱动模块代码只打印了鼠标左键是否被按下,左键没有被按下打印0,左键被按下打印1. 3 参考了这里 4 内核版本 4 ...
- USB协议与Windows USB设备驱动程序笔记
USB概述 USB主控制器负责数据处理,USB根集线器(ROOT HUB)提供一个连接USB主控制器与USB设备之间的接口和通路.USB集线器(USB HUB)可以对原有的USB端口在数量上进行扩展. ...
- usb鼠标驱动(一)
Linux USB 鼠标驱动程序详解 注册一个usb driver,这个drvier不是usb设备driver,而是接口driver. /* use a define to avoid include ...
最新文章
- Minkowski修剪
- mysql 大写 小写_Mysql大小写敏感的问题
- oralce之 10046对Hash Join分析
- Linux高级编程(四)
- [BZOJ] 1614: [Usaco2007 Jan]Telephone Lines架设电话线
- SpringMVC创建用户信息(一)
- 如何修改RubyOnRails中ActiveRecord默认的表格名和外键字段映射关系?
- 首次公开专利并且专利数量最多公司(2022.07.25-2022.7.31)
- 快速开发:普元EOS平台简介
- trados 有道api_塔多思翻译附插件下载-外语准确机翻工具插件(TRADOS)下载2019版-西西软件下载...
- html下划线无阴影效果,CSS | 实现下划线的N个姿势
- 看完必会的正则表达式和递归
- 中国移动--九天毕昇平台使用测试(薅Telsa V100)
- Java Web项目中使用Freemarker生成Word文档
- Python OpenCV:利用滚动条移动图片,利用鼠标缩放图片
- 最低2000多,中国房价最低的30城,你会选择吗?
- killall 命令使用
- SOPC教学笔记01——绪论
- Android AbsoluteLayout布局(绝对布局)
- 通达信交易接口api的基本定义