Edit online

设计说明

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() 调用的三个内部接口:
1. pbus_set_cfg0
函数原型 static void pbus_set_cfg0(struct device *dev, void __iomem *base)
功能说明 从 DTS 中解析参数,并设置 PBus 的寄存器 PBUS_CFG0
参数定义 dev - 指向 PBus 设备 base - PBus 寄存器基地址的映射地址
返回值
注意事项 -
2. pbus_set_cfg1
函数原型 static void pbus_set_cfg1(struct device *dev, void __iomem *base)
功能说明 从 DTS 中解析参数,并设置 PBus 的寄存器 PBUS_CFG1
参数定义 dev - 指向 PBus 设备 base - PBus 寄存器基地址的映射地址
返回值
注意事项 -
3. pbus_set_cfg2
函数原型 static void pbus_set_cfg2(struct device *dev, void __iomem *base)
功能说明 从 DTS 中解析参数,并设置 PBus 的寄存器 PBUS_CFG2
参数定义 dev - 指向 PBus 设备 base - PBus 寄存器基地址的映射地址
返回值
注意事项 -