mantech 49 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба 5 часов назад, repstosw сказал: Есть ли возможность отмапить источники прерываний на другой вектор? Их куча свободных: IntLevel 2,4,5. По идее должна быть, но с доками тут увы и ах((( Вот меня тоже вопрос одолевает, скажем, нужно сделать систему авторегулирования скорости, нужно подключить энкодер к МК, реализовать ПИД алгоритм и вывести выходную частоту для внешнего ПЧН. И вот можно-ли это реали зовать на ДСП? Потребуются минимум прерывания от 2х внешних линий энкодера, и таймера. Для посл. прерывание есть, а вот для линий GPIO? Для чего вот эти определения #define XCHAL_EXTINT0_NUM 0 /* (intlevel 5) */ ..... #define XCHAL_EXTINT27_NUM 30 /* (intlevel 1) */ Изменено 16 сентября, 2023 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба 1 hour ago, repstosw said: Обнаружил, что компилятор xtensa-hifi4-elf-gcc для DSP не выравнивает константные строки, если задан уровень оптимизации -Os (по размеру). Проблему решили с помощью таких замечательных макросов: #define __PACKED_STRUCT struct __attribute__((packed,aligned(1))) #define __UNALIGNED_UINT32_READ(addr) (((const struct T_UINT32_READ*)(const void*)(addr))->v) #define __UNALIGNED_UINT32_WRITE(addr,val) (void)((((struct T_UINT32_WRITE*)(void*)(addr))->v)=(val)) __PACKED_STRUCT T_UINT32_READ{uint32_t v;}; __PACKED_STRUCT T_UINT32_WRITE{uint32_t v;}; 1 hour ago, sasamy said: но есть возможность любое внешнее прерывание смапить на NMI а у него level 5, правда как это делать не знаю - в freertos NMI не используется Откуда эта информация? 1 hour ago, sasamy said: Ещё теоретически должен быть коммутатор с выбором какое прерывание периферии на какое прерывание DSP подключить и в таком случае периферийные прерывания можно раскидать на разные уровни, но это сейчас главная загадка 🙂 Я думаю, что всё прозаически просто. У регистра intenable 32 бита. Скорее всего, некоторые из них разрешают прерывания от периферии T113-s3. Msgbox именно по такому принципу сделан: биты 3,4 разрешают его прерывание. 7 minutes ago, mantech said: Вот меня тоже вопрос одолевает, скажем, нужно сделать систему авторегулирования скорости, нужно подключить энкодер к МК, реализовать ПИД алгоритм и вывести выходную частоту для внешнего ПЧН. И вот можно-ли это реали зовать на ДСП? Потребуются минимум прерывания от 2х внешних линий энкодера, и таймера. Для посл. прерывание есть, а вот для линий GPIO? В настоящий момент, можно сконфигурить GPIO как вход прерывания и размаскировать весь регистр intenable и помотреть на какой вектор упадёт прерывание. Или не упадёт, если предположения не верны. Правда биты 31, 1, 2 лучше не устанавливать - это ошибка операции с памятью, и два таймера Изменено 16 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба On 9/16/2023 at 10:00 AM, repstosw said: Откуда эта информация? из руководства xtensa lx 13.6 Interrupt Handling Quote External interrupts are connected to the BInterrupt input pins and can be configured to be of three types: Level-sensitive Edge-triggered NMI (edge-triggered non-maskable interrupt) Note: Only one NMI interrupt signal is allowed. http://loboris.eu/ESP32/Xtensa_lx Overview handbook.pdf Изменено 16 сентября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 9 minutes ago, sasamy said: External interrupts are connected to the BInterrupt input pins and can be configured to be of three types: Level-sensitive Edge-triggered NMI (edge-triggered non-maskable interrupt) Note: Only one NMI interrupt signal is allowed. Это не тот уровень который приоритет :) Это высокий-низкий в плане сигнала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба On 9/16/2023 at 10:21 AM, repstosw said: Это не тот уровень который приоритет :) это вообще не про уровень, у NMI 5 уровень https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/164696d952116d20100daefd7a475d2ede828eb0/include/xtensa/config/core-isa.h#L502 но я похоже неправильно понял и прерывания на NMI от периферии надо подключать через коммутатор как и другие внешние прерывания https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/164696d952116d20100daefd7a475d2ede828eb0/include/xtensa/config/core-isa.h#L581 Чтобы пояснить что я имею ввиду под коммутатором, см например imxrt https://manualzz.com/doc/55201372/nxp-i.mx-rt600-crossover-mcu-user-guide 50.7 Interrupts Table 1457.HiFi4 interrupt на странице 1493 каждому входу внешнего прерывания DSP соответствует регистр с настройками от какой периферии заводить прерывание на на данный вход DSP То что я процитировал из хэндбука xtensa lx относится к аппартному конфигу ядра - програмно это уже не поменять. Вполне возможно коммутация делается где-то в этих регистрах но они не описаны и на первый взгляд кроме инита где просто обнуляются вообще не используются https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/164696d952116d20100daefd7a475d2ede828eb0/arch/board-init.c#L63 Изменено 16 сентября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба 1 hour ago, repstosw said: Я думаю, что всё прозаически просто. У регистра intenable 32 бита. Скорее всего, некоторые из них разрешают прерывания от периферии T113-s3. Msgbox именно по такому принципу сделан: биты 3,4 разрешают его прерывание. Моя гипотеза подтвердилась. Запустил кодек в режиме вывода звука (DAC) через DMA. Поймал прерывание со стороны DSP - в регистре intenable нужно установить бит 8. Работает только на DMA каналах с 8 до 15. Прерывания от них доступны DSP, не доступны CPU. Каналы DMA 0..7 : прерывания не доступны DSP, но доступны CPU. Проверил на прерываниях по заполнению половины буфера(Half) и по полному заполнению(Full). Тот же самый вектор - Level3Int. Итого, что уже известно: Регистр intenable. Установка бит: 1 - Timer1 2 - Timer0 3 - MsgBox 8 - DMA Надо ещё GPIO проверить на каком бите и векторе сидят... Изменено 16 сентября, 2023 пользователем repstosw Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба On 9/16/2023 at 11:57 AM, repstosw said: Я думаю, что всё прозаически просто. У регистра intenable 32 бита. Это очевидно из того что регистры 32 битные и всего 32 прерывания 🙂 Номера прерываний того что реализовано в freertos тут https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/164696d952116d20100daefd7a475d2ede828eb0/include/platform.h#L75 как включаются прерывания в DSP тоже не секрет https://github.com/YuzukiHD/FreeRTOS-HIFI4-DSP/blob/164696d952116d20100daefd7a475d2ede828eb0/src/msgbox.c#L40 вопрос как завести прерывания нужной периферии и возможно ли это, а не тыкать только то что после сброса по умолчнию подключено Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 28 minutes ago, sasamy said: вопрос как завести прерывания нужной периферии и возможно ли это, а не тыкать только то что после сброса по умолчнию подключено С GPIOC номер не прокатил - DSP не видит прерывание от нажатия кнопки (CPU видит). На счёт каналов DMA, что с 8 по 15 доступны для DSP - явно сказано в даташите на T113-s3. В board-init.c есть такой таинственный кусок: #define SUNXI_DSP_IRQ_NMI 0 #define SUNXI_DSP_IRQ_DSP_TIMER1 1 #define SUNXI_DSP_IRQ_DSP_TIMER0 2 #define RINTC_IRQ_MASK 0xffff0000 #define SUNXI_R_INTC_PBASE (0x01700800) #define SUNXI_DSP_IRQ_R_INTC 20 #define SUNXI_RINTC_IRQ_NMI (RINTC_IRQ_MASK | 0) /* not use */ #define SUNXI_RINTC_IRQ_SOURCE_MAX 88 /* FIXME: can be decreased */ struct intc_regs { /*offset 0x00 */ volatile uint32_t vector; volatile uint32_t base_addr; volatile uint32_t reserved0; volatile uint32_t control; /*offset 0x10 */ volatile uint32_t pending; volatile uint32_t pending1; volatile uint32_t pending2; volatile uint32_t reserved1[9]; /*offset 0x40 */ volatile uint32_t enable; volatile uint32_t enable1; volatile uint32_t enable2; volatile uint32_t reserved2[1]; /*offset 0x50 */ volatile uint32_t mask; volatile uint32_t mask1; volatile uint32_t mask2; volatile uint32_t reserved3[5]; /*offset 0x70 */ volatile uint32_t fast_forcing; volatile uint32_t reserved4[3]; /*offset 0x80 */ volatile uint32_t priority0; volatile uint32_t priority1; volatile uint32_t reserved5[14]; /*offset 0xc0 */ volatile uint32_t group_config0; volatile uint32_t group_config1; volatile uint32_t group_config2; volatile uint32_t group_config3; }; static volatile struct intc_regs *(pintc_regs)=(volatile struct intc_regs*)SUNXI_R_INTC_PBASE; void board_init(void) { _cache_config(); pintc_regs->enable = 0x0; pintc_regs->mask = 0x0; pintc_regs->pending = 0xffffffff; pintc_regs->enable1 = 0x0; pintc_regs->mask1 = 0x0; pintc_regs->pending1 = 0xffffffff; pintc_regs->enable2 = 0x0; pintc_regs->mask2 = 0x0; pintc_regs->pending2 = 0xffffffff; } Может быть эти регистры отвечают за коммутацию прерываний на DSP. В общем ХЗ. Тут только копать исходники, либо искать документацию, либо экспериментировать. Либо всё вместе :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба On 9/16/2023 at 1:37 PM, repstosw said: В общем ХЗ. мне кажется самый реалистичный вариант спросить у автора порта freertos для т113 чтобы он поделился инфой - явно не из астрала структура с описанием INTC. Спрашивали у дистрибьютера allwinner, они дали всё что у них есть - архив с pdf-ми на китайском но там ничего нет интересного. Изменено 16 сентября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 11 минут назад, sasamy сказал: не из астрала структура с описанием INTC. А он чей разработки, Xtensa или allwinner, или х.з.? 1 час назад, repstosw сказал: С GPIOC номер не прокатил - DSP не видит прерывание от нажатия кнопки (CPU видит). Это очень печально(( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба On 9/16/2023 at 2:54 PM, mantech said: А он чей разработки, Xtensa или allwinner, или х.з.? а какая разница ? мне кажется ни то ни другое https://github.com/YuzukiHD Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба 5 минут назад, sasamy сказал: а какая разница ? Если знать разработчика - проще доки найти на подобные вещи, т.к. они могут где-то еще использоваться... Изменено 16 сентября, 2023 пользователем mantech Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
repstosw 18 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 3 hours ago, sasamy said: мне кажется самый реалистичный вариант спросить у автора порта freertos для т113 чтобы он поделился инфой - явно не из астрала структура с описанием INTC. Спрашивали у дистрибьютера allwinner, они дали всё что у них есть - архив с pdf-ми на китайском но там ничего нет интересного. 3 hours ago, mantech said: Если знать разработчика - проще доки найти на подобные вещи, т.к. они могут где-то еще использоваться... Мне кажется, что это Interrupt Controller от A10. По крайней мере большинство регистров совпадает по названиям и смещениям: Попробовал в pintc_regs->enable записать 0x1. Прерывание от DMA перестало работать на DSP. Выводы очевидны: это оно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mantech 49 16 сентября, 2023 Опубликовано 16 сентября, 2023 · Жалоба 2 часа назад, repstosw сказал: Мне кажется, что это Interrupt Controller от A10. Ну да, похоже. Помню, там был этот примитивный контроллер)) 2 часа назад, repstosw сказал: Прерывание от DMA перестало работать на DSP. GPIO не пробовали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasamy 0 16 сентября, 2023 Опубликовано 16 сентября, 2023 (изменено) · Жалоба On 9/16/2023 at 6:31 PM, repstosw said: Выводы очевидны: это оно. Оно, только и у автора freertos инфы похоже нет - просто взял общий расклад регистров, а что куда подключено неизвестно https://linux-sunxi.org/INTC#R_INTC но может и известно и про линейный маппинг в мануале говорится в контексте INTC Quote The CPU interrupt seen by DSP is subtracted 32 from the following interrupt number. For example, the interrupt number of MSGBOX is 32, then the interrupt number seen by DSP is 0. Table 3-11 Interrupt Sources а сам INTC висит на 20 прерывании DSP Quote #define SUNXI_DSP_IRQ_NMI 0 #define SUNXI_DSP_IRQ_DSP_TIMER1 1 #define SUNXI_DSP_IRQ_DSP_TIMER0 2 #define SUNXI_DSP_IRQ_R_INTC 20 Изменено 16 сентября, 2023 пользователем sasamy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться