linux驱动开发
hanchaoman
这个作者很懒,什么都没留下…
展开
-
linux module_init
就像你写C程序需要包含C库的头文件那样,Linux内核编程也需要包含Kernel头文件,大多的Linux驱动程序需要包含下面三个头文件:#include #include #include 其中,init.h 定义了驱动的初始化和退出相关的函数,kernel.h 定义了经常用到的原创 2011-07-12 23:03:12 · 1037 阅读 · 0 评论 -
ARM9260内部中断和外部中断触发方式
1.内部中断(0~31) 内部中断可以有4中触发方式 static struct irq_chip at91_aic_chip = { .name = "AIC", .irq_ack = at91_aic_mask_irq, .irq_mask = at91_aic_mask_irq,原创 2012-03-06 13:54:53 · 2834 阅读 · 0 评论 -
字符设备驱动poll函数
#ifndef _MEMDEV_H_#define _MEMDEV_H_#ifndef MEMDEV_MAJOR#define MEMDEV_MAJOR 0 /*预设的mem的主设备号*/#endif#ifndef MEMDEV_NR_DEVS#define MEMDEV_NR_DEVS 2 /*设备数*/#endif原创 2012-03-08 17:47:17 · 1387 阅读 · 0 评论 -
class_create(),class_device_create()创建/dev/xxx 名字
在刚开始写Linux设备驱动程序的时候,很多时候都是利用mknod命令手动创建设备节点,实际上Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点,当然前提条件是用户空间移植了udev。内核中定义了struct class结构体,顾名思义,一个struct class结构体类型变量对应一个类,内核同时提供了class_c原创 2012-03-27 11:30:48 · 2112 阅读 · 0 评论 -
Linux设备驱动编程之poll()函数原理
阻塞操作是指,在执行设备操作时,若不能获得资源,则进程挂起直到满足可操作的条件再进行操作。非阻塞操作的进程在不能进行设备操作时,并不挂起。被挂起的进程进入sleep状态,被从调度器的运行队列移走,直到等待的条件被满足。 在Linux 关于上述例程,我们补充说一点,如果将驱动程序中的read函数改为:static ssize_t globalv原创 2012-04-10 10:44:18 · 5228 阅读 · 2 评论 -
select 和poll函数调用驱动的poll->poll_wait 理解
poll_wait不会挂起当前进程,而是把自己注册到某个事件等待队列中.poll_wait()是用在select系统调用中的. 一般你的代码会有一个struct file_operations结构, 其中fop->poll函数指针指向一个你自己的函数, 在这个函数里应该调用poll_wait() 当用户调用select系统调用时,select系统调用会 先调用原创 2012-04-10 19:53:49 · 6143 阅读 · 2 评论 -
理解“统一编址与独立编址、I/O端口与I/O内存”
引言: 从CPU连出来一把线:数据总线、地址总线、控制总线,这把线上挂着N个接口,有相同的,有不同的,名字叫做存储器接口、中断控制接口、DMA接口、并行接口、串行接口、AD接口……一个设备要想接入,就用自己的接口和总线上的某个匹配接口对接……于是总线上出现了各种设备:内存、硬盘,鼠标、键盘,显示器…… 对于CPU而言,如果它要发数据到某个设备,其实是发到对应原创 2011-11-01 16:33:38 · 1309 阅读 · 0 评论 -
kernel 中断详解
ARM里的中断通常是指IRQ和FIQ,以IRQ来讲,ARM对IRQ的处理过程大概是这样: 外部设备遇到某一事件发出一个IRQ中断给中断控制器,中断控制器对这个IRQ进行硬件上的处理,把一些信息记在中断控制器的寄存器上,然后中断控制器通过IRQ中断线给ARM发一个信号。ARM收到信号,开始进行以下处理: (1)将当前状态的cpsr拷贝到IRQ状态的spsr中。 (2)将pc拷贝到I原创 2011-12-24 09:33:43 · 4444 阅读 · 2 评论 -
修改内核编译配置菜单(make menuconfig)
A.在Linux内核中增加自己的程序步骤(注意这里只是程序文件): 1.将编写的源代码复制到Linux内核源代码的相应目录中。2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项3.在目录的Makefile文件中增加对新源代码的编译条目。B.在Linux内核drivers/目录中增加目录和子目录步骤: 1.所加目录为daiq,文件如下:[daiq@lo原创 2012-08-07 11:10:38 · 183 阅读 · 0 评论 -
修改内核编译配置菜单(make menuconfig)
1.所加目录为daiq,文件如下:[daiq@localhost daiq]$ tree.|-- Kconfig|-- Makefile`-- test.c#注意此时各个目录中的Makefile和Kconfig文件是空的2.在新增的相应目录添加Kconfig和Makefile文件,上面的目录中已经添加。3.修改新增目录的父目录的Kconfig和Makefile文原创 2012-08-07 11:23:35 · 2745 阅读 · 0 评论 -
INIT_WORK(工作队列的理解)
以前内核里对这个函数是这样定义的 #define INIT_WORK(_work, _func, _data),可以理解为INIT_WORK会在你定义的_work工作队列里面增加一个工作任务,该任务就是_func。_func这个任务会需要一些数据作为参数,这个参数就是通过_data传递的 而现在看驱动的时候你会发现调用INIT_WORK的时候是只有两个参数,去掉了数据的部分。也许你原创 2012-12-11 10:15:13 · 2787 阅读 · 0 评论 -
AT91SAM9261的LINUX2.6 GPIO与GPIO中断
关于LINUX对926X中断的实现(LINUX2.6.24中试用) 一,926X中断的描述 对于926X有先进中断控制器控制中断具体对应的中断有0~310为FIQ,1为系统,2~31对应设备.见DATASHEET 二,926X中断的LINUX实现 1,PIO的输入中断问题,手册描述了 PIOA 2 PIOB 3 PIOC原创 2011-12-24 09:34:49 · 2956 阅读 · 0 评论 -
高级字符设备驱动--中断下半部机制之workqueue(二)
工作队列workqueue工作队列(work queue)是另外一种将中断的部分工作推后的一种方式,它可以实现一些tasklet不能实现的工作,比如工作队列机制可以睡眠。这种差异的本质原因是,在工作队列机制中,将推后的工作交给一个称之为工作者线程(worker thread)的内核线程去完成(单核下一般会交给默认的线程events/0)。因此,在该机制中,当内核在执行中断的剩余工作时就处在原创 2012-02-20 22:03:50 · 957 阅读 · 0 评论 -
工作队列wait queue() wait_event() interruptible_sleep_on()等应用方法
在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒。wait queue很早就作为一种基本的功能单位出现在Linux内核里了,它以队列位基础数据结构,与进程调度机制紧密结合,能够用于实现内核中异步事件通知机制。等待队列可以用来同步对系统资源的访问。(信号量在内核中也依赖等待队列来实现)。 Linux-2.6提供如下关于等待队列的操作: (1)原创 2012-12-11 11:44:34 · 4601 阅读 · 2 评论 -
kernel hacker修炼之道之内存管理-高端内存(上)
2011-09-26 17:45 1147人阅读 评论(8) 收藏 举报 浅析linux内核内存管理之高端内存转载 2011-11-07 08:47:31 · 2061 阅读 · 0 评论 -
深入浅出Linux设备驱动同步、互斥
在驱动程序中,当多个线程同时访问相同的资源时(驱动程序中的全局变量是一种典型的共享资源),可能会引发"竞态",因此我们必须对共享资源进行并发控制。Linux内核中解决并发控制的最常用方法是自旋锁与信号量(绝大多数时候作为互斥锁使用)。 自旋锁与信号量"类似而不类",类似说的是它们功能上的相似性,"不类"指代它们在本质和实现机理上完全不一样,不属于一类。 自旋锁不会引起调用者睡眠原创 2013-04-08 17:10:09 · 1322 阅读 · 0 评论 -
CAN总线疑惑与解答
1 CAN总线2根数据线是怎么表示数据信息1和0的?Can总线采用差分数据表示方法,平时2个数据线为2.5V,表示隐性(1)。当用数据0(显性)需要发送时1跟数据线上升到3.5V另一个下降到1.5V。如图a所示所有节点都连接到这两根数据线,当所有节点都发送数据为隐性时总线数据才表示为隐性,如果有其中一个节点发送数据显性则总线数据表示为显性。数据仲裁也就是基于这样一个特点仲裁的。原创 2014-12-01 11:29:30 · 5398 阅读 · 0 评论 -
高级字符设备驱动--中断下半部机制之tasklet(一)
综述 Linux把中断处理例程分两部分:上半分:实际响应中断的例程。下半分:被顶部分调用,通过开中断的方式进行。两种机制实现:Tasklet工作队列work queue上半部的功能是"登记中断",当一个中断发生时,它进行相应地硬件读写后就把中断例程的下半部挂到该设备的下半部执行队列中去。因此,上半部执行的速度就会很快,可以服务更多的中断请求。但是,仅有"原创 2012-02-20 21:34:00 · 946 阅读 · 0 评论 -
Linux内存管理-高端内存
上一周一直在关注linux内存中3:1(3G:1G)的关系,并没有考虑到如果我的物理内存大于1G,那么内核空间1G的虚拟空间如何映射整个物理内存呢?以及内核是如何管理这大于1G的物理内存的。 下面是转载的文章,解释了这个疑问。 高端内存是指物理地址大于 896M 的内存。对于这样的内存,无法在“内核直接映射空间”进行映射。为什么? 因为“内核直原创 2012-02-02 08:39:02 · 992 阅读 · 0 评论 -
Linux 设备驱动 Edition 3
http://oss.org.cn/kernel-book/ldd3/index.html原创 2011-07-12 23:30:07 · 769 阅读 · 0 评论 -
Linux设备驱动工程师之路——硬件访问及混杂设备LED驱动
http://blog.csdn.net/ayangke/article/details/6794913转载 2011-09-21 19:45:19 · 636 阅读 · 0 评论 -
ARM外部中断视频讲解
http://video.sina.com.cn/search/index.php?k=ARM%E5%A4%96%E9%83%A8%E4%B8%AD%E6%96%AD%E6%9C%BA%E5%88%B6%E8%AF%A6%E8%A7%A3%E4%B8%8ELED%E9%A9%B1原创 2011-09-21 16:38:47 · 1081 阅读 · 0 评论 -
Linux学习:内核访问I/O资源的方法
内核访问外设I/O资源的方式 我们知道默认外设I/O资源是不在Linux内核空间中的(如sram或硬件接口寄存器等),若需要访问该外设I/O资源,必须先将其地址映射到内核空间中来,然后才能在内核空间中访问它。 Linux内核访问外设I/O内存资源的方式有两种:动态映射(ioremap)和静态映射(map_desc)。 一、动态映射(ioremap)方式 动态映射方式是大家使用了比原创 2011-10-24 15:03:33 · 1182 阅读 · 0 评论 -
set_irq_type() -- 设置中断触发类型/方式
------------------------------------------------/*** set_irq_type - set the irq type for an irq* @irq: irq number* @type: interrupt type - see include/linux/interrupt.h*/int原创 2011-11-18 15:42:36 · 3825 阅读 · 0 评论 -
I/O 端口和 I/O 内存
1、I/O 端口和 I/O 内存每个外设都是通过读写其寄存器来控制的。通常一个设备有几个寄存器,它们位于内存地址空间或者I/O地址空间,并且地址是连续的。在硬件层上,内存区和I/O区域没有概念上的区别: 它们都是通过在地址总线和控制总线上发出电信号来存取(即,读写信号),并且通过数据总线来读写数据。在一些CPU制造商在其芯片上实现了一个单地址空间(统一编址)的同时,其它的C原创 2011-11-01 16:16:35 · 3595 阅读 · 4 评论 -
kernel hacker修炼之道之内存管理-高端内存(下)
临时内核映射: 固定映射的线性区从FIXADDR_START~FIXADDR_TOP,而临时内核映射区只是固定映射的线性区的一部分。固定映射用fixed_addresses中的索引从0xfffff000开始倒着往前分配固定地址的映射区。而临时内核映射其实就是永久映射的原子实现版本,它使用固定映射中FIX_KMAP_BEGIN到FIX_KMAP_END(它们都是的原创 2011-11-07 08:48:34 · 2317 阅读 · 0 评论 -
Linux内存管理大图
原创 2011-11-07 08:49:40 · 152 阅读 · 0 评论 -
U-BOOT视频
http://v.youku.com/v_show/id_XMzA4NzkzODI0.html转载 2011-11-07 21:44:22 · 1010 阅读 · 0 评论 -
linux 模块编译步骤(原)
本文将直接了当的带你进入linux的模块编译。当然在介绍的过程当中,我也会添加一些必要的注释,以便初学者能够看懂。之所以要写这篇文章,主要是因为从书本上学的话,可能要花更长的时间才能学会整个过程,因为看书的话是一个学习过程,而我这篇文章更像是一个培训。所以实践性和总结性更强。通过本文你将会学到编译一个模块和模块makefile的基本知识。以及加载(卸载)模块,查看系统消息的一些知识;声明:原创 2011-11-12 10:29:29 · 10974 阅读 · 2 评论 -
ioremap和ioport_map
一.基础介绍IO寄存器(内存)有两种地址映射方式,即映射到IO地址空间(portio),映射到内存地址空间(mmio)。在linux-2.6之前,前者使用inb/outb(......)访问,后者通过readb/writeb(......)来访问(访问前必须使用ioremap将IO物理地址映射到虚拟地址)。ioremap函数作用如前所述,就是将IO物理地址映射成虚拟地址,这样r原创 2011-11-14 09:16:47 · 4936 阅读 · 2 评论 -
AT9260 GPIO中断
#i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclude #i nclud原创 2012-01-06 14:23:54 · 2565 阅读 · 1 评论 -
Linux设备模型之platform总线
从Linux 2.6起引入了一套新的驱动管理和注册机制:Platform_device和Platform_driver。 Linux中大部分的设备驱动,都可以使用这套机制, 设备用Platform_device表示,驱动用Platform_driver进行注册。 Linux platform driver机制和传统的device driver 机制(通过driver_regis原创 2012-01-30 09:35:29 · 1087 阅读 · 0 评论 -
基于platform总线的中断(按键)字符设备驱动设计
1、platform简介为了理解platform总线设备驱动模型的实际运用,我首先分析了基于S3C2410的看门狗驱动实现过程,我本着将自己学过的知识在温习一遍的态度,完成了基于platform平台总线的外部中断(按键)的基本实现过程,分别采用了混杂字符设备和一般字符设备进行了操作,其中混杂字符设备驱动、应用程序参照了 Y-Kee http://blog.csdn.net/ayangke,原创 2012-01-30 17:47:36 · 2954 阅读 · 0 评论 -
linux设备驱动归纳总结--.platform设备驱动
linux设备驱动归纳总结(九):1.platform总线的设备和驱动xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx这一节可以理解是第八章的延伸,从这节开始介绍platform设备驱动。xxxxxxxxxxxxxxxxxxxxxxxxxx原创 2012-01-30 10:49:56 · 1967 阅读 · 0 评论 -
platform_get_resource 如何获取资源
这几天和小段研究了下platform_get_resource函数的使用,总结如下: 在platform机制下,板级文件BSP一般定义了设备的资源,在系统初始化的过程便对platform_device进行注册,接着注册platform_driver,两者都注册完毕之后哦,platform_driver便去probe,在probe的过程中,会使用platform_get_resour原创 2012-01-31 10:50:47 · 3114 阅读 · 1 评论 -
wait_event_interruptible_timeout和schedule_timeout区别
一、适用情况wait_event_interruptible_timeout和schedule_timeout的区别当在某个硬件驱动程序中使用wait_event_interruptible_timeout时,执行的继续可以通过以下两种方式获得:1.其他人在等待队列上调用了wake_up2.超时到期。而调用schedule_timeout的进程始终会在超时到期时被唤醒。二、原创 2012-04-22 21:17:01 · 12567 阅读 · 0 评论