编译Linux内核时向内核2.6.30添加新驱动方法

合集下载

设备驱动加到Linux内核中

设备驱动加到Linux内核中

7.2.3 设备驱动加到Linux内核中设备驱动程序编写完后将该驱动程序加到内核中。

这需要修改Linux 的源代码,然后重新编译内核。

①将设备驱动程序文件(比如mydriver.c)复制到/Linux/drivers/char目录下。

该目录保存了Linux下字符设备的设备驱动程序。

修改该目录下mem.c 文件,在int chr_dev_init()函数中增加如下代码:#ifdef CONFIG_MYDRIVERdevice_init();#endif其中CONFIG_MYDRIVER是在配置Linux内核时赋值。

②在/linux/drivers/char目录下Makefile中增加如下代码:ifeq ($(CONFIG_MYDRIVER),y)L_OBJ + = mydriver.oendif如果在配置Linux内核时选择了支持新定义的设备,则在编译内核时会编译mydriver.c生成mydriver.o文件。

③修改/linux/drivers/char目录下config.in文件,在comment Character devices语句下面加上bool suppot for mydriver CONFIG_MYDRIVER这样,若编译内核,运行make config,make menuconfig或make xconfig,那么在配置字符设备时就会有选项:Support for mydriver当选中这个设备时,设备驱动就加到了内核中了。

重新编译内核,在shell中将当前目录cd 到Linux目录下,然后执行以下代码:# make menuconfig# make dep# make在配置选项时要注意选择支持用户添加的设备。

这样得到的内核就包含用户的设备驱动程序。

Linux通过设备文件来提供应用程序和设备驱动的接口,应用程序通过标准的文件操作函数来打开、关闭、读取和控制设备。

查看Linux文件系统下的/proc/devices,可以看到当前的设备信息。

如何在嵌入式LINUX中增加自己的设备驱动

如何在嵌入式LINUX中增加自己的设备驱动

如何在嵌入式LINUX中增加自己的设备驱动程序北京邮电大学电子工程学院强磊--------------------------------------------------------------------------------驱动程序的使用可以按照两种方式编译,一种是静态编译进内核,另一种是编译成模块以供动态加载。

由于uClinux不支持模块动态加载,而且嵌入式LINUX不能够象桌面LINUX那样灵活的使用insmod/rmmod加载卸载设备驱动程序,因而这里只介绍将设备驱动程序静态编译进uClinux内核的方法。

下面以UCLINUX为例,介绍在一个以模块方式出现的驱动程序test.c基础之上,将其编译进内核的一系列步骤:(1)改动test.c源带代码第一步,将原来的:#include <linux/module.h>#include <linux/version.h>char kernel_version[]=UTS_RELEASE;改动为:#ifdef MODULE#include <linux/module.h>#include <linux/version.h>char kernel_version[]=UTS_RELEASE;#else#define MOD_INC_USE_COUNT#define MOD_DEC_USE_COUNT#endif第二步,新建函数int init_test(void)将设备注册写在此处:result=register_chrdev(254,"test",&test_fops);(2)将test.c复制到/uclinux/linux/drivers/char目录下,并且在/uclinux/linux/drivers/char目录下mem.c中,int chr_dev_init( )函数中增加如下代码:#ifdef CONFIG_TESTDRIVEinit_test();#endif(3)在/uclinux/linux/drivers/char目录下Makefile中增加如下代码:ifeq($(CONFIG_TESTDRIVE),y)L_OBJS+=test.oEndif(4)在/uclinux/linux/arch/m68knommu目录下config.in中字符设备段里增加如下代码:bool 'support for testdrive' CONFIG_TESTDRIVE y(5)运行make menuconfig(在menuconfig的字符设备选项里你可以看见我们刚刚添加的'support for testdrive'选项,并且已经被选中);make dep;make linux;make linux.text;make linux.data;cat linux.text linux.data > linux.bin。

5(g)内核操作Linux2.6内核驱动移植参考

5(g)内核操作Linux2.6内核驱动移植参考

内核操作Linux2.6内核驱动移植参考随着Linux2.6的发布,由于2.6内核做了教的改动,各个设备的驱动程序在不同程度上要进行改写。

为了方便各位Linux爱好者我把自己整理的这分文档share出来。

该文当列举了2.6内核同以前版本的绝大多数变化,可惜的是由于时间和精力有限没有详细列出各个函数的用法。

特别声明:该文档中的内容来自,该网也上也有各个函数的较为详细的说明可供各位参考。

1、使用新的入口必须包含<linux/init.h>module_init(your_init_func);module_exit(your_exit_func);老版本:int init_module(void);void cleanup_module(voi);2.4中两种都可以用,对如后面的入口函数不必要显示包含任何头文件。

2、GPLMODULE_LICENSE("Dual BSD/GPL");老版本:MODULE_LICENSE("GPL");3、模块参数必须显式包含<linux/moduleparam.h>module_param(name, type, perm);module_param_named(name, value, type, perm);参数定义module_param_string(name, string, len, perm);module_param_array(name, type, num, perm);老版本:MODULE_PARM(variable,type);MODULE_PARM_DESC(variable,type);4、模块别名MODULE_ALIAS("alias-name");这是新增的,在老版本中需在/etc/modules.conf配置,现在在代码中就可以实现。

5、模块计数int try_module_get(&module);module_put();老版本:MOD_INC_USE_COUNT 和MOD_DEC_USE_COUNT6、符号导出只有显示的导出符号才能被其他模块使用,默认不导出所有的符号,不必使用EXPORT_NO_SYMBOLS老板本:默认导出所有的符号,除非使用EXPORT_NO_SYMBOLS7、内核版本检查需要在多个文件中包含<linux/module.h>时,不必定义__NO_VERSION__老版本:在多个文件中包含<linux/module.h>时,除在主文件外的其他文件中必须定义__NO_VERSION__,防止版本重复定义。

编译Linux2.6内核并添加一个系统调用

编译Linux2.6内核并添加一个系统调用

1. 0 让新 内核和 旧内核 都可 以加载 的配置 的步骤 :
my. r h i 8 / o t z ma e/ o t / c /3 6 b o / l g b o a b mv. y t m. p/ o t / s e ma b o S
mv/ o t zma e/o t mln z 261 ..5 3 b / l g b b / i u - ..510 0 v
2 1 年第 4期 0 1

建 电

19 4
编 译 iu26内 并 添 加 一 个 系统调 用 Ln x . 核
张 伟 华 .王 海 英 。高 静
(河南 财经政 法 大学成 功 学院 河 南 郑 州 4 10 5 2 0)
【 摘 要 】 本 文 以实例 来详 细描 述 了从 准备 一直 到使 用新 内核 的 Lnx 。 : iu 26内核 编译过 程 , 然后介 绍 了
轻 易地 对它进 行修 改 .使 我们 能够 根据 自己的要 求 度 身 定制 一个更 高效 、 更稳 定 的 内核 。
系统调 用【 用户 进程 与 系统之 间 的接 口, 们在 2 ] 是 它 内核 中实 现 .其 主要 目的是 使得 用户 可 以使 用操 作 系 统提 供 的操作底 层设 备 的功 能 用 户 程序 肯定 要 操作
mv/ o t y tm. p/ o ' y t m. p 2 6 1 .. 5 b / se ma b oJ s e ma - .. 5 10 03 S , S mk n td/ o g n td 2.. 5 10 0 . 6.5 1 ii b r i i - 6 1 . . 5 3 i 2. 1 r mg v / o t rbgu e n ib / u / r b.o f g

将驱动程序添加到Linux内核

将驱动程序添加到Linux内核

一,概述在Linux内核中增加程序需要完成以下三项工作:1.将编写的源代码复制到Linux内核源代码的相应目录2.在目录的Kconfig文件中增加新源代码对应项目的编译配置选项3.在目录的Makefile文件中增加对新源代码的编译条目二,实例1,把驱动代码usbtmc(文件夹)复制到/usr/src/linux-headers-2.6.32-31-generic/drivers/char下。

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

a,字符设备存在于drivers/char/目录下b,块设备存放在drivers/block/目录下c,USB设备则存放在drivers/usb/目录下。

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

(3),例如我们把驱动程序usbtmc(文件夹)存放在drivers/char/目录下,那么你要注意,在该目录下同时会存在大量的C源代码文件和许多其他目录。

所有对于仅仅只有一两个源文件的设备驱动程序,可以直接存放在该目录下,但如果驱动程序包含许多源文件和其他辅助文件,那么可以创建一个新子目录。

2,修改char目录下的Kconfig和Makefile(1),修改Kconfig,添加一句:source “drivers/char/usbtmc/Kconfig”它表示将usbtmc目录下的Kconfig挂载到char目录下的Kconfig里面(为了使本层的Kconfig文件能起作用,我们需要修改父目录的Kconfig文件,加入source语句)a,对驱动程序而言,Kconfig通常和源代码处于同一目录。

b,如果你建立了一个新子目录,而且也希望Kconfig文件存在于该目录中的话,那么就必须在一个已存在的Kconfig文件中将它引入,需要用上面的语句将其挂接在drivers/char 目录中的Kconfig中。

内核驱动环境搭建方案

内核驱动环境搭建方案

内核驱动环境搭建方案兄弟,下面就是一个内核驱动环境搭建的超简单方案啦。

一、准备工作。

1. 硬件基础。

2. 操作系统选择。

3. 软件工具安装。

在Linux下,比如说Ubuntu,你得先把编译工具链装上。

这个就像厨师的锅碗瓢盆一样重要。

对于C语言编写的内核驱动,那GCC编译器是必须的。

你可以在终端里敲上“sudo apt get install gcc”,就这么简单,等它安装完就行。

还有,内核头文件也不能少。

在Ubuntu下,可以通过“sudo apt get install linux headers $(uname r)”来安装。

这个内核头文件就像是地图,告诉编译器内核里面的各种结构和函数是咋回事儿。

如果是在Windows下呢,你需要安装Visual Studio。

这是个大工程,安装的时候要有耐心。

而且,你得选择安装Windows驱动开发工具包(WDK),它就像是专门为Windows内核驱动开发打造的魔法盒,里面有各种工具和库。

二、创建开发环境。

1. Linux下的环境创建。

咱们可以创建一个专门的工作目录,就像你在地上画个圈,说这是我搞内核驱动开发的地盘。

在终端里敲“mkdir kernel driver dev”,然后“cd kernel driver dev”就进入这个目录了。

然后呢,你可以用文本编辑器来写你的内核驱动代码。

Vim或者Emacs都是大神们爱用的,不过如果你觉得它们有点难搞,像gedit这种简单的图形化文本编辑器也能胜任。

2. Windows下的环境创建。

在Visual Studio安装好并且WDK也安装好之后,打开Visual Studio。

就像打开一个装满宝藏的宝箱一样。

你可以创建一个新的项目,在项目模板里选择“Windows Driver”相关的模板。

然后呢,按照向导一步一步来,设置好项目的名称、保存路径之类的东西。

三、测试环境搭建。

1. Linux下的测试。

当你写好内核驱动代码之后,你需要把它编译成内核模块。

实验五 linux-2.6.35内核添加网卡驱动

实验五 linux-2.6.35内核添加网卡驱动

实验五linux-2.6.35内核移植—网卡驱动的添加【实验目的】本实验通过在上个实验结果的linux2.6.35内核上移植CS89900A网卡驱动,使其可以通过网络nfs的方式挂载在ubantu主机环境上的文件系统,从而实现linux系统的完全启动。

【实验环境】1、Ubuntu 10.10发行版2、u-boot-2010.033、FS2410平台4、交叉编译器arm-none-linux-gnueabi-gcc-4.3.2【实验步骤】linux-2.6.35内核中有cs8900的驱动,但是这个驱动需要我们修改,这也是第一种支持我们的网卡的方法。

另外我们可以移植一个可以使用的cs8900网卡驱动到我们的内核中,这里我们使用第二种方法。

实验步骤中前3步已经做过的,就不要再重复了。

1、解压内核$ tar xvf linux.2.6.35.tar.bz22、修改顶层Makefile修改linux-2.6.35 目录下的Makefile,找到ARCH ?= $(SUBARCH)CROSS_COMPILE ?=改为ARCH ?= armCROSS_COMPILE ?= arm-none-linux-gnueabi-3、拷贝配置文件$ cd linux-2.6.35$ cp arch/arm/configs/s3c2410_defconfig .config4、将cs8900.c和cs8900.h两个文件拷贝到linux-2.6.35/drivers/net/arm/下5、修改Kconfig添加cs8900内核配置项修改linux-2.6.35/drivers/net/arm/Kconfig添加如下内容:config S3C2410_CS8900tristate “CS8900 support”depends on NET_ETHERNET && ARM && ARCH_SMDK2410---help---support for cs8900 chipset base Ethernet cards, if you have a network card of this type.6、修改Makefile添加内核编译配置修改linux-2.6.35/drivers/net/arm/Makefile添加如下内容:obj-$(CONFIG_S3C2410_CS8900) += cs8900.o7、添加地址映射定义修改arch/arm/mach-s3c2410/include/mach/map. h文件,找到文件末尾#define S3C_PA_NAND S3C24XX_PA_NAND在这行之后添加如下内容:/* CS8900a */#define pSMDK2410_ETH_IO __phys_to_pfn(0x19000000)#define vSMDK2410_ETH_IO 0xE0000000#define SMDK2410_ETH_IRQ IRQ_EINT98、添加平台代码修改arch/arm/mach-s3c2410/mach-smdk2410.c文件,找到下面的结构:static struct map_desc smdk2410_iodesc[] __initdata = {/* nothing here yet */};修改为:static struct map_desc smdk2410_iodesc[] __initdata = {/* nothing here yet */{vSMDK2410_ETH_IO, pSMDK2410_ETH_IO, SZ_1M, MT_DEVICE}};9、配置内核,使之支持cs8900网卡$ make menuconfigKernel Features ---> //使用EABI工具链这两项是必须选择的[*] Use the ARM EABI to compile the kernel[*] Allow old ABI binaries to run with this kernel (EXPERIMENTAL) (NEW) Device Drivers --->[*] Network device support --->[*] Ethernet (10 or 100Mbit) ---><*> CS8900a support10、重新编译内核$ make zImage11、拷贝zImage到tftpboot目录下并重新启动开发板$ cp arch/arm/boot/zImage /tftpboot。

linux 驱动移植流程

linux 驱动移植流程

linux 驱动移植流程【中英文实用版】Title: Linux Driver Porting Process标题:Linux驱动移植流程1.Introduction1.简介The Linux kernel is an open-source operating system that is widely used in various devices such as servers, embedded systems, and desktop computers.To develop a Linux driver, it is essential to understand the process of driver porting, which involves modifying the existing driver code to make it compatible with a different kernel version or hardware platform.Linux内核是一个开源的操作系统,广泛应用于服务器、嵌入式系统和桌面计算机等各种设备中。

为了开发Linux驱动程序,了解驱动移植过程至关重要,该过程涉及修改现有驱动代码,使其与不同内核版本或硬件平台兼容。

2.Preparing the Development Environment2.准备开发环境Before starting the driver porting process, ensure that you have a suitable development environment.This includes setting up the Linux kernel source, compiling the kernel, and installing the required tools and libraries.Once the environment is ready, you can proceed with the driver porting process.在开始驱动移植过程之前,请确保您有一个合适的开发环境。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译时向内核添加新设备
模块的方式动态的将驱动加入内核,但这种方式加入的驱动程序,当系统重新启动时,还需要重新用模块的方式进行插入,如果是系统内常用的设备驱动采用这种方式进行加载,就会很不方便。

本小节将介绍如何在内核编译时就把驱动加入内核。

当把设备驱动源程序编写好以后,需要把它编译进内核。

当用户需要打开设备时,还需要一个在/dev 目录的设备文件名称,这样驱动程序才能工作起来。

下面分步骤来介绍如何把驱动程序编译进内核及创建设备文件名称。

请读者参考《Linux应用与开发典型实例精讲》(邱铁,于玉龙,徐子川编著,清华大学出版社)第12章的介绍。

1、首先在linux-2.6.30/drivers/ 目录下建立一个名称为“drivertest”的新目录,并设计驱动源程序driver_kernel.c,为了方便,我们采用与上一节相同的源程序。

2、在新建的linux-2.6.30/drivers/ drivertest目录下建立一个新的配置文件Kconfig 和工程管理Makefile文件。

工程管理Makefile文件根据CONFIG_DRIVER_VMALLOC宏来决定是否编译源文件,并输出目标模块文件。

脚本内容如下:
#
# Makefile for the Driver-myalloc.
#
obj-$(CONFIG_DRIVER_VMALLOC) +=
driver_kernel.o
在Kconfig文件中,主要为内核配置时提供选择开关,并定义DRIVER_VMALLOC宏,作为是否包含myalloc 驱动的选项。

myalloc 的配置文件Kconfig内容如下:
#
# DRIVER test subsystem configuration
#
menu "DRIVER KMALLOC support"
DRIVER_VMALLOC
config
tristate "Driver_test is supported"
---help---
Driver_test use vmalloc .
endmenu
3、把myalloc设备驱动程序源文件driver_kernel.c放到新建的linux-2.6.30/drivers/ drivertest 目录下。

使上一步建立的Kconfig 文件、Makefile 文件和源文件同在一目录下,如图18.5所示。

图18.5 drivertest 目录
4、修改drivers/Kconfig文件,如图18.6所示,增加一行把myalloc配置作为驱动的一个选项,所添加的内容如下:
source "drivers/drivertest/Kconfig
图18.6 配置drivers/Kconfig
5、修改kernel/drivers/Makefile 文件,在文件的最后,添加如下脚本:
drivertest/
obj-$(CONFIG_DRIVER_VMALLOC) +=
这样使在编译Linux 内核驱动时,能把drivertest/目录包含进去。

在这里使用了宏定义为
CONFIG_DRIVER_VMALLOC判断是否包含。

如图18.7所示
图18.7 配置drivers/Makefile
6、完成以上修改后,make menuconfig重新配置内核,其中包括加载我们编写的新设备myalloc,具本设置方支是:并从“D evice drivers --->DRIVER KMALLOC support”选择添加myalloc设备,其中Device drivers目录如图18.8所示。

图18.8 Device drivers目录
从D evice drivers目录,选择DRIVER KMALLOC support-Æ,展开后如图18.9所示。


空格键,使<*>出现,表示选择该驱动。

图18.9 DRIVER KMALLOC support目录
完成设置后,重新编译内核,生成映象文件bzImage,按照第12章所介绍的安装并引导系统。

7、检测myalloc驱动程序的安装
系统重启动后,进入kernel 2.6.30启动选项。

Linux 系统正确运行后,通过以下命令查看myalloc驱动程序安装结果:
ls /dev
如图18.10所示,如果在例表中找到“myalloc”则表示设备已添加进内核中。

图18.10 /dev目录下设备文件列表
8、测试myalloc驱动程序的正确性。

采用上一节介绍的测试程序,进行测试,如图18.11所示,表明驱动的读写都是正确的。

图18.11 测试myalloc驱动的正确性
本文节选自:
邱铁,于玉龙,徐子川.Linux应用与开发典型实例精讲.清华大学出版社.2010年5月出版。

相关文档
最新文档