您的位置:首页 > 其它

hello_world-2.3之简单设备驱动模型(三)---添加设备属性文件

2012-12-15 14:48 543 查看

hello_world-2.3之简单设备驱动模型(三)

结合前面的hello_world-2.0之sys文件系统kobj,要想在设备下增加设备的属性文件,以及给device一个父设备。

1.helloworld-bus.c

#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>
#include<linux/kernel.h>

static char *author = "doublenian.xie";

static ssize_t show_bus_author(struct bus_type *bus,char *buf)
{
return sprintf(buf,"%s\n",author);
}

void my_bus_release(struct device *dev)
{
printk(KERN_DEBUG "my bus release\n");

}

static int virtual_bus_match(struct device *dev,struct device_driver *drv)
{
return !strncmp(dev_name(dev),drv->name,strlen(drv->name));

}

struct bus_type virtual_bus = {
.name = "my_bus",
.match = virtual_bus_match,
};

struct device my_bus = {
.init_name = "my_bus0",
.release = my_bus_release,
};
EXPORT_SYMBOL(my_bus);
EXPORT_SYMBOL(virtual_bus);
static BUS_ATTR(author,S_IRUGO,show_bus_author,NULL);
static int __init bus_init(void)
{
int ret;
ret = bus_register(&virtual_bus);
if(ret)
return ret;
if(bus_create_file(&virtual_bus,&bus_attr_author))
printk(KERN_NOTICE "Unable to create author attribute\n");
ret = device_register(&my_bus);
if(ret)
printk(KERN_NOTICE "Fail to register device \n");
printk("bus register sucess\n");
return ret;
}

static void __exit bus_exit(void)
{
bus_unregister(&virtual_bus);
 device_unregister(&my_bus);
}
module_init(bus_init);
module_exit(bus_exit);
MODULE_LICENSE("GPL");


1.1定义父设备

看到了,父设备的定义以及注册跟一般设备一样的步骤,一个release和init_name,device_register 和device_unregister,一个父设备搞定了,还有一步就是在子设备的结构体

中的parent 赋为my_bus0就可以了。

1.2然后设置属性

接下来看看属性的步骤:

1.2.1 是定义store和show函数,

static ssize_t show_bus_author(struct bus_type *bus,char *buf)
{
return sprintf(buf,"%s\n",author);
}


1.2.2 是设置属性文件的属性以及操作
static BUS_ATTR(author,S_IRUGO,show_bus_author,NULL);


这个宏定义,device,device_driver都有一个类似的,可以推到出device的就是

static DEVICE_ATTR(),
#define BUS_ATTR(_name, _mode, _show, _store)	\
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)


那么driver呢? static DRIVER_ATTR(),他们几个太相似了,知道一个可以推到出另外两个

1.2.3 就是真正干事的了,在/sys下创建文件的

bus_create_file(&virtual_bus,&bus_attr_author)

这个函数也可以推到出 driver和device的创建文件的函数,相似么:

device_create_file,和driver_create_file

2.helloworld-device.c

#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>

char *author = "doublenian.xie";
extern struct bus_type virtual_bus;
extern struct device my_bus;

static ssize_t show_device_author(struct device *dev,struct device_attribute *attr,char *buf)
{
return sprintf(buf,"%s\n",author);

}
void virtual_device_release(struct device *dev)
{
printk("virtual_device is release\n");

}

struct device virtual_device ={
.init_name = "my_dev",
.bus = &virtual_bus,
.parent = &my_bus,
.release = virtual_device_release,
};
static DEVICE_ATTR(author,S_IRUGO,show_device_author,NULL);

static int __init device_init(void)
{
int ret;
ret = device_register(&virtual_device);
if(ret)
return ret;
  if(device_create_file(&virtual_device,&dev_attr_author))
printk(KERN_NOTICE "Unable to create author attribute\n");

printk("device register sucess\n");
return ret;

}

static void __exit device_exit(void)
{
device_unregister(&virtual_device);
}
module_init(device_init);
module_exit(device_exit);
MODULE_AUTHOR("doublenian.xie@gmail.com");
MODULE_LICENSE("GPL");


3.helloworld_driver.c

#include<linux/module.h>
#include<linux/init.h>
#include<linux/string.h>
#include<linux/device.h>
#include<linux/kernel.h>

extern struct bus_type virtual_bus;
char *author = "doublenian.xie";

static ssize_t show_driver_author(struct device_driver *driver,char *buf)
{
return sprintf(buf,"%s\n",author);
}

int my_driver_remove(struct device *dev)
{
printk(KERN_NOTICE "driver is remove\n");
return 0;
}

int my_driver_probe(struct device *dev)
{
printk(KERN_NOTICE "driver can handle the device\n");
return 0;

}

struct device_driver virtual_driver = {
.name = "my_dev",
.bus = &virtual_bus,
.probe = my_driver_probe,
.remove = my_driver_remove,
};

static DRIVER_ATTR(author,S_IRUGO,show_driver_author,NULL);

static int __init my_driver_init(void)
{
int ret;
ret = driver_register(&virtual_driver);

if(ret)
return ret;
if(driver_create_file(&virtual_driver,&driver_attr_author))
printk(KERN_NOTICE "Unable to create author attribute\n");
printk("driver register sucess\n");
return ret;

}

static void __exit my_driver_exit(void)
{
driver_unregister(&virtual_driver);

}

module_init(my_driver_init);
module_exit(my_driver_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("doublenian.xie");




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: