读书人

dev sys ckass proc device_create_fi

发布时间: 2013-01-28 11:49:56 作者: rapoo

dev sys ckass proc device_create_file device_create_drvdata dev_set_drvdata dev_
/dev/hello_device // 设备文件(内核空间)
/sys/class/hello/hello_driver // 驱动(内核空间的一个MODULE)
/proc/hello_process // 程序运行后,查看它的进程空间中的相关信息

dev下是设备文件(开关读写控),sys/class下是驱动文件,也可以open,read来访问 ,WRITE也行但可能会带来严重后果的(http://zhidao.baidu.com/question/259587012.html)

例如打开串口就是/dev/tty,但是打开gpio就是/sys/class/gpio(http://www.newsmth.net/nForum/#!article/LinuxDev/54935)


from: http://blog.sina.com.cn/s/blog_693301190100wq66.html
1,
例子1
device_create( my_class, NULL, MKDEV(hello_major, 0), "hello" "%d", 0 );
如果成功,它将会在/dev目录下产生/dev/hello0设备。

例子2
led_cdev->dev = device_create_drvdata(leds_class, parent, 0, led_cdev,
"%s", led_cdev->name);
这是前文platform之gpio-leds里面的源码
由于dev_t是0,所以它不会在/dev下产生设备文件。
led_cdev为传递给class的私有数据。
会把第6个参数的内容复制到第5个参数 “%s”,就像printf一样

2,device_create_file好像用来在 文件系统的设备子系统下 设置某个设备文件属性的。而这个设备属性里包括了 属性名称, 读写属性的方法等
调用device_create_file(dev, &dev_attr_debug);函数在/sys中导出信息,device_create_file()的第一个入口参数类型为struct device结构体。问题是如何把cdev转换到device,
结构层次:

kobject

/ \
cdev device
所以从子类cdev--->父类kobject--->子类device
container_of(kobj)-->list_entry(entry)->(struct device*)

3,在驱动初始化的代码里调用class_create为该设备创建一个class,再为每个设备调用 class_device_create创建对应的设备。大致用法如下:
struct class *myclass = class_create(THIS_MODULE, “my_device_driver”);
class_device_create(myclass, NULL, MKDEV(major_num, 0), NULL, “my_device”);
这样的module被加载时,udev daemon就会自动在/dev下创建my_device设备文件。
(end)


from: http://hi.baidu.com/312860519/item/7d470d0b0f3df93bf3eafc91
static inline unsigned int dev_set_drvdata(struct device *dev, void *data)
{
dev->driver_data = data;;
}

static inline unsigned int dev_get_drvdata(const struct *dev)
{
return dev->driver_data;
}

在linux 的驱动里用到 dev_set_drvdata 和 dev_get_drvdata 的地方非常多,如:

platform_set_drvdata();
platform_get_drvdata();

input_set_drvdata();
input_get_drvdata();

mmc_get_drvdata();
mmc_set_drvdata();

i2c_set_clientdata();
i2c_get_clientdata();

……用到的其实都是它们。

好处是很明显的,把设备的相关信息放到设备结构里,需要使用的时候可以方便的拿出来。
(end)

读书人网 >其他相关

热点推荐