Linux Device Driver
文章平均质量分 97
dndxhej
这个作者很懒,什么都没留下…
展开
-
S3C2440:第一个char device driver:RTC
刚刚开始学习驱动,首先接触了字符设备驱动。Hello World就直接pass了。这个RTC驱动很简单,没有像linux附带中的S3CXX 系列有platform分层次的驱动程序。code如下:/*************************************NAME:Baikal_rtc.cCOPYRIGHT:Baikal:dndxhej@sina.com.cn*************************************/#include #include原创 2010-11-24 23:55:00 · 2051 阅读 · 0 评论 -
linux文件系统的系统分析--(十一)sysfs和设备模型--Bus
在分析设备模型的bus之前,我们看一下初始化的过程,很有意思: start_kernel-->rest_init-->kernel_init-->do_basic_setup 在do_basic_setup中有个usermodehelper_init有意思,凭感觉,这个函数与kobject_uevent有联系,kobject_uevent做什么的,就是内核空间来通知用户空间原创 2012-04-08 21:45:30 · 2435 阅读 · 0 评论 -
linux文件系统的系统分析--(十)sysfs和设备模型--kobject、kset和ktype
前面分析了这么多,是因为设备模型和文件系统的联系很紧密,了解sysfs是为了更好的理解设备模型。 在分析sysfs的时候,我们也看到了sysfs_dirent与kobject的紧密联系。这一次我们分析下kobject kest和ktype。在vfs层,sysfs的目录和属性文件都有对应的inode和dentry;而在sysfs中,不管目录还是文件,都用统一的sysfs_diren原创 2012-04-08 19:08:57 · 2926 阅读 · 0 评论 -
linux设备驱动--异步通知
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 异步通知意味着设备可以通知应用程序自身可被访问,实现了异步IO。 在ldd3中给出了设备驱动实现异步信号的详细操作顺序:1.当发出F_SETOWN,什么都没发生,除了一个值被赋值给filp->f_owner.2.当原创 2012-03-21 21:56:21 · 1043 阅读 · 0 评论 -
linux文件系统的系统分析--(十二)vfs层的三个hashtable
在vfs_caches_init中有三个重要的hashtable:mount_hashtabledentry_hashtable inode_hashtableHashtable有什么作用?主要的查找的效率很高,vfs层用这三个就是为了提高查找效率。另外一个,inode和dentry是内存中的数据,而数据的来源是硬盘,如果我们获得了inode和dentry数据,加到hashtable中,方原创 2012-04-10 21:01:54 · 4518 阅读 · 0 评论 -
linux文件系统的系统分析--(十三)sysfs和设备模型--Device
分析完了bus,接下来分析device: 同样在driver_init-->devices_initint __init devices_init(void){ devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL); if (!devices_kset) return -ENO原创 2012-04-11 20:32:09 · 2459 阅读 · 0 评论 -
linux文件系统的系统分析--(十四)sysfs和设备模型--Driver
看完了device看driver,给出device_driver的结构体:struct device_driver { const char *name; struct bus_type *bus; struct module *owner; const char *mod_name; /* used for built-in modules */ bool suppre原创 2012-04-11 21:26:02 · 1797 阅读 · 0 评论 -
linux文件系统的系统分析--(十五)sysfs和设备模型--Class
看完了bus device和driver,终于到了设备模型上层架构的最后一个单元:class.class的初始化同样是在driver_init下: driver_init-->classes_initint __init classes_init(void){ class_kset = kset_create_and_add("class", NULL, NULL); if原创 2012-04-14 23:22:25 · 2057 阅读 · 0 评论 -
linux文件系统的系统分析--(十七)总结
从文件系统写到设备模型,写的很舒畅,写的过程中自己重新做了整理思考,很有收获. 那我之所以将文件系统和设备模型放在一起写,因为linux的哲学就是一切都是文件,所以文件系统和设备模型是分不开的,单单理解设备模型还是不充分的,理解了文件系统后,再看设备模型就会有不一样的感受. 王阳明说"知行合一",做了这么多的理论上的分析后,就需要找块板子来实践,验证和加原创 2012-04-15 22:30:49 · 1677 阅读 · 0 评论 -
linux文件系统的系统分析--(十六)sysfs和设备模型--从platform和rtc来感受设备模型
分析文件系统后,再分析设备模型,从而自然的理解了sysfs和设备模型的关系.既然linux2.6引入了设备模型和sysfs,那肯定是比之前更为先进的.下面要分析下内核中如何利用设备模型去管理设备的,在内核的driver目录下有好多子目录,比如iic spi pci input usb这些子系统的框架,这些框架都是在设备模型的模型之上再去抽象的.我们仅以platform这种虚拟的总线类型和rtc这种原创 2012-04-15 22:16:05 · 2336 阅读 · 0 评论 -
linux驱动实践(四)--linux下读写寄存器
arm裸机下读写寄存器很容易,各个寄存器和内存的地址是单一地址空间,他们是用相同的指令进行读写操作的.而在linux下就要复杂很多,因为linux支持多个体系架构的CPU。比如arm和x86就不一样,具体的差别我暂时也说不上来,这个涉及到CPU体系的设计。目前我只关心:linux为了支持多个硬件体系,在IO访问上做了自己的接口。可以通过IO内存和IO端口这两种方式进行IO访问。在LED的例子上给出原创 2012-12-23 23:22:01 · 21838 阅读 · 0 评论 -
linux驱动实践(三)--不大一般的LED驱动
看了这么多内核代码,终于要自己开始做驱动了.按照由易到难,由浅入深的顺序,就从LED开始. LED驱动可以说是hello world之后最简单的驱动模块了.如果自己写一个LED驱动那是很简单的,其实用linux内核中的leds子系统来做也是比较简单的,内核中的leds子系统是将led抽象成platform_device,并有leds_class.这样,在/sys/class/le原创 2012-12-18 17:33:54 · 12799 阅读 · 0 评论 -
linux设备驱动--非阻塞IO与select,poll调用 (续2)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 在续1中了解中bitmap在select的用法后,下面就开始分析select Select系统调用的调用过程: Sys_select-->core_sys_select-->do_select-->f_op->原创 2012-03-19 20:35:44 · 1388 阅读 · 0 评论 -
linux设备驱动--非阻塞IO与select,poll调用 (续1)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}--> 在《linux设备驱动--非阻塞IO与select,poll调用》中给出了驱动中poll函数的一般写法,很简单明了。但是为什么这么写,还是要稍微追究一下的。<!--@page {margin:2cm}p {margin原创 2012-03-19 20:22:56 · 1418 阅读 · 0 评论 -
利用linux中iic子系统做IIC驱动
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->利用linux中IIC设备子系统移植IIC设备驱动背景描述IIC总线在嵌入式系统中应用十分广泛,常见的有eeprom,rtc。一般的处理器会包含IIC的控制器,用来完成IIC时序的控制;另外一方面,由于IIC的时序简单原创 2012-01-02 19:40:08 · 4350 阅读 · 0 评论 -
linux设备驱动--并发与竞态之原子操作
原子操作指的是在执行过程中不会被别的代码路径所中断的操作。 linux下面有两类原子操作,一类是整形原子操作,一类是位原子操作。 原子操作目前仅仅做个测试验证学习,至于原子操作在哪些场合适合用到,还需要今后更多的驱动以及内核代码的fuck。 整形原子操作的函数说明:void atomic_set(atomic_t *v, int i);atom原创 2012-03-10 00:15:03 · 2280 阅读 · 0 评论 -
linux设备驱动--并发与竞态之自旋锁
自旋锁(spin lock)是一种典型的对临界资源进行互斥访问的手段。与信号量不同,自旋锁可在不能休眠的代码中使用,比如中断处理例程。(自旋锁api的一些衍生都是与中断相关的)在正确使用的情况下,自旋锁通常可以提供比信号量更高的性能。 自旋锁相关的主要操作如下:This initialization may be done at compile time as follo原创 2012-03-10 20:04:07 · 1469 阅读 · 0 评论 -
linux设备驱动--并发与竞态之信号量
信号量(semaphore)是用于保护临界区的一种常用手段。与自旋锁相同,只有得到信号量的进程才能执行临界区代码。但不同的是,当获取不到信号量时,进程不会“自旋”而是进入休眠等待状态。 To use semaphores,kernel code must include . 信号量的初始化: 直接创建信号量: void原创 2012-03-10 23:58:57 · 1100 阅读 · 0 评论 -
linux设备驱动--阻塞IO
阻塞与非阻塞IO与进程的调度密切相关,但是深入的进程调度的算法还不到时间去研究,因为个人的方针是先以设备模型和文件系统为突破口,循序渐进。 这个并不妨碍目前对设备驱动中的阻塞与非阻塞IO的理解。 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足。原创 2012-03-12 23:06:28 · 2110 阅读 · 0 评论 -
linux的软中断
本来没想到写这个的,但在研究linux的动态定时器时,发现动态定时器是用到软中断机制的,所以对软中断做一个浅显的了解: 在分析过程中,愈加的觉得kernel是一个整体,想单单搞懂驱动是有难度的,因为kernel是个整体。你要懂驱动,就要对驱动模型,就要对文件系统、内存管理和进程调度等等有一定了解。 下面来分析soft irq:在kernel/softirq.c中:原创 2012-03-28 23:07:14 · 3140 阅读 · 0 评论 -
linux的动态定时器--时间轮
定时器—有时也称为动态定时器或内核定时器—是管理内核时间的基础。定时器是一种软件功能,即允许在将来的某个时刻,函数在给定的时间间隔用完时被调用。注意的是定时器并不会周期运行,它在超时后就自行销毁,这也是定时器被称为动态定时器的一个原因。动态定时器不断地创建和销毁,而且它的运行次数也不受限制。 定时器在内核代码中属于一个基础组件。要想完全弄清楚linux2.6中内核定时器的实现,得......原创 2012-03-29 00:33:27 · 8095 阅读 · 0 评论 -
linux设备驱动下的tasklet
在设备驱动的中断处理中经常会用到tasklet,在前面稍微看了下linux的软中断后,tasklet就很容易理解了。Tasklet也要用到软中断,而tasklet的用法和定时器的用法很相似。 同样的在main.c中, start_kernel-->softirq_init 先给出tasklet的结构体定义:str原创 2012-03-29 18:47:30 · 1557 阅读 · 0 评论 -
linux设备驱动下的工作队列(workqueue)
从表面和使用来看,工作队列类似与tasklet,它们都允许内核代码请求某个函数在将来的时间被调用。但实际上它们有一些非常重要的区别:1、 tasklet在软件中断上下文中运行,因此所有的tasklet代码都必须是原子的。而工作队列函数在一个特殊内核进程的上下文总运行,所以具有更好的灵活性。更主要的是工作队列函数可以休眠。2、 tasklet始终运行在被初始提交的同一处理器上原创 2012-03-29 18:50:19 · 3561 阅读 · 0 评论 -
linux设备驱动--非阻塞IO与select,poll调用
在linux应用编程中,经常要用到select和poll调用。select和poll的功能本质是一样的,都允许进程决定是否可以对一个或多个打开的文件做非阻塞的读或写。 举几个工作中用到的select或poll例子:1、编解码中,监听几个编解码通道的;2、对于主CPU,监听挂载的几个dsp;3、socket编程等等。 对于驱动程序而言,上面的系统调用通过驱动程序原创 2012-03-13 23:26:32 · 2241 阅读 · 0 评论 -
linux设备驱动--阻塞IO(续)
<!--@page {margin:2cm}p {margin-bottom:0.21cm}-->在《linux设备驱动--阻塞IO》中对阻塞IO的实现做了一个模板式的概述,也给出了内核中等待队列的系列函数接口的使用。但是阻塞IO到底是如何实现的,总觉得还有层窗户纸没戳破,这个让我有点不爽。 于是再多花点时间戳个小窟窿看看,但是仅仅原创 2012-03-16 22:42:41 · 1498 阅读 · 0 评论 -
linux驱动实践(五)--linux下的按键驱动之查询方式
虽然好几个月之前就对linux下的阻塞,非阻塞,select poll的实现,工作队列,tasklet等等做了较为深入的分析,但是在遇到实际的硬件驱动中,才真正去思考怎么将这些用到实际中,构建一个稳定高效的驱动。 板子上有四个按键,linux内核中有input子系统来很好的完成这个事情。先按照自己的思路一步步来,最后看下人家input子系统是如何实现的,肯定有不少值得借鉴的。原创 2013-01-01 22:26:37 · 6174 阅读 · 0 评论