- 博客(77)
- 收藏
- 关注
原创 USB HOST DWC3 初始化
如果dr_mode为device,则初始化gadget。如果dr_mode为host,需要初始化xHCI驱动。在dwc3_host_init函数的最后调用platform_device_add(xhci)添加platform device(xhci-hcd),用于匹配xHCI driver(xHCI driver为platform driver),参照第3节。
2024-06-04 19:20:47 1386
原创 dwc3 DR_MODE 处理初始化 OTG gadget
>usb_add_function //配置 usb_function config 将function 添加到config->function上,->usb_get_function //调用usb_function_register注册的alloc_func接口,获取usb_function。将usb_composite_driver 的gadge_driver->pending 添加到gadget_driver_pending_list。set vbus 为false。
2024-05-29 14:32:28 1200
原创 usb 的event 和 io 信息的enqueue & deuqueue
dpdk在ip分片的实现中,采用了一种称作零拷贝的技术。而这种实现方式的底层,正是由scatter-gather DMA支撑的。dpdk的分片包采用了链式管理,同一个数据包的数据,分散存储在不连续的块中(mbuf结构)。传统的block DMA 一次只能传输物理上连续的一个块的数据, 完成传输后发起中断。而scatter-gather DMA允许一次传输多个物理上不连续的块,完成传输后只发起一次中断。这样做的好处是直观的,大大减少了中断的次数,提高了数据传输的效率。
2024-05-24 11:25:07 875
原创 usb enqueue dequeue
该函数会根据DMA缓冲区的使用形式做不同的处理,若DMA支持Scatter-gather,则调用dwc3_prepare_one_trb_sg函数,否则调用dwc3_prepare_one_trb_linear函数,最终都是通过dwc3_prepare_one_trb将TRB和request绑定。端点是否忙碌通过DWC3_EP_BUSY标志判断。usb_ep_queue向非端点0提交USB请求的过程如下图所示,最终通过__dwc3_gadget_ep_queue函数提交。
2024-05-22 16:28:03 1029
转载 pci 总线注册& pcie 设备枚举
这个ops 一般实在pci_mcfg_match_quirks 中根据bios传递过来的mcfg_oem_id/mcfg_oem_table_id/mcfg_oem_revision 来决定。1. 设备的扫描从pci_scan_root_bus_bridge开始,首先需要先向系统注册一个host bridge,在注册的过程中需要创建一个root bus,也就是bus 0,在pci_register_host_bridge函数中,主要是一系列的初始化和注册工作,此外还为总线分配资源,包括地址空间等;
2024-05-09 19:14:17 183
转载 VirtIO实现原理——virtblk设备初始化
传统磁盘因其工作原理随机访问比顺序访问性能低很多,内核块设备IO系统设计之初针对这种情况的主要优化手段是缓存用户态IO请求并尽可能合并,保证IO请求顺序访问磁盘。在实现时设计单队列存储用户态对块设备的IO请求,一把锁保护该队列上的IO请求数据结构。传统磁盘IO性能瓶颈在于硬件,跨分区访问,随机访问的速度远远没法和磁盘软件栈的处理速度匹配。
2024-05-08 10:51:18 402
原创 NVME Doorbell 寄存器& 数据请求时doorbell 处理
3.NVMe寄存器配置3.1 寄存器定义NVMe寄存器主要分为两部分,一部分定义了Controller整体属性,一部分用来存放每组队列的头尾DB寄存器。CAP——控制器能力,定义了内存页大小的最大最小值、支持的I/O指令集、DB寄存器步长、等待时间界限、仲裁机制、队列是否物理上连续、队列大小;VS——版本号,定义了控制器实现NVMe协议的版本号;INTMS——中断掩码,每个bit对应一个中断向量,使用MSI-X中断时,此寄存器无效;
2024-05-07 21:34:10 772
转载 NVME 初始化驱动分析&NVMe SQ/CQ/DB
SSD在取指的时候,是偷偷进行的,Host对此毫不知情。对一个CQ来说,刚好相反,生产者是SSD,因为它往CQ的Tail写入命令完成信息,消费者则是Host,它从CQ的Head取出命令完成信息。之后,nvmeq->irqname表示的是注册中断时的名字,从nvme%dq%d可以看到,就是最后生成的nvme0q0和nvme0q1,一个是给admin queue的,一个是给io queue的。SQ与CQ的关系,可以是一对一的关系,也可以是多对一的关系,但不管怎样,他们是成对的:有因就有果,有SQ就必然有CQ。
2024-05-07 18:05:00 177
转载 设备穿透之IOMMU分组
iommu_map会调用domain->ops->map即调用的struct iommu_ops arm_smmu_ops中定义的.map函数,即arm_smmu_map。arm下调用的就是arm_smmu_device_group,然后根据设备是否是PCI,分别调用generic_device_group或pci_device_group。如在intel下这里的add_device调动的就是intel_iommu_add_device,在arm下调用的就是arm_smmu_add_device。
2024-04-09 18:24:43 632
原创 Ais client LA8295 camx &KMD enqueue & dequeue
初始化mapping_info的值,将mapping_info 添加到。获取dma-buf,通过dma-buf 获取对应设备的sg物理地址。
2024-04-07 11:13:17 1127
转载 高通camera camx & kmd驱动架构
参考文档:第1讲 Camera KMD ISP子系统课程介绍|极客笔记CPAS(Camera Peripherals and Support)CDM(Camera Data Mover)TFE(Thin Front End)IFE(Image Front End)OPE(Offline Processing Engine)BPS(Bayer Processing Segment)SFE(Sensor Front End)LRME(Low Resolution Motion Estimation)CSID(C
2024-04-07 10:33:18 957
转载 ION to SMMU
ops->map_sg()回调函数指向iommu_dma_map_sg()函数,ops在drivers/iommu/dma-iommu.c文件中初始化为iommu_dma_ops;iommu_domain->ops指向&arm_smmu_ops,初始化流程为: arm_smmu_add_device ----> iommu_group_get_for_dev ----> __iommu_domain_alloc ----> domain->ops = bus->iommu_ops。在ion.c中初始化。
2024-03-08 15:26:14 137
原创 Autochip rtos videoin enqueue&dequeue
初始化mipi 获取分辨率分配buff。初始创建mipi 初始化线程。
2024-02-22 20:42:07 639
原创 autochip RVC
发送RVC_IPC_KEY_ARM2_NOTIFY给arm1 ap 侧。dtsi 中配置的gpio 用于触发RVC。触发倒车eBCStartEvent。
2024-02-04 14:56:36 486
原创 autochip videoin 驱动
/分配流式DMA空间地址 p_dma_buf->dma_address p_dma_buf->y_virt。分配流式DMA空间地址 p_dma_buf->dma_address p_dma_buf->y_virt。调用mipi_buffer_done_handler将buf_info 插入到vis_list_buf。调用mipi_buffer_request从vis_list_buf 获取 buf_info。将buf 插入到vis_output_hal[ch_id].vis_list_buf。
2024-01-18 18:01:40 931
原创 8051 autochip camera 代码分析
根据VideoinDevice channel port配置DevStaticInfo 将info.devNameStr 与/dev/videox 绑定。根据获取驱动的图像的format info.devConfigInfo.input_fmt配置camera的分辨率。解析atc_camera_config.xml camera 的mipi channel StreamNum。info.devSrcFmtMZIdx 与metazone的format flag绑定。初始化camera 的分辨率和帧率。
2023-12-29 18:26:54 447
转载 V4L2框架解析
在操作之前,还有一个准备工作需要做,那就是需要找到哪些是我们所需要的设备,而它的设备节点是什么,此时便可以通过打开media设备节点,并且通过ioctl注入MEDIA_IOC_ENUM_ENTITIES参数来获取v4l2_device下的video设备节点,该操作会调用到内核中的media_device_ioctl方法,而之后根据传入的命令,进而调用到media_device_enum_entities方法来枚举所有的设备。
2023-12-22 17:22:06 194
转载 virtio over MMIO
采用PCI总线实现的好处首先是通用,其次可以具备PCI设备的很多优势,如热插拔,最后如果我们使用物理设备实现virtio也是可以采PCI总线的,换句话说虚拟机内部感知不到这个virtio设备是一个虚拟设备还是一个物理设备。换句话说,virtio协议可以基于多种不同的总线协议来实现。虚拟化场景中,主要采用PCI总线协议和MMIO总线协议:采用PCI总线协议的virtio设备叫virtio-pci设备,它可以支持virtio设备的热插拔特性(基于PCI总线的设备热插拔机制),并可应用于真实物理外设;
2023-12-21 16:03:44 343
原创 hab_virtio hypervisor 虚拟化
获取数据给LA 进行处理完成42 {4748 while (!p->stop) {//等到msg_list不为空 表示qnx 有消息发送到LA侧51!5864 //调用hab_msg_recv接收消息将msg 挂到rx_list75 }7679 }8082 }86 }
2023-12-20 20:57:35 1590
原创 Qnx wfd_be & wfd_fe Android 通讯
在android 侧和 qnx 侧都指定mmid 使用创建通讯channel使用user_os_utils_send_recv完成消息的发送和接收qnx channel_map配置linux 中的配置virtio_devicehab 中配置的 mmid信息。
2023-12-20 14:36:44 1269
原创 Hypervisor Display架构
7,根据数据包中的命令类型调用不同的openwfd接口,需要注意的是,这里的接口是做了一层转换的,举个例子wfdEnumerateDevices_Host,这个接口会进行转换之后真正调用wfdEnumerateDevices函数。4,libdrm库调用open/ioctl等函数会经过lib_drm_fe库的转接,当然lib_drm_fe会做很多其他适配的工作。5,lib_drm_fe会调用内核HGSL驱动中的hab通信接口与QNX侧的wfd_be服务进行通信。
2023-12-19 16:33:18 1628
原创 HQX System Performance Troubleshooting Overview
【代码】HQX System Performance Troubleshooting Overview。
2023-12-19 16:19:39 461
原创 hypervisor display显卡节点card0生成过程
3,驱动加载时,msm-cfg模块会先加载,然后带起msm-hyp-legacy模块,本质上他们是一个模块,目的是创建android系统需要的drm设备card0 和renderD128,驱动实现中,这两个节点只提供非常有限的文件操作功能,比如open/close,ioctl则几乎不实现。1,前面提到的需要分析的代码中,其实只有红框部分代码有用(msm-cfg&msm-hyp-legacy),绿框中的代码在内核驱动加载的时候只会运行register,而根本不会执行probe函数。
2023-12-18 20:38:44 813
原创 HQX Customization Guide
Filepp sdm-host_la.dts target/filesets/dtsi/8540.dtsi 预处理生成host.dts dtc 编译生成host.dtb。最后还会反编译生成apps/qnx_ap/target/hypervisor/host/fdt_config/dtb/out/merged_host.dts。load linux-la.img 加载dtb。在vmm_service中进行启动 qvm。qnx 启动qvm cmdline 配置。方便确认配置信息是否正确生成。
2023-12-05 20:09:05 665
原创 qnx hypervisor load qvm
/解析dts 获取node qcom_gvms参考博客:https://blog.csdn.net/liaochaoyun/article/details/127427719。
2023-12-05 19:59:13 869
原创 Qnx boot workflow
使用apps/qnx_ap/target/hypervisor/host/startupmgr/src/script.c。apps/qnx_ap/target/hypervisor/host/startupmgr/8540_la 目录不存在。create_variant_images.sh log输出。startupmgr 调用时机。编译后生成的startup脚本。
2023-12-05 19:41:24 1605
转载 Android Codec2框架分析
转载:Codec2.0在Android12需要进行对接,本文以AOSP源码分析,简单分析其运行逻辑,具体代码可参考进行查阅。Codec2的Android架构可如下图所示:其中Framework层要使用Codec2可通过MediaCodec或者MediaPlayer(使用NuPlayer),Omx在Android12后已弃用,Codec层可分为Android原生的软件编解码和硬件编解码,本文只涉及Android原生代码。
2023-09-19 11:11:36 3136 3
原创 SA8650 camx pipeline node xml 配置信息
调用各类平台的cdk_qcx/oem/qcom/chiusecase/(platform)/chxusecaseselector.cpp。DefaultMatchingUsecaseSelection根据pStreamConfig的分辨率 、格式 operation_mode选择对应支持的usecase。在UsecaseAuto::Initialize 解析UsecaseAuto_pipelines是初始化获取的。2)、初始化pPipeline->m_pPipelineName = pName;
2023-09-09 14:46:46 1877 1
原创 SA8650 camera UsecaseId UsecaseAuto
4)、QHDR(Quad HDR,四像素HDR)2)、Staggered HDR 行交织 HD。解析ChiNode 中的node info 信息。1)、采用三曝光实现实时HDR预览。3)、MFHDR 多帧 HDR。
2023-09-09 10:46:46 928
原创 Camera 信号波形状态及同步方式
在这种方式下,主平台连接解串器(Deserializer)和串行器(Serializer)是不可行的。只能将主平台直接连接四颗 Sensor ,选择一个 Sensor 作为主 Sensor (master)产生帧同步信号 (FrameSync)传递给剩下的三颗从 Sensor (slave),此时主从两种 Sensor 的配置不同。解串器产生帧同步信号 (FrameSync)传递给串行器,再传递给 Sensor,此时四颗 Sensor 的配置均为 slave 模式。方式一:解串器发出同步信号。
2023-09-08 16:44:18 1146
原创 SM8650 qcxserver.c STRM_Initialize
/初始化SensorLibDeviceConfig_t中解串器GPIO的配置信息。//GPTP_ENABLE_KEY未进行配置不会初始化gptpInit。//获取xml中的camera 对应的解串器的i2c num配置。//获取GPTP_ENABLE_KEY的value。//配置解串器的index rang 0-3。//匹配解串器型号配置 解串器地址mode。//配置解串器numdevices id。//调用解串器open函数接口进行初始化。//配置devIdx解串器信息。
2023-08-08 22:26:21 1048 2
原创 SA8650 camera messagedispatcher
通过senderIpcHndl发送pClientCtxt->senderQ.hQueue 的msg 信息。初始化cmdthread。
2023-08-08 21:57:49 381
原创 SA8450 camera 源码分析
/创建IEF event pCtxt->hEventQueue 事件队列和中断队列pCtxt->hISTQueue。注册中断回调函数VFEProcessIST CSIDProcessIST。创建四个队列进行图像数据的数据获取。
2023-08-08 21:23:16 376
原创 ret2shellcode 的泄露puts@got表
现在rip在main+4处没执行puts,执行puts 后可以看到puts_got=> 0X601018里保存的是0X7FFDAA4E5430,可以使用ni si 进行调试看是否前后值有变化。手动设置栈上的值 发现 pop_rdi_ret设置的值 变换为0x4006f3 =》0x7fff004006f3(原因不明)发现read@got.pltb保存了read函数的blic中的地址。call read—> read的plt表 —>read的got表。jmp到的其实这是plt表对应函数的got表。
2022-10-08 23:25:14 1149
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人