
内核驱动学习
文章平均质量分 75
RK3288学习的心得
习惯就好zz
一个无趣的人
展开
-
rk3328通过远程连接虚拟机调试
按照100ask的wiki页面,配置启动rk3288-firefly的开发板。设置了nfs启动的环境,用开发板去挂载PC上的镜像原创 2020-11-12 09:13:58 · 685 阅读 · 0 评论 -
编写App直接i2c访问EEPROM
编写App直接访问EEPROM参考资料Linux驱动程序:drivers/i2c/i2c-dev.cI2C-Tools-4.2:https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AT24Cxx.pdf1. 硬件连接2. AT24C02访问方法设备地址,从芯片手册上可以知道,AT24C02设备地址跟它的A2、A1、A0引脚有关:100ask的模块显示全部接地,所以i2c地址就是0x50读写流程也有对应的时序说明原创 2021-08-08 15:40:06 · 372 阅读 · 0 评论 -
rk3288 mutex互斥量的实现
mutex内核结构体// include/linux/mutex.hstruct mutex { /* 1: unlocked, 0: locked, negative: locked, possible waiters */ atomic_t count; //1. count要么等于1要么等于0 spinlock_t wait_lock; //2. mutex的实现要借助spinlock struct list原创 2021-06-05 08:31:28 · 202 阅读 · 0 评论 -
rk3288 semaphroe信号量的实现
semaphore内核结构体信号量的定义及操作函数都在Linux内核文件include\linux\semaphore.h中定义:struct semaphore { raw_spinlock_t lock; //1.信号量借助spin_lock unsigned int count; //2.允许多少人使用 struct list_head wait_list; //3.等待信号量的线程链表};down函数实现如原创 2021-06-04 07:59:47 · 133 阅读 · 1 评论 -
rk3288 spin_lock自旋锁的实现
自旋锁自己原地打转,等待资源可用,一旦可用就上锁霸占它。多SMP系统中,CPU x原地打转,CPUy会解锁。单CPU中,自旋锁就没有自选功能了,只有禁止抢占、禁止中断自旋锁的内核结构体spinlock对应的结构体如下定义,不同的架构可能有不同的实现://include/linux/spinlock_types.htypedef struct spinlock { union { struct raw_spinlock rlock; //主要实现的锁原创 2021-06-02 21:05:44 · 185 阅读 · 0 评论 -
rk3288 Linux锁的介绍
参考资料:https://www.kernel.org/doc/html/latest/locking/index.htmlhttps://mirrors.edge.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/锁的类型Linux内核提供了很多类型的锁,它们可以分为两类自旋锁(Spinning locks)睡眠锁(Sleeping locks)自旋锁简单地说就是无法获得锁时,不会休眠,会一直循环等待,有这些自旋锁:原创 2021-05-30 21:17:44 · 450 阅读 · 0 评论 -
rk3288 原子操作和原子位操作
一、原子变量内核操作函数Linux中有2中原子操作: 原子变量、原子位。原子变量的内核操作函数原子变量的操作函数在arch/arm/include/asm/atomic.h中原子变量类型如下,实际上就是个结构体include/linux/types.htypedef struct { int counter;} atomic_t原子操作函数,如下:函数名作用atomic_read(v)读出原子变量的值,即v->counteratomic_set(v, i原创 2021-05-23 19:08:18 · 506 阅读 · 0 评论 -
rk3288 内联汇编
一、内联汇编在c语言中可以直接调用内联汇编,提高代码的运行效率,或者有时需要调用特殊的汇编指令。(比如ldrex/strex实现互斥访问),比如一些平台的特定指令在c中没有对应的操作等等,这些都需要内联汇编。参考文章:① GNU C扩展汇编② ARM GCC 内嵌(inline)汇编手册③ C内联汇编 c语言实现的加法:int add(int a, int b){ return a+b;}反汇编后,00010404 <add>: 10404: b480原创 2021-05-16 19:28:05 · 289 阅读 · 0 评论 -
rk3288 mmap原理学习
适用情形应用程序和驱动程序之间传递数据时,通常是用read、write函数进行的。这中间涉及copy_to_user、copy_from_user等。这种方式在数据量比较小时没什么问题,但是数据量比较大时效率就太低了。比如LCD的显示每次数据都有102460032bpp格式,一帧数据就有2.3MB左右。仅用read、write传输速度比较慢。改进方法就是直接读写驱动程序中的buffer,这个方法可以通过mmap实现。它把内核buffer映射到用户态。让App直接读写。内存映射于数据结构虚拟地址原创 2021-04-11 16:03:35 · 501 阅读 · 0 评论 -
rk3288 使用pinctrl子系统控制led的编写
在设备树中的GPIO信息/{ myled_blue: myled-blue { compatible = "myled,led_drv"; //这个是平台设备匹配的名称 label = "myled:blue:user"; myled-gpio = <&gpio8 1 GPIO_ACTIVE_LOW>; //这里添加一个[name]-gpio属性,指定用哪个GPIO,这里的name在驱动中寻找gpio会用到原创 2021-03-26 18:35:56 · 336 阅读 · 0 评论 -
rk3288 查询方式编写button驱动
编写查询方式的button驱动思路和之前的RK3288 LED驱动程序框架类似。同时之前led时,对代码进行了分层。在编写button驱动的时候,简单分为两层。一层是操作file_operation、创建字符设备等,一层是对具体的硬件进程初始化和操作。button_test:打开设备文件并读取按键值button_drv:注册file_operations、创建和卸载字符设备,class的创建和删除。提供了对button_operations的注册和卸载的接口。board_rk3288:初始化了一原创 2021-03-20 20:53:40 · 271 阅读 · 0 评论 -
rk3288 读取按键值
App读取按键值的几种方法查询方式休眠-唤醒方式poll方式异步通知方式通过这4中方式,涉及到驱动的一些基本技能,如中断、休眠、唤醒、poll等机制。这些基本技能是开发驱动的基础,其他大型驱动复杂的地方是它的框架及设计思想,但是基本技术就这些。相关的App开发基本技能:阻塞、非阻塞、休眠、poll、异步通知。查询方式驱动中构造、注册file_operations,提供对open、read的函数接口。app调用open时,驱动设置gpio引脚。app调用read时,驱动调用对应的rea原创 2021-03-19 19:05:38 · 456 阅读 · 0 评论 -
rk3288 设备树led驱动程序
① 设备树要有 compatible 属性,它的值是一个字符串② platform_driver 中要有 of_match_table,其中一项的.compatible 成员设置为一个字符串③ 上述 2 个字符串要一致。原创 2021-03-19 18:48:03 · 378 阅读 · 0 评论 -
rk3288 内核对设备树的处理和使用
内核对设备树的处理从源码dts文件开始:dts在PC机上被编译为dtb文件u-boot把dtb文件传给内核内核解析dtb文件,把每一个节点都转换为device_node结构体对于某些device_node结构体,会被转换为platform_device结构体dtb中每个节点都会被转化为device_node结构体哪些设备树节点会被转化为platform_device根节点下含有compatible属性的子节点。含有特定compatible属性的节点的子节点。如果一个节点属性原创 2021-03-16 18:36:20 · 923 阅读 · 0 评论 -
rk3288 设备树语法学习
设备树背景设备资源以前都是用.c文件,但是随着时间的推移。冗余代码越来越多,所以用设备树来替代资源文件的指定。设备树在linux里的查看:ls /sys/firmware/devicetree fdt#devicetree 目录下是以目录结构呈现的dtb文件,根节点对应base目录,每个节点对应一个目录,每个文件对应一个属性官方文档:https://www.devicetree.org/specifications/设备树文件dtb:内核编译号的设备树镜像dts:设备树的源码文件dt原创 2021-03-14 19:54:23 · 792 阅读 · 0 评论 -
RK3288 编写LED的平台设备驱动
platform接口学习//返回dev中类型为type的,第num个资源struct resource *platform_get_resource(struct platfrom_device *dev, unsigned int type, unsigned int num);//返回该dev所用的第num个中断号int platform_get_irq(struct platform_device *dev, unsigned int num);//通过名字name返回dev的给某原创 2021-03-11 10:15:17 · 322 阅读 · 0 评论 -
RK3288 总线驱动模型
驱动编写的3中方法:1.传统方法使用的引脚,操作引脚,全都写死在代码里。如果需要修改引脚时,那需要重新修改代码,并重新编译。2.总线设备驱动模型使用platform_device / platform_driver,将“资源”和“驱动”分离开来。优点:易于扩展,更换引脚时drv基本不用改,只需要修改dev缺点:代码稍微复杂,重复和冗余还是比较多,修改引脚时设备端的代码需要重新编译。3.设备树因为linux的device非常多,导致linux内核代码非常臃肿。于是有了DTS文件指定硬件资原创 2021-03-06 17:00:24 · 266 阅读 · 1 评论 -
RK3288驱动设计分层的思想
点灯程序的逻辑和结构与硬件无关的操作写在led_drv.c中,在led_drv中通过调用结构体led_operations间接初始化硬件。而led_operations具体的实现就在board_demo.c中实现。这里是关于硬件的实现。如果有不同的板子,不需要重复修改board_demo.c。只需要不断添加新的c文件,修改Makefile编译的不同板子的c文件。来使得适配更多不同的板子。分离然而现实情况却更复杂,比如同样的芯片会有两块资源分配不一样的开发板。如果使用上面的方式,就需要重复编写很多相似原创 2021-03-03 15:48:21 · 164 阅读 · 0 评论 -
RK3288 LED驱动编写
开始编写LED驱动程序我之前学习了rk3288 的led驱动编写的准备然后也编写了led驱动的框架。现在只要把框架适当的填充具体的硬件操作,就可以实现led的电灯了。1.需要用到的函数ioremap因为linux内核并不像单片机一样是直接用寄存器地址控制的,操作系统有内存寻址的架构。所以我们需要把物理地址转换成Linux可以操作的地址。这个转换的过程就需要调用ioremap函数,下面的它的函数原型:#include <asm/io.h> //需要使用时包含头文件void原创 2021-02-28 17:45:45 · 790 阅读 · 0 评论 -
RK3288 LED驱动程序框架
字符设备驱动框架① 确定主设备号,可也已让内核分配。② 定义自己的file_operations结构体。③ 实现对应的drv_open/ drv_read/ drv_write等函数,填入file_operations结构体。④ 把file_operations连接进内核(register_chrdev)。⑤ 谁来注册驱动程序啊?得有一个入口函数,安装驱动程序时,就会去调用这个入口函数。⑥ 有入口函数就有出口函数,出口函数调用(unregister_chrdev)。⑦ 其他玩善:提供设备信息,原创 2020-09-25 20:58:47 · 452 阅读 · 0 评论 -
RK3288 LED驱动编写准备
想要驱动3288的led,就应该去找芯片手册上对应的章节来看。需要学习三个章节(CRU、PMU、CRF、GPIO)才能有一个整体的认识。原创 2020-09-09 22:40:49 · 1039 阅读 · 0 评论