Программирование DSP Служба управления питанием процессоров Blackfin Sat, December 07 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Служба управления питанием процессоров Blackfin Печать
Добавил(а) microsin   

В этой статье приведен перевод документации, касающейся службы управления питанием (Power Service или модуль Power Management, PM) - раздел "POWER MANAGEMENT MODULE" из даташита [1]. Эта служба библиотеки SSL (System Services Library) поддерживает динамическое управление питанием процессоров Blackfin. Рассматриваются следующие вопросы:

• Как работает модуль PM - быстрый старт
• Power Management API
• Публичные типы данных и перечисления модуля PM
• Макросы модуля PM

Модуль управления питанием (power management, далее просто сокращенно PM) предоставляет доступ ко всем возможностям динамического управления энергопотреблением (dynamic power management):

• Динамическое переключение из одного рабочего режима (full-on, active, sleep, deep sleep и hibernate) в другой.
• Динамическая установка уровней напряжения питания и тактовых частот, чтобы гарантировать, что приложение может быть подстроено под необходимое быстродействие с минимальным энергопотреблением.
• Совместно с модулем EBIU модуль PM разрешает подстройку опций SDRAM при изменении системной частоты (SCLK), чтобы гарантировать получение наилучшего быстродействия для всей системы. Дополнительную информацию по модулю EBIU см. раздел "External Bus Interface Unit Module" в [1], а также [5].

Модуль PM поддерживает 2 стратегии для установки частот ядра (core clock, CCLK, она же частота процессора) и системной частоты (system clock, SCLK, она же частота шины):

• Для имеющегося уровня напряжения частота ядра CCLK устанавливается на самую высокую допустимую для этого напряжения частоту. Частота системы SCLK устанавливается соответствующим образом.
• Для имеющейся комбинации частот CCLK и SCLK будут выбраны наиболее близкие допустимые значения, и в соответствии с ними будет подстроен уровень напряжения питания процессора.

В обоих случаях на всех стадиях настроек делаются проверки допустимости, гарантирующие, что процессор не будет остановлен или поврежден. В разделе "Как работает модуль PM - быстрый старт" описываются стадии базовых операций, требуемые для использования модуля PM.

Модуль PM использует недвусмысленную систему соглашения именований, чтобы избежать конфликтов с другими библиотеками как от Analog Devices, так и от других компаний. Для этой цели все значения перечислений enum, макроопределения #define и операторы определения типов typedef используют префикс ADI_PWR_, а функции и глобальные переменные используют эквивалентный префикс adi_pwr_ в нижнем регистре.

Для каждого процессора существует 2 версии библиотеки. В текущей версии среды разработки VisualDSP++ они соответствуют конфигурациям отладки (debug) и релиза (release). В дополнение к обычным значениям по умолчанию для конфигурации debug, функции API выполняют проверки передаваемых аргументов и сообщают об ошибках соответствующими кодами возврата, если это необходимо. В версии release библиотеки большинство функций возвратят один из 2 кодов возврата: ADI_PWR_RESULT_SUCCESS при успешном завершении, или ADI_PWR_RESULT_NOT_INITIALIZED когда модуль PM не был инициализирован перед вызовом функции.

Чтобы упростить конфигурацию параметров времени для драйверов устройств, используются Герцы (Hz) по умолчанию для единиц значений частот, а не мегагерцы (MHz). Для дополнительной информации см. врезку с описанием функции adi_pwr_Init.

[Как работает модуль PM - быстрый старт]

Следующий пример иллюстрирует использования модуля PM для конфигурирования 600 МГц процессора ADSP-BF533 платы разработчика EZ-KIT Lite board, чтобы он работал на заданных частотах ядра и шины (CCLK и SCLK), или чтобы он снизил свое энергопотребление путем снижения напряжения до 0.95V.

Шаг 1: если используется контроллер EBIU для настроек параметров SDRAM, инициализируйте модуль EBIU вызовом adi_ebiu_Init(). Дополнительную информацию по модулю EBIU см. в разделе "External Bus Interface Unit Module" [1].

Шаг 2: инициализируйте модуль PM вызовом функции adi_pwr_Init, передавая ей параметры для используемой аппаратной конфигурации. Например, следующий код конфигурирует ADSP-BF533 EZ-KIT Lite.

ADI_PWR_COMMAND_PAIR power_init_table[] =
{
   // Вариант 600 MHz ADSP-BF533:
   { ADI_PWR_CMD_SET_PROC_VARIANT, (void*)ADI_PWR_PROC_BF533SKBC600 },
   // в корпусе MBGA:
   { ADI_PWR_CMD_SET_PACKAGE,      (void*)ADI_PWR_PACKAGE_MBGA },
   // внешнее питание для регулятора 3.3V:
   { ADI_PWR_CMD_SET_VDDEXT,       (void*)ADI_PWR_VDDEXT_330 },
   // входная частота кварца 25 МГц:
   { ADI_PWR_CMD_SET_CLKIN,        (void*) 25 },
   // маркер конца списка команд:
   { ADI_PWR_CMD_END,              0 }
};
adi_pwr_Init(power_init_table);

Шаг 3: выберите стратегию управления питанием. Например, следующие сегменты кода покажут, как конфигурировать модуль PM для оптимальной скорости или оптимального энергопотребления.

Оптимальная скорость. В этом примере модуль PM установит частоты ядра и шины на максимально возможные значения.

adi_pwr_SetFreq (0,              /* частота ядра (CCLK) */
                 0,              /* частота системной шины (SCLK) */
                 ADI_PWR_DF_ON   /* не настраивать входной делитель PLL */);

Оптимальное энергопотребление. Следующие операторы дают задание модулю PM установить такие частоты ядра и шины, чтобы они были максимально допустимы для уровня напряжения 0.85 V.

adi_pwr_SetMaxFreqForVolt (ADI_PWR_VLEV_085);

Использование автоматической синхронизации. Последовательность программирования PLL для двухъядерного процессора требует, чтобы оба ядра были приведены к состоянию ожидания (IDLE state), когда прикладываются изменения к регистрам PLL и VR. Двухъядерный процессор может выполнять программу на каждом ядре, или может выполнять программу только на одном ядре. Когда для выполнения программы используются оба яра, требуется механизм для обоих ядер, чтобы они перешли в состояние IDLE, и оставались в нем, пока записываются регистры. Модуль PM предоставляет механизм, который использует поддерживающее прерывание, чтобы синхронизировать ядра для программирования PLL. Этот механизм вовлекается автоматически путем вызова функции adi_pwr_Init() на обоих ядрах, и передаче команды ADI_PWR_CMD_SET_AUTO_SYNC_ENABLED с NULL в качестве аргумента, как это показано в следующей таблице пар команд для платы разработчика ADSP-BF561 EZ-KIT Lite.

ADI_PWR_COMMAND_PAIR power_init_table[] =
{
   // 500 MHz ADSP-BF561:
   { ADI_PWR_CMD_SET_PROC_VARIANT, (void*)ADI_PWR_PROC_BF561SKBCZ500X },
   // корпус MBGA:
   { ADI_PWR_CMD_SET_PACKAGE,      (void*)ADI_PWR_PACKAGE_MBGA },
   // внешнее напряжение 3.3 V для регулятора питания:
   { ADI_PWR_CMD_SET_VDDEXT,       (void*)ADI_PWR_VDDEXT_330 },
   // входная частота 30 МГц:
   { ADI_PWR_CMD_SET_CLKIN,        (void*) 30 },
   // разрешить автосинхронизацию:
   { ADI_PWR_CMD_SET_AUTO_SYNC_ENABLED, NULL },
   // маркер конца таблицы команд:
   { ADI_PWR_CMD_END, 0 }
};
adi_pwr_Init(power_init_table);

Требование синхронизации. Двухъядерные процессоры Blackfin могут работать на одном ядре, когда второе ядро находится в состоянии ожидания (idle). Управление питанием и управление EBIU требуют помещения обоих ядер в состояние IDLE, когда делается управление питанием и меняются настройки контроллера EBIU. Если модуль EBIU был инициализирован, и была изменена частота системной шины, то параметры времени сигналов SDRAM будут автоматически подстроены. Чтобы избежать повреждения данных в SDRAM, механизм автоматической синхронизации ядер принудительно выводит оба ядра в область вне адресного пространства SDRAM, пока обновляются параметры времени SDRAM.

Здесь возможны 2 рабочих режима: работа приложения на одном ядре, и работа приложений на обоих ядрах.

Приложение работает только на одном ядре. В этом случае используется одно ядро (core A), и другое ядро (core B) запрещено. При сбросе ядро B останется запрещенным, пока код, работающий на ядре A, на запустит ядро B путем очистки бита 5 регистра SICA_SYSCR. Например:

*pSICA_SYSCR &= 0xFFDF; // очистка бита 5, чтобы ядро B начало работать

Обратите внимание, что это не разбудит ядро B, если оно в состоянии IDLE. Это всего лишь разрешит для ядра B начинать выполнять инструкции при запуске (startup). Чтобы разбудить ядро B из состояния IDLE, используется одно из двух поддерживающих прерываний (supplemental interrupt 0 задействуется системными службами, оставляя supplemental interrupt 1 для других целей).

Одноядерные приложения загружаются из flash-памяти или через порт SPI, чтобы удовлетворить вышеупомянутым требованиям синхронизации без какого-либо дальнейшего вмешательства. Однако сессия эмулятора в VisualDSP++ неизбежно разбудит ядро B. Разработчик приложения должен возвратить ядро B в запрещенное состояние, чтобы удовлетворить требования программирования PLL. Есть 2 способа выполнить это. Простейший из них состоит в запуске следующего кода на языке C на ядре B:

void main()
{
   while(1)
   {
      asm("IDLE;");
   }
}

Всякий раз, когда ядро B проснется (из-за последовательности программирования PLL, выполняемой службой PM), оно будет немедленно помещено в состояние IDLE.

Другой метод состоит в запрете бита пробуждения от PLL (PLL wakeup bit) в регистре SICB_IWR0, и переходе в состояние IDLE. Если это делается на языке ассемблера, то следующий код может быть помещен в код запуска (startup code):

#include < defBF561.h >
.section program;
 
start:
   P0.H = HI(SICB_IWR0); P0.L = LO(SICB_IWR0);
   R0 = 0;
   [P0] = R0;
   IDLE;
 
.start.end:
.global start;
.type start,STT_FUNC;

Приложение работает на обоих ядрах. В этом случае оба ядра выполняют код. Ядрам нужно синхронизироваться, чтобы гарантировать, что оба ядра находятся в состоянии IDLE и, в некоторых случаях, не было выхода выполнения кода из SDRAM, как это было описано в приведенных выше требованиях. Здесь есть 2 выбора: 1) определить свою собственную стратегию синхронизации, или 2) использовать встроенную синхронизацию, предоставляемую модулем PM (что должно быть разрешено отдельной командой).

Чтобы использовать встроенную синхронизацию, включите следующую пару команда-значение в список команд для adi_pwr_Init() на обоих ядрах:

{ ADI_PWR_CMD_SET_AUTO_SYNC_ENABLED, NULL }

Будучи активизированной, встроенная синхронизация получит эксклюзивный контроль над поддерживающим прерыванием 0 и подключит в цепочку обработчиков подходящий обработчик прерывания на подходящий уровень IVG с использованием Менеджера Прерываний. Это защитит приложение от использования прерывания для любой другой синхронизации между ядрами. Однако поддерживающее прерывание 1 все еще остается доступным для использования вне системных служб для других целей синхронизации ядер. Можно использовать дополнительные команды, чтобы удовлетворять требованиям синхронизации (см. таблицу 3-1).

Таблица 3-1. Дополнительные команды для адаптации синхронизации.

Мнемоника команды Описание
Команда доступна на ядре A и на ядре B
ADI_PWR_CMD_SET_SYNC_LOCK_VARIABLE Предоставляет адрес переменной захвата (lock variable) в памяти L2 как альтернативу встроенной переменной захвата (по умолчанию используется встроенная переменная adi_pwr_lockvar). Обычно эта команда не требуется.
Команда доступна только на ядре B
ADI_PWR_CMD_SET_COREB_SUPP_INT0_IVG Задает уровень IVG, который будет назначен для поддерживающего прерывания (supplemental interrupt) 0 на ядре B. Обычно эта команда не требуется.

Синхронизация между ядрами. Любое ядро может прервать другое ядро, используя так называемое поддерживающее прерывание (supplemental interrupt). Для процессора ADSP-BF561 есть два таких поддерживающих прерывания: 0 и 1. Общая переменная блокировки размещена в памяти, которая может передавать информацию между ядрами и использоваться как метод синхронизации.

Встроенный механизм требует, чтобы ядро A инициировало все изменения по управлению питанием, с ядром B, сконфигурированным на ответ на событие поддерживающего прерывания 0, которое сгенерирует ядро A. Конфигурация и обработка этого прерывания управляется внутри самого модуля PM. Таблица 3-2 описывает последовательность синхронизации.

Таблица 3-2. Последовательность синхронизации между ядрами.

Ядро A Ядро B
Запускает поддерживающее прерывание 0, устанавливает общую переменную захвата adi_pwr_lockvar и ждет подтверждения от ядра B.
Отвечает поддерживающему прерыванию 0 путем входа в обработчик прерывания.
Запускает (опционально) первую callback-функцию.
При получении подтверждения выполняет последовательность программирования PLL и соответствующим образом конфигурирует SDC. Подтверждает прерывание и переходит в состояние IDLE.
Пробуждается по событию PLL wakeup и ожидает очистки переменной захвата.
Завершает процесс путем очистки переменной захвата. Запускает (опционально) вторую callback-функцию.

Встроенная переменная блокировки (Lock Variable) и соглашения о линковке. Переменная блокировки adi_pwr_lockvar декларируется в файле Blackfin \ lib \ src \ services \ pwr \ adi_pwr_lockvar.c следующим образом:

section ("l2_shared") testset_t adi_pwr_lockvar = 0;

где входная секция памяти l2_shared привязана к выходной секции MEM_L2_SRAM в настройках по умолчанию и генерируемых файлах описания конфигурации линкера (linker description files, .ldf).

В соответствии с Приложением A руководства по программированию C/C++ и библиотекам в системе VisualDSP++ для процессоров Blackfin [2], есть два возможных способа написания приложений, которые работают на обоих ядрах.

• Одно приложение на ядро, где исполняемые коды собираются для каждого ядра с помощью двух проходов линкера.
• Одно приложение, работающее на двух ядрах, где используется группа из 5 проектов, и используется один проход линкера для сборки исполняемых кодов для обоих процессоров.

Последний способ привязывает переменную блокировки к памяти L2, которая используется совместно обоими процессорами без какого-либо вмешательства пользователя. Способ "одно приложение на ядро" требует вмешательства пользователя для гарантии, что переменная блокировки была привязана на один и тот же адрес памяти L2 в каждом из исполняемых приложений. Это достигается с использованием оператора RESOLVE в файле .ldf, который можно использовать для определения адреса символа в памяти, назначенном в исполняемом файле для каждого ядра.

Настройки по умолчанию и генерируемые файлы .ldf для ядра B содержат следующее:

/* $VDSG< customize-shared-symbols > */
/* Этот код сохраняется, если LDF генерируется заново. */
/////////////////////////////////////////////////////////////
// ldf_shared_symbols
/* Оператор разрешения для общих символов, привязанных в ядре A.
** Ниже приведен пример, как это делается.
*/
#if defined(OTHERCORE) /* OTHERCORE это макрос, определенный
                          для имени CoreA DXE */
   #include < shared_symbols.h > /* Библиотека C runtime
                                    для общих символов использует
                                    макрос OTHERCORE. */
   #if 0
      /* пример разрешения для общих данных пользователя */
      RESOLVE(_a_shared_datum, OTHERCORE)
   #endif
#endif /* OTHERCORE */
/* $VDSG< customize-shared-symbols > */

Заголовочный файл shared_symbols.h содержит операторы RESOLVE для общих библиотечных символов C/C++, и подключает дополнительный заголовочный файл services/services_shared_symbols.h, содержащий операторы RESOLVE для общих символов системных служб. В настоящий момент системные службы используют только один общий символ переменной adi_pwr_lockvar.

Все, что требуется, это определить OTHERCORE в блоке настроек LDF, модифицируемом пользователем перед тем, где это проверено (или путем установки его значения через страницу Link: LDF Preprocessing окна диалога настроек проекта (Project Options VisualDSP++). Например, если исполняемый файл одного ядра CoreA.dxe, то для ядра A он находится в подкаталоге Release, то соседнее с этим ядром CoreB в его каталоге проекта требует определения OTHERCORE как ..\CoreA\Release\CoreA.dxe. Пример:

#define OTHERCORE ..\CoreA\Release\CoreA.dxe#if defined(OTHERCORE)
...

Подробности см. в Приложении A руководства [2] и документацию по линкеру и утилитам системы программирования VisualDSP++ 5.0.

Инициализация SDRAM перед загрузкой исполняемого кода. Приложения, которые требуют размещения кода (и/или данных) в SDRAM в момент загрузки требуют, чтобы сначала был соответствующим образом (в зависимости от конфигурации подключенной внешней памяти SDRAM) был проинициализирован контроллер SDRAM. Это случай для всех приложений, где разрешено кэширование инструкций и/или данных. Однако подпрограмма adi_ebiu_Init() инициализации службы EBIU не выполнится, пока не будет загружено приложение.

Есть два способа загрузить приложение в процессорное ядро:

• Через сессию эмулятора (отладчика JTAG), подключенного в среде разработки VisualDSP++.
• Через память FLASH или устройство, подключенное через порт SPI, когда процессор сбрасывается (или когда включается питание).

В первом случае обязательно используется выбранная опция Use XML reset values в окне диалога настройки свойств целевого процессора (диалог Target Options, доступный через меню Settings, появляющееся после запуска сессии отладки, см. скриншоты ниже).

VisualDSP Settings Target Options VisualDSP Target Options Use XML reset values

Также требуется указать место расположения файла XML для загружаемой сессии отладки (меню Settings -> Session..., см. скриншоты ниже).

VisualDSP Settings Session VisualDSP Settings Session XML file

Это гарантирует, что SDRAM корректно (пусть даже не оптимально) будет сконфигурировано перед тем, как в SRAM загрузится приложение и его данные. Будучи загруженным, приложение использует службы PM и EBIU для гарантии, что SDRAM конфигурируется оптимально.

Когда приложение не загружается из сессии эмулятора, необходимо написать загрузчик, который целиком размещается в SRAM, и при запуске инициализирует SDRAM, после чего может быть загружено основное приложение [4]. Это достигается с использованием блока инициализации, как это описано в руководстве по библиотекарю и утилиты загрузчика VisualDSP++ 5.0 [2], где демонстрируется пример инициализации SDRAM (см. также [3, 4]).

Этот блок кода инициализации копируется в исполняемый код, и передается загрузчику через опцию –init filename или в поле инициализации Load: Options на странице диалога настройки свойств проекта (Project Options) VisualDSP++. Для этого исполняемого блока инициализации требуется отдельный проект. Пример проекта для блока инициализации см. в соответствующей для процессора поддиректории каталога Blackfin\ldr\init_code в папке установки VisualDSP++. Значения, требуемые для регистров конфигурации SDRAM можно установить в соответствующие значения из файла .xml для применяемого процессора, например ADSP-BF533-proc.xml, который находится в каталоге System\Arch-Def директории инсталляции VisualDSP++.

Когда требуются различные конфигурации для памяти (отличающиеся от предоставленных вместе с системами оценочных плат EZ-KIT Lite), пользователю придется поработать над установкой правильных значений. Когда программа загружается из среды разработки VisualDSP++ через отладчик, то либо используйте фичу Custom Board Support, доступную в VisualDSP++5.0 (описание см. в Help -> Graphical Environment -> Custom Board Support), или просто отредактируйте значения регистров в соответствующем файле .xml после сохранения копии оригинального файла.

[Power Management API]

В этом разделе приведено описание интерфейса программирования (API) модуля PM.

Функция adi_pwr_AdjustFreq() позволяет модифицировать тактовые частоты ядра и системной шины (CCLK и SCLK), указывая коэффициенты деления частоты тактов ядра и системы CSEL и SSEL, находящиеся в полях регистра PLL_DIV. Процессор находится в активном режиме (не в состоянии ожидания).

ADI_PWR_RESULT adi_pwr_AdjustFreq (ADI_PWR_CSEL csel,
                                   ADI_PWR_SSEL ssel);

Аргументы:

csel Значение ADI_PWR_CSEL, которое показывает, как будет поделена частота регулятора напряжения питания (voltage core oscillator), чтобы получить новую частоту ядра. Значение делителя не может превышать значения ssel. См. описание во врезке ADI_PWR_CSEL.
ssel Значение ADI_PWR_SSEL, которое показывает, как будет поделена частота регулятора напряжения питания (voltage core oscillator), чтобы получить новую частоту системной шины. См. описание во врезке ADI_PWR_SSEL.

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Процесс завершился успешно.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.
ADI_PWR_RESULT_INVALID_CSEL Указано недопустимое значение для CSEL.
ADI_PWR_RESULT_INVALID_SSEL Указано недопустимое значение для SSEL.
ADI_PWR_INVALID_CSEL_SSEL_COMBINATION Значение делителя тактовой часты ядра (CSEL) больше, чем значение системного делителя тактовой частоты (SSEL), или для обоих этих параметров указаны значения ADI_PWR_CSEL_NONE и ADI_PWR_SSEL_NONE.

Функция adi_pwr_Control() разрешает конфигурировать регистры управления питанием или считывать их значения с помощью списков пар команда-значение (см. врезку ADI_PWR_COMMAND_PAIR), заданных одним из трех способов:

1) Будет передана одна пара команда-значение.

adi_pwr_Control (ADI_PWR_CMD_SET_INPUT_DELAY,
                 (void*)ADI_PWR_INPUT_DELAY_ENABLE);

2) Будет передана структура ADI_PWR_COMMAND_PAIR с одной парой команда-значение.

ADI_PWR_COMMAND_PAIR cmd =
{
   ADI_PWR_CMD_SET_INPUT_DELAY,
   (void*)ADI_PWR_INPUT_DELAY_ENABLE,
};
adi_pwr_Control (ADI_PWR_CMD_PAIR, (void*)&cmd);

3) Будет передана таблица пар команд типа в виде списка структур ADI_PWR_COMMAND_PAIR. Последняя запись в списке должен быть с командой признака окончания списка ADI_PWR_CMD_END.

ADI_PWR_COMMAND_PAIR table[] =
{
   { ADI_PWR_CMD_SET_INPUT_DELAY,  (void*)ADI_PWR_INPUT_DELAY_ENABLE },
   { ADI_PWR_CMD_SET_OUTPUT_DELAY, (void*)ADI_PWR_OUTPUT_DELAY_ENABLE },
   { ADI_PWR_CMD_END, 0}
};
adi_pwr_Control(ADI_PWR_CMD_TABLE,(void*)table);

Подробнее см. врезку ADI_PWR_COMMAND в разделе "Публичные типы данных и перечисления модуля PM", где приведен полный список команд и связанных с ними значений.

ADI_PWR_RESULT adi_pwr_Control (ADI_PWR_COMMAND Command,
                                void *Value);

Аргументы:

Command Значение из перечисления ADI_PWR_COMMAND, означающую команду. Команда определяет смысл связанного значения аргумента команды Value.
Value Требуемое значение, см. врезку ADI_PWR_COMMAND.

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Функция завершилась успешно.
ADI_PWR_RESULT_BAD_COMMAND Была указана недопустимая команда.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.
ADI_PWR_RESULT_INVALID_INPUT_DELAY Недопустимое значение входной задержки.
ADI_PWR_RESULT_INVALID_OUTPUT_DELAY Недопустимое значение выходной задержки.
ADI_PWR_RESULT_INVALID_LOCKCNT Недопустимое значение для счетчика захвата PLL (PLL lock count).

Функция adi_pwr_GetConfigSize() возвратит количество байт, требуемых для сохранения данных текущей конфигурации. Это значение также доступно через использование макроса ADI_PWR_SIZEOF_CONFIG. Возвращенное значение adi_pwr_GetConfigSize и этого макроса ADI_PWR_SIZEOF_CONFIG, объединяет размер конфигурации модуля EBIU, независимо от времени его инициализации.

size_t adi_pwr_GetConfigSize (void);

Возвращаемое значение: размер структуры конфигурации.

Функция adi_pwr_GetFreq() возвратит текущие значения частот CCLK, SCLK (частота ядра и системной шины), а также частоту стабилизатора напряжения питания ядра.

ADI_PWR_RESULT adi_pwr_GetFreq (u32 *fcclk,
                                u32 *fsclk,
                                u32 *fvco);

Аргументы:

fcclk Адрес ячейки, куда нужно сохранить текущее значение тактовой частоты CCLK (Гц).
fsclk Адрес ячейки, куда нужно сохранить текущее значение тактовой частоты SCLK (Гц).
fvco Адрес ячейки, куда нужно сохранить значение частоты стабилизатора напряжения питания ядра (Гц).

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Процесс завершился успешно.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.

Важное замечание: как мне кажется, в этой функции содержится ошибка. Заключается она в том, что текущие частоты ядра и шины (CCLK и SCLK) вычисляются в этой функции не на основе содержимого регистров PLL_CTL и PLL_DIV (как это должно быть), а почему-то из значений полей pll_ctl и pll_div структуры adi_pwr_active_config. По этой причине иногда (если adi_pwr_active_config заполнена неправильно), тактовые частоты функция adi_pwr_GetFreq вычисляет неверно.

Не нашел в документации и примерах объяснения этого факта. Чтобы решить проблему, у нас есть два варианта - либо внести исправление в функцию adi_pwr_GetFreq, которая находится в модуле adi_pwr.c, и использовать в проекте исправленный вариант, либо предварительно правильно заполнить поля pll_ctl и pll_div структуры adi_pwr_active_config. Я выбрал второй вариант:

extern ADI_PWR_CONFIG adi_pwr_active_config;
 
// Получение частот PLL. Без заполнения этих полей
// функция adi_pwr_GetFreq отработает неправильно!
adi_pwr_active_config.pll_ctl = *(ADI_PWR_PLL_CTL_REG*)pPLL_CTL;
adi_pwr_active_config.pll_div = *(ADI_PWR_PLL_DIV_REG*)pPLL_DIV;
adi_pwr_GetFreq(&fcclk, &fsclk, &fvco);

Функция adi_pwr_GetPowerMode() возвратит текущий режим процессора (доступно только для режимов full-on и active).

ADI_PWR_MODE adi_pwr_GetPowerMode (void);

Возвращаемое значение: текущий режим энергопотребления как значение типа ADI_PWR_MODE.

Функция adi_pwr_GetPowerSaving() вычисляет значение экономии питания для текущей настройки PLL и регулятора напряжения ядра, по формулам из даташита с установкой для разных режимов питания.

u32 adi_pwr_GetPowerSaving (void);

Возвращаемое значение: на сколько процентов экономится питание.

Функция adi_pwr_Init() инициализирует модуль PM. Для успешной установки нужно установить следующие значения:

Вариант процессора Значение типа ADI_PWR_PROC_KIND (см. соответствующую врезку), которое задает используемый процессор.
Тип корпуса Значение типа ADI_PWR_PACKAGE_KIND (см. соответствующую врезку), которое задает вид корпуса процессора.
Напряжение питания ядра (VDDINT) Значение ADI_PWR_VLEV, которое задает внутреннее напряжение, прикладываемое к ядру от внешнего регулятора напряжения. При этом внутренний регулятор напряжения пропускается (bypassed, т. е. не используется). Отсутствие установки этого параметра в таблице команд подразумевает использование внутреннего регулятора напряжения. Для варианта процессора ADSP-BF533SKBC750 требуется внешний регулятор напряжения, потому что внутренний регулятор не может выдать напряжение 1.4V, требуемое для работы этого процессора на частоте 750 МГц.
Внешнее напряжение питания (VDDEXT) Значение ADI_PWR_VDDEXT, которое задает внешнее напряжение, прикладываемое к регулятору напряжения. Это значение вместе с информацией о корпусе определяет максимальную доступную тактовую частоту системной шины (SCLK). См. врезку ADI_PWR_VDDEXT.
CLKIN Частота внешнего тактового генератора, подключенного к процессору (указывается в МГц или в Гц).

Обмен с функцией adi_pwr_Init происходит через передачу указателя на таблицу пар команда-значение. Таблица должна завершаться командой ADI_PWR_CMD_END.

Например, следующая таблица ADI_PWR_COMMAND_PAIR предоставлена для оценочной платы разработчика EZ-KIT Lite:

ADI_PWR_COMMAND_PAIR ezkit_init[] =
{
   { ADI_PWR_CMD_SET_PROC_VARIANT, ADI_PWR_PROC_BF533SKBC600 },
   { ADI_PWR_CMD_SET_PACKAGE, ADI_PWR_PACKAGE_MBGA },
   { ADI_PWR_CMD_SET_VDDEXT, ADI_PWR_VDDEXT_330 },
   { ADI_PWR_CMD_SET_CLKIN, 25 /* МГц */ },
   { ADI_PWR_CMD_END, 0 }
};

В таблице 3-3 перечислены допустимые пары команда-значение.

Таблица 3-3. Пары Command-Value для списка команд функции adi_pwr_Init.

Мнемоника команды Описание
ADI_PWR_CMD_SET_CCLK_TABLE Адрес таблицы, содержащей значения ADI_PWR_NUM_VLEVS типа u16, описывающие максимальную частоту CCLK для каждого значения ADI_PWR_VLEV. Эти значения используются вместо значений из даташита.
ADI_PWR_CMD_SET_PROC_VARIANT Значение ADI_PWR_PROC_KIND (обязательное, см. соответствующую врезку), задающее вариант используемого процессора.
ADI_PWR_CMD_SET_PACKAGE Значение ADI_PWR_PACKAGE_KIND (обязательное, см. соответствующую ссылку), задающее тип используемого корпуса процессора.
ADI_PWR_CMD_SET_CLKIN Значение u16 (обязательное), задающее внешнюю тактовую частоту CLKIN, предоставленную для процессора.
ADI_PWR_CMD_SET_VDDINT Значение ADI_PWR_VLEV (см. соответствующую врезку), задающее напряжение питания ядра. Это значение должно быть передано функции adi_pwr_Init только если используется внешний регулятор напряжения, так как наличие этой команды в таблице команд задает отключение внутреннего регулятора напряжения.
ADI_PWR_CMD_SET_VDDEXT Значение ADI_PWR_VDDEXT (обязательное, см. соответствующую врезку), задающее внешнее напряжение, прикладываемое к внутреннему регулятору напряжения.
ADI_PWR_CMD_SET_IVG Значение типа interrupt_kind (см. exception.h), задающее уровень IVG для события PLL_WAKEUP.
ADI_PWR_CMD_SET_INPUT_DELAY Значение ADI_PWR_INPUT_DELAY (см. соответствующую врезку), которое определяет, добавить ли приблизительно 200 пс задержки до времени, когда входы будут защелкнуты на внешнем интерфейсе памяти.
ADI_PWR_CMD_SET_OUTPUT_DELAY Значение ADI_PWR_CMD_SET_OUTPUT_DELAY (см. соответствующую врезку), которое определяет, добавить ли приблизительно 200 пс задержки для выходных сигналов внешнего интерфейса памяти.

Функцию adi_pwr_Init можно вызвать только один раз. Последующие вызовы adi_pwr_Init будут игнорироваться с кодом возврата ADI_PWR_RESULT_ALREADY_INITIALIZED.

В таблице 3-4 перечислены допустимые пары команда-значение для двухъядерного процессора ADSP-BF561.

Таблица 3-4. Пары Command-Value для ADSP-BF561 Dual-Core Processor.

Мнемоника команды Описание
Команды относятся только к двухъядерному процессору ADSP-BF561
ADI_PWR_CMD_SET_AUTO_SYNC_ENABLED Инструктирует модуль PM использовать встроенный механизм для синхронизации ядер при изменении настроек PLL. Для связанного параметра этой команды используйте NULL. Эта команда передается в функцию adi_pwr_Init() на обоих ядрах.
ADI_PWR_CMD_SET_COREB_SUPP_INT0_IVG Уровень IVG, который назначается для поддерживающего прерывания (supplemental interrupt) 0 на ядре B. Эта команда передается в функцию adi_pwr_Init() только на ядре B.
ADI_PWR_CMD_SET_SYNC_LOCK_VARIABLE Адрес переменной захвата (lock variable) в памяти L2, которая используется для встроенной синхронизации. По умолчанию используется встроенная переменная adi_pwr_lockvar.
ADI_PWR_CMD_SET_FIRST_CLIENT_CALLBACK Адрес функции, которую вызовет ядро B перед тем, как будут сделаны изменения настроек PLL. Эта команда передается в функцию adi_pwr_Init() только на ядре B.
ADI_PWR_CMD_SET_SECOND_CLIENT_CALLBACK Адрес функции, которую вызовет ядро B после того, как будут выполнены изменения PLL. Эта команда передается в функцию adi_pwr_Init() только на ядре B.
ADI_PWR_CMD_SET_CLIENT_HANDLE Значение типа void*/адрес, которое будет отправлено функции callback. Эта команда передается в функцию adi_pwr_Init() только на ядре B.

Прототип функции:

ADI_PWR_RESULT adi_pwr_Init (const ADI_PWR_COMMAND_PAIR *table);

Аргумент:

ConfigData Адрес таблицы команд с парами команда-значение (см. врезку ADI_PWR_COMMAND_PAIR). Последней командой в этой таблице должна быть команда ADI_EBIU_CMD_END (маркер конца таблицы).

Возвращаемые значения: в отладочной версии библиотеки adi_pwr_Init вернет коды возврата, перечисленные ниже. Иначе будет возвращено значение либо ADI_PWR_RESULT_SUCCESS, либо ADI_PWR_RESULT_ALREADY_INITIALIZED (когда модуль PM уже был инициализирован).

Чтобы упростить конфигурирование параметров времени для драйверов устройств, единица по умолчанию для частоты при обмене с функциями PM задаются в Герцах (Гц), а не в мегагерцах (МГц).

Если для приложения требуется единицы частот в МГц, а не Гц, то служба PM может управляться в формате частот мегагерц с помощью новой команды ADI_PWR_CMD_SET_FREQ_AS_MHZ для функции adi_pwr_Init(). С этой командой сопровождаемое значение параметра будет игнорироваться. Например, если если передается таблица команд в функцию adi_pwr_Init(), то в неё должна быть добавлена команда:

{ ADI_PWR_CMD_SET_FREQ_AS_MHZ, NULL },

В таблице 3-5 перечислены и объяснены коды возврата.

Таблица 3-5. Коды возврата функции adi_pwr_Init.

ADI_PWR_RESULT_SUCCESS Функция завершилась успешно.
ADI_PWR_RESULT_BAD_COMMAND Была указана недопустимая команда.
ADI_PWR_RESULT_ALREADY_INITIALIZED Модуль PM уже был инициализирован.
ADI_PWR_RESULT_INVALID_VLEV Предоставлен недопустимый уровень напряжения ядра.
ADI_PWR_RESULT_INVALID_VDDEXT Предоставлен недопустимый уровень внешнего напряжения.
ADI_PWR_RESULT_VDDINT_MUST_BE_SUPPLIED Когда используется внешний регулятор напряжения, то предоставляемое снаружи напряжение VDDINT должно быть передано в функцию adi_pwr_Init.
ADI_PWR_RESULT_INVALID_PROCESSOR Указан недопустимый тип процессора.
ADI_PWR_RESULT_INVALID_IVG Указан недопустимый уровень IVG.
ADI_PWR_RESULT_INVALID_INPUT_DELAY Недопустимое значение входной задержки внешней шины памяти.
ADI_PWR_RESULT_INVALID_OUTPUT_DELAY Недопустимое значение выходной задержки внешней шины памяти.
ADI_PWR_RESULT_INVALID_LOCKCNT Недопустимое значение счетчика захвата PLL (PLL lock count).
ADI_PWR_RESULT_INVALID_EZKIT Задан недопустимый тип для оценочной платы разработчика EZ-KIT.
ADI_PWR_RESULT_CANT_HOOK_SUPPLEMENTAL_INTERRUPT Не получилось подцепить поддерживающее прерывание (supplemental interrupt) для приостановки другого ядра (только для двухпроцессорного ядра).

Функция adi_pwr_LoadConfig() восстанавливает текущие значения конфигурации из области памяти, на которую указывает аргумент hConfig. Контроллер PLL и регулятор напряжения будут перепрограммированы. Если модуль EBIU был инициализирован, эта конфигурация также загружается, и программируется контроллер SDRAM.

ADI_PWR_RESULT adi_pwr_LoadConfig (const ADI_PWR_CONFIG_HANDLE hConfig,
                                   const size_t szConfig);

Аргументы:

hConfig Адрес области памяти, откуда будет прочитана восстанавливаемая текущая конфигурация.
szConfig Количество байт, доступных по указанному адресу. Это значение должно быть больше или равно возвращенному значению функции adi_pwr_GetConfigSize().

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Функция завершилась успешно.
ADI_PWR_RESULT_NO_MEMORY Недостаточное количество памяти, указанное в параметре szConfig.
ADI_PWR_RESULT_FAILED Адрес hConfig равен 0.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.

Функция adi_pwr_Reset() сбрасывает контроллер PLL в свои аппаратные значения по умолчанию, которые применяются при сбросе.

void adi_pwr_Reset (void);

Функция adi_pwr_SaveConfig() сохраняет текущие значения конфигурации в область памяти, на которую указывает аргумент hConfig. Если модуль EBIU был инициализирован, то его конфигурация сохраняется также; иначе соответствующие поля его конфигурации останутся незаполненными (не определенными).

ADI_PWR_RESULT adi_pwr_SaveConfig (ADI_PWR_CONFIG_HANDLE hConfig,
                                   const size_t szConfig);

Аргументы:

hConfig Адрес области памяти, куда будет записана сохраняемая текущая конфигурация.
szConfig Количество байт, доступных по указанному адресу. Это значение должно быть больше или равно возвращенному значению функции adi_pwr_GetConfigSize().

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Функция завершилась успешно.
ADI_PWR_RESULT_NO_MEMORY Недостаточное количество памяти, указанное в параметре szConfig.
ADI_PWR_RESULT_FAILED Адрес hConfig равен 0.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.

Функция adi_pwr_SetFreq() настраивает контроллер PLL для предоставления частот CCLK и SCLK со значениями, максимально близкими к запрашиваемым (указанным в Гц). Если регулятор напряжения не запрещен, то его конфигурация будет подстроена (в случае необходимости) для предоставления минимального напряжения, которое может поддерживать запрашиваемые частоты.

Процессор переводится в состояние ожидания (idle), чтобы изменения вошли в силу.

Эта функция всегда находит такое решение, где делитель CSEL в делитель регистра PLL_DIV единица. Если запрошен входной делитель PLL, то будет минимизирована разница между запрашиваемыми значениями и установленными.

Чтобы определить значения, которые были реально установлены этой функцией, используйте функцию adi_pwr_GetFreq.

ADI_PWR_RESULT adi_pwr_SetFreq (const u32 fcclk,
                                const u32 fsclk,
                                const ADI_PWR_DF df);

Аргументы:

fcclk Запрашиваемое значение для тактовой частоты CCLK (Гц). Если здесь задано 0, то функция adi_pwr_SetFreq дает приоритет для соответствия запрашиваемого значения частоты SCLK, и выставляет значение CCLK как можно ближе к максимально допустимой частоте для текущего уровня напряжения питания ядра.
fsclk Запрашиваемое значение тактовой частоты SCLK (Гц).
df Значение из перечисления ADI_PWR_DF (см. соответствующую врезку), которое используется в этом случае для указания, должна ли функция включить входной делитель PLL, чтобы минимизировать различие между запрашиваемой тактовой частотой и реальной частотой, которая может быть получена. Включение делителя может привести к снижению рассеиваемой процессором мощности. Передача ADI_PWR_DF_ON указывает, что входной делитель PLL уже был разрешен. Передача ADI_PWR_DF_NONE указывает, что может разрешить эту возможность, чтобы достичь лучшей гранулярности (в этом контексте ADI_PWR_DF_OFF не имеет смысла).

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Процесс завершился успешно.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.

Функция adi_pwr_SetMaxFreqForVolt() устанавливает значение регистра управления регулятором напряжения (voltage regulator control register, VR_CTL), в соответствии с требуемым уровнем напряжения и подстраивает частоты процессора CCLK и SCLK, чтобы они были максимально допустимыми для установленного уровня напряжения питания.

Чтобы применились изменения, процессор переводится в состояние ожидания (idle).

ADI_PWR_RESULT adi_pwr_SetMaxFreqForVolt (const ADI_PWR_VLEV vlev);

Аргумент:

vlev Требуемый уровень напряжения, устанавливаемый как значение из перечисления ADI_PWR_VLEV (см. соответствующую врезку).

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Функция завершилась успешно.
ADI_PWR_RESULT_INVALID_VLEV Недопустимое значение vlev.
ADI_PWR_RESULT_VR_BYPASSED Регулятор напряжения отключен (bypassed). Перед этим вызовом требуется вызов adi_dma_SetVoltageRegulator с не нулевым значением частоты переключения (см. врезку с описанием функции adi_dma_SetVoltageRegulator).
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.

Функция adi_pwr_SetPowerMode() устанавливает режим питания (power mode) процессора. Имеется 5 режимов:

Full-On. Тактовая частота ядра (CCLK) и системной шины (SCLK) имеют значения, установленные функциями adi_pwr_SetFreq или adi_pwr_SetVoltageRegulator. Разрешен полный функционал для DMA.

Active. Блок PLL пропускается, так что ядро процессора и системная шина работают на входной тактовой частоте CLKIN (частота кварцевого генератора). Доступ DMA работает для правильно сконфигурированной памяти L1.

Sleep. Ядро процессора находится в состоянии ожидания (idle), или состоянии сна. Системная частота (частота шины SCLK) продолжает поступать на скорости, установленной функциями adi_pwr_SetFreq или adi_pwr_SetVoltageRegulator functions. Работа DMA ограничена доступом к внешней памяти. См. ниже инструкции для выбора пробуждений процессора (wakeup), чтобы вывести его из режима сна.

Deep Sleep. Глубокий сон, при котором запрещена работа ядра процессора и всех периферийных устройств, за исключением блока часов реального времени (real-time clock, RTC). В этом режиме DMA не поддерживается. SDRAM устанавливается в режим самообновления (self-refresh mode). Регулятор напряжения ядра включается по прерыванию от RTC или от события аппаратного сброса. В обоих случаях инициируется последовательность сброса ядра.

Hibernate. Внутренний регулятор напряжения выключается. SDRAM устанавливается в режим самообновления. Регулятор напряжения включается от аппаратного сброса. См. ниже инструкции по выбору способа пробуждения для вывода процессора из режима hibernate.

Пока SDRAM не будет правильно сконфигурировано и пока не будет для неё выбрана подходящая частота обновления (refresh rate), данные в SDRAM будут теряться. Это справедливо только для выхода из режимов hibernate или deep sleep по событию аппаратного сброса. Для процессорных ядер ADSP-BF531, ADSP-BF532 и ADSP-BF533 вывод SCKE процессора устанавливается при сбросе, чем SDRAM выводится из режима самообновления. Такое поведение является следствием ограничения для соответствия стандарту памяти PC-133. Для некоторых процессоров, в настоящее время включая семейства ADSP-BF537 и ADSP-BF527, это ограничение можно обойти разрешением бита CKELOW в регистре VR_CTL (см. врезку adi_pwr_SetVoltageRegulator). Этого можно также достичь вставкой следующей пары команда-значение в таблицу команд для функции adi_pwr_Init:

{ ADI_PWR_CMD_SET_PC133_COMPLIANCE, 0 }

Чтобы указать метод пробуждения (wakeup) для выхода из режимов sleep или hibernate:

1. Вызовите adi_int_SICGlobalWakeup для запрета всех событий wakeup.
2. Вызовите adi_int_SICWakeup для каждого wakeup, который останется разрешенным, пока процессора в режиме низкого энергопотребления (low power mode).
3. Вызовите adi_pwr_SetVoltageRegulator, чтобы разрешить соответствующие биты wakeup в регистре VR_CTL (если это пока не установлено).
4. Вызовите adi_pwr_SetPowerMode для установки режима работы процессора (power mode).
5. При пробуждении восстановите wakeup-регистры в свое предыдущее состояние вызовом adi_int_SICGlobalWakeup.

Прототип функции:

ADI_PWR_RESULT adi_pwr_SetPowerMode (const ADI_PWR_MODE mode);

Аргумент:

mode Значение из перечисления ADI_PWR_MODE (см. соответствующую врезку), которое задает состояние (режим энергопотребления), в которое должен перейти процессор.

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Процесс завершился успешно.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.
ADI_PWR_RESULT_INVALID_MODE Либо задан некорректный режим, либо запрошенный режим не может быть достигнут из текущего режима.

Функция adi_pwr_SetVoltageRegulator() устанавливает регистр управления регулятором напряжения (voltage regulator control register, VR_CTL), настраивая одно или большее количество его следующих полей.

VLEV Требуемый уровень напряжения в виде значения из перечисления ADI_PWR_VLEV.
FREQ Требуемая частота переключения для регулятора напряжения в виде значения из перечисления ADI_PWR_VR_FREQ.
GAIN Требуемое значение усиления в контуре регулировки напряжения в виде значения из перечисления ADI_PWR_VR_GAIN.
WAKE Значение из перечисления ADI_PWR_VR_WAKE, показывающее, должен ли быть разбужен регулятор напряжения при выходе из power-down, когда запускается прерывание от RTC или поступает перепад в лог. 0 на вывод RESET#.
PHYWE Значение из перечисления ADI_PWR_VR_PHYWE, показывающее, должен ли быть разбужен регулятор напряжения при выходе из power-down по активности Ethernet PHY.
CANWE Значение из перечисления ADI_PWR_VR_CANWE, показывающее, должен ли быть разбужен регулятор напряжения при выходе из power-down по активности на шине CAN.
CLKBUFOE Значение из перечисления ADI_PWR_VR_CLKBUFOE, управляющее, должны ли другие устройства (скорее всего Ethernet PHY) тактироваться от входа CLKIN. Этот бит устанавливается, если используется Ethernet PHY на оценочной плате разработчика ADSP-BF537 EZ-KIT Lite.
CKELOW Значение из перечисления ADI_PWR_VR_CKELOW, управляющее, должно ли быть защищено поведение по умолчанию сброса установкой выводов контроллера EBIU в свое неактивное состояние. Этот бит устанавливается, если SDRAM помещается в режим самообновления (self-refresh mode) при переводе процессора в режим hibernate.
USBWE Значение из перечисления ADI_PWR_VR_USBWE, показывающее, должен ли быть разбужен регулятор напряжения при выходе из power-down по активности интерфейса USB.

Эти значения передаются в функцию adi_pwr_SetVoltageRegulator через одну пару команда-значение или через последовательность пар в виде таблицы, которую завершает команда ADI_PWR_CMD_END - точно таким же способом, как это делалось в функции adi_pwr_Control. Подробнее см. врезку adi_pwr_Control.

Например, чтобы пропустить встроенный регулятор напряжения, должен использоваться следующий код:

adi_pwr_SetVoltageRegulator (ADI_PWR_SET_VR_FREQ,
                             (void*) ADI_PWR_VR_FREQ_POWERDOWN);

В таблице 3-6 определены пары команда-значение, которые могут использоваться с функцией adi_pwr_SetVoltageRegulator. Использование других пар недопустимо.

Таблица 3-6. Пары Command-Value для функции adi_pwr_SetVoltageRegulator.

Мнемоника команды Описание и связанное значение параметра команды
ADI_PWR_CMD_END Это маркер конца таблицы команд. Значение данных команды игнорируется.
ADI_PWR_CMD_PAIR Используется, чтобы сообщить функции adi_pwr_SetVoltageRegulator, что передана одна пара команда-значение.
ADI_PWR_CMD_TABLE Используется, чтобы сообщить функции adi_pwr_SetVoltageRegulator, что передана таблица пар команд команда-значение.
ADI_PWR_CMD_SET_VR_VLEV Значение ADI_PWR_VLEV, задающее требуемый уровень для регулятора напряжения.
ADI_PWR_CMD_SET_VR_FREQ Значение ADI_PWR_VR_FREQ, задающее требуемую частоту переключения регулятора напряжения. Используйте значение ADI_PWR_VR_FREQ_POWERDOWN для отключения (bypass) встроенного регулятора напряжения.
ADI_PWR_CMD_SET_VR_GAIN Значение ADI_PWR_VR_GAIN, задающее усиление в петле внутренней обратной связи встроенного переключаемого регулятора напряжения.
ADI_PWR_CMD_SET_VR_WAKE Значение ADI_PWR_VR_WAKE, показывающее, нужно ли разрешить/запретить бит WAKE.
ADI_PWR_CMD_SET_VR_PHYWE Значение перечисления ADI_PWR_VR_PHYWE, показывающее, нужно ли разрешить/запретить бит PHYWE.
ADI_PWR_CMD_SET_VR_CANWE Значение перечисления ADI_PWR_VR_CANWE, показывающее, нужно ли разрешить/запретить бит CANWE.
ADI_PWR_CMD_SET_VR_CLKBUFOE Значение перечисления ADI_PWR_VR_CLKBUFOE, показывающее, нужно ли разрешить/запретить бит CLKBUFOE.
ADI_PWR_CMD_SET_VR_CKELOW Значение перечисления ADI_PWR_VR_CKELOW, показывающее, нужно ли разрешить/запретить бит CKELOW.
ADI_PWR_CMD_SET_VR_USBWE Значение перечисления ADI_PWR_VR_USBWE, показывающее, нужно ли разрешить/запретить бит пробуждения от USB.

Частоты процессора CCLK и SCLK не подстраиваются. Когда это необходимо, процессор переходит в состояние ожидания (idle), чтобы изменения пришли в силу. Если запрошенное значение недостаточно для поддержки текущих значений частот, то функция вернет ошибку без изменения настроек.

Прототип функции:

ADI_PWR_RESULT adi_pwr_SetVoltageRegulator (ADI_PWR_COMMAND Command, void *Value);

Аргументы:

Command Значение из перечисления ADI_PWR_COMMAND, означающую команду. Команда определяет смысл связанного значения аргумента команды Value.
Value Требуемое значение.

Возвращаемые значения:

ADI_PWR_RESULT_SUCCESS Функция завершилась успешно.
ADI_PWR_RESULT_INVALID_VLEV Аргумент VLEV недопустим или недостаточен для поддержки текущих частот ядра и системной шины.
ADI_PWR_RESULT__INVALID_VR_FREQ Недопустимое значение FREQ.
ADI_PWR_RESULT__INVALID_VR_GAIN Недопустимое значение GAIN.
ADI_PWR_RESULT__INVALID_VR_WAKE Недопустимое значение WAKE.
ADI_PWR_RESULT_INVALID_VR_PHYWE Недопустимое значение PHYWE.
ADI_PWR_RESULT_INVALID_VR_CANWE Недопустимое значение CANWE.
ADI_PWR_RESULT_INVALID_VR_CLKBUFOE Недопустимое значение CLKBUFOE.
ADI_PWR_RESULT_INVALID_VR_CKELOW Недопустимое значение CKELOW.
ADI_PWR_RESULT_INVALID_VR_USBWE Недопустимое значение USB wakeup.
ADI_PWR_RESULT_BAD_COMMAND Аргумент Command не распознан.
ADI_PWR_RESULT_NOT_INITIALIZED Модуль PM не был инициализирован.

Функция adi_pwr_Terminate() завершает работу модуля PM, сбрасывает флаг "инициализировано", и отцепляет поддерживающее прерывание, если используется двухъядерная синхронизация.

ADI_PWR_RESULT adi_pwr_Terminate (void);

Возвращаемое значение:

ADI_PWR_RESULT_SUCCESS Функция завершилась успешно.

[Публичные типы данных и перечисления модуля PM]

В этом разделе предоставлено описание публичных данных и перечислений PM.

Тип перечисления ADI_PWR_COMMAND описывает тип для команды в структуре ADI_PWR_COMMAND_PAIR. В таблице 3-7 описаны доступные команды, связанные значения данных и допустимый контекст для их использования.

Таблица 3-7. Доступные команды ADI_PWR_COMMAND.

Мнемоника команды Описание и связанное значение параметра команды
Команды, которые могут использоваться функциями adi_pwr_Init, adi_pwr_Control, и adi_pwr_SetVoltageRegulator
ADI_PWR_CMD_END Это маркер конца таблицы команд. Значение данных команды игнорируется.
Команды, которые могут использоваться либо функцией adi_pwr_Control, либо функцией adi_pwr_SetVoltageRegulator
ADI_PWR_CMD_PAIR Используется, чтобы сообщить функции, что передана одна пара команда-значение.
ADI_PWR_CMD_TABLE Используется, чтобы сообщить функции, что передана таблица пар команд команда-значение.
Команды, которые могут использоваться либо функцией adi_pwr_Init, либо функцией adi_pwr_Control
ADI_PWR_CMD_INSTALL_CLK_CLIENT_CALLBACK Значение типа pADI_PWR_CALLBACK_ENTRY, указывающее на структуру ADI_PWR_CALLBACK_ENTRY, которая содержит callback-функцию для установки вместе со значением ClientHandle, которое будет передано в callback-функцию.
ADI_PWR_CMD_SET_INPUT_DELAY Значение ADI_PWR_INPUT_DELAY, указывающее, нужно ли добавить задержку величиной приблизительно 200 пс ко времени, когда уровни сигнала входов будут захвачены интерфейсом внешней памяти.
ADI_PWR_CMD_SET_OUTPUT_DELAY Значение ADI_PWR_OUTPUT_DELAY, указывающее, нужно ли добавить задержку величиной приблизительно 200 пс ко времени, когда уровни сигнала выходов появятся на интерфейсе внешней памяти.
ADI_PWR_CMD_SET_PLL_LOCKCNT Значение u16, задающее количество циклов SCLK, которые должны пройти во время стадии IDLE последовательности программирования PLL перед тем, как процессор установит бит PLL_LOCKED в регистре PLL_STAT. Это значение удерживается в регистре PLL_LOCKCNT.
Команды, которые могут использоваться только функцией adi_pwr_Init
ADI_PWR_CMD_SET_PROC_VARIANT Значение ADI_PWR_PROC_KIND, задающее тип используемого процессора.
ADI_PWR_CMD_SET_PACKAGE Значение ADI_PWR_PACKAGE_KIND, описывающее тип используемого корпуса для процессора.
ADI_PWR_CMD_SET_CLKIN Значение u16, указывающее значение внешней тактовой частоты, подаваемой на вход CLKIN. Значение предоставляется в МГц или Гц.
ADI_PWR_CMD_SET_VDDINT Значение ADI_PWR_VLEV, указывающее уровень напряжения ядра, предоставляемый внешним регулятором напряжения.
ADI_PWR_CMD_SET_VDDEXT Значение ADI_PWR_VDDEXT, указывающее уровень внешнего напряжения, подаваемого на внутренний регулятор напряжения.
ADI_PWR_CMD_FORCE_DATASHEET_VALUES Устанавливает пределы частоты ядра CCLK для каждого уровня напряжения, чтобы соответствовать даташиту (по умолчанию).
ADI_PWR_CMD_SET_CCLK_TABLE Адресует таблицу, содержащую значения ADI_PWR_NUM_VLEVS типа u16, задающие максимальную частоту CCLK для каждого уровня ADI_PWR_VLEV. Эти значения используются вместо значений даташита.
ADI_PWR_CMD_SET_IVG Значение u16, задающее уровень IVG для события PLL_WAKEUP. По умолчанию 7.
ADI_PWR_CMD_SET_PC133_COMPLIANCE Значение ADI_PWR_PC133_COMPLIANCE, которое задает, удовлетворяет ли SDRAM требованиям совместимости со стандартом PC-133. Несовместимость со стандартом требует разрешить для процессора вернуться из режима hybernate без потери содержимого SDRAM. Это значение предотвращает разрядку ячеек SDRAM во время сброса, чем обеспечивается сохранение содержимого SDRAM при через сброс hybernate или сброс глубокого сна (эту команду нельзя использовать на всех процессорах).
ADI_PWR_CMD_SET_FREQ_AS_MHZ Команда задает указывать параметры частот не в герцах, а в мегагерцах (по умолчанию частоты указываются в герцах).
Команды, которые могут использоваться только функцией adi_pwr_SetVoltageRegulator
ADI_PWR_CMD_SET_VR_VLEV Значение ADI_PWR_VLEV, задающее требуемый уровень для регулятора напряжения.
ADI_PWR_CMD_SET_VR_FREQ Значение ADI_PWR_VR_FREQ, задающее требуемую частоту переключения регулятора напряжения. Используйте значение ADI_PWR_VR_FREQ_POWERDOWN для отключения (bypass) встроенного регулятора напряжения.
ADI_PWR_CMD_SET_VR_GAIN Значение ADI_PWR_VR_GAIN, задающее усиление в петле внутренней обратной связи встроенного переключаемого регулятора напряжения.
ADI_PWR_CMD_SET_VR_WAKE Значение ADI_PWR_VR_WAKE, показывающее, нужно ли разбудить регулятор при выходе из режима power-down при возникновении прерывания от RTC или при спаде уровня на выводе RESET#.
ADI_PWR_CMD_SET_VR_PHYWE Значение перечисления ADI_PWR_VR_PHYWE, показывающее, нужно ли разрешить/запретить бит PHYWE (только для тех процессоров, у которых есть этот бит).
ADI_PWR_CMD_SET_VR_CANWE Значение перечисления ADI_PWR_VR_CANWE, показывающее, нужно ли разрешить/запретить бит CANWE (только для тех процессоров, у которых есть интерфейс CAN).
ADI_PWR_CMD_SET_VR_CLKBUFOE Значение перечисления ADI_PWR_VR_CLKBUFOE, показывающее, нужно ли разрешить/запретить бит CLKBUFOE (только для тех процессоров, у которых есть такой бит).
ADI_PWR_CMD_SET_VR_CKELOW Значение перечисления ADI_PWR_VR_CKELOW, показывающее, нужно ли разрешить/запретить бит CKELOW (только для тех процессоров, у которых есть такой бит).
ADI_PWR_CMD_SET_VR_USBWE Значение перечисления ADI_PWR_VR_USBWE, показывающее, нужно ли разрешить/запретить бит пробуждения от USB.
ADI_PWR_CMD_SET_VR_GPWE_MXVRWE Значение перечисления ADI_PWR_VR_GPWE_MXVRWE, показывающее, нужно ли разрешить или запретить бит GPWE (MXVRWE). Применимо только для тех процессоров, у которых есть бит пробуждения от GPIO или пробуждение MXVR.
Команды, которые передаются только в функцию adi_pwr_Control
ADI_PWR_CMD_GET_VDDINT Значение перечисления ADI_PWR_VLEV, содержащее максимальный уровень напряжения питания ядра.
ADI_PWR_CMD_GET_VR_VLEV Значение перечисления ADI_PWR_VLEV, содержащее текущий уровень напряжения внутреннего регулятора напряжения. Не применимо, когда внутренний регулятор отключен (bypassed).
ADI_PWR_CMD_GET_VR_FREQ Значение ADI_PWR_FREQ, содержащее текущую частоту переключения регулятора напряжения.
ADI_PWR_CMD_GET_VR_GAIN Значение ADI_PWR_GAIN, содержащее усиление внутренней петли обратной связи импульсного регулятора напряжения.
ADI_PWR_CMD_GET_VR_WAKE Значение ADI_PWR_VR_WAKE, которое задает, должен ли быть разбужен регулятор напряжения при выходе из состояния power-down от прерывания RTC или при спаде уровня на выводе RESET#.
ADI_PWR_CMD_GET_VR_PHYWE Значение перечисления ADI_PWR_VR_PHYWE, показывающее, должен ли быть разрешен / запрещен бит PHYWE (только для тех процессоров, у которых есть этот бит).
ADI_PWR_CMD_GET_VR_CANWE Значение перечисления ADI_PWR_VR_CANWE, показывающее, нужно ли разрешить/запретить бит CANWE (только для тех процессоров, у которых есть интерфейс CAN).
ADI_PWR_CMD_GET_VR_USBWE Значение перечисления ADI_PWR_VR_USBWE, показывающее, нужно ли разрешить/запретить бит пробуждения от USB (только для тех процессоров, у которых есть интерфейс USB).
ADI_PWR_CMD_GET_VR_GPWE_MXVRWE Значение перечисления ADI_PWR_VR_GPWE_MXVRWE, показывающее, нужно ли разрешить или запретить бит GPWE (MXVRWE). Применимо только для тех процессоров, у которых есть бит пробуждения от GPIO или пробуждение MXVR.
ADI_PWR_CMD_GET_VR_CLKBUFOE Значение перечисления ADI_PWR_VR_CLKBUFOE, показывающее, нужно ли разрешить/запретить бит CLKBUFOE (только для тех процессоров, у которых есть такой бит).
ADI_PWR_CMD_GET_VR_CKELOW Значение перечисления ADI_PWR_VR_CKELOW, показывающее, нужно ли разрешить/запретить бит CKELOW (только для тех процессоров, у которых есть такой бит).
ADI_PWR_CMD_GET_PLL_LOCKCNT Значение u16, которое содержится в регистре PLL_LOCKCNT.
ADI_PWR_CMD_REMOVE_CLK_CLIENT_CALLBACK Значение типа ADI_PWR_CALLBACK_FN, указывающее удаляемую callback-функцию.

Этот тип данных используется для генерации таблицы управляющих команд. Эти команды посылаются модулю PM через функции adi_pwr_Init, adi_pwr_SetVoltageRegulator и adi_pwr_Control:

typedef struct _ADI_PWR_COMMAND_PAIR
{
   ADI_PWR_COMMAND kind;
   void *value;
} ADI_PWR_COMMAND_PAIR;

Подробнее см. врезку ADI_PWR_COMMAND для допустимых значений каждого поля.

Этот тип данных определяет поле делителя тактовой частоты ядра в регистре PLL_DIV. Допустимы значения:

ADI_PWR_CSEL_1 Делит на 1 частоту переключения генератора напряжения ядра.
ADI_PWR_CSEL_2 Делит на 2 частоту переключения генератора напряжения ядра.
ADI_PWR_CSEL_4 Делит на 4 частоту переключения генератора напряжения ядра.
ADI_PWR_CSEL_8 Делит на 8 частоту переключения генератора напряжения ядра.

Этот тип данных определяет значения для бита DF в регистре управления PLL. Значение ADI_PWR_DF_ON означает передачу величины CLKIN/2 в модуль PLL. В соответствии с аппаратным руководством процессора ADSP-BF533, это введет к снижению рассеиваемой мощности.

ADI_PWR_DF_NONE Показывает, что задано значение входного делителя PLL для установки.
ADI_PWR_DF_OFF На PLL передается CLKIN.
ADI_PWR_DF_ON На PLL передается CLKIN/2.

Этот тип данных определяет значения бита входной задержки в регистре управления PLL.

ADI_PWR_INPUT_DELAY_DISABLE Не добавлять входную задержку на сигналах шины подключения внешней памяти.
ADI_PWR_INPUT_DELAY_ENABLE Добавить задержку длительностью примерно 200 пс ко времени, когда сигналы на входах интерфейса внешней памяти будут захвачены.

Этот тип данных задает значения бита выходной задержки, которые можно установить в регистре управления PLL.

ADI_PWR_OUTPUT_DELAY_DISABLE Не добавлять выходную задержку на сигналах шины подключения внешней памяти.
ADI_PWR_OUTPUT_DELAY_ENABLE Добавить задержку длительностью примерно 200 пс ко времени, когда появятся сигналы на выходах интерфейса внешней памяти.

Этот тип данных определяет рабочие режимы процессора (power mode). Допустимы следующие значения:

ADI_PWR_MODE_FULL_ON Процессор работает на полной скорости, тактовые частоты соответствуют запрограммированным.
ADI_PWR_MODE_ACTIVE Процессор находится в активном режиме, когда разрешен только DMA доступ к памяти L1. Тактовые частоты CCLK и SCLK снижены до частоты CLKIN, так как контроллер PLL пропущен, что предоставляет среднее энергопотребление.
ADI_PWR_MODE_ACTIVE_PLLDISABLED Процессор находится в активном режиме, когда разрешен только DMA доступ к памяти L1. Тактовые частоты CCLK и SCLK снижены до частоты CLKIN, так как контроллер PLL пропущен и запрещен, что предоставляет среднее энергопотребление.
ADI_PWR_MODE_SLEEP Процессор находится в режиме сна (sleep mode). Он может быть разбужен любым соответствующим образом замаскированным прерыванием (через регистр SIC_IWR), что предоставляет значительное снижение энергопотребления.
ADI_PWR_MODE_DEEP_SLEEP Процессор находится в режиме глубокого сна (deep sleep mode). Он может быть разбужен только правильно маскированным прерыванием RTC или от сброса, что предоставляет большую экономию энергопотребления.
ADI_PWR_MODE_HIBERNATE Процессор находится в режиме hibernate. Он может быть разбужен только системным сбросом, что предоставляет максимально возможное снижение энергопотребления.

Этот тип данных определяет тип корпуса процессора. Относится к внешнему напряжению (см. врезку ADI_PWR_VDDEXT). Это значение определяет возможности по рассеиванию тепла корпусом процессора.

ADI_PWR_PACKAGE_MBGA MBGA. У корпуса полусферические контакты выводов, находящиеся под плоскостью корпуса.
ADI_PWR_PACKAGE_LQFP LQFP. У корпуса боковые контакты, расположенные по периметру корпуса процессора.

Этот тип данных определяет допустимые значения для настроек, совместимых с PC-133, или другие настройки. Это значение управляет, будет ли устанавливаться вывод SCKE процессора при его сбросе.

ADI_PWR_PC133_COMPLIANCE_DISABLED При сбросе сигнал SCKE выставляется; содержимое SDRAM становится недостоверным.
ADI_PWR_PC133_COMPLIANCE_ENABLED При сбросе сигнал SCKE не выставляется; содержимое SDRAM сохраняется.

Этот тип данных определяет вариант процессора, что управляет соответствующими пределами для выбора скорости. Он передается в функцию adi_pwr_Init() вместе с командой ADI_PWR_CMD_SET_PROC_VARIANT.

Текущий список вариантов процессора показан в таблице 3-8. Поскольку могут быть добавлены новые процессоры, то самая актуальная информация может быть найдена в перечислении ADI_PWR_PROC_KIND, сгруппированном по семействам процессоров (конечно при условии, что система VisualDSP++ получала обновления). Это перечисление находится в заголовочном файле adi_pwr.h (Power Management Service API). Варианты процессоров, которые не определены здесь, могут быть определены по аналогии с помощью макроса в секции "equivalent values" файла adi_pwr.h. См. даташит на конкретную модель процессора для получения полного описания возможностей по тактовой частоте и питанию.

Таблица 3-8. Варианты процессоров.

Мнемоника Соответствующий процессор
ADI_PWR_PROC_BF561SKBCZ_6A ADSP-BF561SKBCZ-6A 600 МГц
ADI_PWR_PROC_BF561SKBCZ500X ADSP-BF561SKBCZ500X 500 МГц
ADI_PWR_PROC_BF561SKBCZ600X ADSP-BF561SKBCZ600X 600 МГц
ADI_PWR_PROC_BF561SBB600 ADSP-BF561SBB600 600 МГц
ADI_PWR_PROC_BF533SKBC750 ADSP-BF533SKBC750 750 МГц
ADI_PWR_PROC_BF533SKBC600 ADSP-BF533SKBC600 600 МГц
ADI_PWR_PROC_BF533SBBC500 ADSP-BF533SBBC500 500 МГц
ADI_PWR_PROC_BF531_OR_BF532 Все типы корпусов и все квалификации по скорости процессоров ADSP-BF531 и ADSP-BF532
ADI_PWR_PROC_BF533SKBC600_6V ADSP-BF533SKBC600-6V 600 МГц
ADI_PWR_PROC_BF537SKBC1600 ADSP-BF537SKBC1600 600 МГц
ADI_PWR_PROC_BF537SBBC1500 ADSP-BF537SBBC1500 500 МГц
ADI_PWR_PROC_BF536SBBC1400 ADSP-BF536SBBC1400 400 МГц
ADI_PWR_PROC_BF536SBBC1300 ADSP-BF536SBBC1300 300 МГц
ADI_PWR_PROC_BF537BBCZ_5AV ADSP-BF537BBCZ-5AV 500 МГц
ADI_PWR_PROC_BF548SKBC1600 ADSP-BF548SKBC1600 600 МГц
ADI_PWR_PROC_BF548SBBC1533 ADSP-BF548SBBC1533 533 МГц
ADI_PWR_PROC_BF548SBBC1400 ADSP-BF548SBBC1400 400 МГц
ADI_PWR_PROC_BF538BBCZ500 ADSP-BF538BBCZ500 500 МГц
ADI_PWR_PROC_BF538BBCZ400 ADSP-BF538BBCZ400 400 МГц
ADI_PWR_PROC_BF539BBCZ500 ADSP-BF539BBCZ500 500 МГц
ADI_PWR_PROC_BF539BBCZ400 ADSP-BF539BBCZ400 400 МГц
ADI_PWR_PROC_BF527SBBC1600 ADSP-BF527SBBC1600 600 МГц
ADI_PWR_PROC_BF527SBBC1533 ADSP-BF527SBBC1533 533 МГц
ADI_PWR_PROC_BF526SBBC1400 ADSP-BF526SBBC1400 400 МГц
ADI_PWR_PROC_BF512SBBC1300 ADSP-BF512SBBC1300 300 МГц
ADI_PWR_PROC_BF512SBBC1400 ADSP-BF512SBBC1400 400 МГц

Модуль PM вернет код результата выполнения функции в виде значения из перечисления типа ADI_PWR_RESULT. В таблице 3-9 перечислены и описаны эти возвращаемые значения.

Таблица 3-9. Коды возврата API-функций модуля PM.

Возвращаемое значение Что это означает
ADI_PWR_RESULT_SUCCESS API-функция выполнилась успешно.
ADI_PWR_RESULT_FAILED Общее неудачное завершение.
ADI_PWR_RESULT_NO_MEMORY Недостаточно памяти для сохранения конфигурационных значений.
ADI_PWR_RESULT_BAD_COMMAND Команда не распознана.
ADI_PWR_RESULT_NOT_INITIALIZED Вызов функции был проигнорирован (никаких действий произведено не было), потому что модуль PM не был инициализирован.
ADI_PWR_RESULT_ALREADY_INITIALIZED Вызов функции adi_pwr_Init был проигнорирован (никаких действий произведено не было), потому что модуль PM уже был инициализирован.
ADI_PWR_RESULT_INVALID_VDDEXT Указано недопустимое значение внешнего напряжения.
ADI_PWR_RESULT_VDDINT_MUST_BE_SUPPLIED Когда используется внешняя регулировка напряжения, в функцию adi_pwr_Init должно быть передано предоставленное снаружи VDDINT.
ADI_PWR_RESULT_INVALID_PROCESSOR Указан недопустимый тип процессора.
ADI_PWR_RESULT_INVALID_IVG Предоставлен недопустимый уровень IVG для PLL wakeup.
ADI_PWR_RESULT_INVALID_INPUT_DELAY Недопустимая входная задержка на шине подключения внешней памяти.
ADI_PWR_RESULT_INVALID_OUTPUT_DELAY Недопустимая выходная задержка на шине подключения внешней памяти.
ADI_PWR_RESULT_INVALID_LOCKCNT Недопустимое значение счетчика захвата PLL (PLL lock count).
ADI_PWR_RESULT_INVALID_MODE Указан недопустимый рабочий режим процессора.
ADI_PWR_RESULT_INVALID_CSEL Указано недопустимое значение CSEL.
ADI_PWR_RESULT_INVALID_SSEL Указано недопустимое значение SSEL.
ADI_PWR_INVALID_CSEL_SSEL_COMBINATION Значение делителя тактовой частоты ядра больше, чем значение делителя частоты шины, или для обоих делителей указаны значения ADI_PWR_CSEL_NONE и ADI_PWR_SSEL_NONE.
ADI_PWR_RESULT_VOLTAGE_REGULATOR_BYPASSED Регулятор напряжения не может быть установлен, поскольку он выключен (bypassed).
ADI_PWR_RESULT_INVALID_VLEV Недопустимый аргумент VLEV, или его не хватает для поддержки текущих частот ядра и системной шины.
ADI_PWR_RESULT_INVALID_VR_FREQ Недопустимое значение FREQ.
ADI_PWR_RESULT_INVALID_VR_GAIN Недопустимое значение GAIN.
ADI_PWR_RESULT_INVALID_VR_WAKE Недопустимое значение WAKE.
ADI_PWR_RESULT_INVALID_VR_PHYWE Недопустимое значение PHYWE.
ADI_PWR_RESULT_INVALID_VR_CANWE Недопустимое значение CANWE.
ADI_PWR_RESULT_INVALID_VR_USBWE Недопустимое значение USBWE.
ADI_PWR_RESULT_INVALID_VR_GPWE_MXVRWE Недопустимое значение пробуждения от GPIO или пробуждения MXVR.
ADI_PWR_RESULT_INVALID_VR_CLKBUFOE Недопустимое значение CLKBUFOE.
ADI_PWR_RESULT_INVALID_VR_CKELOW Недопустимое значение CKELOW.
ADI_PWR_RESULT_CANT_HOOK_SUPPLEMENTAL_INTERRUPT Не получилось подцепить поддерживающее прерывание для приостановки (halt) другого ядра (только для двухъядерных процессоров).
ADI_PWR_RESULT_NO_CALLBACK_INSTALLED Была попытка удалить callback, который не был установлен.
ADI_PWR_RESULT_EXCEEDED_MAX_CALLBACKS Callback не был установлен, потому что уже установлено максимально возможное количество callback-ов.

Этот тип данных определяет поле делителя системной тактовой частоты в регистре PLL_DIV. Допустимые значения:

ADI_PWR_SSEL_1 Делить частоту генератора регулятора напряжения ядра на 1.
ADI_PWR_SSEL_2 Делить частоту генератора регулятора напряжения ядра на 2.
ADI_PWR_SSEL_3 Делить частоту генератора регулятора напряжения ядра на 3.
ADI_PWR_SSEL_4 Делить частоту генератора регулятора напряжения ядра на 4.
ADI_PWR_SSEL_5 Делить частоту генератора регулятора напряжения ядра на 5.
ADI_PWR_SSEL_6 Делить частоту генератора регулятора напряжения ядра на 6.
ADI_PWR_SSEL_7 Делить частоту генератора регулятора напряжения ядра на 7.
ADI_PWR_SSEL_8 Делить частоту генератора регулятора напряжения ядра на 8.
ADI_PWR_SSEL_9 Делить частоту генератора регулятора напряжения ядра на 9.
ADI_PWR_SSEL_10 Делить частоту генератора регулятора напряжения ядра на 10.
ADI_PWR_SSEL_11 Делить частоту генератора регулятора напряжения ядра на 11.
ADI_PWR_SSEL_12 Делить частоту генератора регулятора напряжения ядра на 12.
ADI_PWR_SSEL_13 Делить частоту генератора регулятора напряжения ядра на 13.
ADI_PWR_SSEL_14 Делить частоту генератора регулятора напряжения ядра на 14.
ADI_PWR_SSEL_15 Делить частоту генератора регулятора напряжения ядра на 15.

Этот тип данных определяет внешнее напряжение (VDDEXT), предоставленное для регулятора напряжения.

ADI_PWR_VDDEXT_330 3.3V
ADI_PWR_VDDEXT_250 2.5V

Этот тип данных определяет допустимые уровни напряжения для регулятора напряжения. Значения для процессоров ADSP-BF533 и ADSP-BF561 следующие:

ADI_PWR_VLEV_085 0.85V
ADI_PWR_VLEV_090 0.90V
ADI_PWR_VLEV_095 0.95V
ADI_PWR_VLEV_100 1.00V
ADI_PWR_VLEV_105 1.05V
ADI_PWR_VLEV_110 1.10V
ADI_PWR_VLEV_115 1.15V
ADI_PWR_VLEV_120 1.20V (по умолчанию)
ADI_PWR_VLEV_125 1.25V
ADI_PWR_VLEV_130 1.30V
ADI_PWR_VLEV_135 1.35V
ADI_PWR_VLEV_140 1.4V

Этот тип данных определяет допустимые значения для бита CANWE в регистре управления регулятором напряжения. Если это разрешено, то регулятор напряжения может быть разбужен из состояния power-down через активность контроллера интерфейса CAN.

ADI_PWR_VR_CANWE_DISABLED Запрет пробуждения от активности интерфейса CAN.
ADI_PWR_VR_CANWE_ENABLED Разрешение пробуждения от активности интерфейса CAN.

Этот тип данных определяет допустимые значения для бита CKELOW в регистре управления регулятором напряжения. Если это разрешено, то вывод SCKE переводится в состояние лог. 0 при сбросе системы, чтобы разрешить для SDRAM оставаться в режиме самообновления (self-refresh mode).

ADI_PWR_VR_PHYWE_DISABLED При сбросе перевести SCKE в состояние лог. 1. Содержимое SDRAM при этом становится недостоверным.
ADI_PWR_VR_PHYWE_ENABLED При сбросе SCKE в состоянии лог. 0, содержимое SDRAM сохраняется.

Этот тип данных задает допустимые значения для бита CLKBUFOE в регистре управления регулятором напряжения. Если это разрешено, то сигнал CLKIN может использоваться совместно с периферийными устройствами, особенно Ethernet PHY.

ADI_PWR_VR_CLKBUFOE_DISABLED Запрет совместного использования CLKIN.
ADI_PWR_VR_CLKBUFOE_ENABLED Разрешить совместное использование CLKIN.

Этот типа данных определяет допустимые частоты переключения для регулятора напряжения. Это напряжение связано со значениями конденсатора и индуктивности в силовом фильтре регулятора. Чем выше установлена частота, тем могут быть меньше значения емкости и индуктивности. Допустимые значения для всех процессоров Blackfin:

ADI_PWR_VR_FREQ_POWERDOWN Выключение (bypass, пропуск) использования встроенного регулятора напряжения.
ADI_PWR_VR_FREQ_333KHZ 333 кГц
ADI_PWR_VR_FREQ_667KHZ 667 кГц
ADI_PWR_VR_FREQ_1MHZ 1 МГц (по умолчанию)

Этот тип данных определяет допустимые значения для усиления (gain) во внутренней петле обратной связи импульсного регулятора. Усиление управляет тем, насколько быстро выходное напряжение будет установлено в требуемое конечное значение. Чем выше усиление, тем короче время установки. Слишком большое значение усиления приводят к повышенным переходным процессам при регулировании.

ADI_PWR_VR_GAIN_5 5
ADI_PWR_VR_GAIN_10 10
ADI_PWR_VR_GAIN_20 20 (по умолчанию)
ADI_PWR_VR_GAIN_50 50

Этот тип данных определяет значения для пробуждения общего назначения (GPWE, general-purpose wakeup) или бит MXVR в регистре управления регулятором напряжения для некоторых процессоров. Если это разрешено (ADI_PWR_VR_GPWE_MXVRWE_ENABLED), то напряжение регулятора может быть восстановлено при выходе из состояния hibernate при прерывании от general-purpose wakeup или MXVR.

ADI_PWR_VR_GPWE_MXVRWE_DISABLED Запрет пробуждения от GPIO.
ADI_PWR_VR_GPWE_MXVRWE_ENABLED Разрешение пробуждения от GPIO.

Этот тип данных определяет значения для бита PHYWE в регистре управления регулятором напряжения. Если это разрешено, то регулятор напряжения может быть разбужен из состояния power-down активностью со стороны интерфейса PHY.

ADI_PWR_VR_PHYWE_DISABLED Запрет пробуждения от активности PHY.
ADI_PWR_VR_PHYWE_ENABLED Разрешение пробуждения от активности PHY.

Этот тип данных определяет допустимые значения для бита USBWE в регистре управления регулятором напряжения. Если это разрешено, то регулятор напряжения может быть разбужен из состояния power-down активностью интерфейса USB.

ADI_PWR_VR_USBWE_DISABLED Запрет пробуждения от активности USB.
ADI_PWR_VR_USBWE_ENABLED Разрешение пробуждения от активности USB.

Этот тип данных определяет допустимые значения для бита WAKE в регистре управления регулятором напряжения. Если это разрешено (ADI_PWR_VR_WAKE_ENABLED), то регулятор напряжения может быть разбужен из состояния power-down (ADI_PWR_VR_FREQ_POWERDOWN) при поступлении прерывания RTC или по перепаду в низкий уровень на выводе RESET.

ADI_PWR_VR_WAKE_DISABLED Запрет пробуждения от RTC и RESET.
ADI_PWR_VR_WAKE_ENABLED Разрешение пробуждения от RTC и RESET.

[Макросы модуля PM]

В таблице 3-10 перечислены и описаны макросы модуля PM (power management, управление питанием). Здесь не показан список вариантов процессора, который функционально эквивалентен списку перечисления ADI_PWR_PROC_KIND. Поскольку могут появляться новые процессоры, то просмотрите макросы в секции "equivalent values" заголовочного файла adi_pwr.h (Power Management Service API), чтобы получить полный список "эквивалентных" вариантов процессора.

Таблица 3-10. Макросы модуля PM.

Макрос Для чего нужен
ADI_PWR_VLEV_DEFAULT Уровень напряжения по умолчанию / при сбросе ADI_PWR_VLEV_130.
ADI_PWR_VLEV_MIN Минимальный уровень напряжения ADI_PWR_VLEV_085.
ADI_PWR_VLEV_MAX Максимальный уровень напряжения ADI_PWR_VLEV_120.
ADI_PWR_VOLTS(V) Возвратит напряжение в вольтах как число float для указанного уровня.
ADI_PWR_MILLIVOLTS(V) Возвратит напряжение в милливольтах как число int для указанного уровня.
ADI_PWR_VR_FREQ_DEFAULT Частота по умолчанию / при сбросе для переключения импульсного регулятора напряжения ADI_PWR_FREQ_1MHZ.
ADI_PWR_VR_FREQ_MIN Минимальное значение частоты переключения ADI_PWR_FREQ_POWERDOWN.
ADI_PWR_VR_FREQ_MAX Максимальное значение частоты переключения ADI_PWR_FREQ_1MHZ.
ADI_PWR_VR_GAIN_DEFAULT Минимальное значение по умолчанию / при сбросе для усиления петли обратной связи регулятора напряжения ADI_PWR_GAIN_20.
ADI_PWR_VR_GAIN_MIN Минимальное значение для усиления петли обратной связи регулятора напряжения ADI_PWR_GAIN_5.
ADI_PWR_VR_GAIN_MAX Максимальное значение для усиления петли обратной связи регулятора напряжения ADI_PWR_GAIN_50.
ADI_PWR_PACKAGE_PBGA Эквивалентный тип корпуса процессора для ADI_PWR_PACKAGE_MBGA.

[Ссылки]

1. VisualDSP++ 5.0 Device Drivers and System Services Manual for Blackfin® Processors site:analog.com.
2. VisualDSP++ 5.0 C/C++ Compiler and Library Manual for Blackfin® Processors site:analog.com.
3. Blackfin: практическая реализация загрузчика (bootloader).
4. Blackfin: утилита elfloader.exe.
5. ADSP-BF538: блок интерфейса внешней шины.
6ADSP-BF538: динамическое управление питанием.

 

Добавить комментарий


Защитный код
Обновить

Top of Page