zoukankan      html  css  js  c++  java
  • fl2440hello world模块驱动编写

    许多语言,例如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
    ");        //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!
    ");
    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的后缀。

  • 相关阅读:
    神兽保佑-代码无BUG
    HDU 1022 Train Problem I (数据结构 —— 栈)
    iOS开发
    漫谈程序猿系列:无BUG不生活
    王立平--Unity破解
    java远程调用rmi入门实例
    高仿美团iOS版,版本5.7
    JAVA日志系统
    读《互联网创业password》之随想
    解决iOS空指针数据的问题
  • 原文地址:https://www.cnblogs.com/xiaohexiansheng/p/5455576.html
Copyright © 2011-2022 走看看