Zynq时钟与Devfreq一起使用

时间:2013-03-23 22:54:48

标签: linux-kernel arm linux-device-driver zynq

我正在研究与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设置等效的东西,但是有很多时钟被定义,所以我不确定哪个是我应该设置的。有人可以帮忙吗?

2 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:0)

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

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

位0-7选择时钟源(IO_PLL为0x00,ARM_PLL为0x20,DDR_PLL为0x30)

位8-15是第一个除数

第16-19位保留

位20-25是第二个除数

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