RK3399-auto_generator支持armv8
RK3399-auto_generator支持armv8背景
Platform: RK3399
OS: Android7.1.2
Kernel: v4.4.103
RK3399 auto_generator脚本支持armv8:
#!/usr/bin/env python
import sys
import os
import re
import zipfile
import shutil
templet = """include $(CLEAR_VARS)
LOCAL_MODULE := %s
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/%s
LOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_DEX_PREOPT := false
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX : ...
swap相关概念
swap相关概念zram内核文档:Documentation/admin-guide/blockdev/zram.rst
zram: Compressed RAM based block devicesThe zram module creates RAM based block devices named /dev/zram( = 0, 1, …). Pages written to these disks are compressed and storedin memory itself. These disks allow very fast I/O and compression providesgood amounts of memory savings. Some of the usecases include /tmp storage,use as swap disks, various caches under /var and maybe many more :)
Statistics for individual zram devices are exported ...
蓝牙耳机音量控制问题
蓝牙耳机音量控制问题背景之前测试提了一个蓝牙音量相关的BUG: 调节蓝牙耳机音量,系统音量不跟随变化,即耳机音量没有和系统音量同步;
虽然知道是绝对音量的问题,但不太清楚整个具体流程,特此记录下
分析与解决音量调节的流程音量调节的整个流程:
蓝牙
OS(数字音量)<-- --> 蓝牙耳机(数字音量+模拟音量)
在使用蓝牙耳机时,
调节OS上的音量当调节OS上的音量时, 其调节的是数字音量,即调整了蓝牙传输的数字音频数据增益,从而使耳机听起来的音量有所变化
调节蓝牙耳机上的音量当调节蓝牙耳机上的音量时,一般是直接调节蓝牙芯片的数字音量,使DAC出来的音量发生变化,所以这种情况下一般不会对OS的音量有所影响。
蓝牙的绝对音量如果在调节蓝牙耳机上的音量时,需要将耳机音量同步给OS系统该怎么办呢? 也是可以做的,蓝牙协议已经帮忙考虑到这一点了,即设置蓝牙的绝对音量,需要走AVRCP协议,并且主机和蓝牙耳机都要支持该协议
具体流程见下图:
首先,主机(OS)需向耳机注册音量变化的通知事件
耳机回复临时的响应
当用户调节耳机音量时,就会有音量变化的事件上报给 ...
一个静态全局变量初始化引发的讨论
一个静态全局变量初始化引发的讨论背景最近在提交的一个补丁,引发了一个静态全局变量初始化的讨论, 主要还是理论基础不够扎实,特此记录
具体的情况是这样的:在一个补丁中,我定义了一个静态的全局变量,来存储启动参数传过来的值。开始补丁中的这部分是这样的:
static bool alc269_restore_verbs = false;
但使用补丁检查工具检查时,报如下的错误:
./scripts/checkpatch.pl 0001-xxx.patch
ERROR: do not initialise statics to false
后面就在提交补丁的时候,把这个初值去掉了,然后在群里引起了一阵讨论。
通过网上查了查,和大家的讨论, 去掉初值主要是基于以下原因:静态全局变量会默认初始化为0,如果初值为0就没必要进行初始化,是多此一举。
在C语音编译的时候,已初始化的全局变量就保存在.data段中,未初始化的全局变量保存在.bss段中。
BSS段通常是指用来存放程序中未初始化的或者初始化为0的全局变量和静态变量的一块内存区域。特点是可读写的,在程序执行之前BSS段会 ...
内核模块参数
内核模块参数背景接上一篇 内核启动参数cmdline
上一篇主要讨论了不是模块的情况下,内核启动参数的传递解析过程及使用:early_param()和__setup(),这篇主要讨论下模块的情况
相关内核文档:Documentation/admin-guide/kernel-parameters.rst等
内核模块添加参数module_param(参数名, 参数类型, 0644);
MODULE_PARM_DESC(参数名, "参数说明.");
内核模块参数使用分3种方式:
内核启动cmdline模块名.参数=xxx
模块加载cmdlinemodprobe 模块名 参数=xxx
动态修改/ sys / module / <模块名> / parameters/参数
例如:
(kernel command line) usbcore.blinkenlights=1
(modprobe command line) modprobe usbcore blinkenlights=1
内核模块定义和解析过程定义下面是module_param定义(include/ ...
记一次UAC无法使用的bug
记一次UAC无法使用的bug现象最近遇到一个BUG,一个USB摄像头自带的MIC没法在Linux下使用。记录下UAC相关排查过程
分析查看驱动加载及节点使用lsusb可以看到,该UAC的设备已经加载对应通用驱动snd-usb-audio:
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 480M
|__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 4: Dev 4, If 0, Class=Hub, Driver=hub/4p, 480M
|__ Port 1: Dev 6, If 0, Class=Mass Storage, Driver=usb-storage, 480M
|__ Port 2: Dev 8, If 0, Class= ...
Kernel之模块版本检查
Kernel之模块版本检查背景通过insmod或modprobe加载核外驱动ko时,特别是第三方驱动,经常会遇到模块版本检查报错,类似:
version magic '5.4.96-xx SMP preempt mod_unload aarch64' should be '5.4.96-yy SMP preempt mod_unload aarch64'
那我们就来看看模块版本检查的大致过程
Kernel: v5.4.96vermagic: version magic
过程分析内核相关源码:kernel/module.c逻辑过程比较简单check_modinfo() -> same_magic()check_modinfo() 函数首先获取模块相关的modinfo,即modmagic,然后会和内核的vermagic做对比,即same_magic()函数
可以通过cat /proc/version 来查看linux 系统的 vermagic ,对于module, 可以通过modinfo xxx 的方式来查看module的 vermagic
che ...
Kernel之MODVERSION
Kernel之MODVERSION官方说明关于modversion,内核文档官方解释(Documentation/kbuild/modules.rst):
6 Module Versioning Module versioning is enabled by the CONFIG_MODVERSIONS tag, and is used as a simple ABI consistency check. A CRC value of the full prototype for an exported symbol is created. When a module is loaded/used, the CRC values contained in the kernel are compared with similar values in the module; if they are not equal, the kernel refuses to load the module.
Module.symvers contains a list of all export ...
Kernel之vermagic
Kernel之vermagic内核的vermagic内核的vermagic类似于:5.4.96-xx SMP preempt mod_unload aarch64
内核的vermagic即为VERMAGIC_STRING``(include/linux/vermagic.h)
static const char vermagic[] = VERMAGIC_STRING;
/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#elif defined(CONFIG_PREEMPT_RT)
#define MODULE_VERMAGIC_PREEMPT "preempt_rt "
#else
#define MODULE_VER ...
科普贴--电源管理的几种状态
科普贴–电源管理的几种状态G状态针对系统整个平台来定义,肉眼可以识别。我们根据吃电量大小,软件是否工作,外部事件触发到工作状态的延时时间,拆机是否安全等来判断系统处于哪种状态
G0:工作状态,操作系统分发用户线程并执行。在此状态中,外围设备吃电量可以改变。
G1:显示器关闭,用户态线程不再执行。系统状态S1,S3,S4均属G1状态。返回G0状态用时比G2短。
G2:关机状态,硬件不会保存软件环境,需要较长时间才能返回到工作状态。此状态也称为soft off。
G3:也称Mechanicaloff,除RTC电开启外,再无其它电,此种状态下,我们拆机不会有短路风险
S状态系统状态,这种状态是针对OS所定义。G状态中除了G3,其余G0,G1和G2分别有相应的状态与之相对应。S状态的判定:可根据平台吃电量大小,系统返回工作状态的延时时间来判定。
S0:工作状态,和G0相同。
S1:CPU时钟信号被停止,CPU有较低的功耗,返回到S0的时间较短。
S3:即我们常说的睡眠状态。此状态下,系统环境保存在内存里面。设备带电方面:只有内存VCC保留,其余设备全部关闭。时钟方面:只有RTC时钟依然有 ...
科普贴--几种内核文件
科普贴–几种内核文件
vmlinux: ELF文件,编译出来的最原始的内核文件,未压缩, 不可引导,根据vmlinux.lds生成
Image: 经过objcopy处理的只包含二进制数据的内核代码,不是elf格式,未压缩
zImage: 是vmlinux经过gzip压缩后的文件,适用于小内核
bzImage: bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。
uImage: U-boot专用的映像文件,在zImage之前加上一个长度为0x40的tag,tag包含了该镜像文件的类型、加载位置、生成时间、大小等信息
vmlinuz: 可引导,压缩,是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接
initrd: “initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态,比如加载ext3 ...
Kernel之seq_file接口
Kernel之seq_file接口背景最近在看/proc/cpuinfo的内核实现时,发现了一个以前没注意的东东: seq_file接口
seq_file(Sequence file:序列文件)接口内核文档: Documentation/filesystems/seq_file.txt
There are numerous ways for a device driver (or other kernel component) toprovide information to the user or system administrator. One usefultechnique is the creation of virtual files, in debugfs, /proc or elsewhere.Virtual files can provide human-readable output that is easy to get atwithout any special utility programs; they can also make life easier ...