linux 驱动开发
ajian1453
这个作者很懒,什么都没留下…
展开
-
ATMEL9260 LED driver 的用法
Linux 下驱动GPIO 其实不用自己写,最近项目要用到开发板上的GPIO,搜索了一番,发现linux 下实现GPIO 驱动实在是太方便了,有现成的framework 可用,基本上要做的事情就是定义一下Linux 下通过框架实现LED 大致过程如下1、实现框架要求的几个函数int gpio_request(unsigned gpio, const char *label)void转载 2013-04-16 14:44:18 · 178 阅读 · 0 评论 -
Linux 关中断 与 开中断
如果你要禁止所有的中断该怎么办? 在2.6内核中,可以通过下面两个函数中的其中任何一个关闭当前处理器上的所有中断处理,这两个函数定义在 中: void local_irq_save(unsigned long flags); void local_irq_disable(void); 对 local_irq_save的调用将把当前中断状态保存到flags中,然后禁用当转载 2012-11-13 14:47:27 · 233 阅读 · 0 评论 -
ARRAY_SIZE含义
在写驱动时,看到ARRAY_SIZE这个宏,是求设备结构体中设备的个数。追其实现,在linux/kernel.h中,发现#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + __must_be_array(arr)) 其中__must_be_array(arr))作用:宏定义防止被误用,比如用在指针而不是数组上。转载 2012-11-12 12:37:08 · 175 阅读 · 0 评论 -
mod_timer 定时器
内核通过函数mod_timer来实现已经激活的定时器超时时间:mod_timer(&my_timer, jiffies+new_delay);mod_timer函数也可以操作那些已经初始化,但还没有被激活的定时器,如果定时器没有激活,mod_timer会激活它。如果调用时定时器未被激活,该函数返回0,否则返回1。一旦从mod_timer函数返回,定时器都将被激活而且设置了新的定时值。转载 2012-11-11 19:28:54 · 1353 阅读 · 0 评论 -
spin_lock & mutex_lock的区别?
本文由该问题引入到内核锁的讨论,归纳如下为什么需要内核锁?多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理有哪些内核锁机制?(1)原子操作atomic_t数据类型,atomic_inc(atomic_t *v)将v加1原子操作比普通操作效率要低,因此必要时才使用,且不能与普通操作混转载 2012-11-11 22:02:28 · 181 阅读 · 0 评论 -
TQ2440 GPIO模拟SPI读取AD转换器TLC2543芯片
转自:http://blog.csdn.net/striker211/article/details/7432685其实接触CSDN好久了,一直没有想写自己的博客,遇到问题的时候才去上CSDN参考别人的资料,想到以后不能脚踩西瓜皮,滑倒哪里是哪里,要一个萝卜一个坑,用CSDN博客记录下自己的每一个脚印,一来自己以后可以回过来温故知新,二来很高兴为后来人做一个可参考的基石。毕设了,打算用转载 2012-11-09 14:28:23 · 272 阅读 · 0 评论 -
tlc2543 多通道选择 错误
我用TLC2543多通道AD测量时,数据出错,如A,B,C三个通道,单独测量正确分。但三个数据同时测量时候就出现错误,A的数据为B口数据,B口数据为C口数据,C口数据为A口数据,值都是正确的 这是怎么回事儿啊。调用语句: int tem,tem1,tem2;printk("tong dao 0 \n"); tem=read2543(0x00);转载 2012-11-09 14:21:21 · 233 阅读 · 0 评论 -
s3c2410_adc中断方式实现
s3c2410_adc中断方式实现 /** HLG442-S3C2410-ADC_DRV * /26/03/2008 AUTHOR "machuanlong"*/#include #include #include #include #include #include #include #include #include #i转载 2012-11-09 14:16:15 · 145 阅读 · 0 评论 -
S3C2410板集ADC的驱动查寻式
1.查寻式的#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #inclu转载 2012-11-09 14:15:34 · 150 阅读 · 0 评论 -
s3c2440的AD驱动(查询方式)
驱动:/* * s3c2440_adc.h * /#ifndef _S3C2440_ADC_H_#define _S3C2440_ADC_H_#include #define START_ADC(ch, prescale) S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(prescale) \转载 2012-11-09 14:13:37 · 128 阅读 · 0 评论 -
s3c2440的AD驱动(中断方式)
/* * s3c2440_adc.h */ #ifndef _S3C2440_ADC_H_#define _S3C2440_ADC_H_#include #define START_ADC(ch, prescale) S3C2410_ADCCON_PRSCEN | S3C2410_ADCCON_PRSCVL(prescale) \转载 2012-11-09 14:12:05 · 160 阅读 · 0 评论 -
signal_pending(current)用法
signal_pending(current)检查当前进程是否有信号处理,返回不为0表示有信号需要处理。返回 -ERESTARTSYS 表示信号函数处理完毕后重新执行信号函数前的某个系统调用。也就是说,如果信号函数前有发生系统调用,在调度信号处理函数之前,内核会检查系统调用的返回值,看看是不是因为这个信号而中断了系统调用.如果返回值-ERESTARTSYS,并且当前调度的信号具备-ER转载 2012-11-13 15:02:47 · 145 阅读 · 0 评论 -
自动加载驱动模块
假设你的设备驱动程序为:yourdrivername.ko 1 cp yourdrivername.ko /lib/modules/"version"/kernel/drivers/misc 其中,version为linux的版本,默认为:2.6.23.1-42.fc8 2 编辑/lib/modules/"version"/modules.dep,设置驱动程序之间的关转载 2012-12-19 22:42:09 · 170 阅读 · 0 评论 -
嵌入式Linux多通道数据采集方案
使用英利工控主板进行简单的扩展,可以构成一个多通道AD数据采集方案。这一方案的原理是通过英利工控主板的精简ISA总线扩展一片TLC2543,,即可以实现8路模拟量输入。其中输入量程0-5V,AD转换精度12bit,AD转换速度100Ksps。 硬件部分 该方案的主要硬件构成如下: 其中TLC2543通过4线制SPI接口与英利工控主板连接转载 2012-12-19 14:27:39 · 299 阅读 · 0 评论 -
ARM-Linux驱动--ADC驱动(中断方式)
硬件平台:FL2440内核版本:2.6.28主机平台:Ubuntu 11.04内核版本:2.6.39原创作品,转载请标明出处:http://blog.csdn.net/yming0221/archive/2011/06/26/6568937.aspx 这个驱动写了好久,因为原来的Linux内核编译的时候将触摸屏驱动编译进内核了,而触摸屏驱动里的ADC中断在注册的时候类型选择转载 2012-12-14 20:25:30 · 160 阅读 · 0 评论 -
AT91RM9200管理PA,PB,PC,PD四个PIO
AT91RM9200管理PA,PB,PC,PD四个PIO,每个PIO都可以被设置工作在GPIO或者外设I/O状态下,但是要注意,要使能某个引脚的GPIO功能时,不能和该引脚的外设I/O功能发生冲突,只能使其工作在一个特定的状态下。(PD只有在256脚的BGA封装中才有)1。配置PIO工作在GPIO模式 以PB0为例,如果要使其工作在GPIO模式,则首先要使能PIO控制器,设置:转载 2012-12-23 18:35:59 · 216 阅读 · 0 评论 -
信号量学习笔记
对于linux的程序员来说,信号量是一个不能回避的问题。下面我简要地介绍下信号量在不同状态下的使用。一,内核态l 就是写驱动程序时遇到的信号量。1. 定义信号量struct semaphore sem;2. 初始化信号量void sema_init(struct semaphore *sem,int val); val转载 2012-11-23 11:57:07 · 137 阅读 · 0 评论 -
Linux进程间通信之信号量
Linux进程间通信包括管道、消息队列、System V等等,其中System V包括三种:信号量、消息队列、共享内存,这里只简单介绍信号量机制。在Linux编程中,要运用信号量实现互斥操作,用户空间需要调用几个系统调用,如下是一个用户空间例子。#include #include #include #include #define SEMKEY 1234L#def转载 2012-11-23 11:56:13 · 158 阅读 · 0 评论 -
进程上下文与中断上下文
上下文context:上下文简单说来就是一个环境,相对于进程而言,就是进程执行时的环境。具体来说就是各个变量和数据,包括所有的寄存器变量、进程打开的文件、内存信息等。 一个进程的上下文可以分为三个部分:用户级上下文、寄存器上下文以及系统级上下文。 用户级上下文: 正文、数据、用户堆栈以及共享存储区; 寄存器上下文: 通用寄存器、程序寄存器(IP)、处转载 2012-11-16 14:24:40 · 149 阅读 · 0 评论 -
异步通知fasync
linux设备驱动归纳总结(三):7.异步通知fasyncxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx异步通知fasync是应用于系统调用signal和sigaction函数,下面我会使用signal函数。简单的说,signal函数就是让一个信转载 2012-11-14 21:31:53 · 145 阅读 · 0 评论 -
at91sam9260之LED驱动程序
/*******************************************/#include #include #include #include #include #include #include #include #include #include #include #include #include #include转载 2012-11-09 14:03:28 · 181 阅读 · 0 评论 -
Linux设备模型组件-类设备-设备类及subsystem
Linux设备模型 一、sysfs文件系统:sysfs文件系统是Linux2.6内核引入的,它被看成是与proc、devfs和devpty等同类别的文件系统,sysfs文件系统也是一个虚拟文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似;sysfs文件系统把链接在系统上的所有设备和总线组织成一个分级的文件系统,它们可以由用户空间存取,转载 2012-11-04 22:09:20 · 194 阅读 · 0 评论 -
文件描述符和文件指针的区别
文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。 文件指针:C语言中使用文件指针做为I/O的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括一个缓冲区和一个文件描述符。而转载 2012-11-04 21:50:54 · 133 阅读 · 0 评论 -
从文件到字符设备
在/dev下面有很多设备,其中也有大家广为使用的字符设备,呢里面的文件是如何与字符设备挂钩的呢~ 平时我们使用的open函数是如何动态加载字符设备的操作集的呢~下面就让我们慢慢剖析~ (以内核2.6.26为参考)一.首先是文件系统~ 需要动态解析文件路径名 像/dev/ts0 在文件系统里分为3个部分 1./(根文件目录) 2.dev(根文件目录下的dev目录转载 2012-11-04 20:47:16 · 149 阅读 · 0 评论 -
Linux设备模型--驱动
linux中每个设备驱动由一个struct device_driver描述:struct device_driver { const char *name; //设备驱动程序的名称 struct bus_type *bus; //该驱动所管理的设备挂接的总线类型转载 2012-11-03 22:44:51 · 131 阅读 · 0 评论 -
linux下bus、devices和platform的基础模型
一、kobject的定义:kobject是Linux2.6引入的设备管理机制,在内核中由struct kobject结构表示,这个结构使所有设备在底层都具有统一的接口.kobject提供了基本的对象管理能力,是构成Linux2.6设备模型的核心结构,它与sysfs文件系统紧密联系,每个在内核中注册kobject对象都对应与sysfs文件系统中的一个目录;kobject--->sysfs.dir转载 2012-11-04 10:53:03 · 371 阅读 · 1 评论 -
container_of宏深究
转自:http://blog.csdn.net/chn89/article/details/7085454 在Linux内核编程中广泛使用了container_of宏,有必要对该宏的使用及实现做一个详细的分析。1,作用原型container_of(ptr,type,member)。ptr是指向类型为type的结构体中member元素的指针,该宏最终返回类型为type的结构体的指转载 2012-11-01 15:10:42 · 157 阅读 · 0 评论 -
bsp是什么?
BSP板级支持包(board support package), 是介于主板硬件和操作系统中驱动层程序之间的一层,一般认为它属于操作系统一部分,主要是实现对操作系统的支持,为上层的驱动程序提供访问硬件设备寄存器 的函数包,使之能够更好的运行与硬件主板。在嵌入式体统软件的组成中,就有BSP。BSP是相对于操作系统而言的,不同的操作系统对应于不同定义形式的 BSP,例如VxWorks的BSP和Linu转载 2012-10-18 19:03:54 · 326 阅读 · 0 评论 -
什么是SPI的bitbang / bit bang / bit-bang / bitbanging
转自:http://hi.baidu.com/serial_story/item/47cc07d68d35e6cd1b72b41d在了解了基本的SPI之后,在Linux内核源码里面,发现关于SPI来说,有个叫做bitbang的东西,所以有点迷惑,想搞清楚bitbang是啥意思。找了点资料,大概看明白了:首先,对于多数情况来说,我们所用的SPI,都是有对应的SPI的控制器的,其负责和转载 2012-10-16 22:03:20 · 168 阅读 · 0 评论 -
个人对kobject的一点研究
在LINUX中最让人不解的大概就是/sys下面的内容了下面首先让我们来创建一个简单的platform设备,并从这个设备的视角进行深入,在此篇文章的深入过程中,我们只看kobeject的模型我所使用的内核版本号为2.6.26,操作系统的内核版本号为2.6.27-7,暂未发现2.6.27-7与2.6.26的重大不同首先写一个简单的模块#include #include转载 2012-11-04 22:28:51 · 113 阅读 · 0 评论 -
2410自带ad
2410自带了8个ad通道,10bit,500ksps。在网上查了资料,很少有人用它做ad转换的,原因是精度不高。不过对于一些要求不是很高的地方,还是值得一用。在/kernel/drivers/char中已经有了ad不完整的驱动,基本框架搭好了,只要加上文件系统那部分就可以直接使用了。使用时一定要在Vref上加上电压,否则ad就不工作了。现在就把驱动和应用程序贴出来,供大家参考学习。应用程转载 2012-11-09 13:47:31 · 145 阅读 · 0 评论 -
Linux内核list_head学习(二)
上一篇文章讨论了list_head 结构的基本结构和实现原理,本文主要介绍一下实例代码。自己如果想在应用程序中使用list_head 的相应操作(当然应该没人使用了,C++ STL提供了list 用起来貌似更方便), 在应用程序中需要包含自己的 "list.h" 头文件:/*注:这个list.h 是为了配合示例程序而建的,内容来自:linux/include/linux/list转载 2012-11-07 13:48:27 · 167 阅读 · 0 评论 -
Linux字符驱动中动态分配设备号与动态生成设备节点
在编写Linux内核驱动程序的时候,如果不动态生成设备号的话,需要自己手动分配设备号,有可能你分配的设备号会与已有设备号相同而产生冲突。因此推荐自动分配设备号。使用下面的函数:int alloc_chrdev_region(dev_t *dev, unsigned baseminor, unsigned count, const char *name)该函数需要传递给它指定的第一个次转载 2012-11-07 10:56:35 · 108 阅读 · 0 评论 -
Linux驱动开发基础代码
1.驱动代码:包括字符设备定义初始化、信号量、轮询操作、等待队列、异步信号通知、定时器驱动的编写方法。//fifo.c//先进先出队列#include #include #include #include #include #include #include #include #include #include #include #inclu转载 2012-11-08 10:24:13 · 132 阅读 · 0 评论 -
Linux PCI 设备驱动基本框架(二)
针对相应设备定义描述该PCI设备的数据结构:复制代码struct device_private{ /*注册字符驱动和发现PCI设备的时候使用*/ struct pci_dev *my_pdev;// struct cdev my_cdev;// dev_t my_dev; atomic_t created;转载 2012-11-07 15:06:58 · 161 阅读 · 0 评论 -
Linux PCI 设备驱动基本框架(一)
Linux将所有外部设备看成是一类特殊文件,称之为“设备文件”,如果说系统调用是Linux内核和应用程序之间的接口,那么设备驱动程序则可以看成是 Linux内核与外部设备之间的接口。设备驱动程序向应用程序屏蔽了硬件在实现上的细节,使得应用程序可以像操作普通文件一样来操作外部设备。1. 字符设备和块设备Linux抽象了对硬件的处理,所有的硬件设备都可以像普通文件一样来看待:它们可以使转载 2012-11-07 14:59:49 · 127 阅读 · 0 评论 -
异步IO
结合阻塞与非阻塞访问、poll 函数可以较好地解决设备的读写,但是如果有了异步通知就更方便了。异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上“中断”地概念,比较准确的称谓是:信号驱动(SIGIO)的异步 I/O。可以使用signal()函数来设置对应的信号的处理函数。函数原型是:void (*signal(int signo,v转载 2012-11-07 11:09:06 · 120 阅读 · 0 评论 -
死锁
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象。死锁要产生必须具备四个必要条件:1. 互斥条件 2. 请求和保持条件 3.不可剥夺条件 4. 环路等待条件。由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象死锁。一下举一个Linux环境下产生死锁的程序(首先是驱动部分):转载 2012-11-07 10:22:43 · 139 阅读 · 0 评论 -
linux字符设备驱动一般模板
[cpp] view plaincopyprint?#include //头文件有很多,可以根据具体的情况添加删除,这里给一个例子。 #include #include #include #include #include #include #include #include #include #include #include #转载 2012-11-06 12:31:06 · 130 阅读 · 0 评论 -
GPIO 模拟SPI驱动
GPIO模拟SPI驱动的关键点:每次传送8bit的时候都要先拉低时钟,本次传送结束后拉高时钟下面是source code分析:#define APB_BASEADDR 0x10000000#define GPIO_BASEADDR APB_BASEADDR + 0x070000#define ROBO_SPI_BASEADDR(id) (GPIO_BASEADDR + (转载 2012-09-22 14:26:24 · 182 阅读 · 0 评论