• Linux设备驱动01


    准备:

    1、英语-是工具

    2、电路原理图-补充“数电”的知识

    3、阅读内核代码的能力

    linux:vi+ctags+cscope

    windows:source insight

    驱动开发的步骤

    I、编辑

    模块的组成:

    1、许可证的声明,许可证通常使用GPL协议,如果不声明许可证内核会产生“抱怨”信息,同时内核中的一些遵循GPL协议的功能函数将会无法使用,造成驱动功能受限。

    2、加载函数,初始化模块,在使用insmod加载驱动模块时自动调用,该函数必须声明为int init_module(void),insmod调用时会自动加载这个函数。

    3、卸载函数,恢复函数,在使用rmmod卸载驱动模块时会自动调用,函数必须声明为void cleanup_module(void),rmmod会自动调用这个函数。

    完整示例代码:

    hello.c

    /**

    * 驱动示例程序

    * 实现驱动的加载和卸载

    */

    //引入相应的头文件,内核和模块的头文件

    #include <linux/kernel.h>

    #include <linux/module.h>

    //声明许可证信息,也可以使用这个来声明许可证

    //MODULE_LICENSE("Dual BSD/GPL")

    //这表示支持BSD和GPL两种协议

    MOUDLE_LICENSE("GPL");

    //insmod自动加载的函数,必须如此声明

    int init_module(void)

    {

    //内核中打印信息,需要使用printk函数

    printk("Hello world!!!");

    return 0;

    }

    //rmmod自动调用的函数,必须如此声明

    void cleanup_module(void)

    {

    printk("goodbey!!!");

    }

    保存

    II、编译

    使用内核的编译文件

    1、拷贝代码到内核文件中;

    2、修改对应的Kconfig/Makefile文件

    3、使用make menuconfig命令选中对应的菜单项,<*>表示编译进内核,<M>表示编译成模块。

    4、编译

    make zImage

    make modules

    前者编译内核,后者编译模块,编译完成后生成相应的xxx.ko文件。

    clip_image002

    外部模块的编译,上面的方法必须要到内核的源文件中修改Kconfig和Makefile,实际操作中比较复杂,通常我们会采用这种编译方法。

    使用内核文档查看编译的方法,进入Linux内核目录下的Documentation

    使用命令make –C <path-to-kernel> M=`pwd`命令进行编译,该命令的使用依赖于内核源码树,必须针对特定的硬件平台,并且有编译过的内核。

    clip_image004

    其中make -C /lib/modules/3.2.0-29-generic-pae/build M=`pwd`,使用该命令提示错误,是因为在当前目录中缺少Makefile文件,现在建立Makefile文件输入以下代码:

    obj-m += hello.o

    保存再次编译

    clip_image006

    编译通过。

    我们还可以通过一个通用的Makefile文件来完成这个步骤

    代码如下:

    ifeq ($(KERNELRELEASE),)

    KERNELDIR ?= /lib/modules/$(shell uname -r)/build

    PWD := $(shell pwd)

    modules:

    $(MAKE) -C $(KERNELDIR) M=$(PWD)

    clean:

    rm -rvf *.o *.ko *.mod.c module* Module*

    .PHONY:modules clean

    else

    #修改hello.o文件为自己需要的文件即可

    obj-m += hello.o

    endif

    编译生成hello.ko模块

    III、测试

    1、插入模块

    sudo insmod hello.ko

    当前的终端并没有显示输出的信息,这是因为终端默认会屏蔽掉所有的内核信息,解决方法有:

    1、切入物理终端

    2、使用dmesg显示当前的日志信息

    3、vi /var/log/messages显示日志信息

    clip_image008

    2、lsmod列出当前系统动态加载的模块

    3、rmmod hello 卸载模块,成功卸载的前提是存在/lib/modules/$(shell uname -r)/build目录

    4、modinfo显示模块的信息

    modinfo hello.ko显示如下信息:

    clip_image010

    5、modprobe 模块名-按依赖关系加载所有的模块,使用不多。

  • 相关阅读:
    Cipherlab CPT9300手持扫描枪开发体验 [转]
    引用(ajaxfileupload.js) ajaxfileupload.js报jQuery.handleError is not a function错误解决方法
    C#锐利体验2.0:泛型编程
    Visual C#中调用Windows服务初探
    C#操作XML代码整理
    个人代码库のC#背景色渐变的功能
    ~~ C#数字时钟 ~~
    DevExpress随笔10.1.5的汉化与破解
    用C#获取局域网内所有机器
    C# 图片格式(JPG,BMP,PNG,GIF)等转换为ICO图标
  • 原文地址:https://www.cnblogs.com/wangluojisuan/p/3364181.html
Copyright © 2020-2023  润新知