linux驅動創建節點文件(device和class方式)

来源:https://www.cnblogs.com/liming111/archive/2023/03/18/17229959.html
-Advertisement-
Play Games

一、共用記憶體是什麼 在Linux系統中,共用記憶體是一種IPC(進程間通信)方式,它可以讓多個進程在物理記憶體中共用一段記憶體區域。 這種共用記憶體區域被映射到多個進程的虛擬地址空間中,使得多個進程可以直接訪問同一段物理記憶體區域中的數據,從而實現進程間的高速數據交換和通信。 二、共用記憶體的原理 共用記憶體基於 ...


概述

創建sys目錄下的屬性節點有三種方式

device_create_file
class_create_file
driver_create_file

我們常用的是第一個和第二個,這三者的主要區別在第一個參數上,device依賴於device節點,class依賴於class節點(class_create)

device_create_file 創建的屬性節點在device設備節點對應的路徑下,同理device也是

具體使用

class

我們一般是先創建class再創建device,所以以class創建設備節點為例

首先先創建類

class_create(owner, name)
  • owner:一般填寫THIS_MODULE
  • name:class的名字,在sys/class/下的文件夾名稱

再調用創建文件命令

class_create_file(struct class *class,
const struct class_attribute *attr)
  • class:我們創建返回的class結構體
  • attr: class_attribute結構體,也是我們下一步要填寫的參數

class_attribute結構體如下:

struct class_attribute {
struct attribute attr;
ssize_t (*show)(struct class *class, struct class_attribute *attr,
char *buf);
ssize_t (*store)(struct class *class, struct class_attribute *attr,
const char *buf, size_t count);
};
  • show也就是我們通過cat讀取時所執行的函數
  • store是通過echo命令所執行的函數
  • attr:attribute結構體,裡面有兩個參數name也就是文件的名稱,mode,對介面文件許可權的設置

上面store、show函數的具體實現是需要我們按上面的格式自己編寫函數

我們一般不會通過完成上面結構體的方式進行初始化,我們一般通過一下方式

static struct class_attribute k60168_Tran_With[] = {
    __ATTR(trans_with, 0664, NULL, k60168_trans_with),
    __ATTR_NULL,
};

__ATTR填入的就是我們上面所說的class_attribute的所有變數。

__ATTR_NULL也是必須的,具體是啥原因我也忘了

device

device節點依賴於class,所以device的創建也需要填寫一些class的參數。

首先也是先創建device

device_create(struct class *cls, struct device *parent,
     dev_t devt, void *drvdata,
     const char *fmt, ...);
  • parent:父節點,一般為NULL
  • devt:設備號
  • drvdata:設備可能會使用到的數據,一般為NULL,正點是這麼說的
  • fmt:在dev目錄下創建的子目錄的名稱

然後再調用創建函數

int device_create_file(struct device *device,
      const struct device_attribute *entry);

其結構和上面的class類似就不多說了

device_attribute的結構體如下:

struct device_attribute {
struct attributeattr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr,
char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr,
 const char *buf, size_t count);
};

也是通過如下的方式進行填充

static struct device_attribute k60168_Tran_With[] = {
    __ATTR(trans_with, 0664, NULL, k60168_trans_with),
    __ATTR_NULL,
};

註意是device_attribute不是class_attribute!!!!!!,我自己踩過的坑


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 之前,在使用異常捕獲語句try...catch...throw語句時,一直沒太留意幾種用法的區別,前幾天調試程式時發展找不到異常根源,無意中瞭解到幾種使用方法是有區別的。總結如下: 我們都知道,C#中使用throw和throw ex拋出異常,但二者是有區別的。 在C#中推薦使用throw;來拋出異常 ...
  • 1、高併發的情況,時常會發生數據不穩定的情況 在看本節內容之前,請先看上一章SqlServer 高併發的情況下,如何利用鎖保證數據的穩定性 本節內容,也是具體討論如何在EF中實現這些操作 2、場景模擬,同上一章,搶券 EF 不考慮高併發的情況下,搶券代碼為: string _currOwner = ...
  • 1.在自己電腦中找到Viual Studio Installer這樣一個文件,我自己的是在"C:\ProgramData\Microsoft\Windows\Start Menu\Programs"路徑下 若是找不到,也可以下載一個"everything"工具進行搜索,(這個比windows自帶的文 ...
  • #[EF Core] EF Core Code-First 移除外鍵 —— 重寫SQL生成器 使用EF Core時最煩的就是生成的某些 SQL 其實並不是你想要的結果,例如外鍵約束等等。 一個最簡單的例子就是,因為EF Core會根據導航屬性生成外鍵約束等原因,導致很多開發者拋棄了更易維護的Code ...
  • 1、OpenGL有多個標準,如Open ES是為了移動設備,目前通常使用OpenTK.Graphics.OpenGL4對應OpenGL4.x版本,2010年是OpenGL分割領,之前是3版本,之後都是4版本,目前最新4.6,更新頻率不高 2、OpenGL的著色語言GLSL,對應的文件擴展名.vert ...
  • 最近寫了一個demo:demo的github地址 一. 簡單介紹 1. Server端 它是一個WebApi服務,把它當成一個黑盒就行了。 2. MiddleServer端 是重點,它是一個WebApi服務,包含一個GetValues介面和一個Query2介面。 Query2介面是一個簡單的介面。 ...
  • Watchtower 是一個用於自動更新 Docker 容器的工具。它可以監視 Docker Hub 或私有倉庫中的鏡像,併在發現新的鏡像版本時自動更新容器。 ...
  • (文章目錄) 01、首先配置文件地址改了 地址為 ` /etc/NetworkManager/system-connections/網卡名 ` 網卡名可以使用 ip a查看,紅框中就是網卡名 網卡名 ls命令可以看到有以下配置文件 ` es160.nmconnection ` vi編輯 ` [con ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...