转自:https://www.cnblogs.com/metootxy/archive/2013/06/03/3116027.html
之前做传感器之类,因为注册的是input设备,所以其文件接口都是以/sys/class/input/input1(2...n);
这样就有一个问题,因为input生成的序列式随机的,所以如果一个设备注册不成功,那么input的序列号将会被打乱,如果上层读的input接口,这样子整个上下层就会出现问题。
后来就想了一个解决办法,提供给上层的接口使用注册的i2c接口,这样对同一平台的是固定,但是当换了一个平台其注册的i2c线可能也不一样。
所以很苦逼的,这两种方法都不是很好使,怎么办呢?
通过链接的方法,把该设备路径链接到一个固定的路径,就OK了。
这个实现的方法,强大的linux内核已经帮我们解决了。具体代码如下:
在fs/sysfs/symlink.c文件中:
98 /** 99 * sysfs_create_link - create symlink between two objects. 100 * @kobj: object whose directory we're creating the link in. 101 * @target: object we're pointing to. 102 * @name: name of the symlink. 103 */ 104 int sysfs_create_link(struct kobject *kobj, struct kobject *target, 105 const char *name) 106 { 107 return sysfs_do_create_link(kobj, target, name, 1); 108 }
具体实现的实例如下:
1343 my_class = class_create(THIS_MODULE, "test_class");//创建一个class 1344 if (IS_ERR(my_class)) { 1345 pr_err("failed to create my class\n");1347 } 1348 my_dev = device_create(my_class, NULL, 0, drvdata, "test_class"); 1350 if (IS_ERR(my_dev)) { 1351 pr_err("failed to create my dev\n");1353 } 1354 ret = sysfs_create_link(&my_dev->kobj, &client->dev.kobj, "i2c");//创建client->dev.kobj的链接文件, 1355 1356 /* create sysfs attributes */ 1357 ret = sysfs_create_group(&client->dev.kobj, &attribute_group);
查看设备文件接口时:
/sys/class/my_class/my_dev/下面就有一个i2c链接文件,这样子就不用担心一直平台的时候,还需要再次更改文件接口的问题了。