嵌入式
文章平均质量分 67
Qidi_Huang
技术是一种信仰,我愿做布道者。
展开
-
AudioRecord 中的 Java、JNI 和 Native 关系浅析
在 Android 系统中,JNI 作为沟通 Java 和 Native 层的桥梁,从设计角度看,属于 代理模式(Proxy pattern) 的一种。它要求每一个使用 JNI 的组件,比如 AudioRecord、AudioSystem 等,都必须实现同一套接口,即都要在各自的 JNI 源文件中填充结构体数组 JNINativeMethod gMethods[],并在该数组中写明各个函数调用的映射关系。各组件的 JNI 源文件位于目录 frameworks/base/core/jni/ 下,文件命名风原创 2020-11-12 18:44:44 · 811 阅读 · 1 评论 -
Android 整包编译至 Linux Kernel 时失败并提示 .config 配置错误的解决方法
更新本地 Android 代码后,对 out/ 目录执行了 clean 操作,并重新编译整包。编译到 Kernel 时失败,报错信息如下:CHECK KERNEL DEFCONFIG FATAL ERROR :Kernel config copied from kernel/config-lts/v4.9/bxt/android/x86_64_defconfig has some config issue.Final '.config' and '.config.old' differ. This原创 2020-11-04 12:14:21 · 3613 阅读 · 0 评论 -
Android 8.1 从零开始写 HAL -- (5) 添加执行权限
Android 上使用 SELinux 来管理权限。 尽管在上一篇文章[《Android 8.1 从零开始写 HAL – (4) 编译与打包》](https://blog.csdn.net/Qidi_Huang/article/details/107434111)中, demoComponent HAL 已经成功编译且打包到系统镜像中,但到目前为止还没有被赋予访问 Binder 的权限。所以我们至少会看到,在将 demoService 注册为 Binder 服务时,日志中会打印类似下方的提示:```t原创 2020-07-20 20:34:12 · 2293 阅读 · 1 评论 -
Android 8.1 从零开始写 HAL -- (4) 编译与打包
对于 demoComponent HAL,在上一篇文章[《Android 8.1 从零开始写 HAL – (3) 实现 Bp、Bn 端》](https://blog.csdn.net/Qidi_Huang/article/details/107428286)中,我们已经编写好了 demoService 代码、Bp 端代码和 Bn 端代码。现在来着手把源码编译成可执行文件和库,并且将它们打包进系统镜像中。---#### 一、编写 Makefile **这里说的 Makefile 是指 `Andr原创 2020-07-18 19:45:13 · 2416 阅读 · 0 评论 -
Android 8.1 从零开始写 HAL -- (3) 实现 Bp、Bn 端
既然 Binder 化的 HAL 依赖于 Binder 机制进行实现,那么我们自然必须按照 Binder 框架,相应编写 demoComponent HAL 的 Bp 端和 Bn 端。只有这样,才能打通客户端进程调用到服务端进程 —— 我们的 demoService —— 的通路。原创 2020-07-18 14:19:00 · 2054 阅读 · 1 评论 -
Android 8.1 从零开始写 HAL -- (2) 实现 HAL 主体
通过上一篇文章[《Android 8.1 从零开始写 HAL -- (1) 定义接口》](https://blog.csdn.net/Qidi_Huang/article/details/107420019)的努力,我们定义好了 demoComponent HAL 的接口和参数,也了解到编译时会自动产生 Binder 框架代码。通过 Binder 机制,经过 demoComponent HAL 的 Bp 和 Bn 端,用户进程就可以调用到我们的 demoService 了。 在打通 Bp/Bn 通原创 2020-07-18 12:13:45 · 2597 阅读 · 0 评论 -
Android 8.1 从零开始写 HAL -- (1) 定义接口
对于前一种场景,我们需要为外设编写全新的 HAL;对于后一种场景,我们不需要编写 HAL,但需要实现一个很类似的 vendor service。这二者的实现方式极其类似,区别只在于他们使用的设备节点不同(一个使用 `/dev/hwbinder`,另一个使用 `/dev/vndbinder`),还有各自申请的 sepolicy 权限有别。 以下正文以实现一个全新的 HAL 为例进行说明,但并不涉及对设备节点的操作。原创 2020-07-17 23:23:20 · 3159 阅读 · 0 评论 -
详细图解 Android vndBinder
详细图解 Android vndBinder注意:本文基于 Android 8.1 进行分析Qidi 2020.07.03 (Markdown & Haroopad)【前言】图虽然是根据 vndBinder 的类关系和调用顺序画出的,但实际上对于 Binder 和 hwBinder 也适用。Binder driver 代码十分庞杂,基于安全考虑还存在与 LSM 的交互,所以这部分的调用关系图有所省略。【Binder 通信概要】如果说 Binder 通信机制是 Android 的心脏原创 2020-07-03 22:18:35 · 1244 阅读 · 0 评论 -
AudioFlinger 如何通过 hwBinder 调用 Audio HAL
AudioFlinger 如何通过 hwBinder 调用 Audio HAL注意:本文基于 Android 8.0 进行分析Qidi 2020.07.03 (Markdown & Haroopad)我们已经知道,在AudioPolicyManager构造时,会解析配置文件audio_policy.conf或audio_policy_configuration.xml。之后,它会获取到AudioFlinger的实例,并根据解析结果,调用loadHwModule()依次加载各个 audio H原创 2020-07-03 21:05:53 · 1909 阅读 · 0 评论 -
3.5mm 音频接口类型说明
【背景描述】 有的时候我们将非原配的耳机插入手机或电脑,发现音质非常差或只有某部分音频,大多是因为耳机与设备的音频接口类型不同导致的。【接口类型】 现在常见的耳机接口都是 3.5mm 音频接口,分为 3-pole 和 4-pole 两类,而 4-pole 中又分 Standard 和 OMTP 两种型号。这是美国人的叫法,国内一般把 OMTP 称为国标,而把称 Standard 为 CTIA 或美标。一般来说,Standard 型号的耳机插头上的原创 2016-07-20 16:39:39 · 52864 阅读 · 1 评论 -
Android系统下在te文件中为指定服务添加sepolicy权限
【正文】 设备在播放视频时有异常,使用Logcat查看日志时发现了如下记录:04-27 14:01:59.136 2825 2825 E SELinux : avc: denied { find } for service=display pid=3015 uid=1046 scontext=u:r:mediacodec:s0 tcontext=u:object_r:display_servi原创 2017-05-04 20:16:58 · 11216 阅读 · 1 评论 -
Android系统中耳机按键键值上报不正确 解决过程
【问题现象】 根据测试组同事反馈:在我们的设备上使用 JBL 品牌某款带有 3 个按键的有线耳机时,按下“音量+”键时设备会减小音量而不是增加音量,按下“音量-”键时设备无响应;在设备上使用 Samsung 品牌某款带有 3 个按键的有线耳机时,按下“音量-”键时设备会启动语音助手而不是减小音量。但按下 2 款耳机的中间键(播放/暂停键)均可以得到正确的响应。【分析问题】原创 2017-05-27 16:48:21 · 5460 阅读 · 1 评论 -
【转】UsbAccessory和UsbDevice的区别
UsbAccessory和UsbDevice的区别UsbDevice:正常的,USB的Host和USB的Device架构中的USB的Device所以,此时:Android设备是USB的Host,外接的USB设备是USB的Device此时,Android设备作为USB的Host,要做USB Host该干的事情:给USB外接设备供电负责管理USB总线转载 2017-04-10 16:37:02 · 1404 阅读 · 0 评论 -
Android系统中固件崩溃后使用uevent机制重新加载固件 流程分析
【前言】 Android系统为了保证各商业公司的利益,允许在系统中使用不开源的固件。因此我们可以看到比如用于音频处理的、用于键盘支持的等等大量固件。既然这么多模块要用到固件,那么我们也有必要来了解一下固件在崩溃后的自恢复过程。这篇博文是基于 Intel x86 平台写的,所分析的固件是 Intel 平台的一款音频 DSP 固件,使用 uevent 机制来收发固件恢复消息。所以如果读者使用原创 2017-03-29 08:50:33 · 1594 阅读 · 0 评论 -
Android 7.0 Audio的Resample过程详解
【前言】处理过音频文件的工程师都知道音频数据存在采样率(Sample Rate)这个指标。在位深度(Bit Depth)一定的情况下,采样率越高,理论上来说播放出来的声音就越细腻,录制的声音也就越保真,反之亦然。但在较早的Android系统版本上,不管音频文件原来的采原创 2017-02-24 10:46:10 · 6173 阅读 · 4 评论 -
Android系统中从发生耳机插拔事件到音频Route切换过程分析
【概要】 我们知道,耳机插入/拔出事件肯定是通过中断通知系统进行处理的。有了这个认识之后,我们就可以对这个过程进行逐个击破的分析了: 1、 谁为耳机事件产生中断? 2、 中断处理函数是哪个? 3、 中断处理函数中执行了什么操作来改变音频Route? 【备注】 本文基于我所使用的硬件环境进行分析,虽然可能与你现在使用的芯片不同,原创 2017-02-08 11:45:42 · 3198 阅读 · 2 评论 -
音频出现Xrun(underrun或overrun)的原因与解决办法
【现象】 音频文件在播放时出现断断续续或类似“爆破”(Pop-Click)杂音的现象,称之为 Xrun(可以是 underrun,也可以是 overrun)。【原因】 通常来说,出现 Xrun 问题时原因可能是以下几个之一: (1) Linux CFS 调度器导致。因为 CFS 调度器的“公平调度”是较长一段时间的平均表现,在很短的一个窗口时间段内,CFS 也可能会将 CPU 时间片完全分配给一个 nice 值更高的线程而不顾及另一个 nice 值更低的线程。如果这个低 nice原创 2016-11-09 16:14:44 · 19116 阅读 · 2 评论 -
记一次Android系统下解决音频UnderRun问题的过程
【前言】 因为这几天在为设备从 Android M 升级到 Android N 的 bringup 做准备,所以一直没写博客。趁现在刚刚把 Kernel 部分的移植做完,忙里偷闲把 2 周前解决的一个音频 UnderRun 问题记录一下,留作以后参考。 问题现象是:使用腾讯视频 APP 播放视频,一段时间后会出现 pop-click 噪音,听起来类似“哒哒”一样的声音。原创 2017-01-04 18:09:32 · 16162 阅读 · 13 评论 -
Logcat中与Audio子系统相关的关键字(不定期更新)
【说明】 在对 Android 设备的音频子系统进行 debug 的时候,迅速在 log 文件中定位到我们关注的位置能帮助我们节省不少时间。 基于这个想法,把之前 debug 过程中很有帮助的一些关键字备份在下方列表中,以便后续查询。 注意,Log类型为 Verbose 的日志默认是不输出的。如果想在 log 中也利用这些记录来帮助分析,需要在代码中允许 Verbos原创 2016-12-08 17:17:42 · 2071 阅读 · 0 评论 -
什么是AudioEffect
这段时间接手 Android 音频子系统,相应 Framework 层的内容也让我在负责。这其中有一个叫 AudioEffect 的概念一直很困扰我,因为我之前一直是在底层开发转悠的,接触的都是 HAL、驱动、寄存器这些东西,里面也没看到过 AudioEffect 这种说法啊。按我之前的理解,音效的设定譬如均衡器、回声消除的配置应该是通过硬件来实现的,但在这 2 天解决一个 bug 的过程中,又看原创 2016-12-19 17:18:45 · 7726 阅读 · 3 评论 -
【转】Android系统3.5mm耳机插口说明
【声明】 本文转自《3.5 mm Headset Jack: Device Specification》【正文】3.5 mm Headset Jack: Device SpecificationTo achieve compatibility with the 3.5 mm plug headset specification, devices tha转载 2016-12-29 07:42:18 · 4986 阅读 · 0 评论 -
Android中为子系统重新单独编译动态库的方法
【背景说明】 如果我们修改了 Android 系统中 kernel 目录下的代码,那么要将修改后的内容应用到设备上的话很简单,只编译 boot.img 并烧写 boot 分区就可以了,这不会花费很多时间。但如果我们修改的内容位于 frameworks/、devices/ 或者 hardware/ 等目录下的话,重新编译 system.img 和烧写 system 分区是非常花时间的。因此原创 2016-12-16 12:21:19 · 2692 阅读 · 0 评论 -
Intel平台Android 6.0音频RouteMask取值列表
【说明】 在 Android 系统中,每一个音频的应用场景都对应着 1 个或多个音频 route,只有为每一个场景配置正确的 route,音频数据才能从期望的设备正确输出。 RouteMask 是一个无符号 32-bit 的变量,某些 bit 对应着可设置的音频 route。当这些 bit 被置 1 时,相应的音频 route 就会被应用到系统中。【表格】原创 2016-12-08 14:57:31 · 1021 阅读 · 0 评论 -
在Android系统中使用TeeSink功能截取任意音频流的原始PCM音频数据
【背景介绍】 前 2 天收到个音频子系统的 bug 反馈,测试组说设备在使用某视频 app 播放视频时不定期会出现“嗒嗒”的噪声。因为检查上层 Log 和底层寄存器配置后发现都正常,所以我怀疑是功放芯片硬件的问题,但硬件开发的同事需要我提供 SoC 送到 Codec 芯片之前的原始 PCM 音频数据帮助分析。以前我也没这么做过,研究了一下午终于把这个问题搞定了,在这里记录一下。原创 2016-12-07 12:20:17 · 7743 阅读 · 8 评论 -
Android系统下解决音频underrun噪声问题的一种更优方法
【问题概要】 上一次我介绍了一种 Android 系统下发生音频 underrun 问题的解决方法(参见《记一次Android系统下解决音频UnderRun问题的过程》),这之后平静了一段时间,测试组同事也没有再报告相关的噪声问题。 但就在前 2 天,测试组同事告诉我说她们又听见噪声了,并且这次的使用场景比上次复杂了许多——由于从 Android 6.0 开始已经支持应用多开以原创 2017-04-05 17:58:10 · 8353 阅读 · 8 评论 -
Android系统 boot.img 结构
【前言】 本文以我使用的 Intel x86 cherrytrail 平台为例进行说明,部分细节可能会与其它设备上看到的不同,比如 easyimage 是我们产品上自定义的分区,其它设备上如果没有是正常的。【正文】 编译完成后我们可以在out/target/product/<ProductModelName>/obj/PACKAGING/target_files_intermediates/原创 2017-06-19 18:02:51 · 4424 阅读 · 0 评论 -
Android音频模块启动流程分析
Android音频模块启动流程分析Qidi 06.08.2017 (Markdown & Haroopad)1) 设备开机,系统启动时将执行 /system/etc/init/audioserver.rc ,运行 /system/bin/ 目录下的 audioserver 服务。audioserver.rc 内容如下:service audioserver /system/bin/audioserv原创 2017-06-08 12:21:15 · 9572 阅读 · 0 评论 -
在 Android 8.0 中绕过 hwbinder 实现跨模块对 audio HAL 调用
在 Android 8.0 中绕过 hwbinder 实现跨模块对 audio HAL 调用Qidi 2017.10.20 (Markdown & Haroopad)【需求描述】 Audio 模块中专门为 TV 产品添加了一些代码,需要在 hdmi 的 HAL 代码中进行调用以完成某些功能。【旧的实现】 在 Android 7.1 中的做法是在 hdmi 的原创 2017-10-24 15:07:59 · 6986 阅读 · 2 评论 -
为 Android 8.0 添加开机启动脚本
为 Android 8.0 添加开机启动脚本Qidi 2018.01.11 (Markdown & Haroopad)【写在前面】 本人对于 SELinux for Android 理解不深,下文中的各文件及安全规则虽都是我所编写,但也是一边查阅文档一边试验得出的。在此强行为文,若有理解错误之处,请各位工程师同仁热情指出。一、需求描述 项目上需要在 Andr原创 2018-01-12 10:25:42 · 14793 阅读 · 14 评论 -
Kernel 4.9 上 dma_alloc_coherent() 函数开辟 DMA 连续内存空间失败 解决办法
【问题描述】 将之前可以在 Kernel 3.14 上正常运行的驱动代码移植到 Kernel 4.9 上,发现驱动在进行 probe 时失败,具体失败位置为函数 dma\_alloc\_coherent(),对应代码段如下:amaudio_start_addr = (unsigned char *)dma_alloc_coherent(amaudio2_dev,原创 2017-09-27 10:50:31 · 8614 阅读 · 2 评论 -
在 Android 中使用自定义函数接口替换 Frameworks 中的默认函数接口
在 Android 中使用自定义函数接口替换 Frameworks 中的默认函数接口Qidi 2017.08.31 (Markdown & Haroopad)注意:本文基于 Android 8.0 进行分析。1. 前言 自 Android 8.0 开始,为了实现 Project Treble 对更快完成系统升级的预期,Google 严格要求芯片 vendor 厂商不能再修改 AOSP 的 Fram原创 2017-08-31 17:18:18 · 1838 阅读 · 5 评论 -
使用 libTomCrypt 实现 AES、HMAC、HKDF 运算
使用 libTomCrypt 实现 AES、HMAC、HKDF 运算Qidi 2017.11.06 (Markdown & Haroopad)1、libTomCrypt 简介 libTomCrypt 是一个使用 C 语言编写的开源加解密算法库,使用 WTF 协议进行授权,支持 AES、HMAC、HKDF、RSA、PRNG、BASE64 等常用加解密算法。2、基础文件 我们在使用 libTomCr原创 2020-07-18 14:36:52 · 1639 阅读 · 0 评论 -
Android Audio BSP工程师 需要清楚的基本知识点
【前言】 这是我根据自己的工作经验所总结,有一定代表性,但可能不齐全。这只是个提纲。【知识点】 按照在操作系统中的层次划分,从上到下依次为:1、Android系统分层模型。知道 APP、JNI、Frameworks、HAL、Driver 的划分以及 用户空间、内核空间 的概念。2、Android Audio模块的启动、加载 及 放音/录音 流程。起码应该了解原创 2017-06-08 18:08:22 · 8164 阅读 · 7 评论 -
Linux 内核修改 xxx_defconfig 的正确方法
【前言】 昨天将 Android N 上的驱动代码移植到 Android O 上,xxxx_defconfig 文件是我手动修改的,但因为公司将内核版本切换到 4.9 之后开启了强制代码格式检查,所以 Patch 在提交到服务器之后无法通过格式检测,一直提示存在如下问题:checkpatch found errors or warnings: $ git log -1 | ./scrip原创 2017-09-14 20:01:08 · 8368 阅读 · 1 评论 -
Android 8.0 VTS 测试 FAIL 失败项解决记录
Android 8.0 VTS 测试 FAIL 项解决记录Qidi 2017.08.09 (Markdown & Haroopad)1. 前言 这篇文章所记录的是我自己在 Amlogic 平台上碰到的 Android Vendor Test Suite (VTS) 测试问题,所以下文中的各 FAIL 项不一定包含了所有的问题类型。但分析 VTS 问题的思路应该是类似的,希望这篇文章能给各位工程师朋原创 2017-08-10 09:19:05 · 17611 阅读 · 2 评论 -
【转】设备树的用法(Device Tree Usage)
【说明】 本文转载自《设备树的用法(Device Tree Usage)》【正文】设备树手册(Device Tree Usage)原文地址:http://www.devicetree.org/Device_Tree_Usage本文概述了如何为一个全新的计算机编写设备树。意在提供一个device tree概念的概述以及如何使用device tree描述一台计算机。有转载 2017-07-27 11:25:37 · 1629 阅读 · 0 评论 -
Android HIDL 简介
Android HIDL 简介Qidi 2017.08.01 (Markdown & Haroopad)注意:本文基于 Android 8.0 进行分析。1、HIDL 的概念 HIDL 读作 hide-l,全称是 Hardware Interface Definition Language。它在 Android Project Treble 中被起草,在 Android 8.0 中被全面使用,其诞原创 2017-08-02 10:45:49 · 35317 阅读 · 144 评论 -
Android Vendor Test Suite (VTS) 的概念、作用及测试方法
Android Vendor Test Suite (VTS) 的概念、作用及测试方法Qidi 2017.08.01 (Markdown & Haroopad)注意:本文基于 Android 8.0 进行分析。这篇文章会不定期更新,欢迎大家指出问题和提出建议。1、前言 - Project Treble Android 目前有一个比较明显的缺点是设备升级到新版本系统所要花费的时间太长(比如从 And原创 2017-08-04 09:14:05 · 30651 阅读 · 149 评论 -
【I2C设备驱动】必须将id_table[]数组的最后一个元素设置为空的原因
忘记了在哪本书上看到过,说必须给 I2C 设备驱动的 id 表数组添加上一个空元素作为最后一个元素,就像下面的代码所展示的那样:struct i2c_device_id { char name[I2C_NAME_SIZE]; kernel_ulong_t driver_data; /* Data private to the driver */}static const str原创 2017-06-26 15:28:20 · 2936 阅读 · 0 评论 -
Miracast与Wi-Fi Direct技术简介
【使用场景相关】 2 个支持 Miracast 功能的设备进行互连时,并不需要将它们连接至同一个 WLAN 网络上(也即不需要连接至同一个无线路由器或AP上)。因为 Miracast 是基于 Wi-Fi Direct 技术实现的。【Miracast 简介】 Miracast 是一种通过无线连接的方式将设备(比如笔记本电脑、平板电脑、智能手机)的音视频传送到显示设备(原创 2017-04-10 17:22:26 · 7403 阅读 · 0 评论