Linux 增加sys节点技巧

Linux 增加sys节点技巧

2014-05-17 本站整理 浏览(298)
id="cproIframe_u599470" width="300" height="250" src="http://pos.baidu.com/acom?adn=3&at=103&aurl=&cad=0&ccd=24&cec=UTF-8&cfv=15&ch=0&col=zh-CN&conOP=0&cpa=1&dai=1&dis=0&ltr=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dutf-8%26f%3D8%26rsv_bp%3D1%26rsv_idx%3D1%26tn%3Dbaidu%26wd%3Dcreate_sysfs_interfaces&ltu=http%3A%2F%2Fwww.aichengxu.com%2Fview%2F24166&lunum=6&n=50099048_cpr&pcs=1920x979&pis=10000x10000&ps=247x784&psr=1920x1080&pss=1920x507&qn=c1c1d399657c7fea&rad=&rsi0=300&rsi1=250&rsi5=2&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000ff&rss3=%23333333&rss4=%230000ff&rss5=&rss6=%23ff0000&rss7=%23ffffff&scale=&skin=&td_id=599470&tn=text_default_300_250&tpr=1414405224879&ts=1&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u599470" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true">

Linux 增加sys节点技巧,有需要的朋友可以参考下。


1. 子系统位platform /sys/devices/platform/att_test

lrwxrwxrwx 1 root root 0 2014-05-17 10:04 driver -> ../../../bus/platform/drivers/att_test
-r--r--r-- 1 root root 4096 2014-05-17 10:05 modalias
drwxr-xr-x 2 root root 0 2014-05-17 10:05 power
lrwxrwxrwx 1 root root 0 2014-05-17 10:04 subsystem -> ../../../bus/platform
-rwxrwxrwx 1 root root 4096 2014-05-17 10:05 test
-rw-r--r-- 1 root root 4096 2014-05-17 10:05 uevent

 
 
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/kobject.h>
#include <linux/platform_device.h>

struct att_dev{
	struct platform_device *pdev;
	struct kobject *kobj;
};

static struct att_dev *dev = NULL;

static ssize_t att_store(struct device *dev, 
					struct device_attribute *attr, 
					const char *buf, size_t count) 
{
	printk("echo debug buf\n");

	return count;
}

static ssize_t att_show(struct device *dev,
                 struct device_attribute *attr,
                 char *buf)
{
	printk("cat debug buf\n");
	return 0;
}
static DEVICE_ATTR(test,0777,att_show,att_store);


static __devinit int att_probe(struct platform_device *pdev){
	int ret;
	
	/* 增加节点/sys/devices/platform/att_test  */
	ret = sysfs_create_file(&pdev->dev.kobj,&dev_attr_test.attr);
	if(ret < 0){
		return -ENOMEM;
	}
	return 0;


}

static struct platform_driver att_driver = {
	.probe = att_probe,
	.driver = {
		.owner = THIS_MODULE,
		.name = "att_test",
	},
};

static int __init att_init(void)
{
	int ret;

	dev = kzalloc(sizeof(struct att_dev),GFP_KERNEL);
	if(dev == NULL){
		printk("%s get dev memory error\n",__func__);
		return -ENOMEM;
	}
	/*在platform bus上增加 name = att_test的device, 方便与driver匹配执行driver->probe */
 dev->pdev = platform_device_register_simple("att_test", -1, NULL, 0); if(IS_ERR(dev->pdev)){PTR_ERR(dev->pdev); printk("%s pdev error\n",__func__);return -1;} ret = platform_driver_register(&att_driver); if(ret < 0){ printk("%s register driver error\n",__func__); return ret; }return 0;}static void __exit att_exit(void){sysfs_remove_file(&dev->pdev->dev.kobj,&dev_attr_test.attr);kobject_del(dev->kobj);platform_device_unregister(dev->pdev);platform_driver_unregister(&att_driver);if(dev != NULL)kfree(dev);}module_init(att_init);module_exit(att_exit);MODULE_LICENSE("GPL");MODULE_AUTHOR("driverSir");

2.在任意的sys下的位置增加debug节点

err = create_sysfs_interfaces(&client->dev);
static int create_sysfs_interfaces(struct device *dev)
{
	int i;
	int err;
	for (i = 0; i < ARRAY_SIZE(attributes); i++) {
		err = device_create_file(dev, attributes + i);
		if (err)
			goto error;
	}
	return 0;


error:
	for ( ; i >= 0; i--)
		device_remove_file(dev, attributes + i);
	dev_err(dev, "%s:Unable to create interface\n", __func__);
	return err;
}
/* 在此数组里面可以添加大量自己想添加的操作函数,debug节点。。。。。。*/
static struct device_attribute attributes[] = {
	__ATTR(poll_delay, 0664, attr_get_polling_rate,
			attr_set_polling_rate),
	__ATTR(range, 0664, attr_get_range, attr_set_range),
	__ATTR(enable, 0664, attr_get_enable, attr_set_enable),
	__ATTR(int1_config, 0664, attr_get_intconfig1, attr_set_intconfig1),
	__ATTR(int1_duration, 0664, attr_get_duration1, attr_set_duration1),
	__ATTR(int1_threshold, 0664, attr_get_thresh1, attr_set_thresh1),
	__ATTR(int1_source, 0444, attr_get_source1, NULL);
#ifdef DEBUG
	__ATTR(reg_value, 0664, attr_reg_get, attr_reg_set),
	__ATTR(reg_addr, 0220, NULL, attr_addr_set),
#endif
};
/* 一个几点简单的读写函数*/
static ssize_t attr_get_enable(struct device *dev,
			       struct device_attribute *attr, char *buf)
{
	struct lis3dh_acc_data *acc = dev_get_drvdata(dev);
	int val = atomic_read(&acc->enabled);
	return snprintf(buf, sizeof(val) + 2, "%d\n", val);
}


static ssize_t attr_set_enable(struct device *dev,
			       struct device_attribute *attr,
			       const char *buf, size_t size)
{
	struct lis3dh_acc_data *acc = dev_get_drvdata(dev);
	unsigned long val;


	if (kstrtoul(buf, 10, &val))
		return -EINVAL;


	if (val)
		lis3dh_acc_enable(acc);
	else
		lis3dh_acc_disable(acc);


	return size;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值