-
platform设备驱动
platform设备驱动当驱动变得复杂的时候, 为了方便驱动的编写, 提高可重用性驱动分离与分层驱动分离分隔把控制器和具体的设备分隔开, 根据Linux提供的框架使用统一的API接口, 分为主机控制器驱动, 设备驱动, 主机控制器驱动是由半导体厂商写的, 在linux下编写具体的设备驱动中间的练习就是核心层, 统一的API定义驱动的分层我们在编写输入设备驱动的时候只需要处理好输入事件的上报即可,至于如何处理这些上报的输入事件那是上层去考虑的## 总线-设备-驱动根据分层理念形成的, 总线属...…
-
Linux中断
阻塞非阻塞IO指的是文件的输入输出当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式IO就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞IO,应用程序对应的线程不会挂起,它要么一直轮询等待,直到设备资源可以使用,要么就直接放弃, 会有超时处理应用程序使用open打开驱动文件默认是用的是阻塞模式打开, 可以使用参数O_NONBLOCK打开文件,等待队列当设备文件不可操作的时候进程可以进入休眠态,这样可以将CPU资源让出来。但是,当设备文件可以操作的时候就...…
-
异步通知
异步通知首先是硬件中断, 只要处理器设置好就不需要再去查看信号==>软件层次上对于中断的模拟, 效果和中断类似, 驱动可以主动向软件发送信号, 告诉自己可以访问34 #define SIGHUP 1/* 终端挂起或控制进程终止*/35 #define SIGINT 2/* 终端中断(Ctrl+C组合键) */36 #define SIGQUIT 3/* 终端退出(Ctrl+\组合键) */37 #define SIGILL 4...…
-
Linux内核定时器
内核定时器Linux时间管理Cortex-M使用Systick作为系统定时器定时器分为硬件定时器, 软件定时器, 原理是依靠系统定时器驱动,硬件定时器提供时钟源,时钟源的频率可以设置,设置好以后就周期性的产生定时中断,系统使用定时中断来计时, 中断周期性产生的频率就是系统频率,也叫做节拍率(tickrate)(有的资料也叫系统频率)可以通过图形化界面设置系统节拍率, 默认为100Hz, 定义在HZ变量中-> Kernel Features ...…
-
Linux中断
Linux中断函数 中断号每一个中断都有一个对应的中断号, request_irq函数用来申请所需要的中断, 有可能会导致睡眠, 所以要在可以睡眠的位置调用int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,const char *name, void *dev) irq:要申请中断的中断号。handler:中断处理函数,当中断发生以后就会执行此中断处理函数。flags:中断...…
-
pinctl和gpio子系统
pinctl和gpio子系统在开发的时候不用直接操作寄存器, Linux提供了gpio操作的方法pinctl子系统在使用时候的, 之前要设置PIN的复用和电气属性, 配置GPIOLinux使用pinctl子系统进行管理, 设置PIN的电气属性和复用 主要功能从设备树获取pin的信息, 根据设置进行设置复用, 设置各种属性, 厂商已经写好了, 对于用户来说就是在设备树中添加对应的配置信息 IOMUX SNVS控制器iomuxc_snvs: iomuxc-snvs@02290000 { ...…
-
Linux并发与竞争
Linux并发与竞争在驱动中有可能存在, 对于公用的资源, 产生的原因, 多任务, 中断, 抢占, 多核会竞争资源, 就是数据, 需要进行保护, 首先就是全局变量,常用的处理方法原子操作分为原子整形, 原子位操作就是不能进一步分割的操作, 保证几条代码不会被分开执行, Linux提供了对于整形以及位操作的函数整形操作API提供了一个结构体用来进行操作, 定义在include/linux/types.h文件中typedef struct { int counter;} atomic_t;在定...…
-
led设备树
led设备树 建立节点 编写驱动获取信息 根据获取的值处理设备节点最好添加到好找的地方…