驱动开发 —— 高级驱动学习方法

回顾一下之前的字符设备驱动编程:

  1,实现入口函数 xxx_init()和卸载函数 xxx_exit()
  2,申请设备号 register_chrdev_region (与内核相关)
  3,注册字符设备驱动 cdev_alloc、cdev_init、 cdev_add (与内核相关)
  4,利用udev/mdev机制创建设备文件(节点) class_create, device_create (与内核相关)
  5,硬件部分初始化
    io资源映射 ioremap,内核提供gpio库函数 (与硬件相关)
    注册中断(与硬件相关)
    初始化等待队列 (与内核相关)
    初始化定时器 (与内核相关)
  6,构建 file_operation结构 (与内核相关)
  7,实现操作硬件方法 xxx_open,xxx_read,xxxx_write...(与硬件相关)

在我们为多个设备编写驱动时,会发现大部分流程是相同的,如上。其实内核中已经实现大部分通用的功能,例如1~4,6~7,我们只需要实现硬件的部分与差异化代码即可。通用的部分就是Linux内核中的驱动框架。

linux程序框架的概念

  1,内核引入程序框架思想:代码可重用,可维护,可伸缩
  2,通用功能 写一次 可重用性好
  3,差异功能 平台不同 可移植性好
  4,内核框架采用分层
  5,建立设备模型,它外在表现 平台设备驱动(总线,设备,驱动来实现的)
  6,面向对象编程方式

面向对象代码实现:

1     struct A{....}
2     struct B{
3         struct A obj;//结构体,对象
4     }

  B继承于A,B是A的子类

分层代码的实现:

    //1 定义结构体 抽象类
        struct mydriver{
            char *name;
            int irq;
            int addr;
            void (*func)();
            struct mydriver *next;
        }

    //2 初始化(底层硬件初始化)
        构建mydriver对象
        struct mydriver *drv=alloc(...);
        设置mydriver对象
        drv->irq=...
        drv->addr=...
        drv->func=key_func

    //注册
        register(mydriver对象)
        xxx_add(mydriver对象)

    //定义
        void key_func(){...}

分层:

    上层
    struct mydriver *temp
    tmp->name
    tmp->func()
    ===================调用内核核心层接口
    核心层: 全局变量,链表
    struct mydriver *head
    head->a->b;

    =================== 注册到内核核心层
    底层
    struct mydriver a;
    a.name="key";
    a.irq=EINTX
    a.func=...
    定义
    void key_func(){...}

初级驱动和高级驱动的不同特点

1.控制器与外设关系复杂
  2.代码量大,复杂 不从零开始写代码(参考内核提供代码,厂商提供代码),分析代码,看代码实现原理,移植代码
  3.从宏观角度把握框架原理 如何实现,分层,要做什么?
  4.软硬结合紧密,采用现成模板来实现

学习目标
  1,熟悉各种设备驱动子系统特点(软件,硬件)
  2,熟悉各种设备驱动的工作流程(框架实现原理)
  3,采用模板学习如何移植各种设备驱动

学习方法:源码分析+接口驱动代码编程
  1,控制器工作原理
  2,分析驱动框架
  3,研究samsung的驱动,看别人代码(提高代码阅读能力,分析能力)
  4,移植驱动/写驱动

原文地址:https://www.cnblogs.com/y4247464/p/12417104.html

时间: 2024-08-29 13:23:40

驱动开发 —— 高级驱动学习方法的相关文章

linux驱动开发-模块驱动

linux内核是可以高度定制的,通过配置编译选项达到定制的目的. 在配置kernel编译选项时驱动程序的编译选项一般有三种,不编译.编译为内核驱动.编译为模块驱动.所以linux驱动一般分为两类,内核驱动和模块驱动,当然这两者之间并无绝对区别:当编译为内核驱动时,驱动程序将会随内核一起运行,就相当于内核的固有部分一样:当编译为模块驱动时,每个驱动程序都是独立的个体,在需要的时候安装,用完了再卸载,可以节约硬件资源.以下内容描述的是模块驱动的开发过程. 1.获取内核源码,按照目标器件(PC机或者开

(55)Linux驱动开发之一驱动概述

驱动概述 驱动用在哪里?非标准类设备的编写和标准类设备的驱动移植. 驱动实际上是随着linux内核相伴而生的.某段代码能够控制我们的硬件去工作,去动,这段代码就称为我们的驱动代码. 技术只是一种手段,一种技巧,我们应该利用技术去搞出产品. 5.1.1_2.什么是驱动1_2 5.1.1.1.理解驱动的概念 (1)驱动一词的字面意思 (2)物理上的驱动 (3)硬件中的驱动 (4)linux内核驱动.软件层面的驱动广义上就是指:这一段代码操作了硬件去动,所以这一段代码就叫硬件的驱动程序.(本质上是电力

linux驱动开发前奏

1.驱动开发概述 驱动分类: 1.常规分类:字符设备,块设备,网络设备 字符设备:是一种按字节来访问的设备,字符驱动则负责驱动字符设备,这样的驱动通常实现open,close,read等系统调用,例如:串口,LED,按键 块设备:在大部分unix系统中,块设备定义为:以块(通常是512字节)为最小传输单位的设备,块设备不能按字节处理数据. 而linux则允许块设备传送任意数目的字节.因此,块和字符设备的区别仅仅是驱动的与内核的接口不同.常见的块设备包括硬盘,flash,SD卡等. 网络设备:网络

BDD(行为驱动开发)

BDD的重点是通过与利益相关者的讨论取得对预期的软件行为的清醒认识.它通过用自然语言书写非程序员可读的测试用例扩展了测试驱动开发方法.行为驱动开发人员使用混合了领域中统一的语言的母语语言来描述他们的代码的目的.这让开发者得以把精力集中在代码应该怎么写,而不是技术细节上,而且也最大程度的减少了将代码编写者的技术语言与商业客户.用户.利益相关者.项目管理者等的领域语言之间来回翻译的代价. 关于如何处理需求说明与测试,不同的组织使用不同的名称,或者说是不同的定义,但他们都有一套共同的核心原则与思想,而

书籍--嵌入式Linux驱动开发

<UNIX环境高级编程>(第2版),史蒂文斯著 <深入理解 Linux 内核>(第三版) ,博韦等著 Linux设备驱动开发详解:基于最新的Linux 4.0内核    宋宝华

《连载 | 物联网框架ServerSuperIO教程》-4.如开发一套设备驱动,同时支持串口和网络通讯。附:将来支持Windows 10 IOT

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 注:ServerSuperIO有可能被移植到Windows 10 IOT上,那么将来有可能开发一套设备驱动,可以支行在服务端.嵌入式设备中,将形成完整的解决方案.       现在已经调试通过部分代码,还得需要一段时间,一般都是晚上干,时间也有限.如下图: 目       录 4.如开发一套设备驱动,同时支持串口和网络通讯... 2 4.1           概述... 2 4.2          

【转】linux驱动开发的经典书籍

原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书为<linux_device_driver 3rd Edition>,这是一本很经典的书,无奈Linux的东东还是过于庞大,这本侧重于实战的书籍也只能停留在基本的接口介绍上,更深入的东东只能靠我们自己摸索了.但万事总有一个开头,没有对Linux驱动整体框架的把握是很难做一个优秀的驱动开发者的.除了

Windows驱动开发(中间层)

Windows驱动开发 一.前言 依据<Windows内核安全与驱动开发>及MSDN等网络质料进行学习开发. 二.初步环境 1.下载安装WDK7.1.0(WinDDK\7600.16385.1) 地址:https://msdn.microsoft.com/en-us/windows/hardware/hh852365 2.下载InstDrv软件(用于安装.启动.停止.卸载驱动) 界面如下: 注:srvinstw.exe 也可以安装.卸载sys文件,但需要手动开启.关闭,即在cmd命令窗口下执行

安卓移植和驱动开发第七章心得体会

第七章 Led为我闪烁 尽管 Linux 驱动直接与硬件打交道,但并不是 Linux 驱动直接向硬件中的内存写数据, 而是与本机的内存(νO Memory,位于内核空间〉进行交互.所谓 1/0 内存是通过各种接口(PCI.USB.蓝牙.以太网口等〉连接到主机( PC.手机〉的硬件〈网卡.声卡.摄像头等〉在主机内 存中的映射.例如,在 Ubuntu Linux 上运行的驱动只需要访问运行 Ubuntu Linux 的主机中的内存即可,然后Linux内核会利1/0内存中的数据硬件交互. 如果在不同L