Linux驱动的编写,大致分为两个过程,第一个过程为测试阶段,即为某一具体的设备,添加必要的驱动模块,为了节省编译时间,需要将代码单独放在一处,在编译时,只需要要调用内核的头文件即可;第二个过程为布置阶段,即为某一具体设备,添加完整、可靠的驱动模块,即该过程将驱动模块编译到内核镜像文件中,它需要将驱动模块的代码,添加到内核源码树中,下面将逐一介绍。

阶段一

1 新建一目录,并编写测试代码

mkdir -p develop/drivers/
cd develop/drivers/
vim demo.c
//driver/demo/demo.c
#include "linux/init.h"
#include "linux/module.h" static int hello_init(void)
{
printk(KERN_ALERT"Hello World linux-driver-module\n");//注意,必须是KERN_ALEAT及以上级别,不然不会打印
return ;
} static int hello_exit(void)
{
printk(KERN_ALERT"Goodbye linux-driver-module\n");
return ;
} module_init(hello_init);
module_exit(hello_init); MODULE_LICENSE("GPL");
MODULE_AUTHOR("gjianw217@163.com");

2 添加编译文件Makefile

ARCH=arm
CROSS_COMPILE=arm-linux-gnueabihf-
APP_COMPILE=arm-linux-
#obj-m := pwm_test-drv.o
obj-m := hello-drv.o
KDIR := /path/to/kernel/linux/
PWD := $(shell pwd)
default:
make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
app:hello-app.c
$(APP_COMPILE)gcc -o helloappe hello-app.c
clean:
$(MAKE) -C $(KDIR) M=$(PWD) clean

3 编译并加载到板上

make
Download thd demo.ko into the Development Board
arm/drivers/demo.ko

4  驱动模块的测试

cd /arm/drivers/
insmod demo.ko
lsmod demo.ko
rmmod demo.ko dmesg

阶段二

1 将驱动代码按类型放到内核源码树相应目录下(drivers/demo/demo.c)

//driver/demo/demo.c
#include "linux/init.h"
#include "linux/module.h" static int hello_init(void)
{
printk(KERN_ALERT"Hello World linux-driver-module\n");
return ;
} static int hello_exit(void)
{
printk(KERN_ALERT"Goodbye linux-driver-module\n");
return ;
} module_init(hello_init);
module_exit(hello_init); MODULE_LICENSE("GPL");
MODULE_AUTHOR("lpj");

2 在当前目录下,分别添加编译文件

driver/demo/Makefile

#driver module demo
obj-$(CONFIG_HELLODRV) += hello.o

driver/demo/Kconfig

menu USER_DEVICE_DRIVERS //4中可以看到它
config HELLODRV
tristate "Hello"
help
This is a demo driver programming.
endmenu

3 修改上层目录文件,将其添加到内核中

driver/Makefile

obj-$(CONFIG_HELLODRV)+=demo/

driver/Kconfig

source drivers/demo/Kconfig

arch/arm/Kconfig

source "drivers/demo/Kconfig"

4进行系统配置并编译

make menuconfig
make

5加载内核镜像文件到板上,使用命令检查

lsmod
dmesg

参考链接

【1】Linux驱动模块编译进内核中

【2】Linux内核驱动学习

Linux驱动开发之开篇--HelloWorld的更多相关文章

  1. 1. Linux驱动开发之开篇--Makefile

    基本Makefile假设现在有3个文件,file2.h是函数声明,file2.c是函数定义,文件file1.c调用file2.c中的函数.则Makefile文件的编写如下: helloworld:fi ...

  2. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  3. 嵌入式Linux驱动开发日记

    嵌入式Linux驱动开发日记 主机硬件环境 开发机:虚拟机Ubuntu12.04 内存: 1G 硬盘:80GB 目标板硬件环境 CPU: SP5V210 (开发板:QT210) SDRAM: 512M ...

  4. 嵌入式linux驱动开发之点亮led(驱动编程思想之初体验)

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  5. 【转】linux驱动开发的经典书籍

    原文网址:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html Linux驱动学习的最大困惑在于书籍的缺乏,市面上最常见的书 ...

  6. Linux驱动开发 -- 打开dev_dbg()

    Linux驱动开发 -- 打开dev_dbg() -- :: 分类: LINUX linux设备驱动调试,我们在内核中看到内核使用dev_dbg来控制输出信息,这个函数的实质是调用printk(KER ...

  7. Linux驱动开发学习的一些必要步骤

      1. 学会写简单的makefile 2. 编一应用程序,可以用makefile跑起来 3. 学会写驱动的makefile 4. 写一简单char驱动,makefile编译通过,可以insmod, ...

  8. 驱动编程思想之初体验 --------------- 嵌入式linux驱动开发之点亮LED

    这节我们就开始开始进行实战啦!这里顺便说一下啊,出来做开发的基础很重要啊,基础不好,迟早是要恶补的.个人深刻觉得像这种嵌入式的开发对C语言和微机接口与原理是非常依赖的,必须要有深厚的基础才能hold的 ...

  9. Linux驱动开发必看详解神秘内核(完全转载)

    Linux驱动开发必看详解神秘内核 完全转载-链接:http://blog.chinaunix.net/uid-21356596-id-1827434.html   IT168 技术文档]在开始步入L ...

随机推荐

  1. 【Android 界面效果22】Android的Tab与TabHost

    Tab与TabHost 这就是Tab,而盛放Tab的容器就是TabHost 如何实现?? 每一个Tab还对应了一个布局,这个就有点好玩了.一个Activity,对应了多个功能布局. ①新建一个Tab项 ...

  2. request.getHeader("Referer")理解【转载】

    request.getHeader("Referer")用于获取来源页地址,但有时却为空值,这是怎么回事.原因如下: getHeader("Referer")要 ...

  3. struts1标签-<html:radio> 使用注意事项

    struts1标签-<html:radio> 使用注意事项 1.默认选中效果 在后台XxxForm中写入如下代码,可保证默认选中效果实现: @Override public void re ...

  4. HDU 1257 最少拦截系统 (DP || 贪心)

    最少拦截系统 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Statu ...

  5. 剑指Offer21 二叉树的层序遍历

    /************************************************************************* > File Name: 21_PrintT ...

  6. poj 1695 动态规划

    思路:和黑书上的跳舞机类似 #include<map> #include<set> #include<cmath> #include<queue> #i ...

  7. OpenShare新功能@2014年11月 [2014-11-30]

    新功能@Nov,2014 各门户层次主页布局自由编辑:升级为实时保存,这样用户编辑门户主页时,就算忘了点击“保存布局信息”,也不会丢失已做的工作 全方位支持匿名访问,支持构造公网以及extranet网 ...

  8. freeCodeCamp:Search and Replace

    使用给定的参数对句子执行一次查找和替换,然后返回新句子. 第一个参数是将要对其执行查找和替换的句子. 第二个参数是将被替换掉的单词(替换前的单词). 第三个参数用于替换第二个参数(替换后的单词). 注 ...

  9. 201509020-js

    JS 关于(function( window, undefined ) {})(window)写法的理解   JS 关于(function( window, undefined ) {})(windo ...

  10. 判断checked是否选中

    if($('#checkbox-id').is(':checked')) {     // do something }