musb_core.c 解析

电脑科普:如何理清混乱的USB? USB 相关的一些名词放在一起时常让人感到困惑,比如 USB 3.0 和 USB 3.1 Gen 1 实际上是同一个标准,本文将带你理清那混乱的USB。 阅读详情

musb_core.c 是usb_general.c 调用进musb模块的核心函数,

里面有usb,musb,dma,platform模块等内容。

1. musb_init():

/* make us init after usbcore and i2c (transceivers, regulators, etc)
 * and before usb gadget and host-side drivers start to register
 */
fs_initcall(musb_init);

static int __init musb_init(void)
{
#ifdef CONFIG_USB_MUSB_HDRC_HCD
	if (usb_disabled())
		return 0;
#endif

	pr_info("%s: version " MUSB_VERSION ", "
#ifdef CONFIG_MUSB_PIO_ONLY               //这些宏由内核配置选项中来
		"pio"
#elif defined(CONFIG_USB_TI_CPPI_DMA)
		"cppi-dma"
#elif defined(CONFIG_USB_INVENTRA_DMA)
		"musb-dma"
#elif defined(CONFIG_USB_TUSB_OMAP_DMA)
		"tusb-omap-dma"
#elif defined(CONFIG_USB_CARTESIO_DMA)
		"pl080-dma"
#else
		"?dma?"
#endif
		", "
#ifdef CONFIG_USB_MUSB_OTG
		"otg (peripheral+host)"
#elif defined(CONFIG_USB_GADGET_MUSB_HDRC)
		"peripheral"
#elif defined(CONFIG_USB_MUSB_HDRC_HCD)
		"host"
#endif
		", debug=%d\n",
		musb_driver_name, musb_debug);
	return platform_driver_probe(&musb_driver, musb_probe);  //这里调用了platform 平台函数,注册进platform类型队列中。
}

musb_driver:

static struct platform_driver musb_driver = {
	.driver = {
		.name		= (char *)musb_driver_name, 
		.bus		= &platform_bus_type,   //platform bus类型
		.owner		= THIS_MODULE,
		.pm		= MUSB_DEV_PM_OPS,    //PM OPS, suspend+resume
	},
	.remove		= __exit_p(musb_remove),  
	.shutdown	= musb_shutdown,
};

1.1 musb_driver_name 定义:

#define MUSB_DRIVER_NAME "musb_hdrc"
const char musb_driver_name[] = MUSB_DRIVER_NAME;
1.2 MUSB_DEV_PM_OPS 定义:

#define MUSB_DEV_PM_OPS (&musb_dev_pm_ops)
#else
#define	MUSB_DEV_PM_OPS	NULL
#endif
static const struct dev_pm_ops musb_dev_pm_ops = {
	.suspend	= musb_suspend,
	.resume         = musb_resume_noirq,
};
static int musb_suspend(struct device *dev)

static int musb_suspend(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	unsigned long	flags;
	struct musb	*musb = dev_to_musb(&pdev->dev);

	if (!musb->clock)
		return 0;

	spin_lock_irqsave(&musb->lock, flags);

	if (is_peripheral_active(musb)) {
		/* FIXME force disconnect unless we know USB will wake
		 * the system up quickly enough to respond ...
		 */
	} else if (is_host_active(musb)) {
		/* we know all the children are suspended; sometimes
		 * they will even be wakeup-enabled.
		 */
	}

	musb_save_context(musb);

	if (musb->set_clock)
		musb->set_clock(musb->clock, 0);
	else
		clk_disable(musb->clock);
	spin_unlock_irqrestore(&musb->lock, flags);
	return 0;
}
static int musb_resume_noirq(struct device *dev):

static int musb_resume_noirq(struct device *dev)
{
	struct platform_device *pdev = to_platform_device(dev);
	struct musb	*musb = dev_to_musb(&pdev->dev);
#ifdef MUSB_RESTORE_REG
	int status;
#endif
	if (!musb->clock)
		return 0;

	if (musb->set_clock)
		musb->set_clock(musb->clock, 1);
	else
		clk_enable(musb->clock);

	musb_restore_context(musb);

#ifdef MUSB_RESTORE_REG
	status = musb_core_init(musb->is_multipoint
				? MUSB_CONTROLLER_MHDRC
				: MUSB_CONTROLLER_HDRC, musb);
	if (status < 0)
		return status;

	/* we need to apply the DEV_CTRL SESSION bit to initialize the VBUS.
	 * This should be generally called through root hub POWERON feature,
	 * but it is needed also  here if autosuspend is disabled.
         */
	musb_start(musb);

	/* wait for the connect interrupt */
	mdelay(200);
#endif
	return 0;
}
1.4  static int __exit musb_remove(struct platform_device *pdev)
static int __exit musb_remove(struct platform_device *pdev)
{
	struct musb	*musb = dev_to_musb(&pdev->dev);
	void __iomem	*ctrl_base = musb->ctrl_base;

	/* this gets called on rmmod.
	 *  - Host mode: host may still be active
	 *  - Peripheral mode: peripheral is deactivated (or never-activated)
	 *  - OTG mode: both roles are deactivated (or never-activated)
	 */
	musb_shutdown(pdev);
#ifdef CONFIG_USB_MUSB_HDRC_HCD
	if (musb->board_mode == MUSB_HOST)
		usb_remove_hcd(musb_to_hcd(musb));
#endif
	musb_writeb(musb->mregs, MUSB_DEVCTL, 0);
	musb_platform_exit(musb);
	musb_writeb(musb->mregs, MUSB_DEVCTL, 0);

	musb_free(musb);
	iounmap(ctrl_base);
	device_init_wakeup(&pdev->dev, 0);
#ifndef CONFIG_MUSB_PIO_ONLY
	pdev->dev.dma_mask = orig_dma_mask;
#endif
	return 0;
}
1.5 static void musb_shutdown(struct platform_device *pdev)
static void musb_shutdown(struct platform_device *pdev)
{
	struct musb	*musb = dev_to_musb(&pdev->dev);
	unsigned long	flags;

	spin_lock_irqsave(&musb->lock, flags);
	musb_platform_disable(musb);
	musb_generic_disable(musb);
	if (musb->clock)
		clk_put(musb->clock);
	spin_unlock_irqrestore(&musb->lock, flags);

	/* FIXME power down */
}
2.  musb_cleanup():

static void __exit musb_cleanup(void)
{
	platform_driver_unregister(&musb_driver);
}
module_exit(musb_cleanup);
3. static int __init musb_probe(struct platform_device *pdev)
static int __init musb_probe(struct platform_device *pdev)
{
	struct device	*dev = &pdev->dev;
	int		irq = platform_get_irq(pdev, 0);
	int		status;
	struct resource	*iomem;
	void __iomem	*base;

	iomem = platform_get_resource(pdev, IORESOURCE_MEM, 0);  //获取 platform 资源
	if (!iomem || irq == 0)
		return -ENODEV;

	base = ioremap(iomem->start, resource_size(iomem));    //映射内存
	if (!base) {
		dev_err(dev, "ioremap failed\n");
		return -ENOMEM;
	}

#ifndef CONFIG_MUSB_PIO_ONLY
	/* clobbered by use_dma=n */
	orig_dma_mask = dev->dma_mask;         //如果内核配置了CONFIG_MUSB_PIO_ONLY,则屏蔽DMA
#endif
	status = musb_init_controller(dev, irq, base);   //这个才是主要的函数
	if (status < 0)
		iounmap(base);

	return status;
}
4. static int __init
musb_init_controller(struct
从硬件到软件:深入解析Linux OTG模式切换的底层逻辑 本文深入解析Linux OTG模式切换的底层逻辑,从硬件信号检测到驱动状态机实现。详细介绍了USB OTG的ID引脚检测、GPIO中断处理以及Linux内核中的OTG驱动架构,帮助开发者理解并优化模式切换过程,提升嵌入式系统的USB通信可靠性。 阅读详情

相关推荐

OMAP4470与OMAP4460差异解析:图形、显示与电源管理升级要点

在嵌入式系统开发中,处理器选型与硬件平台升级是决定项目性能与功耗的关键环节。其核心原理在于深入理解SoC(系统级芯片)的架构差异,这直接关系到图形渲染、视频处理与外设驱动的技术实现。从技术价值看,精准的芯片差异分析能避免后期设计返工,显著降低开发风险与成本。典型应用场景包括高性能平板、工业HMI及智能本等需要流畅图形界面与高效多媒体处理设备。本文聚焦德州仪器OMAP4系列处理器,通过对比OMAP4470与OMAP4460在图形子系统(如SGX544 GPU与BB2D加速器)、显示输出(移除模拟视频编码器)及

450

make disclean V=1 分析

编译后执行。

雯辰的博客 1072

车载Android串口开发实战:UART/RS485底层适配与Modbus RTU通信

串口通信是嵌入式系统最基础的物理层数据交互方式,其核心在于UART协议栈与RS232/RS485等电平标准的协同实现。理解串口工作原理需从信号时序、电平匹配、中断响应和缓冲机制入手,技术价值体现在高可靠性、低延迟和强抗干扰能力,尤其适用于工业控制、车载ECU互联及传感器网络等对实时性与稳定性要求严苛的场景。在Android平台,由于系统默认未抽象UART硬件,开发者必须穿透Linux内核TTY驱动、HAL层封装、JNI桥接直至Java应用,解决权限管控、USB转串口兼容性、RS485自动收发时序控制及Mod

weixin_34348805的博客 328

【18】usb

USB2.0协议中枚举过程:一个高速 USB 设备刚插上时,先假装自己是全速设备,然后通过一段"暗号"(Chirp)和主机确认彼此都支持高速后,再切换到真正的高速模式。如下是typec接口,usb2.0协议只关心红色的框。

持续更新ing... 36

MUSBHSFC原理及其驱动.pdf

关于MUSBHSFC的详细原理解释及其驱动,全中文版,助你理解usb,用好usb外设。共十余个章节,1、usb体系结构;2、系统设置;3、usb协议分析;4、musbhsfc;5、编程方案;6、ep0处理;7、ep0服务例程;8、usb数据传输类型;9、批量传输in;10、批量传输out;11、linux模拟u盘代码分析

musbmhdrc_pspgUSB控制器芯片手册.pdf

网上找得 musbmhdrc_pspgUSB控制器芯片手册 很好,做usb的值得看!

musb_programming_guide(有道文档翻译结果).zip

musb 中文翻译和英文文档.可以通过会话请求协议(SRP)发起USB流量,而双角色设备同时支持SRP和主机协商协议(HNP),并且可以根据需要担任主机或外设的角色。MUSBMHDRC还支持拆分事务,这反过来允许它支持使用带有USB 2.0集线器的全速度或低速设备。核心还包括支持在不使用时关闭便携式设备。 除了端点0之外,MUSBMHDRC是用户可配置的,可支持最多15个‘传输’端点和/或最多15个‘接收’端点。(对于IN事务和OUT事务使用这些端点取决于MUSBMHDRC是用作外设还是用作主机。当用作外设时,IN事务通过TX端点处理,OUT事务通过Rx端点处理。当用作主机时,IN事务通过Rx端点处理,OUT事务通过TX端点处理。)这些附加端点可以在软件中单独配置,以处理批量传输(这也允许它们处理中断传输)、同步传输或控制传输。此外,还可以动态地将端点分配给不同的目标设备函数——最大限度地同时支持设备的数量。 每个端点都需要一个FIFO与之关联。MUSBMHDRC有一个RAM接口,用于连接到用于所有端点FIFOs的同步单端口RAM的单个块。(RAM块本身需要由用户添加。) 端点0的FIFO需要为64字节深,并缓冲1个数据包。RAM接口可以根据其他端点FIFOs进行配置,它的大小可以从8到8192字节,可以缓冲1个或2个数据包。单独的FIFOs可以与每个端点相关联:或者,具有相同端点编号的TX端点和Rx端点可以配置为使用相同的FIFO,例如,如果它们永远不能同时活动,可以减少所需RAM块的大小。 MUSBMHDRC提供了一个32位同步CPU接口,设计用于连接AMBA AHB bus1。接口支持使用AHB总线运行在一个大范围的总线速度。AHB总线上的多层操作也被支持。通过添加合适的包装器/桥接器,MUSBMHDRC还可以很容易地连接到一系列其他标准总线。 还支持对端点FIFOs的DMA访问。 MUSBMHDRC提供了一个UTMI+ 3级兼容接口,用于连接到一个合适的USB高/全速收发器。包含了一个可选的ULPI链接包装器(在musbhdrc /docs目录中包含的musbhdrc_ulpi_an.pdf文档中描述),用于连接到与ULPI兼容的物理。另一种接口也提供,允许使用USB 1.1与核心全速PHY,但仅为全速和低速事务。(此接口见8.1节)。 MUSBMHDRC提供发送和接收USB数据包所需的所有编码、解码、检查和重新请求——仅当端点数据已被成功传输时才中断CPU。 当充当主机时,MUSBMHDRC另外维护一个帧计数器,并自动调度SOF、同步、中断和批量传输。它还包括对在点对点通信中使用的会话请求和主机协商协议的支持,其细节在USB 2.0规范的USB on - go补充中给出。MUSBMHDRC提供了一系列的测试模式——主要是USB 2.0规范中描述的高速运行的四种测试模式。它还包括选项,允许它被迫进入全速模式,高速模式或主机模式。最后一个可能在帮助调试硬件PHY问题时有用。 提供了图形用户界面脚本,用于根据用户的需求配置核心。要使用的脚本取决于所选的CPU接口。请注意:在撰写本文时,内核仅在Verilog中可用。 本规范应与USB运行规范一起阅读,该规范还提供了电源要求、电压水平、连接器等细节。.

LobeHub开源AI应用平台:从部署到定制的全栈实践指南

在现代AI应用开发领域,大语言模型(LLM)的集成与部署是核心技术挑战之一。其原理在于通过API或本地化部署,将预训练模型的强大能力封装为可调用的服务。这项技术的核心价值在于极大地降低了AI应用的开发门槛,使开发者能够快速构建智能对话、内容生成等场景的应用。随着模型即服务(MaaS)模式的普及,一个关键痛点是如何高效地管理多模型、设计友好的用户界面并实现功能扩展。这正是开源项目LobeHub所聚焦的领域,它通过提供可插拔的架构和配置驱动的低代码理念,解决了AI能力落地的“最后一公里”问题。本文将结合Dock

weixin_27210125的博客 756

RabbitMQ的使用(JAVA)

Java快速上手的MQ上线!

.............. 1万+

【雷达图】R语言绘制雷达图(ggradar),NBA季后赛数据为例

一起用R语言给nba球星画球技雷达图吧!

池塘春草梦的博客 6252

Maya vray 3S皮肤材质球设置与材质节点连接

Maya vray 3S皮肤材质球设置与材质节点连接

WETQETF的博客 2697

在昇腾910B服务上部署搭建适配PDF解析工具Mineru2.5开源项目

本文介绍了在昇腾910B服务器上部署开源PDF解析工具Mineru2.5的过程。首先从昇腾社区下载mindie镜像并运行容器,安装系统依赖。针对部署过程中遇到的多个报错问题(如torchvision与torch版本不匹配、昇腾软件栈与NumPy 2.0不兼容等),提供了具体解决方案和兼容版本。通过设置环境变量、安装指定版本的Python依赖包,成功部署Mineru项目并下载模型。最后运行测试,验证了在NPU设备上运行pipeline的可行性。整个过程详细记录了版本适配和错误处理方法,为类似部署场景提供了参考

一起加油吧 2164

【AI学习笔记】Coze平台实现将Excel文档批量导入数据库全过程

通过Coze平台实现将Excel文档批量导入数据库的全流程,包括B站现有参考教程全方位解读、自己实操的一些BUG解决过程,以及一些疑难问题的探索。

bailichen800的博客 8826

TRK-MPC5634M开发板实战:从硬件解析到CAN、ADC外设驱动调试

在嵌入式系统开发,尤其是汽车电子和工业控制领域,微控制器(MCU)是核心执行单元。其工作原理基于处理器内核、存储器和丰富的外设接口协同工作,通过软件编程实现对硬件的精确控制。这种技术价值在于能够为严苛环境提供可靠、实时的控制解决方案。典型的应用场景包括汽车车身控制、网关、电池管理系统以及工业自动化设备。本文聚焦于恩智浦(NXP)基于Power Architecture e200z0内核的汽车级MCU——MPC5634M,并以其官方评估板TRK-MPC5634M为平台,深入探讨其硬件设计逻辑、软件环境搭建及核

weixin_29997523的博客 289

【ArcGIS遇上Python】使用add-in向导开发ArcGIS插件(1):add-in工具介绍及安装

文章目录addin介绍addin下载addin安装 addin介绍 ArcGIS从10.0开始支持addin(ArcGIS软件中又叫作加载项)的方式进行插件制作。相对于以往9.x系列,addin的无论是从使用或者编写都更加方便快捷。通过开发语言,可以制作ArcGIS Desktop各个软件模块的插件。 Esri提供了Python加载项向导工具来实现Addin界面的搭建,可以到Esri官网去下载该工具Python加载项向导 。从介绍来看,该设计器要求的最低ArcGIS版本为10.1 ,如下图所示: add

智慧空间实验室 7201

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: libc,glibc, eglibc, klibc
下一篇: musb 模块中的一些结构体
lamdoc
博客等级 码龄18年 155粉丝 655原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值