1、驱动编写分析

(1)usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来。左边这一块已经帮我们做好了,我们要做的是右边这一块。我们要构造一个usb_driver结构体,然后注册进去。usb_driver结构体里面的id_table表示能够支持哪一些设备,里面的probe函数表示能够支持接入设备时会被调用。

(2)目的

USB鼠标用作键盘。左键按下时相当于字母L,右键按下时相当于字母S,鼠标中间的滑轮相当于回车。

(3)输入子系统

在probe函数里面做以下几件事情

  • 分配input_dev结构体
  • 设置它能产生按键类事件
  • 注册
  • 硬件相关的操作(对于usb鼠标来说,使用usb总线驱动程序提供的读写函数来收发数据)

(4)usb驱动程序编写

  • 分配/设置usb_driver结构体
  • .id_table

            .probe

            .disconnect
  • 注册

2、参考usbmouse.c驱动

(1)usb_driver结构体

(2)id_table

打开宏(match_flag是表示匹配(设备描述符)的哪一项)int是interface的简写,匹配接口的信息(接口描述符),只要接口描述符里面的接口的类是cl,子类是sc,协议是pr,就能够支持。只要USB设备的接口描述符里面的类是HID类,子类是BOOT,协议是MOUSE,就能够支持。

当然,我们还可以通过厂家ID和设备ID,来支持某一款设备,详见(4)

(3)接口描述符(代表逻辑设备)

(4)(id_table)想支持某一款设备,厂家ID和设备ID

下面可以自己设置厂家ID和设备ID

###################################################

##################################################3

(5)probe函数

参数usb_interface结构体,一个usb硬件设备有多个逻辑上的设备,逻辑上的设备使用usb_interface结构体表示的,

参考http://blog.csdn.net/qingkongyeyue/article/details/53363298

编译驱动程序

拷贝别的文件的Makefile,然后修改

用make命令进行编译

把生成的驱动程序拷贝到网络文件系统

使用新内核启动开发板(reboot命令重启)

挂接网络文件系统,安装驱动

接上usb鼠标(found usbmouse是在probe函数设置的)

想插入USB时把厂家ID和设备ID打印出来,因为厂家ID和设备ID都是在设备描述符里面的,当我们接入usb设备后,usb总线驱动程序把相关的描述符都读出来啦!我们只要用就可以啦!

在usb_device结构体里面有设备描述符,设备描述符里面就有厂家ID和设备ID、版本号。

卸载原来的驱动装载新驱动

编写驱动usbmouse_as_key.c(参考usbmouse.c)

转自:http://blog.csdn.net/qingkongyeyue/article/details/53384487

USB驱动程序之USB设备驱动程序1简单编写的更多相关文章

  1. Linux设备驱动程序学习----1.设备驱动程序简介

    设备驱动程序简介 更多内容请参考Linux设备驱动程序学习----目录 1. 简介   Linux系统的优点是,系统内部实现细节对所有人都是公开的.Linux内核由大量复杂的代码组成,设备驱动程序可以 ...

  2. 如何编写Linux设备驱动程序

    一.Linux device driver 的概念 系统调用是操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口.设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看 ...

  3. IIC设备驱动程序

    IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中.在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接 ...

  4. 【DSP开发】【Linux开发】IIC设备驱动程序

    IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中.在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接 ...

  5. linux设备驱动程序-i2c(0)-i2c设备驱动源码实现

    (基于4.14内核版本) 为了梳理清楚linux内核中的i2c实现框架,从本文开始,博主将分几个章节分别解析i2c总线在linux内核中的形成过程.匹配过程.以及设备驱动程序源码实现. 在介绍linu ...

  6. Linux设备驱动程序学习----目录

    目录 设备驱动程序简介 1.设备驱动程序简介 构造和运行模块 2.内核模块和应用程序的对比 3.模块编译和装载 4.模块的内核符号表  5.模块初始化和关闭  6.模块参数  7.用户空间编写驱动程序 ...

  7. USB系列之六:基于DOSUSB的简单U盘驱动程序

    首先要说明的是,该驱动程序仅实现了部分块设备的功能,如果作为成品软件使用,会感觉性能比较差,而且有些功能(比如FORMAT)是不能完成的,发表此驱动程序的目的旨在说明USB的编程原理以及DOS下驱动程 ...

  8. USB设备驱动程序1

    目的:USB鼠标用作按键,左键相当于字母L,右键相当于字母S,中键相当于Enter.如何来实现?用到输入子系统:1)分配input_dev2)设置3)注册4)硬件相关操作对于USB鼠标来说,硬件操作应 ...

  9. USB设备驱动程序学习笔记(一)

    现象:把USB设备接到PC1. 右下角弹出"发现android phone"2. 跳出一个对话框,提示你安装驱动程序 问1. 既然还没有"驱动程序",为何能知道 ...

  10. USB设备驱动程序(一)

    USB驱动编程原理: 当我们把USB设备插入USB口时会提示需要安装相对应的驱动,如USB鼠标.USB键盘等,这些电脑自己自身已经自带有相对于的驱动程序, 当电脑检查到该USB设备类型相同就去帮你安装 ...

随机推荐

  1. powershell -enc参数无法解码base64编码payload的解决方案

    powershell的-enc参数允许传入一个base64编码过的powershell脚本字符串作为参数来执行该powershell脚本,该方法常被用于绕过杀毒软件的主动防御机制. 今天下午在做一个后 ...

  2. 实现一个简单的lazyman

    function lazyman(name) { return new lazyman.fn.init(name); } lazyman.fn = lazyman.prototype = { cons ...

  3. c# 多线程调用窗体上的控件 示例

    private delegate void InvokeCallback(string msg); private void SetCountValue(string s) { if (this.fo ...

  4. Python程序员不完全指南

    Python 基础 Python基础 基础数据类型 深浅copy 文件操作 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 各种推导式 递归函数 内置函数和匿名函数 异常处理 常用模块 模块和包 ...

  5. MP3格式音频文件结构解析

    MP3的全称是MPEG Audio Layer3,它是一种高效的计算机音频编码方案,它以较大的压缩比将音频文件转换成较小的扩展名为.MP3的文件,基本保持原文件的音质.MP3是ISO/MPEG标准的一 ...

  6. Shell 命令行统计 apache 网站日志访问IP以及IP归属地

    Shell 命令行统计 apache 网站日志访问IP以及IP归属地 我的一个站点用 apache 服务跑着,积攒了很多的日志.我想用 shell 看看有哪些人访问过我的站点,并且他来自哪里. 因为日 ...

  7. Android Hook神器:XPosed入门与登陆劫持演示

    前段时间写了一篇关于Cydia Substrate广告注入的文章,大家都直呼过瘾.但是,真正了解这一方面的同学应该知道,其实还有一个比Cydia Substrate更出名的工具:XPosed. 不是因 ...

  8. Unity的 NavMeshObstacle 的使用详解

            这个组件放在场景中的导航网格上,可以阻挡NavMeshAgent的移动.以Unity4.3.4为例.         NavMeshObstacle 分为两种模式,一种是普通模式,通过 ...

  9. JPA无法删除对象【实际项目解决办法】

    并非通用, 根据自己实际情况来 不能删除前的dao方法 public void delete(CmsProjectNew bean); 可以删除后的dao方法 @Modifying @Query(&q ...

  10. 页面提交 string数组和list对象集合举例

    ajax表单提交   $.ajax({                 cache: true,                 type: "POST",             ...