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

IOports и pinmap RTL8710AF

pvvx

Активный участник сообщества
Где взять полный список какие есть порты и какая периферия на них выводится?
То, что есть, является не полным.
Пример для RTL871xAF:
PinsMap8710.gif
PinFunctionRTL871xAF.gif
Но в нем нет даже UART1 b т.д.

Если брать pinmap от RTL8195AM, то те-же недочеты:
PinFunctionTable.gif
PinFunctionRTL8195AM.gif
Аналогично и у RTL8711AM:
PinFunctionRTL8711AM.gif
Есть такая табличка в области данных ROM, с именем uint16_t GPIOState[>12]. В ней каждый uint16 отведен под пины портов: A,B,C,D,E,F,G,H,...K... В каждом uint16 16 бит указывающих занятость пина данного порта периферией. После старта в ней, в порту F указана занятость кем-то (значение 0x3F) PF_0...PF_5. Кто это? :confused: Порт QSPI Flash?
----
Оказалось, что да:
GPIOCtrl(5, 0x3F, a2); - HalSPIFlashPinCtrlRtl8195A()

SPI2Pin - порт D, или E, или G
SDRPin - порт G,H,I,J,K :eek:
 
Последнее редактирование:

pvvx

Активный участник сообщества
Настучал полный PinMap для RTL:
RTL_PinMap.gif
Такой маленький :)
Указанные номера конфигурации задаются при обращении к HalPinCtrlRtl8195A(Название_устройства, номер_конфигурации, On/Off).
Всё оборудование работает и на RTL00 (RTL8710AF), но не все выводы выведены с кристалла на ножки корпуса чипа....:(
Переключения по раздельности для каждого устройства:
Код:
extern _LONG_CALL_ int HalUart0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalUart1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalUart2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPI0MCSPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2C3PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2S0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalI2S1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPCM0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPCM1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSDIODPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSDIOHPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalMIIPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLLEDPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLANT0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLANT1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLBTCOEXPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalWLBTCMDPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalNFCPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalPWM3PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE0PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE1PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE2PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalETE3PinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalEGTIMPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSPIFlashPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSDRPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalJTAGPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalTRACEPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalLOGUartPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalLOGUartIRPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalSICPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalEEPROMPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
extern _LONG_CALL_ int HalDEBUGPinCtrlRtl8195A(IN u32  PinLocation, IN BOOL   Operation);
 

Вложения

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

pvvx

Активный участник сообщества
kissste - что там с I2S? GitHub - kissste/rtl8710_mp3_decoder: mp3 decoder and webradio for boards with RTL8710, RTL8711 and RTL8195 chips
Код:
===== Enter Image 1.5 ====
Img2 Sign: RTKWin, InfaStart @ 0x10006069
===== Enter Image 2 ====

Hardware initialized. Waiting for network.
interface 1 is initialized
interface 0 is initialized
Initializing WIFI ...
WIFI initialized
tskconnect(389), Available heap 32128
RTL8195A[Driver]: set ssid [ssid]
RTL8195A[Driver]: start auth to bc:ae:c5:eb:09:90
RTL8195A[Driver]: auth success, start assoc
RTL8195A[Driver]: association success(res=2)
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:4(WEP40-1 WEP104-5 TKIP-2 AES-4) keyid:1
Connected after 3268ms.
Interface 0 IP address : 192.168.1.122
Got IP after 3792ms.
Connecting to server 145.58.52.149...
Reading into SPI RAM FIFO...
I2S Init
Buffer fill 5790, DMA underrun ct 0, buff underrun ct 0
На этом останавливается и всё. :( I2S там работает?
Пришлось немного поменять старт WiFi - иначе вообще не запускался...
----
Добавлено через время: С I2S всё решилось - тема тут: RTL00 MP3 player
 
Последнее редактирование:

pvvx

Активный участник сообщества
и АЦП не выведен, я правильно понимаю?
Ни DAC, ни ADC выводы не выведены на RTL8710AF, но оборудование присутствует. К ним не выведены и пины фильтров аналогового питания, по этому ADC (и DAC) использовать для чтения пустого вывода (к примеру для random) не особо выходит.
 
Последнее редактирование:

sharikov

Active member
Есть ли возможность откусить часть пинов от другой перифирии на gpio ?
Например порт E занят jtag но при работе по swd остаются свободные пины и хотелось бы их задействовать как gpio. Или выход CS порта spi переключить в режим gpio оставив только sclk, mosi, miso (выбор слейва программный).
 

pvvx

Активный участник сообщества
Есть ли возможность откусить часть пинов от другой перифирии на gpio ?
Например порт E занят jtag но при работе по swd остаются свободные пины и хотелось бы их задействовать как gpio. Или выход CS порта spi переключить в режим gpio оставив только sclk, mosi, miso (выбор слейва программный).
Сильно не копал, но если, к примеру в проекте RTL00 MP3 player включается I2S с включенным JTAG, то пишет warning и при этом I2S выход с SWD работает. На всякий случай я отключаю JTAG на время работы I2S... Приоритетность пока неизвестна.
В либах SDK3.5 hal_pinmux.c сделана с проверкой на RTL8710 и обращается к efuse и не позволяет включать всё оборудование, даже выведенное на выходы. В моей версии это исправлено. Переключается в стандарт [inline]#define RTL8710_DEF_PIN_ON 1[/inline]
Разрешение для работы другой периферии задается через efuse. В оф.SDK многое отключено, чтобы покупали более дорогой чип.
 
Последнее редактирование:

sharikov

Active member
HalPinCtrlRtl8195A() манипулирует не только битами в регистрах XXX_MUX_CTRL но и битом в
GPIO_SHTDN_CTRL. 1 когда включена и 0 когда отключена.
Когда в GPIO_SHTDN_CTRL в бите нолик соответствующий вывод чипа переходит в Z состояние. При написании программы / схемы это надо учитывать и переинициализировать gpio иначе получим плавающий уровень на выводе.
gpio_init тоже ставит соответствующий бит GPIO_SHTDN_CTRL
Без переинициализации переключать функциональность между i/o модулем и gpio функциией HalPinCtrlRtl8195A( , , 0) не получится потому что она отключит этот вывод.
"на лету" можно переключать манипуляцией битом xxxx_PIN_SEL в регистрах xxxx__MUX_CTRL: 0 - gpio, 1 - интерфейсный модуль. Проверил только вывод, что будет если направления разные непонятно.

Еще: в регистрах mux_ctrl поле mux трехбитовое а в таблице описаны только 2 бита.
 

pvvx

Активный участник сообщества
Еще: в регистрах mux_ctrl поле mux трехбитовое а в таблице описаны только 2 бита.
Что было описано в HalPinCtrl ROM-BIOS (дизасм), то и набил в таблицу. Наверняка есть другие варианты, если лезть в сами регистры, минуя Hal
 

sharikov

Active member
Найти способ переключить неиспользуемые каким либо аппаратным интерфейсом пины в режим gpio не получается.
Немного о приоритетности pin mux: попытался одновременно включить 2 mux на один и тот же порт PC, вот что получилсь:
[inline]PC0-3: UART0(mux0) и SPI0(mux1) - приоритет uart независимо от последовательности включения[/inline]
[inline]PC0 : SPI0(mux1) и PWM0(mux1) - приоритет spi0 независимо от последовательности включения[/inline]
Через jtag манипулировал битами в регистрах UART_MUX_CTL, SPI_MUX_CTL, PWM_PINMUX_CTL (HAL проверяет и не даст включить разные mux на один и тот же порт).
gpio включается когда все pin mux отключены.
 

pvvx

Активный участник сообщества
Найти способ переключить неиспользуемые каким либо аппаратным интерфейсом пины в режим gpio не получается.
Ну и ладно. И так пинов хватает. Если мало - берите какой другой чип... Важнее интерфейсы, а не голые I/O.
 

pvvx

Активный участник сообщества
на 8710 с отладкой не хватает.
другой чип в 2-4 раза дороже да и везут их похоже на верблюдах.
Зачем вам нужен вечно включенный Jtag? Я его использую только для заливки. Так быстрее отлаживать. Копаться в битах любите? :) Какая отладка в реал-тайм системе с прерываниями?

Значит вам вопрос - что это меняет(?):
*((volatile unsigned int *)0x40000020) = (*((volatile unsigned int *)0x40000020) & 0xFF0FFFFF) | 0x900000;
В хидере rtl8195a_sys_on.h это BIT_SYS_EEROM_LDO_PAR_07_04()
Без данной замены BIT_SYS_EEROM_LDO_PAR_07_04(6) на BIT_SYS_EEROM_LDO_PAR_07_04(9) не пашет SDIOH.
Что оно меняет - мне неизвестно, но путем мытарств и без JTag надыбал, что так работает и в коде SDK этого нет... Ток какой-то на шину или шо?
Т.е. тыкать Jtag-ом в чип, который имеет ресурсы распечатать всё что вам затребуется с описыванием в коде не вижу смысла. Вписать проверку с необходимым дампом и прочим быстрее, чем трассировать...
 
Последнее редактирование:
Сверху Снизу