编写第一个linux驱动程序

和大多数初学者一样,都是从helloword入手,关键是熟悉这个流程


首先介绍我的环境,Ubuntu14   64win10主机。linux内核 为3.16.0-73-generic。可使用uname -r 指令查看。编译的内核版本为linux2.6.32

思路

这里是动态加载,也就时生成module.ko文件,然后手动加载进内核。

首先将你的驱动配好MakefileKconfig

然后将这两个关联到drivers下的makefileKconfig。这样才会出现到menuconfig的界面上。

然后在linux核源码下,将友善之臂的源码.config拷贝到当前.config.然后make menuconfig

。然后make zImage. make modules.或者直接make

如果使用make mrproper了,要重新配置.config。直接从官方下载的linux源码会出错,建议用厂商的,比如我用的是友善之臂的。

如果用make clean,则不用make mrproper。比如 在你的驱动路径下新键一个驱动程序,同时只要在同目录下配好makefileKconfig就可以。然后回到linux内核源码linux2.6.32的路径下使用make clean 清除以前生成的 (不清除.config.o等各类连接文件。然后使用make menuconfig  会将最新的配置写到.config里边去,然后退出时保存,直接make即可生成新的驱动文件。

 

我在/home/user/下 新建了一个文件夹用来存放内核, 使用指令 mkdir kernel

将下载的内核文件夹放到此处,并使用 tar  xvzf 解压此文件夹。解压完后生成文件夹

linux-2.6.32.2/   cd  进入路径。在drivers下 新建自己的驱动文件夹,mydriver,在其文件夹下需要一个hello.c这是个驱动文件。

Hello.c

/*************************************************************************

> File Name: test.c

> Author: yuhs

> Mail: @qq.com

> Created Time: 20161021日 星期五 190809

 ************************************************************************/

 

/* hello.c */

#include <linux/kernel.h>

#include <linux/init.h>

#include <linux/module.h>

MODULE_LICENSE("leo BSD/GPL");

static int hello_init(void)

{

    printk(KERN_ALERT "Hello, world\n");

    return 0;

}

static void hello_exit(void)

{

    printk(KERN_ALERT "Goodbye, Hello world\n");

}

module_init(hello_init);

module_exit(hello_exit);

 

另外要准备一个Makefile  Kconfig,这两个是编译的连接文件,在menuconfig时会观察到,。

Makefile  如下

#

# Makefile

#

FONTMAPFILE = cp437.uni

obj-$(CONFIG_HELLO) += hello.o

obi-$(CONFIG_HELLO_MODUE) +=hello_modue.o

 

 

Kconfig  如下

 

#

# my driver test configuration

#

 

 

config HELLO

tristate "my_driver_test"

default m

help

this is my driver test

 

menu "hello_modue"

comment "hello_modue"

config HELLO_MODUE

tristate "hello_modue_test"

default m  

endmenu

 

然后在drivers的目录下 分别打开Makefile Kconfig并加入刚才的驱动。

QQ图片20161107155541.png


makefile 如下


QQ图片20161107155602.png


最新评论

  1. 发布于:2016-11-07 17:34 回复
    今天又重新走了一遍驱动的流程,我们在宿主机也就是Ubuntu的pc机下使用交叉编译环境,即使宿主机的环境为linux3.6,而我们的目标机开发板的内核为2.6也没问题,我们可以在宿主机上开辟一个文件夹,然后下载和目标开发板的内核一模一样的内核,编译一次即可。然后编译驱动时在makefile里指明内核路径就行了

sitemap