• 字符型设备驱动程序-first-printf以及点亮LED灯(一)


    学习使用 Linux 的  字符型设备驱动 来 进行 . 学习地址:http://edu.51cto.com/lesson/id-25710.html

    第一步: 首先写 三个函数 ,2017年5月17日15:59:06

    #include<stdio.h>
    
    #include <linux/init.h>
    #include <linux/module.h>
    #include <linux/interrupt.h>
    #include <linux/ioport.h>
    
    uint32_t first_Led_Open( void )
    {
        
        printf("first Led Open!
    ");
        
        return 0;
    }
    
    uint32_t first_Led_Write( void )
    {
        
        printf("first Led Write!
    ");
        
        return 0;
    }
    
    uint32_t first_Led_Read( void )
    {
        
        printf("first Led Read!
    ");
        
        return 0;
    }

    第二步:告诉 linux 内核 有这样三个函数 的 存在。2017年5月17日16:59:01

    //第二步:告诉Linux内核上面三个函数的存在,定义一个 struct file_operations, 并且赋初值,就是上面的三个函数
    
    static struct file_operations first_Led_Fops;
    
    first_Led_Fops.owner = THIS_MODULE;
    first_Led_Fops.open  = first_Led_Open;
    first_Led_Fops.Write = first_Led_Write;
    first_Led_Fops.Read  = first_Led_Read;
    
    //编写驱动的入口函数 ,调用上面的 结构体,向内核注册上面三个函数的 存在
    
    int first_Led_Init( void )
    {
        //调用 register_chrdev
        register_chrdev(major,"first_Led",&first_Led_Fops);
        return 0;
    }

     第三步:在Linux上电初始化的时候 调用这个函数。2017年5月17日18:45:24,所长

    //第三步:谁去调用上面这个函数?用一个宏来修饰一下上面这个函数。
    //我的理解:下面这个宏就是在给Linux系统上电初始化的时候 ,调用 会first_Led_Init函数。
    //一个 Linux设备中  肯定有很多需要初始化的函数,那每次都要 修改初始化的代码才能要把初始化加进去,所以Linux就
    //写了一个宏,在编译 的时候,把要初始化的函数编译进去(不知道先后顺序是怎么样的),2017年5月17日18:42:22,所长
    
    module_init(first_Led_Init);
    
    //前三步的笔记: APP 在利用open("/dev/xxx")中的xxx包含一个字符设备属性,一个major,一个mior
    //内核根据APP 提供的 字符设备属性+major(主设备号)就能找到我们注册进去first_Led_Fops这个结构体包含的三个函数。
    //APP 会根据 提供的是 字符设备属性 因此去 字符设备属性的数组中 查找 major 的位置 ,根据这个位置 first_Led_Fops
    //提供的 函数指针运行相应的函数。2017年5月17日18:44:10,所长。

     第四步:有入口函数 就有出口函数,即把注册的函数从内核中 删除掉。根据前三步的笔记得知 这一步实际操作就是 删除 字符设备数组 中 major 这一项。

    //第四步:编写驱动的出口函数 ,调用上面的 结构体,向内核申请删除 上面三个函数的 存在,在内核中。
    
    int first_Led_Exit( void )
    {
        //调用 unregister_chrdev
        //参数1:major 表示主设备号
        //参数2:name
    
        //我的理解是:
        //unregister_chrdev这个函数作用把 file_operations 结构 类型 从 字符设备数组中删除掉,数组位置是 major
    
        unregister_chrdev(major,"first_Led");
        return 0;
    }

    第五步:和入口函数一样 用宏来修饰 出口函数

    //第五步:和入口函数一样 用宏来修饰 出口函数
    
    module_exit(first_Led_Exit);
    
    //第五步总结:module_exit会定义一个结构体,会把first_Led_Exit赋值给这个结构体中的一员,当要卸载驱动程序的时候
    //即运行出口函数的时候,Linux内核就会自动调用结构体中的 first_Led_Exit这个函数。。暂时不理解,2017年5月17日19:03:30,所长

    第六步: 编写 Makefile ,在Linux下编译此文件。。2017年5月17日19:11:12

  • 相关阅读:
    创建窗体不抢夺焦点的方法
    控件绘制的四种方法
    ATL CAxWindow类创建问题一则
    PE文件版本那些事儿
    GDIPlus非典型误用一例
    stl 常用代码
    For each loop in Native C++
    win7 64 下 VS2008 调试、退出时错误的解决
    DailyWallpaper v1.03 released
    编程当道,学点Python技术好傍身
  • 原文地址:https://www.cnblogs.com/suozhang/p/6868413.html
Copyright © 2020-2023  润新知