下面来看一个综合实例,假设我们要在内核源代码 drivers 目录下为 ARM 体系结构新增如下
用于 test driver 的树型目录:
| --test
   | -- cpu
      | -- cpu.c
   | -- test.c
   | -- test_client.c
   | -- test_ioctl.c
   | -- test_proc.c
   | -- test_queue.c
在内核中增加目录和子目录,我们需为相应的新增目录创建 Makefile 和 Kconfig 文件,而新
增目录的父目录中的 Kconfig 和 Makefile 也需修改,以便新增的 Kconfig 和 Makefile 能被引用。
在新增的 test 目录下,应该包含如下 Kconfig 文件:

 #
# TEST driver configuration
#
menu "TEST Driver "
comment " TEST Driver"
config CONFIG_TEST
bool "TEST support "
config CONFIG_TEST_USER
tristate "TEST user-space interface"
depends on CONFIG_TEST
endmenu

由于 test driver 对于内核来说是新的功能,所以需首先创建一个菜单 TEST Driver。然后,显示 “ TEST support”,等待用户选择;接下来判断用户是否选择了 TEST Driver,如果是( CONFIG_TEST=y),

则进一步显示子功能:用户接口与 CPU 功能支持;由于用户接口功能可以被编译成内核模块,所以这里的询问语句使用了 tristate。为了使这个 Kconfig 能起作用,修改 arch/arm/Kconfig 文件,增加:
source "drivers/test/Kconfig"

脚本中的 source 意味着引用新的 Kconfig 文件。

在新增的 test 目录下,应该包含如下 Makefile 文件:

 # drivers/test/Makefile
#
# Makefile for the TEST.
#
obj -$(CONFIG_TEST) += test.o test_queue.o test_client.o
obj -$(CONFIG_TEST_USER) += test_ioctl.o
obj -$(CONFIG_PROC_FS) += test_proc.o
obj -$(CONFIG_TEST_CPU) += cpu/

该脚本根据配置变量的取值,构建 obj-*列表。由于 test 目录中包含一个子目录 cpu,当CONFIG_TEST_CPU=y 时,需要将 cpu 目录加入列表。
test 目录中的 cpu 子目录也需包含如下的 Makefile:

 # drivers/test/test/Makefile
#
# Makefile for the TEST CPU
#
obj -$(CONFIG_TEST_CPU) += cpu.o

为了使得整个 test 目录能够被编译命令作用到, test 目录父目录中的 Makefile 也需新增如下
脚本:

obj -$(CONFIG_TEST) += test/

在 drivers/Makefile 中加入 obj-$(CONFIG_TEST) += test/,使得在用户在进行内核编译时能
够进入 test 目录。
增加了 Kconfig 和 Makefile 之后的新的 test 树型目录为:
| --test
   | -- cpu
     | -- cpu.c
     | -- Makefile
   | -- test.c
   | -- test_client.c
   | -- test_ioctl.c
   | -- test_proc.c
   | -- test_queue.c
   | -- Makefile
   | -- Kconfig

回到linux源码主目录,执行 make menuconfig命令,进入Device Drivers选项,可以看到新添加的选项,

可以看到TEST Driver已经出现在了 menuconfig中,进入该选项,如下图,是不是很神奇,我们添加的配置选项已经可以选择了。(根据原书略微修改了drivers中的Kconfig,再最后添加了source drivers/test/Kconfig,

这样新添加的内容就会出现在Device Drivers选项下,另外还增加了Set CPU Freq选项)

linux 驱动学习笔记02--应用实例:在内核中新增驱动代码目录和子目录的更多相关文章

  1. linux 驱动学习笔记01--Linux 内核的编译

    由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...

  2. linux kernel学习笔记-5内存管理_转

    void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...

  3. IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试

    IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...

  4. Redis:学习笔记-02

    Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...

  5. 软件测试之loadrunner学习笔记-02集合点

    loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...

  6. Linux系统学习笔记:文件I/O

    Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...

  7. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  8. OpenCV 学习笔记 02 使用opencv处理图像

    1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...

  9. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

随机推荐

  1. js 中json字符串转化json对象

    JSON字符串:var str = '{ "name": "cxh", "sex": "man" }'; JSON对象: ...

  2. java 读写JSON(一)

    算是第一次正式接触Json,没有深入研究,先贴上java的代码,日后才说! package priv.chenhy.datehandle; import java.io.BufferedReader; ...

  3. centos启用ftp功能

    1.安装vsftpd组件,安装完后,有/etc/vsftpd/vsftpd.conf 文件,用来配置,还有新建了一个ftp用户和ftp的组,指向home目录为/var/ftp,默认是nologin(不 ...

  4. 关于SCRUM站立会议

    查询过后对SCRUM站立会议有了初步的了解 站立会议:在敏捷流程的冲刺阶段中,每一天都会举行项目状况会议,强迫每个人向同伴报告进度,迫使大家把问题摆在明面上,这个会议被称为“scrum”或“每日站立会 ...

  5. 转: MySQL 赋予用户权限(grant %-远程和localhost-本地区别)

    相关参考资料: MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. gr ...

  6. UVa 156 (映射 map)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  7. ArcGIS+API+for+JS测距

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. MVC 记录操作日志与过滤特殊字符

    最近进行的MVC系统需要用到记录操作日志和过滤特殊字符的功能,如果每个action中都调用记录日志的方法就太麻烦了,所以根据需要结合mvc的过滤机制 写了个特殊字符验证与记录操作日志的公用类: pub ...

  9. .NET Core On Mac 第一步,配置环境

    话说.NET Core出来这么久了,也没搞搞,实在是羞愧难当啊.既然选择了开始那就不能半途而废啊..NET 跨平台了,那我就用Mac试试吧. 安装步骤一:安装Homebrew 其中会遇到权限不够的问题 ...

  10. 解决php的“It is not safe to rely on the system’s timezone settings”问题

    PHP调试的时候出现了警告: It is not safe to rely on the system解决方法,其实就是时区设置不正确造成的,本文提供了3种方法来解决这个问题. 实 际上,从PHP 5 ...