设计说明
15 Jul 2024
Read time: 3 minute(s)
BWM 模块的源代码位于 linux-5.10/drivers/misc/artinchip-bwm.c。
BWM 模块主要是监测 DDR 的带宽,所以 BWM 模块的驱动,主要可以分为两部分:
-
初始化 BWM,使 BWM 模块可以正常工作,这部分主要在 probe 函数中实现。
-
向用户层提供接口,方便用户可以实时查看 DDR 的带宽数据。这部分是通过 sysfs 向用户提供结点,方便用户调用。
关键流程设计
初始化流程
-
释放 clock 和 reset 信号
-
设置中断触发周期
-
申请中断
-
创建 sysfs 结点
数据结构设计
管理 BWM 资源数据的结构体
struct bwm_dev {
struct attribute_group attrs;
void __iomem *base;
struct clk *clk;
struct reset_control *rst;
u32 axi_cpu;
u32 axi_dma;
u32 axi_de;
u32 axi_ve;
u32 ahb_dma;
};
接口设计
函数原型 | static ssize_t axi_cpu_show(struct device *dev, struct device_attribute *attr, char *buf) |
---|---|
功能说明 | 显示 CPU 所占带宽 |
参数定义 |
|
返回值 | 返回写入的字符数 |
注意事项 | - |
函数原型 | static ssize_t axi_dma_show(struct device *dev, struct device_attribute *attr, char *buf) |
---|---|
功能说明 | 显示 DMA 所占带宽 |
参数定义 |
|
返回值 | 返回写入的字符数 |
注意事项 | - |
函数原型 | static ssize_t axi_de_show(struct device *dev, struct device_attribute *attr, char *buf) |
---|---|
功能说明 | 显示 DE 所占带宽 |
参数定义 |
|
返回值 | 返回写入的字符数 |
注意事项 | - |
函数原型 | static ssize_t axi_ve_show(struct device *dev, struct device_attribute *attr, char *buf) |
---|---|
功能说明 | 显示 ve 所占带宽 |
参数定义 |
|
返回值 | 返回写入的字符数 |
注意事项 | - |
函数原型 | static ssize_t ahb_dma_show(struct device *dev, struct device_attribute *attr, char *buf) |
---|---|
功能说明 | 显示 ahb dma 所占带宽 |
参数定义 |
|
返回值 | 返回写入的字符数 |
注意事项 | - |
函数原型 | static ssize_t enable_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) |
---|---|
功能说明 | 打开或关闭 BWM 模块 |
参数定义 |
|
返回值 | 返回写入的字符数 |
注意事项 | 、 |
函数原型 | static ssize_t set_period_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) |
---|---|
功能说明 | 显示 dma 所占带宽 |
参数定义 |
|
返回值 | 返回写入的字符数 |
注意事项 | - |