Android Qcom USB Driver学习(十四)

这篇具有很好参考价值的文章主要介绍了Android Qcom USB Driver学习(十四)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

该系列文章总目录链接与各部分简介: Android Qcom USB Driver学习(零)

了解什么是dwc3 udc gadget hcd xhci, 差点被Chatgpt绕晕了,看的比较浅显就像知道这些都是什么作用的。

UDC-Gadget

UDC:(USB Device Controller)用于管理和控制USB设备与主机之间的通信。
Gadget:Android在此层实现了adb,mtp(Media Transfer Protocol 媒体传输协议),mass_storage等。

早期的USB只支持单一的gadget设备,使用场景较为简单,随后加入了composite framework,用来支持多个function的gadget设备,多个function的绑定在内核中完成,若需要修改,则需要修改内核,不灵活也不方便。Linux3.11版本引入了基于configfs的usb gadget configfs。
usb gadget configfs重新实现了复合设备层,可以在用户空间配置和组合内核的function,灵活的构成USB复合设备,极大了提高了工作效率。
system/core/rootdir/init.usb.configfs.rc

[persist.sys.usb.config]: [diag,adb]
[sys.usb.config]: [mtp,adb] 

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1
     write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb"
     write /config/usb_gadget/g1/idVendor 0x0c2e
     write /config/usb_gadget/g1/idProduct 0x0ba3
     symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1
     symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2
     write /config/usb_gadget/g1/UDC ${sys.usb.controller}
     setprop sys.usb.state ${sys.usb.config}

drivers/usb/gadget/configfs.c
drivers\usb\gadget\composite.c
drivers/usb/gadget/udc/core.c
drivers/usb/gadget/function/f_mtp.c
USB总线-Linux内核USB3.0设备控制器复合设备之USB gadget configfs分析

gadget -> composite -> function

make_group -> function_make -> usb_get_function_instance -> alloc_inst -> mtp_alloc_inst
每个function driver创建的时候会分配一个usb_function_instance

echo  4e00000.dwc3 >  configs/usb_gadget/g1/UDC 
usb_udc_attch_driver-> udc_bind_to_driver-> configfs_composite_bind 
                                         -> usb_add_function -> function->bind -> mtp_function_bind
		

HCD-XHCI

HCD:(Host Controller Driver)是主机控制器驱动,它是对主机控制器硬件的抽象。
XHCI:(eXtensible Host Controller Interface)也是主机控制器驱动,XHIC是基于USB3.0并且向下兼容,其中集成了两个roothub,一个对应usb2.0的(main_hcd),一个对应usb3.0的(shared_hcd)

struct xhci_hcd {
			   /* usb_hcd结构体:用于描述USB主机控制器驱动*/
				struct usb_hcd *main_hcd;
				struct usb_hcd *shared_hcd;
				/* glue to PCI and HCD framework */
				struct xhci_cap_regs __iomem *cap_regs;
				struct xhci_op_regs __iomem *op_regs;
				struct xhci_run_regs __iomem *run_regs;
				struct xhci_doorbell_array __iomem *dba;
				/* Our HCD's current interrupter register set */
				struct	xhci_intr_reg __iomem *ir_set;
		
				/* Cached register copies of read-only HC data */
				__u32		hcs_params1;
				...
		
				spinlock_t	lock;
		
				/* packed release number */
				u8		sbrn;
				u16		hci_version;
				...
				...
				...
			};

root hub设备注册(三)
drivers/usb/host/xhci-plat.c
drivers/usb/core/hcd.c
drivers/usb/host/xhci.c
drivers/usb/core/hub.c


dwc3_otg_start_host ->   dwc3_host_init -> platform_device_add(xhci) -> xhci_plat_probe

xhci->main_hcd = hcd;  
usb_add_hcd(hcd, irq, IRQF_SHARED); //roothub对应usb0
usb_add_hcd(xhci->shared_hcd, irq, IRQF_SHARED);
	hcd->driver->start(hcd)  //hc_driver
		xhci_run(hcd)
			xhci_try_enable_msi(hcd)
				hci_setup_msix(xhci)
					xhci_irq(hcd)
					---------------------------------------------------------------------------------
				   |	xhci_handle_event(xhci)														|
				   |	case: TRB_PORT_STATUS                                                       |
				   |		handle_port_status(xhci, event);                                        |
				   |	case: TRB_TRANSFER                                                          |
				   |		handle_tx_event(xhci, &event->trans_event);                             |
				   |			usb_hcd_giveback_urb                                                |
				   |				tasklet_schedule(&bh->bh);                                      |
				   |					kick_hub_wq(hub);                                           |
				   |						queue_work(hub_wq, &hub->events)                        |
				   |							hub_event->port_event->hub_port_connect_change      |
				   |								->hub_port_connect -> usb_new_device(udev);     |
				    ----------------------------------------------------------------------------------		
	register_root_hub(hcd)
		usb_get_device_descriptor(usb_dev, USB_DT_DEVICE_SIZE)
			usb_new_device (usb_dev)
				usb_enumerate_device(udev)
				announce_device(udev)/* 打印New USB device found*/
				device_add(&udev->dev)

DWC3

DWC3:(DesignWare USB 3.0 Controller) 在Android系统中,dwc3通常被用作USB3.0主机控制器,用于与XHCI驱动程序配合使用,控制USB3.0设备与主机之间的通信。同时,dwc3还可以与Gadget驱动程序配合使用,将linux设备转为USB设备,实现设备与主机间的通信。
dwc3控制器初始化的时候会将控制器设置为USB_DR_MODE_OTG模式,同时调用dwc3_host_init和dwc3_gadget_init函数初始化主机模式和设备模式所需的资源,控制器后续可以动态切换为主机模式和设备模式。文章来源地址https://www.toymoban.com/news/detail-492307.html

                  ->   host mode    xhci   dwc3_host_init()
dwc3 controller -
                  ->   device mode  udc    dwc3_gadget_init()

dual-role device (DRD) OTG State
enum dwc3_drd_state {
  	DRD_STATE_UNDEFINED = 0, //put controller and phy in suspend if no cable connected
							 //pm_runtime_putsync decrease usage_count
  	DRD_STATE_IDLE,	         
  	DRD_STATE_PERIPHERAL,
  	DRD_STATE_PERIPHERAL_SUSPEND,
  	DRD_STATE_HOST_IDLE,
  	DRD_STATE_HOST,
  };
dual-role usb control(DR) works on a particular mode
enum usb_dr_mode {
  	USB_DR_MODE_UNKNOWN,
  	USB_DR_MODE_HOST,
  	USB_DR_MODE_PERIPHERAL,
  	USB_DR_MODE_OTG,
  };

状态的切换通过dwc3_otg_sm_work -> dwc3_otg_start_host/dwc3_otg_start_peripheral

power/supply/qcom/qpnp-smb5.c devm_extcon_dev_register 发送广播

static const unsigned int smblib_extcon_cable[] = {
  	EXTCON_USB,
  	EXTCON_USB_HOST,
  	EXTCON_NONE,
};

smblib_notify_device_mode
	extcon_set_state_sync(chg->extcon, EXTCON_USB, enable);
smblib_notify_usb_host
	extcon_set_state_sync(chg->extcon, EXTCON_USB_HOST, enable);

usb/dwc3/dwc3-msm.c devm_extcon_register_notifier注册监听usb状态变化,接受广播

mdwc->extcon[idx].vbus_nb.notifier_call = dwc3_msm_vbus_notifier;
extcon_register_notifier(edev, EXTCON_USB, &mdwc->extcon[idx].vbus_nb);
extcon_register_notifier(edev, EXTCON_USB_HOST,&mdwc->extcon[idx].id_nb);
dwc3_msm_vbus_notifier(&mdwc->extcon[idx].vbus_nb,true, edev);
dwc3_msm_id_notifier(&mdwc->extcon[idx].id_nb,true, edev);

DBG-LOG

echo ‘file dwc3-msm.c +p’ > /d/dynamic_debug/control
echo ‘file phy-msm-snps-hs.c +p’ > /d/dynamic_debug/control
echo ‘file phy-msm-qmp.c +p’ > /d/dynamic_debug/control
echo ‘file hub.c +p’ > /d/dynamic_debug/control

到了这里,关于Android Qcom USB Driver学习(十四)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 我的NPI项目之Android USB 系列(一) - USB的发展历史

    和USB应该是老朋友了,从2011年接触Android开发开始,就天天和USB打交道了。那时候还有不对称扁头的usb/方口的usb,直到如今的防反插的type-C。 但是,一直有一个不是很清楚的问题萦绕在心头,那就是。先有USB协议还是先有USB connector定义? 什么USB1.0,USB2.0,USB3.0 , USB PD, 等

    2024年02月20日
    浏览(41)
  • RK3588平台开发系列讲解(USB篇)Linux Android USB软件架构

    平台 内核版本 安卓版本 RK3588 Linux 5.10 Android 12

    2024年02月09日
    浏览(55)
  • 【Android从零单排系列十四】《Android视图控件——RatingBar》

    目录 前言 一 RatingBar基本介绍 二 RatingBar使用方法 三 RatingBar常用属性方法 四 总结 小伙伴们,在上文中我们介绍了Android视图组件ProgressBar,本文我们继续盘点,介绍一下视图控件的RatingBar。 RatingBar是Android平台上的一个UI组件,用于让用户通过评级操作选择分数或等级。 R

    2024年02月12日
    浏览(39)
  • 【Android从零单排系列四十四】《聊一下Android数据权限permission》

    目录 前言 一.Android 数据权限基本介绍 二 Android 权限分类 三 Android 权限清单 四 Android 动态申请权限DEMO 小伙伴们,在前面的几篇文章中,我们谈到了Android开发中的几种数据存储方式及数据持久化,本文我们介绍下Android开发中的另一部分内容,权限管理。 在Android中,权限管

    2024年02月12日
    浏览(75)
  • 【Android车载系列】第8章 车载通信-USB协议代码实现

      上一篇已经简单介绍了USB协议的相关知识,其中的描述符较为重要,描述符成功返回,USB通信已经成功了一大半,具体描述符的知识点可以翻阅上一篇来了解。下面我们来看一下USB协议在的分层。   USB协议用的地方非常多,比如U盘、麦克风、充电器等等。其中传输、

    2023年04月08日
    浏览(55)
  • STM32 从入门到精通系列讲解 - 总目录

    👦 作者介绍:Bazinga bingo,专注C语言应用硬核干货分享,潜心修炼,虚心学习,立志做嵌入式相关赛道的Top。 📕 本文收录于《STM32开发》专栏,包含STM32内部模块介绍、片内资源开发、不同通信总线应用、屏幕显示等功能性开发。每篇文章包含相关知识点、代码编程详解以

    2024年02月10日
    浏览(41)
  • 学习Android的第十四天

    目录 Android DatePicker 日期选择器 DatePicker 属性 和 事件 DatePicker 事件 获得 DatePicker 的值 Android TimePicker 时间选择器 TimePicker 属性 TimePicker 事件 获得 TimePicker 的值 Android CalendarView 日历视图 CalendarView 属性 CalendarView 事件 获得 CalendarView 的值 在Android中,DatePicker是一个用户界面组件

    2024年02月21日
    浏览(50)
  • 【文章学习系列之模型】Informer

    《Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting》是2021年发表于AAAI的一篇论文。常规自注意机制和Transformer模型已达性能瓶颈,作者尝试寻找新的方法来提高Transformer模型的性能,使其在具备更高效计算、内存和架构能力的同时,又能拥有更优异的预测能力。

    2023年04月26日
    浏览(48)
  • 【vim 学习系列文章 5 - cscope 过滤掉某些目录】

    上篇文章:【vim 学习系列文章 4 - vim与系统剪切板之间的交互】 下篇文章:【vim 学习系列文章 6 – vim 如何从上次退出的位置打开文件】 第一步 创建自己的 cscope 脚本 ~/.local/bin/cscope.sh ,如下: 我的这个脚本首先去区分当前执行 cscope 命令的目录是 rt-thread 目录还是 linux 目

    2024年02月12日
    浏览(84)
  • 【vim 学习系列文章 18 -- 选中行前后增加两行】

    请阅读 【嵌入式开发学习必备专栏 之 Vim】 为了在 Vim 中实现这个功能,需要定义一个 Vimscript 函数,该函数能够在当前选中的行(Visual 模式下)的最前面一行和最后一行增加空白行。然后,可以为这个函数创建一个快捷键映射,以便在 Visual 模式下快速使用。 以下是如何步

    2024年04月13日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包