Всем привет! Ищу людей, которые имеют опыт с Azure RTOS и его расширением FileX для управления файловыми системами и уже понаступали на все грабли этого софта.
Железо: STM32U585CIU6 и SDXC карта памяти на 128 Гб, которая подключена по SPI без DMA.
Попытка форматирования этой карты памяти в exFAT завершается успешно, статус 0 означает FX_SUCCESS:

Далее открытие файловой системы завершается печально: статус = 2 (FX_MEDIA_INVALID):

Драйвер-обертка над HAL для STM32 для чтения карты памяти был взят готовый.
Интеграция этого драйвера в FileX выглядит так (все по четко по сгенерированному шаблону):
Я проверял драйвер карты памяти на предмет работоспособности без FileX: он корректно пишет и читает по секторам. После форматирования в отладке сразу посмотрел сектора 0 и 12 и не увидел там каких-то отклонений, их содержимое соответствует exFAT.
Сталкивался кто-нибудь с таким безобразным поведением файловой системы? Есть ли предположения, почему файловая система не открывается?
Железо: STM32U585CIU6 и SDXC карта памяти на 128 Гб, которая подключена по SPI без DMA.
Попытка форматирования этой карты памяти в exFAT завершается успешно, статус 0 означает FX_SUCCESS:

Далее открытие файловой системы завершается печально: статус = 2 (FX_MEDIA_INVALID):

Драйвер-обертка над HAL для STM32 для чтения карты памяти был взят готовый.
Интеграция этого драйвера в FileX выглядит так (все по четко по сгенерированному шаблону):
C++:
VOID fx_stm32_custom_driver(FX_MEDIA *media_ptr)
{
/* USER CODE BEGIN USER_CODE_SECTION_1 */
/* USER CODE END USER_CODE_SECTION_1 */
switch (media_ptr->fx_media_driver_request)
{
case FX_DRIVER_INIT:
{
/* USER CODE BEGIN DRIVER_INIT */
if (!sd_is_initialized) {
const int init_result = SDCARD_Init();
if(0 == init_result) {
sd_is_initialized = true;
} else {
media_ptr->fx_media_driver_status = FX_MEDIA_INVALID;
return;
}
}
/* USER CODE END DRIVER_INIT */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_INIT */
/* USER CODE END POST_DRIVER_INIT */
break;
}
case FX_DRIVER_UNINIT:
{
/* USER CODE BEGIN DRIVER_UNINIT */
SDCARD_Unselect();
sd_is_initialized = false;
/* USER CODE END DRIVER_UNINIT */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_UNINIT */
/* USER CODE END POST_DRIVER_UNINIT */
break;
}
case FX_DRIVER_BOOT_READ:
{
/* USER CODE BEGIN DRIVER_BOOT_READ */
const uint64_t boot_sector = media_ptr->fx_media_driver_logical_sector;
uint8_t *const buffer = media_ptr->fx_media_driver_buffer;
if (SDCARD_ReadSingleBlock(boot_sector, buffer) < 0) {
media_ptr->fx_media_driver_status = FX_IO_ERROR;
return;
}
/* USER CODE END DRIVER_BOOT_READ */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_BOOT_READ */
/* USER CODE END POST_DRIVER_BOOT_READ */
break;
}
case FX_DRIVER_READ:
{
/* USER CODE BEGIN DRIVER_READ */
uint64_t sector_start = media_ptr->fx_media_driver_logical_sector;
uint64_t sector_count = media_ptr->fx_media_driver_sectors;
uint8_t *buffer = media_ptr->fx_media_driver_buffer;
while (sector_count > 0U) {
if (SDCARD_ReadSingleBlock(sector_start, buffer) < 0) {
media_ptr->fx_media_driver_status = FX_IO_ERROR;
return;
}
buffer += 512U;
++sector_start;
--sector_count;
}
/* USER CODE END DRIVER_READ */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_READ */
/* USER CODE END POST_DRIVER_READ */
break;
}
case FX_DRIVER_BOOT_WRITE:
{
/* USER CODE BEGIN DRIVER_BOOT_WRITE */
const uint64_t boot_sector = media_ptr->fx_media_driver_logical_sector;
uint8_t *const buffer = media_ptr->fx_media_driver_buffer;
if (SDCARD_WriteSingleBlock(boot_sector, buffer) < 0) {
media_ptr->fx_media_driver_status = FX_IO_ERROR;
return;
}
/* USER CODE END DRIVER_BOOT_WRITE */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_BOOT_WRITE */
/* USER CODE END POST_DRIVER_BOOT_WRITE */
break;
}
case FX_DRIVER_WRITE:
{
/* USER CODE BEGIN DRIVER_WRITE */
uint64_t sector_start = media_ptr->fx_media_driver_logical_sector;
uint64_t sector_count = media_ptr->fx_media_driver_sectors;
const uint8_t *buffer = media_ptr->fx_media_driver_buffer;
while (sector_count > 0U) {
if (SDCARD_WriteSingleBlock(sector_start, buffer) < 0) {
media_ptr->fx_media_driver_status = FX_IO_ERROR;
return;
}
buffer += 512U;
++sector_start;
--sector_count;
}
/* USER CODE END DRIVER_WRITE */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_WRITE */
/* USER CODE END POST_DRIVER_WRITE */
break;
}
case FX_DRIVER_FLUSH:
{
/* USER CODE BEGIN DRIVER_FLUSH */
/* USER CODE END DRIVER_FLUSH */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_FLUSH */
/* USER CODE END POST_DRIVER_FLUSH */
break;
}
case FX_DRIVER_ABORT:
{
/* USER CODE BEGIN DRIVER_ABORT */
/* USER CODE END DRIVER_ABORT */
media_ptr->fx_media_driver_status = FX_SUCCESS;
/* USER CODE BEGIN POST_DRIVER_ABORT */
/* USER CODE END POST_DRIVER_ABORT */
break;
}
default:
{
media_ptr->fx_media_driver_status = FX_IO_ERROR;
break;
}
}
}
Я проверял драйвер карты памяти на предмет работоспособности без FileX: он корректно пишет и читает по секторам. После форматирования в отладке сразу посмотрел сектора 0 и 12 и не увидел там каких-то отклонений, их содержимое соответствует exFAT.
Сталкивался кто-нибудь с таким безобразным поведением файловой системы? Есть ли предположения, почему файловая система не открывается?
Изменено: