<optgroup id="vveti"><sup id="vveti"></sup></optgroup>
      <input id="vveti"><ruby id="vveti"><address id="vveti"></address></ruby></input>

      <delect id="vveti"></delect>
    1. 就是塔塔的個人空間 http://www.kongutransport.com/space-uid-136863.html [收藏] [復制] [分享] [RSS]

      博客

      Linux Misc 驅動-編寫驅動例程基于iTOP-STM32P157開發板

      已有 142 次閱讀2023-7-21 11:41

      首先我們回想一下注冊雜項設備的三大流程,我們在 Windows 上面新建 misc.c 文件,并用 sourceinsight
      打開。我們可以將上次編寫的 helloworld.c 里面的代碼拷貝到 misc.c 文件,并修改為如下圖所示

      添加頭文件

      /*注冊雜項設備頭文件*/

      #include <linux/miscdevice.h>

      /*注冊設備節點的文件結構體*/

      #include <linux/fs.h>

      填充 miscdevice 結構體

      struct miscdevice misc_dev = {

      .minor = MISC_DYNAMIC_MINOR, .name = "hello_misc", .fops = &misc_fops, };

      上述代碼第 2 行的 minor 為 MISC_DYNAMIC_MINOR,miscdevice 核心層會自動找一個空閑的次設備號,

      否則用 minor 指定的次設備號。上述代碼第 3 行 name 是設備的名稱,我們自定義為"hello_misc" 填充 file_operations 結構體

      struct file_operations misc_fops={

      .owner = THIS_MODULE

      };

      THIS_MODULE 宏是什么意思呢?它在 include/linux/module.h 里的定義是

      #define THIS_MODULE (&__this_module)

      它是一個 struct module 變量,代表當前模塊,可以通過 THIS_MODULE 宏來引用模塊的 struct module

      結構,比如使用 THIS_MODULE->state 可以獲得當前模塊的狀態。這個 owner 指針指向的就是你的模塊。

      注冊雜項設備并生成設備節點

      在 misc_init()函數中填充 misc_register()函數注冊雜項設備,并判斷雜項設備是否注冊成功。

      static int misc_init(void){

      int ret;

      ret = misc_register(&misc_dev); //注冊雜項設備

      if(ret<0) //判斷雜項設備是否注冊成功

      {

      printk("misc registe is error \n"); //打印雜項設備注冊失敗

      }

      printk("misc registe is succeed \n"); //打印雜項設備注冊成功

      return 0;

      }

      在 misc_exit()函數中填充 misc_deregister()函數注銷雜項設備。

      static void misc_exit(void){

      misc_deregister(&misc_dev); //注銷雜項設備

      printk("misc gooodbye! \n"); //打印雜項設備注銷成功

      }

      完整的代碼如下圖所示:

      /*

      * @Descripttion: 最簡單的雜項設備驅動

      * @version: 1.0

      * @Author: topeet */

      #include <linux/init.h> //初始化頭文件

      #include <linux/module.h> //最基本的文件,支持動態添加和卸載模塊。

      #include <linux/miscdevice.h> /*注冊雜項設備頭文件*/

      #include <linux/fs.h> /*注冊設備節點的文件結構體*/

      struct file_operations misc_fops = { //文件操作集

      .owner = THIS_MODULE};

      struct miscdevice misc_dev = {

      //雜項設備結構體

      .minor = MISC_DYNAMIC_MINOR, //動態申請的次設備號

      .name = "hello_misc", //雜項設備名字是 hello_misc

      .fops = &misc_fops, //文件操作集

      };

      static int misc_init(void)

      { //在初始化函數中注冊雜項設備

      int ret;

      ret = misc_register(&misc_dev);

      if (ret < 0)

      {

      printk("misc registe is error \n");

      }

      printk("misc registe is succeed \n");

      return 0;

      }

      static void misc_exit(void)

      { //在卸載函數中注銷雜項設備

      misc_deregister(&misc_dev);

      printk(" misc gooodbye! \n");

      }

      module_init(misc_init);

      module_exit(misc_exit);

      MODULE_LICENSE("GPL");

      現在最簡單的雜項設備的驅動就寫完了,那么接下來我們可以把這個驅動編譯一下,然后放到我們的

      開發板上面運行。我們編譯驅動,可以將它編譯進內核里面,也可以將它編譯成模塊。

      更多內容可以B站搜索:北京迅為



      路過

      雞蛋

      鮮花

      握手

      雷人

      評論 (0 個評論)

      facelist

      您需要登錄后才可以評論 登錄 | 立即注冊

      關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
      電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
      返回頂部
      亚洲日韩女同一区二区三区_久久久久久精品免费毛片_欧美日韩中文国产一区_肉末茄子的做法教学视频

        
        <optgroup id="vveti"><sup id="vveti"></sup></optgroup>
        <input id="vveti"><ruby id="vveti"><address id="vveti"></address></ruby></input>

        <delect id="vveti"></delect>