我正在研究与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设置找到一些等效的东西,但是有相当多的时钟正在定义中,所以我不确定应该设置哪个时钟。有人能帮上忙吗?
发布于 2014-05-23 21:30:36
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;
}发布于 2018-05-08 18:45:49
您可以通过寄存器直接更改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,我想要28 my,所以我有DIV0=36,DIV1=1和想要使用的IO_PLL.You可以通过在时钟配置部分设置相应的时钟并查看高级时钟选项卡来获取Zynq块中的值。在Linux中设置它的命令应该是"devmem 0xF8000170 32 0x002401“。
https://stackoverflow.com/questions/15593046
复制相似问题