SPI接口的ADC驱动调试
SPI接口的ADC驱动调试背景最近在学习IIO子系统,顺带调试了个SPI接口的ADC驱动,所以在这简单记录下。这里只简单介绍了适配一个简单SPI接口ADC驱动的流程,不过多深入框架子系统,更多关于IIO子系统的介绍,请见下一篇:
驱动开发dtsdts主要修改或新增以下几点:
spi master控制器相关配置
spi设备节点配置
引脚复用配置
如spi节点配置例子:
&spi0 {
status = "okay";
num-cs = <1>; /* Total number of chip selects */
aaa: aaa@0 {
status = "okay";
reg = <0>; /* Chip select used by the device. */
compatible = "yyy,xxx&quo ...
spidev相关
spidev相关背景有时候会发现,一些外挂的spi的flash或者外设用了spidev这个驱动,没有适配特定的驱动,到底spidev是个啥呢?
spidev:SPI userspace API下面是内核官方文档解释:
SPI devices have a limited userspace API, supporting basic half-duplexread() and write() access to SPI slave devices. Using ioctl() requests,full duplex transfers and device I/O configuration are also available.
它主要包括核内的spidev驱动,相当于spi设备的万能通用驱动, 类似于通用phy驱动,主要代码:
drivers/spi/spidev.c
include/uapi/linux/spi/spidev.h
使用dts匹配驱动设备匹配通用的spidev驱动即可,其他属性参数根据设备硬件特性来写,都是通用的spi属性,和spi.h头文件里面 ...
Termux初探
Termux初探Termux是啥
Termux是一个Android终端模拟器和带有Linux环境的应用程序 无需Root或设置即可直接使用。 自动安装最小的基本系统 - 使用 APT 包管理器可以获得其他软件包
初探前提条件:
一台Android的机器(手机或平板都可)
可以连接外网
有root权限更好
下载安装官方apk下载站点:https://f-droid.org/en/packages/com.termux/
下载最新版本APK并安装到目标机器(Android)上..
启动点击图标启动或命令行启动:
am start com.termux/.HomeActivity
源及软件包管理
更新源及软件包:因为众所周知的原因,我们需要换成国内的镜像源,这里我们换成清华的源,可以直接使用官方的管理工具termux-change-repo进行切换,运行该工具,选择mirrors.tuna.tsinghua.edu.cn即可
更新软件包:
pkg update
pkg upgrade
安装必要软件根据自己需要安装必要软件包:
pkg install vim curl wget git ...
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>;
...