设备元素:
总线, 驱动, 设备
总线:处理器和设备之间的通道,在设备模型中,所有的设备都通过总线相连,甚至是内部的虚拟“platform”总线(定时器,看门狗并没有直接相连)。在linux设备模型中,总线由bus_type结构表示,定义在
总线的注册使用:
bus_register(struct bus_type *bus);
若成功,新的总线将被添加进系统,并可以在sysfs的/sys/bus下面看到。
总线的删除:
void bus_unregister(struct bus_type *bus);
总线的方法:
int (*match)(struct device *dev, struct device_driver *drv);
当一个新设备或者驱动被添加到这个总线的时候,调用该方法。用于半段指定的驱动程序系否能处理指定的设备。如果可以,则返回非零值。
int (*uevent)(struct device *dev, char **envp, int num_envp, char *buffer, int buffer_size);
在为用户空间产生热插拔事件(目录变化)之前,这个方法允许总线添加环境变量。
总线属性:
struct bus_attribute{
struct attribute attr;
ssize_t (*show)(struct bus_type *, char *buf);
ssize_t (*store)(stuct bus_type *, const char *buf, size_t count);
}
int bus_create_file(struct bus_type *bus, struct bus_attribute *attr);
添加属性文件
void bus_remove_file(struct bus_type *bus, struct bus_attribute *attr);
删>除属性文件
设备:
用struct device来描述。
设备注册:
int device_register(struct device *dev);
注册设备
voi device_unregister(struct device *dev);
注销设备
总线也是设备,也必须按照设备来注册
设备属性:
struct device_attribute{
struct attribute attr;
ssize_t (*show)(struct device *dev, struct device_attribute *attr, char *buf);
ssize_t (*store)(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);
}
int device_create_file(struct device *device, struct device_attribute *entry);
创建属性
void device_remove_file(struct device *dev, struct device_attribute *attr);
删除属性
驱动:
用struct device_driver来描述
注册驱动:
int driver_register(struct device_driver *drv);
注册驱动
void driver_unregister(struct device_driver *drv);
注销驱动
驱动属性:
struct driver_attribute{
struct attribute attr;
ssize_t (*show)(struct device_driver *drv,char *buf);
ssize_t (*store)(struct device_driver *drv, const char *buf, size_t count);
}
int driver_create_file(struct device_driver *drv,struct driver_attribute *attr);
int driver_remove_file(struct device_driver *drv,struct driver_attribute *attr);
驱动方法:
int(*probe)(struct device *dev);
当驱动找到与之匹配的设备的时候,会被调用。