技术标签: linux上usb的state
1、USB设备状态
在USB 2.0协议中第 9.1 USB Device States 章节规定了USB设备的6种状态,包括:linux
Attached/Powered/Default/Address/Configured/Suspendedapi
其状态迁移图以下:less
在 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的内容将在后续的文章中整理出来。
文章浏览阅读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第六版第九章编程题答案
文章浏览阅读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重启命令
文章浏览阅读82次。有时候,总想一个人静静不说话,呆呆的看书。总想,有一天,能实现梦想,能站在最高处,向那些人示威。总觉得,自己很自信。让背后的寒风袭击后,才知道自己是多么的不堪一击。总觉得,读书很努力,一定会换来成就。后来,才知道,那是多么的可笑,付出得太多,还不如别人那优秀成绩的一半。总觉得,自己像奔波的游人,傻乎乎的忙个不停。后来......_树色渐深春有影,人潮谁记我无名
文章浏览阅读2.4w次,点赞18次,收藏108次。利用python学习OpenCV,个人感觉比较方便。函数的形式与C++基本相同,所以切换过来还是比较好的,对于像我这种对python不太熟练的人,使用python的集成开发环境PyCharm进行学习,可以设置断点调试,有助于我这类初学者理解掌握。摄像机标定是机器人视觉进行目标定位跟踪的首要环节,通过标定板标定好摄像机的内外参数,然后进行后续的定位识别工作。本次介绍的摄像机标定的实验测试图像是O_opencv 相机标定c++/python
文章浏览阅读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静态资源文件,放置所需静态资源。._黑马优购项目简介
文章浏览阅读353次。题目 使用CreateProcess函数可以创建进程,在文本文件中列出可执行的文件的名称,编写程序,自动运行文本文件中所列全部程序。在D盘创建readme.txt文件,输入以下内容:calc.exenotepad.exemspaint.exe代码#include"stdio.h"#include"windows.h"#include"string.h"..._createprocess()打开文件
文章浏览阅读1.8w次。所需工具:空白的文本文档适用范围:跳投高抛/跳投中抛/跳投低抛步骤一:打开新建的文本文档,输入如下内容alias +jumpthrow"+jump;-attack;-attack2";alias -jumpthrow -jump;bind t +jumpthrow; (注释:t为你想绑定的键位)步骤二:保存文档,重命名为a.cfg(其实只要是.cfg结束即可),此时文件应..._csgo一键跳投怎么绑定
文章浏览阅读845次。如何避免重复下单比如,用户点击创建订单时点了两下,浏览器发送了两个http请求,结果肯定不能是创建两条一模一样的订单,需要做防重,即订单服务需要具备幂等性。订单服务如何知道创建订单请求是不是重复的呢,在插入数据之前先查询肯定不行。可以采取指定主键的方式(即订单号),具体做法是给订单系统增加一个生成订单号的服务,这个服务没有参数,返回值就是一个新的全局唯一的订单号。如果因为重复订单号导致插入..._更新订单用例
文章浏览阅读648次。AutoGraph的使用规范有三种计算图的构建方式:静态计算图,动态计算图,以及Autograph。TensorFlow 2.0主要使用的是动态计算图和Autograph。动态计算图易于调试,编码效率较高,但执行效率偏低。静态计算图执行效率很高,但较难调试。而Autograph机制可以将动态图转换成静态计算图,兼收执行效率和编码效率之利。当然Autograph机制能够转换的代码并不是没..._tensorflow2.0 baseresourcevariable.__init__
文章浏览阅读193次。2019独角兽企业重金招聘Python工程师标准>>> ...
文章浏览阅读2.7w次,点赞8次,收藏72次。TOD_amf网元