Linux设备驱动 (基于Linux2.6.xx内核).

Slides:



Advertisements
Similar presentations
公务员制度若干问题分析. 一、职业选择?身份选择? 2 。职业选择?身份选择? 公共职位世袭现象普遍存在的原因,除了 缺乏政治权力约束机制外,还包括政治道 德和官僚伦理的全面崩溃。 据中国大陆媒体披露,河南省固始县在 2008 年全县选拔正科级和县局级干部过程 中,最后任命的 12 名乡长,基本都是当地.
Advertisements

小一家長會 訓育訊息 德性培育組 余家濂主任
C语言程序设计 主讲教师 :张群燕 电话:
校园信息管理系统 河北科技大学网络中心 2000/4/10.
“八皇后”问题 崔萌萌 吕金华.
四資二甲 第三週作業 物件導向程式設計.
第一章 C语言概述 计算机公共教学部.
香港普通話研習社科技創意小學 周順強老師.
徵收苗栗市福全段147、1588及文心段10、11地號等4筆土地之
项目五——校园一卡通程序功能模块化设计 5-1项目显示查询和退出函数设计.
讲 义 大家好!根据局领导的指示,在局会计科和各业务科室的安排下,我给各位简要介绍支付中心的工作职能和集中支付的业务流程。这样使我们之间沟通更融洽,便于我们为预算单位提供更优质的服务。 下面我主要从三方面介绍集中支付业务,一是网上支付系统,二是集中支付业务流程及规定等,
第三章 鏈結串列 Linked List.
编译原理上机实习
中国人民公安大学经费管理办法(试行) 第一章总则 第四条:“一支笔” “一支笔”--仅指单位主要负责人。负责对本 单位的经费进行审核审批。
雷 霆 战 机 By—谷恩轩&余万全.
心理的力量 --兼谈教师心理压力的调适
第三章 控制结构.
Linux Further.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
複習 struct score_Type{ int chinese,english; }; struct my_Type{
單向鏈結串列 Singly Linked Lists.
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
第二章 C# 基础知识.
补充内容 结构体 概述 定义结构体类型和定义结构体变量 结构体变量的引用 结构体变量的初始化 指针与结构体 用typedef定义类型的别名.
第七章. 文件系统 (lab5).
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第六章 继承性和派生类 胡昊 南京大学计算机系软件所.
C语言程序设计基础 第9章 结构 刘新国.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
程序设计期末复习 黎金宁
CH.8 硬體管理.
第十章 C高级程序应用—链表* 10.1链表的基本概念 10.2单向链表 10.3双向链表 10.4应用举例.
Ch9 Communicating with Hardware
如何生成设备节点 广州创龙电子科技有限公司
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
ADFGVX 张天豪 陆纪圆.
第三章 C# 基础知识.
第1章 概述 本章要点: C语言程序结构和特点 C语言程序的基本符号与关键字 C语言程序的编辑及运行 学习方法建议:
第4讲 C++程序控制结构(二) 4.1 循环结构 4.2 转向控制 4.3 综合案例分析.
辅导课程八.
7.1 广义表的概念 广义表是n(n≥0)个数据元素组成的序列,其中每个数据元素或是单个数据元素(简称原子),或仍然是一个广义表 。
编译原理实践 11.语义分析与代码生成.
第五章 递归与广义表 递归的概念 递归过程与递归工作栈 递归与回溯 广义表.
OOP6 結構Struct 黃兆武.
目录 9.1 结构体类型 9.2 共用体类型 9.3 枚举类型 9.4 类型声明符typedef 1.
第 3 章、組合語言 作者:陳鍾誠 旗標出版社.
第11章 位运算 为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。C语言是为研制系统软件而设计的,所以她提供了实现将标志状态从标志字节中分离出来的位运算功能。 所谓位运算是指,按二进制位进行的运算。 11.1 数值在计算机中的表示 11.2.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第三章 数据抽象.
微信商城系统操作说明 色卡会智能门店.
第5章 文本与字体 2019/4/25 面向对象与可视化 程序设计 --Visual C++ 编程 主讲教师: 唐 龙教授 (计算机科学与技术系) 黄维通博士 (计算机与信息管理中心) 清 华 大 学 2001年2月 2019/4/25 Huang Weitong.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
LED驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
第二章 类型、对象、运算符和表达式.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
实验二:添加Linux系统调用及熟悉常见系统调用
大綱 一.受試者之禮券/禮品所得稅規範 二.範例介紹 三.自主管理 四.財務室提醒.
第2章 Java语言基础.
判斷(選擇性敘述) if if else else if 條件運算子.
C++程序语言设计 Chapter 14: Templates.
第三章 流程控制 程序的运行流程 选择结构语句 循环结构语句 主讲:李祥 时间:2015年10月.
编译原理实践 7.PL/0的词法分析程序构造.
第二章 Java基本语法 讲师:复凡.
函式庫補充資料 1.
安排座位.
Presentation transcript:

Linux设备驱动 (基于Linux2.6.xx内核)

总线、设备和驱动程序 总线是处理器与一个或多个设备之间的通 道。在设备模型中,所有的设备都是通过总线 相连的。设备将被挂在总线上。在注册此种总 线类型的驱动程序后,它将用于管理挂在此类 型总线上的设备。 以Luxun9项目中所用到的设备及其驱动程 序为例。总体框图如下所示:

总线 以Luxun9项目所用到的总线为例,它所使用的是虚 拟平台总线,代码如下所示: struct bus_type platform_bus_type = { .name = "platform", .match = platform_match, .suspend = platform_suspend, .resume = platform_resume, }; 只有非常少的bus_type成员变量需要初始化,其他 的大多数都由设备模型核心所控制。

对于新的总线,我们要调用bus_register()函数进行注册。 以Luxun9项目所用到的总线为例,代码如下所示: ret = bus_register(&platform_bus_type); if(ret) { return ret //失败 } 如果调用成功,新的总线子系统将加入到系统中, 可以在/sys/bus目录下看到它所对应的目录是 /sys/bus/platform 。然后,我们可以向这个总 线添加设备。

设备 例如:在luxun9项目中所用到的Linux2.6.14内核中 常用的注册和注销函数是: int device_register(struct device *dev); void device_unregister(struct device *dev); 实际上,一个实际的总线是一个设备,也必须被单 独注册。当然,我们也可以注册虚拟总线。 例如:在luxun9项目中所用到的Linux2.6.14内核中 注册了这样的一个虚拟总线,代码如下所示:

struct device platform_bus = { .bus_id = "platform", }; device_register(&platform_bus); 完成这个调用后,我们可以在/sys/devices目录 中看到它(/sys/devices/platform),任何添加 到该总线的设备都会在/sys/devices/platform/ 显示。

设备结构的嵌入 device结构包含了设备模型核心用来模拟系统的信 息。然而,大多数子系统记录了它们所拥有的设备的所 道。

例如:在luxun9项目中所用到的Linux2.6.14内核中 有这样一个结构体,代码如下所示: struct platform_device { const char * name; u32 id; struct device dev; u32 num_resources; struct resource * resource; }; 用它定义了一个USB设备结构体,代码如下所示:

static struct platform_device s1r72xxx_device = { .name = "s1r72v17", .id = -1, .dev = { .platform_data = (void*)NULL, .dma_mask = &s1r72xxx_dma_mask, .coherent_dma_mask = 0xffffffff, }, .num_resources = ARRAY_SIZE(s1r72xxx_resources), .resource = s1r72xxx_resources, };

然后通过下面的代码注册设备,将设备挂在虚拟总 线platform_bus上,总线类型为platform_bus_type。 platform_add_devices(luxun_devices, ARRAY_SIZE(luxun_devices)); luxun_devices是一个platform_device类型的指针 数组,定义如下所示: static struct platform_device *luxun_devices[] __initdata = { &s1r72xxx_device, &keybd_device, &d13733fb_device };

platform_add_devices()函数原型是: int platform_add_devices(struct platform_device **devs, int num) { int i, ret = 0; for (i = 0; i < num; i++) { ret = platform_device_register(devs[i]); if (ret) { while (--i >= 0) platform_device_unregister(devs[i]); break; } return ret;

设备驱动程序 以luxun9 USB Controller Driver 为例,其中定 义了这样一个驱动程序结构体,代码如下所示: static struct device_driver s1r72xxx_usbcd_driver ={ .name = driver_name, //"s1r72v17" .bus = &platform_bus_type, .probe = s1r72xxx_usbc_probe, .remove = __exit_p(s1r72xxx_usbc_remove), .shutdown= s1r72xxx_usbc_shutdown, .suspend = s1r72xxx_usbc_suspend, .resume = s1r72xxx_usbc_resume, };

驱动程序注册 驱动程序的注册注销函数如下所示: int driver_register(struct device_driver *drv); void driver_unregister(struct device_driver *drv); 在luxun9 USB Controller Driver 中通过下面的代码注 册了一个USB驱动程序: iRetval = driver_register(&s1r72xxx_usbcd_driver);

driver_register()函数原型代码如下所示: int driver_register(struct device_driver * drv) { klist_init(&drv->klist_devices, klist_devices_get, klist_devices_put); init_completion(&drv->unloaded); return bus_add_driver(drv); } 前面两个函数完成一些锁的初始化工作,最后的 bus_add_driver()函数用于向总线上添加驱动程 序。

在bus_add_driver()函数中会调用driver_attach() 函数,它的原型如下面代码所示: void driver_attach(struct device_driver * drv) { bus_for_each_dev(drv->bus, NULL, drv, __driver_attach); } 该函数调用bus_for_each_dev函数遍历platform_bus_type 类型总线上的所有设备。NULL表示从与该总线类型相关的 设备链表的头开始搜索设备。将每一个设备结构体dev和驱 动程序结构体drv作为参数传递给__driver_attach()函 数,在这个函数中,将调用platform_bus_type总线类型中 的匹配函数match(),在这个函数只是比较设备和驱动程序 的名字。如果匹配成功,则会调用驱动程序结构体中注册 的probe()函数。