在驅動中新增syfs系統介面

2021-07-06 05:55:08 字數 3064 閱讀 3632

近日研究紅外感測器驅動,發現adb shell進入sys/kernel目錄下存在pac7673資料夾,其中實現兩個介面,分別是enable_proximity和poll_period_ms_proximity,同過echo和cat分別可以對這兩個介面進行讀和寫,我們來看下在驅動中他是如何實現的。

首先在紅外感測器pac7673驅動包含了pac7673.h這個標頭檔案,裡面先定義了乙個結構體

struct sensor_device_attribute;
其中結構體device_attribute在device.h中定義,路徑為kernel/include/linux/device.h。

還有這樣的巨集定義:

#define sensor_attr(_name, _mode, _show, _store, _index)    \

#define sensor_device_attr(_name, _mode, _show, _store, _index) \

struct sensor_device_attribute sensor_dev_attr_##_name \

= sensor_attr(_name, _mode, _show, _store, _index)

函式巨集device_attr內封裝的是__attr(_name,_mode,_show,_stroe)方法,_show表示的是讀方法,_stroe表示的是寫方法。

當然_attr不是獨生子女,他還有一系列的姊妹__attr_ro巨集只有讀方法,__attr_null等等

如對裝置的使用 device_attr,對匯流排使用 bus_attr,對驅動使用 driver_attr ,對類 別 (class) 使用 class_attr, 這四個高階的巨集來自於

typedef

struct pac7673_data_t;

接下來在probe函式中做了如下處理

pac7673data.kobj = kobject_create_and_add("pac7673", kernel_kobj);

if (!pac7673data.kobj)

err = sysfs_create_group(pac7673data.kobj, &pac7673_attribute_group);

if (err)

先通過kobject_create_and_add(「pac7673」, kernel_kobj)建立了乙個名為pac7673的資料夾,再通過sysfs_create_group(pac7673data.kobj, &pac7673_attribute_group)建立目錄下的屬性檔案組

,其中pac7673_attribute_group使我們自定義的相關屬性檔案,這樣我們就在檔案系統註冊了這樣的乙個介面。

接下來就是對介面的一些配置

static

sensor_device_attr(enable_proximity, s_irugo | s_iwugo,

pac7673_show_enable, pac7673_store_enable, 0);

static

sensor_device_attr(poll_period_ms_proximity, s_irugo | s_iwugo,

pac7673_show_polling_rate, pac7673_store_polling_rate, 0);

這樣就在pac7673目錄下生成兩個檔案介面enable_proximity和poll_period_ms_proximity。

再把這兩個介面新增到屬性組中去

static

struct attribute *pac7673_attributes = ;

static

const

struct attribute_group pac7673_attribute_group = ;

結構體陣列pac7673_attributes中成員變數的名字必須是&sensor_dev_attr_enable_proximity.dev_attr.attr和&sensor_dev_attr_poll_period_ms_proximity.dev_attr.attr。

最後再來看具體的功能函式的實現

static ssize_t pac7673_show_enable(struct device *dev,

struct device_attribute *attr,

char *buf)

static ssize_t pac7673_store_enable(struct device *dev,

struct device_attribute *attr,

const char *buf, size_t size)

atomic_set(&pac7673data.enabled, !!enable);

if (!!enable) else

return size;

}

這兩個函式分別是實現enable_proximity介面的讀寫功能。

static ssize_t pac7673_show_polling_rate(struct device *dev,

struct device_attribute *attr,

char *buf)

static ssize_t pac7673_store_polling_rate(struct device *dev,

struct device_attribute *attr,

const

char *buf, size_t size)

這兩個函式是實現poll_period_ms_proximity介面讀寫功能。

上面幾個函式功能是對pac7673_data_t結構體中定義的atomic_t enabled和atomic_t period_ms這兩個引數進行讀寫。分別控制的是中斷的使能和工作佇列的延時時間。

到這兩個syfs系統介面就實現了。

在linux核心驅動樹中新增自己的驅動

在linux核心驅動樹中新增自己的驅動 例如在linux 2.6.x.x drivers char中新增驅動目錄lzp iic 1 在linux 2.6.x.x drivers char目錄下新增lzp iic目錄,並在lzp iic目錄新增kconfig和makefile kconfig 內容 a...

在source insight 中新增系統字型

在 source insight 中新增系統字型 1.控制面板 字型 找到courier new 建議用這個字型,比 courier 要平滑 然後選中該字型,右鍵,選擇顯示。2.重啟 source insight 3.options document options screen fonts 4.如...

在Wince的Catalog中新增驅動元件

在wince6.0 和wince7.0中已經沒有cec檔案管理器,因此需要手動修改相應的.pbcxml檔案將自己的驅動新增到catalog目錄裡,以向catalog device drivers display 新增驅動元件為例,環境為wince6.0 1.開啟路徑 winceroot public...