• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

RTL00 MP3 player

pvvx

Активный участник сообщества
Тестовая прошивка RTL00 MP3 player V004 STEREO.
GitHub - pvvx/RTL00MP3: RTL00(RTL8710AF) Test MP3
Так-же уже есть пример для Arduino Arduino для RTL8710.
Код:
# help
WLAN AT COMMAND SET:
==============================
Set MP3 server
        # ATWS=URL,PORT
        Sample: ATWS=icecast.omroep.nl/3fm-sb-mp3,80
                ATWS=meuk.spritesserver.nl/Ii.Romanzeandante.mp3,80
                ATWS=?, ATWS=close, ATWS=save, ATWS=read
Connect to an AES AP
        # ATW0=SSID
        # ATW1=PASSPHRASE
        # ATWC
DisConnect AP
        # ATWD
Если задать ATWS=x,0 и ATWS=save, то при старте (соединении с AP) не будет запускать MP3.
ATST - Mem/Task Info
Код:
#ATST

CLK CPU         200000000 Hz
RAM heap        22960 bytes
RAM free        5792 bytes
TCM heap        408 bytes
TCM ps_monitor  764 bytes
RAM Heap Memory List:
 [0]=0x0x100522ec, 0
 [1]=0x0x10003010, 1984
 [2]=0x0x10059820, 272
 [3]=0x0x1006af18, 20704
TCM Free List:
 prev 100524e0, chunk 1fff5454, size 408

CPU total run time is 105192
TaskName        DeltaRunTime    percentage
log_servi               0               <1%
tskmad          160             16%
IDLE            810             81%
Tmr Svc         0               <1%
TCP_IP          0               <1%
rtw_xmit_               0               <1%
cmd_threa               0               <1%
rtw_check               0               <1%
rtw_littl               0               <1%
tskreader               0               <1%
rtw_inter               0               <1%
rtw_recv_               10              1%
log_uart                0               <1%
rtw_TDMA_               0               <1%

[MEM] After do cmd, available heap 22960+408
ATOF - Отключить MP3
ATSD - Damp памяти/регистров с адреса...
ATWD - Записать dword по адресу

PWM(2 канала по 96Bit на sample 48 кГц) выход на GC_2 и PE_2
RTL00_MP3_SCH.gif

Запись с выхода OUT1/2 на саунд в комп fm3.wma для примерной оценки качества выхода и прямая ссылка на станцию http://icecast.omroep.nl/3fm-sb-mp3 ...
О`-да: Kak прошить в Windows c Jlink:
1) распаковать RTL00Flasher.zip в каталог JLink_Vxxx, где находится JLinkARM.dll.
2) Соединить Jlink и запустить RTL00Flasher.exe
3) Выбрать Write Flash -> Auto -> Write Flash, файл ram_all.bin...
wrflash.gif


Начало положил kissste -> GitHub - kissste/rtl8710_mp3_decoder: mp3 decoder and webradio for boards with RTL8710, RTL8711 and RTL8195 chips
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
Очень хорошо - у кого антивирус Bkav, то не скачают и не смогут собрать или использовать Borland Delphi :)
http://esp8266.ru/forum/threads/kto-dodelaet-flasher-dlja-rtl00-c-jlinkarm-dll.1639/
Остальным, больше повезет, если антивирус из этого списка:
ALYac AVG AVware Ad-Aware AegisLab AhnLab-V3 Alibaba Antiy-AVL Arcabit Avast Avira (no cloud) Baidu
BitDefender CAT-QuickHeal CMC ClamAV Comodo CrowdStrike Falcon (ML) Cyren DrWeb ESET-NOD32 Emsisoft F-Prot 20161014
F-Secure Fortinet GData Ikarus Invincea Jiangmin K7AntiVirus K7GW Kaspersky Kingsoft Malwarebytes
McAfee McAfee-GW-Edition eScan Microsoft NANO-Antivirus Panda Qihoo-360
Rising SUPERAntiSpyware Sophos Symantec Tencent TheHacker TrendMicro
TrendMicro-HouseCall VBA32 VIPRE ViRobot Yandex Zillya Zoner nProtect
 

pvvx

Активный участник сообщества
Последнее редактирование:

12345

New member
I will try ... I have some RTL8711AF modules and I don't know if it has firmware inside the flash or the condition of e-fuse. Do you know if RTL8710 and RTL8711AF IC have the same pinout? How people manage the missing SDRAM on this devices like this ones since it apear that the current sdk toolchain need SDRAM áreas? Sorry I can not speak russian!
 

kissste

Member
I will try ... I have some RTL8711AF modules and I don't know if it has firmware inside the flash or the condition of e-fuse. Do you know if RTL8710 and RTL8711AF IC have the same pinout? How people manage the missing SDRAM on this devices like this ones since it apear that the current sdk toolchain need SDRAM áreas? Sorry I can not speak russian!
RTL8711AF does not have external SPI RAM,
only RTL8711AM does.

This MP3 decoder is not using external SPI RAM. The code allocates 50K of internal RAM as a buffer.

I think, RTL8711AF will work just perfectly fine with this code.
RTL8711AM - I don't know. It might be OK too, depends on how seamlessly the chip handles the external SPI RAM, or whether it still does have in internal RAM too.
 

pvvx

Активный участник сообщества
Oversampling x2:
Код:
static char oversampling;
void set_dac_sample_rate(int rate) {
    if (rate==oldRate) return;
    oldRate=rate;
    DBG_8195A("Rate %d\n", rate);
#ifdef ALLOW_VARY_SAMPLE_BITS
    oversampling = i2sSetRate(rate, 0);
#else
    oversampling = i2sSetRate(rate, 1);
#endif
}

// Change "playerconfig.h": char i2sSetRate(int rate, int lockBitcount); (!)

char i2sSetRate(int rate, int lockBitcount) {

    int sample_rate = SR_96KHZ;
    char result = 0;

    if (rate<=48000) {
        rate <<= 1;
        result = 1;
    }
    if (rate>=88200) sample_rate = SR_88p2KHZ;
    else if (rate>=48000) sample_rate = SR_48KHZ;
    else if (rate>=44100) sample_rate = SR_44p1KHZ;
    else if (rate>=32000) sample_rate = SR_32KHZ;
    else if (rate>=24000) sample_rate = SR_24KHZ;
    else if (rate>=22050) sample_rate = SR_22p05KHZ;
    else if (rate>=16000) sample_rate = SR_16KHZ;
    else if (rate>=11020) sample_rate = SR_11p02KHZ;
    else if (rate>= 8000) sample_rate = SR_8KHZ;
    else sample_rate = SR_7p35KHZ;

    i2s_obj.sampling_rate = sample_rate;
   
    i2s_set_param(&i2s_obj, i2s_obj.channel_num, i2s_obj.sampling_rate, WL_16b);

    DBG_8195A("ReqRate %d Sample Rate %d\n", rate, sample_rate);
    return result;
}
Код:
void render_sample_block(short *short_sample_buff, int no_samples) {
    //Signed 16.16 fixed point number: the amount of samples we need to add or delete
    //in every 32-sample
    static int sampAddDel=0;
    //Remainder of sampAddDel cumulatives
    static int sampErr=0;
    int i;
    int samp;

#ifdef ADD_DEL_SAMPLES
    sampAddDel=recalcAddDelSamp(sampAddDel);
#endif

    sampErr+=sampAddDel;
    for (i=0; i < no_samples; i++) {
        static short old_smp;
        short new_smp = short_sample_buff[i];
        if(oversampling) old_smp = (old_smp + new_smp) / 2;
        else old_smp = new_smp;
#if defined(PWM_HACK)
        samp = sampToI2sPwm(old_smp);
#elif defined(DELTA_SIGMA_HACK)
        samp = sampToI2sDeltaSigma(old_smp);
#else
        samp = sampToI2s(old_smp);
#endif
        //Dependent on the amount of buffer we have too much or too little, we're going to add or remove
        //samples. This basically does error diffusion on the sample added or removed.
        if (sampErr>(1<<24)) {
            sampErr-=(1<<24);
            //...and don't output an i2s sample
        } else if (sampErr<-(1<<24)) {
            sampErr+=(1<<24);
            //..and output 2 samples instead of one.
            i2sPushSample(samp);
            i2sPushSample(samp);
        } else {
            //Just output the sample.
            i2sPushSample(samp);
        }
        if(oversampling) {
#if defined(PWM_HACK)
            samp = sampToI2sPwm(new_smp);
#elif defined(DELTA_SIGMA_HACK)
            samp = sampToI2sDeltaSigma(new_smp);
#else
            samp = sampToI2s(new_smp);
#endif
            i2sPushSample(samp);
            old_smp = new_smp;
        }
    }
}
 
Последнее редактирование:

kissste

Member
in i2s_freertos.c:
if (rate<=48000 && lockBitcount) {
#if defined(PWM_HACK) || defined(DELTA_SIGMA_HACK)
rate <<= 1;
result = 1;
[HASHTAG]#endif[/HASHTAG]
}

I2S can't be oversampled
 

pvvx

Активный участник сообщества
# ATWS=meuk.spritesserver.nl,/Ii.Romanzeandante.mp3,80
Waiting for network.
Connecting to server 136.243.91.246...
FIFO: alloc 16384 bytes at 0x10059df8
I2S: alloc DMA buf 12288 bytes (4 x 768 samples)
MAD: alloc 15546 bytes at 0x10062ee0
MAD: Decoder start.
Rate 22050
Set Sample Rate 88200 (x3)
(<-- Auto-Oversampled xN)
Ещё немного покопал проект. Частично восстановил MAD - из static обратно в malloc... Общий объем кода сократился, heap > 100к. Добавил flash_eep.c... , ... , ...
Всё там-же rtl00MP3.zip

В принципе, RTL8710 потянет и stereo на простейший I2S DAC.

Не понятно зачем вообще к ESP8266 подключали внешнюю SPIRAM?
На RTL8710 при 166MHz и Delta-Sigma выходе (самым жручим ресурс CPU) работает и с буфером FIFO в 2..4 килобайта (т.е. только для видимости что есть буфер, чтобы сильно не менять код - у самого MAD внутренний буфер больше, да у TCP socket в RTL буфер тоже не хилый :) ) и с DMA буферами 4x на 2 ms для I2S. Всё успевает без проблем.

С выключенным MP3 ("ATOF" - новая команда, будет в следующей версии...) ресурсы такие:
CLK CPU 83333333 Hz
RAM heap 95448 bytes
RAM free-stack 1532 bytes
TCM heap 2648 bytes
RAM Heap Memory List:
[0]=0x0x10050e08, 0
[1]=0x0x10002358, 5208
[2]=0x0x10059470, 360
[3]=0x0x10059990, 89880
TCM Free List:
prev 10050ff0, chunk 1fff5454, size 2648

TCM free-stack 1452 bytes
Можно переводить MP3 в overlay версию (подгружать по мере необходимости из Flash в RAM), тогда высвободится ещё сотня килобайт... В исходной версии, из ESP8266, все буфера и структуры static - нет возможности выгрузки или перезапуска. Перезапуск починил, от кривизны внесенной Espressif, но не совсем на 100% - остались ещё какие-то ошибки в MAD...
 
Последнее редактирование:

pvvx

Активный участник сообщества
Запустил два канала I2S - вышло Stereo... :eek: (прошивка в первом сообщении темы.)
----
Нашелся режим у I2S якобы 24 бита stereo, на самом деле битрейт 96000*64 - 2x 32 бита (stereo)... Частота вывода битов 6.144 MHz - в два раза выше, чем у WL_16b (2x 16 бит stereo). Можно ещё в два раза oversample....
На 48k поток MP3 (на канал) приходится 128 бит на sample. И два канала I2S для stereo - RTL тянет нормально - проверил, надо нормально вписать...

 
Последнее редактирование:

pvvx

Активный участник сообщества
Как-то это всё работает. Пора наводить порядок в проекте...
Вход звуковой карты компа соединен двумя 'проводочками' к модулю :) , кое как, gnd идет через USB и Jlink - все шумы процессора слышно... :)
Видео, чтобы сравнить скорость загрузки RTL00 "всей прошивки" с тормозом ESP8266 и скорости старта стандартного SDK с соединением к AP...
Отладкой практически не пользуюсь - быстрее исправить в коде и перезагрузить в RTL...
 
Последнее редактирование:

pvvx

Активный участник сообщества
При уточнении вышло, что I2S на RTL может выдавать максимальный channel stream 48000*96 bits (для стандартных каналов MP3 трансляции с потоком ice-audio-info: bitrate=96 stereo).
Пока прошивка в процессе переработки драйвера... Старые версии - это просто проверка и качество выхода там не рассматривалось - изучался только максимальный bitrate для PWM или других вариантов и какую нагрузку потянет CPU. Ограничение вышло в аппаратной части I2S - больше 96к на 2x24 bit не выдает, хотя CLK 96k*64. Ресурсы CPU ещё есть, свободной RAM ещё много...
-------
Драйвер переписан. Вывод - Ok.
Насчет ресурсов во время проигрывания:
Код:
# ATST
CLK CPU         166666666 Hz
RAM heap        13528 bytes
RAM free-stack  5416 bytes
TCM heap        2648 bytes
RAM Heap Memory List:
[0]=0x0x100515d0, 0
[1]=0x0x10003010, 1984
[2]=0x0x1005a078, 160
[3]=0x0x1005a1d0, 24
[4]=0x0x1006bd18, 11360
TCM Free List:
prev 100517c0, chunk 1fff5454, size 2648
TCM free-stack  1452 bytes

CPU total run time is 157406
TaskName        DeltaRunTime    percentage
log_servi       0               <1%
tskmad         340             33%
IDLE            660             65%
Tmr Svc         0               <1%
TCP_IP          10              <1%
rtw_xmit_       0               <1%
tskreader       10              <1%
rtw_inter       0               <1%
rtw_recv_       10              <1%
LOGUART_T       0               <1%
cmd_threa       0               <1%
IDLE 660 65%
 
Последнее редактирование:

dosikus

Member
pvxx, что планируется в итоге? Плеер с вебмордой?
Давно хотел такую плюшку на кухне...
 

pvvx

Активный участник сообщества
pvxx, что планируется в итоге? Плеер с вебмордой?
Давно хотел такую плюшку на кухне...
Пока ничего не планируется. Это просто изучение, что тама в RTL... Жду RTL8711AM - застряли в почте. На них и будет Web :)
 

dosikus

Member
Прошу извинить за оффтоп. А ссылкой на лот не поделитесь?

И в какой версии клипсины сделан проект ?
Упсс, в ридми все нашел... :))))
 
Последнее редактирование:

pvvx

Активный участник сообщества
Прошу извинить за оффтоп. А ссылкой на лот не поделитесь?
Я не помню.
Я сам заказами не занимаюсь. Домашние помогают... Отдал им ссылку и они оповещают о ходе операции...
Вроде эту: 2 шт. лот БЕСПЛАТНАЯ ДОСТАВКА RTL8711AM RTL8711AF Cortex M3 MCU серийный wifi модуль купить на AliExpress
Заказали вроде 16-го числа, в начале прошлой недели продавец написал, что выслал... пока трек-номер ещё сидит за границей...
Тут как повезет. Тогда-же заказали ещё всякое барахло - уже пришло в пятницу - т.е. менее недели :confused:
И в какой версии клипсины сделан проект ?
Используется ПО описанное тут UDK с Eclipse для модулей RTLxxx под Windows
В 'реадми' и кинутые исходники содержат не полный SDK, т.к. он большой для скачивания и тем более это ещё не законченная версия, а пробная и недо-оформленная. Сделана путем export проекта из Eclipse, а SDK в проект включен внешнем ресурсом с фильтром ненужного... Как он видится в Eclipse (с фильтрами) так и свален в zip. Возможны потери всяких файлов лицензий и прочего... По этому не на git, а то там вечно с этим пристают - типа: "не в том каталоге и не так лежит их любимая лицензия" :).
 
Последнее редактирование:

shaman1010

Member
Чую новый интересный проект :)
Вопрос на старте - можно ли на базе данного реалтековского железа сделать полноценный squeezebox player? На роутерном и x86-м железе его поднимают на squeezelite. Здесь его исходники на гите, для разного железа. Здесь бинарники, если нужно просто поднять squeezebox на доступном железе и проверять свою реализацию.
 

pvvx

Активный участник сообщества
Чую новый интересный проект :)
Вопрос на старте - можно ли на базе данного реалтековского железа сделать полноценный squeezebox player? На роутерном и x86-м железе его поднимают на squeezelite. Здесь его исходники на гите, для разного железа. Здесь бинарники, если нужно просто поднять squeezebox на доступном железе и проверять свою реализацию.
Не знаю что это такое, squeezebox player, и зачем он нужен? :confused:
Тут простой тест MP3 пробы. Это как-бы первый из всех проектов, обнаруженных на git-хабе. Его начал kissste, а я просто пытаюсь помочь (да заодно освоить RTL-ы) и ничего более. Весь спрос к kissste :)
Дешевые цветные дисплеи для прикручивания и цветомузыки MP3 уже пришли :) Что дальше - неизвестно... В принципе жду RTL8711AM - вдруг там есть 1.5 Мегабайта RAM - обзоров пока нет, а PDF-ы на RTL8711AM везде прошлогодние и даже не альфа версии, в которых и половины, что есть в чипе не описано... :)
Пока можно только зарегистрировать факт, что RTL8710AF во много раз лучше ESP8266, а цена на али на них сравнялась.
Тут как раз зашевелился продавец ESP32 и написал, что выслал (если опять не обманывает). Если в RTL8711AM всё OK с 1.5 мега памятью, то ESP32 уже не конкурент, т.к. на RTL87xxAM уже есть и фирменная Arduino под управлением RTOS... Скоро сравню.
 
Последнее редактирование:
Сверху Снизу