DEVICE_ATTR

使用DEVICE_ATTR,可以在sys fs中添加“文件”,通過修改該文件內容,可以實現在運行過程中動態控制device的目的。

這樣方便用戶空間調試。

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/delay.h>
#include <linux/mutex.h>
#include <linux/sysfs.h>
#include <linux/mod_devicetable.h>
#include <linux/log2.h>
#include <linux/bitops.h>
#include <linux/jiffies.h>
#include <linux/of.h>
#include <linux/acpi.h>
#include <linux/i2c.h>
#include <linux/platform_data/at24.h>


static struct kobject *spi_obj;


static ssize_t cmd_show(struct device *dev,struct device_attribute *attr, char *buf)
{

	printk("cmd show.............\n");
	return 1;
}

static ssize_t cmd_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t count)
{
	printk("cmd store......\n");
	return  1;
}
/*
DEVICE_ATTR(_name, _mode, _show, _store)
_name:名稱,也就是將在sys fs中生成的文件名稱。
_mode:上述文件的訪問權限,與普通文件相同,UGO的格式。
_show:顯示函數,cat該文件時,此函數被調用。
_store:寫函數,echo內容到該文件時,此函數被調用。
*/
static DEVICE_ATTR(liu, (S_IRUGO|S_IWUSR), cmd_show, cmd_store); 

int spi_init_sysfs(void)
{
	spi_obj = kobject_create_and_add("spi-debug", NULL);
	int ret = 0;

	if (!spi_obj) {
		printk(KERN_ALERT "create sysfs object failed.\n");
		return -1;
	}
	ret = sysfs_create_file(spi_obj, &dev_attr_liu.attr);
	if (ret) {
		printk(KERN_ALERT "create sysfs cmd file failed.\n");
		return -1;
	}
	return 0;
}

void spi_remove_sysfs(void)
{
		sysfs_remove_file(spi_obj, &dev_attr_liu.attr);
		kobject_del(spi_obj);
}
static int __init spi_dbg_init(void)
{
	int ret;
	ret = spi_init_sysfs();
	if(ret == 0) {
		printk(KERN_ERR "spi_dbg_init inti ok.............................\n ");
	}else {
		printk(KERN_ERR "kobject_create_and_add error....................................\n");
		spi_remove_sysfs();
	}
	return ret;
}

static void __exit spi_dbg_exit(void)
{
	spi_remove_sysfs();
}

module_init(spi_dbg_init);
module_exit(spi_dbg_exit);


MODULE_AUTHOR("liu");
MODULE_LICENSE("GPL");

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章