【SA8295P 源码分析】00 - 系列文章链接汇总 - 持续更新中
- 2023年8月20日 Note Update:
有些粉丝看我有些内容写的比较深入,以为我是高通负责相应模块的内部人员,
澄清一下,我只是一个在做基于SA8295P
芯片项目的BSP
开发工程师,专栏参考代码是原生SA8295P
基线代码。
.
本专栏主要目的是:利用工作之外的时间去深入代码 分析底层的代码实现原理,来提高自身的技术能力。
实际工作中,有些人可能只是一个螺丝钉的角色,只对当前做的事精通,但其他模块领域一窍不通;
有些人,可能只是会调会配,但为什么要这样配这样调,可能就说不太清楚了。
这也是我想去解决的问题,兼顾知识广度和深度,会配,会调,也知道为什么要这样配这样调。
简单来说就是,我希望自已目前做的事,通过我自身的努力, 做到懂原理懂流程懂代码,而不是简单的代码搬运工。
要想做到这个程度,肯定很难,但我一定会努力,慢慢学习,总结,以更新博客。
.
本专栏文章内容主要是个人工作之外的自我学习总结分享,不会也不敢泄露公司相关的所有信息,不会也不敢泄露高通的代码文档!!!。
.
本专栏介绍如下:
【高通原生代码版本】:SA8295p-HQX-4-2-4-0_HLOS_dev_qnx.tar.gz
,SA8295_AU_LINUX_ANDROID_LA.AU.1.4.8.R1.10.00.00.1083.005
【文章类型】:晚上下班后在家、周末在家分析代码自学所产出的自学总结文档;协助粉丝兄弟咨询的问题调试分析总结
【涉及领域】:除Audio
外的其他所有BSP
模块(Audio
我也有相关的基础,但目前工作不会涉及,所以优先级放后)
【广度预期】:按由广到精的思路,先把 SA8295 各个模块做到满足工作需求,各模块做到会配、会调、会分析。
【深度预期】:精力有限,不可能所有模块都精通,目前先侧重三方面:系统启动流程 > 屏/TP > 摄像头,其他的模块会调会配会分析就够了。
【专栏更新时间】:持续学习总结,持续更新(毕竟由广到精,想要对SA2895平台有一定的了解,得持续学习,不是一时半会就能达成的)
.
老规矩,大家有啥遇到的问题,或者有哪个方面想了解的,也可以私信给我,如果我懂的且有时间的话,可以协助一起分析下。
私信时请说明:问题详细描述,预期现象,当前现象,当前分析进展 及 相关log
。
要详细描述!!!字多点,不然我还得猜,还得反复询问各种信息?反复询问太耗费时间了,谢谢
汇总链接:
《【SA8295P 源码分析】系列文章链接汇总》
《【SA8295P 源码分析】00 - 系列文章链接汇总》
本系列正文链接如下:
一、分区、下载、GPIO等杂项相关
源码获取、编译命令、及镜像相关文章
- 《【SA8295P 源码分析】83 - SA8295P HQNX + Android 完整源代码下载方法介绍》
- 《【SA8295P 源码分析】87 - SA8295P HQNX + Android 编译环境搭建指导》
- 《【SA8295P 源码分析】43 - Android 和 QNX 侧的编译命令介绍(答疑)》
- 《【SA8295P 源码分析】41 - SA8295所有镜像位置、拷贝脚本、生成QFIL包 及 Fastboot 下载命令介绍》
- 《【SA8295P 源码分析】45 - 部分镜像解包方法详解:boot_la、boot、vendor_boot、dtb、NON-HLOS、super、persist、metadata、userdata》
- 《【SA8295P 源码分析】02 - SA8295P 的 LUN 及 分区表 配置详解》
- 《【SA8295P 源码分析】52 - 答疑之 QNX 创建镜像、Android定制修改selinux权限,user版本采用enforcing,userdebug版本permissive》
- 《【SA8295P 源码分析】60 - QNX Host 如何新增 android_test 分区给 Android GVM 挂载使用》
QNX GPIO 配置介绍:
Android GVM Kernel 内核编译过程分析:
二、开机启动流程代码分析
系统开机流程 理论分析系列:
- 《【SA8295P 源码分析】01 - SA8295P 芯片介绍》
- 【试读】《【SA8295P 源码分析】03 - SA8295P QNX Host 上电开机流程分析》
- 《【SA8295P 源码分析】04 - SA8295P QNX Host 上电开机过程中的各组件功能介绍》
- 《【SA8295P 源码分析】05 - SA8295P QNX Host 上电开机过程 进一步梳理(结合代码)》
系统开机流程 源码分析系列:
- 【试读】《【SA8295P 源码分析】06 - SA8295P XBL Loader 阶段 sbl1_main_ctl() 函数代码分析》
- 《【SA8295P 源码分析】07 - XBL Loader 解析 sbl1_config_table 规则分析》
- 《【SA8295P 源码分析】08 - XBL Loader 加载 SMSS、XBL Config、SHRM、CDT 、DDR、APDP、RamDump、OEM_MISC、AOP、QSEE过程分析》
- 《【SA8295P 源码分析】09 - XBL Loader 加载 QSEE、SEC、CPUCPFW、QHEE、APPSBL过程分析》
- 《【SA8295P 源码分析】53 - mifs.build.tmpl 脚本详解:启动QNX procnto-smp-instr微内核、启动QNX串口终端shell、加载解析并执行ifs2_la.img》
- 《【SA8295P 源码分析】54 - /ifs/bin/startupmgr 程序工作流程分析 及 script.c 介绍》
- 《【SA8295P 源码分析】55 - ifs2_la.img 镜像加载解析过程分析》
- 待更新:
(1)《【SA8295P 源码分析】VMM_Android 启动过程分析》
二、OpenWFD 显示屏模块
Display Bringup 配置及调试过程分析:
- 《【SA8295P 源码分析】10 - HQX Display(OpenWFD)qcdisplaycfg_ADP_STAR_LA.xml 配置文件解析》
- 《【SA8295P 源码分析】11 - HQX Display(OpenWFD)仪表屏、中控屏 Bringup 代码移植步骤》
- 《【SA8295P 源码分析】40 - OpenWFD 显示屏配置文件 graphics_ADP_STAR.conf 、qcdisplaycfg_ADP_STAR_LA.xml 的解析流程》
- 《【SA8295P 源码分析】56 - OpenWFD 显示驱动库 libDSI_MAX96789_0.so 调用及解析流程分析》
- 《【SA8295P 源码分析】57 - libDSI_MAX96789_0.so驱动库 之 QDI_Panel_Init 显示屏初始化函数 代码分析》
- 《【SA8295P 源码分析】58 - libDSI_MAX96789_0.so驱动库 之 QDI_Panel_SetPower上下电流程及QDI_Panel_GetInfo 获取显示屏信息等代码分析》
- 《【SA8295P 源码分析】70 - QAM8295P 原理图参考设计 之 DP、eDP 接口硬件原理分析》
- 《【SA8295P 源码分析】71 - QAM8295P 原理图参考设计 之 MIPI DSI 接口硬件原理分析》
- 《【SA8295P 源码分析】72 - WFD DP/eDP、MIPI DSI 显示屏软件代码该如何配置? 有什么差异?》
- 《【SA8295P 源码分析】73 - OpenWFD 显示驱动库 libDP2_COMMON.so 源码分析》
- 《【SA8295P 源码分析】59 - QNX如何 Dump 显示图像 之 surfacedump 功能 源码分析》
- 《【SA8295P 源码分析】61 - QNX如何 Dump 显示图像 之 echo surfacedump=n [m] > /dev/displaylog 命令代码调用流程分析》
- 《【SA8295P 源码分析】64 - QNX 与 Android GVM 显示 Dump 图片方法汇总》
- 《【SA8295P 源码分析】12 - HQX Display(OpenWFD)调试命令介绍》
- 待更新:
(1)《【SA8295P 源码分析】Android GVM 如何将图片给到QNX Host Disply 驱动显示》
OpenWFD Server 服务 源码分析:
- 《【SA8295P 源码分析】37 - OpenWFD Server 启动流程 之 openwfd_server.c main()函数源码分析》
- 《【SA8295P 源码分析】38 - OpenWFD Server 启动流程 之 WFD_ClientMgr 初始化 之 WFD Device 设备初始化源码分析》
- 《【SA8295P 源码分析】39 - OpenWFD Server 启动流程 之 WFD_ClientMgr 初始化 之 WFD Port 端口初始化源码分析》
- 《【SA8295P 源码分析】42 - OpenWFD Server 启动流程 之 WFD_ClientMgr 初始化 之 Pipelines、ClientContexts 初始化源码分析》
- 《【SA8295P 源码分析】46 - OpenWFD Server 启动流程 之 /dev/openwfd_server_0 管道事务源码分析》
- 《【SA8295P 源码分析】50 - OpenWFD Server 启动流程 之 wfd_server_tpp 线程池源码分析》
三、Touch Panel 触摸屏模块
TP 触摸点坐标数据,上报到 Android 整个流程分三步:
- QNX 侧 TouchScreen 驱动获取坐标点上报给到 Android 内核层
《【SA8295P 源码分析】15 - QNX侧 TouchScreen Panel (TP)触摸屏 Bringup 流程 及 源码分析》
《【SA8295P 源码分析】16 - QNX侧 TouchScreen Panel (TP)线程函数 tp_recv_thread() 源码分析》- Android 内核解析出数据,存在 /dev/input/event0 对应的 buffer[] 环形队列中,待用户空间读取节点时,通过 copy_to_user 给到用户空间
《【SA8295P 源码分析】66 - Android 侧内核层 TouchScreen Panel(TP)触摸屏驱动生成 /dev/input/event0 源码分析》- Android 用户层输入子系统管理并获取到 /dev/input/event0 的数据,此时坐标点数据到达 Android 上层用户空间
《【SA8295P 源码分析】67 - Android 侧 模拟输入设备上报 input 事件 之 input 模拟点击坐标 实现源码分析 adb shell input tap 100 600》
《【SA8295P 源码分析】68 - Android 侧用户层 输入子系统获取 /dev/input/event0 节点数据 代码流程分析》
四、QUPv3 及 QNX Host透传配置
QUPv3 及 QNX Host透传配置 相关文章
五、Camera 摄像头模块(当前正在更新中…)
QNX AIS Camera Bringup 源码分析系列文章:
QNX libais_max96722.so 库源码分析系列文章:
- 《【SA8295P 源码分析】93 - QNX libais_max96722.so (1) 之 CameraSensorDevice_Open_max96722 初始化MAX96722上下文源码分析》
- 《【SA8295P 源码分析】94 - QNX libais_max96722.so (2) 之 max96722_sensor_init_setting()函数 MAX96722芯片初始化 源码分析》
- 《【SA8295P 源码分析】95 - QNX libais_max96722.so (3) 之 max96722_sensor_start_stream() StartStream开始预览 源码分析》
QNX AIS Camera qcarcam_test 可执行程序分析系列文章:
- 《【SA8295P 源码分析】88 - QNX AIS Camera qcarcam_test Dump摄像头图片过程指导、qcarcam_test 使用方法介绍》
- 《【SA8295P 源码分析】89 - QNX AIS Camera qcarcam_test 可执行程序 main() 函数 源代码流程分析》
- 《【SA8295P 源码分析】90 - QNX AIS qcarcam_test 可执行程序 qcarcam_test_setup_input_ctxt_thread函数 上下文初始化过程分析》
- 《【SA8295P 源码分析】91 - QNX AIS qcarcam_test 可执行程序 process_cb_event_thread 函数 Camera Event事件处理过程分析》
- 《【SA8295P 源码分析】92 - QNX AIS qcarcam_test 可执行程序 qcarcam_test_post_to_display 摄像头 Display显示 及 Dump流程 分析》
ais_server 服务启动过程分析:
- 《【SA8295P 源码分析】77 - QNX Camera 之 ais_server 服务 源码分析》
- AIS Camera CCI_I2C 初始化函数: CameraSensorI2C_Init(), 这个不急,放最后分析
- 《【SA8295P 源码分析】78 - AIS Camera PM Event 电源事件处理函数 CameraPlatformPowerInit() 源码分析》
AIS Camera PM Event 电源事件处理函数:CameraPlatformPowerInit()- 《【SA8295P 源码分析】79 - AIS Camera Event 事件处理函数 AisEngine::EventHandler() 源码分析》
AIS Camera Event 事件处理函数:AisEngine::EventHandler()
主要工作:
循环等待 pEngine->m_eventHandlerSignal 事件,然后调用 AisEngine::ProcessEvent 处理 event 事件- 《【SA8295P 源码分析】80 - AIS Camera libais_max96722.so 驱动库加载函数 之 CameraDeviceManager::Initialize() 源码分析》
AIS Camera libais_max96722.so 驱动加载初始化函数:CameraDeviceManager::CreateInstance()
主要工作:
(1) 注册Camera IFE/IFELITE/CCIPHY等设备,遍历CameraConfigSA8295.c中配置的摄像头信息,加载摄像头驱动库,如 libais_max96722.so
(2) 打开 libais_max96722.so库,将库文件描述符保存在registeredDeviceInstances[]中,将Camera 设备注册到registeredDevices[]数组中- 《【SA8295P 源码分析】81 - AIS Camera Device 设备初始化 之 AisInputConfigurer::CreateInstance() 源码分析》
AisInputConfigurer 模块初始化,接着调用AisInputConfigurer::GlobalConfig() 进行配置
主要工作:
(1) 检查 Camera Device 及 其名下的 Camera Sensors 是否可用
(2) 并获取所有信息保存在m_InputDevices[ ] 和 m_InputMappingTable[ ] 数组中备用
(3) 调用 libais_max96712.so库 提供的 CameraSensorDevice_Open_max96712 方法,创建相应的CameraSensorDevice对象,保存在 m_InputDevices[deviceID].hDevice 中- AisIFEConfigurer 模块初始化
《【SA8295P 源码分析】84 - AIS Camera Device 设备初始化 之 AisIFEConfigurer::CreateInstance 源码分析》- AisCSIConfigurer 模块初始化,接着调用AisCSIConfigurer::GlobalConfig() 、AisCSIConfigurer::GlobalStart()进行配置
《【SA8295P 源码分析】85 - AIS Camera Device 设备初始化 之 AisCSIConfigurer::CreateInstance 源码分析》- AisProcChainManager 模块初始化
《【SA8295P 源码分析】86 - AIS Camera Device 设备初始化 之 AisProcChainManager 模块初始化源码分析》- AIS Camera Input 输入设备检测函数:AisInputConfigurer::GetInstance()->DetectAll()
- AIS Server 服务事件循环处理函数:ais_server_create_client_ctxt()
六、网络相关模块(NFS、VLAN、telnet)
NFS 相关文章:
WLAN 相关文章:
其他网络相关文章:
七、网络相关模块(Ethernet MAC)
QNX Ethernet MAC 驱动 源码分析:
- 《【SA8295P 源码分析】22 - QNX Ethernet MAC 驱动 之 emac_entry / emac_attach() 函数源码分析》
- 《【SA8295P 源码分析】23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解析》
- 《【SA8295P 源码分析】24 - QNX Ethernet MAC 驱动 之 emac_pm_sys_pow_mon_thread_hdlr() 系统电源管理线程源码分析》
- 《【SA8295P 源码分析】25 - QNX Ethernet MAC 驱动 之 emac_isr_thread_handler() 中断处理函数 源码分析》
- 《【SA8295P 源码分析】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler() 数据接收线程 源码分析》
- 《【SA8295P 源码分析】27 - QNX Ethernet MAC 驱动 之 emac_tx_thread_handler() 数据发送线程 源码分析》
- 《【SA8295P 源码分析】28 - QNX Ethernet MAC 驱动 之 emac_mdio_link_monitor_thrd() MDIO监控线程 源码分析》
- 《【SA8295P 源码分析】29 - QNX Ethernet MAC 驱动 之 emac_resmgr_init() 资源管理器线程 resource manager 线程 源码分析》
- 《【SA8295P 源码分析】30 - QNX Ethernet MAC 驱动 之 emac_powerup() 上电流程 源码分析》
- 《【SA8295P 源码分析】31 - QNX Ethernet MAC 驱动 之 ifnet 接口emac_init、emac_start、emac_ioctl 源码分析》
Phy Switch 调试笔记:
八、Security 安全策略(QNX secpol、Android SELinux)
安全策略相关:
- 《【SA8295P 源码分析】74 - QNX secpol 安全策略文件配置详解 及 secpol.bin 编译过程分析》
- 《【SA8295P 源码分析】75 - QNX GVM Secpol 安全策略文件 gvm_la.txt 内容分析解读》
- 待更新:
(1) QTD (QNX Trusted Disk) 配置研究
参考链接:https://www.qnx.com/developers/docs/7.0.0/com.qnx.doc.neutrino.sys_arch/topic/fsys_qtd.html
参考链接:https://www.qnx.com/developers/docs/7.0.0//index.html
参考链接:https://www.ctfiot.com/103091.html
.
(2) QVB (Qcom Verified Boot) 配置研究
参考文档:《80_NU861_1_N_Qualcomm_Android_Security_Feature_Ove.pdf》
九、Thermal 温控策略
Thermal 温控策略:
十、QNX 侧常用的调试命令
- 通过
qnx
进入fastboot
下载模式:reset -f
或 开机过程中串口下一直按Q
- 通过
qnx
串口进入Android GVM
的adb shell
环境:telnet 192.168.133.1
- 通过
Android GVM
的adb shell
环境 进入QNX shell
环境:busybox telnet 192.168.133.2
QNX
侧获取Android
开机log
:cat /dev/shmem/la_gvm.txt
QNX
杀死进程:slay xxxxx
,如slay vmm_service
QNX
重新可写挂载mnt
:mount -uw /mnt
QNX
侧启动log
路径:/dev/pdbg/qcore/bootlog
QNX
侧C
代码中运行 动态启动uart
:(void)system("devc-quipv3 -E -F -b9600 15");
- 查看
GPIO
状态:msmgpiotool dump
# msmgpiotool commands: dump info <gpio number> [tlmm]示例:获取 tlmm 的GPIO0 信息 msmgpiotool info 0 info <gpio number> lpass示例:获取 lpass 的GPIO0 信息 msmgpiotool info 0 lpass info <gpio number> ssc示例:获取 ssc 的GPIO0 信息 msmgpiotool info 0 ssc write <gpio number> <value>示例:写 GPIO0 输出1 msmgpiotool write 0 1 read <gpio>示例:读 GPIO0 电平 msmgpiotool read 0 ===> GPIO 0 is High rawread <gpio>示例:读 GPIO0 电平 msmgpiotool read 0 ===> 1 set-dir <gpio number> <value>配置 输出输出模式: [0] Input, [1] Output set-drive <gpio number> <value>配置 GPIO 驱动能力, drive strength = [n] * 2mA for n[0..15] set-pull <gpio number> <value>配置拉高拉低悬空: [0] No pull [1] Pull Down [2] Keeper [3] Pull Up set-func <gpio number> <value>配置引脚函数,GPIO模式无此功能 enable-irq <gpio number> <value>使能 IRQ 中断:[0] Enable [1] Disable clear-irq <gpio>清除 IRQ 状态 set-pol <gpio number> <value>配置 中断极性 [0] Inverted [1] Normal set-trigger <gpio number> <value>配置边沿触发还是电平触发: [0] Level [1] Edge# msmgpiotool dumpOFFSET GPIO IN OUT DIR DRIVE PULL ALT FUNCTION TARGET IRQ POL TRIG STS---------------------------------------------------------------------------------------------f100000 0 High Low Out 8 mA No pull 1 NONE 0 1 Level 0f101000 1 High Low Out 8 mA No pull 1 NONE 0 1 Level 0 ...... 省略 ......f1e2000 226 High Low In 2 mA Pull down 0 NONE 0 1 Level 0f1e3000 227 High Low In 2 mA Pull down 0 NONE 0 1 Level 0----------------------------------------LPASS TLMM GPIO Dump--------------------------------------- OFFSET LPASS GPIO IN OUT DIR DRIVE PULL ALT FUNCTION HYSTERISIS CTL MISC CFG--------------------------------------------------------------------------------------------------- 0x33c0000 0 Low Low Out 8 mA Pull down 0x2 Low 0x2 0x33c1000 1 Low Low Out 8 mA Pull down 0x2 Low 0x2 ...... 省略 ...... 0x33d1000 17 Low Low In 2 mA No pull 0x2 Low 0x0 0x33d2000 18 Low Low Out 8 mA Pull down 0x2 Low 0x0----------------------------------------SSC TLMM GPIO Dump--------------------------------------- OFFSET SSC GPIO IN OUT DIR DRIVE PULL ALT FUNCTION HYSTERISIS CTL MISC CFG------------------------------------------------------------------------------------------------- 0x2b40000 0 Low Low In 2 mA No pull 0x0 Low 0x0 0x2b41000 1 Low Low In 2 mA No pull 0x0 Low 0x0 ...... 省略 ...... 0x2b52000 18 Low Low In 2 mA No pull 0x0 Low 0x0 0x2b53000 19 Low Low In 2 mA No pull 0x0 Low 0x0
来源地址:https://blog.csdn.net/Ciellee/article/details/132392026