пятница, 16 сентября 2011 г.

Загрузка TMS320C55xx в SDRAM

Цифровые сигнальные процессоры Texas Instruments серии C55xx имеют контроллер внешней памяти EMIF, обеспечивающий возможность работы с памятью типа Nand, Nor, асинхронными SRAM и синхронными SDRAM микросхемами памяти.

После того, как вы откомпилировали ваше приложение, с помощью утилиты hex55, входящей в состав Code Generation Tools для С5000 достаточно просто получить бинарный файл для прошивки во внешнюю энергонезависимую память. Встроенный загрузчик отлично справляется с загрузкой программы во внутреннюю SARAM без каких-либо дополнительных манипуляций. Однако, если ваша программа уже достаточно велика, возникает необходимость использования дополнительной внешней памяти, куда загрузчик должен загрузить программу или данные и запустить выполнение программы. Как это сделать, я и расскажу в этой статье на примере настройки SDRAM на отладочной плате EVM5515. Всё описанное может быть применено с некоторыми изменениями не только для использования SDRAM, но и любых других типов памяти (например, для исполнения программы непосредственно из энергонезависимой флэш-памяти).

И так, наш проект перестал влазить во внутреннюю память, и мы залинковали несколько или все секции во внешнюю SDRAM. Как использовать линкер, описано в документе TMS320C55x Optimizing C/C++ Compiler User’s Guide.

При использовании JTAG-отладчика процесс загрузки выглядит следующим образом:

  • отладчик подключается к процессору
  • отладчик выполняет так называемый *.gel файл, который, кроме создания карты регистров для отладчика, позволяет сконфигурировать любые регистры процессора
  • для платы EVM5515 в gel-файле содержится инициализация внешней SDRAM, поэтому под отладчиком наш код запустится без проблем

Для того, чтобы загрузчик мог использовать SDRAM, необходимо в бинарный файл прошивки добавить инициализацию регистров (как выглядит образ прошивки, описано в Using the TMS320C5515/14/05/04 Bootloader), настраивающих EMIF-интерфейс процессора. Бинарные файлы для прошивки в энергонезависимую память формируются программой hex55, описание которой можно найти в документе TMS320C55x Assembly Language Tools User's Guide.

Для EVM5515 cmd-файл для утилиты hex55 должен выглядеть следующим образом:


d:\way_to_our_object_file\project.out
-boot
-v5505
-serial8
-b
-reg_config 0x1c1e,0x0001
-reg_config 0x1c33,0x0000
-reg_config 0x1020,0x0000
-reg_config 0x1021,0x0001
-reg_config 0x103C,0x0000
-reg_config 0x100C,0x009B
-reg_config 0x1008,0x4720
-reg_config 0x1009,0x0001
-delay 0x100
-reg_config 0x100C,0x00C0
-delay 0x100
-o firmware.bin

Что за регистры здесь конфигурируются, можно посмотреть в документации на EMIF-интерфейс и в TMS3320C5515 DSP System User's Guide. По сути, здесь производится то же самое, что и в файле evm5515.gel, с учетом того, что загрузчик работает на скорости 36.864 МГц.

Таким образом, мы объяснили загрузчику, что перед загрузкой приложения надо настроить доступ к SDRAM.

Но, в результате опытов, было выявлено, что перед входом в приложение загрузчик сбрасывает EMIF, и выполнение становится возможным только из внутреннего ОЗУ.

Что же делать? Добавить настройку EMIF для доступа к SDRAM сразу при входе в пользовательское приложение!

Для этого создаем в проекте ассемблерный файл со следующим содержимым.


    .mmregs

    .ref _c_int00

ESCR    .set    0x1c33
SDTIMR1 .set    0x1020
SDTIMR2 .set    0x1021
SDCR1   .set    0x1008
SDCR2   .set    0x1009
SDSRETR .set    0x103C
SDRCR   .set    0x100C
PRCR    .set    0x1C05
PCGCR1  .set    0x1c02
PCGCR2  .set    0x1c03
PSRCR   .set    0x1c04
CLKCFGL .set    0x1c1e
CCR2    .set    0x1c1f
CGCR1   .set    0x1c20
CGCR2   .set    0x1c21
CGCR3   .set    0x1c22
CGCR4   .set    0x1c23
CCSSR   .set    0x1c24
IVPD    .set    0x0049

    .def    _c5515_init
    .sect   "c5515_init_sect"

_c5515_init:
    .if 1
    bit(ST1, #11) = #1      ; Disable interrupts
    bit(ST3,#7) = #0        ; Clear bus error interrupts
    bit(ST3,#2) = #1        ; shut off clockout port
    bit(ST1,#13) = #0       ; shut off XF port
    .endif

    ; peripheral reset
    .if 1
    *port(#PSRCR) = 0x0020  ; set peripheral reset count
    *port(#PRCR) = 0x00BF   ; reset peripherals, EMIF too
    repeat(#0x0100)
    nop
    .endif
   
    ; config pll to 100 MHz
    .if 1
    ; Enable clocks to peripherals
    *port(#PCGCR1) = 0x0000
    *port(#PCGCR2) = 0x0000
    ; Bypass PLL
    *port(#CCR2) = 0x0000
    ; Set CLR_CNTL = 0
    *port(#CGCR1) = 0x8BE8
    *port(#CGCR2) = 0x8000
    *port(#CGCR3) = 0x0806
    *port(#CGCR4) = 0x0000
    ; Wait for PLL lock
    repeat(#0x1000)
    nop
    ; Switch to PLL clk
    *port(#CCR2) = 0x0001
    .endif

    ; init SDRAM
    .if 1
    ; reset EMIF
    *port(#PRCR) = 0x0002
    repeat(#0x100)
    nop
    ; enable SDRAM clock
    *port(CLKCFGL) = 0x0001
    ; enable word writes to EMIF regs
    *port(#ESCR) = 0x0000
    ; step 1
    *port(#SDTIMR1) = 0x4710
    *port(#SDTIMR2) = 0x3911
    *port(#SDSRETR) = 0x0007
    ; step 2
    *port(#SDRCR) = 0x04E3
    ; step 3
    *port(#SDCR1) = 0x4720
    *port(#SDCR2) = 0x0001
    ; step 4
    repeat(#0x100)
    nop
    ; step 5
    *port(#SDRCR) = 0x061A
    .endif
   
    goto _c_int00

    .end

В этом коде осуществляется настройка PLL на 100 МГц и EMIF-интерфейса для SDRAM аналогично gel-файлу. Всё достаточно просто.

Теперь необходимо перенаправить точку входа в наше приложение с точки по умолчанию (_c_int00) на _c5515_init. Это делается в опциях линкера в проекте или добавлением ключа линкера "-e _c5515_init".

И последнее, что нам осталось, это сделать так, чтобы код этой ассемблерной процедуры выполнялся из внутренней памяти, для этого добавляем в проект файл с расширением cmd (командный файл линкера) с содержимым:


SECTIONS {
   c5515_init_sect : > SARAM PAGE 0 
}

SARAM, само собой, должна быть описана в секции MEMORY.

Вот и всё, теперь перед входом в библиотечную функцию инициализации переменных мы настраиваем PLL и используемую память, и при входе в main() имеем полностью готовую к работе систему.

Это многословное руководство написано по результатам моих опытов и переписки в форуме e2e. Спасибо камраду Cong Van Nguyen за помощь.

Здесь у меня описано, почему данный метод может не работать для NOR-flash.

2 комментария:

  1. Здравствуйте. Подскажите, а можно загрузить программу в память TMS320C5515 с адреса FE0000-FFFFFFH? С уважением, Владимир.

    ОтветитьУдалить
    Ответы
    1. В адресах FE0000-FFFFFFH уже находится встроенный загрузчик, загрузить туда ничего нельзя.
      Чтобы начать выполнение этого загрузчика, надо перейти на его входную точку, а какой у неё адрес, можно посмотреть под отладчиком, нажав "Restart", после чего должен произойти аппаратный reset и процессор перейдёт на начало встроенного загрузчика.

      Удалить