首页 > 其他分享 >Android Qcom USB Driver学习(九)

Android Qcom USB Driver学习(九)

时间:2024-08-25 18:48:11浏览次数:13  
标签:USB charger Driver TYPEC SSDEV Qcom Android TYPE usb

高通的某些平台将电源管理移植到了ADSP Subsystem, 分析一下其中比较关心的部分

Architecture

    —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —
    | Generic TypeC Drvier             PowerSupply Framework  |
	|  GlinkClient-UCSI                   GlinkClient-BM      |
	|               PMIC Glink(Linux kernel)                  |
    —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —
	|                  PMIC GLink(ADSP)                       |
	|     Charger Thread	                   BM Thread      |
	 —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —— —

BM    (Battery Manager)
SSDEV (Sink/Source devices)
BCS   (Battery Charging Status)
ICM   (Intelligent Charging Module)
APSD  (Automatic power source detection)
AICL  (automatic input current limiting)
UCSI  (USB Type-C Connector System Software Interface driver)

Charge Detection

不同于之前是先运行BC1.2再运行APSD,这里是直接运行APSD其中兼容BC1.2

BattMngrDevice_InitContext (既然ChgConfigData没有初始化 usb_connector_type,但检测的时候需要判断类型)
//CHARGER_CONFIG_DATA -> CHARGER_DETECTION_CONFIG_DATA usb_connector_type + NoofInputs 检测时有用
//charget_cfg.NoOfInputs = 2; (Input0  Type-C port or microUSB port + Input1  Wireless charging)

ssdev_initialize(0, (usb_connector_type == CONNECTOR_TYPE_MICRO_USB) ? SSDEV_MODULE_USB : SSDEV_MODULE_TYPEC);
ssdev_initialize(1, SSDEV_MODULE_WLS);

PmSchgAdcCmn2_GetUSBConnectorType(&usb_connector_type) (battmngrconfig_props.c CONNCfg定义的属性 0:microB 1:typec)
从这里我们可以得知,如果没有定义属性或者属性置为0,则默认是 SSDEV_MODULE_TYPEC,否则则需要通过PMIC内部来进行判断

charger初始化的时候通过BattMngr_Thread_Create创建了线程charger_main,
while的循环执行charger_events (CHARGER_EVENT_TYPE 包含CHARGER_EVENT_CHGTYPE_CHANGE 角色电压电流等)
charger_process_events
	charger_detection_event_handler
	    ssdev_detect_partner
		    SSDEV_MODULE_TYPEC ->  ssdev_typec_detect_partner
			SSDEV_MODULE_USB   ->  ssdev_usb_detect_partner
			break
		charger_detection_evaluate_charger
			SSDEV_MODULE_TYPEC ->  charger_detection_evaluate_typec_charger
			break
			SSDEV_MODULE_USB   ->  charger_detection_evaluate_usb_charger
			break

SSDEV_PARTNER_TYPE
	SSDEV_PARTNER_SNK_USB_SDP  SSDEV_PARTNER_SNK_USB_OCP, SSDEV_PARTNER_SNK_USB_CDP,
	SSDEV_PARTNER_SNK_USB_DCP, SSDEV_PARTNER_SNK_USB_FLOAT,...

SSDEV_PARTNER_TYPE跟之前平台类似 Android Qcom USB Driver学习(二)

需要注意在SSDEV_MODULE_TYPEC中ssdev_typec_detect_partner 和 ssdev_usb_detect_partner之间是没有break的,
也就是说无论是Typec还是usb都要通过ssdev_usb_detect_partner来调用PmSchgUsb_GetApsdResultStatus (APSD算法兼容BC1.2)返回
UsbPartnerType (充电类型),并且在charger_detection_evaluate_charger中应用,只执行一个来进行Input Current Limit的配置,
charger_detection_evaluate_typec_charger与charger_detection_evaluate_usb_charger 中就有break,

那时什么情况下会去触发detect呢? 中断 BATTMNGR_INTERRUPT_TYPE

battmngr_plat_irq_schgp_qg_apsd_done
在APSD运行的结束的中断后charger_notify(CHARGER_EVENT_DETECTION_UPDATE)通知到Charger Thread
battmngr_plat_irq_schgp_qg_plug_in
在插入的时候会发送BATTMNGR_DRV_USB_PLUGIN_EVENT,再通过charger_notify通知到Charger Thread

那时什么情况下会去触发detect呢? 中断 BATTMNGR_INTERRUPT_TYPE

battmngr_plat_irq_schgp_qg_apsd_done
在APSD运行的结束的中断后charger_notify(CHARGER_EVENT_DETECTION_UPDATE)通知到Charger Thread
battmngr_plat_irq_schgp_qg_plug_in
在插入的时候会发送BATTMNGR_DRV_USB_PLUGIN_EVENT,再通过charger_notify通知到Charger Thread

Kernel communication with ADSP

Battery Charging

battery_chg_write -> pmic_glink_write + wait_for_completion_timeout(等待ADSP的ack)
pmic_glink_process_rx_data -> pmic_glink_tx 
处理数据并且回调给Kernel,返回响应,使得上面发送时的wait_for_completion_timeout等待结束
pmic_glink_rx_callback -> client->msg_cb
	battery_chg_callback -> handle_message -> completion ack

battery_dock_charger_notify_msg(通信的message由两部分组成)	
(1)PMIC Glink message header
#define MSG_OWNER_BC			32778   (kernel)
#define MSG_TYPE_REQ_RESP		1

req_msg.hdr.owner = MSG_OWNER_BC;
req_msg.hdr.type = MSG_TYPE_REQ_RESP;
req_msg.hdr.opcode = (opcode for battery charger)

(2)req_msg.value + req_msg.property_id


注意Kernle和ADSP定义的名称不同 
#define PMIC_GLINK_MSG_OWNER_CHARGER     32778  (ADSP)
#define PMIC_GLINK_MSG_TYPE_REQ_RESP      1

Type-C Role

Android Qcom USB Driver学习(一)

#define MSG_OWNER_UC			32779             (kernel)
#define PMIC_GLINK_MSG_OWNER_USB_TYPE_C  32779    (ADSP)

ucsi_acknowledge_connector_change 
    ucsi_qti_async_write -> ucsi_qti_glink_write -> pmic_glink_write
UCSI最终还是通过PMIC GLink的API来实现,并且同样会产生回调,会通过msg head中的owner来区分Client
pmic_glink_rx_callback->client->msg_cb
	ucsi_callback -> handle_ucsi_notify -> ucsi_connector_change


 typedef enum _PM_TYPEC_PORT_ROLE_TYPE                typedef enum _PM_TYPEC_EXIT_CONTROL_TYPE
{                                                     {
    TYPEC_PORT_ROLE_DRP,    //Source还是Sink由CC决定       TYPEC_EXIT_CONTROL_SNK,
    TYPEC_PORT_ROLE_SNK,    //Source 供电                  TYPEC_EXIT_CONTROL_SRC,
    TYPEC_PORT_ROLE_SRC,    //Sink接受供电            } PM_TYPEC_EXIT_CONTROL_TYPE;
    TYPEC_PORT_ROLE_DISABLE,
    TYPEC_PORT_ROLE_INVALID
} PM_TYPEC_PORT_ROLE_TYPE;


这个还是跟之前如果需要转变则需要kernel调用两个API(1)typec_set_data_role (2)usb_role_switch_set_role

enum typec_data_role {                               enum typec_role {
 	TYPEC_DEVICE,                                        TYPEC_SINK,
 	TYPEC_HOST,                                          TYPEC_SOURCE,
};       

Battery Status

Android uevent 电池电量上报机制

BM Thread -> battmngr_platform_charger_update
BattMngrPlatformFuncs.BattMngrPlat_Charger_Update_FuncPtr -> battmngr_plat_scpqchg_qbg_update_charger_power_supply
  将propery都存到到对应的属性中,例如usb_power_supply_properties
  pmic_glink_send_power_supply_notification (msg.notifcation == USB_POWER_SUPPLY_GET_REQ == BC_USB_STATUS_GET)
  pmic_glink_tx(msg.hdr.opcode = BATT_MNGR_NOTIFY_IND == BC_NOTIFY_IND)
  根据opcode在callback回kernel中调用handle_notification发生变化,再去将ADSP返回的值更新到powersupply properties
  最后还是调用到power_supply_changed就跟原先的上报流程一样了,通过uevent上报各上层的healthd

标签:USB,charger,Driver,TYPEC,SSDEV,Qcom,Android,TYPE,usb
From: https://www.cnblogs.com/linhaostudy/p/18379309

相关文章

  • 高德地图SDK Android版开发 8 覆盖物示例2动画
    高德地图SDKAndroid版开发8覆盖物示例2动画前言动画相关的类和接口帧动画MarkerOptionsAnimation动画Animation类及其子类AnimationTranslateAnimationRotateAnimationAlphaAnimationScaleAnimationAnimationSetMarker动画示例界面布局MapMarkAnimate类常量成员变......
  • 车载Android设备启动时间优化: 新手指南
    简介车载Android设备启动时间优化新手指南,共20个优化方向。涉及bsp、系统层、apk等。目录BSP相关:1.移除了Bootloader(U-Boot/LK等)和Linux内核中的调试命令,以节省初始化时间和镜像大小。出于调试和开发目的,Bootloader中的启动延迟以及Bootloader和Linux内核中......
  • Android fork 进程 process(init/Zygote/SystemServer)
    ##Android的init/Zygote/SystemServer Android手机先开机,init/Zygote/SystemServer,然后启动Framework,然后启动Launcher;【安装APP(PMS),】然后启动APP(AMS)。所有的Android应用进程都是有Zygote进程fork出来的。Android系统启动流程(一)解析init进程-http://blog.csdn.net/itach......
  • 计算机毕业设计django+vue基于Android的婚物语APP的设计与实现【开题+论文+程序】
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着移动互联网技术的飞速发展,智能手机已成为人们日常生活中不可或缺的一部分,特别是在婚嫁领域,移动应用以其便捷性、实时性和个性化服务的......
  • Android Content Provider最全面试题及参考答案(8万字长文)
    什么是ContentProvider?ContentProvider是Android系统中用于在不同应用程序之间共享数据的一种机制。它提供了一种统一的接口,使得不同的应用可以以标准的方式访问和操作特定类型的数据。ContentProvider就像是一个数据仓库的管理员,它负责管理数据的存储、检索、更新......
  • 基于Android的安全知识学习APP的设计与实现(论文+源码)_kaic
    基于Android的安全知识学习APP的设计与实现摘  要随着科技的进步,智能手机已经成为人们工作、学习和生活的必需品。基于Android系统的强大功能,使用Java语言、Linux操作系统,搭配AndroidStudio,并配备Android开发插件,最终实现了一款安全知识学习APP的开发,以便让用户能够轻松......
  • 基于Android的运动记录APP设计与实现(论文+源码)_kaic
      摘要随着人们生活水平和生活质量的提高,人们越来越关注自己的身体健康。而跑步成为人们最受欢迎的运动方式,运动软件可以在人们锻炼身体的时候提供极大的帮助。本文针对运动轨迹和计步,设计一款基于Android平台的运动软件。本系统通过使用百度鹰眼、重力传感器和数据库技术......
  • Android开发 - ServiceConnection 接口处理 Service 与客户端(如 Activity)之间的连接解
    什么是ServiceConnectionServiceConnection是一个用于处理Service与客户端(如Activity)之间连接的接口,它让客户端能够绑定到Service并与之进行交互。它定义了两个重要的回调方法,用于管理客户端与Service之间的连接。当客户端绑定到一个Service时,这些回调方法会被调用,允......
  • Android开发 - (适配器)Adapter类中(蓝牙适配器)BluetoothAdapter实现类解析
    什么是BluetoothAdapterBluetoothAdapter是一个重要的类,用于管理和操作蓝牙功能。它提供了与蓝牙设备进行交互的能力,它代表了本地蓝牙适配器的功能。简单来说,它是你与设备上的蓝牙硬件进行交互的接口。通过BluetoothAdapter,你可以控制蓝牙的开启和关闭,发现附近的蓝牙设备,管理......
  • Android开发 - IBinder 类与 Binder 类的关系解析
    IBinder类IBinder类说明:IBinder是一个接口,它是AndroidIPC机制的基础。它定义了一组用于进程间通信的基本操作,但不提供实际的实现。IBinder主要用于描述一个可以被远程调用的对象主要特点:接口定义:IBinder是一个接口,定义了如何进行进程间通信的基本方法,如trans......