Aprendizaje del controlador USB Android Qcom (14)

Enlaces al catálogo general de esta serie de artículos e introducciones a cada parte: Android Qcom USB Driver Learning (Zero)

Sabiendo qué es el gadget dwc3 udc hcd xhci, Chatgpt casi me sorprendió, parece saber cuáles son estas funciones.

El dispositivo UDC

UDC: (Controlador de dispositivo USB) se utiliza para administrar y controlar la comunicación entre el dispositivo USB y el host.
Gadget: Android implementa adb, mtp (protocolo de transferencia de medios de protocolo de transferencia de medios), almacenamiento masivo, etc. en esta capa.

El USB inicial solo admitía un solo dispositivo de gadget, y el escenario de uso era relativamente simple. Más tarde, se agregó el marco compuesto para admitir dispositivos de gadget con múltiples funciones. El enlace de múltiples funciones se completa en el kernel. Si necesita modificarlo , necesita modificar el kernel. , inflexible e inconveniente. La versión Linux3.11 presenta configuraciones de dispositivos USB basadas en configuraciones.
usb gadget configfs vuelve a implementar la capa de dispositivo compuesto, que puede configurar y combinar las funciones del núcleo en el espacio del usuario, y formar dispositivos compuestos USB de manera flexible, lo que mejora en gran medida la eficiencia del trabajo.
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 bus-Linux kernel USB3.0 control de dispositivo Análisis de configuraciones de dispositivos USB del dispositivo compuesto del dispositivo

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: (Controlador de controlador de host) es el controlador de controlador de host, que es una abstracción del hardware del controlador de host.
XHCI: (interfaz de controlador de host extensible) también es un controlador de controlador de host. XHIC se basa en USB3.0 y es compatible con versiones anteriores. Integra dos roothubs, uno correspondiente a usb2.0 (main_hcd) y otro correspondiente a 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;
				...
				...
				...
			};

Registro de dispositivo concentrador raíz (3)
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: (Controlador DesignWare USB 3.0) En el sistema Android, dwc3 generalmente se usa como controlador de host USB3.0 para trabajar con el controlador XHCI para controlar la comunicación entre el dispositivo USB3.0 y el host. Al mismo tiempo, dwc3 también se puede usar junto con el controlador Gadget para convertir el dispositivo Linux en un dispositivo USB y realizar la comunicación entre el dispositivo y el host.
Cuando se inicializa el controlador dwc3, el controlador se establecerá en el modo USB_DR_MODE_OTG, y se llamará a las funciones dwc3_host_init y dwc3_gadget_init para inicializar los recursos requeridos por el modo de host y el modo de dispositivo. Luego, el controlador puede cambiar dinámicamente al modo de host y al dispositivo. modo.

                  ->   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 Enviar difusión

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 se registra para monitorear los cambios de estado del usb y aceptar transmisiones

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);

Supongo que te gusta

Origin blog.csdn.net/qq_40405527/article/details/131197540
Recomendado
Clasificación