自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

习惯就好zz的专栏

学问之道无他 求其放心而已矣

  • 博客(15)
  • 资源 (6)
  • 收藏
  • 关注

原创 I2C系统中的重要结构

/* * i2c_adapter is the structure used to identify a physical i2c bus along * with the access algorithms necessary to access it. */struct i2c_adapter { struct module *owner; unsigned int class; /* classes to allow probing for */ cons

2021-04-30 09:04:27 365

原创 rk3288 i2c-tools使用

i2c-tools源码下载Linux驱动程序: drivers/i2c/i2c-dev.cI2C-Tools-4.2: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/AP3216C:在git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git,在10.1篇,第十六章,I2C编程。APP访问硬件肯定是需要驱动程序的, 对于I2C设备,内核提

2021-04-29 14:00:24 791

原创 rk3288 I2C-原理学习

I2C介绍I2C硬件框架一个Soc一般有多个I2C接口,一条I2C总线上,可以挂载一个或多个I2C设备,I2C设备用地址区分。I2C总线上,有两条线,一条是SCL时钟线,一条是SDA线,这两条线上都有上拉电阻I2C软件框架App:不关心底层实现细节,只需要调用设备驱动程序提供的接口。芯片驱动:知道芯片要求的地址、数据格式;知道怎么发出信号才能让芯片工作,一些芯片特定的工作状态;构造好数据结构给I2C控制器。I2C控制器驱动:根据I2C协议发出各类信号,I2C设备地址、I2C存储地址、

2021-04-24 12:40:13 1848

原创 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 473

原创 rk3288 中断的线程化处理

适用场景复杂、耗时的事情,尽量使用内核线程来处理。工作队列用起来挺简单,但是它有一个缺点:工作队列中有多个 work,前一个 work 没处理完会影响后面的 work。解决方法有很多种,比如干脆自己创建一个内核线程,不跟别的 work 凑在一块了。在 Linux 系统中,对于存储设备比如 SD/TF 卡,它的驱动程序就是这样做的,它有自己的内核线程。对于中断处理,还有另一种方法:threaded_irq,线程化的中断处理。...

2021-04-08 19:36:30 370

原创 rk3288工作队列workqueue

适用环境之前的定时器、下半部tasklet,都是在中断上下文中执行,他们无法休眠。当要处理更复杂、更耗时的工作时,放在定时器或是下半部中,会使得系统很卡,并且循环等待某件事也太浪费CPU资源。如果使用线程来处理这些耗时的工作,那就可以解决卡顿的问题,因为线程可以休眠。内核中有一种更简单的使用线程的方法,“工作队列”(workqueue)。在内核初始化时就创建了内核线程,我们只需要使用“工作队列”,把“工作”放入其队列中“,内核线程就会拿出“工作”执行函数。工作队列应用场合:做的事情比较耗时,甚

2021-04-05 17:01:48 302

原创 rk3288 中断下半部tasklet

适用环境中断下半部分可以执行一些时间不是很紧急的工作。内核函数中断下半部使用结构体 tasklet_struct 来表示,它在内核源码 include\linux\interrupt.h 中定义struct tasklet_struct{ struct tasklet_struct *next; /* state有2个标志位 * bit0表示TASKLET_STATE_SCHED:1执行了tasklet_schedule,已经放入tasklet队列了 * bit1表示TASKLET_

2021-04-05 12:56:34 137

原创 rk3288 定时器的内部机制

深入内部机制在开发板执行[root@firefly-rk3288:/home/picture/btn_timer]# cat /proc/interrupts CPU0 CPU1 CPU2 CPU3 16: 0 0 0 0 GIC 29 Edge arch_timer 17: 99137 280332 65060

2021-04-04 21:07:52 550

原创 rk3288 定时器使用

内核定时器定时器就是闹钟,到一定时间就做某些事。时间、做的事情==>超时时间、函数在include\linux\timer.h中涉及这些函数://设置定时器,主要初始化timer_list结构体,设置其中的函数、参数#define setup_timer(timer, fn, data) \ __setup_timer((timer), (fn), (data), 0)//向内和添加定时器timer->expires表示超时时间extern void add_timer(s

2021-04-04 17:16:41 925

原创 rk3288 阻塞和非阻塞

适用场景阻塞:就是等待某件事情发生。比如调用read时,如果没有按键数据则read不会返回,会让进程休眠等待。其中poll中,如果传入超时事件不是0, 也是会阻塞的。使用poll时,设置超时时间0,没有数据也立即返回。但是不能让read函数及工作于阻塞方式,又工作于非阻塞方式:App调用open函数传入O_NONBLOCK,表示使用非阻塞模式,默认是使用阻塞方式。当open是O_NONBLOCK后,可以使用fcntl修改为阻塞或非阻塞。应用编程//open时设置int fd = open("

2021-04-04 11:00:56 200

原创 rk3288 异步通知

适用场景使用***休眠-唤醒、POLL机制***时,都需要***休眠等待***某个事件发生时,差别在于后者可以指定休眠的时长。如果不想APP休眠怎么办,那么需要驱动程序有数据时***主动通知*** App,App受到信号后执行信息处理函数。使用流程驱动程序通过发送信号给App,通知App处理数据。驱动程序发送数据给App驱动程序发送信号给App发送SIGIO的信号内核里面有相应的函数,来支持驱动发送信号给AppApp来接受信号,要让驱动发送信号给App。前提是App把自己告诉给驱动Ap

2021-04-03 15:03:03 151

原创 rk3288 poll源码学习

系统调用在内核中都是sys_xxx命名的,如open、read、write在内核中分别对应sys_open、sys_read、sys_write。所以对应poll的内核函数,分析sys_poll就可以理解poll机制。sys_poll函数在文件fs/select.c中包含了sys_poll函数。SYSCALL_DEFINE3的宏定义于include/linux/syscalls.h,展开后就有sys_poll函数。sys_poll中做了金丹的处理后,就调用do_sys_poll。SYSCALL_DE

2021-04-02 21:23:15 284

原创 rk3288 poll机制学习使用

适用场景使用休眠-唤醒的方式等待某个事件发生时,有一个缺点:等待的时间可能很久。我们可以加上一个超时时间,这时就可以使用 poll 机制。1 APP 不知道驱动程序中是否有数据,可以先调用 poll 函数查询一下,poll 函数可以传入***超时时间***;2 APP 进入内核态,调用到驱动程序的 poll 函数,如果有数据的话立刻返回;3 如果发现没有数据时就***休眠一段时间***;4 当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记录数据、唤醒 APP;5 当超时时间到了

2021-04-01 21:22:26 266

原创 rk3288 唤醒和休眠使用环形缓冲区改进驱动程序

使用环形缓冲区,可以在一定程序上避免按键数据丢失,关键代码如下:其实就一个队列,自己写了一个:#define MaxSize 128struct QNode { int Data[MaxSize]; int rear; int front;};typedef struct QNode *Queue;int IsEmpty(Queue Q);void AddQ(Queue PtrQ, int item);int DeleteQ(Queue PtrQ);int IsEmpty(Qu

2021-04-01 18:04:41 333

原创 rk3288 在irq基础上增加休眠和唤醒

适用场景当应用程序必须等待某个事件发生,比如必须等待按键被按下时,可以使用“休眠-唤醒”机制:APP 调用 read 等函数试图读取数据,比如读取按键;APP 进入内核态,也就是调用驱动中的对应函数,发现有数据则复制到用户空间并马上返回;如果 APP 在内核态,也就是在驱动程序中发现没有数据,则 APP 休眠;当有数据时,比如当按下按键时,驱动程序的中断服务程序被调用,它会记录数据、唤醒 APP;APP 继续运行它的内核态代码,也就是驱动程序中的函数,复制数据到用户空间并马上返回。休眠函数

2021-04-01 16:50:48 1010

arm gicv3的相关架构资料

arm gicv3的相关架构资料

2022-05-26

0024-qt5.11.3_linuxfb_rotation.patch

qt支持界面旋转,在启动时可以增加roration=90

2021-12-20

template_FWLib.zip

STM32F429使用标准库的模板工程,不是HAL库。正点原子没有提供标准库,就自己搞了一个。主要是配置了工程的一些选项,然后把标准库放进去了,构建了一个普通的工程。

2020-07-26

STM32F4xx_DSP_StdPeriph_Lib_V1.4.0.zip

\8,STM32 参考资料\STM32F4xx 固件库\stm32f4_dsp_stdperiph_lib.zip

2020-07-26

极客班C++设计模式课件资料.zip

极客班C++设计模式课件资料,网易公开课C++设计模式相关资料。各类模式的PPT,和一个项目PDF手册

2020-06-27

swt-3.5.2-gtk-linux-x86_64

swt-4.2.2-win32-win32-x86_64.zip

2014-11-22

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除