三、usb主控器注册

四、usb设备注册 一.usb设备驱动注册 static inline int usb_register(struct usb_driver *driver) { return usb_register_driver(driver, THIS_MODULE, KBUILD_MODNAME); } usb_register_driver int usb_register_driver(struct usb 阅读详情

第一步usb主控器设备的分配

usb_create_hcd

struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,struct device *dev, const char *bus_name)
{
	struct usb_hcd *hcd;
	hcd = kzalloc(sizeof(*hcd) + driver->hcd_priv_size, GFP_KERNEL);	//分配usb_hcd和私有数据内存
	if (!hcd) {
		dev_dbg (dev, "hcd alloc failed\n");
		return NULL;
	}
	dev_set_drvdata(dev, hcd);	//dev->p->driver_data=hcd
	kref_init(&hcd->kref);	//参考计数+1
	usb_bus_init(&hcd->self);	//初始化usb总线
	hcd->self.controller = dev;	//设置总线控制器设备
	hcd->self.bus_name = bus_name;	//设置总线名
	hcd->self.uses_dma = (dev->dma_mask != NULL);	//设置DMA标志
	init_timer(&hcd->rh_timer);		//初始化定时器
	hcd->rh_timer.function = rh_timer_func;	//定时器回调函数
	hcd->rh_timer.data = (unsigned long) hcd;	//回调函数参数
#ifdef CONFIG_USB_SUSPEND
	INIT_WORK(&hcd->wakeup_work, hcd_resume_work);	//唤醒执行hcd_resume_work函数
#endif
	mutex_init(&hcd->bandwidth_mutex);
	hcd->driver = driver;	//设置主控器驱动
	hcd->product_desc = (driver->product_desc) ? driver->product_desc :"USB Host Controller";	//设置厂商字串
	if (hcd->driver->recover_hcd)	//若主控器驱动存在recover_hcd方法
		INIT_WORK(&hcd->ehci_omap_work, hcd->driver->recover_hcd);	//则调用其方法
	return hcd;
}

这里定时器的回调函数

static void rh_timer_func (unsigned long _hcd)
{
	usb_hcd_poll_rh_status((struct usb_hcd *) _hcd);	//调用hcd轮询检测状态的函数
}

第二步usb主控器设备添加

usb_add_hcd

int usb_add_hcd(struct usb_hcd *hcd,unsigned int irqnum, unsigned long irqflags)
{
	int retval;
	struct usb_device *rhdev;	//usb设备(root hub)
	dev_info(hcd->self.controller, "%s\n", hcd->product_desc);	//设置usb主控器设备设备文件名称
	hcd->authorized_default = hcd->wireless? 0 : 1;	//检测无线受权信息
	set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);	//置位usb主控器标志	(全功耗)
	if ((retval = hcd_buffer_create(hcd)) != 0) {	//分配usb主控器设备DMA缓冲池
		dev_dbg(hcd->self.controller, "pool alloc failed\n");
		return retval;
	}
	if ((retval = usb_register_bus(&hcd->self)) < 0)	//usb注册总线
		goto err_register_bus;
	if ((rhdev = usb_alloc_dev(NULL, &hcd->self, 0)) == NULL) {	//分配usb设备(根hub)
		dev_err(hcd->self.contro
二、usb子系统初始化 在/drivers/usb/core/Usb.c中,subsys_initcall(usb_init)声明了usb子系统入口函数usb_init static int __init usb_init(void) { int retval; if (nousb) { pr_info("%s: USB support disabled\n", usbcore_name); re 阅读详情

相关推荐

记录一下本地部署Dify的坑

1. 截止2025-3-4为止,请注意,不要直接拉Dify的1.0.0版本。请先试用0.15.3版本。1.0.0有一个bug需要解决。3. 请使用docker-ce 新版本,docker-engine等老版本可能会有部分容启动脚本执行莫名报错。2. 注意,请使用docker-compose V2版本,或者V1较高版本,否则会导致解析官方yml模板错误。

哈利路亚的收藏夹 5316

五、从usb的插入开始

usb设备插入接口,电压变化会通知到usb主控, 触发主控中断,如果主控不支持中断,那么会使用rh_timer方法,轮询接口 其结果都是调用usb_hcd_poll_rh_status void usb_hcd_poll_rh_status(struct usb_hcd *hcd)  {      struct urb  *urb;      int     length; 

916

tsmc12:via0的spacing问题(Via0.S.1)

12nm有个via0 grid的概念,除了普通fill外,基本都有via0这一层,这一层需要与via0 grid对齐。手动调整cell的位置比较容易出这个drc,比如修m0po max length drc时。解决方法1: 替换EEQV类型cell,这种类型是专门为了修via0 Grid问题存在的。更多学习内容请关注「拾陆楼」知识星球。解决方法2: 翻转或移动。

m0_61544122的博客 1054

usb_host重新分析(1)

usb驱动简单介绍

zuodenghuakai的博客 1339

linux内核usb驱动框架,基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析

基于S3C2440平台的linux2.6.22内核版本的USB驱动框架分析发布时间:2014-07-18 16:47:31来源:红联作者:linux08071151driver/usb/host/ohci-s3c2410.cstatic struct platform_driver ohci_hcd_s3c2410_driver注册usb_device_driverstatic int __ini...

weixin_30975527的博客 271

rk3399【休眠唤醒】调试笔记(一)

背景 :基于rk3399 平台 4.4 内核,平板上系统为麒麟v4, 点击系统的挂机功能,平板不能唤醒。 各个平台基本上都实现了自己额休眠唤醒功能,接下来记录一下自己的调试过程 分析之前,肯定先要了解一下内核 的suspend 机制 发现绝大部分都是参考: Linux电源管理(6)_Generic PM之Suspend功能. 了解了一些背景知识之后,开始继续向下分析。 现象1 : 接适配,不差电池,点击挂机功能后,过几秒自动唤醒。该如何分析呢? 1.查看内核支持的休眠方式 2.尝试休眠 echo mem

W_nvshengdan的博客 5615

usb主控注册

第一步usb主控设备的分配 usb_create_hcd [cpp] view plaincopy struct usb_hcd *usb_create_hcd (const struct hc_driver *driver,struct device *dev, const char *bus_name)   {       struct

wantianpei的专栏 808

USB设备主控芯片检测工具实战指南

USB-IF组织正在不断推动USB标准的发展。新一代的USB标准,例如USB 4,预计会提供更高的带宽和新的功能,比如多视频流传输和更智能的电源管理。这些新标准不仅能够进一步提升用户体验,还能实现更多创新的应用场景。

weixin_35706255的博客 1169

Linux之 USB驱动框架-USB总线核心和主控驱动(4)

之后匹配到USB Core中注册USB hub驱动,执行USB hub驱动的probe函数,该probe函数中,创建了一个urb并为其注册了一个中断处理函数hub_irq,hub_wq来处理USB设备事件(插入、拔出)。在USB Core中已经向总线注册个驱动(USB设备驱动、USB接口驱动、USB hub驱动),根据条件匹配到USB设备驱动,则去调用USB设备驱动的probe函数。而在内核高版本是使用的工作队列。usb_bus_type提供了驱动和设备匹配的匹配函数,后面注册设备和驱动时会调用到。

z20230508的博客 1538

USB:USB历史以及概况

虽然低速比全速慢,但是它不易受到电磁干扰(EMI)的影响,并且可以使用成本低的组件,因此受到诸多 USB 设备开发者的喜爱。USB 是一种行业标准,用于将电子外围设备(例如:键盘、鼠标、调制解调和硬盘驱动)连接到计算机上,它代替了尺寸大且速度慢的连接(例如:串行和并行端口)。目前,USBUSB 实施者论坛(USB-IF)非盈利组织监管,该组织保管着 USB 文件和合规项目。设备被枚举后,主机将负责总线上的全部设备之间的数据通信流向。是 USB 系统中唯一一个双向管道,所有的数据管道均是单向的。

yybyg的博客 902

usb主机控制驱动

1、tcc803x的usb2.0由两个模块组成:主从一体模块(dwc2)和主模块,主从一体模块里主部分集 成了echi、ohci两个主控,从部分集成了一个设备控制。主模块里只集成了两个主控:ehci和ohci。所以usb2.0里有两个echi两个ohci和一个设备控制. 2、High-speed: 25Mbps~400Mbps(最大480Mbps) (高速) Full-speed: 500Kbps~10Mbps(最大12M...............

ask_true的博客 5584

linux设备驱动中device_init_wakeup

device_init_wakeup

shenhuxi_yu的专栏 5964

Linux usb 3. Host 详解

文章目录1. 简介2. Usb Core 驱动设备模型2.1 Usb Device Layer2.1.1 device (struct usb_device)2.1.2 driver (struct usb_device_driver)2.1.3 bus (usb_bus_type)2.2 Usb Interface Layer2.2.1 device (struct usb_interface)2.2.2 driver (struct usb_driver)2.2.3 bus (usb_bus_type)

pwl999的博客 3252

linux usb root_hub中断传输

https://www.cnblogs.com/tureno/articles/6811367.html

ask_true的博客 1669

usb驱动开发16——设备生命线

回到struct usb_hcd,继续努力的往下看。 kref,usb主机控制的引用计数。struct usb_hcd也有自己专用的引用计数函数,看hcd.c文件: static void hcd_release (struct kref *kref) { struct usb_hcd *hcd = container_of (kref, struct usb_hcd, kref); kfree(hcd); } struct usb_hcd *usb_get_hcd (struct usb_hcd

eryunyong的专栏 1323

USB设备热插拔流程解析

usb_hcd_poll_rh_status函数中,调用主机控制的hub_status_data函数获取端口状态。如果端口的状态有变化,那么length > 0,把获取到的端口状态的数组拷贝到urb->transfer_buffer中,就是前面的hub->buffer中,同时调用usb_hcd_giveback_urb函数。在usb_hub_init函数中完成了注册hub驱动,然后创建一个工作队列hub_wq,每当有设备连接到USB接口时;sdio的话,主机驱动初始化的时候,会去枚举卡;

我的博客 1607

linux USB驱动分析()USB host controller驱动分析

关键词:linux、驱动、usbusb host controllerusb主机控制在rk3128 的 TRM 文件《Rockchip RK312X TRM V1.0 Part2 20160630.pdf》中,USB主机控制 USB HOST CONTROLLER 通过 UTMI 接口与 USB HOST PHY 连接,USB HOST PHY 通过 USB 线与其它设备连接,USB 的 PHY 与以太网的 PHY 类似,用于数字信号和电气信号的转换。

vitalma的博客 2489

【keil+proteus源文件】51单片机的串行口连接74LS164进行串行转换,然后输出到一个七段数码管。数码管循环显示

51单片机的串行口连接74LS164进行串行/并行转换,然后输出到一个七段数码管。数码管循环显示0-9这10个数字。要求采用串行通信方式0,定时间隔1秒。适用于大学生实验课内容及相关从业人员参考压缩包形式,下载即用,无需调试如果看不懂的话可以参考作者专栏文章

上一篇: 二、usb子系统初始化
下一篇: 四、usb设备注册
paomadi
博客等级 码龄17年 466粉丝 85原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值