linux 驱动学习笔记02--应用实例:在内核中新增驱动代码目录和子目录
下面来看一个综合实例,假设我们要在内核源代码 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--应用实例:在内核中新增驱动代码目录和子目录的更多相关文章
- linux 驱动学习笔记01--Linux 内核的编译
由于用的学习材料是<linux设备驱动开发详解(第二版)>,所以linux驱动学习笔记大部分文字描述来自于这本书,学习笔记系列用于自己学习理解的一种查阅和复习方式. #make confi ...
- linux kernel学习笔记-5内存管理_转
void * kmalloc(size_t size, gfp_t gfp_mask); kmalloc()第一个参数是要分配的块的大小,第一个参数为分配标志,用于控制kmalloc()的行为. km ...
- IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试
IIC驱动学习笔记,简单的TSC2007的IIC驱动编写,测试 目的不是为了编写TSC2007驱动,是为了学习IIC驱动的编写,读一下TSC2007的ADC数据进行练习,, Linux主机驱动和外设驱 ...
- Redis:学习笔记-02
Redis:学习笔记-02 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 4. 事物 Redis 事务本 ...
- 软件测试之loadrunner学习笔记-02集合点
loadrunner学习笔记-02集合点 集合点函数可以帮助我们生成有效可控的并发操作.虽然在Controller中多用户负载的Vuser是一起开始运行脚本的,但是由于计算机的串行处理机制,脚本的运行 ...
- Linux系统学习笔记:文件I/O
Linux支持C语言中的标准I/O函数,同时它还提供了一套SUS标准的I/O库函数.和标准I/O不同,UNIX的I/O函数是不带缓冲的,即每个读写都调用内核中的一个系统调用.本篇总结UNIX的I/O并 ...
- 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)
机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...
- OpenCV 学习笔记 02 使用opencv处理图像
1 不同色彩空间的转换 opencv 中有数百种关于不同色彩空间的转换方法,但常用的有三种色彩空间:灰度.BRG.HSV(Hue-Saturation-Value) 灰度 - 灰度色彩空间是通过去除彩 ...
- C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例
C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...
随机推荐
- 网页闯关游戏(riddle webgame)--SQL注入的潘多拉魔盒
前言: 之前编写了一个网页闯关游戏(类似Riddle Game), 除了希望大家能够体验一下我的游戏外. 也愿意分享编写这个网页游戏过程中, 学到的一些知识. web开发初学者往往会忽视一些常见的漏洞 ...
- 认识web前端
对于一个只是浅尝辄止c语言.学过汇编语言的我,思考了半年终于在这一天入了坑,学习web前端. web前端,看着这个名字好高大上,其实我目前的理解就是写页面,是各种图片动画文字在一个页面上呈现,再一点能 ...
- 关于tomcat7下websocket不能使用
tomcat启动时提示 信息: JSR 356 WebSocket (Java WebSocket 1.0) support is not available when running on Java ...
- Nginx-ngx_lua模块原理和内置函数
ngx_lua模块的原理: 1.每个worker(工作进程)创建一个Lua VM,worker内所有协程共享VM:2.将Nginx I/O原语封装后注入 Lua VM,允许Lua代码直接访问:3.每个 ...
- 利用Jquery实现页面上div的拖动及位置保存
<script src="js/jquery.js.js" type="text/javascript"></script> <s ...
- SVN错误:run 'cleanup' if it was interrupted的解决
原文转自:http://www.lxway.com/812960411.htm 今天碰到了个郁闷的问题,svn执行clean up命令时报错“Previous operation has not fi ...
- python数据分析之pandas库的DataFrame应用一
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔型).DateFrame既有行索引也有列索引,可以被看作为由Series组成的字典. 构建Dat ...
- 【python】模块作用域
作用域 在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用.在Python中,是通过_前缀来实现的. 类似_xxx和__xxx这样 ...
- linux下mysql远程访问
// */ // ]]> linux下mysql远程访问 Mysql默认root用户只能本地访问,不能远程连接管理mysql数据库,但项目中必须要远程导 入导出数据,所以研究了一下. Tab ...
- 黄聪:说说JSON和JSONP,也许你会豁然开朗(转)
前言 由于Sencha Touch 2这种开发模式的特性,基本决定了它原生的数据交互行为几乎只能通过AJAX来实现. 当然了,通过调用强大的PhoneGap插件然后打包,你可以实现100%的Socke ...