科创园

科创园地,分享技术知识,为科技助力发展,贡献一己之力。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

文章分类 -  嵌入式linux驱动开发

摘要:在linux2.6内核驱动中,为设备实现一套中断处理机制提供了如下两个步骤:1.向内核注册中断处理;2.实现中断处理函数int request_irq(unsigned int irq,void (*handler)(int, void*, structpt_regs *),unsigned long flags,const char *devname,void *dev_id) //注册中断;返回0表示成功,或者返回一个错误码参数含义unsigned int irq 中断号void (*handler)(int,void *,struct pt_regs *) 中断处理函数u... 阅读全文

posted @ 2013-02-20 10:09 科创园 阅读(1105) 评论(0) 推荐(0)

摘要:为了适用要求越来越高的硬件设备需求,linux2.6内核提供了一种全新的内核设备模型。设备模型三元素:总线、设备、驱动;第一节:总线总线是处理器与设备之间的通道,所有的设备通过总线相连;总线由bus_type定义(位于<linux/device.h> 1 struct bus_type { 2 const char *name; 3 struct bus_attribute *bus_attrs; 4 struct device_attribute *dev_attrs; 5 struct driver_attribute *dr... 阅读全文

posted @ 2013-02-19 18:11 科创园 阅读(847) 评论(0) 推荐(0)

摘要:说明:关于代码中涉及的一些结构参考2.6内核;以及kobject原理参考http://www.cnblogs.com/myblesh/articles/2367613.htmlKobject实例代码解读View Code 1 #include <linux/device.h> 2 #include <linux/module.h> 3 #include <linux/kernel.h> 4 #include <linux/init.h> 5 #include <linux/string.h> 6 #include <linux/ 阅读全文

posted @ 2013-02-19 08:45 科创园 阅读(606) 评论(0) 推荐(0)

摘要:首先来分析一下触摸屏的原理:首先,它属于输入子系统。还记得我们上篇分析的关于linux输入子系统的架构吗???这里找来了另一张图片:小弟先敬上:好了,先来一段废话 触摸屏原理分析:(已知的朋友可绕道)原理:由横向电阻比和纵向电阻比组成。由nYPON、YMON、nXPON、XMON四个控制信号控制4个MOS管(S1-S4)的通断。(实质也是同鼠标一样获取坐标)S3C2440触摸屏控制器2种模式:X/Y位置分别转换模式X/Y位置自动转换模式工作流程:选择模式设置触摸屏接口到等待接口状态如果中断发生,激活转换模式获取坐标后,返回等待中断状态(INT_TC中断用于按下或弹起触摸屏)(INT_ADC用于 阅读全文

posted @ 2012-02-25 14:18 科创园 阅读(1784) 评论(0) 推荐(0)

摘要:输入子系统由驱动层、输入子系统核心、事件处理层三部分组成。一个输入事件,如鼠标移动、键盘按下等通过Driver->Inputcore->Event handler->userspace的顺序到达用户控件的应用程序。驱动层:将底层的硬件输入转化为统一事件形式,想输入核心(Input Core)汇报。输入子系统核心:承上启下。为驱动层提供输入设备注册与操作接口,如:input_register_device;通知事件处理层对事件进行处理;在/Proc下产生相应的设备信息事件处理层:主要是和用户空间交互。(Linux中在用户空间将所有的设备都当初文件来处理,由于在一般的驱动程序中都 阅读全文

posted @ 2012-02-25 12:08 科创园 阅读(23034) 评论(2) 推荐(2)

摘要:还记得上篇讲到的platform总线、设备、驱动的知识??这里我们先来看一段documentation/filesystems/sysfs.txt里关于sysfs文件系统的描述: sysfs is a ram-based filesystem initially based on ramfs.It provides a means to export kernel data structures,their attributes,and the linkages between them to userspace. sysfs 文件系统是基于ram文件系统的,这里注意:ramdisk 文件系. 阅读全文

posted @ 2012-02-25 11:53 科创园 阅读(7368) 评论(0) 推荐(3)

摘要:1.1 platform总线、设备与驱动在Linux 2.6的设备驱动模型中,关心总线、设备和驱动这3个实体,总线将设备和驱动绑定。在系统每注册一个设备的时候,会寻找与之匹配的驱动;相反的,在系统每 注册一个驱动的时候,会寻找与之匹配的设备,而匹配由总线完成。一个现实的Linux设备和驱动通常都需要挂接在一种总线上,对于本身依附于PCI、USB、I2C、SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SoC系统中集成的独立的外设控制器、挂接在SoC内存空间的外设等确不依附于此类总 线。基于这一背景,Linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platfor 阅读全文

posted @ 2012-02-25 11:09 科创园 阅读(1300) 评论(0) 推荐(0)

摘要:学习linux设备驱动程序,字符设备驱动是最基础的,在第一节简单字符设备中我们举了一个虚拟内存设备globalmem来说明字符设备驱动的基本框架。在linux设备驱动中,我们不是看程序的复杂(读内核源码也是不一定要全部读懂),而要掌握的是linux设备驱动的框架,而前面我们介绍的诸如linux中的多进程并发访问控制、阻塞访问与异步通知、中断处理等,这些知识是理解linux内核与驱动知识的一点小插曲,但又是我们不得不掌握的知识点,因为在linux设备驱动程序中,我们的驱动往往不会那么简单。说到这个基本框架,我们不得不背一些,因此,学习好linux设备驱动程序开发,我们要做的第一关:在理解了原理基 阅读全文

posted @ 2012-02-25 10:09 科创园 阅读(5690) 评论(0) 推荐(0)

摘要:异步通知的概念与作用异步通知的意思是:一旦设备就绪,则主动通知应用程序,这样应用程序根本就不需要查询设备状态,这一点非常类似于硬件上"中断"的概念,比较准确的称谓是"信号驱动的异步I/O"。Linux信号Linux系统中,异步通知使用信号来实现。信号也就是一种软件中断。信号的产生:kill raise alarm用户按下某些终端键;硬件异常;终止进程信号;软件异常。信号的处理:忽略该信号,但SIGSTOP SIGKILL不可忽略;捕捉该信号,并处理;执行默认操作。信号的接收捕捉信号,安装信号处理函数:void (*signal(int signum, v 阅读全文

posted @ 2012-02-24 22:09 科创园 阅读(652) 评论(0) 推荐(0)

摘要:阻塞与非阻塞I/O还记得上篇 我们讲到的是linux中并发控制访问的手段有哪些????原子、信号量、自旋锁、互斥体。这是为了保护临界区的资源,是多个进程对共享资源的并发访问的一种处理手段。但是,在驱动程序中,我们常常为了支持用户空间对设备的灵活访问,引入了阻塞与非阻塞I/O两种不同模式。阻塞操作是指在执行设备操作时若不能获得资源则挂起进程,直到满足可操作的条件后再进行操作。因为阻塞的进程会进入休眠状态,因此,必须确保有一个地方能够唤醒休眠的进程。唤醒进程的地方最大可能发生在中断里面,因为硬件资源获得的同时往往伴随着一个中断。注意:驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通 阅读全文

posted @ 2012-02-24 21:52 科创园 阅读(7572) 评论(0) 推荐(0)

摘要:首先,让我们来回顾一下在简单的linux字符设备驱动中,我们是通过file_operation的连接实现了应用程序访问内核的接口,在各个注册的函数接口中,我们并没有考虑一些比较复杂的情况,比如:当一个进程在打开文件进行修改时候,而另一个进程也在打开修改,同时可能有一个进程正在阅读,这时候就会发生竞争了。因此linux中必须提供了一种针对多个进程共享资源的控制。废话少说:直接提出解决的方法。。。。。1、中断屏蔽 CPU一般具有开启中断和屏蔽中断的功能,该功能可以保证正在执行的内核执行路径不会被中断处理程序所抢占,,防止竞态条件的发生。 使用方法: local_irq_disable();/... 阅读全文

posted @ 2012-02-24 21:42 科创园 阅读(380) 评论(0) 推荐(0)

摘要:struct file_operations{ struct module *owner; // 指向拥有该结构的模块的指针,避免正在操作时被卸载,一般为初始化为THIS_MODULES loff_t (*llseek) (struct file *, loff_t, int); // llseek用来修改文件当前的读写位置,返回新位置 // loff_t为一个"长偏移量"。当此函数指针为空,seek调用将会以不可预期的方式修改file结构中的位置计数器。 ssize_t (*read) (struct file *, char __user *, size_t, loff 阅读全文

posted @ 2012-02-23 15:28 科创园 阅读(1598) 评论(0) 推荐(0)

摘要:linux设备驱动分3类:字符设备驱动、块设备驱动、网络设备驱动。废话少说:直接贴图展示:1、字符设备结构体描述:cdev struct cdev{ struct kobject kobj;/*内嵌的kobject对象*/ strcut module *owner;/*所属模块*/ struct file_operations *ops;/*文件操作结构体*/ struct list_head list; dev_t dev;/*设备号,dev_t实质是一个32位整,12位为主设备号,20位为次设备号, 提取主次设备号的方法:MAJOR(d... 阅读全文

posted @ 2012-02-23 15:20 科创园 阅读(4371) 评论(2) 推荐(0)

摘要:入门学习linux设备驱动开发,首先要熟悉linux操作系统的启动流程以及linux内核组成,以及在linux下编程的命令(这部分内容可以参考linux基础篇),嵌入式linux系统由三个部分:bootloader,bzImage,文件系统。 从操作系统的角度来看,bootloader的最终目标是引导加载内核镜像,分为stage1,stage2,stage1完成基本硬件初始化、为stage2准备内存空间、复制stage2到内存空间、设置堆栈指针、跳转到stage2;在stage2中完成初始化本阶段用到的硬件设备、检测系统的内存映射、加载内核映像和根文件系统、设置内核启动参数、调用内核。 ... 阅读全文

posted @ 2012-02-23 14:24 科创园 阅读(1282) 评论(0) 推荐(0)