linux驱动模块编译进内核中

a746742897 a746742897     2023-01-17     159

关键词:

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 plain  copy
  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,在此表示感谢!



linux驱动开发--设备驱动基础笔记1

设备驱动基础设备驱动的使用方式:动态加载直接编译进内核直接编译进内核的方法:(内核源码/Doucument/kbuild/…中有相应的介绍).config:顶层配置文件,可以手动修改,也可以通过makemenuconfig等命令配置... 查看详情

linux驱动实践:带你一步一步编译内核驱动程序(代码片段)

...式、Linux。文章目录学习的困惑实践环境编译进内核创建驱动程序目录创建源文件创建Kconfig文件创建Makefile文件编译编译为驱动模块编译所有的驱动模块只编译hello这一个驱动模块验证一下资料下载别人的经验,我们的阶梯&#x... 查看详情

linux驱动实践:带你一步一步编译内核驱动程序(代码片段)

...式、Linux。文章目录学习的困惑实践环境编译进内核创建驱动程序目录创建源文件创建Kconfig文件创建Makefile文件编译编译为驱动模块编译所有的驱动模块只编译hello这一个驱动模块验证一下资料下载别人的经验,我们的阶梯&#x... 查看详情

linux下的initrd问题~

initrd里面有些驱动程序用已安装驱动的,我对这个驱动这块不明白,主要是平时我们插入硬盘时直接硬盘自动安装驱动为什么在linux里就不能自动安装驱动还需要把相应的驱动程序拿出来单独放在一个地方?!首先来说,很多驱... 查看详情

linux模块编译后加载不成功

...的输出来看,内核已经export了一个同样的symbol,你加载的驱动再次输出一遍就有问题了。可能原因:usbnet模块可能在系统启动后已经加载了,你不需要手动再次加载。这个又可能由两个原因造成:(1)你在menuconfig中选择USBNET模... 查看详情

linux驱动加载流程分析(代码片段)

linux驱动加载流程分析内核是如何加载驱动的,有些是编译到内核里面,有些事编译成ko,让系统自动加载。总的说来,在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载。静态加载就是把驱动程... 查看详情

已编译模块的数量是不是会影响 RAM 中 Linux 内核的大小?

...08-0215:23:23【问题描述】:当我编译Linux内核时,我编译的驱动程序和模块的数量肯定会影响生成的二进制文件的大小。但是它是否也会影响内核加载到内存时的大小?我 查看详情

专题5-内核模块开发1

...nw_usbc、查看lsmod(系统所有内核模块)eg:lsmod在linux中,驱动模块大多以内核模块存在的。&nb 查看详情

linux内核编译

...多功能都有三种选择:1、不使用此功能;2、编译成内核模块;3、编译进内核;如何手动编译内核:makegconfig:Gnome桌面环境使用,需要安装图形开发库组:GNOMESoftwareDevelopmentmakekconfig:KDE桌面环境使用,需要安装图形开发库makemenuco... 查看详情

如何编译一个linux下的驱动模块

首先,我们要了解一下模块是如何别被构造的。模块的构造过程与用户空间的应用程序的构造过程有显著不同;内核是一个大的、独立的程序,对于它的各个部分如何组合在一起有详细的明确的要求。Linux2.6内核的构造过程也与以... 查看详情

高手进阶:linux操作系统驱动编译与运行

参考技术A一、手工加载测试1、insmod./key_test.ko加载驱动模块到内核2、cat/proc/modules|grepkey_test查看key_test模块在内核中的地址,不加过滤器可以看到全部加载的模块。3、lsmod显示模块,这时可以看到所有的模块名字,后面跟的是主... 查看详情

linux3.5内核模块开发编程(代码片段)

1.1Linux内核模块介绍1.1.1Linux内核模块概述嵌入式设备驱动开发中将驱动程序以模块的形式发布,更是极大地提高了设备使用的灵活性——用户只需要拿到相关驱动模块,再插入到用户的内核中,即可灵活地使用你的设... 查看详情

linux内核模块管理

...带的,也可以是由硬件厂商开发的(可以想象成驱动)。安装模块一般有两种方法:第一种方法在编译内核时,手工调整内核模块功能 查看详情

开启驱动开发之路

一、驱动开发的准备工作(1)正常运行linux系统的开发板。要求开发板中的linux的zImage必须是自己编译的,不能是别人编译的。(2)内核源码树,其实就是一个经过了配置编译之后的内核源码。(3)nfs挂载的rootfs,主机ubuntu中必须搭建... 查看详情

如何编译一个linux下的驱动模块

linux下编译运行驱动嵌入式linux下设备驱动的运行和linuxx86pc下运行设备驱动是类似的,由于手头没有嵌入式linux设备,先在vmware上的linux上学习驱动开发。按照如下方法就可以成功编译出helloworld模块驱动。1、首先确定本机linux版... 查看详情

linux下网络配置问题

...好好的有道理,但是说详细点好不好硬件没问题,设备没驱动而已,windows那边有驱动不代表linux这边有驱动,自己重新编译内核模块,把你网卡芯片对应的驱动模块选上,重新编译模块,然后找到编译好的.so文件cp到/lib/modules/对... 查看详情

不修改linux内核文件,直接用makefile编译驱动,是否要先把内核编译一遍?

不修改内核文件编译驱动模块:建立一个名字为led的文件夹。把LED驱动源码micro2440_leds.c复制到该目录。在该目录下创建Makefile文件如下:点击(此处)折叠或打开obj-m:=micro2440_leds.oKERNEL_DIR?=/home/samba/linux-2.6.32.2-micro2440all: $(MAKE)-C$(KERN... 查看详情

linux操作系统课程设计:企业服务器的配置与实现怎样做

一般购买大品牌的服务器才有相应的驱动程序:硬件:4核CPU,4G的内存,主板带RIAD,512G内存,安装与配置Web服务器Apache服务器源代码安装:http://httpd.apache.orgApacheRPM软件下载:http://updates.redhat.comApache模块和MPM可使用类型的更详细介绍:h... 查看详情