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