Часы Zynq для использования с Devfreq

Я смотрю на драйвер exynos4_bus.c, который используется с управлением питанием devfreq, чтобы попытаться разработать аналогичный драйвер для периферийного устройства на 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, но есть несколько определяемых часов, поэтому я не уверен, какие из них мне следует установить. Кто-нибудь может помочь?


person John Roberts    schedule 23.03.2013    source источник
comment
Плакат использует git clone git://git.xilinx.com/linux-xlnx.git, а не основную ветку ядра с www.kernel.org См. Машинный каталог Xilinx Zynq Указанные файлы не существуют в версии 3.8.   -  person artless noise    schedule 24.03.2013
comment
Ты прав. Прошу прощения, что не упомянул об этом. Я не знал, что они так сильно различаются.   -  person John Roberts    schedule 24.03.2013
comment
Это нормально, все люди. Хорошо, что вы это подтвердили. Кстати, на этот вопрос сложно ответить. Вам нужно, чтобы кто-то со знанием этого чипа. Предоставляет ли Xilinx лист данных? Это может быть полезно. Я не использовал никаких встроенных ядер, только FPGA или ASIC. Выглядит довольно круто.   -  person artless noise    schedule 25.03.2013


Ответы (2)


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;
    }
person Jamey Hicks    schedule 23.05.2014

Вы можете изменить Zynq FCLK непосредственно в его реестре. Самый простой способ проверить это — написать в адрес напрямую, используя devmem из busybox.

Имя регистра — FPGA0_CLK_CTRL для вывода Zynq FCLK_CLK0. Возможное решение для получения адреса — открыть SDK, открыть ps7_init.html и выполнить поиск в реестре.

Бит 0-7 выбирает источник синхронизации (0x00 для IO_PLL, 0x20 ARM_PLL, 0x30 DDR_PLL)

Бит 8-15 - первый делитель

Биты 16-19 зарезервированы

Бит 20-25 - второй делитель

Пример: для моего Zynq-7000 я хочу иметь 28 МГц, поэтому у меня DIV0 = 36, DIV1 = 1 и я хочу использовать IO_PLL. Вы можете получить значения в блоке Zynq, установив соответствующий FCLK в разделе «Конфигурация часов» и посмотрите на вкладке «Расширенные часы». Команда для установки этого в Linux будет «devmem 0xF8000170 32 0x002401».

person akira hinoshiro    schedule 08.05.2018