sysfs_create_group創建sysfs介面

来源:https://www.cnblogs.com/linhaostudy/archive/2018/01/29/8377895.html
-Advertisement-
Play Games

在調試驅動,可能需要對驅動里的某些變數進行讀寫,或函數調用。可通過sysfs介面創建驅動對應的屬性,使得可以在用戶空間通過sysfs介面的show和store函數與硬體交互; Syss介面可通過sysfs_create_group()來創建,如果設備驅動要創建,需要用到函數巨集DEVICE_ATTR; ...


在調試驅動,可能需要對驅動里的某些變數進行讀寫,或函數調用。可通過sysfs介面創建驅動對應的屬性,使得可以在用戶空間通過sysfs介面的show和store函數與硬體交互;

 

Syss介面可通過sysfs_create_group()來創建,如果設備驅動要創建,需要用到函數巨集DEVICE_ATTR;

另外匯流排對應BUS_ATTR、設備驅動對應DRIVER_ATTR、類(class)對應CLASS_ATTR,均在kernel/include/linux/device.h下定義:

 1 //下麵的show和store只是簡單舉例
 2 static ssize_t gpio_show(struct device *d, struct device_attribute*attr, char *buf)
 3 {
 4        printk("gpio_show()\n");
 5        returnpr_info("store\n");
 6 }
 7  
 8 static ssize_t gpio_store(struct device *d, struct device_attribute *attr,const char *buf,size_t count)
 9 {
10        printk("gpio_store()\n");
11        returnpr_info("store\n");
12 }
13  
14 //用DEVICE_ATTR巨集創建屬性gpio文件,如果show()或是store()沒有功能,就以NULL代替
15 static DEVICE_ATTR(gpio, S_IWUSR |S_IRUGO, gpio_show, gpio_store);
16  
17 //屬性結構體數組最後一項必須以NULL結尾。
18 static struct attribute *gpio_attrs[] = {
19        &dev_attr_gpio.attr,
20        NULL
21 };

DEVICE_ATTR:

DEVICE_ATTR 的定義DEVICE_ATTR(_name,_mode, _show, _store);可知這裡gpio是name,mode是S_IWUSR |S_IRUGO,讀操作_show是gpio_show函數,寫操作_store 是gpio_store函數;

因為:

1 #define DEVICE_ATTR(_name, _mode, _show, _store) \
2     struct device_attribute dev_attr_##_name = __ATTR(_name, _mode, _show, _store)

device_attribute:

1 /* interface for exporting device attributes */
2 struct device_attribute {
3     struct attribute    attr;
4     ssize_t (*show)(struct device *dev, struct device_attribute *attr,
5             char *buf);
6     ssize_t (*store)(struct device *dev, struct device_attribute *attr,
7              const char *buf, size_t count);
8 };

 

 

 

Mode是許可權位,在kernel/include/uapi/linux/stat.h;

 1 #define S_IRWXU 00700 //用戶可讀寫和執行
 2 #define S_IRUSR 00400//用戶可讀
 3 #define S_IWUSR 00200//用戶可寫
 4 #define S_IXUSR 00100//用戶可執行
 5  
 6 #define S_IRWXG 00070//用戶組可讀寫和執行
 7 #define S_IRGRP 00040//用戶組可讀
 8 #define S_IWGRP 00020//用戶組可寫
 9 #define S_IXGRP 00010//用戶組可執行
10  
11 #define S_IRWXO 00007//其他可讀寫和執行
12 #define S_IROTH 00004//其他可讀
13 #define S_IWOTH 00002//其他可寫
14 #define S_IXOTH 00001//其他可執行

device_attribute結構體

為了使對屬性的讀寫變得有意義,一般將attribute結構嵌入到其他數據結構中。子系統通常都會定義自己的屬性結構,並且提供添加和刪除屬性文件的包裝函數,比如設備屬性結構體定義:

1 /* interface for exporting device attributes */  
2 struct device_attribute {  
3        struct attribute    attr;  
4        ssize_t (*show)(structdevice *dev, struct device_attribute *attr,  
5                      char*buf);  
6        ssize_t (*store)(structdevice *dev, struct device_attribute *attr,  
7                       const char *buf, size_t count);  
8 };

 

 

 

 

2.     定義attribute屬性結構體數組到屬性組中:

 1 static const struct attribute_group gpio_attr_grp = {
 2        .attrs = gpio_attrs,
 3 }
 4 我們這裡只有一個屬性結構體數組只有一個成員,可以有多個,比如:
 5 static struct attribute *gpio_keys_attrs[] = {
 6        &dev_attr_keys.attr,
 7        &dev_attr_switches.attr,
 8        &dev_attr_disabled_keys.attr,
 9        &dev_attr_disabled_switches.attr,
10        &dev_attr_test.attr,
11        NULL,
12 };

屬性attribute結構體定義:

1 struct attribute {  
2        const char           *name;  
3        umode_t                     mode;  
4 #ifdef CONFIG_DEBUG_LOCK_ALLOC  
5        bool                     ignore_lockdep:1;  
6        struct lock_class_key *key;  
7        struct lock_class_key skey;  
8 #endif  
9 };

創建sysfs介面後,就可以在adb shell 終端查看到和操作介面了。當我們將數據 echo 到介面中時,在用戶空間完成了一次 write 操作,對應到 kernel ,調用了驅動中的”store”。當我們cat一個介面時則會調用”show” 。這樣就建立了 android 層到 kernel 的橋梁,操作的細節在”show”和”store” 中完成的。

 

3.     創建屬性文件的sysfs介面:

1 ret = sysfs_create_group(&pdev->dev.kobj,&gpio_attr_grp);
2 sysfs_create_group()在kobj目錄下創建一個屬性集合,並顯示集合中的屬性文件。如果文件已存在,會報錯。
3  
4 //刪除介面
5 sysfs_remove_group(&pdev->dev.kobj,&gpio_keys_attr_group);
6 sysfs_remove_group()在kobj目錄下刪除一個屬性集合,並刪除集合中的屬性文件

 

 

 

 

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

-Advertisement-
Play Games
更多相關文章
  • 一、寫在前面 使用過分散式中間件的人都知道,程式員使用起來並不複雜,常用的客戶端 API 就那麼幾個,比我們日常編寫程式時用到的 API 要少得多。但是分散式中間件在中小研發團隊中使用得並不多,為什麼會這樣呢? 原因是中間件的職責相對單一,客戶端的使用雖然簡單,但整個環境搭起來卻不容易。所以對於系列 ...
  • 嘗試寫博客記錄自己開發過程中遇到的問題。 在開發後臺管理系統中的用戶管理的界面時遇到了兩個問題糾結了很久,浪費了不少時間。現將其記錄下來以做備忘。 1)在用Ligerui Grid控制項做表格數據展示的時候,日期格式化一直無法正確格式化,一直顯示我後臺傳過來的數據。 後來查找原代碼發現問題出在 Lig ...
  • private const string domainName = "本機IP地址或功能變數名稱"; private const string adAdmin = "管理員帳號"; private const string password = "管理員密碼"; private const string o... ...
  • Yum(全稱為 Yellow dog Updater, Modified) yum是一個在Fedora和RedHat以及CentOS中的Shell前端軟體包管理器。基於RPM包管理,能夠從指定的伺服器自動下載RPM包並且安裝,可以自動處理依賴性關係,並且一次安裝所有依賴的軟體包,無須繁瑣地一次次下載 ...
  • 一.創建文件系統的基本目錄: 可運行以下腳本自動創建: ~~~~ !/bin/sh echo " Create rootfs start " mkdir rootfs cd rootfs echo " Create root, dev .... " mkdir root dev etc boot t ...
  • 配額管理 配額綜述 實現配額的前提 設定配額 報告配額狀態 配額相關命令 ...
  • gpio調試的方式有很多,linux3.0以上ARM架構的處理器基本上都採用了DTS的方式,在linux3.0可以通過獲取sysfs的方式來獲取gpio狀態; sysfs文件系統的建立可以參照下麵的博客:http://www.cnblogs.com/linhaostudy/p/8377895.htm ...
  • vim編輯器 vi(visual interface) vim(vi improved) gvim(graph vim) vim vim打開文件 vim 的三種主要模式: vim的模式轉換 擴展模式進行的操作 命令模式進行的命令 編輯二進位文件 定製vim 的工作特性 vim高級 幫助 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...