您的位置:首页 > 其它

platform 平台总线

2016-10-28 21:52 274 查看
一、 在/sys某个目录下创建一个文件:

struct bus_attribute {
struct attribute    attr;
ssize_t (*show)(struct bus_type *bus, char *buf);
ssize_t (*store)(struct bus_type *bus, const char *buf, size_t count);
};
#define BUS_ATTR(_name, _mode, _show, _store)   \
struct bus_attribute bus_attr_##_name = __ATTR(_name, _mode, _show, _store)

使用:
BUS_ATTR(bus_version,0666,bus_version_show, bus_version_store);
==》展开:
struct bus_attribute  bus_attr_bus_version  = {
.attr = {
.name = "bus_version",
.mode = 0666
},
.show   = bus_version_show,
.store  = bus_version_store,
}
这种模型是所有驱动模型根本,比如platform总线, i2c总线,spi总线,sdio总线,内部都是这种模型


二、 几个重要的结果体

1 所有总线相关:
device: 描述设备的静态的信息,比如中断号,gpio号码,地址,等等
driver: 驱动设备的逻辑代码,比如ioremap, writel/readl, request_irq()等

struct device{
struct kobject kobj; // 继承父类
const char  *init_name; //用于匹配的名字, 在运行的时候,会将该变量赋值给kobj.name
struct bus_type *bus;    // 该device应该注册到哪个总线中
void        *platform_data; //可以定义数据
}

struct device_driver {
const char      *name;//用于匹配的名字
struct bus_type     *bus;// 该driver应该注册到哪个总线中
int (*probe) (struct device *dev);
int (*remove) (struct device *dev);
}

2 平台总线相关:
struct platform_driver ---通用的多平台下的驱动代码
struct platform_device ---不同平台下的地址,中断资源

//资源--表示内存地址,也表示中断
struct resource {
resource_size_t start; // 地址起始
resource_size_t end; //地址结束
const char *name; //自定义
unsigned long flags; //区分是内存地址还是中断IORESOURCE_MEM,IORESOURCE_IRQ
struct resource *parent, *sibling, *child;
};

struct platform_device {
const char  * name; //用于匹配
int     id;
struct device   dev; //继承父类
u32     num_resources;
struct resource * resource; //资源,存放设备的信息, 统一的格式
}

struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
struct device_driver driver;//继承父类
const struct platform_device_id *id_table; //可兼容多个platform device 的name
}

3 匹配方法:
1,优先将pdev的名字和pdrv中id_table的名字进行比较
2,如果pdrv没有id_table,就直接比较pdev->name 和 pdrv->driver.name


获取资源:
1 struct resource *platform_get_resource(struct platform_device *dev,
unsigned int type, unsigned int num)
参数1:资源所在 pdev
参数2:取哪种资源(irq or mem)
参数3:同种资源的第几个

2 pdrv_probe()做什么事情--1,为应用程序提供操作接口 2, 从pdev中获取资源,并通过资源对硬件进行初始化
a,申请设备号
b,创建文件
c,硬件初始化--从pdev中获取资源,并通过资源对硬件进行初始化
d,实现fops

3 pdev中自定义数据
设置自定义数据
struct led_pdata {
char *name;
int shift_num;
};
struct led_pdata pdata = {
.name = "gpc0_3/4",
.shift_num = 3,
};

struct platform_device led_pdev = {
.name = "s5pv210_led",
.id = -1,
.num_resources = ARRAY_SIZE(led_res),
.resource = led_res,
.dev = {                 // 父类
.platform_data = &pdata,
},
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct