Перейти к содержанию
    

OMAP-L138, DMA на стороне DSP-ядра

Есть L138. На ARM-ядре запущен линукс. Есть задание сделать пересылку данных из SPI в кэш на стороне DSP. Есть модуль EDMA. Вижу, что у DSP есть ещё и IDMA. Вопрос: как лучше сделать пересылку данных(с помощью EDMA или IDMA)?

Если делать через EDMA, не будет ли конфликтовать с Linux?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С периферией работает только EDMA.

IDMA - для внутренних пересылок память-память в DSP-ядре (насколько помню, хотя никогда его не использовал)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо за ответ!

 

У меня есть ещё небольшой вопросик, так как пока только начинаю разбираться с особенностями EDMA, прошу совета. Есть код, который настраивает EDMA для старта от GPIO (event).

При инициализации GPIO просто активировал прерывание от банка номер 2.

Ка кнаписано тут http://processors.wiki.ti.com/index.php/Co...PIO_EDMA_Events :

 

Configure the GPIO pin as an input by writing 0 to its respective bit in the DIRxy register.

Enable a rising edge and/or falling edge EDMA event by writing to the appropriate bit in the SET_RIS_TRIGxy/SET_FAL_TRIGxy register.

Enable the EDMA event by writing to BINTEN.ENn where n is the bank number. Note: This step must be performed regardless of whether you're planning to ultimately use a "direct" event (GPINTx) or the "bank" event (GPBNKINTy). The ENn bit gates all events from the GPIO module.

 

 

Нашёл код инициализации EDMA, который в качестве event использует GPIO Bank 1, а мне очень надо Bank2. подскажите где подправить. Код ниже:

 

void edmaInit(void)
{
unsigned int shadowRegionId = 1;	// Shadow region used for interrupts
unsigned int edmaTxChNum = 7;		// Ch7 is the GPIO Bank1 Event
unsigned int edmaRecvChNum = 18;	// Ch18 is SPI1 Receive Event

// Enabling the PSC for EDMA3CC_0.
   PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_CC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

   // Enabling the PSC for EDMA3TC_0.
   PSCModuleControl(SOC_PSC_0_REGS, HW_PSC_TC0, PSC_POWERDOMAIN_ALWAYS_ON, PSC_MDCTL_NEXT_ENABLE);

   // Enable the DMA channel in shadow region 1
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_DRAE(shadowRegionId)) |= (0x01u << edmaTxChNum);
   HWREG(SOC_EDMA30CC_0_REGS + EDMA3CC_DRAE(shadowRegionId)) |= (0x01u << edmaRecvChNum);

   // Configure the EDMA SPI1 Tx parameters
   edmaTxReload();

   // Configure the EDMA SPI1 Recv parameters
   edmaRecvReload();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я не использую никакие библиотеки для работы с периферией. К тому-же - не использовал GPIO как event-ы для EDMA.

Источники event-ов у меня были только McASP и SPI.

Так что - вам самим разбираться

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я вот никак не могу понять как задаётся внешнее событие для запуска транзакции.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А я вот никак не могу понять как задаётся внешнее событие для запуска транзакции.

 

Если правильно понял вопрос - нужно правильно проинициализировать 22-й ParamSet + разрешить события от 22-го ParamSet в EER + правильно наcтроить события в GPIO модуле.

 

Дока на omap-l138

6.9.1 EDMA3 Channel Synchronization Events

event - 22

 

ps кодом помочь не могу - не использовал GPIO для синхронизации EDMA-пересылок

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По ходу дела возник ещё вопрос. Планирую данные забирать с АЦП. Когда данные в АЦП гототвы, то EDMA по сигналу (GPIO event) забирает данные через SPI.

Не могу понять, как будет вести себя EDMA при такой конфигурации:

 

void edmaTxReload(void)

{

unsigned int shadowRegionId = 1; // Shadow region used for interrupts

unsigned int edmaTxChNum = 7; // Ch7 is the GPIO Bank1 Event

unsigned int edmaTxEvtQNum = 0; // Event Queue used

unsigned short edmaTxACnt = 1; // 4 1-byte transmissions

unsigned short edmaBCnt = 4; // 1 time transmission

unsigned short edmaCCnt = 2000; // 1 time transmission

unsigned short edmaTxSrcBIdx = 0; // Don't want to change the src count offset

unsigned short edmaTxDesBIdx = 0; // Don't want to change the destination count offset

unsigned short edmaTxSrcCIdx = 0; // Don't want to change the src count offset

unsigned short edmaTxDesCIdx = 0; // Don't want to change the destination count offset

unsigned short edmaBCntReload = 4; // Don't want to reload B count

unsigned int dummyVal = 0xFF;

volatile unsigned int *ds;

unsigned int *sr;

unsigned int i = 0;

 

Есть два варианта рзвития событий:

1) EDMA будет отправлять данные по 4 байта при каждом сигнале от GPIO и так 2000, потом произойдёт прерывание от EDMA

2) EDMA будет пытаться отправить 4 байта в АЦП 2000 раз, итого 8000 байт, что конечно само по себе некорректно....

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...