TigerSHARC 0 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба Есть L138. На ARM-ядре запущен линукс. Есть задание сделать пересылку данных из SPI в кэш на стороне DSP. Есть модуль EDMA. Вижу, что у DSP есть ещё и IDMA. Вопрос: как лучше сделать пересылку данных(с помощью EDMA или IDMA)? Если делать через EDMA, не будет ли конфликтовать с Linux? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба С периферией работает только EDMA. IDMA - для внутренних пересылок память-память в DSP-ядре (насколько помню, хотя никогда его не использовал) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба Спасибо за ответ! У меня есть ещё небольшой вопросик, так как пока только начинаю разбираться с особенностями 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 191 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба Я не использую никакие библиотеки для работы с периферией. К тому-же - не использовал GPIO как event-ы для EDMA. Источники event-ов у меня были только McASP и SPI. Так что - вам самим разбираться Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба А я вот никак не могу понять как задаётся внешнее событие для запуска транзакции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
BratherLU 0 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба А я вот никак не могу понять как задаётся внешнее событие для запуска транзакции. Если правильно понял вопрос - нужно правильно проинициализировать 22-й ParamSet + разрешить события от 22-го ParamSet в EER + правильно наcтроить события в GPIO модуле. Дока на omap-l138 6.9.1 EDMA3 Channel Synchronization Events event - 22 ps кодом помочь не могу - не использовал GPIO для синхронизации EDMA-пересылок Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба Спасибо, разобрался. Этот код (Events ID) прописан в Datasheet, а я пользовался Technical Reference Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
TigerSHARC 0 28 апреля, 2014 Опубликовано 28 апреля, 2014 · Жалоба По ходу дела возник ещё вопрос. Планирую данные забирать с АЦП. Когда данные в АЦП гототвы, то 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 байт, что конечно само по себе некорректно.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться