随笔分类 -  Linux 驱动

摘要:前言编写简单的自定义驱动创建相关目录和文件关联上一级目录的Kconfig和Makefile配置&编译TOC 前言 在了解了Kconfig和Makefile的相关原理后,是不是有种在源码上自定义驱动的冲动。 放心,接下来,我会满足你的小小欲望。 编写简单的自定义驱动 hello_dev.c #include #include #include #include #... 阅读全文
posted @ 2020-03-23 11:40 standardzero 阅读(406) 评论(0) 推荐(0)
摘要:前言语法Makefile 语法Kconfig 语法.configTOC 前言 要想了解内核的编译过程,分析这三个文件的作用是很有必要的。 三者的作用: 简单来说就是去饭店点菜:Kconfig是菜单,Makefile是做法,.config就是你点的菜。 Makefile:一个文本形式的文件,编译源文件的方法。 Kconfig:一个文本形式的文件,内核的配置菜单。 .config:编译内... 阅读全文
posted @ 2020-03-23 11:39 standardzero 阅读(1381) 评论(0) 推荐(0)
摘要:Makefile #**************************************************************** # * # Makefile for MB86M01/M02/M03 driver * ... 阅读全文
posted @ 2020-03-23 11:38 standardzero 阅读(211) 评论(0) 推荐(0)
摘要:1. 根据硬件工程生成设备数文件 dts / { amba_pl: amba_pl { #address-cells = ; #size-cells = ; compatible = "simple-bus"; ranges ; axi_timer_0: timer@42800000 { ... 阅读全文
posted @ 2020-03-23 11:37 standardzero 阅读(290) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2020-03-23 11:35 standardzero 阅读(104) 评论(0) 推荐(0)
摘要:不是所有的驱动程序都必须有自己的工作队列。驱动程序可以使用内核提供的缺省工作队列。由于这个工作队列由很多驱动程序共享,任务可能会需要比较长一段时间才能开始执行。为了解决这一问题,工作函数中的延迟应该保持最小或者不要延时。 需要特别注意的是缺省队列对所有驱动程序来说都是可用的,但是只有经过GP许可的驱动程序可以用自定义的工作队列。 创建工作队列 每个工作队列有一个专门的线程,所有来自运行队... 阅读全文
posted @ 2020-03-23 11:31 standardzero 阅读(226) 评论(0) 推荐(0)
摘要:1. 相关接口2. 代码样例3. 编译运行TOC 1. 相关接口 module_param(参数名,参数类型,参数读/写权限) module_param_array(数组名,数组类型,数组长,参数读/写权限) 说明: 参数和参数类型,需保持一致 参数类型有: byte、short、ushort、int、uint、long、ulong、charp(字符指针)、bool 或 invboo... 阅读全文
posted @ 2020-03-23 11:30 standardzero 阅读(391) 评论(0) 推荐(0)
摘要:旋锁和信号量都是解决互斥问题的基本手段,面对特定的情况,应该如何进行选择呢? 选择的依据是临界区的性质和系统的特点。 从严格意义上说,信号量和自旋锁属于不同层次的互斥手段,前者的实现依赖于后者。在信号量本身的实现上,为了保证信号量结构存取的原子性,在多CPU 中需要自旋锁来互斥。 信号量是进程级的,用于多个进程之间对资源的互斥,虽然也是在内核中,但是该内核执行路径是以进程的身份,代表进程来争... 阅读全文
posted @ 2020-03-23 11:29 standardzero 阅读(302) 评论(0) 推荐(1)
摘要:短延时(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsigned long msecs); 长延时(忙等) void msleep(unsigned int millisecs); unsigned long msleep_interruptible(uns... 阅读全文
posted @ 2020-03-23 11:28 standardzero 阅读(197) 评论(0) 推荐(0)
摘要:1. 相关接口和结构体2. 驱动代码示例3. 应用层测试代码TOC 1. 相关接口和结构体 接口: //初始化接口 int fasync _ helper(int fd, struct file *filp, int mode, struct fasync _ struct **fa); //释放信号接口 void kill _ fasync(struct fasync _ struct... 阅读全文
posted @ 2020-03-23 11:27 standardzero 阅读(249) 评论(0) 推荐(0)
摘要:1. eventfd 事件通知 eventfd 事件通知不仅可以用于线程间的事件通知,还可以用于内核和用户空间的事件通知。 2. eventfd 用户空间API #include //创建事件通知句柄,可以被read 和 write 函数使用 int eventfd(unsigned int initval, int flags); Linux shell下 输入 man event... 阅读全文
posted @ 2020-03-23 11:22 standardzero 阅读(1655) 评论(0) 推荐(0)
摘要:1. 定时器简介2. jiffies 变量3.定时器相关API4. 驱动例程TOC 1. 定时器简介 软件上的定时器最终要依靠硬件时钟来实现,简单的说,内核会在时钟中断发生后检测各个注册到内核的定时器是否到期,如果到期,就回调相应的注册函数,将其作为中断底半部来执行。实际上,时钟中断处理程序会触发TIMER_SOFTIRQ软中断,运行当前处理器上到期的所有定时器。设备驱动程序如要获得时间信息以... 阅读全文
posted @ 2020-03-23 11:20 standardzero 阅读(377) 评论(0) 推荐(0)
摘要:1.ioctl 简介2.ioctl 函数实现模板TOC 1.ioctl 简介 ioctl是Linux专门为用户层控制设备设计的系统调用接口,这个接口具有极大的灵活性,我们的设备打算让用户通过哪些命令实现哪些功能,都可以通过它来实现,ioctl在操作方法集中对应的函数指针是long (*unlocked_ioctl) (struct file *, unsigned int, unsigned ... 阅读全文
posted @ 2020-03-23 11:18 standardzero 阅读(1525) 评论(0) 推荐(0)
摘要:1.主设备号码和次设备号2.字符设备的注册3.字符设备驱动程序样例TOC 1.主设备号码和次设备号 dev_t dev_t 类型是定义在中定义用来保存设备编号(前12位用来表示主设备号,后20位表示次设备号) 注意:我们获取主设备号和次设备号应该使用内核提供的宏 MAJOR(dev_t):获取主设备号 MINOR(dev_t):获取次设备号 MKDEV(int major, ... 阅读全文
posted @ 2020-03-23 11:17 standardzero 阅读(263) 评论(0) 推荐(0)
摘要:1.找到和本机相符的linux源码2.编写一个简单的驱动程序3.编译驱动及加载TOC 1.找到和本机相符的linux源码 查看本机是否有linux源码 查看目录/usr/src 以ubuntu14.04为例,linux源码目录为/usr/src/linux-headers-3.13.0-24-generic 若是本机没有源码就需要自己去下载相应的源码 同样以ubunt... 阅读全文
posted @ 2020-03-23 11:15 standardzero 阅读(332) 评论(0) 推荐(0)
摘要:问题:使用内核包编译驱动时常常提示如下: WARNING: Symbol version dump /usr/src/linux-2.6.26/Module.symvers is missing; modules will have no dependencies and modversions. 原因:通常头核心包中是没有Module.symvers这个文件的,要想获取... 阅读全文
posted @ 2020-03-23 11:12 standardzero 阅读(5814) 评论(1) 推荐(0)