Linux USB subsystem --- USB bus registration

原创 2012年03月23日 11:41:49

目的:对USB进行深入学习,在此留下笔记。欢迎讨论。

[Author: Bo Shen <voice.shen@gmail.com>]

[Linux 3.2: driver/usb/core/driver.c]

定义:usb_bus_type

struct bus_type usb_bus_type = {
	.name =		"usb",
	.match =	usb_device_match,
	.uevent =	usb_uevent,
};

1. usb_device_match的作用是去判断是usb device (is_usb_device()),还是usb interface (is_usb_interface())。

2. usb_uevent (依赖于CONFIG_HOTPLUG) 的作用,通过判断是usb device 还是usb interface来获取struct usb_device *usb_dev结构体,然后进行两个判断(usb_dev->devnum < 0) 和(!usb_dev->bus),最后调用add_uevent_var(<lib/kobject_uevent.c>)添加PRODUCT和TYPE信息。


附:讲解一下bus_register()函数。

[Linux 3.2: driver/base/bus.c]

函数:bus_register(struct bus_type *bus)

/**
 * bus_register - register a bus with the system.
 * @bus: bus.
 *
 * Once we have that, we registered the bus with the kobject
 * infrastructure, then register the children subsystems it has:
 * the devices and drivers that belong to the bus.
 */
int bus_register(struct bus_type *bus)
{
	int retval;
	struct subsys_private *priv;

	priv = kzalloc(sizeof(struct subsys_private), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->bus = bus;
	bus->p = priv;

	BLOCKING_INIT_NOTIFIER_HEAD(&priv->bus_notifier);

	retval = kobject_set_name(&priv->subsys.kobj, "%s", bus->name);
	if (retval)
		goto out;

	priv->subsys.kobj.kset = bus_kset;
	priv->subsys.kobj.ktype = &bus_ktype;
	priv->drivers_autoprobe = 1;

	retval = kset_register(&priv->subsys);
	if (retval)
		goto out;

	retval = bus_create_file(bus, &bus_attr_uevent);
	if (retval)
		goto bus_uevent_fail;

	priv->devices_kset = kset_create_and_add("devices", NULL,
						 &priv->subsys.kobj);
	if (!priv->devices_kset) {
		retval = -ENOMEM;
		goto bus_devices_fail;
	}

	priv->drivers_kset = kset_create_and_add("drivers", NULL,
						 &priv->subsys.kobj);
	if (!priv->drivers_kset) {
		retval = -ENOMEM;
		goto bus_drivers_fail;
	}

	klist_init(&priv->klist_devices, klist_devices_get, klist_devices_put);
	klist_init(&priv->klist_drivers, NULL, NULL);

	retval = add_probe_files(bus);
	if (retval)
		goto bus_probe_files_fail;

	retval = bus_add_attrs(bus);
	if (retval)
		goto bus_attrs_fail;

	pr_debug("bus: '%s': registered\n", bus->name);
	return 0;

bus_attrs_fail:
	remove_probe_files(bus);
bus_probe_files_fail:
	kset_unregister(bus->p->drivers_kset);
bus_drivers_fail:
	kset_unregister(bus->p->devices_kset);
bus_devices_fail:
	bus_remove_file(bus, &bus_attr_uevent);
bus_uevent_fail:
	kset_unregister(&bus->p->subsys);
out:
	kfree(bus->p);
	bus->p = NULL;
	return retval;
}
EXPORT_SYMBOL_GPL(bus_register);


bus_register的目的主要是处理Linux设备模型的相关事宜。

此函数的主要作用如下:

1. line 21 : 初始化一个blocking的通知链。

2. line 23 ~ 31: 将USB总线加入总线集,并在/sys/bus下面创建usb子目录。

3. line 35 : 在/sys/bus/usb/下面创建uevent的属性文件。

4. line 39 ~ 51: 在usb总线子集上面创建devices, drivers两个子集,同时创建目录。

5. line 53 ~54 : 初始化两条链表:klist_devices, klist_drivers。

6. line 56 : 添加bus的drivers_probe,drivers_autoprobe属性文件。(需要CONFIG_HOTPLUG的支持)

7. line 60 : 添加bus的其余属性文件,对USB来说,没有。

这些完成之后,可以在/sys/bus下面看到usb目录,

在USB目录下面可以看到:

# ls /sys/bus/usb

devices   drivers_autoprobe  uevent   drivers            drivers_probe

重新指派usb转串口模块在linux系统中的设备调用名称

How to remap /dev/ttyUSB* to a specific name to be called by my program. How to map /dev/ttyUSB* to ...
  • sonictl
  • sonictl
  • 2016年03月21日 16:43
  • 1242

linux下的usb抓包方法

Chinaunix首页 | 论坛 | 认证专区 | 博客 登录 | 注册      博文     博主    zxg623zxg623.blog.chin...
  • james026
  • james026
  • 2016年01月06日 08:05
  • 521

USB抓包工具--Bus Hound的使用方法详解

概述 Bus Hound是一个超级软件总线协议分析器,用于捕捉来自设备的协议包和输入输出操作。该软件是由美国perisoft公司研制的一种专用于PC机各种总线数据包监视和控制的开发工具软件,其名"ho...
  • WY_stutdy
  • WY_stutdy
  • 2017年06月16日 11:37
  • 3287

usb枚举过程分析之hub_events

当守护程序第一次运行或usb port上状态发生变化,守护进程被唤醒都会运行hub_events函数,这个函数在usb系统中处理核心位置,usb的枚举过程就是由它完成,usb枚举过程流程图如图1所示;...
  • wujiangguizhen
  • wujiangguizhen
  • 2014年07月03日 09:42
  • 1968

lsusb、usbfs查看usb拓扑结构

usb拓扑结构 在调试USB设备时,常常需要查看设备的状态以及获得设备的信息。这里的拓扑结构是获得总线、设备、端口等相关的拓扑图。有两个比较方便的方法一个是lsusb工具,一个是挂载usbfs文件系统...
  • shichaog
  • shichaog
  • 2014年12月30日 18:07
  • 2474

USB spec TT 部分的摘要

项目上发现, 板子如果接hub, hub上挂两个手柄的话, 会发现只有一个手柄能用. 但是同样的hub和手柄在PC上是能正常使用的. 由于手柄是低速设备, 因此需要涉及到 SPLIT INTERRU...
  • jackjones_008
  • jackjones_008
  • 2014年12月24日 16:43
  • 1223

USB 描述符详细解析,来自老外网站,比协议描述清晰

来自:http://wiki.osdev.org/Universal_Serial_Bus Universal Serial Bus The Universal Serial Bus ...
  • lanmanck
  • lanmanck
  • 2013年05月17日 09:14
  • 27288

Linux中显示系统中USB信息的lsusb命令

来源:Linux中国  原文:https://linux.cn/article-2448-1.html 通用串行总线(USB)被设计成为连接计算机外设的标准,如键盘、...
  • robertsong2004
  • robertsong2004
  • 2015年06月24日 11:13
  • 4336

二、usb子系统初始化

在/drivers/usb/core/Usb.c中,subsys_initcall(usb_init)声明了usb子系统入口函数usb_init static int __init usb_in...
  • hanmengaidudu
  • hanmengaidudu
  • 2016年11月02日 10:52
  • 266

Linux 查看usb设备信息

下面的信息都是在VMware中运行Ubuntu12-04系统上执行的。同样该命令也支持在嵌入式系统中进行调试USB。一、cat设备节点获取信息在一些嵌入式开发中需要调试USB功能,经常会cat /sy...
  • encourage2011
  • encourage2011
  • 2016年12月15日 23:49
  • 8578
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Linux USB subsystem --- USB bus registration
举报原因:
原因补充:

(最多只允许输入30个字)