|
|
  |
OMAP L138, быстрый старт |
|
|
|
Aug 23 2012, 07:12
|
Знающий
   
Группа: Свой
Сообщений: 549
Регистрация: 1-06-05
Пользователь №: 5 644

|
Цитата(torik @ Aug 23 2012, 07:51)  ...Что-то не могу найти простых толковых примеров, Quick Start или еще чего. Ткните куда-нибудь... Возможно, Вам будут полезны примеры из StarterWare.
|
|
|
|
|
Aug 23 2012, 15:41
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(torik @ Aug 23 2012, 19:04)  Начнем с простого GPIO - как настроить на выход и изменять значение? 1. Включить GPIO в PSC 2. Настроить соответствующий PINMUX 3. Настроить пин на вывод и вывести значение Примерно так же, как и в любом МК. Только на первый взгляд все кажется монструозным.
|
|
|
|
|
Aug 24 2012, 13:00
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(torik @ Aug 24 2012, 16:34)  Уже становится понятнее. А что такое PSC, есть для вышеперечисленных пунктов подробный порядок действий? PSC - Power and Sleep Controller. Подробный порядок действий для GPIO: 1. PSC 1.1. Записываем 0x03 (Enable State) в регистр MDCTL3 модуля PSC1 (MDCTL3 @ PSC1 - GPIO, привязки даны в документации на PSC) 1.2. Ставим GO0 в регистре PTCMD модуля PSC1, вызывая тем самым смену состояния 1.3. Дожидаемся сброса бита GOSTAT0 в регистре PTSTAT 2. PINMUX 2.1. Просто выставляем нужное значение в соответствующем поле PINMUX 3. GPIO 3.1. Убеждаемся, что ID модуля читается, т.е. п.1 отработали правильно 3.2. Сбрасываем нужный бит в DIRxx, переводя тем самым пин на выход 3.3. Пишем SET_DATAxx / CLR_DATAxx, наблюдаем изменение состояния пина
|
|
|
|
|
Aug 29 2012, 06:25
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Когда ARM ядро запускаю, все нормально. Прога дебажится через SAU-510. Однако когда создаю проект под DSP ядро, при попытке подключиться дает ошибку: Код Error connecting to the target: (Error -1180 @ 0x0) Device is held in reset. Take the device out of reset, and retry the operation. (Emulation package 5.0.747.0) На ногу RESETn сигнальника с плисины я подаю короткий ресет, без этого и арм не запускается. Подскажите, где копать - в железе или в настройках проекта? Проверили на отладке - ведет себя также
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Aug 29 2012, 07:41
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Охренеть. По примерам из StarterWare: Код PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); И заливаю это в АРМ, все верно? А как положить это в ПЗУ, хотя бы M25P64, подключенное к сигнальнику? А то не могу же я, не прекратив выполнение программы арма началь отладку дсп... Но кроме того, вернусь к изначальной теме: мне надо помыргать светодиодом. На основе StarterWire и рекомендаций aaarrr (я только не понял че там за ID такой), написал прогу и запускаю ее под арм: Код #include <stdio.h>
#include "gpio.h" #include "psc.h"
#include "soc_OMAPL138.h" #include "lcdkOMAPL138.h"
#include "hw_syscfg0_OMAPL138.h"
#include "hw_types.h"
/***************************************************************************** ** MACRO DEFINITION *****************************************************************************/ /* Pin Multiplexing bit mask to select GP0[0] pin. */ #define PINMUX1_GPIO0_0_ENABLE (SYSCFG_PINMUX1_PINMUX1_27_24_GPIO0_1 << SYSCFG_PINMUX1_PINMUX1_27_24_SHIFT)
/****************************************************************************/ /* LOCAL FUNCTION PROTOTYPES */ /****************************************************************************/ static void Delay(volatile unsigned int delay);
/****************************************************************************/ /* GLOBAL VARIABLES */ /****************************************************************************/
/****************************************************************************/ /* LOCAL FUNCTION DEFINITIONS */ /****************************************************************************/
//#include <OMAPL138_common.h> /* * hello.c */ void main(void) { printf("Hello World!\n"); //CSL_FINS(gpioRegs->BANK[GP0].DIR, GPIO_DIR_DIR12, CSL_GPIO_DIR_DIR_OUT); unsigned int savePinmux = 0;
/* The Local PSC number for GPIO is 3. GPIO belongs to PSC1 module.*/ PSCModuleControl(SOC_PSC_1_REGS, HW_PSC_GPIO, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);
/* Pin Multiplexing of pin 12 of GPIO Bank 6.*/ // GPIOBank6Pin12PinMuxSetup(); /* ** Clearing the bit in context and retaining the other bit values ** in PINMUX10 register. */ savePinmux = (HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) & ~(SYSCFG_PINMUX1_PINMUX1_31_28));
/* Setting the pins corresponding to GP4[0] in PINMUX10 register.*/ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(1)) = (PINMUX1_GPIO0_0_ENABLE | savePinmux);
/* Sets the pin 1 (GP0[0]) as out.*/ GPIODirModeSet(SOC_GPIO_0_REGS, 1, GPIO_DIR_OUTPUT);
while(1) { GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_LOW);
Delay(1000000);
GPIOPinWrite(SOC_GPIO_0_REGS, 1, GPIO_PIN_HIGH);
Delay(1000000); }
}
/* ** \brief This function checks the insertion status of the MMC/SD card ** in the device and prints related statements on the serial ** commuincation console of the external device. ** */
/* ** \brief This function can be called to generate a delay. */
static void Delay(volatile unsigned int delay) { while(delay--); } Однако светодиод не моргает. Подпрогаммы посмотрел, вроде бы все верно (да и кто бы сомневался). Может в арм-е по-другому надо с psc что-то делать, что-то еще включить?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Aug 29 2012, 09:03
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(torik @ Aug 29 2012, 11:41)  По примерам из StarterWare: Код PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); И заливаю это в АРМ, все верно? Со StarterWare я не знаком, но на вид верно. Цитата(torik @ Aug 29 2012, 11:41)  А как положить это в ПЗУ, хотя бы M25P64, подключенное к сигнальнику? А то не могу же я, не прекратив выполнение программы арма началь отладку дсп... Могу предложить Хитрый Способ: 1. Создаем в HEX-редакторе "бинарник" для ARM из одной инструкции "b .": 0xfe 0xff 0xff 0xea 2. Берем AISGen, ставим в нем галку "Configure PSC", разрешаем в конфигурации PSC DSP 3. Создаем загрузочный образ Дубово, но зато просто и будет работать. Цитата(torik @ Aug 29 2012, 11:41)  Но кроме того, вернусь к изначальной теме: мне надо помыргать светодиодом. На основе StarterWire и рекомендаций aaarrr (я только не понял че там за ID такой), написал прогу и запускаю ее под арм: ... Однако светодиод не моргает. Подпрогаммы посмотрел, вроде бы все верно (да и кто бы сомневался). Может в арм-е по-другому надо с psc что-то делать, что-то еще включить? ID - регистр модуля GPIO. Его можно прочитать, чтобы убедиться, что клок на самом деле включен. Подозреваю, что SYSCFG залочен (см. регистры Kick0, Kick1), поэтому запись в PINMUX не проходит.
|
|
|
|
|
Aug 29 2012, 09:44
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Цитата Подозреваю, что SYSCFG залочен (см. регистры Kick0, Kick1), поэтому запись в PINMUX не проходит. Пишу такую последовательность: Код HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK0R) = 0x83e70b13; HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK1R) = 0x95a4f1e0; Эффект нулевой. Цитата ID - регистр модуля GPIO Для тупых поясните - что это такое за регистр ID модуля GPIO? Попробовал прочитать пинмукс после записи в него - результат 0, несмотря на разлочивание.
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Aug 29 2012, 09:56
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(torik @ Aug 29 2012, 13:44)  Для тупых поясните - что это такое за регистр ID модуля GPIO? Регистр REVID, 0-й адрес в пространстве модуля. Не знаю, как еще объяснить. Цитата(torik @ Aug 29 2012, 13:44)  Попробовал прочитать пинмукс после записи в него - результат 0, несмотря на разлочивание. Возможно, процессор не в привилегированном режиме находится. Попробуйте прочитать REVID SYSCFG.
|
|
|
|
|
Aug 29 2012, 12:45
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 2-06-09
Пользователь №: 49 843

|
Тоже интересно, не поделится ли кто примером как попасть в режим супервизора?
|
|
|
|
|
Aug 29 2012, 12:54
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(maxis @ Aug 29 2012, 16:45)  Тоже интересно, не поделится ли кто примером как попасть в режим супервизора? Вариантов два: - не попадать в режим юзера - SWI Нужно изучать/модифицировать исходники. Тут не помогу, т.к. у меня их нет. А вообще, запускаем поиск по "msr" - и вперед.
|
|
|
|
|
Aug 30 2012, 02:46
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(aaarrr @ Aug 29 2012, 12:57)  DSP нужно включить со стороны ARM'а - он выключается почти сразу после старта. Хм... А что - в L138 первым стартует ARM? Работал с L137 только - там стартует DSP (по вкл. питания ARM - в ресете) , код bootloader-а выполняет DSP, и в пользовательском ПО чтобы использовать ARM, надо сперва прописать таблицу векторов для ARM (в его памяти), а потом - включить его и вывести из ресета. Под JTAG - на L137 доступны сразу оба ядра, так как JTAG их сам выводит из ресета когда подключается к ним. И на отладку под JTAG можно запускать сразу два проекта параллельно. Цитата(aaarrr @ Aug 29 2012, 17:45)  Понятно: процессор в user mode, поэтому и доступа к SYSCFG нет. Надо шерстить стартап StarterWare на предмет выставления режима. rts.lib файл boot.asm: Код cstartup: .asmfunc MRS R0, SPSR ;Now will ORR R0, R0, #CPU_MODE_SYS;set to SVC mode MSR CPSR, R0 ; with privileges Можно конечно через SWI. Но я делаю как показал выше - так проще. Кроме того - в этом rts.lib можно ещё что-нить пооптимизить и пообкусывать.
|
|
|
|
|
Aug 30 2012, 05:50
|

Гуру
     
Группа: Свой
Сообщений: 2 113
Регистрация: 1-11-05
Пользователь №: 10 359

|
Скачали с сайта техаса файл boot.asm, тупо добавили его в проект - все заработало. Как это работает, каким образом этот асм файл встроился в код - непонятно совершенно. А сигнальник все равно в ресете На строках Код PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE); виснет. Какой порядок включения dsp? Разве не такой же как и GPIO?
--------------------
Быть. torizin-liteha@yandex.ru
|
|
|
|
|
Aug 30 2012, 06:21
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(jcxz @ Aug 30 2012, 06:46)  Хм... А что - в L138 первым стартует ARM? Там мудреная система загрузки: первым стартует DSP, затем он при помощи PRU окучивает ARM, потом ARM отрубает DSP. Цитата(torik @ Aug 30 2012, 09:50)  Какой порядок включения dsp? Порядок включения описан в разделе "DSP Wake Up" sprugm7. Но виснуть при обращении к PSC всяко не должен.
|
|
|
|
|
Aug 30 2012, 09:26
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 2-06-09
Пользователь №: 49 843

|
Цитата(aaarrr @ Aug 30 2012, 10:21)  Порядок включения описан в разделе "DSP Wake Up" sprugm7. Но виснуть при обращении к PSC всяко не должен. По мануалу: Perform the following steps to wake up the DSP: 1. Write a 83E7 0B13h to the KICK0R register in the SYSCFG module. 2. Write a 95A4 F1E0h to the KICK1R register in the SYSCFG module. 3. Write the truncated DSP boot address vector to the DSP_ISTP_RST_VAL field in the host 1 configuration register (HOST1CFG) of the SYSCFG module. The least-significant bits of the boot address are fixed at 0. 4. Write a 3h to the NEXT bit in the DSP local power sleep controller (LPSC) module control register (PSC0.MDCTL15) to prepare the DSP module for an enable transition (to enable the clocks and all transitioning from the SwRstDisable state to Enable state). 5. Write a 1 to the GO[1] bit (DSP subsystem is part of the PD_DSP domain) in the power domain transition command register (PSC0.PTCMD) to start the state transition sequence for the DSP module. 6. Check (poll for 0) the GOSTAT[1] bit in the power domain transition status register (PSC0.PTSTAT) for power transition sequence completion. The domain is only safely in the new state after the GOSTAT[1] bit is cleared to 0. 7. Wait for the STATE bit field in the DSP LPSC module status register (PSC0.MDSTAT15) to change to 3h. The module is only safely in the new state after the STATE bit field changes to reflect the new state. 8. Write a 1 to the LRST bit in PSC0.MDCTL15 to release the DSP local reset controlled by the PSC module. Выполняю следующее: Код HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK0R) = 0x83e70b13; HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_KICK1R) = 0x95a4f1e0;
//Включение DSP HWREG (SOC_SYSCFG_0_REGS + SYSCFG0_HOST1CFG) = 0x00E00000; PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDCTL_NEXT_ENABLE); PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_PTCMD_GO1); PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_PTSTAT_GOSTAT1_SHIFT); PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_STATE); PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_LRST); И на строке Код PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_STATE); Выполнение программы подвисает. Что делаю не так?
|
|
|
|
|
Aug 30 2012, 10:27
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(maxis @ Aug 30 2012, 13:26)  И на строке Код PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_DSP, PSC_POWERDOMAIN_PD_DSP, PSC_MDSTAT_STATE); Выполнение программы подвисает. Что делаю не так? А что говорит PSC0.MDSTAT15?
|
|
|
|
|
Aug 30 2012, 11:24
|
Участник

Группа: Участник
Сообщений: 67
Регистрация: 2-06-09
Пользователь №: 49 843

|
Цитата(aaarrr @ Aug 30 2012, 14:27)  А что говорит PSC0.MDSTAT15? 0x00000A00
|
|
|
|
|
Aug 31 2012, 20:01
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(aaarrr @ Aug 30 2012, 12:21)  Там мудреная система загрузки: первым стартует DSP, затем он при помощи PRU окучивает ARM, потом ARM отрубает DSP. Значит - всё точно так же как в L137. А зачем Вы отрубаете DSP после старта ARM? Если интересно могу привести свой код, которым запускаю ARM (см. прикреплённый файл).
boot.zip ( 1.05 килобайт )
Кол-во скачиваний: 140 Файл boot.asm (который в составе rts.lib) модифицирован как указано в моём посте выше. Начало main() из DSP-проекта: Код #pragma FUNC_NEVER_RETURNS int main() { u32 cpuUseIdle; s32 i;
CACHE.L1DCFG = 7; i = CACHE.L1DCFG; soc.faza = soc.FAZA_BEGIN; EnableARM();
CooperateWait(soc.FAZA_DSPIDLE_MEAS); //отсель ARM и DSP работают совместно ...
|
|
|
|
|
Sep 2 2012, 13:47
|
Гуру
     
Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881

|
Цитата(aaarrr @ Sep 2 2012, 13:27)  На самом деле в L138 первым тоже стартует DSP Конечно, точно не могу утверждать, но косвенные признаки показывают, что это не так. Если выполнить hardware reset через JTAG при помощи ICEPICK, и не дать ядрам выполнить ничего из внутреннего ПЗУ, то живым в L138 оказывается таки ARM, а в L137 - DSP. И это же следует из анализа стартапных GEL-файлов обоих процессоров, и последовательностей коннекта эмуляторов к ядрам.
|
|
|
|
|
Sep 22 2013, 19:36
|
Группа: Новичок
Сообщений: 4
Регистрация: 22-09-13
Пользователь №: 78 436

|
Возникла примерно такая же задача как в начале темы - на OMAP-L138 протестировать uPP, EMIF и I2C для связи с ПЛИС, только под встроенным Linux и не привлекая DSP ядро. Если с I2C все понятно, то на вопрос о запуске uPP на ARM без запуска DSP на форуме TI отвечают только "используйте DSP/LINK", хотя uPP выглядит достаточно простым. Почему нельзя запустить его не запуская DSP? На форуме и в даташитах прямого ответа на этот вопрос нет (возможно проглядел что он может писать только в память DSP?).
|
|
|
|
|
Nov 1 2013, 18:28
|
Частый гость
 
Группа: Участник
Сообщений: 112
Регистрация: 10-10-13
Пользователь №: 78 684

|
Цитата(aaarrr @ Nov 1 2013, 21:17)  Поэтому лучше изложить ситуацию и задать вопросы. Интерфейс действительно очень простой. Поддерживаю.
Сообщение отредактировал lekintr - Nov 1 2013, 18:29
|
|
|
|
|
Nov 3 2013, 11:32
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326

|
octobus Как точно заметил уважаемый aaarrr исходники мало помогут, ибо все настройки напрямую зависят от того, какая железка прикручена с другой стороны UPP. Интерфейс простой, но есть несколько тонкостей. Во-первых, чтобы использовать на всю катушку пропускную способность UPP (а иначе зачем DMA?) лучше выделять большие массивы под окна и работать поллингом по строкам, читая соответствующее регистры. А поддержку пакетирования можно реализовать передачей тегов в первой сроке пакета, состоящего из переменного количества строк. Во-вторых, аппаратное управление потоком работает только в одну сторону (если не ошибаюсь, по приёму от OMAP). В другую сторону оно не работает, и приходится устанавливать сигнал waits вручную из программы. При выборе подходящего размера строки (к примеру 64 байта) потери на передачу пакетов минимальной длины будут вполне приемлемы.
|
|
|
|
|
Nov 3 2013, 16:43
|
Частый гость
 
Группа: Guests
Сообщений: 122
Регистрация: 9-10-13
Из: Дубна
Пользователь №: 78 671

|
Сейчас вопрос стоит не в том, что невозможно разобраться с UPP, а в том, чтобы сэкономить время на тупые эксперименты с последовательностью команд и заполнением регистров. Поэтому нужны исходники, рабочие, в которых гарантированно рабочий код на прием и передачу желательно с эффективным использованием callback'ов. К OMAP подключена ПЛИСина, поэтому вопросов с согласованием нет. ПЛИСина всегда сможет подстроиться под OMAP. Убедительно прошу не подымать тему недельку попусту. Советы не нужны, пока, во всяком случае. Нужны исходники. Надеюсь на понимание.
Сообщение отредактировал octobus - Nov 3 2013, 16:45
|
|
|
|
|
Nov 5 2013, 11:27
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326

|
octobusВот исходники для uboot. Код #define DAVINCI_GPIO_BINTEN 0x01E26008 #define DAVINCI_GPIO_BANK01 0x01E26010 #define DAVINCI_GPIO_BANK23 0x01E26038 #define DAVINCI_GPIO_BANK45 0x01E26060 #define DAVINCI_GPIO_BANK67 0x01E26088 #define DAVINCI_GPIO_BANK89 0x01E260B0
struct davinci_gpio { unsigned int dir; unsigned int out_data; unsigned int set_data; unsigned int clr_data; unsigned int in_data; unsigned int set_rising; unsigned int clr_rising; unsigned int set_falling; unsigned int clr_falling; unsigned int intstat; };
struct davinci_gpio_bank { int num_gpio; unsigned int irq_num; unsigned int irq_mask; unsigned long *in_use; unsigned long base; };
#define davinci_gpio_bank01 ((struct davinci_gpio *)DAVINCI_GPIO_BANK01) #define davinci_gpio_bank23 ((struct davinci_gpio *)DAVINCI_GPIO_BANK23) #define davinci_gpio_bank45 ((struct davinci_gpio *)DAVINCI_GPIO_BANK45) #define davinci_gpio_bank67 ((struct davinci_gpio *)DAVINCI_GPIO_BANK67) #define davinci_gpio_bank89 ((struct davinci_gpio *)DAVINCI_GPIO_BANK89)
/**************************************************************************\ * Register Overlay Structure \**************************************************************************/ typedef struct { volatile unsigned UPPID; volatile unsigned UPPCR; volatile unsigned UPDLB; volatile unsigned char RSVD0[4]; volatile unsigned UPCTL; volatile unsigned UPICR; volatile unsigned UPIVR; volatile unsigned UPTCR; volatile unsigned UPISR; volatile unsigned UPIER; volatile unsigned UPIES; volatile unsigned UPIEC; volatile unsigned UPEOI; volatile unsigned char RSVD1[12]; volatile unsigned UPID0; volatile unsigned UPID1; volatile unsigned UPID2; volatile unsigned char RSVD2[4]; volatile unsigned UPIS0; volatile unsigned UPIS1; volatile unsigned UPIS2; volatile unsigned char RSVD3[4]; volatile unsigned UPQD0; volatile unsigned UPQD1; volatile unsigned UPQD2; volatile unsigned char RSVD4[4]; volatile unsigned UPQS0; volatile unsigned UPQS1; volatile unsigned UPQS2; } CSL_UppRegs;
typedef struct { volatile unsigned REVID; volatile unsigned char RSVD0[4]; volatile unsigned DIEIDR0; volatile unsigned DIEIDR1; volatile unsigned DIEIDR2; volatile unsigned DIEIDR3; volatile unsigned DEVIDR0; volatile unsigned char RSVD1[4]; volatile unsigned BOOTCFG; volatile unsigned CHIPREVIDR; volatile unsigned char RSVD2[16]; volatile unsigned KICK0R; volatile unsigned KICK1R; volatile unsigned HOST0CFG; volatile unsigned HOST1CFG1; volatile unsigned char RSVD3[152]; volatile unsigned IRAWSTAT; volatile unsigned IENSTAT; volatile unsigned IENSET; volatile unsigned IENCLR; volatile unsigned EOI; volatile unsigned FLTADDRR; volatile unsigned FLTSTAT; volatile unsigned char RSVD4[20]; volatile unsigned MSTPRI0; volatile unsigned MSTPRI1; volatile unsigned MSTPRI2; volatile unsigned char RSVD5[4]; volatile unsigned PINMUX0; volatile unsigned PINMUX1; volatile unsigned PINMUX2; volatile unsigned PINMUX3; volatile unsigned PINMUX4; volatile unsigned PINMUX5; volatile unsigned PINMUX6; volatile unsigned PINMUX7; volatile unsigned PINMUX8; volatile unsigned PINMUX9; volatile unsigned PINMUX10; volatile unsigned PINMUX11; volatile unsigned PINMUX12; volatile unsigned PINMUX13; volatile unsigned PINMUX14; volatile unsigned PINMUX15; volatile unsigned PINMUX16; volatile unsigned PINMUX17; volatile unsigned PINMUX18; volatile unsigned PINMUX19; volatile unsigned SUSPSRC; volatile unsigned CHIPSIG; volatile unsigned CHIPSIG_CLR; volatile unsigned CFGCHIP0; volatile unsigned CFGCHIP1; volatile unsigned CFGCHIP2; volatile unsigned CFGCHIP31; volatile unsigned CFGCHIP4; } CSL_SyscfgRegs;
#define CSL_SYSCFG_0_REGS (0x01C14000u) #define CSL_UPP_0_REGS (0x01E16000u) CSL_UppRegs* uppRegs = (CSL_UppRegs*)(CSL_UPP_0_REGS); CSL_SyscfgRegs* sysRegs = (CSL_SyscfgRegs*)(CSL_SYSCFG_0_REGS);
void UPP_WAITB_RESET(void) { davinci_gpio_bank89->clr_data |= (1<<12); //WAIT_B off }
void setup_UPP(void) { int x; sysRegs->SUSPSRC &= ~(1<<4); //2.1.add. Transmit Clock source - from UPP_2xTXCLK pin sysRegs->CFGCHIP31 = 0x60; /* uPP Transmit Clock Selection (spruh77.pdf p.144) CFGCHIP3_UPP_TX | CFGCHIP3_ASYNC3_CLKSRC | Transmit Clock Source ---------------------------------------------------------------- 0 (ASYNC3) | 0 (PLL0) | PLL0_SYSCLK2 0 (ASYNC3) | 1 (PLL1) | PLL1_SYSCLK2 1 (TXCLK) | X | UPP_2xTXCLK pin */ //2.2 Enable clocks uPP // Setup Peripherals; // wait for UPPID to become valid after enabling module in 2 while ( uppRegs->UPPID != 0x44231100 );
//3. SWRST //wait for dma active/pending bits DB to clear uppRegs->UPPCR = 0x1b;
//4. Wait at least 200 clock cycles udelay(100000); uppRegs->UPPCR = 0x0b;
//5. Program UPP Config Reg's //UPCTL uppRegs->UPCTL = 0x07;
//UPICR /* !NB spruh77.pdf page 1519 33.2.6.1 Step-by-Step Procedure NOTE: When initializing the uPP peripheral, the uPP interface configuration register (UPICR) must be programmed using a single, 32-bit write. Writing UPICR fields one-by-one can lead to unexpected results. */
uppRegs->UPICR = 0x00180020;
//UPIVR - idle value uppRegs->UPIVR = 0xAC;
//6. UPIES - Interrupt Enable
uppRegs->UPIEC = 0xffffffff; uppRegs->UPIES = 0x1f1f; uppRegs->UPIER = 0xffffffff;
//7. uPP peripheral Enable uppRegs->UPPCR = 0x0b;
davinci_gpio_bank89->dir &= ~(1<<12); // wait_b out
UPP_WAITB_RESET(); }
|
|
|
|
|
Nov 11 2013, 14:07
|
Частый гость
 
Группа: Guests
Сообщений: 122
Регистрация: 9-10-13
Из: Дубна
Пользователь №: 78 671

|
В общем все пришлось писать заново, используя другие ресурсы. Форум electronix.ru ни фига мне не помог. Собственно не очень и рассчитывал. Зато теперь... утритесь гуру  Мне удалось запустить UPP в режиме DMA с прерываниями и загрузкой новых данных на лету. По осциллографу видно что при размере буфера больше определенного размера пропуски пропадают. Прикрепляю проект для CCS 5.4. Ничего не требуется, только импортировать проект. Все настроено так, что проект компилируется с любого места на винте. UPP в проекте работает в режиме TX канал A, RX канал B, ширина шины данных 8bit, частота CPU 300MHz, частота UPP 37.5MHz Кроме того в проекте активирован режим Digital Loopback, поэтому чтобы данные полетели наружу надо его отключить. Чтобы отключить надо закомментировать UPP_LOOPBACK_ENABLED Также там включены только прерывания RX,TX чтобы включить все надо закомментить UPP_INT_TEST_ENABLED Еще нашел ошибки в скачанном недавно с сайта Texas Instrumente Starterware для OMAPL138. У них в файле hw_upp.h неверные адреса регистров. Будьте осторожны. В проекте эта ошибка исправлена. Проект для OMAPL138.
Сообщение отредактировал octobus - Nov 11 2013, 14:12
|
|
|
|
|
Nov 11 2013, 16:35
|
Местный
  
Группа: Свой
Сообщений: 459
Регистрация: 15-07-04
Из: g.Penza
Пользователь №: 326

|
octobusПоздравляю  . Смущает только, что при размере буфера больше определенного размера пропуски пропадают. Поскольку обмен идёт через AXI, при изменении нагрузки SOC без правильного управления потоком пакеты могут начать снова пропадать. А какая у Вас установившаяся скорость обмена ? У нас тоже 8bit и частота 36,864 МГц. Всё крутиться под Linux. Пакеты переменной длины с выравниванием по границе 64 байта.
|
|
|
|
|
Jul 23 2014, 21:55
|
Группа: Участник
Сообщений: 13
Регистрация: 15-12-06
Из: S.-Petersburg
Пользователь №: 23 556

|
Прикрепляю проект для CCS 5.4. Ничего не требуется, только импортировать проект. Все настроено так, что проект компилируется с любого места на винте. UPP в проекте работает в режиме p.h неверные адреса регистров. Будьте осторожны. В проекте эта ошибка исправлена.
Проект для OMAPL138. [/quote]
А можно получить Вашш проект по почте, ссылка мне недоступна почта v i c t o r_T r o f i m o v@ m a i l. r u
|
|
|
|
|
Jan 14 2016, 10:12
|
Группа: Новичок
Сообщений: 1
Регистрация: 14-01-16
Пользователь №: 90 027

|
Цитата(octobus @ Oct 6 2014, 08:24)  жду не дождусь когда же уберут предупреждение, второй год глаза мозолит. Пока не снимут, файлы оставлять не буду. А можно мне тоже ваш проект? Буду очень признателен почта otdel55(с о б а к а)oniip.ru
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|