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

首先来看下我们的代码:

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

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

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

[xiaohexiansheng@centos6 hello]$ vim Makefile

 obj-m := hello.o                      //这个就是编译命令,不过这里的hello.o的文件名一定要与要编译的hello.c的文件名一致

 modules:
//sudo make -C /lib/modules/内核版本/build/ M=`pwd` modules
sudo make -C /lib/modules/`uname -r`/build/ M=`pwd` modules
make clean //编译出来有很多中间文件,而我们只需要.ko的文件所以要把其他多余的文件删掉
clean:
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

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

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

fl2440hello world模块驱动编写的更多相关文章

  1. liunx中字符驱动编写的简单模板

    下面是关于字符驱动两个程序,主要是说明驱动编写的思想,理解驱动是怎么一步一步被实现的. 驱动的第一个实现程序,是相对于裸机编程的,主要是体会一下驱动编程思想: cdev.h: 所包含的头文件 #ifn ...

  2. AM335x(TQ335x)学习笔记——触摸屏驱动编写

    前面几篇文章已经通过配置DTS的方式完成了多个驱动的移植,接下来我们解决TQ335x的触摸驱动问题.由于种种原因,TQ335x的触摸屏驱动是以模块方式提供的,且Linux官方内核中也没有带该触摸屏的驱 ...

  3. linux模块驱动之led(ioremap)

    一:led内核驱动 (1)在编写led内核驱动时,我们首先要进行内核裁剪,因为友善之臂将LED灯的驱动默认加载到内核中,所以编写模块驱动程序前就要先把原先的LED灯驱动裁剪掉: led驱动在源码里面的 ...

  4. Linux驱动之按键驱动编写(中断方式)

    在Linux驱动之按键驱动编写(查询方式)已经写了一个查询方式的按键驱动,但是查询方式太占用CPU,接下来利用中断方式编写一个驱动程序,使得CPU占有率降低,在按键空闲时调用read系统调用的进程可以 ...

  5. Linux驱动之按键驱动编写(查询方式)

    在Linux驱动之LED驱动编写已经详细介绍了一个驱动的编写过程,接着来写一个按键驱动程序,主要是在file_operations结构中添加了一个read函数.还是分以下几步说明 1.查看原理图,确定 ...

  6. ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程

    ARM Linux驱动篇 学习温度传感器ds18b20的驱动编写过程 原文地址:http://www.cnblogs.com/NickQ/p/9026545.html 一.开发板与ds18b20的入门 ...

  7. v4l2驱动编写篇【转】

    转自:http://blog.csdn.net/michaelcao1980/article/details/53008418 大部分所需的信息都在这里.作为一个驱动作者,当挖掘头文件的时候,你可能也 ...

  8. nand flash详解及驱动编写

    https://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html#nand_ ...

  9. linux驱动学习笔记---实现中断下半部以及驱动编写规范(七)【转】

    转自:https://blog.csdn.net/weixin_42471952/article/details/81609141 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协 ...

随机推荐

  1. 数据安全之MD5、SHA-1、CRC32区别

    crc32 — 计算一个字符串的 crc32 多项式 生成 string 参数的 32 位循环冗余校验码多项式……:这句话从英文翻译过来的,不正确,准确的说应该是这么理解: 以32位循环冗余校验多项式 ...

  2. Linux的yum命令——(八)

    Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包管理,能够从指定的服务器自动下载 ...

  3. UVALIVE 5096 Volume

    This time your job is to calculate the volume of a special object. The object consists of two orthog ...

  4. kernelchina.org内核研究

    kernelchina.org 内核研究 转自:http://www.kernelchina.org

  5. ZJOI2006书架

    追yql做题记录的时候做到的……一道Splay模版题…… 啊LCT写久了都有点忘了Splay了(什么奇怪的逻辑?) 其实说白了五个操作: 1. 将某元素置顶:将元素旋到根,然后将左子树合并到该元素的后 ...

  6. JSOI2016酱油记

    高一,第一次参加NOIP. 后悔初中没有报过名...唉,后悔也来不及了. 不知道自己一个暑假干了什么...算法没学多少,脑子倒是越来越不好使了. 过了初赛,数周后一脸茫(meng)然(bi)地去考场. ...

  7. ie 下input光标位置垂直不居中问题

    input输入框用一个背景图模拟,设置height和line-height一样的高度,使里面的输入文字能够居中, 在FF下出现的情况是:点击input时,输入光标其实上跟input的height一样高 ...

  8. 【计算机网络】wireshark抓包分析1

    学习计算机网络很久了,但总是局限于书本知识,感觉get不到重点.经师兄建议用wireshark抓包分析看看. 我自己以前并没有做过抓包分析,所以这篇博文可能会有很多错误,只是我自己的一个记录,路过的亲 ...

  9. Stack的三种含义 ----超级经典 明白了 栈 的三种含义

    来自:http://www.ruanyifeng.com/blog/2013/11/stack.html ----------------------------------------------- ...

  10. linux常用命令 ps

    linux常用命令 ps Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些线程的快照,就是执行ps命令的那个时刻的那些进程 ...