zoukankan      html  css  js  c++  java
  • 4412 最简Linux驱动

    最简Linux驱动

    必备的头文件

    Linux头文件位置
    类似#include <linux/module.h>的头文件,它们是在Linux源码目录下的include/linux/module.h
    #include <linux/module.h>头文件
    所有的Linux 代码必须遵循GPL 协议,如果不知道Linux GPL 协议,去查一下资料
    如果你不声明GPL 协议,你的模块将无法在Linux 中使用的
    MODULE_LICENSE(_license)添加遵循GPL协议,必须的!
    MODULE_AUTHOR(_author)代码作者

    #include <linux/init.h>
    包含初始化宏定义的头文件,代码中的函数module_initmodule_exit在此文件中
    入口函数module_init(x)
    出口函数module_exit(x)
    新建.c文件
    mini_linux_module.c

    模块的入口和出口

    module_init(hello_init);
    /*初始化函数*/
    module_exit(hello_exit);
    /*卸载函数*/

    声明区

    声明区
    MODULE_LICENSE("Dual BSD/GPL");
    /*声明是开源的,没有内核版本限制*/
    必须有
    MODULE_AUTHOR("TOPEET");
    /*声明作者*/
    可有可无

    驱动模块的编译

    Linux的驱动可以和Linux源码放在一起编译,也可以单独拿出来编译。
    为了理解整个Linux内核编译过程,可以从学习Linux模块的编译入手
    Makefile文件
    单独编译驱动需要写一个Makefile文件
    编写Makefile文件的最好方式是依葫芦画瓢
    以后可能会碰到各种脚本,脚本的语法是学不完的

    编译流程分析

    编译文件

    拷贝两个文件到虚拟机,执行Make命令,编译生成KO文件
    window下写的Makefile文件拷贝到Linux中可能会有点小问题需要修改
    主要是Tab问题
    allclean参数后面的必须添加Tab键,否则会报错*** missing separator.Stop
    编译会生成KO文件,KO就是驱动模块

    加载模块和卸载模块

    开发板运行最小Linux系统
    使用U盘(或者TF卡),将KO文件拷贝到Linux最小系统
    最小系统给大家提供,直接烧写即可
    加载U
    参考使用手册
    加载模块、查看模块、卸载模块
    insmod加载模块命令
    lsmod查看模块命令
    rmmod卸载模块命令

    #include <linux/init.h>
    #include <linux/module.h>
    
    MODULE_LICENSE("Dual BSD/GPL");
    MODULE_AUTHOR("TOPEET");
    
    static int hello_init(void)
    {
        printk(KERN_EMERG "HELLO WORLD enter!
    ");
        return 0;
    }
    
    static void hello_exit(void)
    {
        printk(KERN_EMERG "HELLO WORLD exit!
    ");
        
    }
    
    module_init(hello_init);
    module_exit(hello_exit);

    makefile

    #!/bin/bash
    #通知编译器我们要编译模块的哪些源码
    #这里是编译itop4412_hello.c这个文件编译成中间文件itop4412_hello.o
    obj-m += mini_linux_module.o 
    
    #源码目录变量,这里用户需要根据实际情况选择路径
    #作者是将Linux的源码拷贝到目录/home/topeet/android4.0下并解压的
    KDIR := /home/topeet/android4.0/iTop4412_Kernel_3.0
    
    #当前目录变量
    PWD ?= $(shell pwd)
    
    #make命名默认寻找第一个目标
    #make -C就是指调用执行的路径
    #$(KDIR)Linux源码目录,作者这里指的是/home/topeet/android4.0/iTop4412_Kernel_3.0
    #$(PWD)当前目录变量
    #modules要执行的操作
    all:
        make -C $(KDIR) M=$(PWD) modules
            
    #make clean执行的操作是删除后缀为o的文件
    clean:
        rm -rf *.o *.order Module.symvers *.mod.c
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    237. Delete Node in a Linked List
    430. Flatten a Multilevel Doubly Linked List
    707. Design Linked List
    83. Remove Duplicates from Sorted List
    160. Intersection of Two Linked Lists
    426. Convert Binary Search Tree to Sorted Doubly Linked List
    142. Linked List Cycle II
    类之间的关系
    初始化块
    明确类和对象
  • 原文地址:https://www.cnblogs.com/ch122633/p/9435319.html
Copyright © 2011-2022 走看看