设计说明
31 Jan 2024
Read time: 2 minute(s)
源代码位于:drivers/misc/artinchip-pbus.c
模块架构
PBus 对用户来说,只需要能够设置一些信号参数即可,所以将其归入 Linux 内核中的 Misc 设备。
不需要运行时修改参数,所以也不需要单独创建设备节点,PBus 驱动会用 DTS 方式来解析和设置信号参数。
关键流程设计
PBus 模块遵循 driver 的通用初始化流程,申请 regs 资源、clk、reset,然后从 DTS 中解析参数并写入 PBus 控制器。
在 probe()接口的最后面,会顺次调用三个接口来设置 PBus 的三个 CFG 寄存器:
pbus_set_cfg0(&pdev->dev, pbus->base);
pbus_set_cfg1(&pdev->dev, pbus->base);
pbus_set_cfg2(&pdev->dev, pbus->base);
数据结构设计
pbus_dev 管理 PBus 控制器的设备资源:
struct pbus_dev {
void __iomem *base;
struct platform_device *pdev;
struct attribute_group attrs;
struct clk *clk;
struct reset_control *rst;
};
接口设计
以下是提供给 probe() 调用的三个内部接口:函数原型 | static void pbus_set_cfg0(struct device *dev, void __iomem *base) |
---|---|
功能说明 | 从 DTS 中解析参数,并设置 PBus 的寄存器 PBUS_CFG0 |
参数定义 | dev - 指向 PBus 设备 base - PBus 寄存器基地址的映射地址 |
返回值 | 无 |
注意事项 | - |
函数原型 | static void pbus_set_cfg1(struct device *dev, void __iomem *base) |
---|---|
功能说明 | 从 DTS 中解析参数,并设置 PBus 的寄存器 PBUS_CFG1 |
参数定义 | dev - 指向 PBus 设备 base - PBus 寄存器基地址的映射地址 |
返回值 | 无 |
注意事项 | - |
函数原型 | static void pbus_set_cfg2(struct device *dev, void __iomem *base) |
---|---|
功能说明 | 从 DTS 中解析参数,并设置 PBus 的寄存器 PBUS_CFG2 |
参数定义 | dev - 指向 PBus 设备 base - PBus 寄存器基地址的映射地址 |
返回值 | 无 |
注意事项 | - |