USB驱动编程原理:

当我们把USB设备插入USB口时会提示需要安装相对应的驱动,如USB鼠标、USB键盘等,这些电脑自己自身已经自带有相对于的驱动程序,

当电脑检查到该USB设备类型相同就去帮你安装相对于驱动,但有些由于系统没有自带有相对于的USB驱动程序,需要联网或者厂家资料自带有

就需要手动安装驱动,如USB转串口驱动,搞开发搭建前期时需要安装一大推驱动程序开可以进行开发。

USB驱动开发依据主从关系的:也就是把USB口这一端作为主设备,也即开发板,USB设备作为从设备,主设备上具备有一个USB控制器来进行设置,

USB驱动开发遵循USB_Bus_Type模式,但有点特别的是,总线(总线驱动程序,虚拟的总线)一端注册一个设备不需要你编写程序,内核已经帮你写好了,只关注驱动一端程序的编写

我们做一个USB鼠标实验,实现输入左键为L字母,右键为S字母,中建为Enter按键,符合输入子系统,该按键驱动在probe函数里编写

既然符合输入子设备类型,则编写驱动程序思路大概如下:

1、分配一个input_dev结构体

2、配置这个结构体

3、注册它

4、硬件相关的操作

USB驱动程序编写框架:

APP

----------------------------------------------------------------------------------------------------------

内核:                       USB设备驱动(了解数据含义)

--------------------------------------------------------

USB总线驱动程序

-----------------------------------------------------------------------------------------------------------

硬件:                       USB主机控制器

---------------------------------------------------------

USB设备

USB总线驱动程序需要做的事情:

1、识别设备

2、找到相对于的设备驱动程序

3、提供USB读写函数(不了解数据含义)

USB总线驱动程序的作用
. 识别USB设备
1.1 分配地址
1.2 并告诉USB设备(set address)
1.3 发出命令获取描述符
描述符的信息可以在include\linux\usb\Ch9.h看到 . 查找并安装对应的设备驱动程序 . 提供USB读写函数 把USB设备接到开发板上,看输出信息:
usb -: new full speed USB device using s3c2410-ohci and address
usb -: configuration # chosen from choice
scsi0 : SCSI emulation for USB Mass Storage devices
scsi :::: Direct-Access HTC Android Phone PQ: ANSI:
sd :::: [sda] Attached SCSI removable disk
拔掉
usb -: USB disconnect, address 再接上:
usb -: new full speed USB device using s3c2410-ohci and address
usb -: configuration # chosen from choice
scsi1 : SCSI emulation for USB Mass Storage devices
scsi :::: Direct-Access HTC Android Phone PQ: ANSI:
sd :::: [sda] Attached SCSI removable disk 在内核目录下搜:
grep "USB device using" * -nR
drivers/usb/core/hub.c:: "%s %s speed %sUSB device using %s and address %d\n", hub_irq
kick_khubd
hub_thread
hub_events
hub_port_connect_change udev = usb_alloc_dev(hdev, hdev->bus, port1);
dev->dev.bus = &usb_bus_type; choose_address(udev); // 给新设备分配编号(地址) hub_port_init // usb 1-1: new full speed USB device using s3c2410-ohci and address 3 hub_set_address // 把编号(地址)告诉USB设备 usb_get_device_descriptor(udev, ); // 获取设备描述符
retval = usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE); usb_new_device(udev)
err = usb_get_configuration(udev); // 把所有的描述符都读出来,并解析
usb_parse_configuration device_add // 把device放入usb_bus_type的dev链表,
// 从usb_bus_type的driver链表里取出usb_driver,
// 把usb_interface和usb_driver的id_table比较
// 如果能匹配,调用usb_driver的probe <LINUX内核源代码情景分析> 怎么写USB设备驱动程序?
. 分配/设置usb_driver结构体
.id_table
.probe
.disconnect
. 注册 测试1th/2th:
. make menuconfig去掉原来的USB鼠标驱动
-> Device Drivers
-> HID Devices
<> USB Human Interface Device (full HID) support . make uImage 并使用新的内核启动 . insmod usbmouse_as_key.ko
. 在开发板上接入、拔出USB鼠标

具体参考代码如下:该函数主要实现了识别USB设备,probe只是打印了一些信息

/*
* drivers\hid\usbhid\usbmouse.c
*/ #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> static struct usb_device_id usbmouse_as_key_id_table [] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID, USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_MOUSE) },
//{USB_DEVICE(0x1234,0x5678)},
{ } /* Terminating entry */
}; static int usbmouse_as_key_probe(struct usb_interface *intf, const struct usb_device_id *id)
{
printk("found usbmouse!\n");
return ;
} static void usbmouse_as_key_disconnect(struct usb_interface *intf)
{
printk("disconnect usbmouse!\n");
} /* 1. 分配/设置usb_driver */
static struct usb_driver usbmouse_as_key_driver = {
.name = "usbmouse_as_key_",
.probe = usbmouse_as_key_probe,
.disconnect = usbmouse_as_key_disconnect,
.id_table = usbmouse_as_key_id_table,
}; static int usbmouse_as_key_init(void)
{
/* 2. 注册 */
usb_register(&usbmouse_as_key_driver);
return ;
} static void usbmouse_as_key_exit(void)
{
usb_deregister(&usbmouse_as_key_driver);
} module_init(usbmouse_as_key_init);
module_exit(usbmouse_as_key_exit); MODULE_LICENSE("GPL");

Makefile:

KERN_DIR = /work/system/linux-2.6.22.6

all:
make -C $(KERN_DIR) M=`pwd` modules clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order obj-m += usbmouse_as_key.o

下章:USB设备驱动程序(二)

USB设备驱动程序(一)的更多相关文章

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

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

  2. 12、USB设备驱动程序

    linux-3.4.2\driver\hid\usbhid\usbmouse.c 内核只带USB驱动程序 (hub和usb是两个不同的设备,hub在内核上电的过程中在usb_hub_init函数中调用 ...

  3. USB设备驱动程序1

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

  4. EDK II之USB设备驱动程序的加载与运行

    本文简单介绍一下USB设备的驱动程序是如何匹配设备以及被加载的: 上文(UDK中USB总线驱动的实现框架)提到USB总线枚举设备的最后一步是调用gBS->ConnectController()去 ...

  5. USB驱动程序之USB设备驱动程序1简单编写

    1.驱动编写分析 (1)usb总线驱动程序在我们接入USB设备的时候会帮我们构造一个新的usb_device.注册到总线里面来.左边这一块已经帮我们做好了,我们要做的是右边这一块.我们要构造一个usb ...

  6. USB驱动程序之USB设备驱动程序2鼠标用作键盘学习笔记

    1.usbmouse.c (1)probe函数 在这个probe函数后判断是不是一个鼠标,先得到usb_host_interface结构体,除了端点0外,端点个数如果不是1,返回错误,表示不是自己能支 ...

  7. USB设备驱动程序(二)

    首先我们来看USB设备描述符的结构: 在USB总线识别设备阶段就将USB描述符发送给了USB总线驱动程序,设备的数据传输对象是端点,端点0是特殊端点,在USB总线驱动程序识别阶段, 会分配一个地址给U ...

  8. USB设备驱动程序学习笔记(二)

    一.usbmouse_as_key.c /* * drivers\hid\usbhid\usbmouse.c */ #include <linux/kernel.h>#include &l ...

  9. usb设备驱动程序

    韦老师写的,供参考 /*  * drivers\hid\usbhid\usbmouse.c  */ #include <linux/kernel.h> #include <linux ...

随机推荐

  1. mac如何挂载移动硬盘、存储设备、U盘

    默认情况下Mac OSX对NTFS磁盘的挂载方式是只读(read-only)的,如何实现读写: 1.借助第三方软件:比如免费版的Mounty 2.因为OSX原生就是支持NTFS的,但是后来由于微软的限 ...

  2. JSON-JSON 百科

    1,百度百科 http://baike.baidu.com/view/136475.htm?fr=aladdin 2,JSON教程 http://www.w3school.com.cn/json/

  3. C++中virtual(虚函数)的用法

    在面向对象的C++语言中,虚函数(virtual function)是一个非常重要的概念. 什么是虚函数: 虚函数是指一个类中你希望重载的成员函数 ,当你用一个  基类指针或引用   指向一个继承类对 ...

  4. tensorflow cnn+rnn基本结构

    #CNN x = tf.placeholder(tf.float32,[None,input_node],name="x_input") y_ = tf.placeholder(t ...

  5. Bean的作用域scope

    Bean的作用域scope 1.singleton 单例,指一个bean容器中只存在一份 2.prototype 每次请求(每次使用)创建新的实例,destroy方式不生效 3.request 每次h ...

  6. ASP.NET MVC学习---(六)CRUD例子补充

    在之前,我们使用mvc做了一个crud的小例子 整个项目过程应该是能够很容易理解的 通过这个例子我们可以大概的了解mvc的基本使用方法 但是由于篇幅限制(还不如说自己懒不想写那么长...) 没有能够在 ...

  7. Python - 连续替换(replace)的正則表達式(re)

    字符串连续替换, 能够连续使用replace, 也能够使用正則表達式. 正則表達式, 通过字典的样式, key为待替换, value为替换成, 进行一次替换就可以. 代码 # -*- coding: ...

  8. ImageSwitcher (图像切换器,显示图片)

    ImageSwitcher继承了ViewSwitcher,主要在切换图片时加入动画效果 使用方法: 1.为ImageSwitcher提供一个ViewFactory,该ViewFactory生成的Vie ...

  9. go语言25个关键字总结

    var和const :变量和常量的声明var varName type 或者 varName : = valuepackage and import: 导入func: 用于定义函数和方法return ...

  10. django项目搭建

    参见https://www.imooc.com/video/13931 1.安装python,从官网python.org下载msi安装2.7,安装完后,输入python可以看到版本 2.djangop ...