Hi,
I'm using a custom code I developed to save all console logs to an SD card based on the Zephyr architecture. I originally developed it for the Thingy:52 and have also used it successfully on the nRF52 DK and nRF52840 DK boards.
Recently, I tried running it on the WisBlock RAK4631, but it didn’t work. I tried several fixes, but none of them solved the issue. At first, I attempted to use the available pins on the WisBlock, but none of them worked. Then, I tried soldering the four SD pins to the QSPI pins on the pinout (P0.03, P0.30, P0.29, P0.26), since I found somewhere that these pins could also be configured for SPI.
Here’s the code I tried:
"sd_card.c"
#include "sd_card.h"LOG_MODULE_REGISTER(SD_CARD, LOG_LEVEL_INF);FATFS fatfs;static struct fs_mount_t fatfs_mnt = { .type = FS_FATFS, .mnt_point = MOUNT_POINT, .fs_data = &fatfs,};void init_sd_card() { static const char *disk_pdrv = "SD"; uint64_t memory_size_mb; uint32_t block_count; uint32_t block_size; uint32_t err = disk_access_init(disk_pdrv); if (err != 0) { LOG_ERR("Storage init Error! %d", err); k_sleep(K_MSEC(REBOOT_INTERVAL)); sys_reboot(SYS_REBOOT_COLD); } if (disk_access_ioctl(disk_pdrv, DISK_IOCTL_GET_SECTOR_COUNT, &block_count)) { LOG_ERR("Unable to get sector count"); k_sleep(K_MSEC(REBOOT_INTERVAL)); sys_reboot(SYS_REBOOT_COLD); } if (disk_access_ioctl(disk_pdrv, DISK_IOCTL_GET_SECTOR_SIZE, &block_size)) { LOG_ERR("Unable to get sector size"); k_sleep(K_MSEC(REBOOT_INTERVAL)); sys_reboot(SYS_REBOOT_COLD); } memory_size_mb = (uint64_t)block_count * block_size; LOG_INF("Memory Size %uMB", (uint32_t)(memory_size_mb >> 20)); int res = fs_mount(&fatfs_mnt); if (res == FR_OK) { LOG_INF("Disk mounted"); } else { LOG_ERR("Error mounting disk (E: %i)", res); k_sleep(K_MSEC(REBOOT_INTERVAL)); sys_reboot(SYS_REBOOT_COLD); }}#ifndef SD_CARD_H#define SD_CARD_H#include <zephyr/storage/disk_access.h>#include <zephyr/logging/log.h>#include <zephyr/logging/log_backend.h>#include <zephyr/fs/fs.h>#include <zephyr/sys/reboot.h>#include <ff.h>#define MOUNT_POINT "/SD:" ///< Mount point for the SD card#define REBOOT_INTERVAL (2 * 1000) ///< Delay before reboot (ms)extern FATFS fatfs; ///< File system object for the SD card/** * @brief Initializes the SD Card functionality. * * This function verifies if the SD Card device is ready for operation. * If the device is not ready or some error occours in mouting, an error * is logged, and the system reboots after a short delay defined by REBOOT_INTERVAL. * * If the device is ready, a confirmation message is logged. * * @return void This function does not return a value. */void init_sd_card();#endif // SD_CARD_H
"main.c"
CONFIG_I2C=nCONFIG_LOG=yCONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 CONFIG_MAIN_STACK_SIZE=2048 CONFIG_REBOOT=y CONFIG_MULTITHREADING=y CONFIG_VOLTAGE_DIVIDER=y CONFIG_ADC=y CONFIG_DISK_ACCESS=y CONFIG_FILE_SYSTEM=y CONFIG_FAT_FILESYSTEM_ELM=y CONFIG_LOG_BACKEND_FS=y CONFIG_LOG_BACKEND_FS_OUTPUT_TEXT=y CONFIG_LOG_BACKEND_FS_DIR="/SD:" CONFIG_LOG_BACKEND_FS_FILE_PREFIX="log" CONFIG_LOG_BACKEND_FS_FILES_LIMIT=512 CONFIG_LOG_BACKEND_FS_FILE_SIZE=8388608 CONFIG_LOG_BACKEND_FS_OVERWRITE=y If you could help me figure out what might be wrong or suggest how to make it work on the RAK4631, I’d be very grateful.