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

Arduino для RTL8710.

mikush

New member
pvvx спасибо Вам большое за проделанную работу.
Начал играться с rtl00. собрал пример плеера да прошил из RTL00Flasher.exe, теперь не могу подключится к модулю ни через ардуино ни через RTL00Flasher. сам модуль грузится по уарту, данные выдает. кое как удается запустить RTL00Flasher если попасть в момент подачи питания на модуль, если пожже то все не соеденяет.
upd
удалось прошить исходной прошивкой, Похоже у меня что то с питанием, если запитывать с стлинка- все норм, если только общая земля траблы
 
Последнее редактирование:

dev_n

New member
@pvvx Может подскажете почему не освобождается память(или очень медленно освобождается).
Вроде все закрываю.

Код:
#include <WiFi.h>
#include <myAP.h>
#define webHTTP_OK  "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\n"
extern "C" {
#include "lwip/api.h"
}

void setup() {
  Serial.begin(38400);
  WiFi.begin(ssid,pass);
  os_thread_create(web_thread, NULL, OS_PRIORITY_REALTIME, 2048);
}

void loop() {
   //sys_info();
   delay(10000);   
}

void web_thread(const void *argument) {
    int ret = ERR_OK;
    int k=0;
    struct netconn *pxNewConnection;
    struct netconn *pxHTTPListener = NULL;
    struct netbuf  *pxRxBuffer = NULL;
    unsigned portSHORT usLength;
    int ret_recv = ERR_OK;
    void *data; 
    char str[11];
    pxHTTPListener = netconn_new( NETCONN_TCP );
    //ip_set_option(pxHTTPListener->pcb.ip, SOF_REUSEADDR);
    netconn_bind( pxHTTPListener, NULL, 80 );
    netconn_listen( pxHTTPListener );   
  for( ;; ){
    port_netconn_accept( pxHTTPListener , pxNewConnection, ret);
    if( pxNewConnection != NULL && ret == ERR_OK){
      port_netconn_recv( pxNewConnection , pxRxBuffer, ret_recv);
      if( pxRxBuffer != NULL && ret_recv == ERR_OK)
      {
        netbuf_data( pxRxBuffer, &data, &usLength );
        k++; 
        sprintf(str, "%d", k); 
        netconn_write( pxNewConnection, webHTTP_OK, ( u16_t ) strlen( webHTTP_OK ), NETCONN_COPY );
        netconn_write( pxNewConnection, str, strlen(str), NETCONN_COPY );
      }
      netbuf_delete(pxRxBuffer);
      netconn_close( pxNewConnection );
      while( netconn_delete( pxNewConnection ) != ERR_OK )
       {
         vTaskDelay( 10 );
       }
     }
     printf("\r\n%d,RAM heap\t%d bytes\r\n",k,xPortGetFreeHeapSize());
  }
    if(pxHTTPListener)
    {
        netconn_close(pxHTTPListener);
        netconn_delete(pxHTTPListener);
        pxHTTPListener = NULL;
    } 
  os_thread_terminate( os_thread_get_id() );
}

RTL8195A[Driver]: start auth to c0:4a:00:f6:63:f4
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=3)
RTL8195A[Driver]: set pairwise key to hw: alg:4(WEP40-1 WEP104-5 TKIP-2 AES-4)
RTL8195A[Driver]: set group key to hw: alg:2(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
Interface 0 IP address : 192.168.6.117
1,RAM heap 151024 bytes
2,RAM heap 150360 bytes
3,RAM heap 150072 bytes
4,RAM heap 150008 bytes
4,RAM heap 151936 bytes
5,RAM heap 149360 bytes
6,RAM heap 149664 bytes
7,RAM heap 149008 bytes
8,RAM heap 149304 bytes
9,RAM heap 148656 bytes
10,RAM heap 148952 bytes
11,RAM heap 148312 bytes
12,RAM heap 148608 bytes
 

pvvx

Активный участник сообщества
@pvvx Может подскажете почему не освобождается память(или очень медленно освобождается).
Вроде все закрываю.
Наберите в поиске сайта TIME_WAIT.
Код:
/* Get one byte from the 4-byte address */
#define ip4_addr1(ipaddr) (((u8_t*)(ipaddr))[0])
#define ip4_addr2(ipaddr) (((u8_t*)(ipaddr))[1])
#define ip4_addr3(ipaddr) (((u8_t*)(ipaddr))[2])
#define ip4_addr4(ipaddr) (((u8_t*)(ipaddr))[3])
/* These are cast to u16_t, with the intent that they are often arguments
 * to printf using the U16_F format from cc.h. */
#define ip4_addr1_16(ipaddr) ((u16_t)ip4_addr1(ipaddr))
#define ip4_addr2_16(ipaddr) ((u16_t)ip4_addr2(ipaddr))
#define ip4_addr3_16(ipaddr) ((u16_t)ip4_addr3(ipaddr))
#define ip4_addr4_16(ipaddr) ((u16_t)ip4_addr4(ipaddr))

#define IP2STR(ipaddr) ip4_addr1_16(ipaddr), \
    ip4_addr2_16(ipaddr), \
    ip4_addr3_16(ipaddr), \
    ip4_addr4_16(ipaddr)

#define IPSTR "%d.%d.%d.%d"

extern const char * const tcp_state_str[];
/*
static const char * const tcp_state_str[] = {
  "CLOSED",
  "LISTEN",
  "SYN_SENT",
  "SYN_RCVD",
  "ESTABLISHED",
  "FIN_WAIT_1",
  "FIN_WAIT_2",
  "CLOSE_WAIT",
  "CLOSING",
  "LAST_ACK",
  "TIME_WAIT"
};
*/
/******************************************************************************
 * FunctionName : debug
 * Parameters   :
 * Returns      :
*******************************************************************************/
void print_udp_pcb(void)
{
  struct udp_pcb *pcb;
  bool prt_none = true;
  rtl_printf("UDP pcbs:\n");
  for(pcb = udp_pcbs; pcb != NULL; pcb = pcb->next) {
     rtl_printf("flg:%02x\t" IPSTR ":%d\t" IPSTR ":%d\trecv:%p\n", pcb->flags, IP2STR(&pcb->local_ip), pcb->local_port, IP2STR(&pcb->remote_ip), pcb->remote_port, pcb->recv );
     prt_none = false;
  }
  if(prt_none) rtl_printf("none\n");
}
/******************************************************************************
 * FunctionName : debug
 * Parameters   :
 * Returns      :
*******************************************************************************/
void print_tcp_pcb(void)
{
  struct tcp_pcb *pcb;
  rtl_printf("Active PCB states:\n");
  bool prt_none = true;
  for(pcb = tcp_active_pcbs; pcb != NULL; pcb = pcb->next) {
     rtl_printf("Port %d|%d\tflg:%02x\ttmr:%p\t%s\n", pcb->local_port, pcb->remote_port, pcb->flags, pcb->tmr, tcp_state_str[pcb->state]);
     prt_none = false;
  }
  if(prt_none) rtl_printf("none\n");
  rtl_printf("Listen PCB states:\n");
  prt_none = true;
  for(pcb = (struct tcp_pcb *)tcp_listen_pcbs.pcbs; pcb != NULL; pcb = pcb->next) {
    rtl_printf("Port %d|%d\tflg:%02x\ttmr:%p\t%s\n", pcb->local_port, pcb->remote_port, pcb->flags, pcb->tmr, tcp_state_str[pcb->state]);
    prt_none = false;
  }
  if(prt_none) rtl_printf("none\n");
  rtl_printf("TIME-WAIT PCB states:\n");
  prt_none = true;
  for(pcb = tcp_tw_pcbs; pcb != NULL; pcb = pcb->next) {
    rtl_printf("Port %d|%d\tflg:%02x\ttmr:%p\t%s\n", pcb->local_port, pcb->remote_port, pcb->flags, pcb->tmr, tcp_state_str[pcb->state]);
    prt_none = false;
  }
  if(prt_none) rtl_printf("none\n");
}

void fATLW(void *arg)     // Info Lwip
{
#if    DEBUG_AT_USER_LEVEL > 1
    printf("ATLW: Lwip pcb Info\n");
#endif
    print_udp_pcb();
    print_tcp_pcb();
}
 
Последнее редактирование:

pvvx

Активный участник сообщества
Начал играться с rtl00. собрал пример плеера да прошил из RTL00Flasher.exe, теперь не могу подключится к модулю ни через ардуино ни через RTL00Flasher. сам модуль грузится по уарту, данные выдает. кое как удается запустить RTL00Flasher если попасть в момент подачи питания на модуль, если пожже то все не соеденяет.
upd
удалось прошить исходной прошивкой, Похоже у меня что то с питанием, если запитывать с стлинка- все норм, если только общая земля траблы
Подключите полный Jtag с соединением на reset модуля.
Ноги Jtag на модуле включаются/выключаются программно. Для частой откладки и работы с Jtag предпочтительнее иметь полное соединение с reset. Тогда программное включение/отключение Jtag вас не будет беспокоить.
 

mikush

New member
Подключите полный Jtag с соединением на reset модуля.
Ноги Jtag на модуле включаются/выключаются программно. Для частой откладки и работы с Jtag предпочтительнее иметь полное соединение с reset. Тогда программное включение/отключение Jtag вас не будет беспокоить.
reset это CHIP-EN на vcc запаян уже ) B&T могли бы и обозвать его reset ,
как софтово включить Jtag, что бы после выгрузки из ардуино он был активен?
 
Последнее редактирование:

pvvx

Активный участник сообщества
reset это CHIP-EN на vcc запаян уже ) B&T могли бы и обозвать его reset ,
как софтово включить Jtag, что бы после выгрузки из ардуино он был активен?
По умолчанию он включен (включается в ROM-BIOS при старте). Исключение составляет случай, если вы записали отключение Jtag в eFuse. Тогда ROM-BIOS его не включит.
HalPinCtrlRtl8195A(JTAG, 0, 1)
 

mikush

New member
пойду ка я учится на курсы швеи, что то с микроконтролерами не выходит,
простой пример
Код:
void setup() {   
    Serial.begin(38400);
    pinMode(14, OUTPUT);
    digitalWrite(14, 0);     
}
void loop() {
    printf("set to 0");
    digitalWrite(14, 0);
    delay(10);
}
на выходе ge_0 3v3 :mad:, пробовал уже через gpio_init gpio_dir gpio_mode из sdk, тоже самое.
сжег порты? хотя уарт и жтак работает
 

pvvx

Активный участник сообщества
что то с микроконтролерами не выходит,
простой пример
---
на выходе ge_0 3v3 :mad:, пробовал уже через gpio_init gpio_dir gpio_mode из sdk, тоже самое.
сжег порты? хотя уарт и жтак работает
Это вход JTAG. Отключите HalPinCtrlRtl8195A(JTAG, 0, 0).

Код:
extern u16 GPIOState[_PORT_MAX-1]; // побитно 16 бит для каждого порта (A..K), бит=номер задействованного пина в порту на периферию.
    for (i = 0; i < _PORT_MAX; i++)
        printf("Port %c state: 0x%04x\n", i + 'A', GPIOState[i]);
* Не учитывает включенный console - LOG_UART, т.к. баг - включен в ROM-BIOS при старте, а таблица не проинформирована, точнее стерта кривым загрузчиком...
( Отключение HalPinCtrlRtl8195A(LOG_UART, 0, 0))

Если бит в таблице выставлен, то Hal будет орать варнингами при включении пина в режим I/O... При переключении на периферию Hal занятые ноги отмечает (функции в ROM-BIOS). Включите в SDK вывод отладки - он вам напишет "Конфликт! Конфликт! Занято!", но порт переключит, а сам вывод оставит включенным к периферии. Когда отключите занятое - будет ваше значение с аппаратного драйвера I/O на этом I/O....
В Arduino информационные сообщения отключены при компиляции библиотек. Они жрут десятки кило...
пойду ка я учится на курсы швеи,
Машина уже умнее вас? ;)
 
Последнее редактирование:

mikush

New member
extern "C" void HalPinCtrlRtl8195A(int, int, int); и заработал 14 пин,
спасибо
c PA_2 еще не могу разобраться, такая же ситуация 3.3 в и все, в GPIOState А все 0
upd
HalPinCtrlRtl8195A(UART2, 0, 0); решил проблему,
 
Последнее редактирование:

pvvx

Активный участник сообщества
c PA_2 еще не могу разобраться, такая же ситуация 3.3 в и все, в GPIOState А все 0
upd
HalPinCtrlRtl8195A(UART2, 0, 0); решил проблему,
С чего у вас при старте включен UART2? Прописан другой загрузчик в модуле?
Модуль от PINE или B&T?
Или причина в этом:
reset это CHIP-EN на vcc запаян уже
и после отработки другого скетча внутренности чипа не сбрасываются...
 
Последнее редактирование:

mikush

New member
С чего у вас при старте включен UART2? Прописан другой загрузчик в модуле?
прошит V02_V16_05_10.zip из Прошивка с которой пришел модуль RTL00 V1.0
Модуль от B&T
сейчас из студии выгружаю свой скетч в RAM предварительно передернув питание, так как в моем скетче JTAG отключен
 

pvvx

Активный участник сообщества
прошит V02_V16_05_10.zip из Прошивка с которой пришел модуль RTL00 V1.0
Модуль от B&T
сейчас из студии выгружаю свой скетч в RAM предварительно передернув питание, так как в моем скетче JTAG отключен
Значит нет Reset. В прошивке AT включается UART2, а при загрузке в RAM стартовый код от Ameba заполняет таблицу GPIOState нулями...
 

mikush

New member
pvvx
подскажите пожалуйста, как подружить два Ваших проекта. Arduino MP3 player. Либу ардуиновскую использовать не могу, так как хочу использовать i2s dac ALC5628. да и порты второго i2s заняты. вроде все поменял для вызова MP3 player . компилю MP3 player с помощью ардуино
в итоге
Код:
CLK CPU        166666666 Hz
RAM heap    43720 bytes
TCM heap    27928 bytes
MP3: Connec[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
t url: icecast.o[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
mr[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
oep.nl/3fm-sb-mp[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
3:80
FIFO: Allo[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x80
[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
c 1[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
6384 bytes at 0x[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
10[TIMR Inf]HalTimerIrq2To7Handle_Patch:TimerIrqStatus: 0x4
065af8
MP3: Connecting to server 145.58.53.150...
HTTP/1.0 200 OK
Server: Icecast 2.4.2
Date: Fri, 06 Jan 2017 03:44:07 GMT
Content-Type: audio/mpeg
Cache-Control: no-cache
Expires: Mon, 26 Jul 1997 05:00:00 GMT
Pragma: no-cache
icy-br:96
ice-audio-info: bitrate=96
icy-br:96
icy-genre:Pop
icy-name:3FM Serious Radio
icy-pub:0
icy-url:http://www.3fm.nl
MP3: Skip HTTP head in 319 bytes

FIFO: Start Buffer fill 8284
I2S0: Alloc DMA buf 12288 bytes (4 x 384 samples 96 bits)
HEAP: Alloc 15560 failed!
MAD: Alloc 15546 bytes at 0x1fff3050
MAD: Decoder start.
MAD: Frame decode.
MAD: Frame error.
MAD: Dec err 0x0101 (lost synchronization)
MAD: Frame decode.
HEAP: Alloc 2576 failed!
HEAP: Alloc 4616 failed!
MAD: Frame error.
MAD: Dec err 0x0235 (bad main_data_begin pointer)
MAD: Frame decode.
MAD: Frame error.
MAD: Dec err 0x0235 (bad main_data_begin pointer)
MAD: Frame decode.
MAD: Frame synth.
MAD: Rate 48000, channels 2
I2S: Set Sample Rate 96000 (x1)
MAD: Frame decode.
MAD: Frame synth.
MAD: Frame decode.
MAD: Frame synth.
MAD: FramHEAe??P(?????(??hMAD: Frame synth.
MAD: Frame decode.
MAD: Frame synth.
...............
MAD: Frame decode.
MAD: Frame synth.
HEAPMAD: Frame decode.
MARTL8195A[HAL]: Hard Fault Error!!!!
RTL8195A[HAL]: R0 = 0x0
RTL8195A[HAL]: R1 = 0x40003014
RTL8195A[HAL]: R2 = 0x20
RTL8195A[HAL]: R3 = 0x40003000
RTL8195A[HAL]: R12 = 0x9
RTL8195A[HAL]: LR = 0x10032d9b
RTL8195A[HAL]: PC = 0x10032d94
RTL8195A[HAL]: PSR = 0x0
RTL8195A[HAL]: BFAR = 0xb
RTL8195A[HAL]: CFSR = 0x8200
RTL8195A[HAL]: HFSR = 0x40000000
RTL8195A[HAL]: DFSR = 0x0
RTL8195A[HAL]: AFSR = 0x0
RTL8195A[HAL]: PriMask 0x0
RTL8195A[HAL]: BasePri 0x0
RTL8195A[HAL]: SVC priority: 0x00
RTL8195A[HAL]: PendSVC priority: 0xf0
RTL8195A[HAL]: Systick priority: 0xf0

 

pvvx

Активный участник сообщества
подскажите пожалуйста, как подружить два Ваших проекта. Arduino MP3 player. Либу ардуиновскую использовать не могу, так как хочу использовать i2s dac ALC5628. да и порты второго i2s заняты. вроде все поменял для вызова MP3 player . компилю MP3 player с помощью ардуино
в итоге
Проект MP3 есть же отдельный - GitHub - pvvx/RTL00MP3: RTL00(RTL8710AF) Test MP3
В нем пока находится и как-бы базовый-расширенный SDK (на сегодня самый полный по исходникам для серии RTL871x). Т.е. он уже не официальный от Realtek, хотя название осталось от начальной версии :)
Ошибки в кодеке не исправлял. У вас он и вываливается.
 
Последнее редактирование:

pvvx

Активный участник сообщества
да, нужно было изначально писать без ардуиновких улучшалок, привык к студии. сейчас хороший кусок завязан на ардуино
Он создавался для помощи kissste. Т.е. он не полноценный, а для теста. Там надо дописывать установки битрейта и варианты вывода. Кроме I2S на чипе есть и другие возможности - аппаратный PCM контроллер...
 
Сверху Снизу