Linux驱动模块编译进内核中

BQ27501驱动编译进内核


一、       驱动程序编译进内核的步骤

在 linux 内核中增加程序需要完成以下三项工作:

1. 将编写的源代码复制到 Linux 内核源代码的相应目录;

2. 在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项;

3. 在目录的 Makefile 文件中增加对新源代码的编译条目。

 

bq27501驱动编译到内核中具体步骤如下:

1.      先将驱动代码bq27501文件夹复制到 ti-davinci/drivers/ 目录下。

确定bq27501驱动模块应在内核源代码树中处于何处。

设备驱动程序存放在内核源码树根目录 drivers/ 的子目录下,在其内部,设备驱动文件进一步按照类别,类型等有序地组织起来。

a. 字符设备存在于 drivers/char/ 目录下

b. 块设备存放在 drivers/block/ 目录下

c. USB 设备则存放在 drivers/usb/ 目录下。

注意:

(1) 此处的文件组织规则并非绝对不变,例如: USB 设备也属于字符设备,也可以存放在 drivers/usb/ 目录下。

(2) 在 drivers/char/ 目录下,在该目录下同时存在大量的 C 源代码文件和许多其他目录。所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。

(3) bq27501的驱动是属于字符设备驱动类别,虽然驱动相关的文件只有两个,但是为了方面查看,将相关文件放在了bq27501的文件夹中。在drivers/char/目录下增加新的设备过程比较简单,但是在drivers/下直接添加新的设备稍微复杂点。所以下面首先给出在drivers/下添加bq27501驱动的过程,然后再简单说明在drivers/char/目录下添加的过程。

 

2.      在/bq27501下面新建一个Makefile文件。向里面添加代码:

obj-$(CONFIG_BQ27501)+=bq27501.o

此时,构建系统运行就将会进入 bq27501/ 目录下,并且将bq27501.c 编译为 bq27501.o

3.      在/bq27501下面新建Kconfig文件。添加代码:

menu "bq27501 driver"

 

config BQ27501

tristate"BQ27501"

default y

---help---

  Say 'Y' here, it will be compiled into thekernel; If you choose 'M', it will be compiled into a module named asbq27501.ko.

endmenu

注意:help中的文字不能加回车符,否则make menuconfig编译的时候会报错。

4.     修改/drivers目录下的Kconfig文件,在endmenu之前添加一条语句‘source drivers/bq27501/Kconfig’ 对于驱动程序,Kconfig 通常和源代码处于同一目录。 若建立了一个新的目录,而且也希望 Kconfig 文件存在于该目录中的话,那么就必须在一个已存在的 Kconfig 文件中将它引入,需要用上面的语句将其挂接在 drivers 目录中的Kconfig 中。

 

5.      修改/drivers目下Makefile文件,添加‘obj-$(CONFIG_BQ27501)         +=bq27501/’。这行编译指令告诉模块构建系统在编译模块时需要进入 bq27501/ 子目录中。此时的驱动程序的编译取决于一个特殊配置 CONFIG_BQ27501 配置选项。

 

6.      修改arch/arm目录下的Kconfig文件,在menu "Device Drivers……endmenu"直接添加语句

[cpp] view plaincopy
  1. source "drivers/bq27501/Kconfig"  

 

7.      正确配置好之后,使用make menuconfig命令,在DeviceDrivers菜单下面,可以找到bq27501 driver的选项,如下图(1)所示:


图(1)

 

使用“空格”键选择“*”号,表示将该模块编译进内核中。如下图(2)所示:


图(2)

 

8.      删除驱动模块。首先删除drivers目录下的bq27501文件夹,然后再删除Makefile和Kconfig中添加的语句。

9.      以上将bq27501的驱动放在drivers目录下,若将该驱动模块放在drivers/char目录下,那么修改的是drivers/char下的Makefile和Kconfig文件,arch/arm/Kconfig不需要修改。

二、        驱动模块自动执行

bq27501驱动作为模块动态加载到内核中的时候,是使用“insmod bq27501.ko”这个命令手动加载。bq27501驱动选择编入到内核中,在内核启动过程中会自动加载内核并且调用module_init函数指向的驱动模块初始化函数。所以在不需要添加额外的代码来加载驱动模块。

三、        自动创建设备节点

在动态加载驱动模块时,是利用mknod命令手动创建设备节点,Linux内核提供了一组函数,可以在模块加载时自动在/dev目录下创建相应的设备节点,并在卸载该模块时删除该节点。

在bq27501_init函数中的register_chrdev后面添加下面语句:

bq27501_class=class_create(THIS_MODULE,"bq27501_class");

       if(IS_ERR(bq27501_class)){

              printk(KERN_ALERT"Err:failed in creating class.\n");

              return-1;

       }

       class_device_create(bq27501_class,MKDEV(BQ27501_MAJOR,0),NULL,"bq27501",0);

class_create函数,在/sysfs下面创建自己的类,第一参数指定类的所有者是哪个模块,第二个参数指定类名。

class_device_create函数,在sysfs中注册设备,并会创建一个相应的节点;第一参数指定所要创建的设备所从属的类,第二个参数是设备号,第三个参数是这个设备的父设备,如果没有就指定为NULL,第四个参数是设备名称,第五个参数是从设备号。(新的内核版本该函数为device_create,参数的顺序有所变化)。

内核启动完成之后,使用“cat /proc/devices”命令,可以查看到bq27501已经成功添加到系统中。如下:

Character devices:

  1 mem

  2 pty

  3 ttyp

  4 /dev/vc/0

  4 tty

  4 ttyS

  5 /dev/tty

  5 /dev/console

  5 /dev/ptmx

  7 vcs

 10 misc

 13 input

 14 sound

 29 fb

 81 video4linux

 89 i2c

 90 mtd

128 ptm

136 pts

225 bq27501

249 csl

250 DM355_IPC_MSGQ

251 dm350mmap

252 cmem

253 DM355AEW

254 DM355IPIPE

 

Block devices:

  1 ramdisk

  7 loop

  8 sd

 31 mtdblock

 65 sd

 66 sd

 67 sd

 68 sd

 69 sd

 70 sd

 71 sd

128 sd

129 sd

130 sd

131 sd

132 sd

133 sd

134 sd

135 sd

253 sbull

254 mmc

有部分知识参考http://blog.csdn.net/tigerjb/article/details/6426321,在此表示感谢!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433808.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 的进程

W000: Wnnn命名为W000,W001,W002.....,由smcO动态产生执行上述相关任务。 Pmon: Pmon后台进程负责一下的工作:进程异常终止,会话被杀掉,事务超过空闲时间,网络连接超时,将实例信息注册到监听器上,手工注册 altersystem register; Pmon进程的清…

请简述计算机硬件系统的运行过程,操作系统简述题

✔什么是操作系统?它的功能?操作系统是控制和管理计算机硬件和软件资源,合理地组织计算机工作流程以及方便用户使用计算机系统的程序的集合。功能:处理机管理,存储器管理,I/O设备管理和文件管理以及作为操作…

python闭环最短路径_最短路径算法的实现(dijskstra):Python

dijskstra最短路径算法步骤:输入:图G(V(G),E(G))有一个源顶点S和一个汇顶点t,以及对所有的边ij属于E(G)的非负边长出cij。输出:G从s到t的最短路径的长度。第0步:从对每个顶点做临时标记L开始,做法如下&…

黑群晖二合一安装不了套件_玩PT还是得安装transmission,星际蜗牛安装黑群晖制作家用NAS...

原文作者:pt老萌新To小白:黑群晖docker安装PT神器transmission——星际蜗牛安装黑群晖制作家用NAS的折腾日记写在前面:里面的技术方法不是我原创的,都是网上找的,侵删。折腾的过程记录是原创的(好像没啥原创的了)&…

Know more about Cache Buffer Handle

在之前的文章《latch free:cache buffer handles造成的SQL性能问题》中我介绍了cache buffer handle latch的一些知识,在这里我们复习一下: "当会话需要pin住buffer header时它首先要获去buffer handle,得到buffer handle的过程中首先要…

spring boot web项目_阿里技术专家带你使用Spring框架快速搭建Web工程项目

点击上方 "程序员小乐"关注, 星标或置顶一起成长 第一时间与你相约 每日英文 We all have a past. It’s how you deal with it. 每个人都有过去,只是取决于你怎么去处理。 每日掏心话 人不都是这样吗,安慰别人的时候头头是道,自己…

MySQL执行外部sql脚本文件的命令

sql脚本是包含一到多个sql命令的sql语句,我们可以将这些sql脚本放在一个文本文件中(我们称之为“sql脚本文件”),然后通过相关的命令执行这个sql脚本文件。基本步骤如下:1、创建包含sql命令的sql脚本文件 文件中包含一…

全国计算机水平考试技巧,全国计算机等级考试上机考试应试技巧

掌握好上机考试的应试技巧,可以使考生的实际水平在考试时得到充分发挥,从而取得较为理想的成绩。历次考试均有考生因为忽略了这一点,加之较为紧张的考场气氛影响了水平的发挥,致使考试成绩大大低于实际水平。因此每个考生在应试前…

git 代码回滚_能提交到远程的Git回滚

很多情况下我们需要回滚代码,最容易想到的就是git reset。但是git reset有个弱点,它是一个彻底的回滚,不能再提交给远程了,因为在提交记录里回滚点之后的记录都不见了。做一下试验,一个文件我们提交了三次之后回滚#往前…

Mysql数据库的几大优势

为什么开源社区买mysql的帐, MySQL数据库的吸引开源社区的几大特质: 客户为什么会考虑购买MySQL 企业版Enterprise Edition : 转载于:https://www.cnblogs.com/macleanoracle/archive/2013/03/19/2968208.html

python机器人算法_DBscan算法及其Python实现

DBSCAN简介:1.简介DBSCAN 算法是一种基于密度的空间聚类算法。该算法利用基于密度的聚类的概念,即要求聚类空间中的一定区域内所包含对象(点或其它空间对象)的数目不小于某一给定阀值。DBSCAN 算法的显著优点是聚类速度快且能够有效处理噪声点和发现任意…

c语言e怎么表示_来测测!这11个C语言入门基础知识你都掌握了吗?

文章字数:8400 干货指数:⭐⭐⭐⭐⭐C语言程序的结构认识用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。例1:计算两个整数之和的c程序:#include main…

泰拉瑞亚服务器怎么让玩家注册,泰拉瑞亚服务器权限指令大全

; z1 o, G5 B N; k# W% L5 E) a7 _9 k. x% z* A/ \# j) U! Y2 8 Wtshock.ignore.sendtilesquare7 p3 x/ : T- {; y4 y" k7 U8 J描述: 允许客户端无限制修改地图. # I( K8 {# K$ n( 4 d命令: 无 9 g3 L. p5 G9 M; Y( E4 w. Y v5 M$ H, \/ K; M% n3 ktshock.ignore.dropb…

Oracle甲骨文8.7亿美元高价收购Eloqua

北京,2012年12月20日—— 甲骨文今天宣布,已与领先的云营销自动化和收入绩效管理软件供应商Eloqua公司(NASDAQ代码:ELOQ)达成收购协议,收购价为每股23.50美元,总额约为8.71亿美元。Eloqua的现…

Linux开启mysql远程连接的设置步骤

Mysql默认root用户只能本地访问,不能远程连接管理mysql数据库,Linux如何开启mysql远程连接?设置步骤如下: 1、GRANT命令创建远程连接mysql授权用户itlogger mysql -u root -p mysql>GRANT ALL PRIVILEGES ON *.* TO itloggerlo…

3dsmax展uv_TexTools|3dmax展UV插件(TexTools for 3ds Max)下载v4.10免费版 - 欧普软件下载

TexTools for 3ds Max是为3dmax推出的一款展UV插件,主要功能包括自动加入环形边结构、材质加速烘焙、光影追踪渲染预设、多种模型对象棋盘格贴图等,支持3dsmax或以上版本,在editUVW模式下可以展开UVW修改,编辑UVW编辑器和编辑按钮…

新浪云python示例_Python Web框架Flask中使用新浪SAE云存储实例

对于部署在新浪应用引擎SAE上的项目,使用新浪SAE云存储是不错的存储方案。 新浪SAE云存储仅能在SAE环境中正常使用,对它进行简单封装后,可以直接在Flask中使用,项目代码见GitHub上Flask-SaeStorage。 使用示例代码: fr…

hp服务器如何ghost系统,惠普(HP)电脑安装不了GHOST系统的解决办法

你还在为不知道惠普(HP)电脑安装不了GHOST系统的解决办法而不知所措么?下面来是学习啦小编为大家收集的惠普(HP)电脑安装不了GHOST系统的解决办法,欢迎大家阅读:惠普(HP)电脑安装不了GHOST系统的解决办法1、按F10进入CMOS2、找到电源设置项(Power Manag…

azm335x 串口配置

任务: 配置uart3和uart5 UART3 UART5 配置uart3 1. 修改mmu33xx.c _AM33XX_MUXENTRY(MII1_RXD3, 0, "mii1_rxd3", NULL, "rgmii1_rd3", "mmc0_dat5", "mmc1_dat2", NULL, "mcasp0_axr0", "gpio2_…

木兰编程语言python_ulang(木兰编程语言)

ulang(木兰编程语言)是款最近新推出的语言编程的软件,页面非常的简单,下载下来直接编辑就可以了,永久免费的,不会有任何的弹出窗口打扰。ulang(木兰编程语言)软件特色Python是一种跨平台的计算机程序设计语言。是一种面向对象的动…