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<r=http%3A%2F%2Fwww.baidu.com%2Fs%3Fie%3Dutf-8%26f%3D8%26rsv_bp%3D1%26rsv_idx%3D1%26tn%3Dbaidu%26wd%3Dcreate_sysfs_interfaces<u=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; }