jcxz 242 10 сентября, 2011 Опубликовано 10 сентября, 2011 (изменено) · Жалоба Пытаюсь запустить EDMA3 McASP1->L2RAM. Получаю BusError в EDMA3TC[0].ERRDET. Думаю, что возможная проблема - с арбитражем доступа к L2RAM (DSP крутится в цикле в L2 и буфер DMA там же). Значит надо сконфигурить приоритеты доступа CPU и EDMA к L2RAM. В результате поисков в SPRS563 нашёл упоминание о регистре EDMAWEIGHT (L2 EDMA access control register), но нигде в даташитах на L137/C674x он не описан (только в старых даташитах типа spru610 на ядра C64x). Но самое главное, что занимаемый EDMAWEIGHT адрес (0x01841000) согласно SPRS563 (OMAP-L137 Low-Power Applications Processor (Rev. D)) занимает регистр CPUARBU согласно SPRUFK5 (TMS320C674x DSP Megamodule Reference Guide). У обоих доступ == R/W. Да и вообще все регистры "C674x Cache Registers" (SPRS563) конфликтуют с "Arbitration Registers" (SPRUFK5). Что за бардак? Кому верить??? Кто-нить сталкивался с этой проблемой? Изменено 10 сентября, 2011 пользователем jcxz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 9 ноября, 2011 Опубликовано 9 ноября, 2011 · Жалоба Пытаюсь запустить EDMA3 McASP1->L2RAM. Получаю BusError в EDMA3TC[0].ERRDET. Думаю, что возможная проблема - с арбитражем доступа к L2RAM (DSP крутится в цикле в L2 и буфер DMA там же). Значит надо сконфигурить приоритеты доступа CPU и EDMA к L2RAM. В результате поисков в SPRS563 нашёл упоминание о регистре EDMAWEIGHT (L2 EDMA access control register), но нигде в даташитах на L137/C674x он не описан (только в старых даташитах типа spru610 на ядра C64x). Но самое главное, что занимаемый EDMAWEIGHT адрес (0x01841000) согласно SPRS563 (OMAP-L137 Low-Power Applications Processor (Rev. D)) занимает регистр CPUARBU согласно SPRUFK5 (TMS320C674x DSP Megamodule Reference Guide). У обоих доступ == R/W. Да и вообще все регистры "C674x Cache Registers" (SPRS563) конфликтуют с "Arbitration Registers" (SPRUFK5). Что за бардак? Кому верить??? Кто-нить сталкивался с этой проблемой? У Вас вообще получилось хоть как-нибудь заставить работать EDMA3 McASP->L2RAM? Я так и не смог найти нормального примера для EDMA3 без использования PSP и других драйвверов. Я пока внимательно читаю EDMA3 мануал, проц 6745. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 10 ноября, 2011 Опубликовано 10 ноября, 2011 (изменено) · Жалоба Нет. Да мне пока особо не припёрло - поэтому пока отложил это - из L3 и из SDRAM нормально работает - и ладно. Хотя тоже хотелось бы разобраться в этом вопросе. Изменено 10 ноября, 2011 пользователем jcxz Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 10 ноября, 2011 Опубликовано 10 ноября, 2011 · Жалоба Нет. Да мне пока особо не припёрло - поэтому пока отложил это - из L3 и из SDRAM нормально работает - и ладно. Хотя тоже хотелось бы разобраться в этом вопросе. А не могли бы запостить сюда пример инициализации EMDA3, а то мне до сих его не заставить работать. Совершенно не могу понять в чем дело! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 10 ноября, 2011 Опубликовано 10 ноября, 2011 · Жалоба А не могли бы запостить сюда пример инициализации EMDA3, а то мне до сих его не заставить работать. Совершенно не могу понять в чем дело! С Вашей проблемой я не разобрался, но нашел в errate упоминание DMA Access to L2 RAM Can Stall When DMA and C674x CPU Command Priorities are Equal Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 11 ноября, 2011 Опубликовано 11 ноября, 2011 · Жалоба А не могли бы запостить сюда пример инициализации EMDA3, а то мне до сих его не заставить работать. Совершенно не могу понять в чем дело! Да там вроде ничего сложного. Начальная: ------------------------------------------------------------------- int i = ncell(EDMA3TC) - 1; do { EDMA3TC.ERREN = EDMA3TC.ERRCLR = B0 | B2 | B3; EDMA3TC.RDRATE = 0; } while (--i >= 0); EDMA3CC.CCERRCLR = B16; EDMA3CC.DMAQNUM[DMA_CH_FLASH_RX >> 3] = EDMA3CC.DMAQNUM[DMA_CH_FLASH_RX >> 3] & ~(7 << (DMA_CH_FLASH_RX & 7) * 4) | DMA_TC_FLASH_RX << (DMA_CH_FLASH_RX & 7) * 4; EDMA3CC.DMAQNUM[DMA_CH_FLASH_TX >> 3] = EDMA3CC.DMAQNUM[DMA_CH_FLASH_TX >> 3] & ~(7 << (DMA_CH_FLASH_TX & 7) * 4) | DMA_TC_FLASH_TX << (DMA_CH_FLASH_TX & 7) * 4; EDMA3CC.DRA[1].DRAE = ~0; ------------------------------------------------------------------- потом инитите нужные CSL_Edma3ccParamSetRegs, потом запуск: EDMA3CC.EESR = EDMA3CC.ECR = EDMA3CC.SECR = EDMA3CC.EMCR = 1 << DMA_CH_FLASH_RX | 1 << DMA_CH_FLASH_TX; EDMA3CC.IESR = EDMA3CC.ICR = 1 << DMA_CH_FLASH_RX; С Вашей проблемой я не разобрался, но нашел в errate упоминание DMA Access to L2 RAM Can Stall When DMA and C674x CPU Command Priorities Да я вроде пробовал переносить код в другую область - не помогало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
qxov 0 11 ноября, 2011 Опубликовано 11 ноября, 2011 · Жалоба У Вас вообще получилось хоть как-нибудь заставить работать EDMA3 McASP->L2RAM? Я так и не смог найти нормального примера для EDMA3 без использования PSP и других драйвверов. Я пока внимательно читаю EDMA3 мануал, проц 6745. Качайте EDMA3 Low Level Driver. Оно того стоит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 11 ноября, 2011 Опубликовано 11 ноября, 2011 · Жалоба Да там вроде ничего сложного. Начальная: ------------------------------------------------------------------- int i = ncell(EDMA3TC) - 1; do { EDMA3TC.ERREN = EDMA3TC.ERRCLR = B0 | B2 | B3; EDMA3TC.RDRATE = 0; } while (--i >= 0); EDMA3CC.CCERRCLR = B16; EDMA3CC.DMAQNUM[DMA_CH_FLASH_RX >> 3] = EDMA3CC.DMAQNUM[DMA_CH_FLASH_RX >> 3] & ~(7 << (DMA_CH_FLASH_RX & 7) * 4) | DMA_TC_FLASH_RX << (DMA_CH_FLASH_RX & 7) * 4; EDMA3CC.DMAQNUM[DMA_CH_FLASH_TX >> 3] = EDMA3CC.DMAQNUM[DMA_CH_FLASH_TX >> 3] & ~(7 << (DMA_CH_FLASH_TX & 7) * 4) | DMA_TC_FLASH_TX << (DMA_CH_FLASH_TX & 7) * 4; EDMA3CC.DRA[1].DRAE = ~0; ------------------------------------------------------------------- потом инитите нужные CSL_Edma3ccParamSetRegs, потом запуск: EDMA3CC.EESR = EDMA3CC.ECR = EDMA3CC.SECR = EDMA3CC.EMCR = 1 << DMA_CH_FLASH_RX | 1 << DMA_CH_FLASH_TX; EDMA3CC.IESR = EDMA3CC.ICR = 1 << DMA_CH_FLASH_RX; Да я вроде пробовал переносить код в другую область - не помогало. Поправил баги, появилось прерывание. Пока для отладки копирую данные из одного буфера в другой. Прерывание приходит, а данные не копируются :( появляется Read Addressing Error, хотя в PARAMSET указан правильный адрес буфера... Качайте EDMA3 Low Level Driver. Оно того стоит. Я вот только не понял, можно его без DSP/BIOS использовать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 13 ноября, 2011 Опубликовано 13 ноября, 2011 · Жалоба Вопрос снят. Использование возможно только с DSP/BIOS. А у меня uTron используется в качестве real-time OS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SM 0 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба Это, извините, как это? Если возможно хоть в одной программе, значит возможно и в остальных! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба Это, извините, как это? Если возможно хоть в одной программе, значит возможно и в остальных! Насколько я понял, в драйвере используются системные функции DSP/BIOS (где-то на форуме видел, что точно используются семафоры). Соответсвенно драйвер не будет работать без DSP/BIOS Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба Да там (в EDMA3) вроде ничего сложного - всё то же, что и в других контроллерах DMA. Зачем этот драйвер если не используется DSP/BIOS? Описания в документации по EDMA3 вполне достаточно, чтобы его запустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 15 ноября, 2011 Опубликовано 15 ноября, 2011 · Жалоба Да там (в EDMA3) вроде ничего сложного - всё то же, что и в других контроллерах DMA. Зачем этот драйвер если не используется DSP/BIOS? Описания в документации по EDMA3 вполне достаточно, чтобы его запустить. В приницпе да, но вот отсутствие обычных примеров немного затянуло для меня окучивание EDMA3, сейчас вроде все заработало. В приницпе да, но вот отсутствие обычных примеров немного затянуло для меня окучивание EDMA3, сейчас вроде все заработало. Да, кстати, у меня нормально работает McASP0->L2RAM Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 242 16 ноября, 2011 Опубликовано 16 ноября, 2011 · Жалоба Да, кстати, у меня нормально работает McASP0->L2RAM У меня McASP1 ;) Да - надо где-то покурить конфигурирование L2RAM. Но пока особо не критично - планирую использовать скорее всего L2RAM для более критичных по скорости задач, чем DMA. Вы его конфигурили специально для EDMA3 или оно само так получилось? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
di-sk 0 17 ноября, 2011 Опубликовано 17 ноября, 2011 · Жалоба У меня McASP1 ;) Да - надо где-то покурить конфигурирование L2RAM. Но пока особо не критично - планирую использовать скорее всего L2RAM для более критичных по скорости задач, чем DMA. Вы его конфигурили специально для EDMA3 или оно само так получилось? Я думаю McASP0 или McASP1 - не принципиально! У меня сначала тоже была ошибка BUSERR, но потом я выснил что не так (не разобрался до конца почему) сконфигурил память процессор. Если внимательно присмотреться к документу SPRS377D.pdf, то в таблице memory map будет видно, что L2RAM раположена по двум разным адресам. Как только я стал использовать вторые адреса, все заработало! Почему так, еще не понял. Сейчас некогда с памятью разбираться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться