zoukankan      html  css  js  c++  java
  • Linux下编写互相通信的驱动模块并将其加入到内核中

    以Mini2440为例,其Linux内核目录为/opt/FriendlyARM/mini2440/linux-2.6.32.2,在linux-2.6.32.2(Linux内核目录)下的drivers目录下新建目录名为add_sub_Kconfig。

    在add_sub_Kconfig目录下新建文件add_sub.c,add_sub.h,test_communication.c,代码如下:(例子来自《Linux驱动开发入门与实践 第2版》)

    #ifndef ADD_SUB_H
    #define ADD_SUB_H
    
    long add_integer(int a, int b);
    
    long sub_integer(int a, int b);
    
    #endif
    #include <linux/init.h>
    #include <linux/module.h>
    
    #include "add_sub.h"
    
    long add_integer(int a, int b)
    {
        return a + b;
    }
    
    long sub_integer(int a, int b)
    {
        return a - b;
    }
    
    EXPORT_SYMBOL(add_integer);
    EXPORT_SYMBOL(sub_integer);
    
    MODULE_LICENSE("GPL");

    在add_sub.c中通过EXPORT_SYMBOL导出宏,是内核知道其定义的函数可以被其他函数使用。

    #include <linux/init.h>
    #include <linux/module.h>
    
    #include "add_sub.h"
    
    static int a = 1;
    static int b = 1;
    static int AddOrSub = 1;
    
    static int test_init(void)
    {
        int result = 0;
        printk("test init
    ");
    
        if(AddOrSub == 1)
        {
            result = add_integer(a, b);
        }
        else
        {
            result = sub_integer(a, b);
        }
        printk("The %s result is %d
    ", AddOrSub == 1 ? "Add" : "Sub", result);
    
        return 0;
    }
    
    static void test_exit(void)
    {
        printk("test exit
    ");
    }
    
    module_init(test_init);
    module_exit(test_exit);
    
    module_param(a, int, S_IRUGO);
    module_param(b, int, S_IRUGO);
    module_param(AddOrSub, int, S_IRUGO);
    
    MODULE_LICENSE("GPL");

    在test_communication.c中通过包含add_sub.h文件引入函数,即可使用。而module_param是模块加载是引入的参数。

    在add_sub_Kconfig目录下新建Kconfig文件,有两个模块,这里构造一个菜单把它们包含进来。tristate表示模块可以选择编译进内核还是作为独立的模块,默认值m表示独立的模块。如果希望直接编译进内核可以使用boolean,然后默认值改为y。

    menu "ADD_SUB_FUNCTION"
        comment "ADD_SUB_FUNCTION"
    
    config ADD_SUB
        tristate "ADD_SUB support"
        default m
    
    config TEST_COMMUNICATIONA
        tristate "ADD_SUB test support" 
        depends on ADD_SUB
        default m
    
    endmenu

    在add_sub_Kconfig目录下新建Makefile文件,在Kconfig中的config后写了ADD_SUB和TEST_COMMUNICATION,此处则写CONFIG_ADD_SUB和CONFIG_TEST_COMMUNICATION:

    obj-$(CONFIG_ADD_SUB) += add_sub.o
    obj-$(CONFIG_TEST_COMMUNICATION) += test_communication.o

    在drivers目录下的Kconfig文件中添加:

    source "drivers/add_sub_Kconfig/Kconfig"

    在drivers目录下的Makefile文件中添加:

    obj-$(CONFIG_ADD_SUB) += add_sub_Kconfig/

    obj-$(CONFIG_TEST_COMMUNICATION) += add_sub_Kconfig/

    回到/opt/FriendlyARM/mini2440/linux-2.6.32.2目录,执行:

    make menuconfig,然后确认添加的模块已经打开。(此处选m编译为ko模块)

    make modules,即可看到在add_sub_Kconfig目录下编译出的两个ko文件。

    将两个ko文件下载到Mini2440上测试。

  • 相关阅读:
    打印java 对象信息的小技巧
    git 忽略已经跟踪文件的改动
    mysql主从备份方案
    Lucene4.3和Lucene3.5性能对比(二)
    Lucene4.3和Lucene3.5性能对比(一)
    Cracking the coding interview--Q1.1
    CRACKING THE CODING INTERVIEW 笔记(1)
    关于名称重整(name mangling)、多态性的一些简单介绍
    shell中sed用法
    GDB调试GCC(jRate)
  • 原文地址:https://www.cnblogs.com/chujian1120/p/5944884.html
Copyright © 2011-2022 走看看