В этой статье приведен перевод документации, касающейся службы управления питанием (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.
Шаг 3: выберите стратегию управления питанием. Например, следующие сегменты кода покажут, как конфигурировать модуль PM для оптимальной скорости или оптимального энергопотребления.
Оптимальная скорость. В этом примере модуль PM установит частоты ядра и шины на максимально возможные значения.
Оптимальное энергопотребление. Следующие операторы дают задание модулю PM установить такие частоты ядра и шины, чтобы они были максимально допустимы для уровня напряжения 0.85 V.
Использование автоматической синхронизации. Последовательность программирования PLL для двухъядерного процессора требует, чтобы оба ядра были приведены к состоянию ожидания (IDLE state), когда прикладываются изменения к регистрам PLL и VR. Двухъядерный процессор может выполнять программу на каждом ядре, или может выполнять программу только на одном ядре. Когда для выполнения программы используются оба яра, требуется механизм для обоих ядер, чтобы они перешли в состояние IDLE, и оставались в нем, пока записываются регистры. Модуль PM предоставляет механизм, который использует поддерживающее прерывание, чтобы синхронизировать ядра для программирования PLL. Этот механизм вовлекается автоматически путем вызова функции adi_pwr_Init() на обоих ядрах, и передаче команды ADI_PWR_CMD_SET_AUTO_SYNC_ENABLED с NULL в качестве аргумента, как это показано в следующей таблице пар команд для платы разработчика ADSP-BF561 EZ-KIT Lite.
Требование синхронизации. Двухъядерные процессоры 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:
voidmain()
{
while(1)
{
asm("IDLE;");
}
}
Всякий раз, когда ядро B проснется (из-за последовательности программирования PLL, выполняемой службой PM), оно будет немедленно помещено в состояние IDLE.
Другой метод состоит в запрете бита пробуждения от PLL (PLL wakeup bit) в регистре SICB_IWR0, и переходе в состояние IDLE. Если это делается на языке ассемблера, то следующий код может быть помещен в код запуска (startup code):
Приложение работает на обоих ядрах. В этом случае оба ядра выполняют код. Ядрам нужно синхронизироваться, чтобы гарантировать, что оба ядра находятся в состоянии 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 следующим образом:
где входная секция памяти 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 генерируется заново. */
/* Оператор разрешения для общих символов, привязанных в ядре 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. Пример:
Подробности см. в Приложении A руководства [2] и документацию по линкеру и утилитам системы программирования VisualDSP++ 5.0.
Инициализация SDRAM перед загрузкой исполняемого кода. Приложения, которые требуют размещения кода (и/или данных) в SDRAM в момент загрузки требуют, чтобы сначала был соответствующим образом (в зависимости от конфигурации подключенной внешней памяти SDRAM) был проинициализирован контроллер SDRAM. Это случай для всех приложений, где разрешено кэширование инструкций и/или данных. Однако подпрограмма adi_ebiu_Init() инициализации службы EBIU не выполнится, пока не будет загружено приложение.
Есть два способа загрузить приложение в процессорное ядро:
• Через сессию эмулятора (отладчика JTAG), подключенного в среде разработки VisualDSP++. • Через память FLASH или устройство, подключенное через порт SPI, когда процессор сбрасывается (или когда включается питание).
В первом случае обязательно используется выбранная опция Use XML reset values в окне диалога настройки свойств целевого процессора (диалог Target Options, доступный через меню Settings, появляющееся после запуска сессии отладки, см. скриншоты ниже).
Также требуется указать место расположения файла XML для загружаемой сессии отладки (меню Settings -> Session..., см. скриншоты ниже).
Это гарантирует, что 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_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), заданных одним из трех способов:
3) Будет передана таблица пар команд типа в виде списка структур ADI_PWR_COMMAND_PAIR. Последняя запись в списке должен быть с командой признака окончания списка ADI_PWR_CMD_END.
Подробнее см. врезку ADI_PWR_COMMAND в разделе "Публичные типы данных и перечисления модуля PM", где приведен полный список команд и связанных с ними значений.
Функция adi_pwr_GetConfigSize() возвратит количество байт, требуемых для сохранения данных текущей конфигурации. Это значение также доступно через использование макроса ADI_PWR_SIZEOF_CONFIG. Возвращенное значение adi_pwr_GetConfigSize и этого макроса ADI_PWR_SIZEOF_CONFIG, объединяет размер конфигурации модуля EBIU, независимо от времени его инициализации.
size_tadi_pwr_GetConfigSize (void);
Возвращаемое значение: размер структуры конфигурации.
Функция adi_pwr_GetFreq() возвратит текущие значения частот CCLK, SCLK (частота ядра и системной шины), а также частоту стабилизатора напряжения питания ядра.
Адрес ячейки, куда нужно сохранить текущее значение тактовой частоты 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_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:
В таблице 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_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_SaveConfig() сохраняет текущие значения конфигурации в область памяти, на которую указывает аргумент hConfig. Если модуль EBIU был инициализирован, то его конфигурация сохраняется также; иначе соответствующие поля его конфигурации останутся незаполненными (не определенными).
Функция adi_pwr_SetFreq() настраивает контроллер PLL для предоставления частот CCLK и SCLK со значениями, максимально близкими к запрашиваемым (указанным в Гц). Если регулятор напряжения не запрещен, то его конфигурация будет подстроена (в случае необходимости) для предоставления минимального напряжения, которое может поддерживать запрашиваемые частоты.
Процессор переводится в состояние ожидания (idle), чтобы изменения вошли в силу.
Эта функция всегда находит такое решение, где делитель CSEL в делитель регистра PLL_DIV единица. Если запрошен входной делитель PLL, то будет минимизирована разница между запрашиваемыми значениями и установленными.
Чтобы определить значения, которые были реально установлены этой функцией, используйте функцию adi_pwr_GetFreq.
Запрашиваемое значение для тактовой частоты 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_SetMaxFreqForVolt() устанавливает значение регистра управления регулятором напряжения (voltage regulator control register, VR_CTL), в соответствии с требуемым уровнем напряжения и подстраивает частоты процессора CCLK и SCLK, чтобы они были максимально допустимыми для установленного уровня напряжения питания.
Чтобы применились изменения, процессор переводится в состояние ожидания (idle).
Требуемый уровень напряжения, устанавливаемый как значение из перечисления 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_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_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.
Например, чтобы пропустить встроенный регулятор напряжения, должен использоваться следующий код:
В таблице 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_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:
Этот тип данных определяет значения для бита DF в регистре управления PLL. Значение ADI_PWR_DF_ON означает передачу величины CLKIN/2 в модуль PLL. В соответствии с аппаратным руководством процессора ADSP-BF533, это введет к снижению рассеиваемой мощности.
ADI_PWR_DF_NONE
Показывает, что задано значение входного делителя PLL для установки.
Этот тип данных определяет рабочие режимы процессора (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
Модуль 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-ов.
Этот тип данных определяет допустимые значения для бита 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.
Этот типа данных определяет допустимые частоты переключения для регулятора напряжения. Это напряжение связано со значениями конденсатора и индуктивности в силовом фильтре регулятора. Чем выше установлена частота, тем могут быть меньше значения емкости и индуктивности. Допустимые значения для всех процессоров Blackfin:
ADI_PWR_VR_FREQ_POWERDOWN
Выключение (bypass, пропуск) использования встроенного регулятора напряжения.
Этот тип данных определяет допустимые значения для усиления (gain) во внутренней петле обратной связи импульсного регулятора. Усиление управляет тем, насколько быстро выходное напряжение будет установлено в требуемое конечное значение. Чем выше усиление, тем короче время установки. Слишком большое значение усиления приводят к повышенным переходным процессам при регулировании.
Этот тип данных определяет значения для пробуждения общего назначения (GPWE, general-purpose wakeup) или бит MXVR в регистре управления регулятором напряжения для некоторых процессоров. Если это разрешено (ADI_PWR_VR_GPWE_MXVRWE_ENABLED), то напряжение регулятора может быть восстановлено при выходе из состояния hibernate при прерывании от general-purpose wakeup или MXVR.
Этот тип данных определяет значения для бита PHYWE в регистре управления регулятором напряжения. Если это разрешено, то регулятор напряжения может быть разбужен из состояния power-down активностью со стороны интерфейса PHY.
Этот тип данных определяет допустимые значения для бита USBWE в регистре управления регулятором напряжения. Если это разрешено, то регулятор напряжения может быть разбужен из состояния power-down активностью интерфейса 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.