linux上usb的state,USB设备状态设置-- usb_gadget_set_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的内容将在后续的文章中整理出来。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值