安卓驱动开发
文章平均质量分 71
无
深海带鲤鱼
巩固知识
展开
-
Linux下I2C-tools工具使用
1.i2cdetect扫描I2C总线上的设备i2ctransfer -y -f 1 w2@0x62 0x00 0x00 r321.1 i2cdetect -l查看当前系统的I2C总线总线挂载了I2C设备,可通过i2cdetect扫描每一个总线的所有设备i2cdetect -y -r 1:查看总线1上的所有从设备("–"表示地址被检测到了,但是没有芯片,"UU"表示地址正在被某一个驱动使用,而16进制的地址号60,1e和50则表示发现了一个外部片选从地址为0x60,0x13(AP3216)和0x原创 2021-10-10 23:35:50 · 12494 阅读 · 0 评论 -
增加背光控制结点
文章目录1.在驱动中添加sysfs文件结点2.修改结点权限1.在驱动中添加sysfs文件结点static ssize_t backlight_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count){ struct gac_data *data = dev_get_drvdata(dev); int ret; int level; u8 write_buf[4]; u原创 2021-10-25 23:03:34 · 175 阅读 · 0 评论 -
内核态的printk函数-printf
printk简介在Linux内核中没有printf函数,那么内核是怎么打印调试信息的呢,这里我们用到的是printk函数,在内核中想要向控制台输出或者显示一些内容,必须需要printk函数,这个函数。不同之处在于, printk可以根据日志级别对消息进行分类,一共有 8个消息级别,这 8个消息级别定义在文件 include/linux/kern_levels.h里面,定 义如下:#define KERN_SOH "\001" #define KERN_EMERG KERN_SOH "0" /* 紧急事原创 2020-12-12 12:02:01 · 1032 阅读 · 0 评论 -
Linux设备树驱动编程-基于pinctrl和gpio子系统
my_driver.c#include "my_led_driver_reg.h" static void led_switch(int iLedSta){ switch(iLedSta) { case LED_ON: gpio_set_value(led_device.led_gpio,LOW_LEVEL); break; case LED_OFF: gpio_set_value(led_device.led_gpio,HIGH_LEVEL); break;原创 2021-01-07 22:47:12 · 536 阅读 · 0 评论 -
用户态open函数如何调用内核态open函数
1.图示首先使用华清远见的一张图式,比较清晰,本文会从用户态到内核态进行大致的分析2.虚拟文件系统简介在Linux系统中,对文件的操作抽象为对虚拟文件系统的操作,虚拟文件系统屏蔽了底层逻辑,使用多态的方式将不同的文件系统的操作接口赋值给虚拟文件系统,从而使得对文件的操作变为对虚拟文件系统的操作.每一个文件都用一个inode结点表示。在Linux系统中一个进程使用一个task_struct结构体表示,其中有一个抽象对象为file_struct指针,对于进程中的文件进行管理,在file_struct中有原创 2022-05-17 00:52:20 · 1115 阅读 · 1 评论 -
Linux设备模型-kobject
theme: github每一个kobject对象都会关联一个sysfs文件目录,本节重点关注如何将kobject对象与sysfs文件系统关联起来,关注kobject对象默认的属性文件操作接口1.kobject首先看一下kobject的结构体定义include/linux/kobject.hstruct kobject { const char *name; struct list_head entry; struct kobject *parent; struct kset *k.原创 2022-04-05 00:01:54 · 3711 阅读 · 2 评论 -
Linux设备模型基础
1.前言字符设备驱动是最简单的驱动,实现对设备文件的打开,读写操作,但对于一些更加复杂的功能使用字符设备驱动框架来写可能完成不了这个功能,比如电源管理,热插拔事件,在Linux内核中I2C驱动,SPI驱动,PCIE驱动都使用设备模型来完成驱动的编写。如果说字符设备驱动编写相当于在大山深处造房子,水电等基础设施要自己建造,那么使用设备模型编写驱动则相当于在城区建新房,水电直接使用就可以。在Linux内核中,设备模型的基本元素由kobject,kset,ktype组成,每一个kobject都对应sysfs文件原创 2022-04-04 16:57:46 · 1205 阅读 · 0 评论 -
Linux设备驱动模型-基本概念
1. 前言在“Linux内核的整体架构”中,蜗蜗有提到,由于Linux支持世界上几乎所有的、不同功能的硬件设备(这是Linux的优点),导致Linux内核中有一半的代码是设备驱动,而且随着硬件的快速升级换代,设备驱动的代码量也在快速增长。个人意见,这种现象打破了“简洁就是美”的理念,是丑陋的。它导致Linux内核看上去非常臃肿、杂乱、不易维护。但蜗蜗也知道,这不是Linux的错,Linux是一个宏内核,它必须面对设备的多样性,并实现对应的驱动。为了降低设备多样性带来的Linux驱动开发的复杂度,以及设备转载 2022-03-20 16:58:40 · 1186 阅读 · 0 评论 -
18.Linux驱动基础-mode_t内核文件权限定义
S_IWUSR:用户可写权限S_IRUSR:用户可读权限S_IRGRP:用户组可读权限S_IWGRP:用户组可写权限S_IROTH:其他组读权限S_IWOTH:其他组写权限原创 2021-11-21 11:06:55 · 909 阅读 · 0 评论 -
17.Linux驱动基础-devmem2工具调试工具使用
在驱动调试中有时候需要看SOC寄存器的值,可以使用devmem2工具来查看,下载和编译cd mydroid/external/git clone https://github.com/giraffesnn/devmem2.gitcd mydroidsource build/envsetup.shlunch xxxxcd mydroid/external/devmem2/mmadb rootadb remount adb push out/target/product/xxx/sy原创 2021-11-21 11:05:28 · 3186 阅读 · 0 评论 -
16.Linux内核同步机制-compietion
completion是一种轻量级的内核同步机制,它的作用的一个线程告诉另一个线程工作已经完成,类似与Linux应用的信号量,有两种创建方式1.静态宏创建DECLARE_COMPLETION(completion); 实现为:#define COMPLETION_INITIALIZER(work) / { 0, __WAIT_QUEUE_HEAD_INITIALIZER((work).wait) }#define DECLARE_COMPLETION(work) / stru原创 2021-10-31 18:55:15 · 197 阅读 · 0 评论 -
15.Linux内核中的pinctrl子系统应用实例
Linux内核中的pinctrl子系统应用实例 由于近期在做一个项目用到了pinctrl子系统,但是对pinctrl子系统了解又不是很多,所以遇到了麻烦,但是找度娘发现很少有同行对pinctrl的具体用法做出说明,所以只能自己去搞了,在经过一段时间对Linux内核源码的折腾,最终搞定,并将我所应用的实例给展示一下,希望对大家有所帮助。 关于pinctrl是什么,为什么要用pinctrl,源码深度剖析我在这就不赘述了,有位博友总结的非常好,大家可以参考...转载 2021-10-24 22:38:46 · 396 阅读 · 0 评论 -
13.Linux驱动基础-request_firmware升级
文章目录1.概述2.request_firmware2.1 struct firmware **fw2.2 char *name3.3 调用原理3.release_firmware4.使能固件升级宏5.具体升级示例5.1 添加升级路径5.2 添加固件升级结点6.异步方式升级固件1.概述request_firmware():将固件以二进制文件形式存储于文件系统之中,在内核启动后再从用户空间将固件传递至内核空间,内核空间解析固件获得文件数据,最后加载至硬件设备。requeset_firmware()必须等到原创 2021-10-05 20:12:13 · 7829 阅读 · 6 评论 -
12.Linux驱动-关于dev_set_drvdata()和dev_get_drvdata()
内核版本:Linux-4.5dev_set_drvdata()和dev_get_drvdata()代码如下:static inline void *dev_get_drvdata(const struct device *dev){ return dev->driver_data;} static inline void dev_set_drvdata(struct device *dev, void *data){ dev->driver_data = data;}那么原创 2021-01-16 10:18:17 · 1251 阅读 · 0 评论 -
11.Linux驱动-Linux内核的两个宏
文章目录前言结构体变量在结构体的地址偏移container_of宏应用前言在Linux内核中经常会见到container_of这个宏,通过某一个成员变量的地址获取这个结构体的地址,比如在一个工作队列中获取一个结构体的地址,watchdog_work为plat_data的一个成员变量static void work_func(struct work_struct *work){ struct plat_data *data = container_of(work, struct plat_da原创 2021-09-20 21:39:38 · 226 阅读 · 0 评论 -
10.Linux驱动-阻塞与非阻塞IO实验
文章目录1. 阻塞和非阻塞 IO1.1 阻塞IO1.2 非阻塞IO2.等待队列2.1 等待队列头2.2 等待队列项2.3 从等待队列头添加/删除队列项2.3.1 等待队列头添加队列项的API函数2.3.2 移除等待队列项3.等待唤醒4.等待事件5.轮询5.1 select函数5.1.1 伪代码5.2 poll函数5.2.1 伪代码5.3 epoll函数5.3.1 epoll_wait6.Linux驱动下的poll函数7.阻塞IO实验7.1 驱动程序8.非阻塞IO实验8.1驱动代码9.测试阻塞和非阻塞 I原创 2021-09-12 17:35:18 · 294 阅读 · 0 评论 -
9.Linux驱动-异步通知基础与实验
文章目录1.前言2.异步通知2.信号4.驱动中的信号处理4.1 fasync__struct4.2 fasync 函数5.实验程序编写5.1 驱动程序5.2 应用程序6.测试1.前言开发板:正点原子阿尔法在Linux驱动中如何主动向应用程序发出通知呢,然后应用程序从驱动中读取数据,类似于中断,Linux中提供异步通知来完成这一功能。2.异步通知阻塞访问驱动程序:应用程序会处于休眠态,等待驱动设备可以使用非阻塞访问驱动程序:通过 poll 函数来不断的轮询,查看驱动设备文件是否可以使用原创 2021-09-11 11:14:04 · 1126 阅读 · 0 评论 -
8.Linux驱动-简单led驱动
文章目录1.前言2.驱动代码3.设备树4.测试5.总结1.前言开发板:正点原子阿尔法本文示例会结合前面知识,pinctrl与gpio,设备树,工作队列,定时器,sysfs,platform驱动做一个简单总结,会有一些不合理的地方,实现1s翻转一次led的状态2.驱动代码led.h#ifndef LED_DRIVER_REG_H#define LED_DRIVER_REG_H#include <linux/types.h> /*设备号所在头文件*/#include <原创 2021-09-09 23:24:23 · 737 阅读 · 1 评论 -
7.Linux驱动-pinctrl子系统与gpio子系统
文章目录1.前言2.I.MX6ULL的pinctrl子系统2.1 PIN配置信息详解2.2 结点的配置信息记录3.pinctrl的驱动分析开发板:正点原子阿尔法1.前言Linux系统为PIN脚的配置提供了pinctrl子系统,用来配置pin的复用功能与电气属性,比如上/下拉、速度、驱动,pinctrl子系统的主要功能为:获取设备树的pin信息根据获取到的pin信息设置pin的复用功能根据获取到的 pin 信息来设置 pin 的电气特性,比如上/下拉、速度、驱动能力等2.I.MX6ULL的p原创 2021-09-08 22:35:03 · 720 阅读 · 1 评论 -
6.Linux驱动-I2C读写函数
文章目录0.前言1.I2C_SMBUS1.i2c_smbus的常用的函数集有:2.向I2C设备中读出或者写入一个字节(8位)/两个字节(16位)的数据3.读取或者写入指定长度的值,一般使用后面两个2.i2c_master_send ()和 i2c_master_recv()1.举例:3.i2c_transfer 接口0.前言本文不涉及原理,只涉及如何使用1.I2C_SMBUS1.i2c_smbus的常用的函数集有:s32 i2c_smbus_read_byte_data(const struct原创 2021-09-07 22:17:49 · 5234 阅读 · 1 评论 -
Linux驱动-设备树基础
在最新版本的Linux中,ARM相关的驱动全部都采用了设备数,所以我们来重点学习一下设备树的语法。何为设备树设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(DeviceTree Source),这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,比如CPU 数量、 内存基地址、 IIC 接口上接了哪些设备、 SPI 接口上接了哪些设备等等。其中树的主干就是系统总线,IIC控制器,GPIO控制器,SPI控制器都是接到系统主线上的分支。原创 2021-01-03 23:49:38 · 799 阅读 · 0 评论 -
5.Linux驱动-platform设备驱动
文章目录1.前言2.驱动的分隔与分离3.驱动的分层4. platform平台驱动模型4.1 platform总线4.2 platform驱动4.3 platform驱动编写流程4.4 platform驱动编写模板5.设备树下的platform驱动简介5.1在设备树中创建设备树结点5.2 编写platform驱动时要注意兼容性1.前言本文为学习正点原子Linux教程所做的笔记,无具体代码,Linux系统为了考虑到驱动的可重用性,提出了驱动的分层与分离这样的软件思路,在这个思路下诞生了最常打交道的platf原创 2021-09-05 22:52:19 · 790 阅读 · 1 评论 -
4.Linux驱动基础-内核定时器
文章目录1.前言2.Linux内核定时器2.1 Linux内核定时器API函数3.Linux内核定时器代码3.1 init_timer函数3.2 add_timer 函数3.3 del_timer 函数3.4 del_timer_sync 函数3.5 mod_timer函数3.6 setup_timer函数3.7 Linux内核短延时函数4.伪代码示例1.前言定时器是我们经常用到的功能,一般用来完成定时功能,Linux内核也提供了短暂延时的函数,比如us,ms等,Linux 内核中有大量的函数需要时间管原创 2021-08-31 23:33:10 · 985 阅读 · 0 评论 -
3.Linux驱动-sysfs接口
文章目录1.前言2.使用2.1 DEVICE_ATTR2.2 device_attribute2.3 device_create_file3.创建设备文件3.1 法1:sysfs_create_files3.2 法2:sysfs_create_group()4.验证1.前言在调试驱动的时候我们一般会对于驱动中某一个属性或者变量进行操作,或者是控制gpio口,这个时候我们可以在驱动中创建对应的属性,从而在应用程序或者控制台对驱动的属性进行设置,sysfs可以通过sysfs_create_files和sys原创 2021-08-31 20:11:45 · 861 阅读 · 0 评论 -
1.字符设备驱动基础
文章目录1.前言2.Linux下设备的分类3.Linux下应用程序调用驱动流程4.Linux内核的驱动操作函数5. Linux设备号5.1 设备号的分配6.Linux驱动的开发步骤6.1 驱动的加载,卸载6.1.1 驱动的加载6.1.2 模块加载卸载调用函数7.字符设备驱动模板7.1 动态分配设备号7.2 添加设备cdev_init函数cdev_addcdev_del7.3 自动创建设备结点7.4 创建类和删除类7.5 创建设备节点7.6 参考代码:7.7 设备操作函数7.8 添加LICENSE和作者信息8原创 2021-08-31 19:10:39 · 147 阅读 · 0 评论 -
2.led驱动-字符设备的驱动实现
1.编写LED字符设备驱动的步骤1.定义自己的file_operations结构(这里要定义一些功能函数),实现对应的open/read/write等功能函数,填入file_operations结构体2.入口函数,用来注册驱动程序(其中的注册函数register_chrdev把file_operations结构体告诉内核), 装驱动程序时,就会去调用这个入口函数.确定主设备号//创建设备节点 /dev/led0,1,… */ 系统就可以通过这个设备节点访问led,通过次设备号返回不同的LED//原创 2020-12-24 23:25:47 · 607 阅读 · 0 评论 -
140.Linux驱动-IIC驱动(基于AP3216C)
#include <linux/types.h> #include <linux/module.h> #include <linux/init.h> #include <linux/kernel.h> #include <asm/io.h> #include <linux/cdev.h> #include <linux/dev原创 2021-01-23 19:50:13 · 500 阅读 · 2 评论 -
139.Linux下IIC驱动框架
文章目录1.IIC物理总线2. I2C驱动框架简介3. I2C总线驱动4. I2C 设备驱动4.1 i2c_client4.2 i2c_driver结构体5. I2C设备和驱动的匹配过程6.I.MX6U的适配器驱动分析6.1 设备树节点6.2 I2C适配器与I2C设备的通信函数7. I2C设备驱动的编写7.1 I2C设备描述7.2 使用设备树时7.3 I2C设备数据收发处理流程7.3.1 读取I2C设备多个寄存器数据7.3.2 向I2C设备一个寄存器写入数据7.3.3 16位I2c读写操作8.具体的I2C驱原创 2021-08-26 00:01:01 · 580 阅读 · 0 评论 -
Linux驱动学习笔记-I2C设备与驱动的匹配代码分析
1.I2C设备与驱动的总匹配过程我们可以通过I2C驱动的注册函数来汾西I2C设备与驱动的匹配流程总调用过程:i2c_add_driver->i2c_register_dirver->driver_register -> bus_add_driver -> driver_attach -> bus_for_each_dev -> __driver_attach -> driver_match_device -> i2c_device_match ->原创 2021-01-17 11:53:54 · 285 阅读 · 0 评论 -
138.多点电容触摸协议基本概念
文章目录1. 硬件接口2.多点触摸(Multi-touch) 协议3. 多点触摸事件4.TypeB上报时序5.使用到的API函数1.input_mt_init_slots2.input_mt_slot 函数3.input_mt_report_slot_state 函数4.input_report_abs 函数5.上报时序案例6.多点电容触摸屏驱动编写1.I2C驱动框架2. probe函数3.上报坐标信息1. 硬件接口SCL、SDA信号线:IIC接口,读取坐标信息INT信号线:检测触摸信号,产生外部中原创 2021-08-23 11:47:30 · 609 阅读 · 0 评论 -
137.Linux输入子系统基本概念
文章目录0.前言1.简介2.框架3.输入子系统核心层4.输入子系统驱动编写4.1 基本变量4.2 input_dev的注册4.2.1 设置事件值的方法代码4.3 上报输入事件4.4 input_event结构体4.4.1 使用hexdump分析按键信息5.补充0.前言正点原子Linux驱动笔记,本章不涉及具体代码示例1.简介Linux内核专门为输入设备做了一个input子系统框架,用来管理按键,鼠标,触摸屏等输入设备,输入设备本质上还是字符设备,input子系统在内核空间分为驱动层,核心层,事件处理原创 2021-08-23 00:01:34 · 870 阅读 · 0 评论 -
136.Linux内核中断基本概念
文章目录0.前言1.简介2.设备树中断信息结点2.1 GIC中断控制器节点2.2 外设中断控制器节点2.3 具体外设的中断控制器节点3.中断小结4.中断相关的API函数4.1 request_irq4.2 free_irq4.4 中断使能与禁止函数4.4 从设备树中获取中断号5.中断的上下半部5.1 中断处理函数5.2 中断上半部与下半部5.1.1 上半部5.1.2 下半部5.2.1 软中断softirq_vec数组5.2.3 tasklettasklet_structtasklet_inittasklet原创 2021-08-22 20:13:14 · 549 阅读 · 0 评论 -
135.Linux并发与竞争-互斥锁
文章目录1. 前言2. 互斥锁2.1 特点3. 相关API3.1 伪代码4.代码示例5.测试1. 前言开发板:正点原子阿尔法2. 互斥锁 在信号量中,强调信号的同步机制,类似于生产者消费者模型,获取信号量失败之后会触发上下文调度。而在互斥锁中强调互斥机制,独占共享资源,获取互斥锁失败之后,会触发上下文调度。 互斥访问表示一次只能一个线程可以访问共享资源,实际上通过将信号量的初始值设置为1也可以产生此效果,但是Linux内核为我们提供了专门进行互斥访问的互斥锁-mutex2.1 特点mut原创 2021-08-12 08:24:30 · 316 阅读 · 0 评论 -
134.Linux并发与竞争-信号量
文章目录1. 前言2.简介2.1 信号量的特点3.信号量相关API3.1 基本API3.2 伪代码4.代码示例5.测试1. 前言开发板:正点原子阿尔法Linux开发板2.简介信号量为一个计数器,用来控制对共享资源的访问,假如某一个停车场只能容纳50辆车,只能停车数量就是一个信号量值,实际的停车数量就是信号量的值,有车开进去信号量加1,开出来信号量减1。 相当于自旋锁来说,信号量可以使线程进入休眠状态,如果这个线程获取不到信号量不会和自旋锁一样一直自旋,而是进入休眠状态,让出CPU,提高处理器的运原创 2021-08-11 23:51:39 · 236 阅读 · 0 评论 -
133.Linux并发与竞争-自旋锁
文章目录1.前言2.自旋锁简介2.1 加锁步骤2.2 CAS函数2.3 PAUSE指令2.4 自旋锁原理3.自旋锁API3.1 常用API3.2 其他API函数4. 使用场景4.1 线程间访问4.2 中断访问4.3 线程于中断并发访问的API函数5.代码示例6.测试7.小结1.前言开发板:正点原子阿尔法开发板,本文为学习笔记2.自旋锁简介原子操作只能用做计数操作,保护的东西太少,只能对整形变量或者位进行保护,当在实际操作我们需要保护资源有很多,这个时候就需要用到我们的自旋锁,自锁意思是原地打转的意思原创 2021-08-10 23:57:22 · 248 阅读 · 0 评论 -
132.Linux并发与竞争-硬件同步原语
文章目录0 前言1.并发与竞争1.1 并发与竞争的简介1.2 产生并发与竞争的原因2.硬件同步原语3.原子操作API函数3.1 原子变量的API函数4.举例:4.1 驱动代码5 测试6 遇到的问题6.1 echo结点无限打印6.2 驱动结点open失败0 前言本文章使用的开发板为正点原子的阿尔法开发板1.并发与竞争Linux内核是一个多任务的操作系统,存在多线程,多进程或者中断访问同一块内存或者设备的情况,我们将这一块内存或者设备叫做共享资源,并发可以篡改共享数据,以及破坏程序的完整动作,造成死锁,原创 2021-08-10 00:36:23 · 137 阅读 · 0 评论 -
open函数如何查找file_operation结构体
文章目录1.open函数如何查找file_operation接口1.1 get_unused_fd_flags1.2 do_file_open1.3 do_dentry_open1.4 def_chr_fops->chrdev_open1.open函数如何查找file_operation接口文件描述符的本质:文件描述符的本质1.1 get_unused_fd_flags为本次操作分配一个未使用过的文件操作符1.2 do_file_open生成一个空白的struct file结构体,并且原创 2021-05-18 08:54:43 · 361 阅读 · 0 评论 -
如何创建一个设备文件
文章目录1.mknod引入2.原理分析2.1 init_special_inode函数分析3.警告这节将如何将设备文件与fops联合起来1.mknod引入创建指定类型的特殊文件mknod --help用法:mknod [选项]... 名称 类型 [主设备号 次设备号]Create the special file NAME of the given TYPE....当类型为"p"时可不指定主设备号和次设备号,否则它们是必须指定的。如果主设备号和次设备号以"0x"或"0X"开头,它们会被视作原创 2021-05-17 09:03:24 · 192 阅读 · 1 评论 -
Linux内核如何保存file_operation接口
文章目录1.关键数据结构2.cdev_init函数分析3.cdev_add函数分析3.1 kobj_map函数分析4.结论1.关键数据结构include/linux/cdev.hstruct cdev { //内核驱动基本对象 struct kobject kobj; //相关内核模块 struct module *owner; //设备驱动接口 const struct file_operations *ops; //链表节点 struct list_head原创 2021-05-17 08:47:43 · 295 阅读 · 0 评论 -
从源码看如何管理设备号
1.char_device_struct在linux/fs/char_dev.c中static struct char_device_struct { //指向下一个链表结点 struct char_device_struct *next; //主设备号 unsigned int major; //次设备号 unsigned int baseminor; //数量 int minorct; //名字 char name[64]; //内核字符对象--已经被丢弃 struct cd原创 2021-05-16 14:22:21 · 171 阅读 · 0 评论