This is my study note of platform.
概念
什么是总线模型
也叫platform总线模型,是linux内核虚拟出来的总线,并不是真实的总线。平台总线模型就是将我们原来的驱动文件分为device文件和driver文件。
设备、总线、驱动,主要是总线通过设备和驱动中相同的名字来进行匹配,实际上就是字符串比较。
主要写的是硬件资源,指的是寄存器的地址和中断号等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| struct platform_device { const char *name; // 设备名字用于后续匹配,可以在sys/bus目录下看到注册的设备 int id; // 我们的设备一般只有一个,填-1就行 struct device dev; // 内嵌的device结构体,一般用于实现release u32 num_resource; // 资源数量 struct resource *resource;// device的里面的硬件资源 }
struct resource { resource_size_t start; // 资源的起始 resource_size_t end; // 资源的末尾 const char *name; // 资源的名字 unsigned long flags; // 资源的类型 struct resource *parent, *sibling, *child; // 资源的父节点、兄弟结点、子结点 }
platform_device_register(&platform_device); // 用于设备注册 platform_device_unregister(&platform_device); // 用于设备取消注册
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| struct platform_driver { int (*probe)(struct platform_device*); // 匹配成功probe int (*remove)(struct platform_device*); // device或driver任意一个remove则remove int (*shutdown)(struct platform_device*); // 收到shutdown命令则shutdown int (*suspend)(struct platform_device*, pm_message_t state ); // 收到休眠则休眠 int (*resume)(struct platform_device*); // 收到唤醒则唤醒 struct device_driver driver; const struct platform_device_id *id_table; bool prevent_deferred_probe; }
|
资源获得
1 2 3 4
| 1.直接访问(不安全) pdev->resource[x].m // 访问resource[x]的m资源 2.platform_get_resource(dev, index); // 获取同类资源列表中的第index个资源 request_mem_region(start, n, name); // 注册内存,start为寄存器起始值,n为长度,name为名字
|