• Система автоматизации с открытым исходным кодом на базе 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
 
Последнее редактирование:
Сверху Снизу