• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

SDIO клиент

t275

New member
Так получилось, что надо связать ESP8266EX или RTL8710 как SDIO клиенты с host контроллером. В SDK 2.00 на ESP8266 есть пример at_sdio для модуля esp-wroom-s2. Имеется ли у кого информация помимо esp-wroom_s2_hardware_evaluation_platform_en.pdf и esp-wroom-s2_datasheet_en.pdf примера реализации загрузчика на host sdio и старта программы с HSPI интерфейса? Загрузчик boot 1.6.bin сделал на подобии linux драйвера для ESP8089, но после загрузки при старте на usart выдает ''error magic" с ресетом по wdt. Сам fw был предварительно загружен при помощи HSPIDownload.

И насколько я понял в SDK RTL8710 hal_sdio пока не реализован?
 
Последнее редактирование:

t275

New member
После загрузки fw при установке SPI Mode : DIO получил следующее:

ets Jan 8 2013,rst cause:2, boot mode:(5,0)
waiting for host

2nd boot version : 1.6
SPI Speed : 40MHz
SPI Mode : DIO
SPI Flash Size & Map: 32Mbit(512KB+512KB)
no GPIO select!
jump to run user2 @ 81000

error magic!
backup boot failed.

user code done
 

pvvx

Активный участник сообщества
И насколько я понял в SDK RTL8710 hal_sdio пока не реализован?
Он реализован полностью, но нет открытого кода.
Подключение SD карты работает через него и большей частью аппаратно. Реализовано в Arduino Ameba.
Библиотека lib_sdcard.a включает в себя hal_sdio_host.o rtl8195a_sdio_host.o.
Заголовки процедур к Hal SDIO
Код:
// Function declarations hal_sdio_host.o
signed int  HalSdioHostInit(void *Data, int a2);
int  HalSdioHostEnable(void *Data, int a2);
int  HalSdioHostDeInit(void *Data, int a2);
int  HalSdioHostDisable(void *Data, int a2);
void  HalSdioHostOpInit(void *Data);
// Function declarations rtl8195a_sdio_host.o
signed int  SdioHostIsTimeout(uint32_t StartCount, uint32_t TimeoutCnt);
void  SdioHostSendCmd(SDIO_HOST_CMD *Cmd);
signed int  SdioHostGetResponse(void *Data, int RspType);
void  SdioHostSdBusPwrCtrl(uint8_t En, int a2);
int  SdioHostSdClkCtrl(void *Data, int En, int Divisor);
int  SdioHostChkDataLineActive(uint32_t Timeout);
int  SdioHostChkCmdInhibitCMD(uint32_t Timeout);
int  SdioHostChkCmdInhibitDAT(uint32_t Timeout);
uint32_t  SdioHostIsrHandle(void *Data);
int  HalSdioHostDeInitRtl8195a(void *Data);
int  HalSdioHostEnableRtl8195a(void *Data);
int  HalSdioHostDisableRtl8195a(void *Data);
signed int  HalSdioHostIrqInitRtl8195a(void *Data);
signed int  HalSdioHostInitHostRtl8195a(void *Data);
int  HalSdioHostStopTransferRtl8195a(void *Data, uint32_t a2);
signed int  SdioHostErrIntRecovery(void *Data, int a2, signed int a3);
signed int  SdioHostChkXferComplete(void *Data, uint32_t Timeout, signed int a3);
signed int  SdioHostChkCmdComplete(void *Data, uint32_t Timeout);
int  SdioHostCardSelection(void *Data, int Select, int a3);
int  SdioHostGetCSD(void *Data, uint32_t a2);
int  HalSdioHostReadBlocksDmaRtl8195a(int result, uint32_t a2, signed __int64 a3, uint32_t BlockCnta);
int  HalSdioHostWriteBlocksDmaRtl8195a(int result, uint32_t a2, signed __int64 a3, uint32_t BlockCnta);
int  SdioHostSwitchFunction(void *Data, int Mode, int Fn2Sel, int Fn1Sel, uint8_t *StatusBuf);
int  HalSdioHostGetCardStatusRtl8195a(void *Data, uint32_t a2, int a3);
signed int  HalSdioHostInitCardRtl8195a(void *Data, int a2, int a3);
int  HalSdioHostGetSdStatusRtl8195a(void *Data, uint32_t a2, int a3);
signed int  HalSdioHostChangeSdClockRtl8195a(void *Data, int Frequency);
int  HalSdioHostEraseRtl8195a(uint64_t EndAddr, signed __int64 a2, signed __int64 EndAddra);
signed int  HalSdioHostGetWriteProtectRtl8195a(void *Data, uint32_t a2, int a3);
int  HalSdioHostSetWriteProtectRtl8195a(void *Data, int Setting);

struct _HAL_SDIO_HOST_ADAPTER_
{
  IRQ_HANDLE IrqHandle;
  ADMA2_DESC_FMT *AdmaDescTbl;
  uint32_t Response[4];
  uint32_t CardOCR;
  uint32_t CardStatus;
  uint32_t IsWriteProtect;
  uint8_t SdStatus[64];
  uint8_t Csd[16];
  volatile uint8_t CmdCompleteFlg;
  volatile uint8_t XferCompleteFlg;
  volatile uint8_t ErrIntFlg;
  volatile uint8_t CardCurState;
  uint8_t IsSdhc;
  uint8_t CurrSdClk;
  uint16_t RCA;
  uint16_t SdSpecVer;
  void (*CardInsertCallBack)(void *);
  void (*CardRemoveCallBack)(void *);
  void *CardInsertCbPara;
  void *CardRemoveCbPara;
};
enum _HAL_Status : __int32
{
  HAL_OK = 0x0,
  HAL_BUSY = 0x1,
  HAL_TIMEOUT = 0x2,
  HAL_ERR_PARA = 0x3,
  HAL_ERR_MEM = 0x4,
  HAL_ERR_HW = 0x5,
  HAL_ERR_UNKNOWN = 0xEE,
};
typedef _HAL_Status HAL_Status;

struct _HAL_SDIO_HOST_OP_
{
  HAL_Status (*HalSdioHostInitHost)(void *);
  HAL_Status (*HalSdioHostInitCard)(void *);
  HAL_Status (*HalSdioHostDeInit)(void *);
  HAL_Status (*HalSdioHostRegIrq)(void *);
  HAL_Status (*HalSdioHostReadBlocksDma)(void *, uint64_t, uint32_t);
  HAL_Status (*HalSdioHostWriteBlocksDma)(void *, uint64_t, uint32_t);
  HAL_Status (*HalSdioHostStopTransfer)(void *);
  HAL_Status (*HalSdioHostGetCardStatus)(void *);
  HAL_Status (*HalSdioHostGetSdStatus)(void *);
  HAL_Status (*HalSdioHostChangeSdClock)(void *, uint8_t);
  HAL_Status (*HalSdioHostErase)(void *, uint64_t, uint64_t);
  HAL_Status (*HalSdioHostGetWriteProtect)(void *);
  HAL_Status (*HalSdioHostSetWriteProtect)(void *, uint8_t);
};
typedef _HAL_SDIO_HOST_ADAPTER_ *PHAL_SDIO_HOST_ADAPTER;
И т.д., т.к. думаю что даже полное перечисление всех структур и типов вам не поможет, без наличия отлаженных примеров использования.
 
Последнее редактирование:

t275

New member
Это видел, но RTL8710 нужен как SDIO device, в примере void spdio_init(struct spdio_t *obj) есть функции

Код:
    HalSdioInit();
    HalSdioRegisterTxCallback(spdio_rx_done_cb, (void *)obj);
    HalSdioRegisterRxDoneCallback(spdio_tx_done_cb, (void *)obj);
Но реализации не нашел.
Так же в app_start.c

Код:
// Init SDIO
#if defined(CONFIG_SDIO_DEVICE_EN) && defined(CONFIG_SDIO_DEVICE_NORMAL)
    HalSdioInit();
#endif
 

pvvx

Активный участник сообщества
Это видел, но RTL8710 нужен как SDIO device, в примере void spdio_init(struct spdio_t *obj) есть функции
Загрузите obj из *.a в IDA, выберете "Produce file"->"Create C file"/"Create C-header file" и получите "ознакомительные" исходники :)
 

t275

New member
ESP8266EX в итоге запустилась сегодня как sdio device в 4-битном режиме с flash на HSPI, теперь можно свой fw заливать.
 

pvvx

Активный участник сообщества
ESP8266EX в итоге запустилась сегодня как sdio device в 4-битном режиме с flash на HSPI, теперь можно свой fw заливать.
Для RTL с SDIO host пока открыт только уровень API: RTL00MP3/spdio_api.c at master · pvvx/RTL00MP3 · GitHub
SDIO-host - это отдельный аппаратный блок в RTL871x.
Для SDIO-device по аналогии c ESP8266 есть полный Hal (hal_sdio.h, rtl8195a_sdio_device.c, ... ) Это другой аппаратный блок.
Проблема с кол-вом выводов у имеющихся чипов. Одновременно не выходит использовать SDIOD и SDIOH устройства (см. таблицу)
 
Последнее редактирование:

pvvx

Активный участник сообщества
На SDIOH устройстве не хватает выводов на RTL8710. В частности вывода прерывания по смене носителя и надо переписывать HAL. Доп.там регулируется напряжение сигналов 1..3.3В для разных классов SD... Наверно по этому ещё не дали исходники HAL к нему.
 

t275

New member
Вообще-то мне нужен от RTL sdio-device для подключения к imx28, там ножек как раз меньше и всего sd шина используется. Вчера пробовал с ESP, boot_v1.6.bin грузится по SDIO, прошивка стартует с HSPI flash, но при этом в imx28 наглухо виснет sdio-host. Никак не могу найти примера на STM32, который упоминается у espressif.
 

pvvx

Активный участник сообщества
Вообще-то мне нужен от RTL sdio-device для подключения к imx28, там ножек как раз меньше и всего sd шина используется. Вчера пробовал с ESP, boot_v1.6.bin грузится по SDIO, прошивка стартует с HSPI flash, но при этом в imx28 наглухо виснет sdio-host. Никак не могу найти примера на STM32, который упоминается у espressif.
Пример "упоминался" два года назад. И код со стороны STM не был опубликован :)
Для SDIOD к RTL все есть в SDK. Я не проверял, но изначально чип был рассчитан на SDIO-WiFi подключение, как и многие RTL87xx
RTL00MP3/rtl8195a_sdio_device.c at master · pvvx/RTL00MP3 · GitHub
RTL00MP3/hal_sdio.h at master · pvvx/RTL00MP3 · GitHub
RTL00MP3/rtl8195a_sdio.h at master · pvvx/RTL00MP3 · GitHub

Т.е. не понятно, если вам нужен SDIO-WiFi интерфейс, то зачем брать данные модули, если есть более дешевые и разобранные вдоль и поперек с ним? Вроде тот-же RTL8723 - типа этого F23BDSM25 W1 rtl8723 ультра малый размер wi fi модуль SDIO интерфейс 2.4 г 4.0 Модуль Bluetooth купить на AliExpress

GitHub - hadess/rtl8723bs: Realtek SDIO Wi-Fi driver и т.д.
 
Последнее редактирование:

t275

New member
Опа, а на ameba и в aduino sdk rtl8195a_sdio_device.c нет, или я совсем плохо смотрю.
Есть, но в sdk-ameba1-v3.4b3_without_NDA
 
Последнее редактирование:

pvvx

Активный участник сообщества
Опа, а на ameba и в aduino sdk rtl8195a_sdio_device.c нет, или я совсем плохо смотрю.
Есть, но в sdk-ameba1-v3.4b3_without_NDA
У других чипов, тип RTL871x может не хватает выведенных ножек для него...
И специфика серии не для SDIO, а для IoT на одном чипе...

Как-бы обратная задача (подключение SDIO устройства к RTL8710):
Я подключил SD карту к SDIOH у RTL8710, но пока не исправил hal. Он по прерыванию, гад, отключает питание интерфейсу, т.к. не торчит нога PA_6/PA_7... Возможно есть мультиплексор этих ног на другой pin, но пока не раскопал и полный "реверс" Hal SDIOH ещё не готов...
Код:
[SDIO Inf]SDIO Init Host Begin...
[SDIO Inf]SDIO Host init Success.
[SDIO Inf]init sd card.
[SDIO Err]Reset sd card fail !!
[SDIO Err]SD card initialization FAIL !!
Дергаем вручную PA_6 :) ATSG=W,PA,6,0,0
Код:
[SDIO Inf]Supply SD bus voltage: 3.3V
[SDIO Err]SD card removed
[SDIO Inf]Supply SD bus voltage: 3.3V
[SDIO Err]SD card removed
 
Последнее редактирование:
Сверху Снизу