Android Linux内核驱动编写简要步骤说明.


众所周知,Android系统使用linux作为其内核,而Android的驱动多数情况下与linux系统驱动特点一致,下面简述一下linux驱动的添加步骤(主要针对简单设备驱动,不包括各平台额外添加或者摄像头,wifi等多层次驱动的添加)。

定位设备类型,寻找驱动存放位置

一般情况,我们要求不同类型的设备驱动要放到指定的位置,但是位置不影响最后驱动的调用效果,仅仅是作为一个驱动程序员的自觉。

新建驱动文件及目录

在找的目录下新建一个存放此设备的驱动文件的文件夹是一个好习惯,因为通常情况下驱动文件可能包含多个文件。
常规驱动的文件一般包含有:
1. 1个或者多个c文件来编写设备驱动;
2. 1个或者多个h文件,用来定义常量,文件间可调用的函数申明等;
3. 然后就是Kconfig和Makefile文件,若未新建文件,此2个文件可省略,并将其内容写到c文件所在的Kconfig和Makefile文件中。

驱动文件编写方法 – -c及h文件

此为驱动的主文件,通常有3种实现方式,分别为:传统方式,proc方式和dvfs方式。

传统方式:设备按照文件方式进行访问,其需要定义的函数包括:open , release , read, write四个函数及file_operations的方法表。

proc方式:按照proc的方式进行访问,其需要定义proc_read, proc_write方法,同时需要定义create_proc和remove_proc。

dvfs方式:定义val_show, val_store方法和内部函数get_val, set_val。

驱动文件的内容,依据标准的linux的文件格式要求,然后按照设备运行的基本流程和逻辑实现运行过程即可,每一种设备的驱动具体内容不一致,但是需要按照格式编写对应的文件才能加载驱动,所以编写驱动本身和格式同样重要,此处暂不针对不同的设备类型驱动具体实现进行展开。

最后还需要增加驱动加载和卸载函数:init和exit,通常按照如下方式增加:

module_init(init_func);
module_exit(exit_func);

以上为驱动文件的主要内容,下述为驱动的文件的运行流程:

驱动运行的一般流程

  • 加载流程:分配设备号 => 分配结构图变量 => 初始化设备 => 在/sys/class目录下创建目录 => 在/dev和/sys/class/驱动名 目录下创建设备文件 => 在/sys/class/驱动名 目录下创建属性文件 =>创建/proc/驱动名 文件
  • 卸载流程:删除/proc/驱动名 文件 => 销毁设备类别和设备  => 删除字符设备  =>释放设备内存 => 释放设备号

Kconfig文件及Makefile文件的编写说明:

  • Kconfig文件内容:
config XXXXXXX_XXX_XX # 此处时可用的变量,在.config中置为y,即可以编译此模块。
    bool "提示字符串"  
    default n
    help 
      "解释此驱动的针对内容,及如何配置。"

说明:
1. 每个config菜单项都要有类型定义,bool:布尔类型, tristate三态:内建、模块、移除, string:字符串, hex:十六进制, integer:整型;bool类型的只能选中或不选中,tristate类型的菜单项多了编译成内核模块的选项,假如选择编译成内核模块,则会在.config中生成一个CONFIG_HELLO_MODULE=m的配置,假如选择内建,就是直接编译成内核影响,就会在.config中生成一个CONFIG_HELLO_MODULE=y的配置.
2. 依赖型定义depends on或requires,指此菜单的出现是否依赖于另一个定义。
3. 编写好Kconfig文件后,需要在此文件的上一级Kconfig中增加 source “xxx/kconfig”

  • Makefile的编写,一般按照如下格式:
obj -$(CONFIG_XXXXXXX_XXX_XX) += XXX.c xx.c #需要包含所有用的c文件。

历史上的今天:

  1. 2018:  Android 系统修改笔记:修改盘符名称(0)

《Android Linux内核驱动编写简要步骤说明.》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注