Linux之watchdog
Linux之watchdog使用都是通过/dev/watchdog设备节点来操作使用
通过命令# 写入除大写字母‘V’外的任意字符,开启看门狗,每 44 秒内需要写入一次(喂狗)
echo A > /dev/watchdog
# 开启看门狗,并且内核会每隔 22 秒自动喂一次狗
echo V > /dev/watchdog
通过应用程序示例如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main(void)
{
/*通过open来启动watchdog*/
int fd = open("/dev/watchdog", O_WRONLY);
int ret = 0;
if (fd == -1) {
perror("watchdog");
exit(EXIT_FAILURE);
}
while (1) {
/*通过write来喂狗 等同于 ioctl(fd, WDIOC_KE ...
nRF52832调试相关记录
nRF52832调试相关记录背景以前业余用nRF52832做了个物联网小项目(蓝牙微微网),做了些相关的调试记录
nRF52832寄存器类型
Task: 任务寄存器,可以由程序或事件触发
Event: 事件寄存器,事件可以产生中断和触发任务
Register: 普通寄存器,和一般单片机的寄存器一样
Jlink Keilkeil5带的驱动过高为v6.16,手头上的jlink固件为V8,所以要下载4.9的驱动,最后用的是V6.12j,可以在jlink官网上下载。替换MDK(MDK524)安装目录下的Segger文件夹,
报Clone,重刷jlink的V8固件,自定义ID,SN
在KEIL中设置中使用jink报错:error:cannot load driver".....JL2CM3.dll" :将keil安装目录的Segger路径,如D:\Keil_v5\ARM\Segger添加到系统环境变量
用Sergger包覆盖Keil安装目录下的
nRFgo Studio 和 Nrfjprog 无法找到JLinkARM.dll的解决方法:手动修改注册表jlink安装的相应 ...
Android源码编译相关
Android源码编译相关Android源码国内镜像:https://lug.ustc.edu.cn/wiki/mirrors/help/aosp
编译环境配置:一般在Ubuntu 64位(18.04等)下面编译安装必要的软件包及OpenJDK:
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev lib32z1 x11proto-core-dev libx11-dev lib32readline6-dev lib32z1-dev libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc
编译源码每个芯片平台可能略有差异
source build/envsetup.sh
lunch #32
make update-api
make -j4
make aboot -j4
mak ...
Android网络设置
Android网络设置路由操作android4.4之前的版本,只使用了一份路由表,可以通过route命令操作Android5.0之后,考虑要对多网络的支持,采用了多路由表,网络的功能实现完全转移到netd上面,主要包括ip,路由配置,dns代理设置,带宽控制和流量统计等
3 种路由类型主机路由主机路由是路由选择表中指向单个IP地址或主机名的路由记录。主机路由的Flags字段为H。例如,在下面的示例中,本地主机通过IP地址192.168.1.1的路由器到达IP地址为10.0.0.10的主机。
Destination Gateway Genmask Flags Metric Ref Use Iface
----------- ------- ------- ----- ------ --- --- -----
10.0.0.10 192.168.1.1 255.255.255.255 UH 0 0 0 eth0
网络路由网络路由是代表 ...
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 ...