Linux下的misc設備驅動

文章目錄

  • 前言
  • 一、misc是什么?
  • 二、調用API
    • 1.注冊
    • 2.注銷
  • 三、驅動框架
  • 總結


前言

misc設備即雜項設備,Linux系統中類似按鍵、觸摸屏都有專門框架處理,類似adc、蜂鳴器等設備無法明確其屬于什么類型,一般就歸屬于雜項設備,按misc驅動框架編寫驅動程序。


一、misc是什么?

所有的 MISC 設備驅動的主設備號都為 10,不同的設備使用不同的從設備號。為了解決字符設備驅動的不斷增加。MISC設備會自動創建cdev,我們需要向Linux注冊一個miscdevice設備,是一個結構體,定義在文件 include/linux/miscdevice.h 中:

struct miscdevice {int minor; // 次設備號const char *name; // 設備名字	/dev目錄下生成設備文件const struct file_operations *fops; // 設備操作函數集合struct list_head list;struct device *parent;struct device *this_device;const struct attribute_group **groups;const char *nodename;umode_t mode;
};次設備號也可以用宏進行動態分配:MISC_DYNAMIC_MINOR	
也可以在 include/linux/miscdevice.h 中選,也可以自己定義,只要沒被使用

在這里插入圖片描述

二、調用API

1.注冊

函數如下:

int misc_register(struct miscdevice * misc)misc:要注冊的 MISC 設備。
返回值: 負數,失敗; 0,成功

可以代替以前字符驅動的這些步驟:

	alloc_chrdev_region(); /* 申請設備號 */cdev_init(); /* 初始化 cdev */cdev_add(); /* 添加 cdev */class_create(); /* 創建類 */device_create(); /* 創建設備 */

2.注銷

函數如下:

int misc_deregister(struct miscdevice *misc)misc:要注銷的 MISC 設備。
返回值: 負數,失敗; 0,成功。

可以代替以前字符驅動的這些步驟:

	cdev_del(); /* 刪除 cdev */unregister_chrdev_region(); /* 注銷設備號 */device_destroy(); /* 刪除設備 */class_destroy(); /* 刪除類 */

三、驅動框架

下面展示一個基本的misc驅動框架示例

#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_gpio.h>
#include <linux/platform_device.h>
#include <linux/leds.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/uaccess.h>struct myled_data {struct miscdevice mdev;int gpio;
};struct myled_data myled;int led_open (struct inode *a, struct file *b)
{return 0;
}ssize_t led_write(struct file *a, const char __user *b, size_t c, loff_t *d)
{char buf[5] = {0};int ret = 0;ret = copy_from_user(buf,b,c);if(ret < 0){printk("misc led failed to copy_from_user\n");return -EFAULT;}if(buf[0] == 0)gpio_set_value(myled.gpio,0);elsegpio_set_value(myled.gpio,1);return ret;
}struct file_operations fop = 
{.owner = THIS_MODULE,.open = led_open,.write = led_write,
};int led_probe(struct platform_device *pdev)
{int ret = 0;myled.gpio = of_get_named_gpio(pdev->dev.of_node,"led-gpio",0);ret = devm_gpio_request(&pdev->dev,myled.gpio,"LED GPIO");if(ret){dev_err(&pdev->dev,"devm_gpio_request failed !\n");return ret;}gpio_direction_output(myled.gpio,0);myled.mdev.name = "misc_led";myled.mdev.minor = MISC_DYNAMIC_MINOR;	//動態分配myled.mdev.fops = &fop;return misc_register(&myled.mdev);
}int led_exit(struct platform_device *pdev)
{misc_deregister(&myled.mdev);return 0;
}struct of_device_id led_of_match[] = {{.compatible = "misc_led"},
};struct platform_driver myled_driver = 
{.driver = {.name = "zynq_misc_led",.of_match_table = led_of_match,},.probe = led_probe,.remove = led_exit,
};module_platform_driver(myled_driver);MODULE_AUTHOR("LZW");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("MISC DRIVER BASE ON MISC FRAMEWORK");

編寫完ko成功加載后,即可在應用層像操作字符設備節點一樣,進行open,read,write等操作。


總結

以上就是今天要講的內容,本文簡單介紹了misc設備驅動的編寫及使用,制作不易,多多包涵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/43222.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/43222.shtml
英文地址,請注明出處:http://en.pswp.cn/web/43222.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Sqli-labs合集之環境搭建

Sqli-labs的搭建 搭建第一個SQL注入學習靶場環境&#xff1a; 軟件&#xff1a;sqli-labs 安裝過程&#xff1a; 1.源碼地址&#xff1a;GitHub - Audi-1/sqli-labs: SQLI labs to test error based, Blind boolean based, Time based.&#xff1b; 2.將壓縮包解壓到phpst…

PyCharm\VsCode——Python第三方庫下載換源

為什么要換源&#xff1f; Python第三方庫下載默認鏡像源在國外&#xff0c;因為特殊的原因在國內的你我利用這個鏡像源往往速度會非常地慢&#xff0c;因此為了提速將這個默認鏡像源換成國內的鏡像源是非常有必要的。 鏡像源的種類有哪些&#xff1f; 國外鏡像源——官方 http…

Python基礎學習筆記——異常

目錄 一、bug的簡介二、異常捕獲預處理機制1. 繼承2. 捕獲與預處理3. 嵌套與傳遞 一、bug的簡介 1947年&#xff0c;世界第一部萬用計算機的進化版——馬克2號&#xff08;Mark II&#xff09;的程序運行發生了異常&#xff0c;計算機程序之母格蕾絲經調試后&#xff0c;發現是…

C#實用的工具類庫

Masuit.Tools Masuit.Tools大都是靜態類&#xff0c;加密解密&#xff0c;反射操作&#xff0c;樹結構&#xff0c;文件探測&#xff0c;權重隨機篩選算法&#xff0c;分布式短id&#xff0c;表達式樹&#xff0c;linq擴展&#xff0c;文件壓縮&#xff0c;多線程下載&#xf…

非線性系列(三)—— 非線性求解器算法分類

1. 總體認知 CAE中的非線性方程組求解主要依賴牛頓法&#xff08;及牛頓法的變體&#xff09;&#xff0c;步驟如下 以線搜索方法為例&#xff0c;流程如下: 2. 方法分類 適用范圍大類小類描述牛頓法雅可比矩陣難獲取擬牛頓法 Broyden&#xff08;Secant method&#xff09;、…

DP(1) | Java | LeetCode 509, 70, 746 做題總結

509. 斐波那契數 https://leetcode.cn/problems/fibonacci-number/ 確定dp數組&#xff08;dp table&#xff09;以及下標的含義 dp[i] 第i個斐波那契數值為dp[i] 確定遞推公式 題目說了 F(n) F(n - 1) F(n - 2)dp數組如何初始化 題目說了 F(0) 0&#xff0c;F(1) 1確定遍歷…

15. Revit API: Transaction(事務)與 Failures(故障處理)

前言 UI講完&#xff0c;回到DB這塊兒。在Document那篇&#xff0c;提到增刪改查操作都是在Document上&#xff0c;是對Documet進行操作。 看到“增刪改查”這四個&#xff0c;想到什么了沒有&#xff1f; 數據庫&#xff08;DB&#xff09;嘛~話說那本經典的紅皮數據庫的書叫…

網絡安全----防御----防火墻安全策略組網

防火墻組網 要求&#xff1a; 1&#xff0c;DMz區內的服務器&#xff0c;辦公區僅能在辦公時間內(9:00-18:00)可以訪問&#xff0c;生產區的設備全天可以訪問。 2&#xff0c;生產區不允許訪問互聯網&#xff0c;辦公區和游客區允許訪問互聯網 3&#xff0c;辦公區設備10.0.…

計算機網絡之廣域網

廣域網特點: 主要提供面向通信的服務&#xff0c;支持用戶使用計算機進行遠距離的信息交換。 覆蓋范圍廣,通信的距離遠&#xff0c;需要考慮的因素增多&#xff0c; 線路的冗余、媒體帶寬的利用和差錯處理問題。 由電信部門或公司負責組建、管理和維護&#xff0c;并向全社會…

友思特方案 | 低延遲GigE Vision解決方案:用于紅外設備、醫療和工業級探測面板

導讀 維持實時視頻系統軟硬件的長期成本效益&#xff0c;是該系統在醫療、工業等領域廣泛應用的前提。友思特低延遲GigE Vision解決方案創新性地突破了這一難題&#xff0c;提供高帶寬且高可靠性的端到端網絡鏈接&#xff0c;有效降低了開發成本、復雜性和時間。 引言 雖然實…

DDoS攻擊詳解

DDoS 攻擊&#xff0c;其本質是通過操控大量的傀儡主機或者被其掌控的網絡設備&#xff0c;向目標系統如潮水般地發送海量的請求或數據。這種行為的目的在于竭盡全力地耗盡目標系統的網絡帶寬、系統資源以及服務能力&#xff0c;從而致使目標系統無法正常地為合法用戶提供其所應…

leetcode--從前序與中序遍歷序列構造二叉樹

leetcode地址&#xff1a;從前序與中序遍歷序列構造二叉樹 給定兩個整數數組 preorder 和 inorder &#xff0c;其中 preorder 是二叉樹的先序遍歷&#xff0c; inorder 是同一棵樹的中序遍歷&#xff0c;請構造二叉樹并返回其根節點。 示例 1: 輸入: preorder [3,9,20,15,…

vue學習day05-watch偵聽器(監視器)、Vue生命周期和生命周期的四個階段、、工程化開發和腳手架Vue cli

13、watch偵聽器&#xff08;監視器&#xff09; &#xff08;1&#xff09;作用&#xff1a;監視數據變化&#xff0c;執行一些業務邏輯或異步操作 &#xff08;2&#xff09;語法&#xff1a; 1&#xff09;簡寫語法——簡單數據類型&#xff0c;直接監視 ① Watch:{ 數…

[Flink]二、Flink1.13

7. 處理函數 之前所介紹的流處理 API,無論是基本的轉換、聚合,還是更為復雜的窗口操作,其實都是基于 DataStream 進行轉換的;所以可以統稱為 DataStream API ,這也是 Flink 編程的核心。而我們知道,為了讓代碼有更強大的表現力和易用性, Flink 本身提供了多…

一文入門【NestJs】Controllers 控制器

Nest學習系列 ??一文帶你入門【NestJS】 ??前言 流程圖 Controllers 控制器主要負責處理傳入請求&#xff0c;并向客戶端返回響應&#xff0c;控制器可以通過路由機制來控制接收那些請求&#xff0c;通常一個Controllers種會有多個匹配路由&#xff0c;不同的路由可以知…

Spring源碼二十一:Bean實例化流程四

上一篇Spring源碼二十&#xff1a;Bean實例化流程三中&#xff0c;我們主要討論了單例Bean創建對象的主要方法getSingleton的內部方法createBean&#xff0c;createBean方法中的resolveBeanClase方法與prepareMethodOverrides方法處理了lookup-method屬性與repliace-method配置…

MT3046 憤怒的象棚

思路&#xff1a; a[]存憤怒值&#xff1b;b[i]存以i結尾的&#xff0c;窗口里的最大值&#xff1b;c[i]存以i結尾的&#xff0c;窗口里面包含?的最大值。 &#xff08;?為新大象的位置&#xff09; 例&#xff1a;1 2 3 4 ? 5 6 7 8 9 則ans的計算公式b3b4c4c5c6b7b8b9…

三代測序結構變異分析 - 單樣本Germline SV calling和多樣本SV Calling

適用于三代PacBio HiFi / ONT 長reads數據的結構變異分析。 1. sniffles2安裝 sniffles2需要Python >= 3.10環境,因此用conda創建安裝好3.10的環境。 sniffles2安裝要求: Python >= 3.10pysam >= 0.21.0edlib >=1.3.9psutil>=5.9.4# 創建conda環境 conda c…

【記錄】LaTex|LaTex 代碼片段 Listings 添加帶圓圈數字標號的箭頭(又名 LaTex Tikz 庫畫箭頭的簡要介紹)

文章目錄 前言注意事項1 Tikz 的調用方法&#xff1a;newcommand2 標號圓圈數字的添加方式&#xff1a;\large{\textcircled{\small{1}}}\normalsize3 快速掌握 Tikz 箭頭寫法&#xff1a;插入點相對位移標號node3.1 第一張圖&#xff1a;插入點相對位移3.2 第二張圖&#xff1…

【MindSpore學習打卡】應用實踐-LLM原理和實踐-基于MindSpore實現BERT對話情緒識別

在當今的自然語言處理&#xff08;NLP&#xff09;領域&#xff0c;情緒識別是一個非常重要的應用場景。無論是在智能客服、社交媒體分析&#xff0c;還是在情感計算領域&#xff0c;準確地識別用戶的情緒都能夠極大地提升用戶體驗和系統的智能化水平。BERT&#xff08;Bidirec…