电量计驱动的简易框架
电量计驱动的简易框架背景最近调试了一个电量计的问题,顺便把电量计驱动的框架简单梳理了一下
Kernel: 5.15
以cw2015电量计的驱动为例
整体框架代码主要位于:drivers/power/supply/,power supply class的实现,具体的电量计、充电IC等设备驱动都在此目录下
整体框架大致如下:
power supply class
power supply class为编写供电设备(power supply,后面简称PSY)的驱动提供了统一的框架,功能包括:
抽象PSY设备的共性,向用户空间提供统一的API。
为底层PSY驱动的编写,提供简单、统一的方式。同时封装并实现公共逻辑,驱动工程师只需把精力集中在和硬件相关的部分即可。
power supply class主要由4部分组成:
power supply core,用于抽象核心数据结构、实现公共逻辑。对应drivers/power/supply/power_supply_core.c。
power supply sysfs,实现sysfs以及uevent功能。对应drivers/power/s ...
Kernel之debug调试信息
Kernel之debug调试信息背景平时我们在调试内核或驱动的时候,需要打开或增加调试信息,最常见的比如dev_dbg()、pr_debug()等以内核v5.15为例,我们先来看一下上面2个日志打印函数在内核里面的大致定义:
dev_dbg() [include/linux/dev_printk.h] #if defined(CONFIG_DYNAMIC_DEBUG) || \
(defined(CONFIG_DYNAMIC_DEBUG_CORE) && defined(DYNAMIC_DEBUG_MODULE))
#define dev_dbg(dev, fmt, ...) \
dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
#elif defined(DEBUG)
#define dev_dbg(dev, fmt, ...) \
dev_printk(KERN_DEBUG, dev, dev_fmt(fmt), ##__VA_ARGS__)
#else
#define ...
docker pull timeout问题
docker pull timeout问题背景最近在用docker搭个开发环境, 参照的是之前记录的那个笔记:Docker相关
发现在拉取镜像的时候有点问题,即使用如下命令
docker pull ubuntu:18.04
报错:
“net/http: TLS handshake timeout”
这个主要是因为docker默认镜像拉取地址为国外仓库,会存在网络上的各种问题,你懂的
解决只需要将拉取地址换为国内容器镜像仓库即可,这里使用阿里云的
阿里云需要自己创建自己独有的容器镜像加速器地址,具体步骤如下:
获取加速器地址使用自己的账号登陆阿里云的容器镜像服务控制台:https://cr.console.aliyun.com/依次选择:容器镜像服务 -> 镜像工具 -> 镜像加速器然后就可以看到加速器地址,比如我的就是:https://rkobk8tk.mirror.aliyuncs.com
配置使用加速器修改daemon配置文件(/etc/docker/daemon.json)来使用加速器:
sudo mkdir -p /etc/docker
sudo tee ...
关于fallthrough
关于fallthrough背景及问题最近在从低版本的内核向高版本的内核移植驱动, 碰到了如下类似的报错:
error: this statement may fall through [-Werror=implicit-fallthrough=]
是与 fallthrough 相关的,查看代码,发现以前用的是:
/* fall through */
新版本的好像不行了,改为下面的就OK了:
fallthrough;
关于fallthroughfallthrough属性主要用于switch语句中
如果当前case分支中不加break,便会继续执行下一个case分支的代码,而很多初学者容易犯这样的错误:在本应当在case分支中加入break的时候却忘了加。于是编译器会针对这种情况输出Warning信息,提醒可能忘了加break。但是有些时候我们为了实现一些特定的逻辑,不能加break,但是又不想看到编译器报的警告,该怎么办呢?此时fallthrough便派上用场了,在不加break的地方加上fallthrough
不同的编译器版本,对于fallthrough的写法要求是 ...
Linux之PWM背光驱动
Linux之PWM背光驱动概述
Platform: RK3588/RK356X
OS: Linux
Kernel: v5.10
通过PWM调光的背光一般我们使用的是通用的PWM背光驱动,调用pwm的接口,实现对pwm占空比的调整,从而实现对背光亮度的控制
代码DTS常见的dts配置如下:
backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm4 0 25000 0>;
brightness-levels = <
0 20 20 21 21 22 22 23
23 24 24 25 25 26 26 27
...
240 241 242 243 244 245 246 247
248 249 250 251 252 253 254 255
>;
default-brightness-level = <200>;
...
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)需向耳机注册音量变化的通知事件
耳机回复临时的响应
当用户调节耳机音量时,就会有音量变化的事件上报给 ...