0

我正在查看与 devfreq 电源管理一起使用的 exynos4_bus.c 驱动程序,以尝试为 Zynq SoC 上的外围设备开发类似的驱动程序。我关心的方法是这个:

static int exynos4210_set_busclk(struct busfreq_data *data, struct opp *opp)
{
        ...
        __raw_writel(tmp, EXYNOS4_CLKDIV_DMC0);
        ...

}

在我看来,它raw_writel正在向 Exynos 时钟寄存器写入它应该运行的频率。该寄存器定义在arch/arm/mach-exynos/include/mach/regs-clock.h. 我现在正在寻找arch\arm\mach-zynq\include\mach\zynq_soc.h与 Zynq 设置等效的东西,但是正在定义相当多的时钟,所以我不确定我应该设置哪个时钟。任何人都可以帮忙吗?

4

2 回答 2

1

Zynq 使用内核时钟框架。

包括声明:

#include <linux/clk.h>

按名称获取所需时钟的句柄:

struct clk *fclk = clk_get_sys("FPGA0", NULL);
long requested_rate = 125000000;

查找最近的支持频率:

long actual_rate = clk_round_rate(fclk, requested_rate);

然后设置时钟频率:

 int status;
    if ((status = clk_set_rate(fclk, actual_rate))) {
        printk(KERN_INFO "[%s:%d] err\n", __FUNCTION__, __LINE__);
        return status;
    }
于 2014-05-23T13:30:36.300 回答
0

您可以直接通过其寄存器更改 Zynq FCLK。最简单的测试方法是直接使用busybox中的devmem写入地址。

FCLK_CLK0 Zynq 输出的寄存器名称为 FPGA0_CLK_CTRL。获取地址的可能解决方案是打开 SDK 并打开 ps7_init.html 并搜索寄存器。

位 0-7 选择时钟源(0x00 用于 IO_PLL、0x20 ARM_PLL、0x30 DDR_PLL)

第 8-15 位是第一个除数

位 16-19 保留

位 20-25 是第二个除数

示例:对于我的 Zynq-7000,我想要 28MHz,因此我有 DIV0=36,DIV1=1 并且想要使用 IO_PLL。您可以通过在时钟配置部分设置相应的 FCLK 来获取 Zynq 模块中的值并查看在高级时钟选项卡中。在 Linux 中设置它的命令是“devmem 0xF8000170 32 0x002401”。

于 2018-05-08T10:45:48.530 回答