许多语言,例如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. 关于jQuery.extend

    这次来了解下jQuery的extend吧,作为菜鸟的我学艺不精,看插件时经常看到extend函数的使用,从网上看到一篇不错的介绍,特地转载过来留给自己收藏学习: ------------------- ...

  2. [Leetcode Week4]Merge Two Sorted Lists

    Merge Two Sorted Lists题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-two-sorted-lists/descrip ...

  3. ZigBee PHY层

    1. 介绍 ZigBee PHY层,即IEEE 802.15.4 PHY层,这里主要介绍了802.15.4-2003版本 PHY主要实现了如下功能 - 启动和关闭RF收发器 - 信道能量检测(Chan ...

  4. JAVA -- JDK JRE JAR

    转载:http://blog.csdn.net/wym19830218/article/details/5399401 JDK里面的工具也是用JAVA编写的,它们本身运行的时候也需要一套JRE,如C: ...

  5. python基础===正则表达式,常用函数re.split和re.sub

    sub的用法: >>> rs = r'c..t' >>> re.sub(rs,'python','scvt dsss cvrt pocdst') 'scvt dss ...

  6. Iphone安装Pinterest

    由于Pinterest在中国的app store下架了,也就搜索不到该应用.所以只能上美国的app store下载. 1,下载itunes,登录vpn,注册新的apple id: 2,手机连接vpn, ...

  7. AC日记——[SCOI2012]喵星球上的点名 bzoj 2754

    2754 思路: AC自动机暴力处理匹配: 强大的ac自动机,强大的fail树,强大的map,强大的vector,强大的指针: 代码: #include <map> #include &l ...

  8. 配置虚拟主机 和 打war包

    配置一台虚拟主机?        在[tomcat]/conf/server.xml文件中的<Engine>标签内部添加一个<Host>标签:            <H ...

  9. Visual Studio Code更改语言

    参数地址:Visual Studio Code 设置Display Language介绍 在Visual Studio Code中使用快捷键Ctrl + Shift + P可以打开命令行 在local ...

  10. 百度之星资格赛 2016 Problem 1004

    本文链接:http://www.cnblogs.com/Ash-ly/p/5494630.html 题意: 熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪 ...