linux上usb的state,USB设备状态设置-- usb_gadget_set_state()-程序员宅基地

技术标签: linux上usb的state  

1、USB设备状态

在USB 2.0协议中第 9.1 USB Device States 章节规定了USB设备的6种状态,包括:linux

Attached/Powered/Default/Address/Configured/Suspendedapi

其状态迁移图以下:less

3eda6c883bf22702e5c614ac174677eb.png

在 Linux Kernel ch9.h 文件中用 enum usb_device_state 来标记这几种状态。函数

// /include/uapi/linux/usb/ch9.h

enum usb_device_state {

/* NOTATTACHED isn't in the USB spec, and this state acts

* the same as ATTACHED ... but it's clearer this way.

*/

USB_STATE_NOTATTACHED = 0,

/* chapter 9 and authentication (wireless) device states */

USB_STATE_ATTACHED,

USB_STATE_POWERED, /* wired */

USB_STATE_RECONNECTING, /* auth */

USB_STATE_UNAUTHENTICATED, /* auth */

USB_STATE_DEFAULT, /* limited function */

USB_STATE_ADDRESS,

USB_STATE_CONFIGURED, /* most functions */

USB_STATE_SUSPENDED

/* NOTE: there are actually four different SUSPENDED

* states, returning to POWERED, DEFAULT, ADDRESS, or

* CONFIGURED respectively when SOF tokens flow again.

* At this level there's no difference between L1 and L2

* suspend states. (L2 being original USB 1.1 suspend.)

*/

};

2、状态设置函数usb_gadget_set_state()this

// /drivers/usb/gadget/udc/udc-core.c

void usb_gadget_set_state(struct usb_gadget *gadget,

enum usb_device_state state)

{

gadget->state = state;

schedule_work(&gadget->work);

}

EXPORT_SYMBOL_GPL(usb_gadget_set_state);

// /include/linux/usb/gadget.h

extern void usb_gadget_set_state(struct usb_gadget *gadget, enum usb_device_state state);

在 udc-core.c 文件中,会去定义usb_gadget_set_state()函数,将状态state的值赋值给gadget->state。其中struct usb_gadget是用来标记一个USB设备的信息。此时USB设备的状态就能够肯定了。以后启动工做队列schedule_work(&gadget->work);将状态信息给到sysfs。code

在USB的枚举阶段,会根据USB所处的状态调用usb_gadget_set_state()去设置USB设备的状态。

好比说在USB设备的枚举阶段,在composite_setup()函数中USB设备接收到了USB Host发过来的USB_REQ_SET_CONFIGURATION命令后调用set_config()设置相应的配置,这以后就会调用usb_gadget_set_state()去设置为USB_STATE_CONFIGURED状态。orm

3、usb_gadget_state_work()

// /drivers/usb/gadget/udc/udc-core.c

* usb_add_gadget_udc_release - adds a new gadget to the udc class driver list

* @parent: the parent device to this udc. Usually the controller driver's

* device.

* @gadget: the gadget to be added to the list.

* @release: a gadget release function.

*

* Returns zero on success, negative errno otherwise.

*/

int usb_add_gadget_udc_release(struct device *parent, struct usb_gadget *gadget,

void (*release)(struct device *dev))

在usb_add_gadget_udc_release()中会去绑定 gadget->work 到 usb_gadget_state_work() 函数。blog

static void usb_gadget_state_work(struct work_struct *work)

{

struct usb_gadget *gadget = work_to_gadget(work);

struct usb_udc *udc = gadget->udc;

if (udc)

sysfs_notify(&udc->dev.kobj, NULL, "state");

}

这个函数主要目的就是将当前的 state 信息写入到 sysfs 中去。这个信息能够cat出来。token

#cat /sys/devices/platform/xxx_udc/state

路径不彻底是这个,可是在 /sys/devices 目录下会有对应udc控制器 xxx_udc 的状态节点。不只包含状态的节点,还包含其余的信息。队列

-r--r--r-- 0 0 4096 2017-05-01 16:17 a_alt_hnp_support

-r--r--r-- 0 0 4096 2017-05-01 16:17 a_hnp_support

-r--r--r-- 0 0 4096 2017-05-01 16:17 b_hnp_enable

-r--r--r-- 0 0 4096 2017-05-01 16:17 current_speed

lrwxrwxrwx 0 0 2017-05-01 16:17 device -> ../../../panasonic_udc.1

-r--r--r-- 0 0 4096 2017-05-01 16:17 is_a_peripheral

-r--r--r-- 0 0 4096 2017-05-01 16:17 is_otg

-r--r--r-- 0 0 4096 2017-05-01 16:17 maximum_speed

drwxr-xr-x 0 0 2017-05-01 16:17 power

--w------- 0 0 4096 2017-05-01 16:17 soft_connect

--w------- 0 0 4096 2017-05-01 16:17 srp

-r--r--r-- 0 0 4096 2017-05-01 16:17 state

lrwxrwxrwx 0 0 2017-05-01 16:17 subsystem -> ../../../../../class/udc

-rw-r--r-- 0 0 4096 2017-05-01 16:17 uevent

这里面的信息其实就是一个USB设备的信息,用 struct usb_gadget 来描述。关于USB Gadget的内容将在后续的文章中整理出来。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34369597/article/details/116968155

智能推荐

C Primer Plus第六版第九章编程题目与参考答案_c primer plus第六版第九章编程题答案-程序员宅基地

文章浏览阅读486次。1.设计一个函数 min (x,y),返回两个double类型值的较小值。在一个简单的驱动程序中测试该函数。#include <stdio.h>double min(double x,double y); int main() { double a,b; printf("请您输入2个数,中间用英文逗号隔开(按q退出本程序):"); while (scanf("%lf,%lf", &a, &b) == 2) { printf("最_c primer plus第六版第九章编程题答案

CentOS 基础知识 Linux中 关机与重启命令1-9_cenos7.9重启命令-程序员宅基地

文章浏览阅读481次。Linux中关机与重启命令关机:shutdown -h now / poweroff /init 0 /halt 都可以关机 但后面的不安全重启:shutdown -r now / reboot /init 6注销用户:logoutshutdown [选项] 时间-h 关机 -r 重启 -c 取消命令shutdown -r now #立马重启runlevel 前级别 当前级别:查看运..._cenos7.9重启命令

随感2021_树色渐深春有影,人潮谁记我无名-程序员宅基地

文章浏览阅读82次。有时候,总想一个人静静不说话,呆呆的看书。总想,有一天,能实现梦想,能站在最高处,向那些人示威。总觉得,自己很自信。让背后的寒风袭击后,才知道自己是多么的不堪一击。总觉得,读书很努力,一定会换来成就。后来,才知道,那是多么的可笑,付出得太多,还不如别人那优秀成绩的一半。总觉得,自己像奔波的游人,傻乎乎的忙个不停。后来......_树色渐深春有影,人潮谁记我无名

Python+OpenCV学习(17)---摄像机标定_opencv 相机标定c++/python-程序员宅基地

文章浏览阅读2.4w次,点赞18次,收藏108次。利用python学习OpenCV,个人感觉比较方便。函数的形式与C++基本相同,所以切换过来还是比较好的,对于像我这种对python不太熟练的人,使用python的集成开发环境PyCharm进行学习,可以设置断点调试,有助于我这类初学者理解掌握。摄像机标定是机器人视觉进行目标定位跟踪的首要环节,通过标定板标定好摄像机的内外参数,然后进行后续的定位识别工作。本次介绍的摄像机标定的实验测试图像是O_opencv 相机标定c++/python

python实现Kappa系数、海明距离、杰卡德相似系数、混淆矩阵等多分类评估方法_python kappa系数-程序员宅基地

文章浏览阅读3.2k次,点赞4次,收藏38次。目录Kappa系数海明距离杰卡德相似系数混淆矩阵Kappa系数手写实现def kappa_cal(matrix): n = np.sum(matrix) sum_po = 0 sum_pe = 0 for i in range(len(matrix[0])): sum_po += matrix[i][i] row = np.sum(matrix[i, :]) col = np.sum(matrix[:, i]) _python kappa系数

黑马优购项目详解_黑马优购项目简介-程序员宅基地

文章浏览阅读2.4k次。一、准备工作 首先将项目所用到的外网接口,添加到微信后台白名单中,以备项目完成后发布。 然后纵览整个项目,将项目划分为四个主体部分:首页,分类页,购物车页,个人中心页。 提前构思每个页面之间的联系以及每个页面所用到的关键技术。 了解项目所需外部资源,如iconfont图标,css样式等。 清楚都需要封装哪些公共组件。 查看每个页面所用到的请求接口,并在项目初始阶段封装api.js相关文件。 创建assets静态资源文件,放置所需静态资源。._黑马优购项目简介

随便推点

使用CreateProcess函数自动执行文本文件所列程序_createprocess()打开文件-程序员宅基地

文章浏览阅读353次。题目 使用CreateProcess函数可以创建进程,在文本文件中列出可执行的文件的名称,编写程序,自动运行文本文件中所列全部程序。在D盘创建readme.txt文件,输入以下内容:calc.exenotepad.exemspaint.exe代码#include"stdio.h"#include"windows.h"#include"string.h"..._createprocess()打开文件

csgo怎么绑定一键跳投_CSGO投掷物一键跳投的设置方法-程序员宅基地

文章浏览阅读1.8w次。所需工具:空白的文本文档适用范围:跳投高抛/跳投中抛/跳投低抛步骤一:打开新建的文本文档,输入如下内容alias +jumpthrow"+jump;-attack;-attack2";alias -jumpthrow -jump;bind t +jumpthrow; (注释:t为你想绑定的键位)步骤二:保存文档,重命名为a.cfg(其实只要是.cfg结束即可),此时文件应..._csgo一键跳投怎么绑定

电商系统:创建和更新订单_更新订单用例-程序员宅基地

文章浏览阅读845次。如何避免重复下单比如,用户点击创建订单时点了两下,浏览器发送了两个http请求,结果肯定不能是创建两条一模一样的订单,需要做防重,即订单服务需要具备幂等性。订单服务如何知道创建订单请求是不是重复的呢,在插入数据之前先查询肯定不行。可以采取指定主键的方式(即订单号),具体做法是给订单系统增加一个生成订单号的服务,这个服务没有参数,返回值就是一个新的全局唯一的订单号。如果因为重复订单号导致插入..._更新订单用例

30天干掉tensorflow2.0-day13 Autograph的使用规范_tensorflow2.0 baseresourcevariable.__init__-程序员宅基地

文章浏览阅读648次。AutoGraph的使用规范有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph。TensorFlow 2.0主要使用的是动态计算图和Autograph。动态计算图易于调试,编码效率较高,但执行效率偏低。静态计算图执行效率很高,但较难调试。而Autograph机制可以将动态图转换成静态计算图,兼收执行效率和编码效率之利。当然Autograph机制能够转换的代码并不是没..._tensorflow2.0 baseresourcevariable.__init__

Linux 系统病毒入侵分析-程序员宅基地

文章浏览阅读193次。2019独角兽企业重金招聘Python工程师标准>>> ...

【5G核心网】5GC核心网之网元AMF_amf网元-程序员宅基地

文章浏览阅读2.7w次,点赞8次,收藏72次。TOD_amf网元