kopia lustrzana https://github.com/micropython/micropython
mimxrt/sdcard: Implement SDCard driver.
- Configures `PLL2->PFD0` with **198MHz** as base clock of `USDHCx` peripheral. - Adds guards for SDCard related files via `MICROPY_PY_MACHINE_SDCARD` - Adds creation of pin defines for SDCard to make-pins.py - Adds new configuration option for SDCard peripheral pinout to mpconfigport.h - Adds interrupt handling support instead of polling - Adds support for `ADMA2` powered data transfer - Configures SDCard to run in HS (high-speed mode) with **50MHz** only! 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. Signed-off-by: Philipp Ebensbergerpull/7608/head
rodzic
bbbdef4cc1
commit
87f97e490c
|
@ -20,6 +20,7 @@ QSTR_GLOBAL_DEPENDENCIES = $(BOARD_DIR)/mpconfigboard.h
|
||||||
# MicroPython feature configurations
|
# MicroPython feature configurations
|
||||||
FROZEN_MANIFEST ?= boards/manifest.py
|
FROZEN_MANIFEST ?= boards/manifest.py
|
||||||
MICROPY_VFS_LFS2 ?= 1
|
MICROPY_VFS_LFS2 ?= 1
|
||||||
|
MICROPY_VFS_FAT ?= 1
|
||||||
|
|
||||||
# Include py core make definitions
|
# Include py core make definitions
|
||||||
include $(TOP)/py/py.mk
|
include $(TOP)/py/py.mk
|
||||||
|
@ -44,27 +45,32 @@ GEN_PINS_AF_PY = $(BUILD)/pins_af.py
|
||||||
CFLAGS += -Wno-error=unused-parameter
|
CFLAGS += -Wno-error=unused-parameter
|
||||||
|
|
||||||
INC += -I.
|
INC += -I.
|
||||||
INC += -I$(TOP)
|
|
||||||
INC += -I$(BUILD)
|
|
||||||
INC += -I$(BOARD_DIR)
|
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)
|
||||||
INC += -I$(TOP)/$(MCU_DIR)/drivers
|
INC += -I$(TOP)/$(MCU_DIR)/drivers
|
||||||
INC += -I$(TOP)/$(MCU_DIR)/project_template
|
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
|
||||||
INC += -I$(TOP)/lib/tinyusb/hw/bsp/teensy_40
|
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_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 += $(INC) -Wall -Werror -Wdouble-promotion -Wfloat-conversion -std=c99 -nostdlib -mthumb $(CFLAGS_MCU)
|
||||||
CFLAGS += -DCPU_$(MCU_SERIES) -DCPU_$(MCU_VARIANT)
|
CFLAGS += -DCPU_$(MCU_SERIES) -DCPU_$(MCU_VARIANT)
|
||||||
CFLAGS += -DXIP_EXTERNAL_FLASH=1 \
|
CFLAGS += -DXIP_EXTERNAL_FLASH=1 \
|
||||||
-DXIP_BOOT_HEADER_ENABLE=1 \
|
-DXIP_BOOT_HEADER_ENABLE=1 \
|
||||||
|
-DFSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1 \
|
||||||
-DCFG_TUSB_MCU=OPT_MCU_MIMXRT10XX \
|
-DCFG_TUSB_MCU=OPT_MCU_MIMXRT10XX \
|
||||||
-D__STARTUP_CLEAR_BSS \
|
-D__STARTUP_CLEAR_BSS \
|
||||||
-D__STARTUP_INITIALIZE_RAMFUNCTION \
|
-D__STARTUP_INITIALIZE_RAMFUNCTION \
|
||||||
-D__START=main \
|
-D__START=main \
|
||||||
-DCPU_HEADER_H='<$(MCU_SERIES).h>'
|
-DCPU_HEADER_H='<$(MCU_SERIES).h>'
|
||||||
|
ifeq ($(MICROPY_PY_MACHINE_SDCARD),1)
|
||||||
|
CFLAGS += -DMICROPY_PY_MACHINE_SDCARD=1
|
||||||
|
endif
|
||||||
CFLAGS += $(CFLAGS_MOD) $(CFLAGS_EXTRA)
|
CFLAGS += $(CFLAGS_MOD) $(CFLAGS_EXTRA)
|
||||||
|
|
||||||
# Configure floating point support
|
# Configure floating point support
|
||||||
|
@ -98,64 +104,71 @@ endif
|
||||||
|
|
||||||
# TinyUSB Stack source
|
# TinyUSB Stack source
|
||||||
SRC_TINYUSB_C += \
|
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/cdc/cdc_device.c \
|
||||||
lib/tinyusb/src/class/dfu/dfu_rt_device.c \
|
lib/tinyusb/src/class/dfu/dfu_rt_device.c \
|
||||||
lib/tinyusb/src/class/hid/hid_device.c \
|
lib/tinyusb/src/class/hid/hid_device.c \
|
||||||
lib/tinyusb/src/class/midi/midi_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/usbtmc/usbtmc_device.c \
|
||||||
lib/tinyusb/src/class/vendor/vendor_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 += \
|
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_adc.c \
|
||||||
$(MCU_DIR)/drivers/fsl_cache.c \
|
$(MCU_DIR)/drivers/fsl_cache.c \
|
||||||
$(MCU_DIR)/drivers/fsl_clock.c \
|
$(MCU_DIR)/drivers/fsl_clock.c \
|
||||||
|
$(MCU_DIR)/drivers/fsl_common.c \
|
||||||
$(MCU_DIR)/drivers/fsl_dmamux.c \
|
$(MCU_DIR)/drivers/fsl_dmamux.c \
|
||||||
$(MCU_DIR)/drivers/fsl_edma.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_gpio.c \
|
||||||
$(MCU_DIR)/drivers/fsl_gpt.c \
|
$(MCU_DIR)/drivers/fsl_gpt.c \
|
||||||
$(MCU_DIR)/drivers/fsl_common.c \
|
|
||||||
$(MCU_DIR)/drivers/fsl_lpi2c.c \
|
$(MCU_DIR)/drivers/fsl_lpi2c.c \
|
||||||
$(MCU_DIR)/drivers/fsl_lpspi.c \
|
$(MCU_DIR)/drivers/fsl_lpspi.c \
|
||||||
$(MCU_DIR)/drivers/fsl_lpspi_edma.c \
|
$(MCU_DIR)/drivers/fsl_lpspi_edma.c \
|
||||||
$(MCU_DIR)/drivers/fsl_lpuart.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_pit.c \
|
||||||
$(MCU_DIR)/drivers/fsl_snvs_lp.c \
|
$(MCU_DIR)/drivers/fsl_snvs_lp.c \
|
||||||
$(MCU_DIR)/drivers/fsl_trng.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 += \
|
SRC_C += \
|
||||||
main.c \
|
$(BOARD_DIR)/flash_config.c \
|
||||||
led.c \
|
|
||||||
pin.c \
|
|
||||||
ticks.c \
|
|
||||||
tusb_port.c \
|
|
||||||
board_init.c \
|
board_init.c \
|
||||||
dma_channel.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_adc.c \
|
||||||
machine_i2c.c \
|
machine_i2c.c \
|
||||||
machine_led.c \
|
machine_led.c \
|
||||||
machine_pin.c \
|
machine_pin.c \
|
||||||
machine_rtc.c \
|
machine_rtc.c \
|
||||||
|
machine_sdcard.c \
|
||||||
machine_spi.c \
|
machine_spi.c \
|
||||||
machine_timer.c \
|
machine_timer.c \
|
||||||
machine_uart.c \
|
machine_uart.c \
|
||||||
|
main.c \
|
||||||
mimxrt_flash.c \
|
mimxrt_flash.c \
|
||||||
modutime.c \
|
|
||||||
modmachine.c \
|
modmachine.c \
|
||||||
modmimxrt.c \
|
modmimxrt.c \
|
||||||
moduos.c \
|
moduos.c \
|
||||||
|
modutime.c \
|
||||||
mphalport.c \
|
mphalport.c \
|
||||||
|
pin.c \
|
||||||
|
sdcard.c \
|
||||||
shared/libc/printf.c \
|
shared/libc/printf.c \
|
||||||
shared/libc/string0.c \
|
shared/libc/string0.c \
|
||||||
shared/readline/readline.c \
|
shared/readline/readline.c \
|
||||||
|
@ -165,8 +178,8 @@ SRC_C += \
|
||||||
shared/runtime/stdout_helpers.c \
|
shared/runtime/stdout_helpers.c \
|
||||||
shared/runtime/sys_stdio_mphal.c \
|
shared/runtime/sys_stdio_mphal.c \
|
||||||
shared/timeutils/timeutils.c \
|
shared/timeutils/timeutils.c \
|
||||||
drivers/bus/softspi.c \
|
ticks.c \
|
||||||
extmod/modonewire.c \
|
tusb_port.c \
|
||||||
$(SRC_TINYUSB_C) \
|
$(SRC_TINYUSB_C) \
|
||||||
$(SRC_HAL_IMX_C) \
|
$(SRC_HAL_IMX_C) \
|
||||||
|
|
||||||
|
@ -188,9 +201,9 @@ LIBM_SRC_C += $(addprefix lib/libm_dbl/,\
|
||||||
atan2.c \
|
atan2.c \
|
||||||
atanh.c \
|
atanh.c \
|
||||||
ceil.c \
|
ceil.c \
|
||||||
|
copysign.c \
|
||||||
cos.c \
|
cos.c \
|
||||||
cosh.c \
|
cosh.c \
|
||||||
copysign.c \
|
|
||||||
erf.c \
|
erf.c \
|
||||||
exp.c \
|
exp.c \
|
||||||
expm1.c \
|
expm1.c \
|
||||||
|
@ -222,7 +235,6 @@ LIBM_SRC_C += lib/libm_dbl/sqrt.c
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
LIBM_SRC_C += $(addprefix lib/libm/,\
|
LIBM_SRC_C += $(addprefix lib/libm/,\
|
||||||
math.c \
|
|
||||||
acoshf.c \
|
acoshf.c \
|
||||||
asinfacosf.c \
|
asinfacosf.c \
|
||||||
asinhf.c \
|
asinhf.c \
|
||||||
|
@ -237,6 +249,7 @@ LIBM_SRC_C += $(addprefix lib/libm/,\
|
||||||
kf_sin.c \
|
kf_sin.c \
|
||||||
kf_tan.c \
|
kf_tan.c \
|
||||||
log1pf.c \
|
log1pf.c \
|
||||||
|
math.c \
|
||||||
nearbyintf.c \
|
nearbyintf.c \
|
||||||
roundf.c \
|
roundf.c \
|
||||||
sf_cos.c \
|
sf_cos.c \
|
||||||
|
@ -263,28 +276,29 @@ ifeq ($(MICROPY_FLOAT_IMPL),double)
|
||||||
$(LIBM_O): CFLAGS := $(filter-out -Wdouble-promotion -Wfloat-conversion, $(CFLAGS))
|
$(LIBM_O): CFLAGS := $(filter-out -Wdouble-promotion -Wfloat-conversion, $(CFLAGS))
|
||||||
endif
|
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
|
# List of sources for qstr extraction
|
||||||
SRC_QSTR += \
|
SRC_QSTR += \
|
||||||
|
extmod/modonewire.c \
|
||||||
machine_adc.c \
|
machine_adc.c \
|
||||||
machine_led.c \
|
machine_led.c \
|
||||||
machine_pin.c \
|
machine_pin.c \
|
||||||
machine_rtc.c \
|
machine_rtc.c \
|
||||||
|
machine_sdcard.c \
|
||||||
machine_spi.c \
|
machine_spi.c \
|
||||||
machine_timer.c \
|
machine_timer.c \
|
||||||
machine_uart.c \
|
machine_uart.c \
|
||||||
mimxrt_flash.c \
|
mimxrt_flash.c \
|
||||||
modutime.c \
|
|
||||||
modmachine.c \
|
modmachine.c \
|
||||||
modmimxrt.c \
|
modmimxrt.c \
|
||||||
moduos.c \
|
moduos.c \
|
||||||
|
modutime.c \
|
||||||
pin.c \
|
pin.c \
|
||||||
shared/runtime/mpirq.c \
|
shared/runtime/mpirq.c \
|
||||||
shared/runtime/sys_stdio_mphal.c \
|
shared/runtime/sys_stdio_mphal.c \
|
||||||
extmod/modonewire.c \
|
|
||||||
$(GEN_PINS_SRC) \
|
$(GEN_PINS_SRC) \
|
||||||
|
|
||||||
OBJ += $(PY_O)
|
OBJ += $(PY_O)
|
||||||
|
@ -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)
|
$(BUILD)/%_gen.c $(HEADER_BUILD)/%.h: $(BOARD_PINS) $(MAKE_PINS) $(AF_FILE) $(PREFIX_FILE) | $(HEADER_BUILD)
|
||||||
$(ECHO) "Create $@"
|
$(ECHO) "Create $@"
|
||||||
$(Q)$(PYTHON) $(MAKE_PINS) --board $(BOARD_PINS) --af $(AF_FILE)\
|
$(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)
|
--prefix $(PREFIX_FILE) --hdr $(GEN_PINS_HDR) > $(GEN_PINS_SRC)
|
||||||
|
|
||||||
$(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c
|
$(BUILD)/pins_gen.o: $(BUILD)/pins_gen.c
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
#include "clock_config.h"
|
#include "clock_config.h"
|
||||||
#include "modmachine.h"
|
#include "modmachine.h"
|
||||||
|
|
||||||
volatile uint32_t systick_ms = 0;
|
|
||||||
|
|
||||||
const uint8_t dcd_data[] = { 0x00 };
|
const uint8_t dcd_data[] = { 0x00 };
|
||||||
|
|
||||||
|
@ -85,6 +84,11 @@ void board_init(void) {
|
||||||
|
|
||||||
// PIT
|
// PIT
|
||||||
machine_timer_init_PIT();
|
machine_timer_init_PIT();
|
||||||
|
|
||||||
|
// SDCard
|
||||||
|
#if MICROPY_PY_MACHINE_SDCARD
|
||||||
|
machine_sdcard_init0();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void USB_OTG1_IRQHandler(void) {
|
void USB_OTG1_IRQHandler(void) {
|
||||||
|
|
|
@ -2,6 +2,7 @@ MCU_SERIES = MIMXRT1011
|
||||||
MCU_VARIANT = MIMXRT1011DAE5A
|
MCU_VARIANT = MIMXRT1011DAE5A
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = single
|
MICROPY_FLOAT_IMPL = single
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 0
|
||||||
|
|
||||||
SRC_C += \
|
SRC_C += \
|
||||||
hal/flexspi_nor_flash.c \
|
hal/flexspi_nor_flash.c \
|
||||||
|
|
|
@ -64,3 +64,15 @@
|
||||||
{ IOMUXC_GPIO_AD_B1_08_LPI2C2_SCL }, { IOMUXC_GPIO_AD_B1_09_LPI2C2_SDA }, \
|
{ IOMUXC_GPIO_AD_B1_08_LPI2C2_SCL }, { IOMUXC_GPIO_AD_B1_09_LPI2C2_SDA }, \
|
||||||
{ 0 }, { 0 }, \
|
{ 0 }, { 0 }, \
|
||||||
{ IOMUXC_GPIO_SD_B1_02_LPI2C4_SCL }, { IOMUXC_GPIO_SD_B1_03_LPI2C4_SDA },
|
{ 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 },\
|
||||||
|
}
|
||||||
|
|
|
@ -2,9 +2,7 @@ MCU_SERIES = MIMXRT1021
|
||||||
MCU_VARIANT = MIMXRT1021DAG5A
|
MCU_VARIANT = MIMXRT1021DAG5A
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c \
|
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1020-EVK/
|
JLINK_PATH ?= /media/RT1020-EVK/
|
||||||
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
||||||
|
@ -16,6 +14,8 @@ else
|
||||||
JLINK_CONNECTION_SETTINGS =
|
JLINK_CONNECTION_SETTINGS =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_nor_flash.c
|
||||||
|
|
||||||
deploy_jlink: $(BUILD)/firmware.hex
|
deploy_jlink: $(BUILD)/firmware.hex
|
||||||
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
$(ECHO) "ExitOnError 1" > $(JLINK_COMMANDER_SCRIPT)
|
||||||
|
|
|
@ -54,3 +54,15 @@
|
||||||
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
|
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
|
||||||
{ 0 }, { 0 }, \
|
{ 0 }, { 0 }, \
|
||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
{ 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 },\
|
||||||
|
}
|
||||||
|
|
|
@ -2,11 +2,12 @@ MCU_SERIES = MIMXRT1052
|
||||||
MCU_VARIANT = MIMXRT1052DVL6B
|
MCU_VARIANT = MIMXRT1052DVL6B
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c \
|
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1050-EVK/
|
JLINK_PATH ?= /media/RT1050-EVK/
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.bin
|
deploy: $(BUILD)/firmware.bin
|
||||||
cp $< $(JLINK_PATH)
|
cp $< $(JLINK_PATH)
|
||||||
|
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_nor_flash.c
|
||||||
|
|
|
@ -56,7 +56,6 @@
|
||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
||||||
|
|
||||||
#define USDHC_DUMMY_PIN NULL , 0
|
#define USDHC_DUMMY_PIN NULL , 0
|
||||||
|
|
||||||
#define MICROPY_USDHC1 \
|
#define MICROPY_USDHC1 \
|
||||||
{ \
|
{ \
|
||||||
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
.cmd = {GPIO_SD_B0_00_USDHC1_CMD}, \
|
||||||
|
|
|
@ -2,11 +2,12 @@ MCU_SERIES = MIMXRT1052
|
||||||
MCU_VARIANT = MIMXRT1052DVL6B
|
MCU_VARIANT = MIMXRT1052DVL6B
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_hyper_flash.c \
|
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1050-EVKB/
|
JLINK_PATH ?= /media/RT1050-EVKB/
|
||||||
|
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_hyper_flash.c
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.bin
|
deploy: $(BUILD)/firmware.bin
|
||||||
cp $< $(JLINK_PATH)
|
cp $< $(JLINK_PATH)
|
||||||
|
|
|
@ -54,3 +54,15 @@
|
||||||
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
|
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
|
||||||
{ 0 }, { 0 }, \
|
{ 0 }, { 0 }, \
|
||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
{ 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 },\
|
||||||
|
}
|
||||||
|
|
|
@ -2,9 +2,7 @@ MCU_SERIES = MIMXRT1062
|
||||||
MCU_VARIANT = MIMXRT1062DVJ6A
|
MCU_VARIANT = MIMXRT1062DVJ6A
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_hyper_flash.c \
|
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1060-EVK/
|
JLINK_PATH ?= /media/RT1060-EVK/
|
||||||
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
JLINK_COMMANDER_SCRIPT = $(BUILD)/script.jlink
|
||||||
|
@ -16,6 +14,8 @@ else
|
||||||
JLINK_CONNECTION_SETTINGS = -USB
|
JLINK_CONNECTION_SETTINGS = -USB
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_hyper_flash.c
|
||||||
|
|
||||||
deploy_jlink: $(BUILD)/firmware.hex
|
deploy_jlink: $(BUILD)/firmware.hex
|
||||||
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
|
$(Q)$(TOUCH) $(JLINK_COMMANDER_SCRIPT)
|
||||||
|
|
|
@ -52,3 +52,15 @@
|
||||||
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
|
{ IOMUXC_GPIO_AD_B1_00_LPI2C1_SCL }, { IOMUXC_GPIO_AD_B1_01_LPI2C1_SDA }, \
|
||||||
{ 0 }, { 0 }, \
|
{ 0 }, { 0 }, \
|
||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA },
|
{ 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 },\
|
||||||
|
}
|
||||||
|
|
|
@ -2,9 +2,7 @@ MCU_SERIES = MIMXRT1064
|
||||||
MCU_VARIANT = MIMXRT1064DVL6A
|
MCU_VARIANT = MIMXRT1064DVL6A
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_hyper_flash.c \
|
|
||||||
|
|
||||||
JLINK_PATH ?= /media/RT1064-EVK/
|
JLINK_PATH ?= /media/RT1064-EVK/
|
||||||
|
|
||||||
|
@ -12,3 +10,6 @@ CFLAGS += -DBOARD_FLASH_SIZE=0x400000
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.bin
|
deploy: $(BUILD)/firmware.bin
|
||||||
cp $< $(JLINK_PATH)
|
cp $< $(JLINK_PATH)
|
||||||
|
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_hyper_flash.c
|
||||||
|
|
|
@ -57,3 +57,15 @@
|
||||||
{ 0 }, { 0 }, \
|
{ 0 }, { 0 }, \
|
||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA }, \
|
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA }, \
|
||||||
{ IOMUXC_GPIO_AD_B0_12_LPI2C4_SCL }, { IOMUXC_GPIO_AD_B0_13_LPI2C4_SDA },
|
{ IOMUXC_GPIO_AD_B0_12_LPI2C4_SCL }, { IOMUXC_GPIO_AD_B0_13_LPI2C4_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 = { USDHC_DUMMY_PIN },\
|
||||||
|
.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 },\
|
||||||
|
}
|
||||||
|
|
|
@ -2,9 +2,10 @@ MCU_SERIES = MIMXRT1062
|
||||||
MCU_VARIANT = MIMXRT1062DVJ6A
|
MCU_VARIANT = MIMXRT1062DVJ6A
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c \
|
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.hex
|
deploy: $(BUILD)/firmware.hex
|
||||||
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
||||||
|
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_nor_flash.c
|
||||||
|
|
|
@ -32,12 +32,12 @@ D30,GPIO_EMC_37
|
||||||
D31,GPIO_EMC_36
|
D31,GPIO_EMC_36
|
||||||
D32,GPIO_B0_12
|
D32,GPIO_B0_12
|
||||||
D33,GPIO_EMC_07
|
D33,GPIO_EMC_07
|
||||||
DAT1,GPIO_AD_B0_03
|
CMD,GPIO_SD_B0_00
|
||||||
DAT0,GPIO_AD_B0_02
|
CLK,GPIO_SD_B0_01
|
||||||
CLK,GPIO_AD_B0_01
|
DAT0,GPIO_SD_B0_02
|
||||||
CMD,GPIO_ASD_B0_00
|
DAT1,GPIO_SD_B0_03
|
||||||
DAT3,GPIO_SD_B0_05
|
|
||||||
DAT2,GPIO_SD_B0_04
|
DAT2,GPIO_SD_B0_04
|
||||||
|
DAT3,GPIO_SD_B0_05
|
||||||
A0,GPIO_AD_B1_02
|
A0,GPIO_AD_B1_02
|
||||||
A1,GPIO_AD_B1_03
|
A1,GPIO_AD_B1_03
|
||||||
A2,GPIO_AD_B1_07
|
A2,GPIO_AD_B1_07
|
||||||
|
|
|
|
@ -57,3 +57,15 @@
|
||||||
{ 0 }, { 0 }, \
|
{ 0 }, { 0 }, \
|
||||||
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA }, \
|
{ IOMUXC_GPIO_AD_B1_07_LPI2C3_SCL }, { IOMUXC_GPIO_AD_B1_06_LPI2C3_SDA }, \
|
||||||
{ IOMUXC_GPIO_AD_B0_12_LPI2C4_SCL }, { IOMUXC_GPIO_AD_B0_13_LPI2C4_SDA },
|
{ IOMUXC_GPIO_AD_B0_12_LPI2C4_SCL }, { IOMUXC_GPIO_AD_B0_13_LPI2C4_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 = { USDHC_DUMMY_PIN },\
|
||||||
|
.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 },\
|
||||||
|
}
|
||||||
|
|
|
@ -2,9 +2,10 @@ MCU_SERIES = MIMXRT1062
|
||||||
MCU_VARIANT = MIMXRT1062DVJ6A
|
MCU_VARIANT = MIMXRT1062DVJ6A
|
||||||
|
|
||||||
MICROPY_FLOAT_IMPL = double
|
MICROPY_FLOAT_IMPL = double
|
||||||
|
MICROPY_PY_MACHINE_SDCARD = 1
|
||||||
SRC_C += \
|
|
||||||
hal/flexspi_nor_flash.c \
|
|
||||||
|
|
||||||
deploy: $(BUILD)/firmware.hex
|
deploy: $(BUILD)/firmware.hex
|
||||||
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
teensy_loader_cli --mcu=imxrt1062 -v -w $<
|
||||||
|
|
||||||
|
SRC_C += \
|
||||||
|
hal/flexspi_nor_flash.c
|
||||||
|
|
|
@ -8,11 +8,22 @@ import sys
|
||||||
import csv
|
import csv
|
||||||
import re
|
import re
|
||||||
|
|
||||||
SUPPORTED_AFS = {"GPIO"}
|
SUPPORTED_AFS = {"GPIO", "USDHC"}
|
||||||
MAX_AF = 10 # AF0 .. AF9
|
MAX_AF = 10 # AF0 .. AF9
|
||||||
ADC_COL = 11
|
ADC_COL = 11
|
||||||
|
|
||||||
|
|
||||||
|
regexes = [
|
||||||
|
r"IOMUXC_(?P<pin>GPIO_SD_B\d_\d\d)_(?P<function>\w+) (?P<muxRegister>\w+), (?P<muxMode>\w+), (?P<inputRegister>\w+), (?P<inputDaisy>\w+), (?P<configRegister>\w+)",
|
||||||
|
r"IOMUXC_(?P<pin>GPIO_AD_B\d_\d\d)_(?P<function>\w+) (?P<muxRegister>\w+), (?P<muxMode>\w+), (?P<inputRegister>\w+), (?P<inputDaisy>\w+), (?P<configRegister>\w+)",
|
||||||
|
r"IOMUXC_(?P<pin>GPIO_EMC_\d\d)_(?P<function>\w+) (?P<muxRegister>\w+), (?P<muxMode>\w+), (?P<inputRegister>\w+), (?P<inputDaisy>\w+), (?P<configRegister>\w+)",
|
||||||
|
r"IOMUXC_(?P<pin>GPIO_B\d_\d\d)_(?P<function>\w+) (?P<muxRegister>\w+), (?P<muxMode>\w+), (?P<inputRegister>\w+), (?P<inputDaisy>\w+), (?P<configRegister>\w+)",
|
||||||
|
r"IOMUXC_(?P<pin>GPIO_\d\d)_(?P<function>\w+) (?P<muxRegister>\w+), (?P<muxMode>\w+), (?P<inputRegister>\w+), (?P<inputDaisy>\w+), (?P<configRegister>\w+)",
|
||||||
|
r"IOMUXC_(?P<pin>GPIO_AD_\d\d)_(?P<function>\w+) (?P<muxRegister>\w+), (?P<muxMode>\w+), (?P<inputRegister>\w+), (?P<inputDaisy>\w+), (?P<configRegister>\w+)",
|
||||||
|
r"IOMUXC_(?P<pin>GPIO_SD_\d\d)_(?P<function>\w+) (?P<muxRegister>\w+), (?P<muxMode>\w+), (?P<inputRegister>\w+), (?P<inputDaisy>\w+), (?P<configRegister>\w+)",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
def parse_pad(pad_str):
|
def parse_pad(pad_str):
|
||||||
"""Parses a string and returns a (port, gpio_bit) tuple."""
|
"""Parses a string and returns a (port, gpio_bit) tuple."""
|
||||||
if len(pad_str) < 4:
|
if len(pad_str) < 4:
|
||||||
|
@ -127,16 +138,18 @@ class AdcFunction(object):
|
||||||
class AlternateFunction(object):
|
class AlternateFunction(object):
|
||||||
"""Holds the information associated with a pins alternate function."""
|
"""Holds the information associated with a pins alternate function."""
|
||||||
|
|
||||||
def __init__(self, idx, af_str):
|
def __init__(self, idx, input_reg, input_daisy, af_str):
|
||||||
self.idx = idx
|
self.idx = idx
|
||||||
self.af_str = af_str
|
self.af_str = af_str
|
||||||
|
self.input_reg = input_reg
|
||||||
|
self.input_daisy = input_daisy
|
||||||
self.instance = self.af_str.split("_")[0]
|
self.instance = self.af_str.split("_")[0]
|
||||||
|
|
||||||
def print(self):
|
def print(self):
|
||||||
"""Prints the C representation of this AF."""
|
"""Prints the C representation of this AF."""
|
||||||
print(
|
print(
|
||||||
" PIN_AF({0}, PIN_AF_MODE_ALT{1}, {2}, {3}),".format(
|
" PIN_AF({0}, PIN_AF_MODE_ALT{1}, {2}, {3}, {4}, {5}),".format(
|
||||||
self.af_str, self.idx, self.instance, "0x10B0U"
|
self.af_str, self.idx, self.input_daisy, self.instance, self.input_reg, "0x10B0U"
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -171,8 +184,26 @@ class Pins(object):
|
||||||
if pin and row[0]: # Only add board pins that have a name
|
if pin and row[0]: # Only add board pins that have a name
|
||||||
self.board_pins.append(NamedPin(row[0], pin.pad, pin.idx))
|
self.board_pins.append(NamedPin(row[0], pin.pad, pin.idx))
|
||||||
|
|
||||||
def parse_af_file(self, filename, pad_col, af_start_col):
|
def parse_af_file(self, filename, iomux_filename, pad_col, af_start_col):
|
||||||
af_end_col = af_start_col + MAX_AF
|
af_end_col = af_start_col + MAX_AF
|
||||||
|
|
||||||
|
iomux_pin_config = dict()
|
||||||
|
|
||||||
|
with open(iomux_filename, "r") as ipt:
|
||||||
|
input_str = ipt.read()
|
||||||
|
for regex in regexes:
|
||||||
|
matches = re.finditer(regex, input_str, re.MULTILINE)
|
||||||
|
|
||||||
|
for match in matches:
|
||||||
|
if match.group("pin") not in iomux_pin_config:
|
||||||
|
iomux_pin_config[match.group("pin")] = {
|
||||||
|
int((match.groupdict()["muxMode"].strip("U")), 16): match.groupdict()
|
||||||
|
}
|
||||||
|
else:
|
||||||
|
iomux_pin_config[match.group("pin")][
|
||||||
|
int((match.groupdict()["muxMode"].strip("U")), 16)
|
||||||
|
] = match.groupdict()
|
||||||
|
|
||||||
with open(filename, "r") as csvfile:
|
with open(filename, "r") as csvfile:
|
||||||
rows = csv.reader(csvfile)
|
rows = csv.reader(csvfile)
|
||||||
header = next(rows)
|
header = next(rows)
|
||||||
|
@ -187,7 +218,16 @@ class Pins(object):
|
||||||
af_idx = 0
|
af_idx = 0
|
||||||
for af_idx, af in enumerate(row[af_start_col:af_end_col]):
|
for af_idx, af in enumerate(row[af_start_col:af_end_col]):
|
||||||
if af and af_supported(af):
|
if af and af_supported(af):
|
||||||
pin.add_af(AlternateFunction(af_idx, af))
|
pin.add_af(
|
||||||
|
AlternateFunction(
|
||||||
|
af_idx,
|
||||||
|
iomux_pin_config[pin.name][af_idx]["inputRegister"].strip("U"),
|
||||||
|
int(
|
||||||
|
iomux_pin_config[pin.name][af_idx]["inputDaisy"].strip("U"), 16
|
||||||
|
),
|
||||||
|
af,
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
pin.parse_adc(row[ADC_COL])
|
pin.parse_adc(row[ADC_COL])
|
||||||
|
|
||||||
|
@ -235,6 +275,33 @@ class Pins(object):
|
||||||
hdr_file.write("extern const mp_obj_dict_t machine_pin_cpu_pins_locals_dict;\n")
|
hdr_file.write("extern const mp_obj_dict_t machine_pin_cpu_pins_locals_dict;\n")
|
||||||
hdr_file.write("extern const mp_obj_dict_t machine_pin_board_pins_locals_dict;\n")
|
hdr_file.write("extern const mp_obj_dict_t machine_pin_board_pins_locals_dict;\n")
|
||||||
|
|
||||||
|
hdr_file.write("\n// Defines\n")
|
||||||
|
usdhc_instance_factory(self.cpu_pins, hdr_file)
|
||||||
|
|
||||||
|
|
||||||
|
def usdhc_instance_factory(pins, output_file):
|
||||||
|
usdhc_pins = filter(lambda p: any([af for af in p.alt_fn if "USDHC" in af.af_str]), pins)
|
||||||
|
|
||||||
|
usdhc_instances = dict()
|
||||||
|
for pin in usdhc_pins:
|
||||||
|
for idx, alt_fn in enumerate(pin.alt_fn):
|
||||||
|
if "USDHC" in alt_fn.instance:
|
||||||
|
format_string = "#define {0}_{1} &pin_{0}, {2}"
|
||||||
|
if alt_fn.instance not in usdhc_instances:
|
||||||
|
usdhc_instances[alt_fn.instance] = [
|
||||||
|
format_string.format(pin.name, alt_fn.af_str, idx)
|
||||||
|
]
|
||||||
|
else:
|
||||||
|
usdhc_instances[alt_fn.instance].append(
|
||||||
|
format_string.format(pin.name, alt_fn.af_str, idx)
|
||||||
|
)
|
||||||
|
|
||||||
|
for k, v in usdhc_instances.items():
|
||||||
|
output_file.write(f"// {k}\n")
|
||||||
|
output_file.write(f"#define {k}_AVAIL (1)\n")
|
||||||
|
for i in v:
|
||||||
|
output_file.write(i + "\n")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
|
@ -249,6 +316,13 @@ def main():
|
||||||
help="Specifies the alternate function file for the chip",
|
help="Specifies the alternate function file for the chip",
|
||||||
default="mimxrt1021_af.csv",
|
default="mimxrt1021_af.csv",
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-i",
|
||||||
|
"--iomux",
|
||||||
|
dest="iomux_filename",
|
||||||
|
help="Specifies the fsl_iomux.h file for the chip",
|
||||||
|
default="fsl_iomuxc.h",
|
||||||
|
)
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
"-b",
|
"-b",
|
||||||
"--board",
|
"--board",
|
||||||
|
@ -279,7 +353,7 @@ def main():
|
||||||
|
|
||||||
if args.af_filename:
|
if args.af_filename:
|
||||||
print("// --af {:s}".format(args.af_filename))
|
print("// --af {:s}".format(args.af_filename))
|
||||||
pins.parse_af_file(args.af_filename, 0, 1)
|
pins.parse_af_file(args.af_filename, args.iomux_filename, 0, 1)
|
||||||
|
|
||||||
if args.board_filename:
|
if args.board_filename:
|
||||||
print("// --board {:s}".format(args.board_filename))
|
print("// --board {:s}".format(args.board_filename))
|
||||||
|
|
|
@ -4,12 +4,14 @@
|
||||||
#include "py/mphal.h"
|
#include "py/mphal.h"
|
||||||
#include "pin.h"
|
#include "pin.h"
|
||||||
|
|
||||||
#define PIN_AF(_name, _af_mode, _instance, _pad_config) \
|
#define PIN_AF(_name, _af_mode, _input_daisy, _instance, _input_register, _pad_config) \
|
||||||
{ \
|
{ \
|
||||||
.base = { &machine_pin_af_type }, \
|
.base = { &machine_pin_af_type }, \
|
||||||
.name = MP_QSTR_##_name, \
|
.name = MP_QSTR_##_name, \
|
||||||
.af_mode = (uint32_t)(_af_mode), \
|
.af_mode = (uint32_t)(_af_mode), \
|
||||||
|
.input_daisy = (uint8_t)(_input_daisy), \
|
||||||
.instance = (void *)(_instance), \
|
.instance = (void *)(_instance), \
|
||||||
|
.input_register = (uint32_t)(_input_register), \
|
||||||
.pad_config = (uint32_t)(_pad_config), \
|
.pad_config = (uint32_t)(_pad_config), \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
|
@ -32,3 +34,4 @@
|
||||||
.af_list = (_af_list), \
|
.af_list = (_af_list), \
|
||||||
.adc_list = (_adc_list), \
|
.adc_list = (_adc_list), \
|
||||||
} \
|
} \
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2013, 2014 Damien P. George
|
||||||
|
* Copyright (c) 2021 Robert Hammelrath
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "lib/oofatfs/ff.h"
|
||||||
|
#include "fsl_snvs_lp.h"
|
||||||
|
|
||||||
|
|
||||||
|
MP_WEAK DWORD get_fattime(void) {
|
||||||
|
snvs_lp_srtc_datetime_t srtcDate;
|
||||||
|
|
||||||
|
SNVS_LP_SRTC_GetDatetime(SNVS, &srtcDate);
|
||||||
|
|
||||||
|
return ((srtcDate.year - 1980) << 25) | (srtcDate.month << 21) | (srtcDate.day << 16) |
|
||||||
|
(srtcDate.hour << 11) | ((srtcDate.minute << 5) | (srtcDate.second / 2));
|
||||||
|
}
|
|
@ -0,0 +1,222 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 Philipp Ebensberger
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if MICROPY_PY_MACHINE_SDCARD
|
||||||
|
|
||||||
|
#include "py/runtime.h"
|
||||||
|
#include "py/mperrno.h"
|
||||||
|
#include "extmod/vfs.h"
|
||||||
|
#include "ticks.h"
|
||||||
|
#include "fsl_cache.h"
|
||||||
|
|
||||||
|
#include "sdcard.h"
|
||||||
|
|
||||||
|
|
||||||
|
enum { SDCARD_INIT_ARG_ID };
|
||||||
|
|
||||||
|
|
||||||
|
STATIC const mp_arg_t sdcard_init_allowed_args[] = {
|
||||||
|
[SDCARD_INIT_ARG_ID] = { MP_QSTR_id, MP_ARG_INT, {.u_int = 1} },
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
STATIC void machine_sdcard_init_helper(mimxrt_sdcard_obj_t *self) {
|
||||||
|
sdcard_init(self, 198000000UL); // Initialize SDCard Host with 198MHz base clock
|
||||||
|
sdcard_init_pins(self);
|
||||||
|
|
||||||
|
ticks_delay_us64(2ULL * 1000ULL); // Wait 2ms to allow USDHC signals to settle/debounce
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC mp_obj_t sdcard_obj_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
||||||
|
mp_map_t kw_args;
|
||||||
|
mp_map_init_fixed_table(&kw_args, n_kw, all_args + n_args);
|
||||||
|
|
||||||
|
// Parse args
|
||||||
|
mp_arg_val_t args[MP_ARRAY_SIZE(sdcard_init_allowed_args)];
|
||||||
|
mp_arg_parse_all(n_args, all_args, &kw_args, MP_ARRAY_SIZE(sdcard_init_allowed_args), sdcard_init_allowed_args, args);
|
||||||
|
|
||||||
|
// Extract arguments
|
||||||
|
mp_int_t sdcard_id = args[SDCARD_INIT_ARG_ID].u_int;
|
||||||
|
|
||||||
|
if (!(1 <= sdcard_id && sdcard_id <= MP_ARRAY_SIZE(mimxrt_sdcard_objs))) {
|
||||||
|
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "SDCard(%d) doesn't exist", sdcard_id));
|
||||||
|
}
|
||||||
|
|
||||||
|
mimxrt_sdcard_obj_t *self = &mimxrt_sdcard_objs[(sdcard_id - 1)];
|
||||||
|
|
||||||
|
// Initialize SDCard Host
|
||||||
|
if (!sdcard_state_initialized(self)) {
|
||||||
|
machine_sdcard_init_helper(self);
|
||||||
|
}
|
||||||
|
return MP_OBJ_FROM_PTR(self);
|
||||||
|
}
|
||||||
|
|
||||||
|
// init()
|
||||||
|
STATIC mp_obj_t machine_sdcard_init(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||||
|
mimxrt_sdcard_obj_t *self = MP_OBJ_TO_PTR(pos_args[0]);
|
||||||
|
|
||||||
|
if (!sdcard_state_initialized(self)) {
|
||||||
|
machine_sdcard_init_helper(self);
|
||||||
|
}
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_KW(machine_sdcard_init_obj, 1, machine_sdcard_init);
|
||||||
|
|
||||||
|
// deinit()
|
||||||
|
STATIC mp_obj_t machine_sdcard_deinit(mp_obj_t self_in) {
|
||||||
|
mimxrt_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
sdcard_deinit(self);
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_sdcard_deinit_obj, machine_sdcard_deinit);
|
||||||
|
|
||||||
|
// readblocks(block_num, buf)
|
||||||
|
STATIC mp_obj_t machine_sdcard_readblocks(mp_obj_t self_in, mp_obj_t block_num, mp_obj_t buf) {
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
mimxrt_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
mp_get_buffer_raise(buf, &bufinfo, MP_BUFFER_WRITE);
|
||||||
|
|
||||||
|
if (sdcard_read(self, bufinfo.buf, mp_obj_get_int(block_num), bufinfo.len / SDCARD_DEFAULT_BLOCK_SIZE)) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(0);
|
||||||
|
} else {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(-MP_EIO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_3(machine_sdcard_readblocks_obj, machine_sdcard_readblocks);
|
||||||
|
|
||||||
|
// present()
|
||||||
|
STATIC mp_obj_t machine_sdcard_present(mp_obj_t self_in) {
|
||||||
|
mimxrt_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
return mp_obj_new_bool(sdcard_detect(self));
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_sdcard_present_obj, machine_sdcard_present);
|
||||||
|
|
||||||
|
STATIC mp_obj_t machine_sdcard_info(mp_obj_t self_in) {
|
||||||
|
mimxrt_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
|
||||||
|
if (sdcard_detect(self) && sdcard_state_initialized(self)) {
|
||||||
|
uint32_t log_block_nbr = self->block_count;
|
||||||
|
uint32_t log_block_size = self->block_len;
|
||||||
|
|
||||||
|
mp_obj_t tuple[2] = {
|
||||||
|
mp_obj_new_int_from_ull((uint64_t)log_block_nbr * (uint64_t)log_block_size),
|
||||||
|
mp_obj_new_int_from_uint(log_block_size),
|
||||||
|
};
|
||||||
|
return mp_obj_new_tuple(2, tuple);
|
||||||
|
} else {
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_1(machine_sdcard_info_obj, machine_sdcard_info);
|
||||||
|
|
||||||
|
// writeblocks(block_num, buf)
|
||||||
|
STATIC mp_obj_t machine_sdcard_writeblocks(mp_obj_t self_in, mp_obj_t block_num, mp_obj_t buf) {
|
||||||
|
mp_buffer_info_t bufinfo;
|
||||||
|
mimxrt_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
mp_get_buffer_raise(buf, &bufinfo, MP_BUFFER_WRITE);
|
||||||
|
|
||||||
|
if (sdcard_write(self, bufinfo.buf, mp_obj_get_int(block_num), bufinfo.len / SDCARD_DEFAULT_BLOCK_SIZE)) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(0);
|
||||||
|
} else {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(-MP_EIO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_3(machine_sdcard_writeblocks_obj, machine_sdcard_writeblocks);
|
||||||
|
|
||||||
|
// ioctl(op, arg)
|
||||||
|
STATIC mp_obj_t machine_sdcard_ioctl(mp_obj_t self_in, mp_obj_t cmd_in, mp_obj_t arg_in) {
|
||||||
|
mimxrt_sdcard_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||||
|
mp_int_t cmd = mp_obj_get_int(cmd_in);
|
||||||
|
|
||||||
|
switch (cmd) {
|
||||||
|
case MP_BLOCKDEV_IOCTL_INIT: {
|
||||||
|
if (sdcard_detect(self)) {
|
||||||
|
if (sdcard_power_on(self)) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(0);
|
||||||
|
} else {
|
||||||
|
sdcard_power_off(self);
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(-MP_EIO); // Initialization failed
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(-MP_EIO); // Initialization failed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case MP_BLOCKDEV_IOCTL_DEINIT: {
|
||||||
|
if (sdcard_power_off(self)) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(0);
|
||||||
|
} else {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(-MP_EIO); // Deinitialization failed
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case MP_BLOCKDEV_IOCTL_SYNC: {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(0);
|
||||||
|
}
|
||||||
|
case MP_BLOCKDEV_IOCTL_BLOCK_COUNT: {
|
||||||
|
if (sdcard_state_initialized(self)) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(self->block_count);
|
||||||
|
} else {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(-MP_EIO); // Card not initialized
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case MP_BLOCKDEV_IOCTL_BLOCK_SIZE: {
|
||||||
|
if (sdcard_state_initialized(self)) {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(self->block_len);
|
||||||
|
} else {
|
||||||
|
return MP_OBJ_NEW_SMALL_INT(-MP_EIO); // Card not initialized
|
||||||
|
}
|
||||||
|
}
|
||||||
|
default: // unknown command
|
||||||
|
{
|
||||||
|
return mp_const_none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
STATIC MP_DEFINE_CONST_FUN_OBJ_3(machine_sdcard_ioctl_obj, machine_sdcard_ioctl);
|
||||||
|
|
||||||
|
STATIC const mp_rom_map_elem_t sdcard_locals_dict_table[] = {
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_init), MP_ROM_PTR(&machine_sdcard_init_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&machine_sdcard_deinit_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_present), MP_ROM_PTR(&machine_sdcard_present_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_info), MP_ROM_PTR(&machine_sdcard_info_obj) },
|
||||||
|
// block device protocol
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_readblocks), MP_ROM_PTR(&machine_sdcard_readblocks_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_writeblocks), MP_ROM_PTR(&machine_sdcard_writeblocks_obj) },
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_ioctl), MP_ROM_PTR(&machine_sdcard_ioctl_obj) },
|
||||||
|
};
|
||||||
|
STATIC MP_DEFINE_CONST_DICT(sdcard_locals_dict, sdcard_locals_dict_table);
|
||||||
|
|
||||||
|
const mp_obj_type_t machine_sdcard_type = {
|
||||||
|
{ &mp_type_type },
|
||||||
|
.name = MP_QSTR_SDCard,
|
||||||
|
.make_new = sdcard_obj_make_new,
|
||||||
|
.locals_dict = (mp_obj_dict_t *)&sdcard_locals_dict,
|
||||||
|
};
|
||||||
|
|
||||||
|
void machine_sdcard_init0(void) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MICROPY_PY_MACHINE_SDCARD
|
|
@ -82,6 +82,9 @@ STATIC const mp_rom_map_elem_t machine_module_globals_table[] = {
|
||||||
{ MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&machine_adc_type) },
|
{ MP_ROM_QSTR(MP_QSTR_ADC), MP_ROM_PTR(&machine_adc_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&machine_timer_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Timer), MP_ROM_PTR(&machine_timer_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_RTC), MP_ROM_PTR(&machine_rtc_type) },
|
{ MP_ROM_QSTR(MP_QSTR_RTC), MP_ROM_PTR(&machine_rtc_type) },
|
||||||
|
#if MICROPY_PY_MACHINE_SDCARD
|
||||||
|
{ MP_ROM_QSTR(MP_QSTR_SDCard), MP_ROM_PTR(&machine_sdcard_type) },
|
||||||
|
#endif
|
||||||
{ MP_ROM_QSTR(MP_QSTR_Signal), MP_ROM_PTR(&machine_signal_type) },
|
{ MP_ROM_QSTR(MP_QSTR_Signal), MP_ROM_PTR(&machine_signal_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_SoftI2C), MP_ROM_PTR(&mp_machine_soft_i2c_type) },
|
{ MP_ROM_QSTR(MP_QSTR_SoftI2C), MP_ROM_PTR(&mp_machine_soft_i2c_type) },
|
||||||
{ MP_ROM_QSTR(MP_QSTR_SoftSPI), MP_ROM_PTR(&mp_machine_soft_spi_type) },
|
{ MP_ROM_QSTR(MP_QSTR_SoftSPI), MP_ROM_PTR(&mp_machine_soft_spi_type) },
|
||||||
|
|
|
@ -35,9 +35,11 @@ extern const mp_obj_type_t machine_rtc_type;
|
||||||
extern const mp_obj_type_t machine_i2c_type;
|
extern const mp_obj_type_t machine_i2c_type;
|
||||||
extern const mp_obj_type_t machine_spi_type;
|
extern const mp_obj_type_t machine_spi_type;
|
||||||
extern const mp_obj_type_t machine_uart_type;
|
extern const mp_obj_type_t machine_uart_type;
|
||||||
|
extern const mp_obj_type_t machine_sdcard_type;
|
||||||
|
|
||||||
void machine_adc_init(void);
|
void machine_adc_init(void);
|
||||||
void machine_pin_irq_deinit(void);
|
void machine_pin_irq_deinit(void);
|
||||||
void machine_timer_init_PIT(void);
|
void machine_timer_init_PIT(void);
|
||||||
|
void machine_sdcard_init0(void);
|
||||||
|
|
||||||
#endif // MICROPY_INCLUDED_MIMXRT_MODMACHINE_H
|
#endif // MICROPY_INCLUDED_MIMXRT_MODMACHINE_H
|
||||||
|
|
|
@ -3,13 +3,32 @@
|
||||||
# Note: the flash requires the programming size to be aligned to 256 bytes.
|
# Note: the flash requires the programming size to be aligned to 256 bytes.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
import mimxrt
|
import mimxrt
|
||||||
|
from machine import Pin
|
||||||
|
|
||||||
bdev = mimxrt.Flash()
|
bdev = mimxrt.Flash()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
vfs = os.VfsLfs2(bdev, progsize=256)
|
vfs = os.VfsLfs2(bdev, progsize=256)
|
||||||
except:
|
except:
|
||||||
os.VfsLfs2.mkfs(bdev, progsize=256)
|
os.VfsLfs2.mkfs(bdev, progsize=256)
|
||||||
vfs = os.VfsLfs2(bdev, progsize=256)
|
vfs = os.VfsLfs2(bdev, progsize=256)
|
||||||
os.mount(vfs, "/")
|
os.mount(vfs, "/flash")
|
||||||
|
os.chdir("/flash")
|
||||||
|
sys.path.append("/flash")
|
||||||
|
|
||||||
|
# do not mount the SD card if SKIPSD exists.
|
||||||
|
try:
|
||||||
|
os.stat("SKIPSD")
|
||||||
|
except:
|
||||||
|
try:
|
||||||
|
from machine import SDCard
|
||||||
|
|
||||||
|
sdcard = SDCard(1)
|
||||||
|
|
||||||
|
fat = os.VfsFat(sdcard)
|
||||||
|
os.mount(fat, "/sdcard")
|
||||||
|
os.chdir("/sdcard")
|
||||||
|
sys.path.append("/sdcard")
|
||||||
|
except:
|
||||||
|
pass # Fail silently
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "py/objstr.h"
|
#include "py/objstr.h"
|
||||||
#include "py/runtime.h"
|
#include "py/runtime.h"
|
||||||
#include "extmod/vfs.h"
|
#include "extmod/vfs.h"
|
||||||
|
#include "extmod/vfs_fat.h"
|
||||||
#include "extmod/vfs_lfs.h"
|
#include "extmod/vfs_lfs.h"
|
||||||
#include "genhdr/mpversion.h"
|
#include "genhdr/mpversion.h"
|
||||||
#include "fsl_trng.h"
|
#include "fsl_trng.h"
|
||||||
|
|
|
@ -132,6 +132,12 @@ uint32_t trng_random_u32(void);
|
||||||
#define MICROPY_PY_FRAMEBUF (1)
|
#define MICROPY_PY_FRAMEBUF (1)
|
||||||
#define MICROPY_PY_ONEWIRE (1)
|
#define MICROPY_PY_ONEWIRE (1)
|
||||||
|
|
||||||
|
// fatfs configuration used in ffconf.h
|
||||||
|
#define MICROPY_FATFS_ENABLE_LFN (1)
|
||||||
|
#define MICROPY_FATFS_RPATH (2)
|
||||||
|
#define MICROPY_FATFS_MAX_SS (4096)
|
||||||
|
#define MICROPY_FATFS_LFN_CODE_PAGE 437 /* 1=SFN/ANSI 437=LFN/U.S.(OEM) */
|
||||||
|
|
||||||
// Use VfsLfs2's types for fileio/textio
|
// Use VfsLfs2's types for fileio/textio
|
||||||
#define mp_type_fileio mp_type_vfs_lfs2_fileio
|
#define mp_type_fileio mp_type_vfs_lfs2_fileio
|
||||||
#define mp_type_textio mp_type_vfs_lfs2_textio
|
#define mp_type_textio mp_type_vfs_lfs2_textio
|
||||||
|
|
|
@ -58,7 +58,8 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PIN_AF_MODE_ALT1 = 1,
|
PIN_AF_MODE_ALT0 = 0,
|
||||||
|
PIN_AF_MODE_ALT1,
|
||||||
PIN_AF_MODE_ALT2,
|
PIN_AF_MODE_ALT2,
|
||||||
PIN_AF_MODE_ALT3,
|
PIN_AF_MODE_ALT3,
|
||||||
PIN_AF_MODE_ALT4,
|
PIN_AF_MODE_ALT4,
|
||||||
|
@ -97,7 +98,9 @@ typedef struct {
|
||||||
mp_obj_base_t base;
|
mp_obj_base_t base;
|
||||||
qstr name; // port name
|
qstr name; // port name
|
||||||
uint8_t af_mode; // alternate function
|
uint8_t af_mode; // alternate function
|
||||||
|
uint8_t input_daisy;
|
||||||
void *instance; // pointer to peripheral instance for alternate function
|
void *instance; // pointer to peripheral instance for alternate function
|
||||||
|
uint32_t input_register;
|
||||||
uint32_t pad_config; // pad configuration for alternate function
|
uint32_t pad_config; // pad configuration for alternate function
|
||||||
} machine_pin_af_obj_t;
|
} machine_pin_af_obj_t;
|
||||||
|
|
||||||
|
|
Plik diff jest za duży
Load Diff
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* This file is part of the MicroPython project, http://micropython.org/
|
||||||
|
*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2021 Philipp Ebensberger
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MICROPY_INCLUDED_MIMXRT_SDCARD_H
|
||||||
|
#define MICROPY_INCLUDED_MIMXRT_SDCARD_H
|
||||||
|
|
||||||
|
#include "modmachine.h"
|
||||||
|
#include "pin.h"
|
||||||
|
#include "fsl_usdhc.h"
|
||||||
|
|
||||||
|
// ---
|
||||||
|
// SD Card public defines
|
||||||
|
// ---
|
||||||
|
#define SDCARD_DEFAULT_BLOCK_SIZE (512U)
|
||||||
|
#define SDCARD_CLOCK_400KHZ (400000U)
|
||||||
|
#define SDCARD_CLOCK_25MHZ (25000000U)
|
||||||
|
#define SDCARD_CLOCK_50MHZ (50000000U)
|
||||||
|
|
||||||
|
typedef struct _mimxrt_sdcard_pin_t {
|
||||||
|
const machine_pin_obj_t *pin;
|
||||||
|
uint8_t af_idx;
|
||||||
|
} mimxrt_sdcard_pin_t;
|
||||||
|
|
||||||
|
typedef struct _mimxrt_sdcard_obj_pins_t {
|
||||||
|
mimxrt_sdcard_pin_t cmd;
|
||||||
|
mimxrt_sdcard_pin_t clk;
|
||||||
|
mimxrt_sdcard_pin_t cd_b;
|
||||||
|
mimxrt_sdcard_pin_t data0;
|
||||||
|
mimxrt_sdcard_pin_t data1;
|
||||||
|
mimxrt_sdcard_pin_t data2;
|
||||||
|
mimxrt_sdcard_pin_t data3;
|
||||||
|
} mimxrt_sdcard_obj_pins_t;
|
||||||
|
|
||||||
|
typedef volatile struct _mimxrt_sdcard_status_obj_t {
|
||||||
|
bool initialized;
|
||||||
|
bool inserted;
|
||||||
|
} mimxrt_sdcard_status_obj_t;
|
||||||
|
|
||||||
|
typedef struct _mimxrt_sdcard_obj_t {
|
||||||
|
mp_obj_base_t base;
|
||||||
|
USDHC_Type *usdhc_inst;
|
||||||
|
usdhc_handle_t handle;
|
||||||
|
mimxrt_sdcard_status_obj_t *state;
|
||||||
|
uint16_t block_len;
|
||||||
|
uint32_t base_clk;
|
||||||
|
uint32_t bus_clk;
|
||||||
|
uint32_t rca;
|
||||||
|
uint32_t block_count;
|
||||||
|
uint32_t status;
|
||||||
|
uint32_t oper_cond;
|
||||||
|
const mimxrt_sdcard_obj_pins_t *pins;
|
||||||
|
} mimxrt_sdcard_obj_t;
|
||||||
|
|
||||||
|
// ---
|
||||||
|
// SD Card object instances
|
||||||
|
// ---
|
||||||
|
#if MICROPY_PY_MACHINE_SDCARD && (defined MICROPY_USDHC1 || defined MICROPY_USDHC2)
|
||||||
|
enum {
|
||||||
|
#if defined MICROPY_USDHC1 && USDHC1_AVAIL
|
||||||
|
SDCARD_OBJ_USDHC1_IDX,
|
||||||
|
#endif
|
||||||
|
#if defined MICROPY_USDHC2 && USDHC2_AVAIL
|
||||||
|
SDCARD_OBJ_USDHC2_IDX,
|
||||||
|
#endif
|
||||||
|
SDCARD_OBJ_USDHC_N
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
extern mimxrt_sdcard_obj_t mimxrt_sdcard_objs[SDCARD_OBJ_USDHC_N];
|
||||||
|
|
||||||
|
// ---
|
||||||
|
// SD Card functions
|
||||||
|
// ---
|
||||||
|
void sdcard_init(mimxrt_sdcard_obj_t *card, uint32_t base_clk);
|
||||||
|
void sdcard_deinit(mimxrt_sdcard_obj_t *card);
|
||||||
|
void sdcard_init_pins(mimxrt_sdcard_obj_t *card);
|
||||||
|
bool sdcard_read(mimxrt_sdcard_obj_t *card, uint8_t *buffer, uint32_t block_num, uint32_t block_count);
|
||||||
|
bool sdcard_write(mimxrt_sdcard_obj_t *card, uint8_t *buffer, uint32_t block_num, uint32_t block_count);
|
||||||
|
bool sdcard_set_active(mimxrt_sdcard_obj_t *card);
|
||||||
|
bool sdcard_volt_validation(mimxrt_sdcard_obj_t *card);
|
||||||
|
bool sdcard_power_on(mimxrt_sdcard_obj_t *self);
|
||||||
|
bool sdcard_power_off(mimxrt_sdcard_obj_t *self);
|
||||||
|
bool sdcard_detect(mimxrt_sdcard_obj_t *self);
|
||||||
|
|
||||||
|
static inline bool sdcard_state_initialized(mimxrt_sdcard_obj_t *card) {
|
||||||
|
return card->state->initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // MICROPY_INCLUDED_MIMXRT_SDCARD_H
|
Ładowanie…
Reference in New Issue