linux下usb驱动开发之usb光谱仪驱动

DS小龙哥 DS小龙哥     2022-12-01     226

关键词:

30.1 USB简介​

30.1.1 什么是USB?​

USB是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,USB就是简写,中文叫通用串行总线。最早出现在1995年,伴随着奔腾机发展而来。自微软在Windows 98中加入对USB接口的支持后,USB接口才推广开来,USB设备也日渐增多,如数码相机、摄像头、扫描仪、游戏杆、打印机、键盘、鼠标等等,其中应用最广的就是摄像头和U盘了。

USB包括老旧的USB 1.1标准和时下正流行的USB 2.0标准。传统的USB 1.1最高传输速率为12Mbps,一般厂商将其符合USB 1.1标准的产品称为“全速USB”。而高速USB 2.0最初推出时最高传输速率仅为240Mbps,后来USB2.0推广组(USB Promoter Group)在1999年10月将该速率提高到480Mbps,比传统的USB 1.1快40倍。

USB2.0向下兼容USB 1.1,当然USB1.1设备也“向上兼容”USB 2.0,但是无法实现USB2.0的传输能力,并自动以低速传输。USB 2.0连接线的最大长度为5米,但如果用五个USB适配器,则最大长度可达30米。

最新一代是USB 3.1,传输速度为10Gbit/s,三段式电压5V/12V/20V,最大供电100W ,新型Type C插型不再分正反。

Linux下USB驱动开发之USB光谱仪驱动_描述符


Linux下USB驱动开发之USB光谱仪驱动_描述符_02


USB采用四线电缆,其中两根是用来传送数据的串行通道,另两根为下游(Downstream)设备提供电源,对于高速且需要高带宽的外设,USB以全速12Mbps的传输数据;对于低速外设,USB则以1.5Mbps的传输速率来传输数据。USB总线会根据外设情况在两种传输模式中自动地动态转换。USB是基于令牌的总线。类似于令牌环网络或FDDI基于令牌的总线。USB主控制器广播令牌,总线上设备检测令牌中的地址是否与自身相符,通过接收或发送数据给主机来响应。USB通过支持悬挂/恢复操作来管理USB总线电源。USB系统采用级联星型拓扑,该拓扑由三个基本部分组成:主机(Host),集线器(Hub)和功能设备。

主机,也称为根,根结或根Hub,它做在主板上或作为适配卡安装在计算机上,主机包含有主控制器和根集线器(Root Hub),控制着USB总线上的数据和控制信息的流动,每个USB系统只能有一个根集线器,它连接在主控制器上。

集线器是USB结构中的特定成分,它提供叫做端口(Port)的点将设备连接到USB总线上,同时检测连接在总线上的设备,并为这些设备提供电源管理,负责总线的故障检测和恢复。集线可为总线提供能源,亦可为自身提供能源(从外部得到电源),自身提供能源的设备可插入总线提供能源的集线器中,但总线提供能源的设备不能插入自身提供能源的集线器或支持超过四个的下游端口中,如总线提供能源设备的需要超过100mA电源时,不能同总线提供电源的集线器连接。

USB介绍: http://www.usb.org/home

30.1.2 USB设备主要优点总结

1. 可以热插拔

用户在使用外接设备时,不需要关机再开机等动作,而是在电脑工作时,直接将USB插上使用。

2. 携带方便

USB设备大多以“小、轻、薄”见长,对用户来说,随身携带大量数据时,很方便。当然USB硬盘是首要之选了。

3. 标准统一。

大家常见的是IDE接口的硬盘,串口的鼠标键盘,并口的打印机扫描仪,可是有了USB之后,这些应用外设统统可以用同样的标准与个人电脑连接,这时就有了USB硬盘、USB鼠标、USB打印机等等。

4. 可以连接多个设备。

USB在个人电脑上往往具有多个接口,可以同时连接几个设备,如果接上一个有四个端口的USB HUB时,就可以再连上四个USB设备,以此类推 (注:最高可连接至127个设备,扩展到一定数量时需要外加电源)

30.1.3 USB电器接口定义

一般的排列方式是:红白绿黑从左到右

定义:

  1. 红色-USB电源: 标有-VCC、Power、5V、5VSB字样
  2. 白色-USB数据线:(负)-DATA-、USBD-、PD-、USBDT-
  3. 绿色-USB数据线:(正)-DATA+、USBD+、PD+、USBDT+
  4. 黑色-地线: GND、Ground

Linux下USB驱动开发之USB光谱仪驱动_字符串_03


30.1.4 USB的插入检测机制

USB端口的D+和D-均用一个15k的电阻接地,当无设备接入时,均处于低电平;在设备端在D+(表示高速设备或者全速设备)或者D-(表示低速设备)接了一个1.5k的上拉电阻到+3.3v,一旦将设备接入,USB端口的D+或者D-其中一个被拉高为3v,系统识别到外部设备接入。

注意:高速设备首先会被识别为全速设备,然后再通过集线器和设备二者的确认最后切换到高速模式下。

在高速模式下,采用的是电流传输模式,这个时候上拉电阻需要从D+上断开。

usb主机检测到USB设备插入后,就要对设备进行枚举了。枚举的作用就是从设备是那个读取一些信息,知道设备是什么样的设备,如果通信,这样主机就可以根据这些信息选择合适的驱动程序。调试USB设备,很重要的一点就是USB枚举过程,只要枚举成功了,那就成功一大半了。

当设备没有枚举成功时(可以通过一个10K的电阻将USB的电源端和D+或者D-连接起来,电脑会发现一个无法识别的设备,这个设备的PID和VID都是0,根据每个特性可以简单的判定设备的枚举是否成功。

30.2 USB标准描述符​

USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符,包括标准的描述符即设备描述符、配置描述符、接口描述符、端点描述符和字符串描述符。USB设备通过这些描述符向USB主机汇报设备的各种各样属性,主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程序。

USB设备通过描述符反映自己的设备特性。USB描述符是由特定格式排列的一组数据结构组成。

在USB设备枚举过程中,主机端的协义软件需要解析从USB设备读取的所有描述符信息。在USB主向设备发送读取描述符的请求后,USB设备将所有的描述符以连续的数据流方式传输给USB主机。主机从第一个读到的字符开始,根据双方规定好的数据格式,顺序地解析读到的数据流

USB描述符包含标准描述符类描述符厂商特定描述3种形式。任何一种设备必须遵循USB标准描述符(除了字符串描述符可选外)

在USB1.X中,规定了5种标准描述符:设备描述符(Device Descriptor)、配置描述符(Configuration Descriptor)、接口描述符(Interface Descriptor)、端点描述符(Endpoint Descriptor)和字符串描述符(String Descriptor)。

每个USB设备只有一个设备描述符,而一个设备中可包含一个或多个配置描述符,即USB设备可以有多种配置。设备的每一个配置中又可以包含一个或多个接口描述符,即USB设备可以支持多种功能(接口),接口的特性通过描述符提供。

在USB主机访问USB设备的描述符时,USB设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备描述符、配置描述符和接口描述符,如果USB设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输。

30.2.1 设备描述符​

/* USB_DT_DEVICE: Device descriptor */

struct usb_device_descriptor

__u8 bLength;

__u8 bDescriptorType;


__le16 bcdUSB;

__u8 bDeviceClass;

__u8 bDeviceSubClass;

__u8 bDeviceProtocol;

__u8 bMaxPacketSize0;

__le16 idVendor;

__le16 idProduct;

__le16 bcdDevice;

__u8 iManufacturer;

__u8 iProduct;

__u8 iSerialNumber;

__u8 bNumConfigurations;

__attribute__ ((packed));


//USB设备信息与驱动端匹配成功的时候调用。

static int test_probe(struct usb_interface *intf,const struct usb_device_id *id) //资源探索函数

printk("识别到USB光谱仪设备,正在进行设备初始化.\\n");

printk("该设备的厂商ID=%#x,设备ID:%#x\\n",id->idVendor,id->idProduct);


/*通过接口获取设备信息*/

struct usb_device *dev = interface_to_usbdev(intf);

printk("bcdUSB = %#x\\n",dev->descriptor.bcdUSB); //从USB设备描述符中获取USB版本

printk("vidUSB = %#x\\n",dev->descriptor.idVendor); //从USB设备描述符中获取厂商ID

printk("pidUSB = %#x\\n",dev->descriptor.idProduct);//从USB设备描述符中获取产品ID


/*-------------------------------*/

设备描述符给出了USB设备的一般信息,包括对设备及在设备配置中起全程作用的信息,包括制造商标识号ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等。一个USB设备必须有且仅有一个设备描述符。设备描述符是设备连接到总线上时USB主机所读取的第一个描述符,它包含了14个字段,结构如下

USB设备描述符的结构

偏移量

大小

描述

0

bLength

1

数字

此描述表的字节数

1

bDecriptorType

1

常量

描述符的类型(此处应为0x01,即设备描述符)

2

bcdUSB

2

BCD码

此设备与描述表兼容的USB设备说明版本号(BCD 码)

4

bDeviceClass

1

设备类码:

如果此域的值为0则一个设置下每个接口指出它自己的类,各个接口各自独立工作。
如果此域的值处于1~FEH之间,则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作。此值指出了这些接口集体的类定义。
如果此域设为FFH,则此设备的类由厂商定义。

5

bDeviceSubClass

1

子类

类码

这些码值的具体含义根据bDeviceClass 域来看。
如bDeviceClass 域为零,此域也须为零
如bDeviceClass 域为FFH,此域的所有值保留。

6

bDevicePortocol

1

协议

协议码

这些码的值视bDeviceClass 和 bDeviceSubClass 的值而定。 如果设备支持设备类相关的协议,此码标志了设备类的值。如果此域的值为零,则此设备不支持设备类相关的协议,然而,可能它的接口支持设备类相关的协议。如果此域的值为FFH,此设备使用厂商定义的协议。

7

bMaxPacketSize0

1

数字

端点0的最大包大小(仅8,16,32,64为合法值)

8

idVendor

2

ID

厂商标志(由USB-IF组织赋值)

10

idProduct

2

ID

产品标志(由厂商赋值)

12

bcdDevice

2

BCD码

设备发行号(BCD 码)

14

iManufacturer

1

索引

描述厂商信息的字符串描述符的索引值。

15

iProduct

1

索引

描述产品信息的字串描

usb的驱动应该怎么写?

麻烦高手解释下,USB驱动该怎么编写?在什么环境下,用什么语言,给点具体代码。或者你帮我写个接管鼠标的usb驱动显示出来鼠标传递了什么数据给你听说可以参考bushound?这个叫filterdriver???小弟初次涉及硬件驱动。想深... 查看详情

win10以上平台实现ucx框架的usb虚拟总线驱动(usb主机控制端驱动)

...注明原始作者。CSDN上前面多篇文章都讲述过USB虚拟总线驱动,也可以叫做USB主机控制端驱动。包括linux平台和windows平台的。linux平台的USB主机控制器驱动相对而言比较容易开发。因为linux内核设计了一个很容易入门的总体框架,... 查看详情

usb原理及驱动框架介绍编写

...发板Linux3.4.2内核arm-linux-gcc4.3.2编译器参考资料:​​2_USB驱动程序之USB总线驱动程序(100ask.net)​​​​19.Linux-USB总线驱动分析-诺谦​​​1、几个常见疑惑?为什么一插上就会有提示信息?是因为windows自带了USB总线驱动程序;那... 查看详情

usb开发——内核usb驱动+libusb开发方法

  linux内核已经具备usb驱动,所以一些设备使用可以免驱,libusb是针对linux内核中ubs驱动的一套api,会自行调用usb驱动接口,并为应用提供api接口,将usb设备开发减少为应用层开发。  一、usb驱动配置:    .....  二、... 查看详情

linux驱动开发:usb驱动开发(代码片段)

一、USB简介1.1 什么是USB?   USB是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,USB就是简写,中文叫通用串行总线。... 查看详情

linux驱动开发:usb驱动开发(代码片段)

一、USB简介1.1 什么是USB?   USB是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,USB就是简写,中文叫通用串行总线。... 查看详情

win10以上平台实现ucx框架的usb虚拟总线驱动(usb主机控制端驱动)

...注明原始作者。CSDN上前面多篇文章都讲述过USB虚拟总线驱动,也可以叫做USB主机控制端驱动。包括linux平台和windows平台的。linux平台的USB主机控制器驱动相对而言比较容易开发。因为linux内核设计了一个很容易入门的总体框架,... 查看详情

linux下usb驱动框架分析

1.1USB简介​1.1.1USB总线介绍​USB是连接计算机系统与外部设备的一种串口总线标准,也是一种输入输出接口的技术规范,被广泛地应用于个人电脑和移动设备等信息通讯产品,USB就是简写,中文叫通用串行总线。最早出现在1995年... 查看详情

USB 驱动器检测 (Linux)

】USB驱动器检测(Linux)【英文标题】:USB-drivedetection(Linux)【发布时间】:2015-11-2109:35:42【问题描述】:在我的Python程序中,我需要不断检查是否有新的USB驱动器连接到我的设备,运行x86Linux(Ubuntu)。其他USB设备不应被误认为是USB驱... 查看详情

移植usbch340驱动到arm板,并作测试

一、安装usbserial驱动1.获得usbserial驱动2.加载usbserial驱动二、安装ch340驱动1.获得ch340驱动源码2.编译ch340驱动源码,生成ko驱动3.加载ch340驱动三、编写程序验证驱动能否正常使用linux-arm开发板在引出USB接口的时候,可外接U盘、键鼠... 查看详情

linux-usb驱动笔记

...4、USB总线4.1、USB2.04.2、USB3.05、USB控制器类型1、前言USB的驱动非常的复杂,一下子去看源码也是一头雾水,下面记录下学习USB驱动的过程,后续也会有几篇笔记连续起来。2、USB简介USB,是英文UniversalSerialBus(... 查看详情

usb驱动之androidusb鼠标驱动(代码片段)

1.前言        HID是HumanInterfaceDevices的缩写,翻译成中文即为人机交互设备。这里的人机交互设备是一个宏观上面的概念,任何设备只要符合HIDspec都可以称之为HID设备,常见的HID设备有鼠标键盘,游戏操纵杆等... 查看详情

和菜鸟一起学linux总线驱动之初识usb鼠标抓包数据

   记得上次讲了USB的一些基础后就没有深入下去了,上周工作很忙,这周又没啥状态,把spi和i2c的一些所学的总结下后,现在终于可以开始了USB了,对于其系统结构,设备描述符,数据传输方式相信... 查看详情

rk3399驱动开发|17-rtl8152usb有线网卡调试(基于linux5.4.32内核)

文章目录一、RTL8152二、网卡驱动使能三、测试1.查看USB设备是否识别2.加载驱动模块3.ping测试4.iperf测试四、网卡名称变回ethx五、网卡参数一、RTL8152二、网卡驱动使能Linux内核中已经提供了RTL8152USB网卡的驱动,驱动文件为drivers/ne... 查看详情

rk3399驱动开发|17-rtl8152usb有线网卡调试(基于linux5.4.32内核)

文章目录一、RTL8152二、网卡驱动使能三、测试1.查看USB设备是否识别2.加载驱动模块3.ping测试4.iperf测试四、网卡名称变回ethx五、网卡参数一、RTL8152二、网卡驱动使能Linux内核中已经提供了RTL8152USB网卡的驱动,驱动文件为drivers/ne... 查看详情

linux驱动开发22-usb子系统

USB子系统USB(universalserialbus)总线:通用串行总线,是一种外部总线标准,用于规范电脑与外部设备的连接和通讯。 USB1.0:1.5MB/SUSB1.1(fullspeed):12MB/SUSB2.0(highspeed) 查看详情

linux系统下使用4g模块ec20实现拨号上网

驱动的实现过程实现4G功能分为两步,第一步内核能成功识别出该设备,第二步实现拨号上网.最后提一下自带的定位功能一.添加内核USB驱动这里直接使用内核已经存在的USB驱动,只需要让内核能识别出该USB设备,并自动加载驱动生成... 查看详情

如何在嵌入式linux开发板上使用usb键盘

鼠标驱动可分为几个部分:驱动加载部分、probe部分、open部分、urb回调函数处理部分。下文阴影部分为注解。一、驱动加载部分staticint__initusb_mouse_init(void)intretval=usb_register(&usb_mouse_driver);//注册鼠标驱动if(retval==0)info(DRIVER_VERSIO... 查看详情