USB设备驱动程序(一)

发布者:AngelicWhisper最新更新时间:2024-07-18 来源: cnblogs关键字:USB设备  驱动程序 手机看文章 扫描二维码
随时随地手机看文章

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总线驱动程序的作用

1. 识别USB设备

1.1 分配地址

1.2 并告诉USB设备(set address)

1.3 发出命令获取描述符

描述符的信息可以在includelinuxusbCh9.h看到



2. 查找并安装对应的设备驱动程序


3. 提供USB读写函数


把USB设备接到开发板上,看输出信息:

usb 1-1: new full speed USB device using s3c2410-ohci and address 2

usb 1-1: configuration #1 chosen from 1 choice

scsi0 : SCSI emulation for USB Mass Storage devices

scsi 0:0:0:0: Direct-Access     HTC      Android Phone    0100 PQ: 0 ANSI: 2

sd 0:0:0:0: [sda] Attached SCSI removable disk

拔掉

usb 1-1: USB disconnect, address 2


再接上:

usb 1-1: new full speed USB device using s3c2410-ohci and address 3

usb 1-1: configuration #1 chosen from 1 choice

scsi1 : SCSI emulation for USB Mass Storage devices

scsi 1:0:0:0: Direct-Access     HTC      Android Phone    0100 PQ: 0 ANSI: 2

sd 1:0:0:0: [sda] Attached SCSI removable disk


在内核目录下搜:

grep 'USB device using' * -nR

drivers/usb/core/hub.c:2186:              '%s %s speed %sUSB device using %s and address %dn',


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, 8); // 获取设备描述符

                        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

                            


怎么写USB设备驱动程序?

1. 分配/设置usb_driver结构体

        .id_table

        .probe

        .disconnect

2. 注册


测试1th/2th:

1. make menuconfig去掉原来的USB鼠标驱动

-> Device Drivers 

  -> HID Devices

  <> USB Human Interface Device (full HID) support 


2. make uImage 并使用新的内核启动


3. insmod usbmouse_as_key.ko

4. 在开发板上接入、拔出USB鼠标


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


/*

 * drivershidusbhidusbmouse.c

 */


#include

#include

#include

#include

#include

#include


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 0;

}


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 0;

}


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设备驱动程序(一)

上一篇:LCD驱动程序(二)
下一篇:USB设备驱动程序(二)

推荐阅读最新更新时间:2024-11-08 11:52

MCU + USB设备控制器IP核的设计
   1 引言   在传统的计算机系统上常采用串口(如RS232)和并口连接外围设备,但串口和并口都存在着通信速度 慢,接口独占不利于扩展等无法克服的缺点,而通用串行总线(Universal Serial Bus,即USB)因具有传输 速度快、支持热插拔、扩展方便、抗干扰强、成本低、数据传输质量高、节省系统资源等优点而得到了广 泛的应用,当前它已成为计算机最常用的接口之一 。   现在USB控制器主要有两种:带USB接口的单片机(MCU)和纯粹的USB接口芯片。纯粹的USB接口芯片仅处 理USB通信,必须有个外部微处理器来进行协议处理和数据交换。典型产品有PHILIPS公司的PDIUSBD11(I2C 接口)、PDIUSB
[嵌入式]
温湿度传感器DHT11的驱动程序
#include typedef.h #include msp430g2553.h #include TemDHT11.h #ifndef _DHT11_TYPE #define _DHT11_TYPE //连接端口 #define DHT11_Dir P2DIR #define DHT11_In P2IN #define DHT11_Out P2OUT #define DHT11_Bit BIT4 #endif //8bit湿度+8bit湿度小数点 //8bit温度+8bit温度小数点 //数据位为0是高电平26~28us | 1高电平70us u8 DHT11_Data = {0}; //从DHT11中读
[单片机]
基于Small RTOS51的PS/2键盘驱动程序开发
引言   随着嵌入式系统的发展,嵌入式软件设计向软件平台靠近,单片机软件设计不再是单一线程结构方式,而是逐步采用多任务的设计思想。实时操作系统使得实时应用程序的设计、扩展和维护变得更容易,无需大的改动就可以增加新的功能。然而随着任务的增加,要求输入的数据也会增加,类型也呈多样化。如果仍然用矩阵式扫描键盘,势必浪费单片机巨大的资源,且增加了成本。若用PC机标准PS/2键盘取而代之,将可解决以上矛盾。本文介绍基于实时操作系统Small RTOS51的PS/2键盘驱动程序的设计,具有响应快,移植性强,占用资源少等优点。 1 驱动的设计   驱动的实现一般可用以下几种方法:① 使用任务编写;② 使用消息编写;③ 使用信号量编写。PS/
[嵌入式]
LCD显示模块并行接口驱动程序设计
  引 言   人们在日常生活中,LCD占有很大的地位。人们使用的电脑、手机、车载系统、各种测量设备、显示设备等等,都把LCD作为重要的人机接口,它把使用者需要的信息及时反应出来。目前市场上存在着各种LCD和相对应的驱动模块,驱动模块所带的驱动程序都是针对本身模块开发的,各种驱动程序之间通用性差,而且在不同的平台上很难移植。每换一种LCD产品,都要根据它的驱动模块重写驱动程序。这样产品开发资源浪费,开发周期长,成本增加。本文将介绍一种LCD图形液晶驱动器的使用方法以及程序裁剪、移植和扩展,实现在任意坐标上显示图形和汉字。这款驱动器不带字库,对需要显示的汉字和字母通过字模产生器产生数据,通过程序设计把字体在LCD通过描点描述出来(本文
[嵌入式]
基于MCP2515的多路CAN总线接口及驱动程序设计
    引言     在铁路系统中,为了保证列车的安全运行,需要对铁轨及周围状况进行实时检测。目前采用的方法是在铁路沿线安装多个检测设备,用于检测洪水、大风、泥石流等自然灾害及轨温等参数。这些设备一般采用的通信方式是RS232、RS485或CAN,并通过专线连接至监控中心的各个监控设备。这种方式极大浪费了线路资源,也不易于设备的统一管理。因此,需要一种安装在铁路沿线的设备,它将附近的检测设备发送的信息统一收集并通过一条专线直接送往监控中心。为了与多个检测设备通信,必须同时具有多个RS232、RS485和CAN接口。基于这种应用需要,本文提出了扩展多个CAN总线接口的方法。    1  系统结构   1.1  芯片介绍系
[嵌入式]
mcu-stc12c5404ad单片机直流无刷电机驱动程序
//*****************************************************//* ***无刷电机控制器程序*** *//*===================================================* //* MCU-STC12C5404... //***************************************************** //* ***无刷电机控制器程序*** * //*===================================================* //* mcu-stc12c5404ad 8路ad转换,4
[单片机]
8155驱动程序的设计
  8155驱动程序主要是涉及对端口PA、PB、PC、控制字以及定时器的设置,主要包括以下代码及函数。   (1)相关函数声明及管脚定义。   管脚定义主要是指端口PA、端口PB、端口PC、控制字以及定时器A、B和存储器首地址和相关标志位的定义;函数的声明涉及存储器及端口PA、端口PB、端口PC的读写函数、中断的开关函数和定时器相关函数,具体代码如下:   (2)读写外RAM函数。   读写外RAM函数对外部存储器指定单元数据进行读写,程序代码如下:   (3)端口PA、端口PB以及端口PC的读写设置函数。   端口PA、端口PB以及端口PC的读写设置函数主要完成对8155端口的输入输出设置及数据读写,程序代码如下
[单片机]
8155<font color='red'>驱动程序</font>的设计
完整的FM收音机模块驱动程序(包含M62429电子调音程序)
/****************wang1jin设计的FM发射板程序************************ 电路结构:STC12C2052+M62429+BH1415+9018+3355+2053 LCD1602显示,电子音量 完成时间:2007年11月初 程序编写:sunhm ***************************************************************/ #include STC89C51RC_RD_PLUS.H #include intrins.h #define uchar unsigned char #define uint unsigned int
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved