1. 程式人生 > >在sys目錄下建立屬性檔案 sysfs_create_group()

在sys目錄下建立屬性檔案 sysfs_create_group()

正常情況下, 我們可以通過module_param()在module相應目錄下建立一個檔案, 以用作user space與kernel space的互動.

如果需要在/sys/bus/usb/devices/usbx目錄下建立相應檔案, 則需要用到sysfs_create_group()函式。 

// 初始化一個全域性變數epStatusErr_default , 即最終在sys目錄下產生的屬性檔案unsigned epStatusErr_default = 0;

EXPORT_SYMBOL_GPL(epStatusErr_default);

Module_param(epStatusErr_default

, int,S_IRUGO|S_IWUSR);

MODULE_PAR_DESC(epStatusErr_default,

“Default USB endpoint status: 0 is ep enough, 1 is not enough”);

// usb_host_epStatusErr_default_show/ usb_host_epStatusErr_default_store對應檔案的讀/寫//操作. 在命令列通過echo向epStatusErr_default寫資料將會呼叫到store, cat命令讀資料時//則會呼叫到show.

static ssize_tusb_host_epStatusErr_default_show(

struct device *dev,

struct device_attribute *attr,

char *buf)

{

 Return 0;

}

static ssize_tusb_host_epStatusErr_default_store(struct device *dev,

struct device_attribute *attr,

const char*buf, size_t size)

{

          Return0;

}

// --------------------

static DEVIC_ATTR(epStatusErr_default,0644,

usb_host_epStatusErr_default_show,

usb_host_epStatusErr_default_store);

static struc attribute *usb_endpoint_status[] = {

         &dev_attr_epStatusErr_default.attr,

         NULL,

};

Static struct attribute_groupusb_endpoint_status_group={

         .name= NULL,

         .attrs= usb_endpoint_status,

};

//在初始化時,呼叫sysfs_create_group()來建立sysfs 

Retval = sysfs_create_group(&rhdev->dev.kobj,&usb_endpoint_status_group);

If(retval < 0)

{

         printk(KERNEL_ERR“Cannot register USB endpoint status: %d\n”,retval);

         gotoerror_create_attr_group;

}

//在退出時,呼叫sysfs_remove_group()來刪除sysfs

Sysfs_remove_group(&rhdev->dev.kobj,&usb_endpoint_status_group);

---------------- cut line  -------- chrovery ----------

原以為故事到這裡可以結束了, 結果不知道LG的哪個engineer抽風,要求將parameter的路徑從 /sys/bus/usb/devices/usb1 換到/sys/bus/usb/devices/1-0:1.0 . 好端端的usb1 / usb2 /usb3路徑多好,分別代表controller host 1/2/3 , 簡潔不缺詳實, 明確不乏生動. 卻偏偏要求改到1-0:1.0/ 2-0:1.0 / 3-0:1.0.

只能來看看代表interface的1-0:1.0下面有哪些變量了

[email protected]:/sys/bus/usb/devices/1-0:1.0# ls

bAlternateSetting

bInterfaceClass

bInterfaceNumber

bInterfaceProtocol

bInterfaceSubClass

bNumEndpoints

driver

ep_81

modalias

port1

power

subsystem

supports_autosuspend

uevent

350 /*USB_DT_INTERFACE: Interface descriptor */
351 struct usb_interface_descriptor{
352         __u8  bLength;
353         __u8  bDescriptorType;
354
355         __u8  bInterfaceNumber;
356         __u8  bAlternateSetting;
357         __u8  bNumEndpoints;
358         __u8  bInterfaceClass;
359         __u8  bInterfaceSubClass;
360         __u8  bInterfaceProtocol;
361         __u8  iInterface;
362 } __attribute__((packed));
363
364 #define USB_DT_INTERFACE_SIZE           9

第一步先在該結構體中增加一個成員變數:

__u8  epStatusErr;

然後在sysfs.c裡面新增如下操作

<span style="color: rgb(120, 120, 120);">831 usb_intf_attr(bInterfaceNumber, "%02x\n")
832 usb_intf_attr(bAlternateSetting, "%2d\n")
833 usb_intf_attr(bNumEndpoints, "%02x\n")
834 usb_intf_attr(bInterfaceClass, "%02x\n")
835 usb_intf_attr(bInterfaceSubClass, "%02x\n")
836 usb_intf_attr(bInterfaceProtocol, "%02x\n")
</span><span style="color:#ff0000;">837 usb_intf_attr(epStatusErr,  "%02x\n")</span><span style="color:#787878;">
</span>

<span style="color:#787878;">903 static struct attribute *intf_attrs[] = {
904         &dev_attr_bInterfaceNumber.attr,
905         &dev_attr_bAlternateSetting.attr,
906         &dev_attr_bNumEndpoints.attr,
907         &dev_attr_bInterfaceClass.attr,
908         &dev_attr_bInterfaceSubClass.attr,
909         &dev_attr_bInterfaceProtocol.attr,
910         &dev_attr_modalias.attr,
911         &dev_attr_supports_autosuspend.attr,
9xx	    </span><span style="color:#ff0000;">&dev_attr_epStatusErr.attr,</span><span style="color:#787878;">
912         NULL,
913 };
</span>

這樣在1-0:1.0 / 2-0:1.0 / 3-0:1.0目錄下就生成了epStatusErr這個檔案了. 當然不僅限於這三個目錄下,因為我們所修改的是interfacedescriptor structure, 所以在

/sys/bus/usb/devices目錄下有關interface的都會包含該變數.

1-0:1.0      1-1.1.2:1.0  1-1.1.2:1.4  1-1.1:1.0    2-0:1.0      usb3

1-1         1-1.1.2:1.1  1-1.1.2:1.5  1-1.2       3-0:1.0

1-1.1       1-1.1.2:1.2  1-1.1.3      1-1.2:1.0    usb1

1-1.1.2      1-1.1.2:1.3 1-1.1.3:1.0  1-1:1.0     usb2

簡要提一下Linux/drivers/usb/core/sysfs.c這個檔案, 從目錄結構來看, 基本可以斷定該檔案是用於建立和usb相關的system file.

結構比較簡單, 巨集定義了show函式, 通過cat檢視該parameter時即呼叫的該function.

818 /* Interface fields */
819 #define usb_intf_attr(field, format_string)                             \
820 static ssize_t                                                          \
821 show_##field(struct device *dev, struct device_attribute *attr, \
822                 char *buf)                                              \
823 {                                                                       \
824         struct usb_interface *intf = to_usb_interface(dev);             \
825                                                                         \
826         return sprintf(buf, format_string,                              \
827                         intf->cur_altsetting->desc.field);              \
828 }                                                                       \
829 static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL);
830 
831 usb_intf_attr(bInterfaceNumber, "%02x\n")
832 usb_intf_attr(bAlternateSetting, "%2d\n")
833 usb_intf_attr(bNumEndpoints, "%02x\n")
834 usb_intf_attr(bInterfaceClass, "%02x\n")
835 usb_intf_attr(bInterfaceSubClass, "%02x\n")
836 usb_intf_attr(bInterfaceProtocol, "%02x\n")
<span style="color:#ff0000;">837 usb_intf_attr(epStatusErr,  "%02x\n")</span>

 下一步就是如何給epStatusErr賦值了, 這裡所定義的epStatusErr用來表示當前port EP 是否足夠, 如果不夠則寫1, 否則寫0. 因此寫1的動作放在MGC_CheckFreeEndpoint() 
Struct usb_device *parent;
for(parent = dev->parent; parent->parent; parent = parent->parent);
parent->config->interface[0]->cur_altsetting->desc.epStatusErr = 0x1;

首先通過for迴圈得到root hub的device structure, 然後通過一系列操作將0x1 寫到epStatusErr這一個變數.


相關推薦

sys目錄建立屬性檔案 sysfs_create_group()

正常情況下, 我們可以通過module_param()在module相應目錄下建立一個檔案, 以用作user space與kernel space的互動. 如果需要在/sys/bus/usb/devices/usbx目錄下建立相應檔案, 則需要用到sysfs_create_

android在當前app的目錄建立一個檔案

/*********************************************************************  * Author  : Samson  * Date    : 04/22/2014  * Test platform:  *              3.11.0

sys目錄常用檔案彙總

1. /sys/kernel/debug/gpio 可以實時反饋系統中感興趣的gpio引腳的狀態 [email protected]:/sys/kernel/debug# cat gpio gpiochip7: GPIOs 356-359, parent: platform/e6

關於普通使用者不能在root目錄建立檔案目錄的總結

初學linux,對root使用者及普通使用者的許可權不太理解。實際上,一般情況下普通使用者不能在root目錄下建立檔案及目錄,因為沒有許可權,會提示“不能在XXX建立新檔案”。普通使用者要想在root下擁有建立新檔案的許可權,必須在擁有root使用者的許可權下,修改普通使用

egret微信小遊戲在本地使用者檔案目錄建立檔案並讀取內容

Platform.ts新增 declare interface Platform { getUserInfo(): Promise<any>; login(): Promise<any> getFileData(fi

Linux中想進入一個目錄、 在目錄建立檔案、在檔案內部刪除檔案 各需要什麼許可權?

1.想進入一個目錄需要什麼許可權? 首先我們在超級使用者下建立一個dir_root目錄,並且取消它的所有許可權chmod 000 dir_root 當我們想進入dir_root目錄下的時候,發現就算dir_root對擁有者沒有讀、寫、可執行許可權,超級使用者依然可以進入

解決:Android使用自帶sqlite開發時,apk中建立的資料庫外部的程序是沒有許可權去讀/寫的,而且無法如何讀取指定目錄的db檔案

SQLiteOpenHelper是Android框架為我們提供的一個非常好的資料庫開啟、升級與關閉的工具類。但是這個工具類會自動把db檔案建立到“ /data/data/com.*.*(package name)/” 目錄下,這麼做可能是與Android檔案系統的設計思路

MySQL 5.7.19安裝目錄建立my.ini檔案

基本內容如下 [mysqld] character-set-server=utf8 #繫結IPv4和3306埠 bind-address = 0.0.0.0 port = 3306 # 設定mysql的安裝目錄 basedir=F:/test/mysql-5.7.19-wi

在Linux進入目錄目錄建立、修改、刪除檔案所需許可權

首先,我們用root許可權建立一個目錄名為dir, 此時檔案擁有者對改目錄具有讀、寫和執行許可權,所屬組和other對改目錄具有讀和執行許可權。現在去除dir的所以許可權, 此時dir目錄的

使用C++獲取目錄的指定檔案:結構體_finddata_t 以及函式_findfirst、_findnext、_fineclose

    獲取資料夾裡面下面的相同的檔案是經常用的一個操作,比如我們需要獲取檔案下面所有的.exe檔案,這個時候我們就需要一個結構體和三個函式來幫助我們。     首先需要的結構體:struct _finddata_t     這

php讀取目錄的所有檔案

<?php $path = './use'; $result = scanFile($path); function scanFile($path) { global $result; $files = scandir($path); foreac

bat替換父目錄不同名子檔案的相同檔案

rem 一個目錄下面有多層目錄,很多目錄中都含有一個1.txt檔案,現在要用一個同名檔案將多個目錄中的這個檔案替換,請問用批處理如何做? @echo off for /f "delims=" %%i in ('dir /a-d /b /s D:\test\1.txt') do (   &n

c++ include包含工程目錄的.h檔案,報錯:fatal error C1083: 無法開啟包括檔案:“Sales_item.h”: No such file or directory

背景:刷c++primer的題目,將下載的某個標頭檔案拖拽到自己建立的工程目錄下,在自己新建的原始檔中include包含時,報無法開啟檔案 明明有檔案 為什麼說無法開啟呢 於是到本地的工程目錄中開啟一看,果然沒有這個檔案 說明通過滑鼠拖拽檔案進入到工程樹上面,檔案並沒

Python 讀取某個目錄所有的檔案 -- untested

# coding=utf-8 #Python 讀取某個目錄下所有的檔案例項 import os import os.path import re import sys import codecs reload(sys) sys.setdefaultencoding('utf-8') path

【轉載】linux查詢目錄的所有檔案中是否含有某個字串

連結自 http://blog.sina.com.cn/s/blog_691a84f301015khx.html,並略加修訂。 https://www.cnblogs.com/snake553/p/5804181.html  這個顯示的更美觀 查詢目錄下的所有檔案中是否含

python獲取目錄所有的檔案並修改檔名(隨機8位字元竄名字)

class ChangeName(object): def getRandom(self): seed = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" sa = [] for

易語言基礎——遍歷指定目錄的所有檔案(包含子目錄中的檔案

1.實現效果: 尋找指定目錄下的檔案(包括子目錄中的檔案) 2.知識點: 尋找到的檔名 = 尋找檔案 (檔案目錄 + “\*.*”,1 + 2 + 4 + 16 + 32 ), *.*為正則表示式的寫法,*是萬用字元; 尋找到的檔名 = 尋找檔案 (, 1 + 2 + 4 + 16 + 32

linux怎麼實時檢視目錄是否有檔案生成 crunch--字典生成工具

安裝inotify-tools $ sudo apt install inotify-tools -y   建立資料和日誌目錄 $ sudo mkdir -p /tmp/inotifywait/log/ /tmp/inotifywait/data/   建立

【Matlab轉換csv】將當前目錄面的csv檔案轉換.mat檔案

clear clc close all; % get file names file_names = dir('*.csv'); var_names = []; for i = 1 : numel(file_names) file_name = file_names(i).nam

git忽略版本控制目錄,指定檔案

我們想把檔案從 Git 倉庫中刪除(亦即從暫存區域移除),但仍然希望保留在當前工作目錄中。 換句話說,你想讓檔案保留在磁碟,但是並不想讓 Git 繼續跟蹤。 當你忘記新增 .gitignore 檔案,不小心把一個很大的日誌檔案或一堆 .a 這樣的編譯生成檔案新增到暫存區時,這一做法尤其有用。