This is my study note of platform.

概念

什么是总线模型

也叫platform总线模型,是linux内核虚拟出来的总线,并不是真实的总线。平台总线模型就是将我们原来的驱动文件分为device文件和driver文件。
设备、总线、驱动,主要是总线通过设备和驱动中相同的名字来进行匹配,实际上就是字符串比较。

platform设备注册

主要写的是硬件资源,指的是寄存器的地址和中断号等。

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); // 用于设备取消注册

platform驱动注册

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为名字