
linux驱动开发
嵌入式软件开发,linux驱动示例,记录开发驱动程序的框架。
吴英强
80后,IT男,全栈工程师。
展开
-
Linux驱动程序:统计单词个数
本例为Android升读探索(卷1):HAL与驱动开发 一书中附带的shili原创 2014-06-09 13:18:11 · 2150 阅读 · 0 评论 -
linux驱动开发--中断:工作者队列实现中断底半部
1、工作队列工作队列(work queue)是linux kernel中将工作推后执行的一种机制;这种机制和tasklet不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于它允许重新调度甚至睡眠。工作队列数据类型定义,在中struct work_struct{ atomic_long_t data;//记录工作状态和指向工作者线程的指针 stru原创 2014-03-05 10:32:22 · 1790 阅读 · 0 评论 -
linux驱动开发--中断:tasklet实现中断底半部
1、在Linux 中实现中断底半部的机制主要是:tasklet、工作队列、软中断2、tasklet定义在中tasklet定义DECLARE_TASKLET(taskletname, tasklet_func, data);taskletname:待定义的tasklet名字tasklet_func:tasklet处理函数data:待传入tasklet处理函数的参数原创 2014-03-05 09:57:34 · 1842 阅读 · 0 评论 -
linux驱动开发--中断:按键中断
1、中断定义中断是指cpu在执行过程中,出现了某些突发事件时cpu必须暂停执行当前的程序,转去处理突发事件,处理完毕后cpu又返回原程序被中断的位置并继续执行。2、中断分类3、Linux中断处理程序结构a.在Linux系统中,中断处理程序分解为两个半部:顶半部(TopHalf)和底半部(BottomHalt)。b.顶半部:完成尽可能少的比较紧急的功能,往往只是简原创 2014-02-14 09:22:21 · 2975 阅读 · 0 评论 -
linux驱动开发--字符设备:设备轮询操作select/poll
select系统调用 用于多路监控,当没有一个文件满足要求时,select调用将引起进程阻塞设备轮询操作,对应select系统调用 unsigned int(*poll)(struct file *filp, struct poll_table_struct *wait); unsigned int(*poll)(struct file *原创 2014-01-24 15:31:15 · 3458 阅读 · 0 评论 -
linux驱动开发--字符设备:内核等待队列
在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒。等待队列可以用来同步对系统资源的访问。1.定义和初始化队列头wait_queue_head_t wqh;init_waitqueue_head(wait_queue_head_t *wqh);2.定义和初始化等待队列DECLARE_WAITQUEUE(name, tsk);3.添加、移除等原创 2014-01-24 15:05:14 · 2302 阅读 · 0 评论 -
linux驱动开发--字符设备:信号量
信号量的使用信号量(semaphore)是用于保护临界区的一种常用方法,它的使用和自旋锁类似。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但是与自旋锁不同的是当获取不到信号量时,进程不会原地打转而是进入休眠等待状态。关于信号量的操作函数:1、定义信号量struct semaphore sem;2、初始化信号量sema_init(struct semaphore *原创 2014-01-17 09:23:33 · 1636 阅读 · 0 评论 -
linux驱动开发--字符设备:自旋锁
自旋锁的使用自旋锁(spin lock)是一种对临界资源进行互斥访问的典型手段,其名称来源于它的工作方式。为了获得自旋锁,在某cpu上运行的代码需要先执行一个院子操作,该操作测试并设置某个内存变量,由于它是原子操作,所以在该操作完成之前其他执行单元不可能访问这个内存变量。如果测试结果表明锁已经空闲,则程序获得这个自旋锁并继续执行;如果测试结果表明锁被占用,程序将在一个小循环内重复这个“测试原创 2014-01-16 16:15:26 · 1915 阅读 · 0 评论 -
linux驱动开发--字符设备:原子操作
解决竞态问题的途径是保证对共享资源的互斥访问,所谓互斥访问是指一个执行单元在访问共享资源的时候,其他的执行单元被禁止访问。访问共享资源的代码区域称谓临界区(critical sections),临界区需要以某种互斥机制加以保护。中断屏蔽、原子操作、自旋锁和信号量是Linux设备驱动中可采用的互斥途径。原子操作原子操作指的是在执行过程中不会被别的代码路径所中断的操作。Linux内原创 2014-01-08 16:04:29 · 2386 阅读 · 0 评论 -
linux驱动开发--字符设备:添加文件指针偏移的功能
设备移位操作llseek对应lseek系统调用的设备移位操作为llseek默认情况为允许设备移位操作大部分字符设备提供的都是数据流而不是一个数据区,比如串口,对于这些设备而言移位操作毫无意义设备可选择是否支持移位操作支持设备移位操作loff_t (*llseek)(struct file *filp, loff_t off, int whence);filp:待操作原创 2013-12-31 14:35:35 · 3003 阅读 · 0 评论 -
linux驱动开发--copy_to_user 、copy_from_user函数实现内核空间数据与用户空间数据的相互访问
设备读操作如果该操作为空,将使得read系统调用返回负EINVAL失败,正常返回实际读取的字节数ssize_t (*read)(struct file *filp, char __user *buf, size_t count, lofft *f_pos);filp:待操作的设备文件file结构体指针buf:待写入所读取数据的用户空间缓冲区指针count:待读取数据字节数原创 2013-12-30 10:33:09 · 17391 阅读 · 1 评论 -
linux驱动开发--字符设备:通过cdd_cdev结构中的led变量区分是哪个节点,private_data使用
private_data改进为设备驱动支持多个设备个体做准备,针对private_data进行改进在设备打开操作中通过inode中保存的i_cdev获取代表当前设备的cdev对象通过代表当前设备的cdev对象得到包含该对象的设备私有数据结构体将设备私有数据结构体指针保存到struct file的private_data成员中在其它设备操作中直接使用保存在struct file的原创 2013-12-28 10:50:19 · 2824 阅读 · 0 评论 -
linux驱动开发--字符设备:创建一组设备节点
cdev改进为设备驱动支持多个设备个体做准备,针对cdev进行改进将代表字符设备的cdev对象包含在设备驱动定义的私有数据结构体中对设备驱动私有数据结构体采用内核内存分配方式为其分配内存将为每个设备添加cdev对象和创建设备节点封装为一个独立函数支持多个设备个体为设备驱动支持多个设备个体对驱动进行改进循环调用为每个设备添加cdev对象和创建设备节点而封装的独立函数实现在原创 2013-12-28 10:06:20 · 2741 阅读 · 0 评论 -
linux驱动开发--字符设备:自动创建设备节点
自动创建设备文件定义在中class结构:该结构体类型变量对应一个设备类,被创建的类存放在/sys目录下面device结构:该结构体类型变量对应设备,被创建的设备存放于/sys目录下面在加载驱动模块时,用户空间中的udev会自动响应device_create()函数,在/sys下寻找对应的类,从而为这个设备在/dev目录下创建设备文件内核版本问题:在内核2.4版本中使用dev原创 2013-12-28 09:54:25 · 5571 阅读 · 0 评论 -
linux驱动开发--字符设备:简单的file_operations示例
字符设备结构struct cdev内核使用该结构来表示一个字符设备,在中定义。重要成员:struct kobject kobj;//设备对象struct module *owner;//该设备的拥有者驱动模块struct file_operations *ops;//设备操作集合struct list_head list;//内核维护的字符设备链表成员dev_t dev;//字原创 2013-12-27 18:12:19 · 2759 阅读 · 0 评论 -
linux驱动开发--字符设备:动态分配设备号
设备号的动态分配int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name);dev:保存分配到的设备号baseminor:希望分配的起始次设备号count:需要分配的设备号数目name:设备名称(出现在/proc/devices) 返回:成功原创 2013-12-27 16:43:05 · 2455 阅读 · 0 评论 -
linux驱动开发--字符设备:静态分配设备号
字符设备(char device) 采用字节流方式访问的设备称为字符设备,通常智能采用顺序访问方式,也有极少数可以前后移动访问指针的设备(如:帧捕捉卡等设备)。系统标准字符设备,例如:字符中断、串口等设备。常见待开发设备驱动的字符设备,例如:触摸屏、键盘、视频捕捉设备、音频设备等。设备号主设备号 用于标识设备类型,内核代码根据该号码对应设备文件和对应的设原创 2013-12-27 14:53:46 · 2991 阅读 · 0 评论 -
linux驱动开发--内核定时器
1、内核定时器时钟中断:由系统的定时硬件以周期性的时间间隔发生,这个间隔(也就是频率)由内核根据常数HZ来确定。HZ常数:她是一个与体系结构无关的常数,可以配置50-1200之间,可以在内核中配置tick:她是HZ的倒数,也就是每发生一次硬件定时器中断的事件间隔。如HZ为200,tick为5毫秒。jiffies核心变数:它是linux核心变数(32位变数,unsigned long原创 2013-12-26 16:23:18 · 2861 阅读 · 0 评论 -
linux驱动开发--内核链表
1、内核链表定义在中定义struct list_head{ struct list_head *next, *prev;};在list_head结构中包含两个指向list_head结构的指针next和prev,在实际使用中,它通常被组织成双向循环链表。内核链表结构体不包含数据域,只包含维护链表的指针域。内核链表被包含在其他数据结构体中使用。初始化链表头INIT_LI原创 2013-12-26 15:58:10 · 1937 阅读 · 0 评论 -
linux驱动开发--内核空间中内存的申请与释放
1、Linux内存管理linux内存最小管理单位为页(page),通常一页为4kb。linux系统中,在初始化时,内核为每个物理内存页建立一个page的管理结构,操作物理内存时实际上就是操作page页。物理地址:出现在cpu地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。线性地址(虚拟地址):在32位cpu架构上,可以表示4G的地址空间,也就是0x00000000-0原创 2013-12-26 15:34:01 · 2470 阅读 · 0 评论 -
linux驱动开发--内核模块参数
内核模块参数,验证小例子:/***Copyright (c) 2013.TianYuan*All rights reserved.**文件名称: Modparma.c*文件标识: 模块参数的验证**当前版本:1.0*作者:wuyq **取代版本:xxx*原作者:xxx*完成日期:2013-11-18*/#include #include /*内核提供的机制:在原创 2013-12-26 08:55:55 · 1490 阅读 · 0 评论 -
linux驱动开发--导出内核符号
/***Copyright (c) 2013.TianYuan*All rights reserved.**文件名称: Esdexp.c*文件标识: 导出内核符号,此文件中的函数模块被Esdimp.c调用**当前版本:1.0*作者:wuyq **取代版本:xxx*原作者:xxx*完成日期:2013-11-18*/#include #include MODULE_L原创 2013-12-26 08:44:56 · 1969 阅读 · 0 评论 -
解决编译内核模块helloworld.c:1: 错误:代码模式‘kernel’在 32 位模式下不受支持问题,未编译对64位的支持
Makefile内容:KERNELDIR ?=/root/Desktop/work/TI/linux-3.2.0PWD := $(shell pwd)obj-m += helloworld.odefault: $(MAKE) -C $(KERNELDIR) M=$(PWD) modulesclean: @rm -f *.o *.ord* *.sy* *.mod.*原创 2013-11-16 09:44:01 · 5392 阅读 · 0 评论