LDD3学习笔记(17):linux设备模型

 

1、Kobjects结构

#include <linux/kobject.h>

包含文件, 包含 kobject 的定义, 相关结构, 和函数.

void kobject_init(struct kobject *kobj);

int kobject_set_name(struct kobject *kobj, const char *format, ...);

用作 kobject 初始化的函数

struct kobject *kobject_get(struct kobject *kobj);

void kobject_put(struct kobject *kobj);

为 kobjects 管理引用计数的函数.

struct kobj_type;

struct kobj_type *get_ktype(struct kobject *kobj);

表示一个kobjct 被嵌入的结构类型. 使用 get_ktype 来获得关联到一个给定 kobject 的 

kobj_type.

int kobject_add(struct kobject *kobj);

extern int kobject_register(struct kobject *kobj);

void kobject_del(struct kobject *kobj);

void kobject_unregister(struct kobject *kobj);

kobject_add 添加一个 kobject 到系统, 处理 kset 成员关系, sysfs 表示, 以及热插拔事件产生. 

kobject_register 是一个方便函数, 它结合 kobject_init 和 kobject_add. 使用 kobject_del 来去除一

个 kobject 或者 kobject_unregister, 它结合了 kobject_del 和 kobject_put.

void kset_init(struct kset *kset);

int kset_add(struct kset *kset);

int kset_register(struct kset *kset);

void kset_unregister(struct kset *kset);

为 ksets 初始化和注册的函数.

decl_subsys(name, type, hotplug_ops);

易于声明子系统的一个宏.

void subsystem_init(struct subsystem *subsys);

int subsystem_register(struct subsystem *subsys);

void subsystem_unregister(struct subsystem *subsys);

struct subsystem *subsys_get(struct subsystem *subsys);

void subsys_put(struct subsystem *subsys);

对子系统的操作.

2、sysfs 操作

#include <linux/sysfs.h>

包含 sysfs 声明的包含文件.

int sysfs_create_file(struct kobject *kobj, struct attribute *attr);

int sysfs_remove_file(struct kobject *kobj, struct attribute *attr);

int sysfs_create_bin_file(struct kobject *kobj, struct bin_attribute *attr);

int sysfs_remove_bin_file(struct kobject *kobj, struct bin_attribute *attr);

int sysfs_create_link(struct kobject *kobj, struct kobject *target, char *name);

void sysfs_remove_link(struct kobject *kobj, char *name);

创建和去除和一个 kobject 关联的属性文件的函数.

3、总线, 设备, 和驱动

int bus_register(struct bus_type *bus);

void bus_unregister(struct bus_type *bus);

在设备模型中进行注册和注销总线的函数.

int bus_for_each_dev(struct bus_type *bus, struct device *start, void *data, int (*fn)(struct device *, void *));

int bus_for_each_drv(struct bus_type *bus, struct device_driver *start, void *data, int (*fn)(struct 

device_driver *, void *));

列举每个设备和驱动的函数, 特别地, 绑定到给定总线的设备.

BUS_ATTR(name, mode, show, store);

int bus_create_file(struct bus_type *bus, struct bus_attribute *attr);

void bus_remove_file(struct bus_type *bus, struct bus_attribute *attr);

BUS_ATTR 宏可能用来声明一个 bus_attribute 结构, 它可能接着被添加和去除, 使用上面 2 个函数.

int device_register(struct device *dev);

void device_unregister(struct device *dev);

处理设备注册的函数.

DEVICE_ATTR(name, mode, show, store);

int device_create_file(struct device *device, struct device_attribute *entry);

void device_remove_file(struct device *dev, struct device_attribute *attr);

处理设备属性的宏和函数.

int driver_register(struct device_driver *drv);

void driver_unregister(struct device_driver *drv);

注册和注销一个设备驱动的函数.

DRIVER_ATTR(name, mode, show, store);

int driver_create_file(struct device_driver *drv, struct driver_attribute *attr);

void driver_remove_file(struct device_driver *drv, struct driver_attribute *attr);

关联驱动属性的宏和函数.

4、类

struct class_simple *class_simple_create(struct module *owner, char *name);

void class_simple_destroy(struct class_simple *cs);

struct class_device *class_simple_device_add(struct class_simple *cs, dev_t devnum, struct device *device, 

const char *fmt, ...);

void class_simple_device_remove(dev_t dev);

int class_simple_set_hotplug(struct class_simple *cs, int (*hotplug)(struct class_device *dev, char **envp, int 

num_envp, char *buffer, int buffer_size));

实现 class_simple 接口的函数; 它们管理包含一个 dev 属性和很少其他属性的简单的类入口

int class_register(struct class *cls);

void class_unregister(struct class *cls);

注册和注销类.

CLASS_ATTR(name, mode, show, store);

int class_create_file(struct class *cls, const struct class_attribute *attr);

void class_remove_file(struct class *cls, const struct class_attribute *attr);

处理类属性的常用宏和函数.

int class_device_register(struct class_device *cd);

void class_device_unregister(struct class_device *cd);

int class_device_rename(struct class_device *cd, char *new_name);

CLASS_DEVICE_ATTR(name, mode, show, store);

int class_device_create_file(struct class_device *cls, const struct class_device_attribute *attr);

属性类设备接口的函数和宏.

int class_interface_register(struct class_interface *intf);

void class_interface_unregister(struct class_interface *intf);

添加一个接口到一个类(或去除它)的函数.

5、固件

#include <linux/firmware.h>

int request_firmware(const struct firmware **fw, char *name, struct device *device);

int request_firmware_nowait(struct module *module, char *name, struct device *device, void *context, void 

(*cont)(const struct firmware *fw, void *context));

void release_firmware(struct firmware *fw);

属性内核固件加载接口的函数.

时间: 2024-07-31 18:56:31

LDD3学习笔记(17):linux设备模型的相关文章

Linux设备模型(热插拔、mdev 与 firmware)【转】

转自:http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077469.html 转自:http://blog.chinaunix.net/space.php?uid=20543672&do=blog&cuid=460882 热插拔有 2 个不同角度来看待热插拔:   从内核角度看,热插拔是在硬件.内核和内核驱动之间的交互.   从用户角度看,热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug.udev 和 mdev)的交

Linux设备模型(9)_device resource management ---devm申请空间【转】

转自:http://www.wowotech.net/linux_kenrel/device_resource_management.html   1. 前言 蜗蜗建议,每一个Linux驱动工程师,都能瞄一眼本文. 之所以用"瞄",因此它很简单,几乎不需要花费心思就能理解.之所有这建议,是因为它非常实用,可以解答一些困惑,可以使我们的代码变得简单.简洁.先看一个例子: 1: /* drivers/media/platform/soc_camera/mx1_camera.c, line

Linux设备模型(3)_Uevent【转】

转自:http://www.wowotech.net/device_model/uevent.html 1. Uevent的功能 Uevent是Kobject的一部分,用于在Kobject状态发生改变时,例如增加.移除等,通知用户空间程序.用户空间程序收到这样的事件后,会做相应的处理. 该机制通常是用来支持热拔插设备的,例如U盘插入后,USB相关的驱动软件会动态创建用于表示该U盘的device结构(相应的也包括其中的kobject),并告知用户空间程序,为该U盘动态的创建/dev/目录下的设备节

API Demos 2.3 学习笔记 (17)-- Views-&amp;gt;Tabs

更多精彩内容,请点击阅读:<API Demos 2.3 学习笔记> Tab与TabHost应用很广泛.打开android手机的默认电话拨号程序,上面就是由"拨号","通话记录","通讯录"以及"收藏"四个选项卡组成的. TabHost有两种实现方式,一种是继承TabActivity,另一种是自己定义TabHost,不继承TabActivity.APIDemo中的三个实例都是第一种.想了解TabHost的第二种实现方

LDD3学习笔记(1):设备驱动简介

 1.几乎每个系统操作都被映射到具体的物理设备上,而任何设备的控制操作都由特定于要寻址的相关代码来进行,这些代码成为设备驱动. 2.linux可以在运行时扩展由内核提供的特性,既可以在系统运行时增加内核的功能(也可以删除). 3.每块可以在运行时添加到内核的代码称为一个模块,每个模块由目标代码组成(既功能的实现). 4.linux将设备分为三种基本类型:字符设备.块设备.网络设备.典型的字符设备如:/dev/tty1(串口),块设备如:/dev/sda(磁盘),网络设备如:eth0(网卡),在这

linux学习笔记之linux文件管理

内容: #文件系统及Shell的基本概念 #文件及目录操作命令 #VI的使用 #软件包的管理 一.文件系统及Shell的基本概念 1.文件系统的含义 文件系统是用来管理和组织保存在磁盘驱动器上数据的系统软件 2.Linux的文件系统 Linux系统采用虚拟文件系统技术(VFS).结构采用倒立树型.VFS使Linux支持以下文件系统: EXT2: 二次扩展 EXT3: 三次扩展 SWAP: 交换文件系统 FAT.FAT32 NTFS (默认不支持,需要特定的模块) VFAT: 虚拟FAT SYSV

Symbian学习笔记(17)——初探WebServices API的使用(上)

很久没有学习Symbian了,今天研究一下如何使用Symbian中提供的WebService框架来SayHello. 从SDK文档中提供的资料来看这个接口似乎有点复杂,包括了Connection API.Description API和Manager API三套东西,此外还涉到了XML的解析之类的一些API的应用. 阅读了一下它的例子程序(S60Ex目录下的AddressBook),让我更晕乎了.怎么跟自己平时使用的WebService不一样了? 在SDK文档中关于CSenServiceConn

LDD3学习笔记(15):PCI驱动

 #include <linux/pci.h> 包含 PCI 寄存器的符号名和几个供应商和设备 ID 值的头文件. struct pci_dev; 表示内核中一个 PCI 设备的结构. struct pci_driver; 代表一个 PCI 驱动的结构. 所有的 PCI 驱动必须定义这个. struct pci_device_id; 描述这个驱动支持的 PCI 设备类型的结构. int pci_register_driver(struct pci_driver *drv); int pci_m

LDD3学习笔记(2):建立和运行模块

1.建立开发环境 在开始编写代码以及研究代码之前,你需要有一个开发环境,也就是一个linux系统.通常我们的做法是在windows下安装一个虚拟机软件,然后在虚拟机软件中安装一个linux系统的发行版本,在众多的发行版本中我推荐ubuntu,不过具体还要看个人爱好. 2.hello world模块 许多编程书籍都从hello world开始,下面的代码是一个完整的hello world模块.将下列代码输入hello.c文件中. #include <linux/init.h>#include &