Kernel之共享中断
Kernel之共享中断背景最近有个测试用例的需求,是关于中断管理的。在现有的硬件基础上,实现以下功能:
缺省情况下提供默认的中断处理程序
能使能和屏蔽某一特定中断
后面用共享中断实现了这个测试用例
共享中断有时候多个设备可能共享一根硬件中断线,在现实应用场景中广泛存在,特别像PCI控制器,GPIO等,所以内核提供了这种中断共享的机制。
下面是中断共享的使用及注意点:
共享中断的多个设备在申请中断时,都应加上 IRQF_SHARED 标志,而且一个设备以IRQF_SHARED申请某中断成功的前提是该中断未被申请,或该中断虽然被申请了,但是之前申请该中断的所有设备也都以IRQF_SHARED标志申请该中断。
尽管内核模块可访问的全局地址都可以作为request_irq(…,void*dev_id)的最后一个参数dev_id,但是设备结构体指针显然是可传入的最佳参数。
在中断到来时,会遍历执行共享此中断的所有中断处理程序,直到某一个函数返回IRQ_HANDLED。在中断处理程序顶半部中,应根据硬件寄存器中的信息比照传入的dev_id参数迅速地判断是否为本设备的中断,若不是,应迅速返回 ...
Kernel之通知链
Kernel之通知链背景最近在调触摸屏,看代码时偶然看到了通知链相关的代码,加上之前刚好了解了一点通知链相关的东东,所以特此记录下。在触摸屏驱动中的主要功能就是在开关屏的时候通知TP进行resume和suspend操作,大致的伪代码如下,以我看的elan的TP驱动为例:
...
/* 通知链的事件回调函数,收到通知TP进行resume和suspend操作 */
static int fb_notifier_callback(struct notifier_block *self,
unsigned long event, void *data)
{
struct fb_event *evdata = data;
int *blank;
struct elan_ts_data *ts =
container_of(self, struct elan_ts_data, fb_notif);
if (evdata && evdata->data && event == FB_EVENT_BLANK && ts ...
Linux蓝牙文件传输速率低问题分析及延伸
Linux蓝牙文件传输速率低问题分析及延伸[TOC]
背景最近调试了一个BUG:在两台装Kylin的PC之间,连接蓝牙,然后相互传输文件,速率只有20几Kb/s。正常情况有100多Kb/s。
使用了obex协议传输文件
分析分析系统日志,未有明显的错误或警告日志
开始抓包分析发送方的抓包:从上图可以看出,在发送obex包的时候,中间夹杂着很多sco的语音包
接收方的抓包:从上图可以看出,在接收obex包的时候,中间也夹杂着很多sco的语音包,而且obex包被拆包了,拆成了好几个包
当2台电脑连接成功后,应用上层会默认切换音频通路及输入输出设备,并默认会开启SCO语音链路。经验证,手动切换输入设备,obex传输文件速度就会恢复成正常的100多Kb/s。还有一种方式,在已配对并且非连接状态下,进行蓝牙文件传输,速率也是正常的
从发送和接收的抓包来看,抓到的发送和接收obex包的时候都有分包,只不过发送分包大些,接收的分包小些。
延伸:ACL数据包及L2CAP分包重组文件传输走的是ACL链路,ACL数据包及L2CAP分包重组我们看看ACL的数据包格式:其中header中有个与分包组包相关 ...
btmon获取hci数据流程
btmon获取hci数据流程背景最近在看蓝牙相关的驱动代码,追到hci接收数据处理函数hci_rx_work()(net/bluetooth/hci_core.c),瞄到下面一段代码:
...
while ((skb = skb_dequeue(&hdev->rx_q))) {
/* Send copy to monitor */
hci_send_to_monitor(hdev, skb);
...
}
在hci发送数据的处理函数hci_send_frame()中也有类似的代码片段:
...
/* Time stamp */
__net_timestamp(skb);
/* Send copy to monitor */
hci_send_to_monitor(hdev, skb);
if (atomic_read(&hdev->promisc)) {
/* Send copy to the sockets */
hci_send_to_sock(hdev, skb);
}
... ...
电量计驱动的简易框架
电量计驱动的简易框架背景最近调试了一个电量计的问题,顺便把电量计驱动的框架简单梳理了一下
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 ...