
linux驱动
文章平均质量分 84
eZiMu
这个作者很懒,什么都没留下…
展开
-
linux之early_param()和__setup
原理:在linux启动时,调用在init/main.c里面的start_kernel()时,执行到parse_early_param()时,uboot传递的cmdline里面有相应的命令,就会调用early_param()和__setup注册的函数。可以在驱动模块的任何c文件里面用early_param(),__setup()注册,只需要包含include/linux/init.h头文件原创 2016-08-27 11:14:33 · 4630 阅读 · 0 评论 -
linux驱动-中断
Linux中断简述:实现一个linux中断,需要经过申请注册中断处理函数(安装中断),然后分别实现linux中断的前半部分和后半部分。前半部分,就是申请注册的中断处理函数(中断服务程序);中断后半部分,就是中断服务函数结束后,接着处理中断还没处理完的部分。前半部分是必须的,后部分不是必须的。前半部分,处理的任务要快时间短,后半部分是处理更多数据更多耗时的任务。纲要:本文将按照下面几...原创 2017-02-13 13:10:02 · 2540 阅读 · 0 评论 -
linux驱动-时间
简述:linux驱动模块,一般用jiffies、延时、时钟周期、定时器来控制时间。本文将按照以下几点来描述:HZjiffies短延时低分辨率内核定时器高精度内核定时器HZHZ是宏,定义在include/asm-generic/param.h中:# define HZ CONFIG_HZ /* Internal kernel timer frequency */CONFIG_H原创 2017-02-14 10:24:36 · 1063 阅读 · 0 评论 -
linux驱动-内核中的数据类型
本文将按照以下几点描述:基本数据类型 字节序数据对齐指针检查链表基本数类型: 先看下面基本数据类型占用空间情况: 可以看出各体系CPU有差异,而使用u8,u16,u32,u64没有差异。 因此,我们在定义基本数据类型时,要比较清楚一个类型站有几个字节,尽量养成用内核定义的,类似u32这种符号。当然,sizeof()给定一个变量,就可以返回占用空间字节数。在使用类似u32…的只需要保原创 2017-02-15 10:43:26 · 6306 阅读 · 0 评论 -
Linux驱动--并发和竞争
概述: 并发和竞争,对于驱动来说,就是对临界区资源的保护。在面对多核CPU,很多进程同时运行,同时访问公共设备和数据,要保证这么多进程有序进行访问。以下,将主要从用法上归纳总结linux驱动对并发和竞争处理提供的接口。接口类别:旗标(semaphore 也可以说信号量)Completions机制自旋锁(spinlock)顺序锁(seqlock)原子变量(atomic)原子位操作(原创 2017-02-02 12:32:04 · 1404 阅读 · 0 评论 -
linux驱动-I2C
linux I2C的架构linux I2C是bus里面的一种总线,I2C总线,也可以说是I2C子系统。它的架构图(个人理解,从代码的角度看组织结构图,即架构),示意图如下: 从图中,可以看出linux i2c subsystem主要以三个结构体i2c_adpater,i2c_client,i2c_driver为核心,其中i2c_adpater与cpu i2c控制器关联起来,i2c_dri原创 2017-02-23 11:10:27 · 1399 阅读 · 0 评论 -
linux驱动之字符设备
本文以归纳总结性来概述linux字符设备一、编写字符设备驱动涉及的头文件: #include <linux/types.h> #include <linux/kdev_t.h> #include <linux/cdev.h> #include <linux/fs.h>另外也算是扩展:#include <linux/kernel.h>#include <asm/uaccess.h>#in原创 2017-01-15 16:04:11 · 918 阅读 · 0 评论 -
Linux driver之input framework
摘要:input frameworkinput_dev与handler匹配input_dev注册handler之evdev总结input frameworkframework一般有两个目的:一方面向开发者提供统一的接口(API);另一方面是向实现功能的模块提供接口,将功能挂接框架里。最终实现通过API来使用系统功能。linux input驱动框架原理:input以input_dev原创 2017-08-19 10:53:09 · 672 阅读 · 0 评论 -
linux驱动调用(运行/执行)应用程序
概述:linux驱动程序调用(运行/执行)应用程序,即驱动调用用户空间的应用程序。本文主要是从系统API的使用角度讲述。API声明的位置:声明在include/linux/kmod.h里面,相应函数实现在kernel/kmod.c里面。函数call_usermodehelper()使用:函数call_usermodehelper()声明如下:extern int原创 2018-01-24 23:29:32 · 7053 阅读 · 0 评论 -
linux驱动-线程
简述linux驱动模块中可以用kernel_thread(),kthread_create()/kthread_run()两种方式创建内核线程,另外还可以用第三方库(如pthread,除此之外还有其他的第三方库),在驱动模块中创建线程(pthread也可以用在用户空间)一、kernel_thread kernel_thread()声明在include/linux/sched.h里面:原创 2017-03-05 14:32:30 · 4715 阅读 · 2 评论 -
linux kthread_worker与kthread_work
简述kthread_worker就像是一个工作者(员工,工人),kthread_work就像是需要工作者去完成的工作。将需要完成的工作打包成kthread_work,然后交给kthread_worker去完成。1、kthread_worker,kthread_work结构体类型,以及后面出现的API,都声明在include/linux/kthread.h中,如下:struct原创 2018-01-17 23:35:09 · 2072 阅读 · 0 评论 -
linux驱动-映射进程空间
简述:内核映射进程空,就是由进程分配好空间(属于进程独占资源)后,将用户空间虚拟地址,传递到内核,然后内核映射成内核虚拟地址直接访问,此时内核访问的物理空间是位于用户空间。这样的好处是,不再是内核将处理好的数据放在内核空间,然后再copy到用户空间。接口:接口要包含的头文件:#include <linux/mm.h>函数接口:long get_user_pages(struct task_s原创 2017-02-12 10:11:44 · 2337 阅读 · 0 评论 -
linux驱动-I/O
简述:I/O是CPU和外部设备通信一种方式。linux将I/O分成两种,一种是I/O端口,另一种是I/O内存。I/O端口:I/O端口,是指对外部设备的访问,不能通过寻址方式访问,是一种特殊的,依赖CPU体系结构,操作I/O端口,是需要用CPU体系实现的接口。 linux对I/O的端口,一般是要经过分配,然后操作端口(即读写端口):1、I/O端口分配(1)包含头文件#include <linu原创 2017-02-11 20:31:35 · 804 阅读 · 0 评论 -
linux驱动---file_operations异步读写aio_read、aio_write
简述: file_operations中read,write是同步读写,异步读写用接口是aio_read、aio_wirte(在4.5版本中发现已经把名字改成read_iter、write_iter)。异步读写对应的系统调用API:int aio_read(struct aiocb *__aiocbp);int aio_write(struct aiocb *__aiocbp);定义在头文件中(原创 2017-02-06 13:49:42 · 11275 阅读 · 1 评论 -
Linux之pinctrl subsystem
概述:在各个平台(cpu厂商)上,都会用很多pin用于和外设通讯,同一个pin也会有多种功能,如同一个pin具有gpio,spi,uart,I2C等功能,这些功能会根据需求切换,以及在不同功能下都会上下拉,驱动能力,电压域的配置。linux为管理这些pin,就设计出了pinctrl subsystem来解决这类问题。当然,也可以不用pinctrl来管理,平台厂商如果不用,就会自己设计接口来管理,这种原创 2016-11-20 23:11:26 · 1948 阅读 · 0 评论 -
linux驱动---file_operations之llseek
简述: file_operations中llseek是用于定位设备文件位置。 lseek,sys_lseek(在include/unistd.h,如果是在宿主机上,ubuntu所在路径/usr/include/unistd.h)这两个系统调用会,会调用到file_operations中的llseek.file_operations结构体定义:这是Linux内核3.10版本 定义原创 2017-02-06 10:41:24 · 2298 阅读 · 0 评论 -
linux驱动---file_operations之poll
简述: file_operations的poll是驱动提供给应用程序探测设备文件是否有数据可读接口。应用程序探测文件的接口: select,poll,epoll三个接口都是应用程序探测设备文件是否有数据可读的接口,没有数据进程阻塞,有数据时唤醒。select和poll差不多,epoll是select、poll的增强版,性能上会更好。select头文件:#include <sys/select.h原创 2017-02-06 20:37:59 · 5911 阅读 · 0 评论 -
linux驱动-file_operations之ioctl
简述: ioctl是linux应用程序用来向设备发送特殊命令。如果,设备要响应应用程序的ioctl调用,那么设备驱动必须编写响应ioctl的接口,这个接口就是file_operations的unlocked_ioctl。应用程序ioctl接口:声明头文件:#include <sys/ioctl.h>如是ubuntu系统,可以在/usr/include/sys/下面查看。 定义ioctl命令需要包原创 2017-02-07 11:10:21 · 3480 阅读 · 0 评论 -
linux驱动访问文件
简述: 使用filp_open()和struct file可以在驱动模块中访问其他文件。定义的头文件:#include <linux/fs.h>例子:#include <linux/fs.h>#include <asm/uaccess.h>static char buf[100];static int __init dopen(){ mm_segment_t old_fs;原创 2017-02-08 11:06:07 · 1946 阅读 · 0 评论 -
linux驱动模块访问权限的控制
简述: 在驱动模块,可以对没有权限的进程和应用程序拒绝访问,有权限的才允许访问。权限控制接口:bool capable(int cap);定义头文件:#include <linux/capability.h>用法例子:if (! capable (CAP_SYS_ADMIN)) return -EPERM;capable()没有权限时返回0,有权限时返回1。 在file_opertion原创 2017-02-08 11:28:11 · 3438 阅读 · 0 评论 -
linux驱动---等待队列、工作队列、Tasklets
概述: 等待队列、工作队列、Tasklet都是linux驱动很重要的API,下面主要从用法上来讲述如何使用API.应用场景:等待队列(waitqueue) linux驱动中,阻塞一般就是用等待队列来实现,将进程停止在此处并睡眠下,直到条件满足时,才可通过此处,继续运行。当然在睡眠等待期间,是不定期来检查条件。工作队列(workqueue) 工作队列,将一个work提交原创 2017-02-03 23:30:43 · 4315 阅读 · 1 评论 -
linux驱动-内存分配
linux地址类型:先看图解: linux地址空间主要分两类:虚拟地址和物理地址。 图中假设虚拟地址和物理地址都是从0x00000000到0xFFFFFFFF(这里只是为了好理解,实际要根据具体情况配置)。当然物理地址要根据实际硬件,但虚拟地址不变,32位处理器4G寻址空间,0xC0000000(宏CONFIG_PAGE_OFFSET定义,)是内核空间和用户空间分界点。内核空间和用户空间占比原创 2017-02-08 16:00:44 · 1836 阅读 · 0 评论 -
linux驱动-DMA
DMA概述:DMA就是与高速总线直接通信。一般外设,都是通过低速总线与CPU通信。DMA映射,就是通过一些设置后,外设部设备可以通过高速总线与CPU通信。具体来说,RAM是通过高速总线与CPU通信,只要建立起外部设备能够存取RAM空间,CPU是能直接存取RAM,这样就外部设备和CPU之间通过RAM建立了通信,这就是映射过程。DMA数据传输概况:DMA数据传输两种情况:软件请原创 2017-02-09 22:51:47 · 4328 阅读 · 0 评论 -
linux驱动-file_operations之mmap
简述: linux内存空间分为用户空间和内核空间,应用程序是不能直接访问内核空间的数据。 mmap就是建立内核空间映射到用户空间虚拟地址上,之后,应用程序直接访问映射后虚拟地址,实际是在访问内核空间。应用程序mmap的系统调用: mmap声明的头文件:#include <sys/mman.h>如是ubuntu系统,可以在/usr/include/sys目录下查看 应用程序mmap声明:voi原创 2017-02-07 15:06:07 · 4420 阅读 · 0 评论 -
Linux驱动之platform_bus、platform_device、platform_driver
概述:在Linux驱动里面platform通常叫做platform bus,直译过来就是平台总线,实际上,是软件里面虚拟出来的总线,俗称虚拟总线。虚拟总线有什么作用呢?以及怎么用linux虚拟总线子框架?这就是本文要阐述的两个问题。Platform Bus的作用简单来说,有以下三个作用:加载平台资源信息,即将reg(控制器,寄存器地址,memery地址)、interrupts(中断)信...原创 2019-01-20 17:27:02 · 2326 阅读 · 0 评论