
Linux Driver
win9zz
Life is brief, and then you die, you know?
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
poll机制
用中断来实现按键驱动程序里面,如果我们一直没有按键按下触发中断应用程序会一直的在休眠,现在我们想让它隔一段时间就返回一个值要怎么做呢,这就是POLL机制,我们可以用poll机制来实现它,下面来分析一下这个poll机制:我们知道当我们应用程序open,write..时,驱动程序里面也会有相应的open,write等函数(其实是产生了一个软中断,swi异常处理函数指针被组织成了一个表格,swi转载 2016-11-29 18:09:50 · 1212 阅读 · 0 评论 -
USB设备的VID与PID
PID/VID唯一标识一个设备,HardwareID是为了给系统识别的 ,他是根据PID/VID而生成的。这个与序列号没什么关系,序列号一般都是厂家固化到芯片中的信息而已。GUID只是为了标志你安装的设备是属于一个什么类当中,这个类可以显示再设备管理器中。比如:你可以定义一个类,当然这个类有与系统中任何类都不同的GUID,然后选择一个图标和类名,就可以同网卡等其他设备一起显示在设备管理器下的根目录原创 2017-06-21 12:26:09 · 1845 阅读 · 0 评论 -
platform_driver注册时probe被调用关系
涉及到的结构体:struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_dev原创 2017-06-20 13:38:30 · 1836 阅读 · 0 评论 -
__devexit_p
.remove = __devexit_p(s3c2410wdt_remove),进入init.h,/* Functions marked as __devexit may be discarded at kernel link time, dependingon config options. Newer versions of binutils detect references f原创 2017-06-18 14:12:47 · 1309 阅读 · 0 评论 -
编译驱动ko文件
KERN_DIR = /work/system/linux-3.4.2all: make -C $(KERN_DIR) M=`pwd` modules clean: make -C $(KERN_DIR) M=`pwd` modules clean rm -rf modules.orderobj-m += hello.o-原创 2017-05-03 13:29:23 · 2432 阅读 · 0 评论 -
Linux驱动程序中THIS_MODULE 的定义
结构体struct module在内核中代表一个内核模块,通过insmod(实际执行init_module系统调用)把自己编写的内核模块插入内核时,模块便与一个struct module结构体相关联,并成为内核的一部分。下面是结构体struct module的完整定义,接下来会逐个解释:struct module{enum module_state st转载 2017-04-06 18:53:42 · 1788 阅读 · 0 评论 -
int i2c_probe()
1.i2c驱动涉及到的数据结构: struct i2c_adapter { struct module *owner; unsigned int id; unsigned int class; // 适配器支持的类型,如传感器,eeprom等 const struct i2c_algor原创 2017-03-29 23:58:57 · 2979 阅读 · 0 评论 -
如何实例化一个i2c设备(struct i2c_client)
之前写的i2c驱动程序对应的linux-2.6的内核,在移植到linux-3.4时,发现好多API不一样了。让我们打开/linux-3.4.2/Documentation/i2c/instantiating-devices,一探究竟。不像PCI或USB设备,I2C设备不在硬件级枚举。相反,软件必须知道连接在每个I2C总线段的设备,以及这些设备正在使用什么地址。因为这个原因,内核代码必须显式地实例化...原创 2017-04-03 22:43:41 · 6730 阅读 · 0 评论 -
int register_chrdev()
在i2c的static int at24cxx_detect(struct i2c_adapter *adapter, int address, int kind)中有一句,major = register_chrdev(0, "at24cxx", &at24cxx_fops);进去内核中:1 int register_chrdev(unsigned int major, const原创 2017-03-26 23:01:14 · 1297 阅读 · 0 评论 -
linux中readl()和writel()函数
writel() 往内存映射的 I/O 空间上写数据,wirtel() I/O 上写入 32 位数据 (4字节)。 原型:#include void writel (unsigned char data , unsigned short addr ) readl() 从内存映射的 I/O 空间读取数据,readl 从 I/O 读取 3原创 2017-06-11 23:00:50 · 1815 阅读 · 0 评论 -
Linux时钟管理clk
硬件资源越来越庞大和复杂,内核的另一个挑战就是要便捷的管理这些资源。同时,面对如此之多的平台不同的CPU,管理机制需要统一适用,这就需要对资源的管理抽象到更加通用的层次。CPU中各个模块都需要时钟驱动,内核需要一种机制能通用所有的平台,方便的管理CPU上所有的clk资源。这里分析Linux对clk的管理。1. clk通用接口内核定义了一套标准的接口(include/linux/clk.原创 2017-06-12 04:02:29 · 2652 阅读 · 0 评论 -
内存块设备
最简单的块设备,基于linux4.4内核#define RAMBLOCK_SIZE (1024*1024)static struct gendisk *ram_block;static struct request_queue *ram_block_queue;static unsigned char *ramblock_buf; static int major;static DE原创 2017-09-11 21:53:59 · 1988 阅读 · 0 评论 -
自旋锁、内核信号量、原子变量
1.自旋锁自旋锁用在多处理器的环境下保护数据,如果数据被锁,则反复执行一条命令(一直旋转)。在单处理器(非抢占式内核中),自旋锁不起作用。被自旋锁锁着的进程一直在旋转,而不是睡眠,所以自旋锁可以用在中断等禁止睡眠的场景。2.内核信号量内核信号量与自旋锁类似,进程如果不能获取内核信号量则进入睡眠状态。3.原子变量原子变量提供一种原子的不可中断的操作。原创 2017-02-09 02:27:45 · 1420 阅读 · 0 评论 -
Wait Queue等待队列
驱动中使用等待队列来实现阻塞进程的唤醒,它以队列为基础数据结构,与进程调度机制紧密结合。定义等待队列头部wait_queue_head_t my_queue;初始化“等待队列头部”init_waiatqueue_head(&my_queue);(PS:下面的宏可以作为定义并初始化等待队列头部的快捷方式DECLARE_WAIT_QUEUE_HEAD(n原创 2017-03-23 21:13:30 · 1883 阅读 · 0 评论 -
Linux内核 kmalloc, kzalloc & devm_kzalloc 区别
首先,kzalloc()实现了kmalloc()+memset()的功能 源码如下:static inline void *kzalloc(size_t size, gfp_t flags) { return kmalloc(size, flags | __GFP_ZERO); }而 devm_kzalloc() 是具有资源管理的 kzalloc()。使用资源管转载 2017-08-31 17:11:22 · 1919 阅读 · 0 评论 -
linux 内核使用的主设备号
在include/uapi/linux/major.h中,说明了内核需要使用的一些主设备号,如果写驱动程序手工分配主设备号,避开这些即可。原创 2017-08-31 14:37:26 · 1818 阅读 · 1 评论 -
device_create创建设备节点分析
在驱动中经常可以看到类似下面的话:adb_dev_class = class_create(THIS_MODULE, "adb");device_create(adb_dev_class, NULL, MKDEV(ADB_MAJOR, 0), NULL, "adb");那么device_create调用什么函数创建设备节点,继续分析struct device *device_create原创 2017-08-26 21:51:43 · 3355 阅读 · 0 评论 -
字符设备驱动之register_chrdev_region()系列
1.内核中所有已分配的字符设备编号都记录在一个名为 chrdevs 散列表里。该散列表中的每一个元素是一个char_device_struct 结构,它的定义如下:static struct char_device_struct {struct char_device_struct *next; // 指向散列冲突链表中的下一个元素的指针unsigned int major;转载 2017-08-26 15:05:34 · 2277 阅读 · 0 评论 -
驱动报错
试着移植linux-3.5下的mma7660.c到linux-4.4下,编译mma7660.c驱动时报错:include/linux/bug.h:33:45: error: negative width in bit-field '' #define BUILD_BUG_ON_ZERO(e) (sizeof(struct { int:-!!(e); }))原创 2017-09-04 12:19:00 · 3217 阅读 · 0 评论 -
SMBus i2c
SMBusI2C最大传输速度 100kHz最大传输速度400kHz最小传输速度 10kHz无最小传输速度35ms时钟低超时无时钟超时固定的逻辑电平逻辑电平由VDD决定不同的地址类型(保留、动态等) 7位、 10位和广播呼叫从地址类型不同的总线协议(快速命令、 处理呼叫等) 无总线协议SMBu原创 2017-04-01 00:42:28 · 2725 阅读 · 1 评论 -
signal_pending函数解析
经常我们在睡眠的代码中 会看到这样的例子: if (signal_pending(current)) { ret = -ERESTARTSYS; return ret; } 关于 -ERESTARTSYS 到底是什么意思? -ERESTARTSYS表示信号函数处理完毕后重新执行信号函数前的某个系统转载 2017-03-23 22:07:34 · 6852 阅读 · 0 评论 -
wait_event_interruptible 使用方法
1. 关于 wait_event_interruptible() 和 wake_up()的使用 读一下wait_event_interruptible()的源码,不难发现这个函数先将 当前进程的状态设置成TASK_INTERRUPTIBLE,然后调用schedule(), 而schedule()会将位于TASK_INTERRUPTIBLE状态的当前进程从runqueue 队转载 2016-11-25 03:33:28 · 1124 阅读 · 0 评论 -
按键中断
#include #include #include #include #include #include #include #include #include #include #include static struct class *button_irq;static struct class_device *button_irq_dev;int major;s原创 2016-11-25 03:34:53 · 1227 阅读 · 0 评论 -
module_param()函数学习
module_param()的学习一.module_param1.为什么引入 在用户态下编程可以通过main()来传递命令行参数,而编写一个内核模块则可通过module_param()来传递命令行参数. 2. module_param宏是Linux 2.6内核中新增的,该宏被定义在include/linux/moduleparam.h文件中,具体定义如下: /* He转载 2016-11-23 17:02:43 · 1342 阅读 · 0 评论 -
驱动中结构体初始化
这是GCC的新语法。stuct A {int a;int b;int c; }若设置c = 2; 按以前的语法,是这样:struct A test = {0,0,2};新语法是:struct A test = {.c = 2,};更高效,更直观,不用设置a,b。原创 2016-11-23 02:46:46 · 1113 阅读 · 0 评论 -
linux输入子系统概念介绍
在此文章之前,我们讲解的都是简单的字符驱动,涉及的内容有字符驱动的框架、自动创建设备节点、Linux中断、poll机制、异步通知、同步互斥、非阻塞、定时器去抖动。上一节文章链接:http://blog.csdn.net/lwj103862095/article/details/17589311在这一节里,我们要引入linux的分离分层的概念,linux输入子系统是一个很好的代表,在转载 2016-12-02 00:10:07 · 1118 阅读 · 0 评论 -
Linux平台总线驱动设备模型
platform总线是一种虚拟的总线,相应的设备则为platform_device,而驱动则为platform_driver。Linux 2.6的设备驱动模型中,把I2C、RTC、LCD等都归纳为platform_device。总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。Linu转载 2017-01-15 03:05:00 · 1048 阅读 · 0 评论 -
struct bus_type 结构体
这个结构体的定义在include/Linux/device.h中。本节先简单介绍结构体中的成员,再对每个成员作详细描述。[cpp] view plain copystruct bus_type { const char *name; struct bus_attribute *bus_attrs; struct device_a转载 2017-02-07 01:53:14 · 1564 阅读 · 0 评论 -
i2c驱动从注册到probe被调用
涉及到的结构体:struct i2c_driver { unsigned int class; /* Notifies the driver that a new bus has appeared or is about to be * removed. You should avoid using this, it will be removed in a * near fut原创 2017-04-06 22:36:37 · 2800 阅读 · 0 评论 -
Framebuffer原理、使用、测试
Framebuffer的配置及应用*一、FrameBuffer的原理* FrameBuffer 是出现在 2.2.xx 内核当中的一种驱动程序接口。 Linux是工作在保护模式下,所以用户态进程是无法象DOS那样使用显卡BIOS里提供的中断调用来实现直接写屏,Linux抽象出 FrameBuffer这 个设备来供用户态进程实现直接写屏。Framebuffer机制模仿显卡的功能,将显转载 2017-03-20 00:07:31 · 2160 阅读 · 0 评论 -
Kobject相关
kobjec是linux在2.6中新引进的统一的设备管理模型,他的主要目的就是对linux的2.6系统所有的设备进行统一的管理,在以前的内核中并没有独立的数据结构让内核对整体的系统做配置和管理。尽管缺乏此类的信息,但是很多时候系统还是能正常工作,然后随着设备越来越多,系统越来越复杂,以及需要支持更多诸如电源管理等新的特征需要,新的内核版本明确提出了需要统一管理设备的要求:需要有一个对系统结构整体统转载 2017-03-19 21:59:35 · 1093 阅读 · 0 评论 -
认真分析mmap:是什么 为什么 怎么用
mmap基础概念 mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映转载 2017-01-29 03:10:02 · 1104 阅读 · 0 评论 -
驱动
原创 2017-01-29 00:35:08 · 1099 阅读 · 0 评论 -
container_of分析
1.container_of宏1> Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。2>接口:container_of(ptr, type, member) ptr:表示结构体中member的地址 type:表示结构体类型 membe转载 2017-02-08 13:53:48 · 1119 阅读 · 0 评论 -
Linux中的GPIO口使用方法
Linux中的IO使用方法 应该是新版本内核才有的方法。 请参考:./Documentation/gpio.txt文件提供的API: 驱动需要包含 #include转载 2017-09-20 21:36:47 · 1801 阅读 · 0 评论