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

Allwinner T113-s3 уделал HiFi4 DSP. Смеяться или плакать?

5 часов назад, repstosw сказал:

Есть ли возможность отмапить источники прерываний  на другой вектор?  Их куча свободных: IntLevel 2,4,5.

По идее должна быть, но с доками тут увы и ах(((

Вот меня тоже вопрос одолевает, скажем, нужно сделать систему авторегулирования скорости, нужно подключить энкодер к МК, реализовать ПИД алгоритм и вывести выходную частоту для внешнего ПЧН. И вот можно-ли это реали зовать на ДСП? Потребуются минимум прерывания от 2х внешних линий энкодера, и таймера. Для посл. прерывание есть, а вот для линий GPIO?

Для чего вот эти определения 

#define XCHAL_EXTINT0_NUM        0    /* (intlevel 5) */

.....

#define XCHAL_EXTINT27_NUM        30    /* (intlevel 1) */

Изменено пользователем mantech

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


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

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 лучше не устанавливать - это ошибка операции с памятью, и два таймера

Изменено пользователем repstosw

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


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

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

Изменено пользователем sasamy

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


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

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.

Это не тот уровень который приоритет :) Это высокий-низкий в плане сигнала.

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


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

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

Изменено пользователем sasamy

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


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

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 проверить на каком бите и векторе сидят... :sun_bespectacled:

Изменено пользователем repstosw

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


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

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

вопрос как завести прерывания нужной периферии и возможно ли это, а не тыкать только то что после сброса по умолчнию подключено

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


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

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.  В общем ХЗ.  Тут только  копать исходники, либо искать документацию, либо экспериментировать. Либо всё вместе :)

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


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

On 9/16/2023 at 1:37 PM, repstosw said:

В общем ХЗ. 

мне кажется самый реалистичный вариант спросить у автора порта freertos для т113 чтобы он поделился инфой - явно не из астрала структура с описанием INTC. Спрашивали у дистрибьютера allwinner, они дали всё что у них есть - архив с pdf-ми на китайском но там ничего нет интересного.

Изменено пользователем sasamy

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


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

11 минут назад, sasamy сказал:

не из астрала структура с описанием INTC.

А он чей разработки, Xtensa или allwinner, или х.з.?

1 час назад, repstosw сказал:

С GPIOC номер не прокатил - DSP не видит прерывание от нажатия кнопки (CPU видит).

Это очень печально((

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


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

On 9/16/2023 at 2:54 PM, mantech said:

А он чей разработки, Xtensa или allwinner, или х.з.?

а какая разница ? мне кажется ни то ни другое

https://github.com/YuzukiHD

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


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

5 минут назад, sasamy сказал:

а какая разница ?

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

Изменено пользователем mantech

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


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

3 hours ago, sasamy said:

мне кажется самый реалистичный вариант спросить у автора порта freertos для т113 чтобы он поделился инфой - явно не из астрала структура с описанием INTC. Спрашивали у дистрибьютера allwinner, они дали всё что у них есть - архив с pdf-ми на китайском но там ничего нет интересного.

 

3 hours ago, mantech said:

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

 

Мне кажется, что это Interrupt Controller от A10.  По крайней мере большинство регистров совпадает по названиям и смещениям:

Clipboard02.thumb.jpg.023b489f7ed6b51bad63a8beca825ed7.jpg

 

Попробовал в pintc_regs->enable  записать 0x1.   Прерывание от DMA перестало работать на DSP.   Выводы очевидны: это оно.

 

 

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


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

2 часа назад, repstosw сказал:

Мне кажется, что это Interrupt Controller от A10.

Ну да, похоже. Помню, там был этот примитивный контроллер))

2 часа назад, repstosw сказал:

Прерывание от DMA перестало работать на DSP. 

GPIO не пробовали?

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


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

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

 

Изменено пользователем sasamy

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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