Skip to content

Commit

Permalink
mimxrt/sdcard: Implemented SDCard driver.
Browse files Browse the repository at this point in the history
SDCard support is optional and requires `USDHC` peripheral.
Thus this driver is not available on `MIMXRT1010_EVK`.

SDCard support is enabled by setting `MICROPY_PY_MACHINE_SDCARD = 1`
in mpconfigboard.mk.

- `USDHCx` base clock is feed by `PLL2->PFD0` with **198MHz**
- Added guards for sdcard related files via `MICROPY_PY_MACHINE_SDCARD`
- Added creation of pin defines for SDCard to make-pins.py
- Added new configuration option for SDCard peripheral pinout
	to mpconfigport.h
- Added interrupt handling support instead of polling
- Added support for `ADMA2` powered data transfer
- Configured SDCard to run in HS (high-spped mode) with **50MHz**

Signed-off-by: Philipp Ebensberger
  • Loading branch information
alphaFred committed Sep 6, 2021
1 parent bbbdef4 commit c6e310d
Show file tree
Hide file tree
Showing 30 changed files with 1,672 additions and 70 deletions.
77 changes: 46 additions & 31 deletions ports/mimxrt/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ QSTR_GLOBAL_DEPENDENCIES = $(BOARD_DIR)/mpconfigboard.h
# MicroPython feature configurations
FROZEN_MANIFEST ?= boards/manifest.py
MICROPY_VFS_LFS2 ?= 1
MICROPY_VFS_FAT ?= 1

# Include py core make definitions
include $(TOP)/py/py.mk
Expand All @@ -44,27 +45,32 @@ GEN_PINS_AF_PY = $(BUILD)/pins_af.py
CFLAGS += -Wno-error=unused-parameter

INC += -I.
INC += -I$(TOP)
INC += -I$(BUILD)
INC += -I$(BOARD_DIR)
INC += -I$(TOP)/lib/cmsis/inc
INC += -I$(BUILD)
INC += -I$(TOP)
INC += -I$(TOP)/$(MCU_DIR)
INC += -I$(TOP)/$(MCU_DIR)/drivers
INC += -I$(TOP)/$(MCU_DIR)/project_template
INC += -I$(TOP)/lib/tinyusb/src
INC += -I$(TOP)/lib/cmsis/inc
INC += -I$(TOP)/lib/oofatfs
INC += -I$(TOP)/lib/tinyusb/hw
INC += -I$(TOP)/lib/tinyusb/hw/bsp/teensy_40
INC += -I$(TOP)/lib/tinyusb/src

CFLAGS_MCU = -mtune=cortex-m7 -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16
CFLAGS += $(INC) -Wall -Werror -Wdouble-promotion -Wfloat-conversion -std=c99 -nostdlib -mthumb $(CFLAGS_MCU)
CFLAGS += -DCPU_$(MCU_SERIES) -DCPU_$(MCU_VARIANT)
CFLAGS += -DXIP_EXTERNAL_FLASH=1 \
-DXIP_BOOT_HEADER_ENABLE=1 \
-DFSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1 \
-DCFG_TUSB_MCU=OPT_MCU_MIMXRT10XX \
-D__STARTUP_CLEAR_BSS \
-D__STARTUP_INITIALIZE_RAMFUNCTION \
-D__START=main \
-DCPU_HEADER_H='<$(MCU_SERIES).h>'
ifeq ($(MICROPY_PY_MACHINE_SDCARD),1)
CFLAGS += -DMICROPY_PY_MACHINE_SDCARD=1
endif
CFLAGS += $(CFLAGS_MOD) $(CFLAGS_EXTRA)

# Configure floating point support
Expand Down Expand Up @@ -98,64 +104,71 @@ endif

# TinyUSB Stack source
SRC_TINYUSB_C += \
lib/tinyusb/src/tusb.c \
lib/tinyusb/src/common/tusb_fifo.c \
lib/tinyusb/src/device/usbd.c \
lib/tinyusb/src/device/usbd_control.c \
lib/tinyusb/src/class/msc/msc_device.c \
lib/tinyusb/src/class/cdc/cdc_device.c \
lib/tinyusb/src/class/dfu/dfu_rt_device.c \
lib/tinyusb/src/class/hid/hid_device.c \
lib/tinyusb/src/class/midi/midi_device.c \
lib/tinyusb/src/class/msc/msc_device.c \
lib/tinyusb/src/class/usbtmc/usbtmc_device.c \
lib/tinyusb/src/class/vendor/vendor_device.c \
lib/tinyusb/src/portable/nxp/transdimension/dcd_transdimension.c
lib/tinyusb/src/common/tusb_fifo.c \
lib/tinyusb/src/device/usbd.c \
lib/tinyusb/src/device/usbd_control.c \
lib/tinyusb/src/portable/nxp/transdimension/dcd_transdimension.c \
lib/tinyusb/src/tusb.c

SRC_HAL_IMX_C += \
$(MCU_DIR)/system_$(MCU_SERIES).c \
$(MCU_DIR)/xip/fsl_flexspi_nor_boot.c \
$(MCU_DIR)/project_template/clock_config.c \
$(MCU_DIR)/drivers/fsl_adc.c \
$(MCU_DIR)/drivers/fsl_cache.c \
$(MCU_DIR)/drivers/fsl_clock.c \
$(MCU_DIR)/drivers/fsl_common.c \
$(MCU_DIR)/drivers/fsl_dmamux.c \
$(MCU_DIR)/drivers/fsl_edma.c \
$(MCU_DIR)/drivers/fsl_flexram.c \
$(MCU_DIR)/drivers/fsl_flexspi.c \
$(MCU_DIR)/drivers/fsl_gpio.c \
$(MCU_DIR)/drivers/fsl_gpt.c \
$(MCU_DIR)/drivers/fsl_common.c \
$(MCU_DIR)/drivers/fsl_lpi2c.c \
$(MCU_DIR)/drivers/fsl_lpspi.c \
$(MCU_DIR)/drivers/fsl_lpspi_edma.c \
$(MCU_DIR)/drivers/fsl_lpuart.c \
$(MCU_DIR)/drivers/fsl_flexram.c \
$(MCU_DIR)/drivers/fsl_flexspi.c \
$(MCU_DIR)/drivers/fsl_pit.c \
$(MCU_DIR)/drivers/fsl_snvs_lp.c \
$(MCU_DIR)/drivers/fsl_trng.c \
$(MCU_DIR)/project_template/clock_config.c \
$(MCU_DIR)/system_$(MCU_SERIES).c \
$(MCU_DIR)/xip/fsl_flexspi_nor_boot.c \

ifeq ($(MICROPY_PY_MACHINE_SDCARD),1)
SRC_HAL_IMX_C += $(MCU_DIR)/drivers/fsl_usdhc.c
endif

SRC_C += \
main.c \
led.c \
pin.c \
ticks.c \
tusb_port.c \
$(BOARD_DIR)/flash_config.c \
board_init.c \
dma_channel.c \
$(BOARD_DIR)/flash_config.c \
drivers/bus/softspi.c \
extmod/modonewire.c \
fatfs_port.c \
led.c \
machine_adc.c \
machine_i2c.c \
machine_led.c \
machine_pin.c \
machine_rtc.c \
machine_sdcard.c \
machine_spi.c \
machine_timer.c \
machine_uart.c \
main.c \
mimxrt_flash.c \
modutime.c \
modmachine.c \
modmimxrt.c \
moduos.c \
modutime.c \
mphalport.c \
pin.c \
sdcard.c \
shared/libc/printf.c \
shared/libc/string0.c \
shared/readline/readline.c \
Expand All @@ -165,8 +178,8 @@ SRC_C += \
shared/runtime/stdout_helpers.c \
shared/runtime/sys_stdio_mphal.c \
shared/timeutils/timeutils.c \
drivers/bus/softspi.c \
extmod/modonewire.c \
ticks.c \
tusb_port.c \
$(SRC_TINYUSB_C) \
$(SRC_HAL_IMX_C) \

Expand All @@ -188,9 +201,9 @@ LIBM_SRC_C += $(addprefix lib/libm_dbl/,\
atan2.c \
atanh.c \
ceil.c \
copysign.c \
cos.c \
cosh.c \
copysign.c \
erf.c \
exp.c \
expm1.c \
Expand Down Expand Up @@ -222,7 +235,6 @@ LIBM_SRC_C += lib/libm_dbl/sqrt.c
endif
else
LIBM_SRC_C += $(addprefix lib/libm/,\
math.c \
acoshf.c \
asinfacosf.c \
asinhf.c \
Expand All @@ -237,6 +249,7 @@ LIBM_SRC_C += $(addprefix lib/libm/,\
kf_sin.c \
kf_tan.c \
log1pf.c \
math.c \
nearbyintf.c \
roundf.c \
sf_cos.c \
Expand All @@ -263,28 +276,29 @@ ifeq ($(MICROPY_FLOAT_IMPL),double)
$(LIBM_O): CFLAGS := $(filter-out -Wdouble-promotion -Wfloat-conversion, $(CFLAGS))
endif

SRC_SS = $(MCU_DIR)/gcc/startup_$(MCU_SERIES).S
SRC_SS += $(MCU_DIR)/gcc/startup_$(MCU_SERIES).S

SRC_S = shared/runtime/gchelper_m3.s \
SRC_S += shared/runtime/gchelper_m3.s \

# List of sources for qstr extraction
SRC_QSTR += \
extmod/modonewire.c \
machine_adc.c \
machine_led.c \
machine_pin.c \
machine_rtc.c \
machine_sdcard.c \
machine_spi.c \
machine_timer.c \
machine_uart.c \
mimxrt_flash.c \
modutime.c \
modmachine.c \
modmimxrt.c \
moduos.c \
modutime.c \
pin.c \
shared/runtime/mpirq.c \
shared/runtime/sys_stdio_mphal.c \
extmod/modonewire.c \
$(GEN_PINS_SRC) \

OBJ += $(PY_O)
Expand Down Expand Up @@ -327,6 +341,7 @@ $(HEADER_BUILD)/qstrdefs.generated.h: $(BOARD_DIR)/mpconfigboard.h
$(BUILD)/%_gen.c $(HEADER_BUILD)/%.h: $(BOARD_PINS) $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
$(ECHO) "Create $@"
$(Q)$(PYTHON) $(MAKE_PINS) --board $(BOARD_PINS) --af $(AF_FILE)\
--iomux $(abspath $(TOP)/$(MCU_DIR)/drivers/fsl_iomuxc.h) \
--prefix $(PREFIX_FILE) --hdr $(GEN_PINS_HDR) > $(GEN_PINS_SRC)

$(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c
Expand Down
6 changes: 5 additions & 1 deletion ports/mimxrt/board_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
#include "clock_config.h"
#include "modmachine.h"

volatile uint32_t systick_ms = 0;

const uint8_t dcd_data[] = { 0x00 };

Expand Down Expand Up @@ -85,6 +84,11 @@ void board_init(void) {

// PIT
machine_timer_init_PIT();

// SDCard
#if MICROPY_PY_MACHINE_SDCARD
machine_sdcard_init0();
#endif
}

void USB_OTG1_IRQHandler(void) {
Expand Down
1 change: 1 addition & 0 deletions ports/mimxrt/boards/MIMXRT1010_EVK/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ MCU_SERIES = MIMXRT1011
MCU_VARIANT = MIMXRT1011DAE5A

MICROPY_FLOAT_IMPL = single
MICROPY_PY_MACHINE_SDCARD = 0

SRC_C += \
hal/flexspi_nor_flash.c \
Expand Down
12 changes: 12 additions & 0 deletions ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,3 +64,15 @@
{ IOMUXC_GPIO_AD_B1_08_LPI2C2_SCL }, { IOMUXC_GPIO_AD_B1_09_LPI2C2_SDA }, \
{ 0 }, { 0 }, \
{ IOMUXC_GPIO_SD_B1_02_LPI2C4_SCL }, { IOMUXC_GPIO_SD_B1_03_LPI2C4_SDA },

#define USDHC_DUMMY_PIN NULL , 0
#define MICROPY_USDHC1 \
{ \
.cmd = {GPIO_SD_B0_02_USDHC1_CMD}, \
.clk = { GPIO_SD_B0_03_USDHC1_CLK }, \
.cd_b = { GPIO_SD_B0_06_USDHC1_CD_B },\
.data0 = { GPIO_SD_B0_04_USDHC1_DATA0 },\
.data1 = { GPIO_SD_B0_05_USDHC1_DATA1 },\
.data2 = { GPIO_SD_B0_00_USDHC1_DATA2 },\
.data3 = { GPIO_SD_B0_01_USDHC1_DATA3 },\
}
6 changes: 3 additions & 3 deletions ports/mimxrt/boards/MIMXRT1020_EVK/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ MCU_SERIES = MIMXRT1021
MCU_VARIANT = MIMXRT1021DAG5A

MICROPY_FLOAT_IMPL = double

SRC_C += \
hal/flexspi_nor_flash.c \
MICROPY_PY_MACHINE_SDCARD = 1

JLINK_PATH ?= /media/RT1020-EVK/
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
Expand All @@ -16,6 +14,8 @@ else
JLINK_CONNECTION_SETTINGS =
endif

SRC_C += \
hal/flexspi_nor_flash.c

deploy_jlink: $(BUILD)/firmware.hex
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
Expand Down
12 changes: 12 additions & 0 deletions ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,15 @@
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
{ 0 }, { 0 }, \
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },

#define USDHC_DUMMY_PIN NULL, 0
#define MICROPY_USDHC1 \
{ \
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
.cd_b = { GPIO_B1_12_USDHC1_CD_B },\
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
}
7 changes: 4 additions & 3 deletions ports/mimxrt/boards/MIMXRT1050_EVK/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ MCU_SERIES = MIMXRT1052
MCU_VARIANT = MIMXRT1052DVL6B

MICROPY_FLOAT_IMPL = double

SRC_C += \
hal/flexspi_nor_flash.c \
MICROPY_PY_MACHINE_SDCARD = 1

JLINK_PATH ?= /media/RT1050-EVK/

deploy: $(BUILD)/firmware.bin
cp $< $(JLINK_PATH)

SRC_C += \
hal/flexspi_nor_flash.c
1 change: 0 additions & 1 deletion ports/mimxrt/boards/MIMXRT1050_EVKB/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,6 @@
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },

#define USDHC_DUMMY_PIN NULL , 0

#define MICROPY_USDHC1 \
{ \
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
Expand Down
7 changes: 4 additions & 3 deletions ports/mimxrt/boards/MIMXRT1050_EVKB/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ MCU_SERIES = MIMXRT1052
MCU_VARIANT = MIMXRT1052DVL6B

MICROPY_FLOAT_IMPL = double

SRC_C += \
hal/flexspi_hyper_flash.c \
MICROPY_PY_MACHINE_SDCARD = 1

JLINK_PATH ?= /media/RT1050-EVKB/

SRC_C += \
hal/flexspi_hyper_flash.c

deploy: $(BUILD)/firmware.bin
cp $< $(JLINK_PATH)
12 changes: 12 additions & 0 deletions ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,15 @@
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
{ 0 }, { 0 }, \
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },

#define USDHC_DUMMY_PIN NULL, 0
#define MICROPY_USDHC1 \
{ \
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
.cd_b = { GPIO_B1_12_USDHC1_CD_B },\
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
}
6 changes: 3 additions & 3 deletions ports/mimxrt/boards/MIMXRT1060_EVK/mpconfigboard.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ MCU_SERIES = MIMXRT1062
MCU_VARIANT = MIMXRT1062DVJ6A

MICROPY_FLOAT_IMPL = double

SRC_C += \
hal/flexspi_hyper_flash.c \
MICROPY_PY_MACHINE_SDCARD = 1

JLINK_PATH ?= /media/RT1060-EVK/
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
Expand All @@ -16,6 +14,8 @@ else
JLINK_CONNECTION_SETTINGS = -USB
endif

SRC_C += \
hal/flexspi_hyper_flash.c

deploy_jlink: $(BUILD)/firmware.hex
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
Expand Down
12 changes: 12 additions & 0 deletions ports/mimxrt/boards/MIMXRT1064_EVK/mpconfigboard.h
Original file line number Diff line number Diff line change
Expand Up @@ -52,3 +52,15 @@
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
{ 0 }, { 0 }, \
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },

#define USDHC_DUMMY_PIN NULL, 0
#define MICROPY_USDHC1 \
{ \
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
.clk = { GPIO_SD_B0_01_USDHC1_CLK }, \
.cd_b = { GPIO_B1_12_USDHC1_CD_B },\
.data0 = { GPIO_SD_B0_02_USDHC1_DATA0 },\
.data1 = { GPIO_SD_B0_03_USDHC1_DATA1 },\
.data2 = { GPIO_SD_B0_04_USDHC1_DATA2 },\
.data3 = { GPIO_SD_B0_05_USDHC1_DATA3 },\
}

0 comments on commit c6e310d

Please sign in to comment.