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

阶段一

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

  1. mkdir -p develop/drivers/
    cd develop/drivers/
  2. vim demo.c
  1. //driver/demo/demo.c
  2. #include "linux/init.h"
  3. #include "linux/module.h"
  4.  
  5. static int hello_init(void)
  6. {
  7. printk(KERN_ALERT"Hello World linux-driver-module\n");//注意,必须是KERN_ALEAT及以上级别,不然不会打印
  8. return ;
  9. }
  10.  
  11. static int hello_exit(void)
  12. {
  13. printk(KERN_ALERT"Goodbye linux-driver-module\n");
  14. return ;
  15. }
  16.  
  17. module_init(hello_init);
  18. module_exit(hello_init);
  19.  
  20. MODULE_LICENSE("GPL");
  21. MODULE_AUTHOR("gjianw217@163.com");

2 添加编译文件Makefile

  1. ARCH=arm
  2. CROSS_COMPILE=arm-linux-gnueabihf-
  3. APP_COMPILE=arm-linux-
  4. #obj-m := pwm_test-drv.o
  5. obj-m := hello-drv.o
  6. KDIR := /path/to/kernel/linux/
  7. PWD := $(shell pwd)
  8. default:
  9. make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
  10. app:hello-app.c
  11. $(APP_COMPILE)gcc -o helloappe hello-app.c
  12. clean:
  13. $(MAKE) -C $(KDIR) M=$(PWD) clean

3 编译并加载到板上

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

4  驱动模块的测试

  1. cd /arm/drivers/
  2. insmod demo.ko
  3. lsmod demo.ko
  4. rmmod demo.ko
  5.  
  6. dmesg

阶段二

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

  1. //driver/demo/demo.c
  2. #include "linux/init.h"
  3. #include "linux/module.h"
  4.  
  5. static int hello_init(void)
  6. {
  7. printk(KERN_ALERT"Hello World linux-driver-module\n");
  8. return ;
  9. }
  10.  
  11. static int hello_exit(void)
  12. {
  13. printk(KERN_ALERT"Goodbye linux-driver-module\n");
  14. return ;
  15. }
  16.  
  17. module_init(hello_init);
  18. module_exit(hello_init);
  19.  
  20. MODULE_LICENSE("GPL");
  21. MODULE_AUTHOR("lpj");

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

driver/demo/Makefile

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

driver/demo/Kconfig

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

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

driver/Makefile

  1. obj-$(CONFIG_HELLODRV)+=demo/

driver/Kconfig

  1. source drivers/demo/Kconfig

arch/arm/Kconfig

  1. source "drivers/demo/Kconfig"

4进行系统配置并编译

  1. make menuconfig
  2. make

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

  1. lsmod
  2. 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. 明风:分布式图计算的平台Spark GraphX 在淘宝的实践

    快刀初试:Spark GraphX在淘宝的实践 作者:明风 (本文由团队中梧苇和我一起撰写,并由团队中的林岳,岩岫,世仪等多人Review,发表于程序员的8月刊,由于篇幅原因,略作删减,本文为完整版) ...

  2. iOS - 第三方框架 - AFN

    #5.AFNetworking 2.6使用方法 >2.6版本 支持 iOS7以上,而且支持NSURLConnectionOperation >3.0版本 支持 iOS7以上 NSURLCo ...

  3. iOS 真机测试的一些报错

    1.连了手机热点 fix Issue后出现提示框:No Devices Registered:Creating a provisioning profile requires one or more ...

  4. codeforces 676C C. Vasya and String(二分)

    题目链接: C. Vasya and String time limit per test 1 second memory limit per test 256 megabytes input sta ...

  5. 用xcode6.3编译早期工程时出现Undefined symbols for architecture x86_64错误的解决办法(转)

    Xcode升级到5.1 新特性之一就是默认让所有App都通过64位编译器编译.原来在Xcode5.0.x的时候默认的Standard architectures只有(arm7,armv7s),到5.1 ...

  6. backbone.Collection源码笔记

    Backbone.Collection backbone的Collection(集合),用来存储多个model,并且可以多这些model进行数组一样的操作,比如添加,修改,删除,排序,插入,根据索引取 ...

  7. Houdini FX 14 重磅推出!(附下载方式)

    把之前发布在新浪的博客搬过来了,新浪广告太多,影响阅读和观感,博客园很清净~ SideFX于2015年1月在官网发布Houdini FX 14,喜爱尝鲜.充满好奇心的我迫不及待的装上Apprentic ...

  8. SQL Server 2008R2 禁用远程连接

    很多人在开发过程中都会用多数据库(这里仅讨论MSSQL),也都会在服务器上装MSSQL,在你装上MSSQL后,机器上的1433端口就被激活了.如果你的服务器是在内网,也许不用过多的关注,如果你的服务器 ...

  9. 检测URL地址是否有响应

    今天突然出来了一个问题,URL地址调用导致程序卡死(原因是服务挂了,磁盘坏了) 然后想到了,再调用URL地址前先判断下地址是否有响应,这样不就可以解决问题了吗? C# 代码: /// <summ ...

  10. ajax请求简写

    <script type="text/javascript"> function changle() { $.post( "SendMail", / ...