Linux 驱动之 ALSA(四)Platform 驱动
平台驱动程序可以注册 PCM 驱动程序、CPU DAI 驱动程序及其操作函数,为 PCM 组件预分配缓冲区,并根据需要设置回放和采集操作。换言之,平台驱动程序包含该平台的音频引擎和音频接口驱动程序(如 I2S、AC97 和 PCM)。
平台驱动程序以构成平台的 SoC 为目标。它涉及平台的 DMA(即音频数据在 SoC 中的每个块之间如何传输)和 CPU DAI(即 CPU 向编解码器发送音频数据的路径或 CPU 从编解码器获得音频数据的路径)。
平台驱动程序有两个重要的数据结构体:structsnd_soc_component_driver 和 structsnd_soc_dai_driver。前者负责 DMA 数据管理,后者负责 DAI 的参数配置。当然,前文在讨论编解码器类驱动程序时已经描述过这两种数据结构体,因此,本节将仅介绍与平台代码相关的附加概念。
CPU DAI 驱动程序
在平台侧,大部分工作都可以由 core 完成,尤其是与 DMA 相关的工作。因此,CPU DAI 驱动程序通常只提供组件驱动程序结构中的接口名称,而让 core 完成其余的工作。以下是 STM SPD ...
Linux 驱动之 ALSA(三)编解码器类驱动实例
这里以 Wolfson 公司的编解码芯片 WM8960 为例来说明上篇介绍的相关内容。
定义 widget 所需的 DAPM Kcontrol
1234567891011121314static const struct snd_kcontrol_new wm8960_loutput_mixer[] = { SOC_DAPM_SINGLE("PCM Playback Switch", WM8960_LOUTMIX, 8, 1, 0), SOC_DAPM_SINGLE("LINPUT3 Switch", WM8960_LOUTMIX, 7, 1, 0), SOC_DAPM_SINGLE("Boost Bypass Switch", WM8960_BYPASS1, 7, 1, 0),};static const struct snd_kcontrol_new wm8960_routput_mixer[] = { SOC_DAPM_SINGLE("PCM Playback Switch", WM8960_ROUTMIX, 8, 1, 0), SOC_DAP ...
Linux 驱动之 ALSA(二)编解码器类驱动相关概念
编解码器类驱动程序是最基本的,他实现的代码应该利用编解码器设备并公开其硬件属性,以便 amixer 等用户空间工具可以使用它。
由于驱动程序针对特定的编解码器,因此它应该包含音频控制、音频接口功能、编解码器 DAPM 定义和 I/O 功能,每个编解码器必须满足:
通过定义 DAI 和 PCM 配置来提供与其他模块的接口
提供编解码器控制 I/O hook(使用 I2C、SPI 的 API)
根据用户空间的需要,公开其他内核控件(Kernel control,Kcontrol)以动态控制模块行为
定义 DAPM widget,为动态电源切换建立 DAPM 路由,并提供 DAC 数字静音控制(option)
Component
包含编解码器的路由、widget、控件金额一组编解码器相关函数回调指针,以及一个或多个 dai 驱动。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 ...
Linux 驱动之 ALSA(一)概述
ASOC
ALSA 是为桌面计算机而设计的,没有考虑嵌入式设备的限制,在处理嵌入式设备时会产生很多问题,包括但不限于如下:
编解码器和 CPU 之间的耦合太强,导致代码移植困难。
没有处理用户音频相关行为通知的标准方法,在移动场景中,用户的相关音频操作很频繁。
在最初的 ALSA 设置中没有考虑 PM 机制。
ASOC 就是为了解决以上问题而产生的。ALSA(ALSA system on chip, ASOC)层的目的是为嵌入式处理器和各种编解码器提供更好的 ALSA 支持。ASOC 具有以下优势:
独立的编解码器驱动程序。
更方便的配置 CPU 和编解码器动态音频电源管理(dynamic audio power management, DAPM)之间的音频数据接口。
减少弹出和点击操作,并增加与平台相关的控件。
为了实现上述功能,ASoC 将嵌入式音频系统划分为 3 个可重用的组件驱动程序,即机器类(machine class)、平台类(platform class)和编解码器类(codec)。其中,平台类和编解码器类是跨平台(cross-platform)的,而机器类是板 ...
USB 子系统(四)USB Gadget 驱动
USB 控制器可以呈现出两种不同的状态。USB 控制器作为 Host 时,称为 USB 主机控制器,使用 USB 主机控制器驱动。USB 控制器作为 Device 时,称为 USB 设备控制器,使用 UDC(usb device controller)驱动。
USB 控制器作为 Device 时,最上层的是 Gadget Function 驱动,代表了具体设备的驱动,如 U 盘、USB 串口、USB 虚拟网卡、UAC 驱动。Composite 层是一个可选的中间层,可通过一种配置或多种配置高效的支持多种功能的设备,简化了 USB 复合设备驱动的开发。目前最流行的是使用基于 Composite 和 configfs 实现的 USB gadget configfs,可在用户空间灵活的配置 USB 设备。UDC 驱动直接访问硬件,控制 USB 设备与 USB 主机之间的通信。
Bus/Device/Driver模型
"USB接口"是逻辑上的USB设备,我们编写的usb_driver驱动程序,支持的是"USB接口":
USB控制器或Hub识别出USB设备后,会创建、注册usb_dei ...
USB 子系统(三)USB 设备描述符
标准设备请求
SETUP 事务的数据格式
Host 使用控制传输来识别设备、设置设备地址、启动设备的某些特性,对于控制传输,它首先发出"setup 事务",如下:
在"setup 事务"中,
SETUP 令牌包:用来通知设备,"要开始传输了"。
DATA0 数据包:它含有固定的格式,用来告诉设备"是读还是写"、"读什么"、"写什么"。
Hos 通过 DATA0 数据包发送 8 字节数据给设备,它的格式如下图所示:
标准设备请求
控制传输的建立事务中,可以使用下列格式的数据:
上表中各个"宏"取值如下:
设备/配置/接口/端点
在 SETUP 事务的数据里,表示了要访问的是什么:Device?Interface?Endpoint?
对于一个 USB 设备,它可以多种配置 (Configuration)。比如 4G 上网卡就有 2 种配置:U 盘、上网卡。第 1 次把 4G 上网卡插入电脑时,它是一个 U 盘,可以安装里面的程序。装好程序后,把它再次插入电脑,它就是一个上网卡。驱动程序可以选择让它工作于哪种配置,同一时间只能有一种配置。大多数的 USB 设备只有一种配置。
一 ...
USB 子系统(二)USB 协议层数据格式
硬件拓扑结构
compound device :多个设备组合起来,通过 HUB 跟 Host 相连
composite device :一个物理设备有多个逻辑设备 (multiple interfaces)
在软件开发过程中,我们可以忽略 Hub 的存在,硬件拓扑图简化如下:
一个物理设备里面可能有多个逻辑设备,Hos 可以外接多个逻辑设备,硬件拓扑图如下:
协议层
寻址设备阶段:USB 系统是一个 Host 对应多个设备,要传输数据首先要通知设备
发出 IN 令牌包:表示想读数据,里面含有设备地址
发出 OUT 令牌包:表示想写数据,里面含有设备地址
数据传输阶段
Host 想读数据:发出 IN 令牌包后读取数据包
Host 想发出数据:发出 OUT 令牌包后发出数据包
数据确认阶段
Host 读数据,设备可能未就绪,就会回应 NAK 包
Host 写数据,它发出数据后,设备正确接收了,就回复 ACK 包
SYNC 域
Host 发出 SOP 信号后,就会发出 SYNC 信号(前一节的那个 K-J-K-J-K-J-K 信号):它是一系列的、最大传输频率的脉 ...
USB 子系统(一)USB 电器特性
USB 2.0 协议支持 3 种速率:低速 (Low Speed,1.5Mbps)、全速 (Full Speed, 12Mbps)、高速 (High Speed, 480Mbps)。
USB Hub、USB 设备,也分为低速、全速、高速三种类型。一个 USB 设备,可能兼容低速、全速,可能兼容全速、高速,但是不会同时兼容低速、高速。
USB 设备状态切换图
连接 (Attached):USB 设备在已连接到 USB,但还没有上电的时候处于连接状态。
上电 (Powered):USB 设备在已连接到 USB,并且已经上电,但还没有被复位的时候,处于上电状态。 USB 设备的电源获取分为两种,一种是通过外部电源进行获取,另一种是通过设备所连接的集线器 (hub) 处获得电源。通过外部供电的 USB 设备被称为自供电 (self-powered) 设备。尽管自供电设备在连接到 USB 之前可能已经有了电源,但在连接到 USB 并且 VBUS 被应用到设备之前,它们不被认为是处于上电状态。USB 设备可以同时支持自供电和总线供电 (bus-powered) 的配置。某些设备配置支持任一 ...
ISP YUV 域之 CE(Contrast Enhancement)
相关概念
直方图 Histogram
在分析图像数据的统计特性时,有时可以抛弃图像的色度分量,只考察图像的亮度分量,此时可以引入图像的亮度直方图(Luminance Histogram),以常用的 8 位精度图像为例,直方图的 X 轴为 0~255,共 256 个桶,每个桶刚好覆盖 1 个像素值,直方图的 Y 轴表示每个桶盛纳了多少个像素。所有桶中盛纳的像素数加到一起应等于图像的总像素数。
在分析画面的亮暗特征,人们经常把亮度区间定性地划分成暗调、阴影、中调、亮调、高光等几个区域,各区域的边界则可以根据应用特点灵活掌握。
当需要分析图像的颜色特性时,可以引入通道直方图(Channel Histogram),分别对 R/G/B 三个颜色通道进行直方图统计。
对比度 Contrast
图像对比度指的是一幅图像中最亮的白和最暗的黑之间灰度反差的大小。差异越大代表对比越大,否则对比越小。一种常用的定量度量方法是 Michelson 对比度,定义为
\[
C_M = \frac{I_{Max} - I_{Min}}{I_{Max} + I_{Min}}
\]
当一幅图像最白和最黑像素灰度都 ...
ISP YUV 域之 HueAndSaturation
色调 Hue
hue 的定义
hue 可以理解为占主导地位的纯色颜色,或两种纯色颜色的组合。简单来说,hue 就是颜色的“名字”,人们最常用黄色、橙色等概念来描述一个颜色。 Hue is the color portion of the model, expressed as a number from 0 to 360 degrees.
Red: 0 and 60 degrees。
Yellow: 61 and 120 degrees。
Green: 121 and 180 degrees。
Cyan: 181 and 240 degrees。
Blue: 241 and 300 degrees。
Magenta: 301 and 360 degrees。
色调恒常 Hue constancy
描述一个颜色的三个参数是 hue, lightness, chroma (saturation)。
色调恒常是指,当颜色的 lightness/saturation 改变时,色调的感知(sensation)保持不变。否则就是发生了色调漂移(hue shift)。
Tint = 在白色( ...