- 博客(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
template_FWLib.zip
2020-07-26
STM32F4xx_DSP_StdPeriph_Lib_V1.4.0.zip
2020-07-26
正则表达式判断sda1和sda
2022-08-13
TA创建的收藏夹 TA关注的收藏夹
TA关注的人