【sysfs_create_link】创建内核连接

转自: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链接文件,这样子就不用担心一直平台的时候,还需要再次更改文件接口的问题了。

猜你喜欢

转载自blog.csdn.net/feifei_csdn/article/details/80923272
今日推荐