C
文章平均质量分 68
Qidi_Huang
技术是一种信仰,我愿做布道者。
展开
-
State Machine Compiler 用法:使用 SMC 工具自动生成状态机代码
SMC (State Machine Compiler) 目前还没有正式中文名,这里把它意译成 状态机生成器,其主要作者是 Charles W. Rapp。状态机生成器实际上早在 2000 年左右就由 Robert C. Martin (他还有个网名叫 Uncle Bob) 创造出来了,现在一般把他发明的状态机生成器称作 OSMC (Original State Machine Compiler)。Charles 曾经是 Robert 的同事,在后者离职后,前者接手了 OSMC 的维护工作[1]。本文介原创 2021-01-02 16:32:16 · 4038 阅读 · 5 评论 -
ASoC Platform驱动代码框架图
【前言】 在更深入地阅读了工程中 Audio 部分的驱动代码之后,整理出了一个 ASoC Platform 驱动代码的框架图。类似的 ASoC Machine驱动代码框架图在《ASoC Machine 驱动代码框架图》中,ASoC Codec驱动代码框架图在《ASoC Codec 驱动代码框架图》中。【图示说明】 浅绿色:模块入口原创 2016-09-09 08:39:43 · 2140 阅读 · 0 评论 -
ASoC驱动开发 之 Codec芯片ALC5677 驱动代码分析
【补充】 关于 ASoC Codec驱动代码框架更详细的介绍可以阅读《ASoC Codec 驱动代码框架图》。(2016年9月2日 添加)【前言】 Linux下的音频驱动多采用 ASoC 架构。在这个架构里,驱动分 Platform、Codec、Machine 这 3 部分,相关介绍可以参见前文《Linux AsoC音频驱动架构 及 Machine驱动代码分析》。本文分析的是 Codec 部分,即音频编解码芯片的驱动代码。这里用作例子的芯片型号为 ALC5677。原创 2016-08-04 18:29:13 · 2755 阅读 · 0 评论 -
Android驱动开发流程 及 系统分层模型
【Android系统分层模型】【驱动开发流程】 1、下载 Android 源码; 2、下载 Linux Kernel 源码,将其放置于 Android 源码根目录的 kernel/ 文件夹下; 3、编写设备驱动源码。按照惯例是在 Linux kernel 源码根目录下的 driver/ 路径新建与设备同名的 xxx 文件夹,并添加驱动源码文原创 2016-08-22 13:59:37 · 2565 阅读 · 0 评论 -
Audio驱动开发 之 音频链路学习笔记
【元器件说明】 本文中使用的 Codec 芯片为 ALC5677。【音频链路模型】 一个常见的音频链路如 图1 所示,包含 音频输入、ADC、DSP、DAC、音频输出 5 大部分。图1 音频链路模型 【音频输入部分】 在 图1 中,DSP 的音频数据来源,也即音频输入部分只有麦克风。而实际上,这部分音频数据也可以从文原创 2016-07-26 08:34:16 · 3755 阅读 · 0 评论 -
ASoC 概述(中文翻译) / ASoC Overview
【版权声明】 本文为 ASoC 框架的概述性文档,翻译自 Linux 内核源码文档中的 Documentation/sound/alsa/soc/overview.txt,遵循 GPL 协议。 文中如有翻译不当的地方,请不吝指正。【译文正文】ASoC层======ASoC层的目标是为嵌入式片上系统处理器(比如 pxa2xx,au1x00,iMX 等)和移翻译 2016-08-08 19:58:12 · 1735 阅读 · 0 评论 -
阅读Linux设备驱动模型源码之 device结构体成员详解
【前言】 我们学习 Linux 设备驱动,很多人在一开始往往急于想找到快速入门的方法,希望能有一个提纲挈领的使用说明来帮助我们快速理解 Linux 设备驱动的设计思路和框架,从而摆脱掉 Linux 内核这头庞然怪兽。我自己最初也是这样。然而事与愿违,如果学习 Linux 设备驱动能有这样的捷径让大多数人快速掌握,那么具备开发 Linux 设备驱动的能力也就变得不再值钱了。所以,学原创 2016-09-01 20:35:17 · 5671 阅读 · 2 评论 -
Makefile 学习整理
【说明】 开发人员在阅读或编写 Makefile时,可能会记不起某些知识点。 此文档目的是希望能起到提醒读者所遗忘的知识点的作用,故在整理时削弱了阅读流畅性,适用于对 Makefile有一定了解的开发人员。【版权声明】 本文主体参考和整理自 陈皓 的文章《跟我一起写Makefile》。【背景】 Makefile决定了整个工程的编译规则。会不会原创 2016-04-07 21:05:05 · 3148 阅读 · 2 评论 -
学习笔记之 curl 命令用法 中文详解
【前言】 本文翻译和整理自 Linux-2.6.32 中和 curl 相关的 Manual Page 描述文档。文档目的仅在提醒读者所遗忘的知识点,故在整理时削弱了阅读流畅性,适用于对 curl 有一定了解的开发人员。【语法】 curl [options] [URL...]【概述】 curl 命令用作网络数据包收发,常应用于非交互式环境中。 URL 的格式依赖于命令所使用的网络协议,相关详细信息可以查看《RFC 3986》文档。 如果在一条命令中访问多个文件原创 2016-04-28 22:15:32 · 14799 阅读 · 0 评论 -
ASoC Machine驱动代码框架图
【前言】 较久之前写了一篇《Linux ASoC音频驱动架构 及 Machine驱动代码分析》,那个时候刚开始接触 ALSA,文章写得很粗糙。这段时间以来新看了 HAL层、Framework层的资料,温习了 Plarform_device 驱动、I2C_device 驱动、kobject + ktype + kset 以及更深入地阅读了工程中 Audio 部分的驱动代码,整理原创 2016-09-07 19:11:52 · 1563 阅读 · 0 评论 -
ASoC Codec驱动代码框架图
【前言】 上个月写了《Audio驱动开发 之 Codec芯片ALC5677驱动代码分析》,但是感觉那个时候理解得还不够深入、写得很粗糙。这一个月以来新看了 HAL层、Framework层的资料,温习了 Plarform_device 驱动、I2C_device 驱动、kobject + ktype + kset 以及更深入地阅读了工程中 Audio 部分的驱动代码,整理出了一原创 2016-09-07 09:40:23 · 2478 阅读 · 0 评论 -
C语言中双感叹号(!!)的含义
C语言中的感叹号(!)是逻辑运算操作符。经过该操作符运算后的值只有 2 种情况,要么为 1,即 True,要么为 0,即 False。 在进行逻辑运算时,所有非 0 的值都会被认为是 True,而只有 0 值会被认为是 False。所以对变量进行 2 次非运算(!!)就能将其转化成 1 或者 0,且变量原本的逻辑值保持不变。比如: !!(400) = 1 !!(-原创 2016-10-10 13:51:53 · 57558 阅读 · 0 评论 -
使用 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 · 1638 阅读 · 0 评论 -
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 评论 -
【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 评论 -
Android系统中耳机按键键值上报不正确 解决过程
【问题现象】 根据测试组同事反馈:在我们的设备上使用 JBL 品牌某款带有 3 个按键的有线耳机时,按下“音量+”键时设备会减小音量而不是增加音量,按下“音量-”键时设备无响应;在设备上使用 Samsung 品牌某款带有 3 个按键的有线耳机时,按下“音量-”键时设备会启动语音助手而不是减小音量。但按下 2 款耳机的中间键(播放/暂停键)均可以得到正确的响应。【分析问题】原创 2017-05-27 16:48:21 · 5459 阅读 · 1 评论 -
Android系统中从发生耳机插拔事件到音频Route切换过程分析
【概要】 我们知道,耳机插入/拔出事件肯定是通过中断通知系统进行处理的。有了这个认识之后,我们就可以对这个过程进行逐个击破的分析了: 1、 谁为耳机事件产生中断? 2、 中断处理函数是哪个? 3、 中断处理函数中执行了什么操作来改变音频Route? 【备注】 本文基于我所使用的硬件环境进行分析,虽然可能与你现在使用的芯片不同,原创 2017-02-08 11:45:42 · 3197 阅读 · 2 评论 -
list_entry()等价于container_of()
list_entry() 宏在 linux/list.h 中的定义如下:/** * list_entry - get the struct for this entry * @ptr: the &struct list_head pointer. * @type: the type of the struct this is embedded in. * @m原创 2016-11-02 10:03:31 · 821 阅读 · 0 评论 -
DEVICE_ATTR 详解
【官方文档】 官方描述文档路径为 /linux-4.3/Documentation/driver-model/device.txt 源码路径为 /linux-4.3/include/linux/device.h【DEVICE_ATTR 说明】 原文描述: ˉˉˉˉˉˉˉˉˉˉˉˉˉ Attributes are declared usi原创 2016-04-09 02:17:00 · 6642 阅读 · 0 评论 -
【转】C/C++中的 mutable、volatile 关键字作用详解
mutable和volatile 很少遇到这两个关键字,学嵌入式估计知道后者,深入研究 C++ 的估计知道前者。 (1)mutable 在 C++ 中,mutable 是为了突破 const 的限制而设置的。被 mutable 修饰的变量,将永远处于可变的状态,即使在一个 const 函数中,甚至结构体变量或者类对象为 const转载 2016-09-19 18:31:10 · 3912 阅读 · 0 评论 -
Codec 驱动概述(中文翻译)/ codec.txt
【版权声明】 本文为 Codec 的概述性文档,翻译自 Linux 内核源码文档中的 Documentation/sound/alsa/soc/codec.txt,遵循 GPL 协议。 文中如有翻译不当的地方,请不吝指正。【译文正文】ASoC Codec驱动==============Codec 驱动应该是与硬件无关的翻译 2016-08-25 19:05:20 · 2890 阅读 · 0 评论 -
Radix树 与 Linux IDR机制
【Radix Tree】 Radix Tree 是一种数据结构,又称为 PAT Tree(Patricia Tire or crit bit Tree),源自于 Patricia Tree(Practical Algorithm To Retrieve Information Coded In Alphanumeric Tree)。这是一种基于二进制表示键值的查找树,树的叶子节点原创 2016-08-04 19:50:29 · 1742 阅读 · 0 评论 -
C语言 逆序显示文本内容并保存
【说明】 对指定文件中的内容或传入的字符串参数逆序打印并保存到文件中。【命令行示例】 [root@localhost]$ ./reverseStr test.txt 这条命令的含义是读取 ./test.txt 文件中的内容,将文件内容顺序反向存储到 outPut.txt 文件中。 [root@localhost]$ ./rever原创 2016-05-16 08:13:01 · 2488 阅读 · 0 评论 -
创建Linux内核函数的Man手册
【前言】 编写驱动程序的时候,一般情况下使用的都不是 C标准库的函数,而是 Linux内核中的函数。所以即使用 man命令 也找不到很多函数的帮助信息,这很不利于 Linux内核的学习。 好在 Linux内核虽然没有直接提供手册,却提供了创建手册的工具。我们可以手动生成 Linux内核的 Man手册。【创建步骤】 1、下载一个稳定版本的内核,例如:linux-原创 2016-04-28 21:58:10 · 3916 阅读 · 1 评论 -
Linux内核模块编程学习总结
【内核模块的出现】 编译内核时,用户可以把所有的代码编译进内核,但是这样会引起两个问题: 一是内核过大; 二是当需要添加或者删除内核时,需要重新再编译内核。 所以有了 内核模块 的概念。 模块并不编译到内核中,编译后存放在指定的目录,当需要使用时动态加载。【内核模块的优点】 在嵌入式设备驱动开发中将驱动程序以模块的形式发布,极原创 2016-04-15 18:37:08 · 1570 阅读 · 0 评论 -
gcc编译提示pthread_create和pthread_detach未定义的引用的解决方法
因为 pthread_create 和 pthread_detach 函数不是 Linux 的内建函数,所以在对使用了多线程技术的工程进行编译链接生产可执行文件时,需要在链接过程添加 -pthread 参数。根据 Linux 中man出的帮助信息也可以看到相应的提示“Compile and link with -pthread”。所以makefile应该这么写:testPthr原创 2015-12-24 00:46:23 · 4824 阅读 · 0 评论 -
生成在嵌入式设备上运行的程序需要进行交叉编译
需要进行交叉编译才能生成可以在嵌入式设备上运行的程序。拿我今天的经历来说,使用 gcc 编译链接生成的程序可以在 ubuntu PC上正常运行,但是 tftp 上传到设备上之后,运行却总提示 syntax error: unexpected '('。后来董工恰巧看见了提醒我说应该使用交叉编译生成可执行文件,于是使用 arm-hisiv300-linux-gcc 重新编译链接,tftp 到设原创 2015-12-25 21:44:28 · 1509 阅读 · 0 评论 -
函数指针的使用
函数指针通常用来将一个函数A作为参数传递到另一个函数B当中,我们可以通过函数指针在函数B中对函数A进行使用。举个栗子:我们定义一个函数 int TaskAssignment(...) 用于创建一个线程,多次调用该函数即可创建多个线程。我每次希望创建的线程所要实现的功能是不同的,但回调函数所接受的参数却是相同的,即利用 phtread_create(...) 函数创建线程时传入的回调函数不同原创 2016-01-06 22:56:45 · 905 阅读 · 0 评论 -
使用宏定义让参数含义更清晰
很多时候我们需要一个函数可以返回多个返回值,同时还希望能够获得这个函数的执行状态从而判断这个函数是执行成功还是失败。于是我们可以利用函数的返回值作为函数执行状态的判定依据,同时传入一个参数用于接收函数执行完成所得到的数据。像下面这个例子一样:// 宏定义#define COMMUNICATE_FAILED-1#define COMMUNICATE_SUCCESSFUL0原创 2016-01-20 22:59:12 · 1029 阅读 · 0 评论 -
sscanf 函数、scanf 函数与正则表达式
C中的格式化输入输出函数,比如 scanf、printf、sscanf、sprintf 等,都支持使用正则表达式来修饰格式化字符串。当我们需要从文本或内存中读入字符串中的某一部分数据时,可以使用正则表达式迅速定位我们希望获取的内容。例如,在工程中我们使用结构体 tGuiDeviceInfoRsp 来存储设备信息。成员 tGuiDeviceInfoRsp.m_tKernelInfo.m_strK原创 2016-01-08 23:00:42 · 1262 阅读 · 0 评论 -
C语言 命令行传参进行 异或 加密/解密
【说明】 对指定文件中的内容或传入的文本参数进行异或加密/解密,并将加密/解密后的结果保存到文档。可以指定进行异或加密/解密时要使用的私钥。【命令行示例】 [root@localhost]$ ./magicTransfer xCode 64x 这条命令的含义是如果当前目录下存在 64.txt 这个文本,则对该文本进行解密并将解密结果保存到 64x.原创 2016-05-16 08:03:29 · 1719 阅读 · 0 评论 -
PHY芯片 AR8033驱动代码分析
【思路描述】 想要在Linux上使用AR8033需要做2部分工作,一是编写设备驱动并将设备驱动注册到内核,二是创建设备通信要使用的mdio总线并将设备注册到总线上。【代码分析】a) 驱动注册流程: 文件mdio_gpio.c 是 mdio_gpio 模块的代码所在。在模块加载函数 mdio_gpio_init() 中通过语句 ret = p原创 2016-05-13 21:36:41 · 10378 阅读 · 0 评论 -
AR7240芯片 EthernetSwitch模块 学习笔记
【模块概述】 EthernetSwitch 模块中包含 5个 10/100Mbps高速以太网接口和 5个 10/100双模式以太网收发器(PHY)。模块可通过配置使用 VLAN 功能,支持 16个802.1Q VLAN和 基于端口的VLAN划分,VLAN ID的可分配范围为0~4095。 【寄存器概述】 内置交换芯片模块的寄存器分 3大类:全局控制寄存器原创 2016-05-26 17:03:52 · 7305 阅读 · 0 评论 -
Linux内核中的 struct class 简介
【问题回溯】 在分析 LED 控制的代码时,发现 Led-class.c 文件的首部出现了这样一句声明: static struct class *leds_class; 这里出现了 class 这种在 C++中被广泛运用的概念。【释疑解惑】 代码中出现的 class 指的是 设备类(device classes),是对于设备的高级抽象。但实际上原创 2016-04-28 22:01:28 · 4468 阅读 · 0 评论 -
Linux ASoC音频驱动架构 及 Machine驱动代码分析
【软件框架】 在对要做的事情一无所知的时候,从全局看看系统的拓扑图对我们认识新事物有很大的帮助。Audio 部分的驱动程序框架如下图所示: 这幅图明显地分为 3 级。 上方蓝色系的 ALSA Kerne原创 2016-07-18 00:33:11 · 5336 阅读 · 6 评论 -
Linux I2C总线框架 学习笔记
【I2C框架结构】 Linux 内核中的 I2C 框架分为 3 部分,分别是 Core、Bus Driver、DeviceDriver 。其中 Core 部分是框架中的框架,会调用 Bus Driver 和 Device Driver 中的函数和结构体进行 I2C 注册、数据读写。我将其整理成为下面这张框图(按下 ctrl+鼠标滚轴 可放大图片): 【驱动编写的主要工原创 2016-08-03 19:31:31 · 1330 阅读 · 0 评论 -
【转】Linux音频驱动之一:ALSA架构简介
一. 概述 ALSA 是 Advanced Linux Sound Architecture 的缩写,目前已经成为了 Linux 的主流音频体系结构,想了解更多的关于 ALSA 的这一开源项目的信息和知识,请查看以下网址:http://www.alsa-project.org/。 在内核设备驱动层,ALSA 提供了 alsa-driver,同时在应用层,ALSA 为我们转载 2016-07-26 11:18:01 · 1944 阅读 · 0 评论 -
正则表达式 语法
内容节选自博客 AstralWind:原创 2016-06-13 13:40:01 · 731 阅读 · 0 评论 -
Linux内核 定时器 用法
【前言】 最近在工程中接触到调用 Linux 内核函数配置定时器实现 LED 闪烁效果的代码。对定时器的使用方法写个简单小结。【概述】 定时器的用法不复杂。调用过程分为以下几步: 1、声明一个 timer。 2、初始化 timer。 3、完善定时中断服务函数。 4、注册 timer 到定时器链表。 5、重新注册 ti原创 2016-05-04 21:12:31 · 2678 阅读 · 0 评论 -
2.4G WLAN芯片 AR9341 学习笔记
【芯片概述】 AR9341是一款用于 2.4GHz 网络的 WLAN 平台芯片,CPU核为 MIPS 74Kc。芯片内置 MAC/PHY 模块,支持 20MHz/144Mbps 传输模式和 40MHz/300Mbps 传输模式,支持从 NOR flash 上启动。除此之外,AR9341还有很多其它内置模块,其系统框图如下:图1 AR9341系统框图 【Datashe原创 2016-05-14 17:53:19 · 8326 阅读 · 0 评论