Merge branch 'refactor/esp_driver_sdmmc' into 'master'

refactor(sdmmc): place sdmmc driver into a new component

See merge request espressif/esp-idf!27059
This commit is contained in:
Armando (Dou Yiwen)
2023-11-16 20:02:23 +08:00
60 changed files with 207 additions and 182 deletions

View File

@@ -88,6 +88,7 @@
/components/esp_coex/ @esp-idf-codeowners/wifi @esp-idf-codeowners/bluetooth @esp-idf-codeowners/ieee802154
/components/esp_common/ @esp-idf-codeowners/system
/components/esp_driver_*/ @esp-idf-codeowners/peripherals
/components/esp_driver_sdmmc/ @esp-idf-codeowners/peripherals @esp-idf-codeowners/storage
/components/esp_eth/ @esp-idf-codeowners/network
/components/esp_event/ @esp-idf-codeowners/system
/components/esp_gdbstub/ @esp-idf-codeowners/debugging

View File

@@ -18,7 +18,6 @@ set(includes "include"
"parlio/include"
"rmt/include"
"sdio_slave/include"
"sdmmc/include"
"sdspi/include"
"sigma_delta/include"
"temperature_sensor/include"
@@ -127,12 +126,6 @@ if(CONFIG_SOC_SDIO_SLAVE_SUPPORTED)
list(APPEND srcs "sdio_slave/sdio_slave.c")
endif()
# SDMMC related source files
if(CONFIG_SOC_SDMMC_HOST_SUPPORTED)
list(APPEND srcs "sdmmc/sdmmc_transaction.c"
"sdmmc/sdmmc_host.c")
endif()
# Sigma-Delta Modulation related source files
if(CONFIG_SOC_SDM_SUPPORTED)
list(APPEND srcs "sigma_delta/sdm.c"
@@ -199,6 +192,7 @@ else()
# for backward compatibility, the driver component needs to
# have a public dependency on other "esp_driver_foo" components
esp_driver_gpio esp_driver_pcnt esp_driver_gptimer esp_driver_spi esp_driver_mcpwm
esp_driver_sdmmc
LDFRAGMENTS ${ldfragments}
)
endif()

View File

@@ -0,0 +1,15 @@
set(srcs)
set(public_include "include")
# SDMMC related source files
if(CONFIG_SOC_SDMMC_HOST_SUPPORTED)
list(APPEND srcs "src/sdmmc_transaction.c"
"src/sdmmc_host.c")
endif()
idf_component_register(SRCS ${srcs}
INCLUDE_DIRS ${public_include}
REQUIRES sdmmc esp_driver_gpio
PRIV_REQUIRES esp_timer esp_pm esp_mm
)

View File

@@ -50,8 +50,6 @@ extern "C" {
#define SDMMC_SLOT_NO_WP GPIO_NUM_NC ///< indicates that write protect line is not used
#define SDMMC_SLOT_WIDTH_DEFAULT 0 ///< use the maximum possible width for the slot
#if SOC_SDMMC_USE_IOMUX && !SOC_SDMMC_USE_GPIO_MATRIX
/**
* Macro defining default configuration of SDMMC host slot

View File

@@ -0,0 +1,9 @@
/*
* SPDX-FileCopyrightText: 2022-2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "sd_protocol_defs.h"

View File

@@ -12,7 +12,7 @@
#include <stdint.h>
#include <stddef.h>
#include "esp_err.h"
#include "sdmmc_types.h"
#include "driver/sdmmc_types.h"
#include "driver/sdmmc_default_configs.h"
#include "driver/gpio.h"

View File

@@ -0,0 +1,9 @@
/*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#pragma once
#include "sd_protocol_types.h"

View File

@@ -45,7 +45,6 @@
#define SDMMC_CLK_SRC_ATOMIC()
#endif
static const char *TAG = "sdmmc_periph";
/**
@@ -70,7 +69,6 @@ typedef struct host_ctx_t {
static host_ctx_t s_host_ctx;
static void sdmmc_isr(void *arg);
static void sdmmc_host_dma_init(void);
static esp_err_t sdmmc_host_pullup_en_internal(int slot, int width);
@@ -209,10 +207,10 @@ void sdmmc_host_get_clk_dividers(uint32_t freq_khz, int *host_div, int *card_div
* effective frequency range: 400 kHz - 32 MHz (32.1 - 39.9 MHz cannot be covered with given divider scheme)
*/
*host_div = (clk_src_freq_hz) / (freq_khz * 1000);
if (*host_div > 15 ) {
if (*host_div > 15) {
*host_div = 2;
*card_div = (clk_src_freq_hz / 2) / (2 * freq_khz * 1000);
if ( ((clk_src_freq_hz / 2) % (2 * freq_khz * 1000)) > 0 ) {
if (((clk_src_freq_hz / 2) % (2 * freq_khz * 1000)) > 0) {
(*card_div)++;
}
} else if ((clk_src_freq_hz % (freq_khz * 1000)) > 0) {
@@ -479,7 +477,7 @@ static void configure_pin_iomux(uint8_t gpio_num)
static void configure_pin_gpio_matrix(uint8_t gpio_num, uint8_t gpio_matrix_sig, gpio_mode_t mode, const char *name)
{
assert (gpio_num != (uint8_t) GPIO_NUM_NC);
assert(gpio_num != (uint8_t) GPIO_NUM_NC);
ESP_LOGD(TAG, "using GPIO%d as %s pin", gpio_num, name);
gpio_reset_pin(gpio_num);
gpio_set_direction(gpio_num, mode);
@@ -651,7 +649,7 @@ esp_err_t sdmmc_host_init_slot(int slot, const sdmmc_slot_config_t *slot_config)
// As hardware expects an active-high signal,
// if WP signal is active low, then invert it in GPIO matrix,
// else keep it in its default state
esp_rom_gpio_connect_in_signal(matrix_in_wp, slot_info->write_protect, (gpio_wp_polarity? false : true));
esp_rom_gpio_connect_in_signal(matrix_in_wp, slot_info->write_protect, (gpio_wp_polarity ? false : true));
// By default, set probing frequency (400kHz) and 1-bit bus
esp_err_t ret = sdmmc_host_set_card_clk(slot, 400);
@@ -733,7 +731,7 @@ esp_err_t sdmmc_host_set_bus_width(int slot, size_t width)
size_t sdmmc_host_get_slot_width(int slot)
{
assert( slot == 0 || slot == 1 );
assert(slot == 0 || slot == 1);
return s_host_ctx.slot_ctx[slot].slot_width;
}

View File

@@ -18,13 +18,11 @@
#include "driver/sdmmc_types.h"
#include "driver/sdmmc_defs.h"
#include "driver/sdmmc_host.h"
#include "esp_timer.h"
#include "esp_cache.h"
#include "esp_private/esp_cache_private.h"
#include "sdmmc_private.h"
#include "soc/soc_caps.h"
/* Number of DMA descriptors used for transfer.
* Increasing this value above 4 doesn't improve performance for the usual case
* of SD memory cards (most data transfers are multiples of 512 bytes).
@@ -291,7 +289,6 @@ static esp_err_t handle_idle_state_events(void)
return ESP_OK;
}
static esp_err_t handle_event(sdmmc_command_t* cmd, sdmmc_req_state_t* state,
sdmmc_event_t* unhandled_events)
{
@@ -418,7 +415,8 @@ static void process_data_status(uint32_t status, sdmmc_command_t* cmd)
}
static inline bool mask_check_and_clear(uint32_t* state, uint32_t mask) {
static inline bool mask_check_and_clear(uint32_t* state, uint32_t mask)
{
bool ret = ((*state) & mask) != 0;
*state &= ~mask;
return ret;
@@ -466,7 +464,6 @@ static esp_err_t process_events(sdmmc_event_t evt, sdmmc_command_t* cmd,
}
break;
case SDMMC_SENDING_DATA:
if (mask_check_and_clear(&evt.sdmmc_status, SDMMC_DATA_ERR_MASK)) {
process_data_status(orig_evt.sdmmc_status, cmd);

View File

@@ -22,7 +22,7 @@ else()
list(APPEND include_dirs "vfs")
list(APPEND requires "sdmmc")
list(APPEND requires "sdmmc" "driver") # `driver` will be replaced with `esp_driver_sdspi`
list(APPEND priv_requires "vfs" "esp_driver_gpio")
endif()

View File

@@ -7,7 +7,7 @@
#pragma once
#include "sdmmc_cmd.h"
#include "driver/sdmmc_defs.h"
#include "sd_protocol_defs.h"
#ifdef __cplusplus
extern "C" {

View File

@@ -7,8 +7,7 @@
#pragma once
#include <stddef.h>
#include "esp_err.h"
#include "driver/gpio.h"
#include "driver/sdmmc_types.h"
#include "sd_protocol_types.h"
#include "driver/sdspi_host.h"
#include "ff.h"
#include "wear_levelling.h"

View File

@@ -15,7 +15,7 @@
#include "diskio_impl.h"
#include "diskio_sdmmc.h"
#include "soc/soc_caps.h"
#include "driver/sdmmc_defs.h"
#include "sd_protocol_defs.h"
#if SOC_SDMMC_HOST_SUPPORTED
#include "driver/sdmmc_host.h"

View File

@@ -11,5 +11,4 @@ idf_component_register(SRCS "sdmmc_cmd.c"
"sdmmc_mmc.c"
"sdmmc_sd.c"
INCLUDE_DIRS include
REQUIRES driver
PRIV_REQUIRES soc esp_timer)

View File

@@ -3,7 +3,7 @@
*
* SPDX-License-Identifier: ISC
*
* SPDX-FileContributor: 2016-2021 Espressif Systems (Shanghai) CO LTD
* SPDX-FileContributor: 2016-2023 Espressif Systems (Shanghai) CO LTD
*/
/*
* Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
@@ -75,7 +75,6 @@ extern "C" {
#define SD_IO_RW_DIRECT 52 /* R5 */
#define SD_IO_RW_EXTENDED 53 /* R5 */
/* OCR bits */
#define MMC_OCR_MEM_READY (1<<31) /* memory power-up status bit */
#define MMC_OCR_ACCESS_MODE_MASK 0x60000000 /* bits 30:29 */
@@ -528,7 +527,6 @@ static inline uint32_t MMC_RSP_BITS(uint32_t *src, int start, int len)
#define CISTPL_CODE_SDIO_EXT 0x92
#define CISTPL_CODE_END 0xFF
/* Timing */
#define SDMMC_TIMING_LEGACY 0
#define SDMMC_TIMING_HIGHSPEED 1

View File

@@ -118,7 +118,7 @@ typedef struct {
size_t buflen; /*!< length of the buffer */
size_t blklen; /*!< block length */
int flags; /*!< see below */
/** @cond */
/** @cond */
#define SCF_ITSDONE 0x0001 /*!< command is complete */
#define SCF_CMD(flags) ((flags) & 0x00f0)
#define SCF_CMD_AC 0x0000
@@ -131,7 +131,7 @@ typedef struct {
#define SCF_RSP_CRC 0x0400
#define SCF_RSP_IDX 0x0800
#define SCF_RSP_PRESENT 0x1000
/* response types */
/* response types */
#define SCF_RSP_R0 0 /*!< none */
#define SCF_RSP_R1 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX)
#define SCF_RSP_R1B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY)
@@ -142,9 +142,9 @@ typedef struct {
#define SCF_RSP_R5B (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY)
#define SCF_RSP_R6 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX)
#define SCF_RSP_R7 (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX)
/* special flags */
/* special flags */
#define SCF_WAIT_BUSY 0x2000 /*!< Wait for completion of card busy signal before returning */
/** @endcond */
/** @endcond */
esp_err_t error; /*!< error returned from transfer */
uint32_t timeout_ms; /*!< response timeout, in milliseconds */
} sdmmc_command_t;

View File

@@ -8,7 +8,7 @@
#include <stdio.h>
#include "esp_err.h"
#include "driver/sdmmc_types.h"
#include "sd_protocol_types.h"
#ifdef __cplusplus
extern "C" {

View File

@@ -21,8 +21,8 @@
#include "esp_heap_caps.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/sdmmc_defs.h"
#include "driver/sdmmc_types.h"
#include "sd_protocol_defs.h"
#include "sd_protocol_types.h"
#include "sdmmc_cmd.h"
#include "sys/param.h"
#include "soc/soc_memory_layout.h"

View File

@@ -1,11 +0,0 @@
# Documentation: .gitlab/ci/README.md#manifest-file-to-control-the-buildtest-apps
components/sdmmc/test_apps:
disable:
- if: IDF_TARGET in ["esp32h2"]
temporary: true
reason: Console component not supported on H2 yet
disable_test:
- if: IDF_TARGET not in ["esp32", "esp32s2", "esp32c3"]
temporary: true
reason: No runners for other targets yet

View File

@@ -1,4 +0,0 @@
idf_component_register(SRCS cmd_sdmmc.c
INCLUDE_DIRS .
PRIV_REQUIRES console sdmmc sdmmc_test_board
)

View File

@@ -98,9 +98,9 @@ INPUT = \
$(PROJECT_PATH)/components/driver/rmt/include/driver/rmt_types.h \
$(PROJECT_PATH)/components/driver/sdio_slave/include/driver/sdio_slave.h \
$(PROJECT_PATH)/components/driver/sigma_delta/include/driver/sdm.h \
$(PROJECT_PATH)/components/driver/sdmmc/include/driver/sdmmc_default_configs.h \
$(PROJECT_PATH)/components/driver/sdmmc/include/driver/sdmmc_host.h \
$(PROJECT_PATH)/components/driver/sdmmc/include/driver/sdmmc_types.h \
$(PROJECT_PATH)/components/esp_driver_sdmmc/include/driver/sdmmc_default_configs.h \
$(PROJECT_PATH)/components/esp_driver_sdmmc/include/driver/sdmmc_host.h \
$(PROJECT_PATH)/components/esp_driver_sdmmc/include/driver/sdmmc_types.h \
$(PROJECT_PATH)/components/driver/sdspi/include/driver/sdspi_host.h \
$(PROJECT_PATH)/components/esp_driver_spi/include/driver/spi_common.h \
$(PROJECT_PATH)/components/esp_driver_spi/include/driver/spi_master.h \

View File

@@ -8,7 +8,7 @@ Overview
The SD/SDIO/MMC driver currently supports SD memory, SDIO cards, and eMMC chips. This is a protocol level driver built on top of SDMMC and SD SPI host drivers.
SDMMC and SD SPI host drivers (:component_file:`driver/sdmmc/include/driver/sdmmc_host.h` and :component_file:`driver/sdspi/include/driver/sdspi_host.h`) provide API functions for:
SDMMC and SD SPI host drivers (:component_file:`esp_driver_sdmmc/include/driver/sdmmc_host.h` and :component_file:`driver/sdspi/include/driver/sdspi_host.h`) provide API functions for:
- Sending commands to slave devices
- Sending and receiving data

View File

@@ -10,6 +10,7 @@ In order to control the dependence of other components on drivers at a smaller g
- `esp_driver_gpio` - Driver for GPIO
- `esp_driver_spi` - Driver for GPSPI
- `esp_driver_mcpwm` - Driver for Motor Control PWM
- `esp_driver_sdmmc` - Driver for SDMMC
For compatibility, the original `driver`` component is still treated as an all-in-one component by registering these `esp_driver_xyz`` components as its public dependencies. In other words, you do not need to modify the CMake file of an existing project, but you now have a way to specify the specific peripheral driver that your project depends on.

View File

@@ -8,7 +8,7 @@ SD/SDIO/MMC 驱动程序
SD/SDIO/MMC 驱动是一种基于 SDMMC 和 SD SPI 主机驱动的协议级驱动程序,目前已支持 SD 存储器、SDIO 卡和 eMMC 芯片。
SDMMC 主机驱动和 SD SPI 主机驱动(:component_file:`driver/sdmmc/include/driver/sdmmc_host.h` 和 :component_file:`driver/sdspi/include/driver/sdspi_host.h`)为以下功能提供 API
SDMMC 主机驱动和 SD SPI 主机驱动(:component_file:`esp_driver_sdmmc/include/driver/sdmmc_host.h` 和 :component_file:`driver/sdspi/include/driver/sdspi_host.h`)为以下功能提供 API
- 发送命令至从设备
- 接收和发送数据

View File

@@ -10,6 +10,7 @@
- `esp_driver_gpio` - GPIO 驱动
- `esp_driver_spi` - 通用 SPI 驱动
- `esp_driver_mcpwm` - 电机控制 PWM 驱动
- `esp_driver_sdmmc` - SDMMC 驱动
为了兼容性,原来的 `driver` 组件仍然存在,并作为一个 “all-in-one" 的组件,将以上这些 `esp_driver_xyz` 组件注册成自己的公共依赖。换句话说,你无需修改既有项目的 CMake 文件,但是你现在多了一个途径去指定你项目依赖的具体的外设驱动。

View File

@@ -11,9 +11,10 @@ examples/storage/custom_flash_driver:
examples/storage/emmc:
depends_components:
- sdmmc
- driver
- driver # `driver` will be replaced with `esp_driver_sdspi`
- fatfs
- vfs
- esp_driver_sdmmc
enable:
- if: IDF_TARGET == "esp32s3"
reason: only support on esp32s3
@@ -107,7 +108,7 @@ examples/storage/perf_benchmark:
- spiffs
- wear_levelling
- esp_partition
- driver
- esp_driver_sdmmc
disable:
- if: IDF_TARGET == "esp32p4" and CONFIG_NAME in ["sdmmc_1line", "sdmmc_4line", "sdspi_1line"]
temporary: true
@@ -121,7 +122,7 @@ examples/storage/sd_card/sdmmc:
depends_components:
- vfs
- sdmmc
- driver
- esp_driver_sdmmc
disable:
- if: SOC_SDMMC_HOST_SUPPORTED != 1
disable_test:
@@ -133,7 +134,7 @@ examples/storage/sd_card/sdspi:
depends_components:
- vfs
- sdmmc
- driver
- driver # To be updated to `esp_driver_sdspi`
disable:
- if: SOC_GPSPI_SUPPORTED != 1
disable_test:

View File

@@ -121,7 +121,7 @@ spiffs:
sdmmc:
include:
- 'components/driver/sdmmc/include/driver/'
- 'components/esp_driver_sdmmc/include/driver/'
- 'components/sdmmc/'
allowed_licenses:
- Apache-2.0

View File

@@ -87,6 +87,20 @@ tools/test_apps/storage/partition_table_readonly:
- fatfs
- spiffs
tools/test_apps/storage/sdmmc_console:
disable:
- if: IDF_TARGET in ["esp32h2"]
temporary: true
reason: Console component not supported on H2 yet
disable_test:
- if: IDF_TARGET not in ["esp32", "esp32s2", "esp32c3"]
temporary: true
reason: No runners for other targets yet
depends_components:
- sdmmc
- esp_driver_sdmmc
- driver # driver will be replaced with esp_driver_sdspi
tools/test_apps/system/bootloader_sections:
disable:
- if: IDF_TARGET == "esp32c2"

View File

@@ -0,0 +1,5 @@
idf_component_register(SRCS cmd_sdmmc.c
INCLUDE_DIRS .
PRIV_REQUIRES console sdmmc esp_driver_sdmmc esp_driver_gpio sdmmc_test_board
driver # driver will be replaced with esp_driver_sdspi later
)

View File

@@ -11,8 +11,8 @@
#include "esp_check.h"
#include "esp_console.h"
#include "soc/soc_caps.h"
#include "driver/sdmmc_defs.h"
#include "driver/sdmmc_types.h"
#include "sd_protocol_defs.h"
#include "sd_protocol_types.h"
#include "sdmmc_cmd.h"
#ifdef SOC_SDMMC_HOST_SUPPORTED
#include "driver/sdmmc_host.h"

View File

@@ -3,7 +3,8 @@ idf_component_register(
sdmmc_test_cd_wp_common.c
sdmmc_test_rw_common.c
PRIV_REQUIRES
sdmmc sdmmc_test_board esp_timer unity test_utils
sdmmc esp_driver_sdmmc sdmmc_test_board esp_timer unity test_utils
driver # driver will be replaced with esp_driver_sdspi later
WHOLE_ARCHIVE TRUE
)

View File

@@ -5,7 +5,7 @@
*/
#pragma once
#include "driver/sdmmc_types.h"
#include "sd_protocol_types.h"
#ifdef __cplusplus
extern "C" {

View File

@@ -11,7 +11,7 @@
#include "unity.h"
#include "sdmmc_test_board.h"
#include "driver/sdmmc_host.h"
#include "driver/sdmmc_defs.h"
#include "sd_protocol_defs.h"
#include "sdmmc_cmd.h"
#include "sdmmc_test_begin_end.h"
#include "hal/gpio_hal.h"

View File

@@ -11,7 +11,7 @@
#include "esp_log.h"
#include "sdmmc_test_board.h"
#include "driver/sdspi_host.h"
#include "driver/sdmmc_defs.h"
#include "sd_protocol_defs.h"
#include "sdmmc_cmd.h"
#include "sdmmc_test_begin_end.h"

View File

@@ -5,7 +5,7 @@
*/
#pragma once
#include "driver/sdmmc_types.h"
#include "sd_protocol_types.h"
#ifdef __cplusplus
extern "C" {
#endif

View File

@@ -12,7 +12,7 @@
#include "sdkconfig.h"
#include "soc/soc_caps.h"
#include "unity.h"
#include "driver/sdmmc_defs.h"
#include "sd_protocol_defs.h"
#include "sdmmc_cmd.h"
#include "sdmmc_test_rw_common.h"

View File

@@ -5,7 +5,7 @@
*/
#pragma once
#include "driver/sdmmc_types.h"
#include "sd_protocol_types.h"
#ifdef __cplusplus
extern "C" {