
Linux设备驱动程序第三版学习笔记
小雷总
这个作者很懒,什么都没留下…
展开
-
Linux设备驱动程序第三版学习(1)-字符设备驱动程序源码分析
一、insmod模块时调用module_init(scull_init_module),就来看一下这个函数: int scull_init_module(void)二、int scull_init_module(void){ int result, i; //声明两个整形变量 result,i dev_t dev = 0; //声明一个dev_t类型的对象dev,默认初始值是0//下面这段代码调用了alloc_chrdev_region方法动态生成设备编号给dev,设备的名称是"scull” ,并且抽取de原创 2010-10-20 23:44:00 · 3347 阅读 · 0 评论 -
Linux I2C驱动完全分析(一)
博主按:其实老早就想写这个I2C的了,期间有各种各样的事情给耽误了。借着五一放假的时间把这个写出来,供同志们参考。以后会花一些时间深入研究下内核,虽然以前对内核也有所了解,但是还不系统。I2C的硬件结构并不复杂,一个适配器加几个设备而已。Linux下驱动的体系结构看着挺复杂,实际也是比较简单的。在本文中我还是使用实际的例子,结合硬件和软件两个方面来介绍。希望能给初学的同志们一些帮助,另外抛砖引玉,希望高手能给一些指点。话不多说,开整!~本文用到的一些资源: 1. Source Insight软件原创 2011-04-30 16:38:00 · 40043 阅读 · 10 评论 -
Linux I2C驱动完全分析(二)
博主按:大热的天,刚刚负重从五道口走到石板房,大约4公里吧。终于让我找了一个咖啡屋休息一下,继续写这篇驱动分析。单身的生活就是这样无聊啊。 不发牢骚了,活出个样儿来给自己看!千难万险脚下踩,啥也难不倒咱!继续整!~3. I2C总线驱动代码分析 s3c2440的总线驱动代码在i2c-s3c2410.c中。照例先从init看起。static int __init i2c_adap_s3c_init(void){ return platform_driver_register(&s3c24xx_i2c原创 2011-05-01 18:17:00 · 19046 阅读 · 23 评论 -
S3C2410看门狗驱动分析
根据linux中总线、设备和驱动这个模型来看,所有的设备驱动都挂在总线上,并且驱动应该是和平台无关的。唯一和平台有关的一类驱动应该是芯片内部的各个控制器的驱动,例如芯片内部I2C控制器,芯片内部LCD控制器,芯片内部看门狗等等。如果是一个外部的LCD控制器的驱动程序,它的实现一定要和平台无关,这样针对不同的平台只要修改板级文件即可,而不需要修改驱动程序本身。从linux内核源代码中的S3c2410_wdt.c(位于drivers/watchdog中)可以看出,从不同的角度看,看门狗分别可以属于:平台设备、字原创 2011-02-23 18:14:00 · 4164 阅读 · 3 评论 -
Linux设备驱动的分层设计思想
原文链接:http://21cnbao.blog.51cto.com/109393/3362631.1 设备驱动核心层和例化在面向对象的程序设计中,可以为某一类相似的事物定义一个基类,而具体的事物可以继承这个基类中的函数。如果对于继承的这个事物而言,其某函数的实现与基类一致,那它就可以直接继承基类的函数;相反,它可以重载之。这种面向对象的设计思想极大地提高了代码的可重用能力,是对现实世界事物间关系的一种良好呈现。Linux内核完全由C语言和汇编语言写成,但是却频繁用到了面向对象的设计思想。在设备驱动方面,往转载 2011-02-23 15:52:00 · 2182 阅读 · 1 评论 -
v4l2驱动编写篇
博主按:不知道是哪位同志翻译的,莫名的感动啊。此文必转之!v4l2驱动编写篇一--介绍 原文网址:http://lwn.net/Articles/203924/笔者最近有机会写了一个摄像头的驱动,是“One laptop per child”项目的中摄像头专用的。这个驱动使用了为此目的而设计的内核API:the Video4Linux2 API。在写这个驱动的过程中,笔者发现了一个惊人的问题:这个API的文档工作做得并不是很好,而用户层的文档则写的,实际上,相当不错。为了补救现在的状况,LWN将在未来的内个转载 2011-03-01 18:11:00 · 6753 阅读 · 3 评论 -
Linux设备驱动程序第三版学习(11)- 分配内存
一、kmalloc函数内幕 kmalloc的使用已经比较熟悉了,它的函数原型是: 1: #include 2: void *kmalloc(size_t size, int flags);.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospa原创 2011-01-17 15:35:00 · 5076 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(12)- 与硬件通信
<br />继续往下学习第九章的内容。从这一章开始才接触到了一些实际的硬件设备,硬件是我的强项啊,呵呵。加油!<br /> <br />一、I/O端口和I/O内存<br /> 在学习这部分之前,需要先明确一个概念:side effect。明确这个概念有助于理解内存操作和IO寄存器操作的不同。LDD3中将这个词翻译成了“边际效应”,对此我持保留意见,至少我当时学习的时候就被这个词搞得一头雾水(我本身是搞硬件的,自认为对寄存器还是很了解的,这里完全被这个词搞晕,我勒个去以为是什么高级的东东)。LDD2中将此原创 2011-01-18 14:46:00 · 2315 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(10)- 时间、延迟及延缓操作
接下来学习第七章:时间、延迟及延缓操作。本章主要学习了内核代码如何对时间问题进行处理。 关于Linux时钟处理机制的详细内容,参考本博客转载的“Linux 时钟处理机制”一文【赵 健博 (zhaojianbo@ncic.ac.cn), 硕士, 中国科学院计算技术研究所】 一、时间。 内核通过定时器中断来跟踪时间流。定时器中断是硬件产生的,是周期性的。不同的硬件平台的周期不一样,例如x86 PC上默认的是1000次/秒。内核维护一个内部的计数器,这个计数器在系统引导时被初始化为0,每次中断发生时,计数器+1。原创 2011-01-16 10:26:00 · 1864 阅读 · 1 评论 -
Linux设备驱动程序第三版学习(9)- 高级字符驱动程序操作(续4) - llseek定位设备
第六章:高级字符驱动程序操作(续4)以下为第五部分:定位设备这部分相当简单,需要注意的是即使大多数设备进行定位操作没有意义,但是也不能步声明llseek操作,因为默认是允许定位的。而是应该在open中调用nonseekable_open,这样内核就不会让lseek调用成功。下面是scull驱动的main.c中的llseek实现。loff_t scull_llseek(struct file *filp, loff_t off, int whence){ struct scull原创 2011-01-12 15:30:00 · 2469 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(6)- 高级字符驱动程序操作(续1) - 进程休眠
第六章:高级字符驱动程序操作(续1)以下是第2部分:掌握如何使进程休眠(并唤醒)分为4个小的部分(都是通过分析源码的形式,必要时加以总结):1、进程休眠的细节2、进程唤醒的细节3、scullpipe中read的实现4、scullpipe中write的实现1、 进程休眠的细节 Linux内核中最简单的休眠方式就是称为wait_event的宏(以及它的几个变种),形式如下: wait_event(queue, condi原创 2011-01-10 14:46:00 · 2011 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(5)- 高级字符驱动程序操作 - ioctl
第六章:高级字符驱动程序操作这章有以下几个部分主要内容:1) 学习实现ioctl系统调用,它是用于设备控制的公共接口2) 掌握如何使进程休眠(并唤醒)3) poll/select4) 异步通知5) 定位设备6) 设备文件的访问控制以下为第1部分, ioctl的学习。定义(摘自百度百科): ioctl是设备驱动程序中对设备的I/O通道进行管理的函数。所谓对I/O通道进行管理,就 是对设备的一些特性进行控制,例如串口的传输波特率、马达的转速等等。他的调用个数原创 2011-01-10 14:24:00 · 2045 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(7)- 高级字符驱动程序操作(续2)- poll/select
第六章:高级字符驱动程序操作(续2)以下为第三部分:poll/select系统调用poll方法执行了两个任务:第一项任务:调用poll_wait方法向poll_table结构添加一个等待队列第二项任务:返回一个位掩码(mask),该位掩码秒数了哪个操作可以立即执行而不会被阻塞。对于位掩码,定义在asm-generic/poll.h中,为了以后方便查阅,记录如下:/* These are specified by iBCS2 */#define POLLIN 0x00原创 2011-01-12 14:44:00 · 1885 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(8)- 高级字符驱动程序操作(续3)- 异步通知
第六章:高级字符驱动程序操作(续3)以下为第四部分:异步通知使用poll轮询方式的时候,相当于应用程序在需要的时候询问设备“准备好了吗?”,如果有这样一种情况,一个进程在低优先级正在执行长的循环计算,但又需要“尽可能快”的处理输入数据,如果采用poll的方式,那么需要这个应用程序周期性的调用poll来检测数据,也就是周期性的询问设备“准备好了吗?” 显然这种情况下poll并不是最佳的方法。更好的方法应该是一旦设备准备好了就发出一个“我准备好了”的信号给应用程序,然后应用程序再去处理。这样显然更高效。原创 2011-01-12 14:47:00 · 2024 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(3)- 调试
开始书中第四章的学习:调试技术。主要有三种调试方式:打印、查询和监视。一、说说打印方式: 1)主要使用printk这个内核方法来进行。 2)printk方法可以附加日志级别:KERN_EMERG、KERN_ALERT、KERN_CRIT、KERN_ERR、KERN_WARNINT、KERN_NOTICE、KERN_INFO、KERN_DEBUG。 默认的级别在我现在的内核中(2.6.32)就是KERN_WARNING 3)开启和禁用printk的方法。可以采用如下代码原创 2011-01-02 15:43:00 · 2263 阅读 · 0 评论 -
Linux设备驱动程序第三版学习(4)- 并发和竟态
第五章学习:并发和竟态其实可以拿上“公共厕所”来做一个比喻,就是那种在大街上只有一个隔间的小型公厕。更容易理解并发、竟态和信号量。把“临界区”理解为“公共厕所”(临界区:在任意给定的时刻,代码只能被一个线程执行。/ 公共厕所:在任意给定的时刻,厕所只能被一个人使用。),“公共厕所”的来源是“并发”的(很多人可以一起去上厕所),假设A同学已经进去了,如果厕所什么标记都没有(没有信号量),那么B同学来的时候不知道里面有人就推门而入,这时候就尴尬了(错误发生了)。这个过程就是竟态(race conditi原创 2011-01-02 15:45:00 · 1505 阅读 · 1 评论 -
Linux设备驱动程序第三版学习(2)-字符设备驱动程序源码分析(续)
前段时间一直在搞GPS导航系统的应用软件,最近告一段落,继续捡起linux设备驱动,啃之!上次记录了模块初始化代码的学习,今次看看卸载模块的代码。void scull_cleanup_module(void){ int i; dev_t devno = MKDEV(scull_major, scull_minor); //这个见过!得到当前模块的设备号 if(scull_devices){ for(i = 0; i s原创 2010-12-24 18:41:00 · 1641 阅读 · 0 评论 -
Linux DM9000网卡驱动程序完全分析
说明1:本文分析基于内核源码版本为linux-2.6.31 说明2:本文在理解了linux中总线、设备和驱动模型的基础上加以分析代码天猫爆款 联想 ibm ThinkPad E320 129862C 代替55C 笔记本 包邮 虽然Linux驱动程序应该是和具体的硬件平台分离的,但是为了更好的理解DM9000的驱动程序,这里还是结合一下Mini2440开发板,这样也可以更好的体会如何原创 2011-02-26 16:11:00 · 44253 阅读 · 47 评论