|
|
  |
OMAP L138, быстрый старт |
|
|
|
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 байта.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|