DRIVERS
文章平均质量分 79
那颗流星
提炼升华
展开
-
全志调试总结
1.下载工具有window和Linux版本(可以支持ubuntu20.04),用官网释放的工具就行,有些电脑要关掉安全启动usb驱动才能工作正常,也可以使用开源的usb驱动(https://github.com/linux-sunxi/sunxi-livesuite)。原创 2021-12-18 23:49:15 · 3315 阅读 · 0 评论 -
linux下的extcon驱动小析
量产的项目遇到一个问题,10%的充电线不充电。将这些不良的充电线接到另一个项目或者其他手机上,能正常充电。问题跟着线走,但客户纠结为什么其他手机能充。 拿到问题的usb线后,通过dump_stack函数查看充电流程的堆栈,发现实现充电流程的检测方式不一样。一种是通过vbus来检测充电(这种比较容易理解),另一种通过typec中断(typec线的cc脚会进行握手,标准协议)来检测充电器的插拔。由于typec线不良(内部的电阻阻值不对),导致握手失败,进而不能除非typec中断,所以看...原创 2021-11-07 01:15:59 · 5343 阅读 · 0 评论 -
mtk平台调试总结
1.代码的编译部分私有的代码在modem中,参考平台对应的release_note(在vendor下),进行modem的编译和ap部分私有代码的拷贝。2.工程暗码*#*#3646633#*#*,无相应的测试应用3.调屏用dct工具确认RST脚是否配置成LCM_RST,代码里直接控制相应的寄存器,如果配置不对,会导致rst脚无法拉高,默认应该是LCM_RST的,但笔者使用的工程偏偏是gpio模式,导致无法点亮屏幕。默认只配置一款屏幕时lcm_compare_id函数不跑的,配置了两原创 2021-01-01 23:20:40 · 12681 阅读 · 1 评论 -
Linux下wait_for_completion函数分析
先看个使用实例init_completion(&tx_done_complete);wait_for_completion_timeout(&tx_done_complete,msecs_to_jiffies(100));complete(&tx_done_complete);分析围绕这三个函数进行init_completionstruct completion { unsigned int done; wait_queue_head_t wait;};原创 2020-09-19 11:53:10 · 3230 阅读 · 0 评论 -
linux下ioctl小结
cmd由一个int型整数组成方向/DIR 大小/SIZE 幻数/TYPE 序数/NR 30-31 16-30 15-8 7-0 #define _IOC(dir,type,nr,size) \ (((dir) << _IOC_DIRSHIFT) | \ ((type) << _IOC_TYPESHIFT) | \ ((nr) << _IOC_NRSHIFT) | \ ((size) << _原创 2020-09-13 18:43:48 · 355 阅读 · 0 评论 -
kernel模块参数的一点思考
如果模块需要带参数,可参考static unsigned int pcm_debug = 0;module_param(pcm_debug, int, 0644);MODULE_PARM_DESC(pcm_debug, "enable debug messages for pcm");运行个驱动看看#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#incl.原创 2020-09-13 16:38:57 · 280 阅读 · 0 评论 -
Linux读写int型数组demo
看内核的代码,copy_from_user/copy_to_user都是以char为单位的,如果用户空间要读写一个int型的数组到内核空间,要怎么写呢,给出示例,供大家参考。#include <linux/module.h>#include <linux/init.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/wait.h>#include <lin原创 2020-08-22 22:00:36 · 274 阅读 · 1 评论 -
Android中间层c语言log打印方法
在Android中,中间层的C代码要打印出日记,有如下两种方法1.往串口里打印数据调用log_to_kmsg函数,然后adb shell dmesg查看日记或者接串口连接电脑来查看,如log_to_kmsg("the num is %d\n",ret);#include <stdio.h> #include <string.h> #include <fcntl.h>#include <stdarg.h> static void原创 2020-07-12 19:33:37 · 857 阅读 · 0 评论 -
记一次misc_register注册失败
在看内核log时,发现有一个misc_register注册失败的warning。一开始以为配置的参数有误,看代码也使用了参数MISC_DYNAMIC_MINOR,不太可能出现注册失败的情况。int misc_register(struct miscdevice * misc){ dev_t dev; int err = 0; bool is_dynamic = (mi...原创 2020-04-09 22:04:03 · 1669 阅读 · 3 评论 -
Linux下的DMA学习
最近在忙一个竖屏转横屏项目,使用的是spi接口的竖屏(cpu不带dpu,横屏lcd比竖屏lcd成本高),使用的方案就是利用dma的特性,将横屏的数据进行一定规则的搬运(设置dma的搬运规则,从左下角搬运第一列作为第一行,搬完所有的列)转换成竖屏的数据,然后发送到lcd。常见的通信接口i2c,spi,i2s有fifo,dma两种通信方式。fifo每次传输的数据量不大,dma能进行大...原创 2020-04-05 18:20:28 · 1852 阅读 · 1 评论 -
dts语法记录
1.复写sp9863a-common.dtsi{ battery: battery { temp-support = <0>; }}sp9863a-1h10-native.dtsi&battery { temp-support = <1>;}2.删除sp9863a-common.dtsi{...原创 2020-03-21 13:59:37 · 744 阅读 · 3 评论 -
Linux下的dump_stack
当kernel出现错误时,会打印堆栈信息,我们可以根据信息追溯问题的来源,该函数实行如下/** * dump_stack - dump the current task information and its stack trace * * Architectures can override this implementation by implementing its own. ...原创 2019-12-01 23:43:44 · 817 阅读 · 0 评论 -
内核中读写分区的例子
如果要在内核中读写分区,可参考如下例子。 基本思想是将分区当成普通的文件,在驱动中直接读写文件(可参考http://blog.csdn.net/mike8825/article/details/50906429),例子如下#include <linux/kernel.h>#include <linux/module.h>#include <linu...原创 2016-07-18 19:44:51 · 4307 阅读 · 2 评论 -
浅谈硬件的复位脚
芯片的复位脚我们再熟悉不过了,一般都是拉低电平,并保持一段时间就可以硬件复位芯片,下面几个案例是在实际调试芯片中由于复位脚处理不当引起的问题。1.芯片的复位脚一直处于低电平,导致cpu与芯片通信不上,这种问题还是挺好排查的。2.一个gps芯片接到了cpu的串口1,一个蓝牙芯片接到了cpu的串口2上,这两种器件单独工作都没有问题,但当使用蓝牙后,再去使用gps,发现gps搜不到信号,原来gp...原创 2016-09-24 23:32:39 · 11083 阅读 · 0 评论 -
工作队列的使用
这里提供一下工作队列使用的例子,这里使用工作队列来循环打印一个消息。#include #include #include #include static struct workqueue_struct *queue=NULL;static struct work_struct work;static struct delayed_work delay_work;struct原创 2016-09-17 21:10:47 · 1011 阅读 · 0 评论 -
在驱动中执行shell脚本的一种方法
有时需要在驱动中,执行shell脚本,这时可通过用户层来实现。具体的实现为uevent.c#include #include #include #include #include #include #include #include #define DEVICE_NAME "uevent"#define FIFO_SIZE 1024static DEFINE_MUTE原创 2016-08-07 16:18:40 · 4478 阅读 · 2 评论 -
Linux下SPI和IIC驱动免在设备树上添加设备信息的编写方法
编写i2c或spi驱动时,一般需要往设备树上添加节点信息,这里提供一种直接在驱动中添加设备信息的方法,使驱动更方便移植。i2c的驱动模板如下#include #include #define SENSOR_BUS_NUM 0 //该设备在第几路iic上,根据硬件具体修改#define SENSOR_SLAVE_ADDRESS 0x3e//设备地址,注意是7位地址(原创 2016-05-07 13:24:46 · 7914 阅读 · 3 评论 -
Android固件加载出错(load failed with error -2)
在Android下移植一个降噪模块的驱动到另一个平台,加载固件的时候报错[ 137.659357] xxxxx 0-002c: Direct firmware load failed with error -2[ 137.665773] xxxxx 0-002c: Falling back to user helper查看-2代表的错误码可知,-2代表找不到文件...原创 2016-04-17 00:31:23 · 11025 阅读 · 0 评论 -
Linux下的按键驱动
某主板按键dts配置如下gpio_keys { compatible = "gpio-keys"; input-name = "gpio-keys"; status = "okay"; key_power { label = "Power Key"; linux,code = &l...原创 2019-12-01 22:48:35 · 3064 阅读 · 2 评论 -
cmdline参数解析
有时需要通过cmdline传参给内核并解析,可以参考内核的setup宏,如static int __init console_suspend_disable(char *str){ console_suspend_enabled = 0; return 1;}__setup("no_console_suspend", console_suspend_disable);st原创 2017-04-04 17:39:30 · 1627 阅读 · 0 评论 -
修改Android内核配置
源码编译完成后,如果需要修改内核配置,可参考如下方法先配置make menuconfig后保存make kernel-savedefconfig具体定义kernel/Android.mkkernel-savedefconfig: $(TARGET_KERNEL_CONFIG) cp $(TARGET_KERNEL_CONFIG) $(KERNEL_CO原创 2017-08-12 10:41:35 · 12753 阅读 · 0 评论 -
Android驱动模块Makefile编写
Android平台的驱动编译跟普通的linux驱动编写有一点区别,主要区别在Makefile文件(需要交叉编译),这里以hello.c文件为例#include <linux/module.h>static int __init hello_init(void){ printk(KERN_INFO "%s\n",__FUNCTION__); r...原创 2016-01-11 11:28:02 · 2593 阅读 · 1 评论 -
switch_dev_register函数demo
#include#include#include #include static struct switch_dev switch_data;static ssize_t inquire_state_show(struct device *dev,struct device_attribute *attr, char *buf) { return sprintf(buf,原创 2018-02-01 18:46:10 · 1771 阅读 · 0 评论 -
展讯调试总结
1.IO配置u-boot15/board/spreadtrum/xxx/pinmap-xxx.c{REG_PIN_SDA2, BITS_PIN_AF(0)},{REG_MISC_PIN_SDA2, BITS_PIN_DS(1)|BIT_PIN_WPUS|BIT_PIN_WPU|BIT_PIN_SLP...原创 2018-07-09 21:00:55 · 22036 阅读 · 2 评论 -
module_init函数调用过程
include/linux/init.h#define define early_initcall(fn) __define_initcall(fn, early)/* * A "pure" initcall has no dependencies on anything else, and purely * initializes variables that couldn't b...原创 2019-06-01 18:17:03 · 548 阅读 · 0 评论 -
linux驱动中的总线理解
linux设备驱动归纳总结http://blog.chinaunix.net/uid/25014876.html原创 2016-01-08 23:33:33 · 2574 阅读 · 0 评论 -
一种通过U盘热插拔的升级方法
在调试Android驱动中,有时会遇到无法使用adb的情况,如果能通过U盘的热插拔能运行一些命令,就可解决adb无法使用的困境。原创 2016-07-20 17:35:20 · 1991 阅读 · 0 评论 -
Linux设备驱动第三版快速参考摘录
本文摘自Linux设备驱动第三版中的快速参考。原创 2016-03-05 20:15:08 · 616 阅读 · 0 评论 -
内核通知链例子
如果模块A要发信息给模块B,可采用内核通知链的方式,这里提供最简单的例子。notifier_chain.c#include #include #include static BLOCKING_NOTIFIER_HEAD(test_chain_head);int register_test_notifier(struct notifier_block *nb){ re原创 2016-07-30 12:02:19 · 654 阅读 · 0 评论 -
内核异步通知的例子
内核异步IO的介绍见http://blog.chinaunix.net/uid-25014876-id-62725.html,本文讲原文的例子进行了一定的改造,通过定义器的方法,定时时间一到就通过异步通知的方法发给上层的应用,应用捕捉到相应的信号后,执行相应的操作。#include #include #include #include #include #include #in原创 2016-07-12 15:38:34 · 540 阅读 · 0 评论 -
关于构造IOCTL命令的学习心得
在编写ioctl代码之前,需要选择对应不同命令的编号。为了防止对错误的设备使用正确的命令,命令号应该在系统范围内唯一,这种错误匹配并不是不会发生,程序可能发现自己正在试图对FIFO和audio等这类非串行设备输入流修改波特率,如果每一个ioctl命令都是唯一的,应用程序进行这种操作时就会得到一个EINVAL错误,而不是无意间成功地完成了意想不到的操作。 要按Linux内核的约定方法为驱动程转载 2016-06-30 15:13:58 · 664 阅读 · 0 评论 -
内核中的kfifo的例子
关于内核的kfifo介绍,可参考http://www.cnblogs.com/Anker/p/3481373.html咱玩一点理论性没这么强的东西,先那个例子来跑一下就知道是怎么回事了。这里以内核下的samples/kfifo/record-example.c为例/* * Sample dynamic sized record fifo implementation * *原创 2016-03-25 18:07:29 · 4513 阅读 · 0 评论 -
Linux下的旋钮驱动
先看一次正旋和反旋波形上差异可以看出两个波形慢了一个相位,如图中,判断正反旋的一种方法如下绿色信号线下降开始监听黄色的信号线的状态,如果是下降沿,判断为正旋,如果是上升沿,判断为反旋,绿色信号线上升结束一次监听 正旋输出 反旋输出#include<linux/module.h>#include<li...原创 2019-12-04 14:42:02 · 3855 阅读 · 6 评论 -
Linux Notifier Chains
Linux Notifier Chains1. 引言Linux是单内核架构(monolithic kernel),大多数内核子系统和模块是相互独立的,它们被动态地加载或卸载,以使内核变得小巧和可扩展。然而,子系统或模块之间需要通信,或者说某个特定模块扑捉到的事件可能其它模块对此感兴趣,这就需要一种机制来满足子系统或模块之间交互的需求。Linux使用通知链表来实现这一需求,它是一个转载 2016-04-06 00:01:43 · 395 阅读 · 0 评论