许多语言,例如C,C++,JAVA等等都是从hello world开始的,因此我们的驱动程序的开发也要从hello world入手。

首先来看下我们的代码:

 1 /*********************************************************************************
 2  *      Copyright:  (C) 2016
 3  *                  All rights reserved.
 4  *
 5  *       Filename:  hello.c
 6  *    Description:  This file
 7  *
 8  *        Version:  1.0.0(2016年05月01日)
 9  *         Author:  xiaohexiansheng <wcchz@hotmail.com>
10  *      ChangeLog:  1, Release initial version on "2016年05月01日 19时08分42秒"
11  *
12  ********************************************************************************/
13 #include <linux/init.h>                     //只能用Linux里的头,所有的库函数都不能用,所有的Linux驱动必须包含的
14 #include <linux/module.h>                   //所有的内核模块都要包含的
15
16 MODULE_LICENSE("Dual BSD/GPL");                //是用来告知内核, 该模块带有一个自由的许可证; 没有这样的说明, 在模块加载时内核会抱怨。
17
18 static __init int hello_init(void)
19 {
20     printk(KERN_ALERT "hello world\n");        //KERN_ALERT是消息的优先级
21 //u-boot里有在bootargs设置loglevel=7,就是设置的打印级别,打印级别比7小的都可以打印
22     return 0;
23 }
24
25 static __exit void hello_exit(void)
26 {
27     printk(KERN_ALERT "goodbye!\n");
28 }
29
30 module_init(hello_init);                    //所有的驱动程序都是从module_init开始的
31 module_exit(hello_exit);

  上面的代码所有的程序都是从module_init函数开始的,module_init的使用是强制性的,这个宏会在模块的目标代码中增加一个特殊的段,用于说明内核初始化函数所在的位置。没有这个定义,初始化函数永远不会被调用

看起来so easy,代码写好了要编译了。就像当初改u-boot,内核一样,编译的时候要用到Makefile文件。

[xiaohexiansheng@centos6 hello]$ vim Makefile

 1 obj-m := hello.o                      //这个就是编译命令,不过这里的hello.o的文件名一定要与要编译的hello.c的文件名一致
 2
 3 modules:
 4     //sudo make -C /lib/modules/内核版本/build/ M=`pwd` modules
 5     sudo make -C /lib/modules/`uname -r`/build/ M=`pwd` modules
 6     make clean
 7
 8 //编译出来有很多中间文件,而我们只需要.ko的文件所以要把其他多余的文件删掉
 9 clean:
10     rm -f *.ko.* *.o *.mod.c *.order *.symvers   //清除多余的中间文件

[xiaohexiansheng@centos6 hello]$ make

make之后就可以看到一个hello.ko的文件

[xiaohexiansheng@centos6 hello]$ sudo insmod hello.ko

此时我们就装载好了我们的hello world的驱动,用lsmod命令即可查看:

[xiaohexiansheng@centos6 hello]$ lsmod
Module                  Size  Used by
hello                    559  0
fuse                   62472  0
ip6table_filter         2245  0
ip6_tables             10301  1 ip6table_filter

......

如果想要移除驱动模块,则用rmmod命令

[xiaohexiansheng@centos6 hello]$ sudo rmmod hello.ko

如果我们想要这个驱动在开发板上运行就要编译适用于开发板的hello.ko文件:

[xiaohexiansheng@centos6 hello]$ vim Makefile

 1 CC=/opt/buildroot-2012.08/arm920t/usr/bin/arm-linux-gcc              //指定交叉编译器的位置
 2 KDIR?=/home/xiaohexiansheng/fl2440/kernel/mylinux                     //指定内核的位置
 3 obj-m = hello.o
 4
 5 default:
 6     sudo $(MAKE) -C $(KDIR) M=`pwd` modules
 7     make clean
 8
 9 clean:
10     rm -f *.ko.* *.o *.mod.c *.order *.symvers

make之后跟上面的步骤一样,唯一的区别是装载驱动模块和移除驱动模块是不要加.ko的后缀。

转载于:https://www.cnblogs.com/xiaohexiansheng/p/5455576.html

fl2440hello world模块驱动编写相关推荐

  1. 对象式单片机外部模块驱动编写详解——DAC8552为例

    对象式单片机外部模块驱动编写详解--DAC8552为例 对象式驱动原理 DAC8552基本介绍 DAC8552驱动抽象 源码文件及其解释 参考资料 具体的代码和例程请参照以下GitHub仓库,记得给我 ...

  2. 集成式单片机外部模块驱动编写详解——AD5689为例

    集成式单片机外部模块驱动编写详解--AD5689为例 集成式驱动原理 AD5689基本介绍 AD5689驱动抽象及源码解释 源码 参考资料 具体的代码和例程请参照以下GitHub仓库,记得给我star ...

  3. 设备树下的platform 驱动编写

    目录 设备树下的platform 驱动简介 硬件原理图分析 实验程序编写 修改设备树文件 platform 驱动程序编写 编写测试APP 运行测试 编译驱动程序和测试APP 运行测试 上一章我们详细的 ...

  4. 华为4g模块 linux驱动程序,定制Android之4G-LTE模块驱动

    定制Android之4G-LTE模块驱动 一.        简介 本文讲述在Android内核中,添加中国移动4G-LTE制式华为MU909模块驱动,实现通过4G上网业务,电话业务,短信业务. CP ...

  5. linux设备驱动编写基础

    Linux设备驱动编写基础 一.linux中的驱动是以模块的形式存在的,这样就大大提高了驱动的灵活性,linux内核模块的程序结构如下: l  模块加载函数(必须):module_init() l  ...

  6. linux驱动编写(入门)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在我离职之前,工作内容几乎不涉及到驱动方面的知识.我所要做的内容就是把客户对设备的请求拆分成一 ...

  7. ARM+SD2405 IIC_RTC驱动编写及IIC通讯协议

    IIC通讯协议 协议简介 IIC(inter-integrated Circuit集成电路总线)总线支持设备之间的短距离通信,用于处理器和一些外围设备之间的接口,它需要两根信号线来完成信息交换,它是由 ...

  8. IMX6ull_Linux驱动编写(1)

    IMX6ull_Linux驱动编写-1 linux系统下程序编写架构分析 前言 整体分析 驱动大致框架介绍 Makefile文件 运行流程测试 linux系统下程序编写架构分析 前言   Linux属 ...

  9. RK3288 LED驱动编写准备

    3288LED驱动编写 1.LED硬件知识 2.GPIO的一般结构 3.普通的GPIO设置方法 4.GPIO寄存器的操作方法 5.3288的GPIO操作方法 5.1 怎么写LED驱动程序? 5.2 3 ...

最新文章

  1. linux apache 安装 rewrite,linux下单独编译安装Apache rewrite_module
  2. 字符串的方法、注释及示例1.
  3. linux awk 教程,linux awk使用
  4. mysql_real_escape_string 报错_addslashes与mysql_real_escape_string的区别
  5. LeetCode MySQL 569. 员工薪水中位数(over窗口函数)
  6. 顶会 | 腾讯AI Lab 9篇入选论文解读
  7. mysql5.1安装失败_解决MySQL5.1安装时出现Cannot create windows service for mysql.error:0
  8. 海明距离mysql查询_海量数据,海明距离高效检索(smlar) - 阿里云RDS PosgreSQL最佳实践-阿里云开发者社区...
  9. Android 系统(88)---Android关键字persistent
  10. Java Web项目 配置 ueditor心得
  11. 本地缓存到分布式缓存( Guava, Caffeine, Memcached, Redis)
  12. c语言散列表的长度为11,2011数据结构C语言模拟试题及答案.doc
  13. 使用Python写一个定时锁屏软件
  14. Ajax案例:简易的购书网页
  15. 中国石油大学c语言程序设计答案,中国石油大学C语言程序设计第一册在线作业答案...
  16. android模拟器 权限管理,Android模拟器上未授予权限
  17. 用户特殊权限SUID,SGID, SBIT理解学习
  18. 《重构-改善既有代码的设计》第三章(上)
  19. 微信小程序 实现 树形菜单其实很简单
  20. 兔子繁殖问题(C语言)

热门文章

  1. Linux中Shell重定向
  2. 怎么将电脑中的声音录制成WAV格式
  3. ExpandListView onChildClickListener 失效
  4. 操作系统复习笔记(二)
  5. 《大数据分析原理与实践》一一导读
  6. 一觉醒来感觉自己回到了九八年, 让大数据来解释
  7. 乔布斯《我生命中的三个故事》
  8. maven 编译后无配置文件解决办法
  9. 《Windows程序设计》第三章学习心得(1)|图解消息机制
  10. Visio的UML模板