Модуль интерфейса внешней шины процессоров Blackfin |
![]() |
Добавил(а) microsin | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
В этой статье описан модуль библиотеки SSL (драйвер ADI), работающий с модулем интерфейса внешней шины (external bus interface unit, EBIU) процессора Blackfin (перевод главы 4 документации [1]). EBIU позволяет осуществлять конфигурирование контроллера асинхронной памяти (FLASH) и интерфейса SDRAM или DDR. Он также позволяет автоматически менять настройки в ответ на изменения тактовой частоты системы. Рассматриваются следующие вопросы: • Использование модуля EBIU Общее назначение модуля EBIU - позволить модулю управления питанием [2] настраивать контроллер SDRAM или DDR процессора в соответствии с изменениями тактовой частоты системной шины (system clock, SCLK). Вызовы функций API adi_pwr_SetFreq и adi_pwr_SetMaxFreqForVolt настраивают параметры контроллера SDRAM в соответствии с выбранной частотой SCLK, что поддерживается модулем EBIU, когда он инициализирован. Дополнительную информацию по службе управления питанием и её API см. статью [2]. Использование модуля EBIU осуществляется стандартным способом, в соответствии с идеологией библиотек системных служб (SSL) компании Analog Devices (ADI). Функция adi_ebiu_Init вызывается для установки соответствующих значений, перечисленных в даташите на используемую микросхему внешней памяти. После этого скорость обновления (refresh rate) для SDRAM или DDR автоматически подстраивается каждый раз, когда модуль управления питанием [2] тактовую частоту системной шины SCLK. Контроллер асинхронной памяти (память FLASH) не настраивается автоматически, но его можно явно переконфигурировать вызовом функции adi_ebiu_Control. В разделе "Использование модуля EBIU" предоставлено пошаговое описание, как работать с модулем EBIU. Также предоставлен соответствующий пример кода. Модуль EBIU использует недвусмысленную систему именования функций, констант и определений, что обеспечивает отсутствие конфликтов с другими программными модулями ADI или других компаний. Все значений перечислений (enum) и операторы typedef используют префикс ADI_EBIU_, а функции и глобальные переменные используют эквивалентный префикс в нижнем регистре adi_ebiu_. Для каждого процессора имеется 2 версии библиотеки, соответствующие конфигурациям Debug и Release системы программирования VisualDSP++. В дополнение к обычным опциям по умолчанию в конфигурации Debug, функции API выполняют проверки переданных в них аргументов, и сообщают об ошибках соответствующими кодами, если это необходимо. В версии Release библиотеки большинство функций вернут только 2 кода результата: ADI_EBIU_RESULT_SUCCESS для успешного завершения вызова, или ADI_EBIU_RESULT_NOT_INITIALIZED, когда модуль EBIU не был инициализирован перед вызовом этой функции. [Использование модуля EBIU] Первый шаг в использовании модуля EBIU состоит в установке необходимых параметров для используемых интерфейсов внешней памяти. На этом шаге в функцию adi_ebiu_Init передается список пар команда-значение. Подробно необходимая информация дана во врезке с описанием функции adi_ebiu_Init (см. раздел "Справочник по API EBIU"). Количество строк в таблице и информация, которые должны быть в таблице, зависит от индивидуальной аппаратной конфигурации системы (от типа подключенной внешней памяти). В следующем примере предполагается, что конфигурируется плата разработчика ADSP-BF533 EZ-KIT Lite (Rev 2.1). Для неё следующим образом указывается таблица пар команда-значение: /* Поле регистра управления асинхронной памятью, разрешающее тактирование */ ADI_EBIU_ASYNCH_CLKOUT clkout_enable = ADI_EBIU_ASYNCH_CLKOUT_ENABLE; /* Поле регистра управления асинхронной памятью, выбирающее нужные банки,
которые должны быть разрешены */ ADI_EBIU_ASYNCH_BANK_ENABLE banks_enable = ADI_EBIU_ASYNCH_BANK0_1_2_3; /* Параметры времени банков асинхронной памяти, для всех 4 банков
используются одинаковые значения, задаваемые либо в циклах, либо
в единицах времени, но не обоими этими способами */ ADI_EBIU_ASYNCH_BANK_TIMING asynch_bank_trans_time = { ADI_EBIU_BANK_ALL, { ADI_EBIU_ASYNCH_TT_4_CYCLES, { 0, ADI_EBIU_TIMING_UNIT_NANOSEC } } ADI_EBIU_ASYNCH_BANK_TIMING asynch_bank_setup_time = { ADI_EBIU_BANK_ALL, { ADI_EBIU_ASYNCH_ST_3_CYCLES, { 0, ADI_EBIU_TIMING_UNIT_NANOSEC } } }; ADI_EBIU_ASYNCH_BANK_TIMING asynch_bank_hold_time = { ADI_EBIU_BANK_ALL, { ADI_EBIU_ASYNCH_HT_2_CYCLES, { 0, ADI_EBIU_TIMING_UNIT_NANOSEC } } }; ADI_EBIU_ASYNCH_BANK_TIMING asynch_bank_read_access_time = { ADI_EBIU_BANK_ALL, { 0xB, { 0, ADI_EBIU_TIMING_UNIT_NANOSEC } } }; ADI_EBIU_ASYNCH_BANK_TIMING asynch_bank_write_access_time = { ADI_EBIU_BANK_ALL, { 7, { 0, ADI_EBIU_TIMING_UNIT_NANOSEC } } }; ADI_EBIU_ASYNCH_BANK_VALUE asynch_bank_ardy_enable = { ADI_EBIU_BANK_ALL, { ardy_enable: ADI_EBIU_ASYNCH_ARDY_DISABLE } }; ADI_EBIU_ASYNCH_BANK_VALUE asynch_bank_ardy_polarity = { ADI_EBIU_BANK_ALL, { ardy_polarity: ADI_EBIU_ASYNCH_ARDY_POLARITY_LOW } }; /* Параметры времени SDRAM, устанавливаемые по её даташиту */ // Установка min TWR на длительность 1 такт SCLK + 7.5 нс: ADI_EBIU_TIMING_VALUE twrmin = { 1,{7500, ADI_EBIU_TIMING_UNIT_PICOSEC} }; // Установка периода обновления 8192 тактов за 64 мс: ADI_EBIU_TIMING_VALUE refresh = { 8192,{64, ADI_EBIU_TIMING_UNIT_MILLISEC} }; // Установка min TRAS на 44 нс: ADI_EBIU_TIME trasmin = {44, ADI_EBIU_TIMING_UNIT_NANOSEC}; // Установка min TRP на 20 нс: ADI_EBIU_TIME trpmin = {20, ADI_EBIU_TIMING_UNIT_NANOSEC}; ADI_EBIU_TIME trcdmin = {20, ADI_EBIU_TIMING_UNIT_NANOSEC}; // Установка min TRCD на 20 нс: u32 cl_threshold = 100; /* установка порога cl на 100 МГц */ // Размер банка 64 MB: ADI_EBIU_SDRAM_BANK_VALUE bank_size = { 0, { size: ADI_EBIU_SDRAM_BANK_64MB } }; // Адрес столбца имеет разрядность 10 бит: ADI_EBIU_SDRAM_BANK_VALUE bank_width = { 0, { width: ADI_EBIU_SDRAM_BANK_COL_10BIT } }; /* Заполнение таблицы команд с использованием заданных выше значений */ ADI_EBIU_COMMAND_PAIR ebiu_init_table[] = { { ADI_EBIU_CMD_SET_SDRAM_BANK_SIZE, (void*)&bank_size }, { ADI_EBIU_CMD_SET_SDRAM_BANK_COL_WIDTH, (void*)&bank_width }, { ADI_EBIU_CMD_SET_SDRAM_CL_THRESHOLD, (void*)cl_threshold }, { ADI_EBIU_CMD_SET_SDRAM_TRASMIN, (void*)&trasmin }, { ADI_EBIU_CMD_SET_SDRAM_TRPMIN, (void*)&trpmin }, { ADI_EBIU_CMD_SET_SDRAM_TRCDMIN, (void*)&trcdmin }, { ADI_EBIU_CMD_SET_SDRAM_TWRMIN, (void*)&twrmin }, { ADI_EBIU_CMD_SET_SDRAM_REFRESH, (void*)&refresh }, { ADI_EBIU_CMD_SET_ASYNCH_CLKOUT_ENABLE, (void*)&clkout_enable }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_ENABLE, (void*)&banks_enable }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_TRANSITION_TIME, (void*)&asynch_bank_trans_time }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_READ_ACCESS_TIME, (void*)&asynch_bank_read_access_time }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_WRITE_ACCESS_TIME, (void*)&asynch_bank_write_access_time }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_SETUP_TIME, (void*)&asynch_bank_setup_time }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_HOLD_TIME, (void*)&asynch_bank_hold_time }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_ARDY_ENABLE, (void*)&asynch_bank_ardy_enable }, { ADI_EBIU_CMD_SET_ASYNCH_BANK_ARDY_POLARITY, (void*)&asynch_bank_ardy_polarity }, // Маркер конца таблицы команд: { ADI_EBIU_CMD_END, 0 } }; }; Второй аргумент в вызове функции adi_ebiu_Init зарезервирован, и должен быть установлен в 0. Модуль EBIU должен быть инициализирован до модуля управления питанием, чтобы последующие вызовы adi_pwr_SetFreq или adi_pwr_SetMaxFreqForVolt модуля управления питанием автоматически настраивали SDRAM или DDR. Для иллюстрации того, что требуется для процессоров Blackfin, чтобы поддерживать работу памяти DDR, ниже приведена соответствующая таблица команд. Замените параметры SDRAM, показанные в таблице выше, на параметры DDR, показанные ниже, и добавьте команды управления контроллером асинхронной памяти, показанные в примере выше. // Количество тактов между одной активной командой и следующей: ADI_EBIU_TIMING_VALUE RC = { 8, {60, ADI_EBIU_TIMING_UNIT_NANOSEC } }; // Количество тактов между активной командой и командой precharge: ADI_EBIU_TIMING_VALUE RAS = { 6, {42, ADI_EBIU_TIMING_UNIT_NANOSEC } }; // Количество тактов между командой precharge и активной командой: ADI_EBIU_TIMING_VALUE RP = { 2, {15, ADI_EBIU_TIMING_UNIT_NANOSEC } }; // Количество тактов для SDRAM, чтобы восстановиться из сигнала REFRESH: ADI_EBIU_TIMING_VALUE RFC = { 10, {72, ADI_EBIU_TIMING_UNIT_NANOSEC } }; // Количество тактов между последней записью данных // до следующей команды чтения: ADI_EBIU_TIMING_VALUE WTR = { 2, {7500, ADI_EBIU_TIMING_UNIT_PICOSEC } }; // Время восстановления записи (write recovery time) // составляет 2 или 3 такта: ADI_EBIU_TIMING_VALUE tWR = { 2, {15, ADI_EBIU_TIMING_UNIT_NANOSEC } }; // Количество тактов от установки режима: ADI_EBIU_TIMING_VALUE tMRD = { 2, {15, ADI_EBIU_TIMING_UNIT_NANOSEC } }; // Количество тактов от активной команды до следующей // операции R/W (чтение или запись): ADI_EBIU_TIMING_VALUE RCD = { 2, {15, ADI_EBIU_TIMING_UNIT_NANOSEC } }; // Количество тактов от одного сигнала REFRESH // до следующего: ADI_EBIU_TIMING_VALUE REFI = { 1037, {7777, ADI_EBIU_TIMING_UNIT_NANOSEC } }; ADI_EBIU_COMMAND_PAIR ebiu_init_table[] = { // Команда для установки интервала обновления (refresh): { ADI_EBIU_CMD_SET_DDR_REFI, (void*)&REFI }, // Команда для установки периода автообновления (auto refresh): { ADI_EBIU_CMD_SET_DDR_RFC, (void*)&RFC }, // Команда для установки времени precharge - active { ADI_EBIU_CMD_SET_DDR_RP, (void*)&RP }, // Команда для установки времени active - precharge { ADI_EBIU_CMD_SET_DDR_RAS, (void*)&RAS } // Команда для установки времени active - active { ADI_EBIU_CMD_SET_DDR_RC, (void*)&RC }, // Команда для установки времени write - read { ADI_EBIU_CMD_SET_DDR_WTR, (void*)&WTR }, // Команда для установки размера устройства: { ADI_EBIU_CMD_SET_DDR_DEVICE_SIZE, (void*)0 }, // Команда для установки количества тактов от выставления R/W // до появления первых достоверных данных: { ADI_EBIU_CMD_SET_DDR_CAS, (void*)2 }, // Команда для установки ширины устройства: { ADI_EBIU_CMD_SET_DDR_DEVICE_WIDTH, (void*)2 }, // Команда для установки количества внешних банков: { ADI_EBIU_CMD_SET_DDR_EXTERNAL_BANKS, (void*)0 }, // Команда для установки ширины данных: { ADI_EBIU_CMD_SET_DDR_DATA_WIDTH, (void*)2 }, // Команда для установки времени восстановления записи // (write recovery time): { ADI_EBIU_CMD_SET_DDR_WR, (void*)&tWR }, // Команда для установки количества тактов от установки // режима до следующей команды: { ADI_EBIU_CMD_SET_DDR_MRD, (void*)&tMRD }, // Команда для установки количества тактов от активной // команды до выставления read-write: { ADI_EBIU_CMD_SET_DDR_RCD, (void*)&RCD }, // Маркер конца таблицы команд: { ADI_EBIU_CMD_END, 0 } }; В приведенном выше примере кода обратите внимание на то, что минимальное значение TWR SDRAM определено как структура ADI_EBIU_TIMING_VALUE, которая состоит из двух главных частей: количество тактов и количество единиц времени, в данном случае пикосекунд. Такое представление отражает определение, которое можно найти в соответствующем даташите на SDRAM, где это значение указано как один такт SCLK плюс 7.5 нс. Для периода восстановления данных SDRAM (refresh) эта структура выражает время, которое берется для указанного количества тактов обновления (refresh cycles). Код примера показывает, что период обновления (refresh period) составляет 64 миллисекунды, которые занимают 8192 такта. Для аппаратуры, использующей модуль Micron SDRAM, таблица команд может получить аббревиатуру, чтобы просто указать тип модуля и размер банка, как это показано ниже, с добавлением команд настройки контроллера асинхронной памяти, если это необходимо: ADI_EBIU_SDRAM_BANK_VALUE bank_size;// Установка размера банка 32 MB: bank_size.value.size = ADI_EBIU_SDRAM_BANK_32MB; ADI_EBIU_COMMAND_PAIR ebiu_init_table[] = { // Модуль MT48LC16M16-75: { ADI_EBIU_CMD_SET_SDRAM_MODULE, (void*)ADI_EBIU_SDRAM_MODULE_MT48LC16M16A2_75 }, { ADI_EBIU_CMD_SET_SDRAM_BANK_SIZE, (void*)&bank_size }, { ADI_EBIU_CMD_END, 0 } }; adi_ebiu_Init(ebiu_init_table, 0); Дальнейшие изменения могут быть сделаны в любой момент путем передачи пар команда-значение или таблиц пар команда-значение в функцию adi_ebiu_Control. Например, чтобы передать одну парку команда-значение для разрешения самостоятельного обновления данных в SDRAM во время отсутствия активности (self-refresh), может использоваться следующий код: adi_ebiu_Control(ADI_EBIU_CMD_SET_SDRAM_SRFS, (void*)ADI_EBIU_SDRAM_SRFS_ENABLE); Поскольку настройки SDRAM жестко привязаны к частоте системной шины (system clock, SCLK), прямое использование функции adi_ebiu_AdjustSDRAM из приложения пользователя не требуется, потому что это делается автоматически соответствующим кодом модуля управления питанием [2], когда меняется частота SCLK. [Справочник по API EBIU] В этой секции приведено подробное описание функций API модуля EBIU. Для переданной в эту функцию частоты системной шины (system clock, SCLK) вычисляются и устанавливаются следующие параметры для SDRAM: TRAS, TRP, TRCD и TWR в регистре EBIU_SDGCTL, и значение RDIV в регистре EBIU_SDRRC. Эта функция вычисляет и устанавливает следующие параметры для DDR: RAS, RP, RFC, REFI и RC в регистре DDRCTL0, и RCD, MRD и WR в регистре DDRCTL1. Эта функция используется главным образом модулем управления питанием [2], чтобы гарантировать, что настройки SDRAM оптимальны для текущей частоты SCLK процессора. Функция adi_ebiu_AdjustSDRAM выполнит возврат, не делая никаких изменений, если SDRAM не была ранее успешно инициализирована вызовом adi_ebiu_Init. ADI_EBIU_RESULT adi_ebiu_AdjustSDRAM (u32 fsclk);
Аргумент:
Возвращаемое значение:
Функция adi_ebiu_Control() позволяет конфигурировать регистры EBIU SDRAM и EBIU DDR в соответствии с парами команда-значение, которые могут передаваться в эту функцию тремя разными способами (см. также описание типа ADI_EBIU_COMMAND_PAIR). • Передается одна пара команда-значение: adi_ebiu_Control (ADI_EBIU_CMD_SET_SDRAM_SRFS, (void*)ADI_EBIU_SDRAM_SRFS_ENABLE); • Передается структура с одной парой команда-значение: ADI_EBIU_COMMAND_PAIR cmd = { ADI_EBIU_CMD_SET_SDRAM_SRFS, (void*)ADI_EBIU_SDRAM_SRFS_ENABLE }; adi_ebiu_Control (ADI_EBIU_CMD_PAIR, (void*)&cmd); • Передается таблица структур ADI_EBIU_COMMAND_PAIR. Последняя запись в этой таблице должна быть {ADI_EBIU_CMD_END, 0}. ADI_EBIU_COMMAND_PAIR table[] = { { ADI_EBIU_CMD_SET_SDRAM_FBBRW, (void*)ADI_EBIU_SDRAM_FBBRW_ENABLE }, { ADI_EBIU_CMD_SET_SDRAM_CDDBG, (void*)ADI_EBIU_CDDBG_ENABLE }, { ADI_EBIU_CMD_END, 0 } }; adi_ebiu_Control (ADI_EBIU_CMD_TABLE, (void*)table); См. также описание ADI_EBIU_COMMAND и раздел "Перечисления для параметра Value команд" для получения полного списка команд и связанных с ними значений для обоих типов интерфейсов, SDRAM и DDR, и для интерфейса асинхронной памяти (FLASH). Прототип функции: ADI_EBIU_RESULT adi_ebiu_Control (ADI_EBIU_COMMAND Command, void *Value); Аргументы:
Возвращаемое значение:
Функция adi_ebiu_GetConfigSize() вернет количество байт, требуемое для сохранения данных текущей конфигурации. Это значение также доступно через макрос ADI_EBIU_SIZEOF_CONFIG. size_t adi_ebiu_GetConfigSize (void); Возвращаемое значение: размер структуры данных конфигурации. Функция adi_ebiu_Init инициализирует модуль EBIU. В настоящее время модуль конфигурируется для поддержки либо контроллера DDR, либо контроллера SDRAM, плюс для поддержки контроллера асинхронной памяти. Для службы EBIU, которая поддерживает SRDRAM, функция adi_ebiu_Init устанавливает значения регистров EBIU_SDGCTL, EBIU_SDBCTL и EBIU_SDRRC, чтобы их содержимое отражало корректную конфигурацию памяти SDRAM, подключенной к процессору. Для службы EBIU, которая поддерживает DDR, функция adi_ebiu_Init настраивает регистры управления контроллера DDR: DDRCTL0, DDRCTL1 и DDRCTL2. Для успешной инициализации контроллера SDRAM или DDR в функцию adi_ebiu_Init должен быть передан определенный набор значений, как это обозначено таблицами 4-1 (для SDRAM) и 4-2 (для DDR). Таблица 4-1. Значения для инициализации SDRAM.
Примечания к таблице 4-1: 1 Строб адреса столбца (Column address strobe). Таблица 4-2. Значения для инициализации DDR.
При успешной инициализации модуля EBIU последующие вызовы adi_ebiu_AdjustSDRAM подстраивают скорость обновления данных SDRAM (refresh rate) в регистрах EBIU_SDRRC или DDRCTL0, чтобы они соответствовали указанной частоте системной шины SCLK. Когда используется несколько банков памяти, для каждого банка должны быть указаны соответствующие пары команда-значение ADI_EBIU_CMD_SET_SDRAM_BANK_SIZE и ADI_EBIU_CMD_SET_SDRAM_BANK_COL_WIDTH. Если конфигурация системы использует SDRAM с низким потреблением энергии (low power 2.5V), то должны быть инициализированы следующие значения:
В функцию adi_ebiu_Init могут быть переданы дополнительные пары команда-значение, которые могут быть переданы впоследствии в функцию adi_ebiu_Control. См. описание функции adi_ebiu_Control для получения описания этих пар команда-значение. Функция adi_ebiu_Init должна быть вызвана только 1 раз, но вызовов настроек службы управления питанием, чтобы SDRAM была настроена в соответствии с изменениями SCLK. Последующие вызовы функции adi_ebiu_Init игнорируются. Прототип функции: ADI_EBIU_RESULT adi_ebiu_Init (const ADI_EBIU_COMMAND_PAIR *ConfigData, const u16 Reserved); Аргументы:
В режиме отладки при инициализации SDRAM функция adi_ebiu_Init возвращает следующие значения:
В режиме отладки при инициализации DDR функция adi_ebiu_Init возвращает следующие значения:
В режиме отладки при инициализации контроллера асинхронной памяти (FLASH) функция adi_ebiu_Init возвращает следующие значения:
Функция adi_ebiu_LoadConfig восстанавливает значения текущей конфигурации из области памяти, на которую указывает аргумент hConfig. Контроллер SDRAM сбрасывается. ADI_EBIU_RESULT adi_ebiu_LoadConfig (ADI_EBIU_CONFIG_HANDLE hConfig, size_t szConfig); Аргументы:
Возвращаемое значение:
Функция adi_ebiu_SaveConfig() сохраняет значения текущей конфигурации в область памяти, на которую указывает аргумент hConfig. В настоящее время сохраняется только конфигурация SDRAM. ADI_EBIU_RESULT adi_ebiu_SaveConfig (ADI_EBIU_CONFIG_HANDLE hConfig, size_t szConfig); Аргументы:
Возвращаемое значение:
Функция adi_ebiu_Terminate() завершает использование модуля EBIU. ADI_EBIU_RESULT adi_ebiu_Terminate (void); Возвращаемое значение:
[Публичные типы данных и перечисления модуля EBIU] В этом разделе дано описание публичных типов данных и перечислений. Все публичные функции модуля EBIU возвращают код из перечисляемого типа ADI_EBIU_RESULT. Обратите внимание, что коды возврата, относящиеся к SDRAM, обычно начинаются с текста ADI_EBIU_RESULT_INVALID_SDRAM, в то время как коды возврата, относящиеся к DDR, начинаются с текста ADI_EBIU_RESULT_INVALID_DDR. В таблице 4-3 перечислены возможные значения кодов возврата модуля EBIU. Таблица 4-3. Значения перечисления ADI_EBIU_RESULT.
Структура ADI_EBIU_SDRAM_BANK_VALUE определяет настройки, которые применяются для определенного банка. typedef struct ADI_EBIU_SDRAM_BANK_VALUE { u16 bank; Union { ADI_EBIU_SDRAM_BANK_SIZE size; ADI_EBIU_SDRAM_BANK_COL_WIDTH width; } value; } ADI_EBIU_SDRAM_BANK_VALUE; См. описание ADI_EBIU_SDRAM_BANK_SIZE и ADI_EBIU_SDRAM_BANK_COL_WIDTH для получения подробной информации о полях size и width. Примечание: поле bank предназначено для использования только с теми процессорами Blackfin, у которых есть несколько банков SDRAM. Структура ADI_EBIU_TIME разрешает пользователям указывать значение времени как интегральное число в указанных единицах units. typedef struct ADI_EBIU_TIME { u32 value; ADI_EBIU_TIMING_UNIT units; } ADI_EBIU_TIME; Здесь тип ADI_EBIU_TIMING_UNIT это перечисление, значения которого определены в таблице ниже.
Действительные значения в этом перечислении используются как множители в целочисленной арифметике модуля. Для значения в миллисекундах, которое используется как значение управления логикой, здесь имеется исключение, потому что в данном случае значение перечисления не используется как множитель. Разработчики могут использовать полный диапазон единиц, чтобы указывать значения интервалов времени как беззнаковое 32-битное целое число. Например, SDRAM на плате разработчика ADSP-BF533 EZ-KIT Lite имеет минимальное значение TWR, равное 1 такт SCLK и 7.5 нс. Передаваемое значение времени должно быть указано как 7500 пс. Таким образом, значение ADI_EBIU_TIME должно быть указано следующим образом: ADI_EBIU_TIME time = {7500, ADI_EBIU_TIMING_UNIT_PICOSEC}; Определенные значения времени требуются для корректной установки регистров управления SDRAM в соответствии с подходящим даташитом на процессор. Время указывается как количество тактов SCLK в комбинации со значением времени, указанном в одной из возможных единиц (например, в наносекундах или миллисекундах). Чтобы упростить передачу таких значений в функцию adi_ebiu_Init, определена структура ADI_EBIU_TIMING_VALUE: typedef struct ADI_EBIU_TIMING_VALUE { u32 cycles; ADI_EBIU_TIME time; } ADI_EBIU_TIMING_VALUE; Здесь ADI_EBIU_TIME определено так, как показано в предыдущей врезке. Например, SDRAM на плате разработчика ADSP-BF533 EZ-KIT Lite имеет минимальное значение TWR, равное 1 такт SCLK и 7.5 нс. С использованием структуры ADI_EBIU_TIMING_VALUE это значение времени может быть передано следующим образом: ADI_EBIU_TIMING_VALUE twrmin = {1, {7500, ADI_EBIU_TIMING_UNIT_PICOSEC}}; Контроллер асинхронной памяти поддерживает несколько разных интерфейсов, так что предоставляется структура, которая позволяет задавать параметры времени либо в тактах, либо в единицах времени, однако нельзя использовать одновременно оба вида единиц времени. Если параметр указывается в тактах, то значение напрямую записывается в регистр. Если значение указывается в единицах времени, то они преобразуются в такты на базе системной частоты 133 МГц, и преобразованное значение записывается в регистр. Значения времени для настройки регистров управления асинхронной памятью, должны быть вычислены на основе даташита на используемое устройство памяти. Эта структура используется для указания параметров времени интерфейса асинхронной памяти, как это показано ниже. Она содержит другие 2 структуры ADI_EBIU_BANK_NUMBER и ADI_EBIU_TIMING_VALUE (см. их описание в соответствующих врезках). typedef struct ADI_EBIU_ASYNCH_BANK_TIMING { ADI_EBIU_BANK_NUMBER bank_number; ADI_EBIU_TIMING_VALUE bank_time; } ADI_EBIU_ASYNCH_BANK_TIMING; Из-за того, что многие параметры EBIU привязаны к определенному банку памяти, и указывают двоичное значение наподобие разрешено и запрещено (enabled, disabled), предоставляется структура, которая содержит номер банка вместе с объединением (union) трех различных перечислений, которые имеют два возможных значения. Структура ADI_EBIU_ASYNCH_BANK_VALUE, показанная ниже, используется для полярности ARDY, которая может быть либо low, либо high (см. описание ADI_EBIU_ASYNCH_BANK_ARDY_POLARITY). Она же используется для разрешения функции ARDY, которая может быть либо разрешена, либо запрещена (см. описание ADI_EBIU_ASYNCH_BANK_ARDY_ENABLE). Также она используется для поля разрешения 16-битной упаковки (относится только к процессорам ADSP-BF561), когда может быть либо разрешена 16-битная упаковка, либо запрещена (32-битная упаковка), см. описание ADI_EBIU_ASYNCH_BANK_DATA_PATH. typedef struct ADI_EBIU_ASYNCH_BANK_VALUE { u32 bank_number; union { ADI_EBIU_ASYNCH_BANK_ARDY_POLARITY ardy_polarity; ADI_EBIU_ASYNCH_BANK_ARDY_ENABLE ardy_enable;#if defined(__ADSP_TETON__) ADI_EBIU_ASYNCH_BANK_DATA_PATH data_path;#endif } value; } ADI_EBIU_ASYNCH_BANK_VALUE; [Установка управляющих значений в модуле EBIU] Чтобы установить управляющие значения в модуле EBIU, пользователь передает пары команда-значение (пары типа ADI_EBIU_COMMAND_PAIR) в функции adi_ebiu_Init и adi_ebiu_Control (либо по отдельности каждая пара, либо пары в виде таблицы). Обратите внимание, что функция adi_ebiu_Init позволяет передавать только таблицу пар команда-значение. В этой секции описана структура пары команда-значение и допустимые команды. The ADI_EBIU_COMMAND is used to control/access the configuration of the EBIU module. It is used in an ADI_EBIU_COMMAND_PAIR couplet to set a configuration value in calls to adi_ebiu_Init and adi_ebiu_Control. Note that SDRAM-related commands typically begin with the text ADI_EBIU_CMD_SET_SDRAM while DDR-related commands typically begin with the text ADI_EBIU_CMD_SET_DDR. Таблица 4-4. Команды EBIU (Command) и связанные с ними значения (Value).
Тип данных ADI_EBIU_COMMAND_PAIR позволяет разработчикам генерировать таблицу команд управления для передачи в модуль EBIU с помощью функций adi_ebiu_Init и adi_ebiu_Control: typedef struct ADI_EBIU_COMMAND_PAIR { ADI_EBIU_COMMAND kind; void *value; } ADI_EBIU_COMMAND_PAIR; [Перечисления для параметра Value команд] Следующие перечисления используются для указания информации, необходимой для настройки контроллера SDRAM. Также см. описание значений в Engineer-to-Engineer Note EE-2101 [3]. Это перечисление указывает, что нужно разрешить или запретить SDRAM. Это перечисление соответствует биту EBE в регистре EBIU_SDBCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_EBE_DEFAULT ADI_EBIU_SDRAM_EBE_DISABLE
Это перечисление указывает размер банка внешнего SDRAM. Это перечисление соответствует битам EBSZ в регистре EBIU_SDBCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_BANK_SIZE_DEFAULT ADI_EBIU_SDRAM_BANK_32MB Это перечисление указывает размер ширину адреса столбца банка внешнего SDRAM. Это перечисление соответствует битам EBCAW в регистре EBIU_SDBCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_BANK_COL_WIDTH_DEFAULT ADI_EBIU_SDRAM_BANK_COL_9BIT Это перечисление указывает тип модуля SDRAM, когда для инициализации контроллера SDRAM используется команда ADI_EBIU_CMD_SET_SDRAM_MODULE. Значение перечисления содержат относящуюся к модулю информацию, такую как скорость (speed grade) и настройки конфигурации. Размер банка внешней памяти также должен быть указан с помощью команды ADI_EBIU_CMD_SET_SDRAM_BANK_SIZE. Из-за того, что платы разработчика EZ-KIT Lite компании Analog Devices содержат SDRAM компании Micron, эта информация относится только к микросхемам памяти Micron. Список допустимых значений этого перечисления находится в заголовочном файле API adi_pwr.h. Это перечисление указывает, что нужно разрешить или запретить контроллер SDRAM. Это перечисление соответствует биту SCTLE в регистре EBIU_SDGCTL.
Это перечисление указывает, что используется ли SDRAM с пониженным энергопотреблением (low power 2.5V). Это перечисление соответствует биту EMREN в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_EMREN_DEFAULT ADI_EBIU_SDRAM_EMREN_DISABLE
Когда используется SDRAM с пониженным энергопотреблением (low power 2.5V), это перечисление задает банк для обновления. Перечисление соответствует битам PASR в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_PASR_DEFAULT ADI_EBIU_SDRAM_PASR_ALL
Когда используется SDRAM с пониженным энергопотреблением (low power 2.5V), это перечисление задает температурно-компенсированное значение для самообновления. Перечисление соответствует битам TCSR в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_TCSR_DEFAULT ADI_EBIU_SDRAM_TCSR_45DEG
Это перечисление указывает, нужно ли разрешить или запретить для EBIU выполнять самообновление SDRAM во время периодов отсутствия активности. Это перечисление соответствует биту SRFS в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_SRFS_DEFAULT ADI_EBIU_SDRAM_SRFS_DISABLE
Это перечисление указывает, нужно ли для EBIU использовать внешние буферы, когда несколько устройств SDRAM подключены к внешней шине параллельно. Это перечисление соответствует биту EBUFE в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_EBUFE_DEFAULT ADI_EBIU_SDRAM_EBUFE_DISABLE
Это перечисление указывает, должна ли быть задержана на 15 тактов SCLK последовательность старта при включении питания power-up start sequence. Это перечисление соответствует биту PUPSD в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_PUPSD_DEFAULT ADI_EBIU_SDRAM_PUPSD_NODELAY
Это перечисление задает последовательность включения SDRAM (power-up sequence). Это перечисление соответствует биту PSM в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_PSM_DEFAULT ADI_EBIU_SDRAM_PSM_REFRESH_FIRST
Это перечисление задает, использует ли EBIU быстрый доступ back-to-back read-write, чтобы позволить операции чтения и записи SDRAM в следующих друг за другом циклах. Это перечисление соответствует биту FBBRW в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_FBBRW_DEFAULT ADI_EBIU_SDRAM_FBBRW_DISABLE
Это перечисление разрешает или запрещает сигналы управления SDRAM, когда к интерфейсу внешней памяти параллельно подключен внешний контроллер SDRAM. Это перечисление соответствует биту CDDBG в регистре EBIU_SDGCTL.
Значение по умолчанию задается следующим макросом: #define ADI_EBIU_SDRAM_CDDBG_DEFAULT ADI_EBIU_SDRAM_CDDBG_DISABLE
Это перечисление используется, чтобы указать номер банка 0, 1, 2 или 3 для тех команд, в которых указывается номер банка. Это перечисление также можно использовать, чтобы указать все банки.
Это перечисление используется, чтобы указать, какие банки разрешены. Перечисление соответствует битам AMBEN в глобальном регистре управления асинхронной памятью.
Это перечисление задает, разрешен CLKOUT для доступа к внешней памяти. Перечисление соответствует битам AMCKEN в глобальном регистре управления асинхронной памятью.
Это перечисление относится только к процессору ADSP-BF561. Оно задает, разрешена ли 16-битная упаковка на шине асинхронной памяти. Перечисление соответствует битам BXPEN в глобальном регистре управления асинхронной памятью, где X это номер банка.
Каждый асинхронный банк может быть запрограммирован для оцифровки входа ARDY, что позволяет расширить время доступа к банку. Анализ уровня на выводе ARDY определяет, насколько долго должно быть увеличено время доступа. Это перечисление указывает, должен или нет анализироваться сигнал ARDY. Оно соответствует биту BXRDYEN (где X это номер банка) в регистре 0 управления банком асинхронной памяти (для банков 0 и 1), или в регистре 1 управления банком асинхронной памяти (для банков 2 и 3).
Если анализ сигнала ARDY разрешен (см. предыдущую врезку), то это перечисление определяет, по какому уровню должен анализироваться сигнал ARDY (т. е. полярность ARDY). Перечисление соответствует биту BXRDYPOL (где X это номер банка) в регистре 0 управления банком асинхронной памяти (для банков 0 и 1), или в регистре 1 управления банком асинхронной памяти (для банков 2 и 3).
Время удержания для контроллера асинхронной памяти указывается в поле bank_time структуры ADI_EBIU_ASYNCH_BANK_TIMING. Это поле имеет тип ADI_EBIU_TIMING_VALUE, которое в данном случае может указывать либо количество тактов, либо значение ADI_EBIU_TIME, но одновременно оба способа указания времени использовать нельзя. Когда используются такты, перечисление ADI_EBIU_ASYNCH_HOLD_TIME задает количество тактов времени удержания. Оно соответствует биту BXHT (где X это номер банка) в регистре 0 управления банком асинхронной памяти (для банков 0 и 1), или в регистре 1 управления банком асинхронной памяти (для банков 2 и 3).
Время установки для контроллера асинхронной памяти указывается в поле bank_time структуры ADI_EBIU_ASYNCH_BANK_TIMING. Это поле имеет тип ADI_EBIU_TIMING_VALUE, которое в данном случае может указывать либо количество тактов, либо значение ADI_EBIU_TIME, но одновременно оба способа указания времени использовать нельзя. Когда используются такты, перечисление ADI_EBIU_ASYNCH_SETUP_TIME задает количество тактов времени установки. Оно соответствует биту BXST (где X это номер банка) в регистре 0 управления банком асинхронной памяти (для банков 0 и 1), или в регистре 1 управления банком асинхронной памяти (для банков 2 и 3).
Время перехода для контроллера асинхронной памяти указывается в поле bank_time структуры ADI_EBIU_ASYNCH_BANK_TIMING. Это поле имеет тип ADI_EBIU_TIMING_VALUE, которое в данном случае может указывать либо количество тактов, либо значение ADI_EBIU_TIME, но одновременно оба способа указания времени использовать нельзя. Когда используются такты, перечисление ADI_EBIU_ASYNCH_TRANSITION_TIME задает количество тактов времени перехода. Оно соответствует биту BXTT (где X это номер банка) в регистре 0 управления банком асинхронной памяти (для банков 0 и 1), или в регистре 1 управления банком асинхронной памяти (для банков 2 и 3).
Это перечисление задает нагрузочную способность шины (drive strength) для устройства памяти. Это значение записывается в поле DS регистра EBIU_DDRCTL3. Перечисление ADI_EBIU_DDR_MOBILE_DS используется только для микросхем mobile DDR. Для не мобильных DDR см. ADI_EBIU_DDR_DS. Возможные значения перечисления ADI_EBIU_DDR_MOBILE_DS перечислены в таблице ниже.
Это перечисление задает нагрузочную способность шины (drive strength) для устройства памяти. Это значение записывается в поле DS регистра EBIU_DDRCTL3. Перечисление ADI_EBIU_DDR_DS используется только для микросхем не мобильных DDR. Для мобильных DDR см. ADI_EBIU_DDR_MOBILE_DS. Возможные значения перечисления ADI_EBIU_DDR_DS перечислены в таблице ниже.
Это перечисление задает значение для частичного самообновления массива (partial array self-refresh), которое записывается в поле PASR регистра EBIU_DDRCTL3. Это поле доступно только для микросхем мобильных DDR. Возможные значения перечисления ADI_EBIU_DDR_PASR перечислены в таблице ниже.
[Ссылки] 1. VisualDSP++ 5.0 Device Drivers and System Services Manual for Blackfin® Processors site:analog.com. |