华清远见嵌入式学习——day31A53内核模块

【一】、驱动

    作用:
        
        配置硬件设备处于某种模式,或提供配置硬件的方法。
        
        提供操作硬件设备的接口
        
    地位:
    
        内核与设备的桥梁

【二】、内核模块

    [1]. 内核模块
    
        .ko结尾的二进制文件
    
    [2]. 内核模块的编写
    
三要素:
        
    1. 入口(加载)函数注册  --->>> module_init();
    
        <linux/init.h>
        
        typedef int (*initcall_t)(void);
        module_init(initfn)
        
        
        int __init xxx(void)
        {
            ...
        }
    
    2. 出口(卸载)函数注册  --->>> module_exit();
    
        #define __exitcall(fn) \
        static exitcall_t p = fn
        typedef void (*exitcall_t)(void);
        
        void __exit xxx(void)
        {
            
        }
    
    3. GPL协议声明 --->>> MODULE_LICENSE("GPL");
    
===============================================================================

    4. MODULE_AUTHOR(_author)  //作者申明
    
    5. MODULE_DESCRIPTION(_description)  //模块功能简单的描述
    
            
    [附].sudo ctags -R  linux 内核创建索引
        

    [3]. 内核模块的编译
    
        1. 静态编译
        
            编译到内核镜像中 --->>> uIamge
        
        2. 动态编译
        
            编译生成ko模块
        
        3. 内部编译
        
            将源码(驱动)放到内核源码目录中进行编译
            
            1. 将写好的驱动源码放到相应的目录下(drivers/)

            2. 修改该目录下的Kconfig文件
            
            config DEMO
        
            tristate "farsight demo dmeo demo"
            default y 
        
            3. 修改该目录下的Makefile文件
            
             obj-$(CONFIG_DEMO)  += demo.o
            
            4. 回到内核源码顶层目录执行make menuconfig
            
                <M>:生成模块 
                <*>:编译到uImage镜像中
                < >:不编译
            
        4. 外部编译
        
            将源码(驱动)放到内核源码目录外进行编译
            
              1 KERNDIR := /lib/modules/`uname -r`/build
              2 PWD := $(shell pwd)
              3 
              4 obj-m += demo.o                                                                                
              5 
              6 all:
              7     make -C $(KERNDIR) M=$(PWD) modules
              8 
              9 
             10 clean:
             11     make -C $(KERNDIR) M=$(PWD) clean

    
    [4]. 内核模块的使用
    
        sudo insmod 模块全名           //加载到内核
        
        sudo rmmod  无后缀的模块名  //从内核中卸载模块
        
        dmesg   //查看内核打印信息
        
        sudo dmesg -c  //清除内核的打印信息(并显示)
        
        $modinfo demo.ko        //查看模块信息
        filename:       demo.ko
        license:        GPL
        description:    demo for stu...
        author:         www.hqyj.com
        srcversion:     2CF886F474DF23E0ED1E58C
        depends:        
        vermagic:       3.2.0-29-generic-pae SMP mod_unload modversions 686 
        
        $lsmod             //查看当前系统中加载的内核模块
        Module           Size  Used by
        demo             12454  0 

    [5]. 模块传参
    
       /******************************************************
        *功能:模块传参
        *参数:
        *        @name    参数名
        *        @type    参数数据类型 
        *                short, ushort, int, uint,
        *                long, ulong ,charp
        *        @perm    权限(八进制表示方式)
        *****************************************************/
        module_param(name, type, perm)

        /********************************************************************
        *功能:模块传参 --> 字符串
        *参数: 
        *        @name        外部传参名(通过insmod加载模块时传参使用的名字)
        *        @string     内部变量名
        *        @len        长度
        *        @perm          权限(八进制表示方式)
        ******************************************************************/
        module_param_string(name, string, len, perm)

        /******************************************************************
        *功能:模块传参 --> 数组 
        *参数: 
        *        @name        参数名
        *        @type        数组元素数据类型
        *        @nump        存放数组元素个数的地址
        *        @perm        权限(八进制表示方式)
        *****************************************************************/        
        module_param_array(name, type, nump, perm)
        
        $ sudo insmod demo.ko arr=4,4,4,4
    
        /* 求数组元素个数的宏函数 */
        #define ARRAY_SIZE(x) (sizeof(x)/sizeof((x)[0]))
    
    [6]. 模块的符号表导出
        
        
        EXPORT_SYMBOL(sym)        //需要导出的函数名
        EXPORT_SYMBOL_GPL(sym)
        
        将导出符号表文件(Module.symvers)拷贝到使用的模块目录下,再进行编译
    
【三】、printk打印级别

    /proc/sys/kernel
    
    4     4     1     7
    
    第一个字段:控制台日志级别
    第二个字段:默认日志级别
    第三个字段:最高日志级别
    第四个字段:最低日志级别
    

    
    
    
    
    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值