- 博客(134)
- 收藏
- 关注
原创 【Audio开发二】Android原生音量曲线调整说明
客户方对于音量加减键从静音到最大音量十五个档位区域的音量变化趋势有定制化需求。对于安卓原生的音量曲线的调整,原生SDK里也默认提供了对应的安卓音量曲线配置文件提供用户进行定制化修改与应用验证。
2025-03-29 17:06:44
852
原创 【Audio开发一】android音频问题排查指南
1.2.1 对于杂音类问题,只需听pcm dump是否有杂音即可确认问题端发生在应用层,如果in.pcm已存在杂音,则问题可能存在于audio hal之前,如audio service、软件编解码器、或者音源本身存在杂音;如果控件没有差异,可在播放时,dump一下寄存器并作对比,将升级前后的寄存器dump上传到Aservice供进一步分析,如果没有差异,则需寄板子、上传原理图与位号图,进行进一步排查分析。功能异常的情况下,除了针对小系统的原理图设计进行检查,也需要针对外围电路,例如功放电路进行检查核对。
2025-03-29 16:39:09
914
原创 【Camera2 教程六】Camera2算法集成
总大小: Y 分量 + UV 分量 = (1280 * 720 + 1280 * 720 * (1/2) ) / 1024 / 1024 = 1.32。/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/mtk/hdr/ – Yuv 多帧算法。/vendor/mediatek/proprietary/hardware/mtkcam3/3rdparty/mtk/fb/ – Yuv 单帧算法。setRepeatingRequest() 是重复请求。
2025-03-15 12:26:30
66
原创 Linux内核USB2.0驱动框架分析--USB2.0主机host模式驱动看这一篇就够了
设备描述符是USB主机枚举USB设备申请的第1个描述符,每个设备有且仅有一个设备描述符,也就是大家以后看到的任何的USB设备都只有一个设备描述符数组,设备描述符的长度是18字节,下面我们来学习设备描述符数据结构,看看USB设备具有哪些特征,它的结构我们可以通过下面的表格来逐一了解。在USB Core中已经向总线注册了三个驱动(USB设备驱动、USB接口驱动、USB hub驱动),根据条件匹配到USB设备驱动,则去调用USB设备驱动的probe函数。所有的USB传输,都是从USB主机这方发起的;
2025-01-13 20:24:36
852
原创 Linux内核中Typec CC检测原理及主从模式切换原理
连接后,CC pin相连,DFP的CC pin会检测到UFP的下拉电阻Rd,说明连接上了,DFP就打开Vbus电源开关,输出电源给UFP。最终的目的是在插入后,能检测到CC1或CC2上的电压,进而判断是否翻转以及DFP的电流能力。就靠Rp的值,Rp的值不一样,CC pin检测到的电压就不一样,然后来控制DFP端执行哪种供电模式。含芯片的线缆也不是两根cc线,而是一根cc,一根Vconn,用来给线缆里的芯片供电(3.3V或5V),这时就cc端没有下拉电阻Rd,而是下拉电阻Ra,800-1200欧。
2024-12-27 19:27:39
1483
原创 Linux内核USB2.0驱动框架分析--USB包
每个包都由SOP(包起始域)、SYNC(同步域)、Packet Content(包内容)、EOP(包结束域)四部分组成,其中SOP、SYNC、EOP为所有包共有的域,Packet Content最为核心,不同类型的包由不同的Packet Content组成。
2024-11-23 16:26:09
698
原创 Linux内核USB2.0驱动框架分析--USB传输
控制读传输在初始设置阶段会发起一个SETUP事务,从这个SETUP事务我们可以知道是设备给主机传输数据,并且数据长度是255,这里把先控制传输理解到位,接着在数据阶段完成数据交换(因为是设备给主机传输数据,所以是数据阶段是IN事务),最后在状态信息阶段主机给设备发送一个OUT事务表明自己接收是否异常。在OUT和SETUP事务处理中,紧接在SETUP和OUT包后的是DATA包,DATA0和DATA1包是接替地发送的,在DATA包后面,设备将回应一个握手信号,(如果设备可以接受数据,就回应ACK包;
2024-11-23 15:00:48
767
原创 Linux内核USB2.0驱动框架分析--USB设备枚举过程
枚举是从USB设备读取一些信息的过程,这些信息包括设备的类型、如何进行通信等。主机通过获取这些信息,可以识别出设备并加载合适的驱动程序。调试USB设备时,枚举过程是非常重要的一环,只要枚举成功,就意味着设备已经能够被主机正确识别,并且大部分的工作已经完成。当有新设备连接到主机时,主机会发送一系列的请求给设备所挂载的hub。hub会建立起一条连接主机和设备之间的通信通道。然后,主机通过控制传输的方式,使用端点0(Endpoint0)对设备发送各种请求。设备在收到主机的请求后,会回复相应的信息,进行枚举操作
2024-11-09 12:03:16
1118
原创 Linux内核USB2.0驱动框架分析--设备描述符以及USB标准请求
Descriptor即描述符,是一个完整的数据结构,可以通过C语言等编程实现,并存储在USB设备中,用于描述一个USB设备的所有属性,USB主机是通过一系列命令来要求设备发送这些信息的。它的作用就是通过命令来给主机传递信息,从而让主机知道设备具有什么功能、属于哪一类设备、要占用多少带宽、使用哪类传输方式及数据量的大小,只有主机确定了这些信息之后,设备才能真正开始工作,所以**描述符也是十分重要的部分,要好好掌握
2024-11-08 20:56:59
1300
原创 Linux内核USB3.0驱动框架分析--USB Hub实现眼图信号输出方案
USB 2.0 SQ 的测试原理是,设置 USB 控制器的 Test Control 寄存器,使 USB 控制器进入 Test Packet Mode, USB 控制器就会持续产生并发送周期性的 Test Pattern。USB定义了6种眼图模板,其中定义在集线器TP2点或在USB设备(使用非束缚电缆)TP3点处的眼图模板,表示接收高速USB信号时所需的电压分辨力,如图2所示。眼图的测量参数不同于波形的测量参数,更多情况下是一种统计意义的测量,主要关注的测量参数有眼高,眼宽,眼抖动等。
2024-10-24 19:51:07
1485
原创 Linux内核USB3.0驱动框架分析--USB Hub代码分析
USB设备是热插拔,因此在hub_probe函数中调用hub_configure函数来配置hub,在这个函数中主要是利用函数usb_alloc_urb函数来分配一个urb,利用usb_fill_int_urb来初始化这个urb结构,包括hub的中断服务程序hub_irq的,查询的周期等。第二件事是调度工作队列处理hub事件。通过usb_device_match匹配设备驱动,即usb_device_type类型,最终会调用到内核提供的通用的USB设备驱动usb_generic_driver_probe。
2024-10-12 20:22:46
1263
原创 Linux内核USB3.0驱动框架分析--USB主机控制器hcd驱动分析
此时的dev 代表着一个interface, 而drv 就代表了我们自己的usb 驱动. 但是我们应当看到drv是device_driver 类型, 而我们写的usb 驱动的类型一般是usb_driver, 因此这里的probe 和我们自己写的probe 显然不是同一个. 实际上这里的drv 是我们的驱动对象里内嵌的一个子对象( 因为linux 下所以的驱动都必须用device_driver 来代表,). 那这个子对象的probe 函数是在哪里赋值的呢?主要是找到对应的客户驱动程序和该USB设备挂钩。
2024-10-12 19:46:55
858
原创 Linux内核USB3.0驱动框架分析--USB Core分析
USB Class Driver和USB设备接口、USB设备和USB Core(USB Driver)的匹配工作由usb_bus_type中的usb_device_match函数完成,该函数会进一步调用usb_match_id进行匹配。在执行device_add后导致总线的匹配函数usb_device_match再次被调用,这次由于是接口设备,设备类型为usb_if_device_type,那么匹配的一定是接口驱动,于是会执行usb_device_match的else分支,去匹配接口驱动。
2024-09-30 17:51:56
1527
原创 USB2.0主机设备检测过程以及信号分析
在这里对速度的检测是双向的,比如高速的hub需要检测所挂上来的设备是高速、全速还是低速,高速的设备需要检测所连上的hub是USB2.0的还是1.x的,如果是前者,就进行一系列动作切到高速模式工作,如果是后者,就以全速模式工作。3.1 由于低速设备D-接有1.5K上拉电阻,当设备接入Hub时,Hub的D-会被拉高,此时Hub会检测到有低速设备接入,而全速和高速设备D+接有1.5K上拉电阻,当USB设备接入USB Hub时,Hub的D+会被拉高,此时Hub会检测到有全速或高速设备接入。
2024-09-27 20:41:54
2474
原创 【Android驱动12】Modem编译和sim卡配置检测过程
自动为所要复制到alps/vendor/mediatek/proprietary/modem/${modem} 下的文件重命名,并生成一个Android.mk文件,alps/vendor/mediatek/proprietary/该路径下是没有modem这个文件夹的,需要自己创建。SIM掉卡后,首先会有三次fast recovery捡卡机制,若这三次recovery,能将卡找回来,表明受到的是IO干扰,通过reset卡,避开了信号受干扰的时刻,然后能将SIM卡找回来。1.8V的SIM更容易受到这种干扰。
2024-08-18 14:23:49
1263
原创 【Android驱动11】GPS晶体配置和基础知识讲解
定位过程中最重要的辅助资讯包括时间、位置、星历。 FULL start:没有任何的辅助资讯。相当于end user第一次买到手机后使用定位应用的场景。 COLD start:有时间辅助资讯,end user不会遇到该场景。 WARM start:有时间、位置辅助资讯,end user此次定位距离上次定位超过2~4个小时。 HOT start:有所有的辅助资讯,end user此次定位距离上次定位小于2~4小时。
2024-08-18 13:43:07
406
原创 【Android驱动10】电池battery充放电软件库伦算法和thermal机制
thermal.conf设计CPU、PMIC、BATTERY等的温度参数,其路径一般在device/目录下,但是这是个加密文件,直接打开的话就是一堆看不懂的字符,需要使用对应的工具来解密,即thermal_config_tool。4、SOC_BY_SW_FG与SOC_BY_HW_FG的区别在于放电电量的获取方式,一个由软件计算获得,一个由硬件模数转换获得。也就是说,在这个项目中,thermal中bcct与abcct都是使能的,但是mtktsAP中使用的是abcct才是我们需要的。
2024-08-17 15:15:34
1221
原创 【Android驱动09】Sensor2.0传感器驱动框架
MTK框架可以分为两部分,AP和SCP。AP是主芯片,SCP是协处理器,他们一起工作来处理sensor数据。SCP 是用来处理sensor和audio相关功能和其他客制化需求的一个协处理理器,MTK SCP选择freeRTOS作为操作系统,CHRE是处理传感器相关操作的专门任务。kernel层负责汇总处理sensor传输上来的数据,以及处理应用层传递下来的指令。
2024-08-17 14:42:52
1612
1
原创 【Camera2 教程五】Camera2中processCaptureResult结果回传源码分析
processCaptureResult这个接口其实是在ICameraDeviceCallback这个类当中定义的,在openCamera这一节有提及过,在openSession()时,有将ICameraDeviceCallback这个Class传给Hal,更具体地说是Camera3Device,因为Camera3Device有从ICameraDeviceCallback继承,是它的子类。返回的顺序与提交请求的顺序相同。根据camera HAL设备的pipeline深度,可以同时处理多个request。
2024-08-03 18:19:35
248
原创 【Android驱动08】Sensor传感器框架以及驱动移植和调试方法(Kernel层部分)
kernel层负责汇总处理sensor传输上来的数据,以及处理应用层传递下来的指令。
2024-08-03 14:55:53
1461
原创 【Android驱动07】Sensor传感器框架以及驱动移植和调试方法(Hal层部分)
Sensor HAL层相对来说比较简单,它的意图就是为framework层提供接口API的实现,如open_sensors,poll等,一旦实现完毕,framewoerk 里面的SensorManager,SensorService 里面的native(本地)方法可以直接被调用。这一步非常重要,HAL_MODULE_INFO_SYM 映射了hal 层XXX.so 库的入口,上层hw_get_module 将获得该入口,使得上层可以和底层.so库进行交互。Hal层的库文件是怎么被上层调用的?
2024-08-03 14:32:21
1200
原创 【Android驱动06】GMS兼容性测试CTS --环境搭建、测试执行、结果分析
例如,run cts --plan CTS将运行所有的测试计划。运行测试类和/或方法:使用run cts --class/-c class_name [–method/-m method_name]命令可以运行特定的测试类或方法。在指定设备上运行测试:使用run cts [options] --serial/-s device_ID命令可以在指定的设备上运行CTS测试。运行测试包:使用run cts --package/-p package_name命令可以运行特定的CTS测试包。
2024-07-30 20:59:12
1235
原创 【Android驱动05】通过U-Boot来设置启动参数cmdline将数据传递给应用层的方法
在Android系统中,通过U-Boot(通常称为uboot)来设置启动参数(如cmdline)或尝试直接将数据传递给应用层(通过系统属性property)是一个较为间接的过程,因为U-Boot主要负责硬件初始化和引导Linux内核,而Android系统属性则是由Android系统服务(如init进程和property服务)管理的。相反,你需要在U-Boot中设置cmdline或其他启动参数,然后在Linux内核或Android系统启动时读取这些参数,并根据需要设置系统属性。3.1 在应用层读取属性。
2024-07-27 13:21:22
726
原创 【Android驱动04】触摸屏touchscreen驱动移植以及调试方法
getevent是Android系统中用于获取输入设备事件信息的工具,它可以捕获触摸屏、键盘等输入设备的原始事件数据。通过分析getevent输出的数据,可以了解触摸屏的响应情况,包括触摸点的坐标、压力值、事件类型等。数据处理:驱动程序将读取到的原始触摸数据进行处理,转换为标准的输入事件格式(如ABS_X、ABS_Y等),并准备将其上报给输入子系统。3,ADB 提供了一个更高级的 input 命令,用于模拟键盘和触摸屏输入,而不需要知道底层的设备文件和事件代码。这些事件包括触摸点的位置、压力等信息。
2024-07-27 12:49:57
2980
原创 【Android驱动03】屏幕背光backlight驱动移植以及调试方法
驱动结构体 platform_driver mt65xx_leds_driver 和设备结构体 platform_device mt65xx_leds_device 的name 相同时就会触发探测函数 mt65xx_leds_probe。第一个重要的函数就是 struct cust_mt65xx_led * cust_led_list = mt_get_cust_led_list();
2024-07-20 17:10:31
1675
原创 【Android驱动02】LCM屏幕移植和兼容以及常见问题解决方案
2.5.在lcm porting过程中,这些参数都定义在lcm_drv.h文件中的LCM_DSI_PARAMS结构体中,随着平台的发展,或许有所不同,但是基本原理都是一致的,如何配置clk的大小,请先根据自己的帧率、像素格式、porch值、屏的分辨率、data lane对数等计算出data_rate,然后计算出clk。这种模式是不需要带有显存的。VBPD(vertical back porch): 表示在一帧图像开始时,垂直同步信号以后的无效的行数,对应驱动中的upper_margin;
2024-07-20 13:49:06
1849
原创 【Android驱动01】EMMC移植和兼容以及常见问题解决方案
discrete lp2 类: dram vendor ID不同,就可以兼容(也就是说不同晶圆厂家兼容,具体对应的是datasheet中的MR5值,对应到code中MemoryDeviceList_xxxx.xlsx 表格的MODE_REG5 列)discrete lp3 类: dram vendor ID不同,就可以兼容(也就是说不同晶圆厂家兼容,具体对应的是datasheet中的MR5值,对应到code中MemoryDeviceList_xxxx.xlsx 表格的MODE_REG5 列)
2024-06-29 14:14:02
1161
原创 图像算法---自动对焦AF
紫色光线代表经过上半部分透镜的光线,蓝色代表经过下半部分透镜的光线,可以看到,CCD在焦前的时候上半部分的CCD接收到的是上半部分的光线,下半部分接收的是下半部分的光线,在焦后的时候,是相反的,上半部分接收的是下半部分的光线,下半部分接收的是上半部分的光线。PDAF sensor的一种实现如上图所示,在CMOS上面一半的位置加了金属遮盖,这样,被遮住左边一半的像素点就只能接受右边来的光,同理,pair的被遮住右边一般的像素点就只能接受左边来的光。通过比较两帧图像的清晰度评价值,算法确定下一步的移动方向。
2024-06-06 18:40:50
2921
原创 图像算法---自动曝光AE
AE是一种自动调节曝光时间的机制,其主要功能是在外界环境光照条件发生变化时,通过调节sensor的曝光时间、光圈大小、增益等参数,使图像或视频保持适当的亮度,防止过曝或过暗导致的细节丢失。N段式统计法是一种有效的自动曝光策略,它能够在保证预览帧率的同时,尽可能地减小噪点的影响,并在不同的光线条件下获得较为理想的图像亮度。与全局曝光(Global Shutter)不同,卷帘曝光是逐行进行的,即从图像的顶部开始,传感器逐行地将每一行图像暴露给光线,然后逐行地向下移动,直到整个图像的底部都曝光完成。
2024-06-06 17:13:24
2805
原创 快速修改验证Sepolicy(Selinux)
需要注意的是,SELinux的工作模式可以在/etc/selinux/config文件中进行配置。在此模式下,SELinux仍然监控所有进程和文件访问,但即使检测到违反策略的行为,也不会阻止它们。SELinux(Security-Enhanced Linux)有三种主要的工作模式,这些模式决定了SELinux在系统上实施安全策略的方式。此外,SELinux日志的记录需要借助auditd.service这个服务,因此请不要禁用它,以确保SELinux能够正常工作并记录所有必要的信息。
2024-06-05 17:59:04
1278
原创 Linux中经典的并发编程问题生产者和消费者
在C/C++中,通常使用pthread_mutex_t类型表示互斥量,并通过pthread_mutex_init、pthread_mutex_lock、pthread_mutex_unlock等函数来初始化、锁定和解锁互斥量。在C/C++中,使用pthread_cond_t类型表示条件变量,并通过pthread_cond_init、pthread_cond_wait、pthread_cond_signal等函数来初始化、等待和发送信号。2,线程是进程中的一个执行单元,是操作系统进行运算调度的最小单元。
2024-05-24 16:39:56
759
原创 Linux中冒泡排序法和二分查找法原理详解和实现代码
在这个例子中,binarySearch 函数接受一个有序数组 arr,以及搜索范围的起始索引 low 和结束索引 high,还有目标值 target。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。最后,我们打印出排序后的数组。冒泡排序(Bubble Sort)是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
2024-05-24 15:12:22
488
原创 【OpenCV实战】OpenCV实现自动调整亮度和对比度
OpenCV中计算图像的直方图,计算累积分布函数(CDF),归一化CDF,计算图像的平均值,找到最优的对比度增益(gain)和偏移(offset)来实现自动曝光调整。然后根据这些参数调整图像的对比度和亮度,最终输出调整后的图像。
2024-05-23 14:46:55
1222
原创 深入学习Linux内核之v4l2应用编程(二)
V4L2(Video for Linux 2)是Linux中关于视频设备的内核驱动,它使得Linux系统能够支持视频设备,如摄像头。对于Camera V4L2的应用编程,一般遵循以下步骤
2024-05-14 17:10:00
1496
原创 深入学习Linux内核之v4l2驱动框架(一)
V4L2(Video for Linux 2)是Linux操作系统中用于支持摄像头和视频设备的框架。它提供了一组API和驱动程序接口,用于在Linux系统中进行视频采集、视频流处理和视频播放等操作。
2024-05-14 16:36:52
1190
原创 【OpenCV实战】基于OpenCV实现人流量统计核心代码(已验证可准确实现计数)
在人体检测的基础上,我们需要定义一条红线作为穿越边界。然后,对于每个检测到的人体,我们检查其检测框是否与红线相交或跨越红线。这可以通过比较检测框的坐标和红线的坐标来实现。当检测到一个人体穿过红线时,我们需要进行计数。之后,我们找到检测到的人体的中心,然后在它们穿过人工创建的红线时对它们进行计数。在下面的代码中,我们循环遍历视频中的每个帧,然后进行检测。然后,由于我们仅对人数流量进行计数,因此仅过滤掉人的检测结果。以上仅是部分参考代码,具体的项目需要自己参考来适配具体的项目。
2024-05-09 17:58:56
591
原创 【OpenCV实战】基于OpenCV中DNN(深度神经网络)实现人体检测和使用穿越红线方式来统计人流量
在人体检测的基础上,我们需要定义一条红线作为穿越边界。然后,对于每个检测到的人体,我们检查其检测框是否与红线相交或跨越红线。这可以通过比较检测框的坐标和红线的坐标来实现。
2024-05-09 17:36:24
568
1
原创 【Camera2完整流程分析四】从log角度分析CameraService启动流程
这里就是返回hardware:📷:provider::V2_4::ICameraProvider对应的类型type名字:USB摄像头的类型对应的是external/0,mipi摄像头类型是legacy/0,接着在调用。这里就是获取Hal层hardware:📷:provider::V2_4::ICameraProvider的接口服务了,所以interface 就是hal层的CameraProvider服务接口,接着这里面又调用。到这里的分析,cameraservice的启动过程就分析完了。
2024-05-07 17:34:25
226
原创 【Camera2完整流程分析三】从Log角度跟踪分析原生Camera2相机分析相机拍照流程
而这里的mImageSaverBuilder是由PictureTakerFactory构建PictureTakerImpl是传递进来的,所以imageSaverBuilder是由CameraStarter时构建pictureTaker传递进来的,最后是OneCameraCreator构建时构建的。接着看PictureTakerImpl的构建和takePicture的调用,最后调用的是。而这里的captureSetting.getCaptureSize()就是设置照片的大小,接着看调用的是。
2024-05-07 17:16:28
421
原创 Android中的屏幕刷新机制(动画视频形象说明机制)
例如,当画面静止时,GPU可能没有绘制操作,屏幕刷新的还是缓存中的帧数据。那又有人要说了,那就再多开几个不就可以了,是的,buffer越多jank越少,但是你得考虑性价比: 3 buffer已经可以最大限度的避免jank的发生了,再多的buffer起到的作用就微乎其微,反而因为buffer的数量太多,浪费更多内存,得不偿失。上面的流程中,存在一个问题,屏幕的VSync信号只是用来控制帧缓冲区的切换,并未控制上层的绘制节奏,也就是说上层CPU/GPU的生产节奏和屏幕的显示节奏是脱离的。
2024-04-24 16:46:12
2243
5
使用yolov5实现物体识别
2024-12-27
usb实现hub下行端口输出眼图测试信号方案代码和libusb-1.0.so库和可执行程序
2024-10-24
pose-iter-102000.caffemodel基于openpose手势识别完整模型
2024-03-14
实现从相册或者摄像头中选择照片并显示的完整app项目代码
2023-12-08
Camera Hal3添加水印功能的bmp格式图像
2023-11-16
Camera Hal3实现水印或者弹幕的功能
2023-11-16
Android OpenCV TensorFlow人脸检测模型
2023-08-11
android系统camera BF2553和BF2257驱动下载
2023-07-21
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人