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
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    AndroidStudio开发体温上报系统------问题总结
    AndroidStudio--app是如何运行的
    sqlite操作
    sqlite数据库
    Android Service
    echart自定义主题
    vue监听数组变化
    Django:数据库驱动安装
    pycharm链接mysql报错: Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property manually.
    Django2.2:UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 9737: illegal multibyte sequence
  • 原文地址:https://www.cnblogs.com/ch122633/p/9435319.html
Copyright © 2011-2022 走看看