diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..b90ae05 --- /dev/null +++ b/.clang-format @@ -0,0 +1,12 @@ +BasedOnStyle: Google +IndentWidth: 4 +AlignConsecutiveMacros: Consecutive +AlignConsecutiveDeclarations: Consecutive +AlignConsecutiveAssignments: Consecutive +BreakBeforeBraces: Custom +IndentGotoLabels: false +BraceWrapping: + AfterEnum: false + AfterStruct: false + SplitEmptyFunction: false +ColumnLimit: 120 diff --git a/.clang-tidy b/.clang-tidy new file mode 100644 index 0000000..ae0153a --- /dev/null +++ b/.clang-tidy @@ -0,0 +1,147 @@ +# Generated from CLion Inspection settings +--- +Checks: '-*, +bugprone-argument-comment, +bugprone-assert-side-effect, +bugprone-bad-signal-to-kill-thread, +bugprone-branch-clone, +bugprone-copy-constructor-init, +bugprone-dangling-handle, +bugprone-dynamic-static-initializers, +bugprone-fold-init-type, +bugprone-forward-declaration-namespace, +bugprone-forwarding-reference-overload, +bugprone-inaccurate-erase, +bugprone-incorrect-roundings, +bugprone-integer-division, +bugprone-lambda-function-name, +bugprone-macro-parentheses, +bugprone-macro-repeated-side-effects, +bugprone-misplaced-operator-in-strlen-in-alloc, +bugprone-misplaced-pointer-arithmetic-in-alloc, +bugprone-misplaced-widening-cast, +bugprone-move-forwarding-reference, +bugprone-multiple-statement-macro, +bugprone-no-escape, +bugprone-not-null-terminated-result, +bugprone-parent-virtual-call, +bugprone-posix-return, +bugprone-reserved-identifier, +bugprone-sizeof-container, +bugprone-sizeof-expression, +bugprone-spuriously-wake-up-functions, +bugprone-string-constructor, +bugprone-string-integer-assignment, +bugprone-string-literal-with-embedded-nul, +bugprone-suspicious-enum-usage, +bugprone-suspicious-include, +bugprone-suspicious-memory-comparison, +bugprone-suspicious-memset-usage, +bugprone-suspicious-missing-comma, +bugprone-suspicious-semicolon, +bugprone-suspicious-string-compare, +bugprone-swapped-arguments, +bugprone-terminating-continue, +bugprone-throw-keyword-missing, +bugprone-too-small-loop-variable, +bugprone-undefined-memory-manipulation, +bugprone-undelegated-constructor, +bugprone-unhandled-self-assignment, +bugprone-unused-raii, +bugprone-unused-return-value, +bugprone-use-after-move, +bugprone-virtual-near-miss, +cert-dcl21-cpp, +cert-dcl58-cpp, +cert-err34-c, +cert-err52-cpp, +cert-err60-cpp, +cert-flp30-c, +cert-msc50-cpp, +cert-msc51-cpp, +cert-str34-c, +cppcoreguidelines-interfaces-global-init, +cppcoreguidelines-narrowing-conversions, +cppcoreguidelines-pro-type-member-init, +cppcoreguidelines-pro-type-static-cast-downcast, +cppcoreguidelines-slicing, +google-default-arguments, +google-explicit-constructor, +google-runtime-operator, +hicpp-exception-baseclass, +hicpp-multiway-paths-covered, +misc-misplaced-const, +misc-new-delete-overloads, +misc-no-recursion, +misc-non-copyable-objects, +misc-throw-by-value-catch-by-reference, +misc-unconventional-assign-operator, +misc-uniqueptr-reset-release, +modernize-avoid-bind, +modernize-concat-nested-namespaces, +modernize-deprecated-headers, +modernize-deprecated-ios-base-aliases, +modernize-loop-convert, +modernize-make-shared, +modernize-make-unique, +modernize-pass-by-value, +modernize-raw-string-literal, +modernize-redundant-void-arg, +modernize-replace-auto-ptr, +modernize-replace-disallow-copy-and-assign-macro, +modernize-replace-random-shuffle, +modernize-return-braced-init-list, +modernize-shrink-to-fit, +modernize-unary-static-assert, +modernize-use-auto, +modernize-use-bool-literals, +modernize-use-emplace, +modernize-use-equals-default, +modernize-use-equals-delete, +modernize-use-nodiscard, +modernize-use-noexcept, +modernize-use-nullptr, +modernize-use-override, +modernize-use-transparent-functors, +modernize-use-uncaught-exceptions, +mpi-buffer-deref, +mpi-type-mismatch, +openmp-use-default-none, +performance-faster-string-find, +performance-for-range-copy, +performance-implicit-conversion-in-loop, +performance-inefficient-algorithm, +performance-inefficient-string-concatenation, +performance-inefficient-vector-operation, +performance-move-const-arg, +performance-move-constructor-init, +performance-no-automatic-move, +performance-noexcept-move-constructor, +performance-trivially-destructible, +performance-type-promotion-in-math-fn, +performance-unnecessary-copy-initialization, +performance-unnecessary-value-param, +portability-simd-intrinsics, +readability-avoid-const-params-in-decls, +readability-const-return-type, +readability-container-size-empty, +readability-convert-member-functions-to-static, +readability-delete-null-pointer, +readability-deleted-default, +readability-inconsistent-declaration-parameter-name, +readability-make-member-function-const, +readability-misleading-indentation, +readability-misplaced-array-index, +readability-non-const-parameter, +readability-redundant-control-flow, +readability-redundant-declaration, +readability-redundant-function-ptr-dereference, +readability-redundant-smartptr-get, +readability-redundant-string-cstr, +readability-redundant-string-init, +readability-simplify-subscript-expr, +readability-static-accessed-through-instance, +readability-static-definition-in-anonymous-namespace, +readability-string-compare, +readability-uniqueptr-delete-release, +readability-use-anyofallof' \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 01dbdb2..0c5636a 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "SDK"] path = SDK url = https://git.minori.work/Embedded_SDK/MCUXpresso_LPC55S69.git +[submodule "lib/flac"] + path = lib/flac + url = https://github.com/xiph/flac.git diff --git a/CMakeLists.txt b/CMakeLists.txt index 96c4342..7b666f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,15 +1,17 @@ cmake_minimum_required(VERSION 3.10) -project(lpcxpresso_55s69_template) +project(lpcxpresso_55s69_player) enable_language(CXX) enable_language(ASM) # Different linker scripts -set(TARGET_LDSCRIPT_FLASH "${CMAKE_SOURCE_DIR}/SDK/devices/LPC55S69/gcc/LPC55S69_cm33_core0_flash.ld") +set(TARGET_LDSCRIPT_FLASH "${CMAKE_SOURCE_DIR}/app_flash.ld") set(TARGET_LDSCRIPT_RAM "${CMAKE_SOURCE_DIR}/SDK/devices/LPC55S69/gcc/LPC55S69_cm33_core0_ram.ld") set(TARGET_SOURCES + "SDK/components/lists/fsl_component_generic_list.c" + "SDK/components/osa/fsl_os_abstraction_bm.c" "SDK/components/serial_manager/fsl_component_serial_manager.c" "SDK/components/serial_manager/fsl_component_serial_port_uart.c" "SDK/components/uart/fsl_adapter_usart.c" @@ -56,10 +58,22 @@ set(TARGET_SOURCES "SDK/devices/LPC55S69/system_LPC55S69_cm33_core0.c" "SDK/devices/LPC55S69/utilities/debug_console/fsl_debug_console.c" "SDK/devices/LPC55S69/utilities/str/fsl_str.c" + "SDK/middleware/fatfs/source/fsl_sd_disk/fsl_sd_disk.c" + "SDK/middleware/fatfs/source/diskio.c" + "SDK/middleware/fatfs/source/ff.c" + "SDK/middleware/fatfs/source/ffsystem.c" + "SDK/middleware/fatfs/source/ffunicode.c" + "SDK/middleware/sdmmc/common/fsl_sdmmc_common.c" + "SDK/middleware/sdmmc/host/sdif/non_blocking/fsl_sdmmc_host.c" + "SDK/middleware/sdmmc/sd/fsl_sd.c" + "SDK/middleware/sdmmc/osa/fsl_sdmmc_osa.c" + "SDK/devices/LPC55S69/utilities/fsl_sbrk.c" "board/board.c" "board/clock_config.c" "board/peripherals.c" "board/pin_mux.c" + "board/sdmmc_config.c" + "src/app_flac_callbacks.c" "src/main.c" ) @@ -67,24 +81,35 @@ set(TARGET_C_DEFINES "CPU_LPC55S69JBD100_cm33_core0" "FFR_INCLUDE=\"fsl_iap_ffr.h\"" "MCUXPRESSO_SDK" + "SD_ENABLED" "SERIAL_PORT_TYPE_UART=1" "__STARTUP_CLEAR_BSS" ) set(TARGET_C_INCLUDES "SDK/CMSIS/Core/Include" + "SDK/components/lists" + "SDK/components/osa" "SDK/components/serial_manager" "SDK/components/uart" "SDK/devices/LPC55S69" "SDK/devices/LPC55S69/drivers" "SDK/devices/LPC55S69/utilities/debug_console" "SDK/devices/LPC55S69/utilities/str" + "SDK/middleware/fatfs/source" + "SDK/middleware/fatfs/source/fsl_sd_disk" + "SDK/middleware/sdmmc/common" + "SDK/middleware/sdmmc/host/sdif" + "SDK/middleware/sdmmc/osa" + "SDK/middleware/sdmmc/sd" "board" "include" ) # Shared libraries linked with application set(TARGET_LIBS + "fro_calib_hardabi" + "FLAC" "c" "m" "nosys" @@ -92,7 +117,7 @@ set(TARGET_LIBS # Shared library and linker script search paths set(TARGET_LIB_DIRECTORIES - + "${CMAKE_SOURCE_DIR}/SDK/devices/LPC55S69/gcc" ) # Device specific settings, goes to CFLAGS and LDFLAGS @@ -116,6 +141,9 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TARGET_CFLAGS_HARDWARE} -Wall - set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CMAKE_C_FLAGS} -x assembler-with-cpp") set(CMAKE_EXE_LINKER_FLAGS "-specs=nano.specs -specs=nosys.specs -Wl,--gc-sections -Wl,--print-memory-usage -Wl,--no-warn-rwx-segments") +# Sub directories +set(WITH_OGG OFF CACHE BOOL "" FORCE) +add_subdirectory(lib/flac) # Shared sources, includes and definitions add_compile_definitions(${TARGET_C_DEFINES}) diff --git a/LPCXpresso55S69.mex b/LPCXpresso55S69.mex index d0fd199..cdbbd3a 100644 --- a/LPCXpresso55S69.mex +++ b/LPCXpresso55S69.mex @@ -1,5 +1,5 @@ - + LPC55S69 LPC55S69JBD100 @@ -20,13 +20,13 @@ false - + - 11.0.1 + 12.0.0 @@ -516,15 +516,45 @@ + + Configures pin routing and optionally pin electrical features. + + true + cm33_core0 + true + + + + + true + + + + + true + + + + + + + + + + + + + + - + - 11.0.1 + 12.0.0 @@ -541,6 +571,16 @@ true + + + true + + + + + true + + true @@ -573,6 +613,16 @@ true + + + true + + + + + true + + true @@ -630,6 +680,16 @@ true + + + true + + + + + true + + true @@ -693,6 +753,16 @@ true + + + true + + + + + true + + true @@ -737,7 +807,7 @@ - 11.0.1 + 12.0.0 diff --git a/SDK b/SDK new file mode 160000 index 0000000..4426225 --- /dev/null +++ b/SDK @@ -0,0 +1 @@ +Subproject commit 442622515005ffb9fd32e59d3fbd470f0f67550b diff --git a/app_flash.ld b/app_flash.ld new file mode 100644 index 0000000..1b784ab --- /dev/null +++ b/app_flash.ld @@ -0,0 +1,4 @@ +__stack_size__ = 0x08000; +__heap_size__ = 0x20000; + +INCLUDE LPC55S69_cm33_core0_flash.ld \ No newline at end of file diff --git a/board/clock_config.c b/board/clock_config.c index 1595dbb..5f21ddd 100644 --- a/board/clock_config.c +++ b/board/clock_config.c @@ -17,11 +17,11 @@ /* clang-format off */ /* TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* !!GlobalInfo -product: Clocks v9.0 +product: Clocks v10.0 processor: LPC55S69 package_id: LPC55S69JBD100 mcu_data: ksdk2_0 -processor_version: 11.0.1 +processor_version: 12.0.0 board: LPCXpresso55S69 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/ /* clang-format on */ @@ -37,8 +37,6 @@ board: LPCXpresso55S69 /******************************************************************************* * Variables ******************************************************************************/ -/* System clock frequency. */ -extern uint32_t SystemCoreClock; /******************************************************************************* ************************ BOARD_InitBootClocks function ************************ diff --git a/board/peripherals.c b/board/peripherals.c index 439049f..2628636 100644 --- a/board/peripherals.c +++ b/board/peripherals.c @@ -10,7 +10,7 @@ product: Peripherals v11.0 processor: LPC55S69 package_id: LPC55S69JBD100 mcu_data: ksdk2_0 -processor_version: 11.0.1 +processor_version: 12.0.0 board: LPCXpresso55S69 functionalGroups: - name: BOARD_InitPeripherals_cm33_core0 diff --git a/board/pin_mux.c b/board/pin_mux.c index bdfead3..cd728a9 100644 --- a/board/pin_mux.c +++ b/board/pin_mux.c @@ -7,11 +7,11 @@ /* * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* !!GlobalInfo -product: Pins v11.0 +product: Pins v12.0 processor: LPC55S69 package_id: LPC55S69JBD100 mcu_data: ksdk2_0 -processor_version: 11.0.1 +processor_version: 12.0.0 board: LPCXpresso55S69 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** */ @@ -32,6 +32,7 @@ void BOARD_InitBootPins(void) { BOARD_InitDEBUG_UARTPins(); BOARD_InitPins_Core0(); + BOARD_InitSDPins(); } /* clang-format off */ @@ -845,6 +846,195 @@ void BOARD_InitACCELPins(void) /* PORT1 PIN21 (coords: 30) is configured as FC4_RXD_SDA_MOSI_DATA */ IOCON_PinMuxSet(IOCON, BOARD_INITACCELPINS_FC4_I2C_SDA_PORT, BOARD_INITACCELPINS_FC4_I2C_SDA_PIN, FC4_I2C_SDA); } + +/* clang-format off */ +/* + * TEXT BELOW IS USED AS SETTING FOR TOOLS ************************************* +BOARD_InitSDPins: +- options: {callFromInitBoot: 'true', coreID: cm33_core0, enableClock: 'true'} +- pin_list: + - {pin_num: '8', peripheral: SDIF, signal: SD0_CARD_DET, pin_signal: PIO0_17/FC4_SSEL2/SD0_CARD_DET_N/SCT_GPI7/SCT0_OUT0/SD0_CARD_INT_N/PLU_IN2/SECURE_GPIO0_17} + - {pin_num: '6', peripheral: SDIF, signal: SD0_CLK, pin_signal: PIO0_7/FC3_RTS_SCL_SSEL1/SD0_CLK/FC5_SCK/FC1_SCK/SECURE_GPIO0_7} + - {pin_num: '26', peripheral: SDIF, signal: SD0_CMD, pin_signal: PIO0_8/FC3_SSEL3/SD0_CMD/FC5_RXD_SDA_MOSI_DATA/SWO/SECURE_GPIO0_8} + - {pin_num: '70', peripheral: SDIF, signal: 'SD0_D, 0', pin_signal: PIO0_24/FC0_RXD_SDA_MOSI_DATA/SD0_D0/CT_INP8/SCT_GPI0/SECURE_GPIO0_24} + - {pin_num: '79', peripheral: SDIF, signal: 'SD0_D, 1', pin_signal: PIO0_25/FC0_TXD_SCL_MISO_WS/SD0_D1/CT_INP9/SCT_GPI1/SECURE_GPIO0_25} + - {pin_num: '23', peripheral: SDIF, signal: 'SD0_D, 2', pin_signal: PIO0_31/FC0_CTS_SDA_SSEL0/SD0_D2/CTIMER0_MAT1/SCT0_OUT3/SECURE_GPIO0_31/ADC0_3} + - {pin_num: '11', peripheral: SDIF, signal: 'SD0_D, 3', pin_signal: PIO1_0/FC0_RTS_SCL_SSEL1/SD0_D3/CT_INP2/SCT_GPI4/PLU_OUT3/ADC0_11} + - {pin_num: '55', peripheral: SDIF, signal: SD0_POW_EN, pin_signal: PIO0_9/FC3_SSEL2/SD0_POW_EN/FC5_TXD_SCL_MISO_WS/SECURE_GPIO0_9/ACMP0_B} + * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS *********** + */ +/* clang-format on */ + +/* FUNCTION ************************************************************************************************************ + * + * Function Name : BOARD_InitSDPins + * Description : Configures pin routing and optionally pin electrical features. + * + * END ****************************************************************************************************************/ +/* Function assigned for the Cortex-M33 (Core #0) */ +void BOARD_InitSDPins(void) +{ + /* Enables the clock for the I/O controller.: Enable Clock. */ + CLOCK_EnableClock(kCLOCK_Iocon); + + IOCON->PIO[0][17] = ((IOCON->PIO[0][17] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT017 (pin 8) is configured as SD0_CARD_DET_N. */ + | IOCON_PIO_FUNC(PIO0_17_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_17_DIGIMODE_DIGITAL)); + + IOCON->PIO[0][24] = ((IOCON->PIO[0][24] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT024 (pin 70) is configured as SD0_D0. */ + | IOCON_PIO_FUNC(PIO0_24_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_24_DIGIMODE_DIGITAL)); + + IOCON->PIO[0][25] = ((IOCON->PIO[0][25] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT025 (pin 79) is configured as SD0_D1. */ + | IOCON_PIO_FUNC(PIO0_25_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_25_DIGIMODE_DIGITAL)); + + if (Chip_GetVersion()==1) + { + IOCON->PIO[0][31] = ((IOCON->PIO[0][31] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT031 (pin 23) is configured as SD0_D2. */ + | IOCON_PIO_FUNC(PIO0_31_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_31_DIGIMODE_DIGITAL)); + } + else + { + IOCON->PIO[0][31] = ((IOCON->PIO[0][31] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT031 (pin 23) is configured as SD0_D2. */ + | IOCON_PIO_FUNC(PIO0_31_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_31_DIGIMODE_DIGITAL)); + } + + IOCON->PIO[0][7] = ((IOCON->PIO[0][7] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT07 (pin 6) is configured as SD0_CLK. */ + | IOCON_PIO_FUNC(PIO0_7_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_7_DIGIMODE_DIGITAL)); + + IOCON->PIO[0][8] = ((IOCON->PIO[0][8] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT08 (pin 26) is configured as SD0_CMD. */ + | IOCON_PIO_FUNC(PIO0_8_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_8_DIGIMODE_DIGITAL)); + + if (Chip_GetVersion()==1) + { + IOCON->PIO[0][9] = ((IOCON->PIO[0][9] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT09 (pin 55) is configured as SD0_POW_EN. */ + | IOCON_PIO_FUNC(PIO0_9_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_9_DIGIMODE_DIGITAL)); + } + else + { + IOCON->PIO[0][9] = ((IOCON->PIO[0][9] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT09 (pin 55) is configured as SD0_POW_EN. */ + | IOCON_PIO_FUNC(PIO0_9_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO0_9_DIGIMODE_DIGITAL)); + } + + if (Chip_GetVersion()==1) + { + IOCON->PIO[1][0] = ((IOCON->PIO[1][0] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT10 (pin 11) is configured as SD0_D3. */ + | IOCON_PIO_FUNC(PIO1_0_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO1_0_DIGIMODE_DIGITAL)); + } + else + { + IOCON->PIO[1][0] = ((IOCON->PIO[1][0] & + /* Mask bits to zero which are setting */ + (~(IOCON_PIO_FUNC_MASK | IOCON_PIO_DIGIMODE_MASK))) + + /* Selects pin function. + * : PORT10 (pin 11) is configured as SD0_D3. */ + | IOCON_PIO_FUNC(PIO1_0_FUNC_ALT2) + + /* Select Digital mode. + * : Enable Digital mode. + * Digital input is enabled. */ + | IOCON_PIO_DIGIMODE(PIO1_0_DIGIMODE_DIGITAL)); + } +} /*********************************************************************************************************************** * EOF **********************************************************************************************************************/ diff --git a/board/pin_mux.h b/board/pin_mux.h index 1678fa9..dee91c8 100644 --- a/board/pin_mux.h +++ b/board/pin_mux.h @@ -435,6 +435,61 @@ void BOARD_InitI2SPins(void); /* Function assigned for the Cortex-M33 (Core #0) */ void BOARD_InitACCELPins(void); /* Function assigned for the Cortex-M33 (Core #0) */ +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO0_17_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO0_17_FUNC_ALT2 0x02u +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO0_24_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO0_24_FUNC_ALT2 0x02u +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO0_25_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO0_25_FUNC_ALT2 0x02u +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO0_31_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO0_31_FUNC_ALT2 0x02u +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO0_7_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO0_7_FUNC_ALT2 0x02u +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO0_8_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO0_8_FUNC_ALT2 0x02u +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO0_9_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO0_9_FUNC_ALT2 0x02u +/*! + * @brief Select Digital mode.: Enable Digital mode. Digital input is enabled. */ +#define PIO1_0_DIGIMODE_DIGITAL 0x01u +/*! + * @brief Selects pin function.: Alternative connection 2. */ +#define PIO1_0_FUNC_ALT2 0x02u + +/*! + * @brief Configures pin routing and optionally pin electrical features. + * + */ +void BOARD_InitSDPins(void); /* Function assigned for the Cortex-M33 (Core #0) */ + #if defined(__cplusplus) } #endif diff --git a/board/sdmmc_config.c b/board/sdmmc_config.c new file mode 100644 index 0000000..f370491 --- /dev/null +++ b/board/sdmmc_config.c @@ -0,0 +1,69 @@ +/* + * Copyright 2020 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#include "sdmmc_config.h" +#include "fsl_iocon.h" +/******************************************************************************* + * Definitions + ******************************************************************************/ + +/******************************************************************************* + * Prototypes + ******************************************************************************/ +/******************************************************************************* + * Variables + ******************************************************************************/ +/*!brief sdmmc dma buffer */ +SDK_ALIGN(static uint32_t s_sdmmcHostDmaBuffer[BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE], + SDMMCHOST_DMA_DESCRIPTOR_BUFFER_ALIGN_SIZE); +#if defined(SDIO_ENABLED) || defined(SD_ENABLED) +static sd_detect_card_t s_cd; +#endif +static sdmmchost_t s_host; + +/******************************************************************************* + * Code + ******************************************************************************/ +uint32_t BOARD_SDIF0ClockConfiguration(void) +{ + /* attach main clock to SDIF */ + CLOCK_AttachClk(kMAIN_CLK_to_SDIO_CLK); + /* need call this function to clear the halt bit in clock divider register */ + CLOCK_SetClkDiv(kCLOCK_DivSdioClk, (uint32_t)(SystemCoreClock / FSL_FEATURE_SDIF_MAX_SOURCE_CLOCK + 1U), true); + + return CLOCK_GetSdioClkFreq(); +} + +#if defined(SDIO_ENABLED) || defined(SD_ENABLED) +void BOARD_SDCardDetectInit(sd_cd_t cd, void *userData) +{ + /* install card detect callback */ + s_cd.cdDebounce_ms = BOARD_SDMMC_SD_CARD_DETECT_DEBOUNCE_DELAY_MS; + s_cd.type = BOARD_SDMMC_SD_CD_TYPE; + s_cd.callback = cd; + s_cd.userData = userData; +} +#endif + +#ifdef SD_ENABLED +void BOARD_SD_Config(void *card, sd_cd_t cd, uint32_t hostIRQPriority, void *userData) +{ + assert(card); + + s_host.dmaDesBuffer = s_sdmmcHostDmaBuffer; + s_host.dmaDesBufferWordsNum = BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE; + ((sd_card_t *)card)->host = &s_host; + ((sd_card_t *)card)->host->hostController.base = BOARD_SDMMC_SD_HOST_BASEADDR; + ((sd_card_t *)card)->host->hostController.sourceClock_Hz = BOARD_SDIF0ClockConfiguration(); + + ((sd_card_t *)card)->usrParam.cd = &s_cd; + + BOARD_SDCardDetectInit(cd, userData); + + NVIC_SetPriority(BOARD_SDMMC_SD_HOST_IRQ, hostIRQPriority); +} +#endif diff --git a/board/sdmmc_config.h b/board/sdmmc_config.h new file mode 100644 index 0000000..5a40314 --- /dev/null +++ b/board/sdmmc_config.h @@ -0,0 +1,61 @@ +/* + * Copyright 2020-2022 NXP + * All rights reserved. + * + * SPDX-License-Identifier: BSD-3-Clause + */ + +#ifndef _SDMMC_CONFIG_H_ +#define _SDMMC_CONFIG_H_ + +#ifdef SD_ENABLED +#include "fsl_sd.h" +#endif +#ifdef MMC_ENABLED +#include "fsl_mmc.h" +#endif +#include "clock_config.h" +#include "fsl_sdmmc_host.h" +#include "fsl_sdmmc_common.h" + +/******************************************************************************* + * Definitions + ******************************************************************************/ +/* @brief host basic configuration */ +#define BOARD_SDMMC_SD_HOST_BASEADDR SDIF +#define BOARD_SDMMC_SD_HOST_IRQ SDIO_IRQn + +/* @brief card detect configuration */ +#define BOARD_SDMMC_SD_CD_TYPE kSD_DetectCardByHostCD +#define BOARD_SDMMC_SD_CARD_DETECT_DEBOUNCE_DELAY_MS (100U) + +#define BOARD_SDMMC_DATA_BUFFER_ALIGN_SIZE (4U) + +/*!@ brief host interrupt priority*/ +#define BOARD_SDMMC_SD_HOST_IRQ_PRIORITY (5U) +#define BOARD_SDMMC_MMC_HOST_IRQ_PRIORITY (5U) +/*!@brief dma descriptor buffer size */ +#define BOARD_SDMMC_HOST_DMA_DESCRIPTOR_BUFFER_SIZE (0x40U) + +#if defined(__cplusplus) +extern "C" { +#endif /* __cplusplus */ + +/******************************************************************************* + * API + ******************************************************************************/ +/*! + * @brief BOARD SD configurations. + * @param card card descriptor + * @param cd card detect callback + * @param userData user data for callback + */ +#ifdef SD_ENABLED +void BOARD_SD_Config(void *card, sd_cd_t cd, uint32_t hostIRQPriority, void *userData); +#endif + +#if defined(__cplusplus) +} +#endif /* __cplusplus */ + +#endif /* _BOARD_H_ */ diff --git a/include/app_flac_callbacks.h b/include/app_flac_callbacks.h new file mode 100644 index 0000000..73ca7fe --- /dev/null +++ b/include/app_flac_callbacks.h @@ -0,0 +1,25 @@ +#ifndef APP_FLAC_CALLBACKS_H +#define APP_FLAC_CALLBACKS_H + +#include "FLAC/stream_decoder.h" + +typedef struct { + FIL fd; +} app_flac_client_t; + +int app_flac_init(app_flac_client_t *client, const char *filename); +FLAC__StreamDecoderReadStatus app_flac_read(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, + void *client_data); +FLAC__StreamDecoderSeekStatus app_flac_seek(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, + void *client_data); +FLAC__StreamDecoderTellStatus app_flac_tell(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, + void *client_data); +FLAC__StreamDecoderLengthStatus app_flac_length(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, + void *client_data); +FLAC__bool app_flac_eof(const FLAC__StreamDecoder *decoder, void *client_data); +FLAC__StreamDecoderWriteStatus app_flac_write(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, + const FLAC__int32 *const buffer[], void *client_data); +void app_flac_meta(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data); +void app_flac_error(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data); + +#endif \ No newline at end of file diff --git a/include/ffconf.h b/include/ffconf.h new file mode 100644 index 0000000..60e8f3b --- /dev/null +++ b/include/ffconf.h @@ -0,0 +1,311 @@ +#ifndef _FFCONF_H_ +#define _FFCONF_H_ + +/*---------------------------------------------------------------------------/ +/ FatFs Functional Configurations +/---------------------------------------------------------------------------*/ + +#define FFCONF_DEF 86631 /* Revision ID */ + +/*---------------------------------------------------------------------------/ +/ MSDK adaptation configuration +/---------------------------------------------------------------------------*/ +#define SD_DISK_ENABLE + +/*---------------------------------------------------------------------------/ +/ Function Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_READONLY 0 +/* This option switches read-only configuration. (0:Read/Write or 1:Read-only) +/ Read-only configuration removes writing API functions, f_write(), f_sync(), +/ f_unlink(), f_mkdir(), f_chmod(), f_rename(), f_truncate(), f_getfree() +/ and optional writing functions as well. */ + + +#define FF_FS_MINIMIZE 0 +/* This option defines minimization level to remove some basic API functions. +/ +/ 0: Basic functions are fully enabled. +/ 1: f_stat(), f_getfree(), f_unlink(), f_mkdir(), f_truncate() and f_rename() +/ are removed. +/ 2: f_opendir(), f_readdir() and f_closedir() are removed in addition to 1. +/ 3: f_lseek() function is removed in addition to 2. */ + + +#define FF_USE_FIND 0 +/* This option switches filtered directory read functions, f_findfirst() and +/ f_findnext(). (0:Disable, 1:Enable 2:Enable with matching altname[] too) */ + + +#define FF_USE_MKFS 1 +/* This option switches f_mkfs() function. (0:Disable or 1:Enable) */ + + +#define FF_USE_FASTSEEK 0 +/* This option switches fast seek function. (0:Disable or 1:Enable) */ + + +#define FF_USE_EXPAND 0 +/* This option switches f_expand function. (0:Disable or 1:Enable) */ + + +#define FF_USE_CHMOD 0 +/* This option switches attribute manipulation functions, f_chmod() and f_utime(). +/ (0:Disable or 1:Enable) Also FF_FS_READONLY needs to be 0 to enable this option. */ + + +#define FF_USE_LABEL 0 +/* This option switches volume label functions, f_getlabel() and f_setlabel(). +/ (0:Disable or 1:Enable) */ + + +#define FF_USE_FORWARD 0 +/* This option switches f_forward() function. (0:Disable or 1:Enable) */ + + +#define FF_USE_STRFUNC 1 +#define FF_PRINT_LLI 0 +#define FF_PRINT_FLOAT 0 +#define FF_STRF_ENCODE 3 +/* FF_USE_STRFUNC switches string functions, f_gets(), f_putc(), f_puts() and +/ f_printf(). +/ +/ 0: Disable. FF_PRINT_LLI, FF_PRINT_FLOAT and FF_STRF_ENCODE have no effect. +/ 1: Enable without LF-CRLF conversion. +/ 2: Enable with LF-CRLF conversion. +/ +/ FF_PRINT_LLI = 1 makes f_printf() support long long argument and FF_PRINT_FLOAT = 1/2 + makes f_printf() support floating point argument. These features want C99 or later. +/ When FF_LFN_UNICODE >= 1 with LFN enabled, string functions convert the character +/ encoding in it. FF_STRF_ENCODE selects assumption of character encoding ON THE FILE +/ to be read/written via those functions. +/ +/ 0: ANSI/OEM in current CP +/ 1: Unicode in UTF-16LE +/ 2: Unicode in UTF-16BE +/ 3: Unicode in UTF-8 +*/ + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/---------------------------------------------------------------------------*/ + +#define FF_CODE_PAGE 932 +/* This option specifies the OEM code page to be used on the target system. +/ Incorrect code page setting can cause a file open failure. +/ +/ 437 - U.S. +/ 720 - Arabic +/ 737 - Greek +/ 771 - KBL +/ 775 - Baltic +/ 850 - Latin 1 +/ 852 - Latin 2 +/ 855 - Cyrillic +/ 857 - Turkish +/ 860 - Portuguese +/ 861 - Icelandic +/ 862 - Hebrew +/ 863 - Canadian French +/ 864 - Arabic +/ 865 - Nordic +/ 866 - Russian +/ 869 - Greek 2 +/ 932 - Japanese (DBCS) +/ 936 - Simplified Chinese (DBCS) +/ 949 - Korean (DBCS) +/ 950 - Traditional Chinese (DBCS) +/ 0 - Include all code pages above and configured by f_setcp() +*/ + + +#define FF_USE_LFN 2 +#define FF_MAX_LFN 255 +/* The FF_USE_LFN switches the support for LFN (long file name). +/ +/ 0: Disable LFN. FF_MAX_LFN has no effect. +/ 1: Enable LFN with static working buffer on the BSS. Always NOT thread-safe. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ 3: Enable LFN with dynamic working buffer on the HEAP. +/ +/ To enable the LFN, ffunicode.c needs to be added to the project. The LFN function +/ requiers certain internal working buffer occupies (FF_MAX_LFN + 1) * 2 bytes and +/ additional (FF_MAX_LFN + 44) / 15 * 32 bytes when exFAT is enabled. +/ The FF_MAX_LFN defines size of the working buffer in UTF-16 code unit and it can +/ be in range of 12 to 255. It is recommended to be set it 255 to fully support LFN +/ specification. +/ When use stack for the working buffer, take care on stack overflow. When use heap +/ memory for the working buffer, memory management functions, ff_memalloc() and +/ ff_memfree() exemplified in ffsystem.c, need to be added to the project. */ + + +#define FF_LFN_UNICODE 0 +/* This option switches the character encoding on the API when LFN is enabled. +/ +/ 0: ANSI/OEM in current CP (TCHAR = char) +/ 1: Unicode in UTF-16 (TCHAR = WCHAR) +/ 2: Unicode in UTF-8 (TCHAR = char) +/ 3: Unicode in UTF-32 (TCHAR = DWORD) +/ +/ Also behavior of string I/O functions will be affected by this option. +/ When LFN is not enabled, this option has no effect. */ + + +#define FF_LFN_BUF 255 +#define FF_SFN_BUF 12 +/* This set of options defines size of file name members in the FILINFO structure +/ which is used to read out directory items. These values should be suffcient for +/ the file names to read. The maximum possible length of the read file name depends +/ on character encoding. When LFN is not enabled, these options have no effect. */ + + +#define FF_FS_RPATH 2 +/* This option configures support for relative path. +/ +/ 0: Disable relative path and remove related functions. +/ 1: Enable relative path. f_chdir() and f_chdrive() are available. +/ 2: f_getcwd() function is available in addition to 1. +*/ + + +/*---------------------------------------------------------------------------/ +/ Drive/Volume Configurations +/---------------------------------------------------------------------------*/ + +#define FF_VOLUMES 3 +/* Number of volumes (logical drives) to be used. (1-10) */ + + +#define FF_STR_VOLUME_ID 0 +#define FF_VOLUME_STRS "RAM","NAND","CF","SD","SD2","USB","USB2","USB3" +/* FF_STR_VOLUME_ID switches support for volume ID in arbitrary strings. +/ When FF_STR_VOLUME_ID is set to 1 or 2, arbitrary strings can be used as drive +/ number in the path name. FF_VOLUME_STRS defines the volume ID strings for each +/ logical drives. Number of items must not be less than FF_VOLUMES. Valid +/ characters for the volume ID strings are A-Z, a-z and 0-9, however, they are +/ compared in case-insensitive. If FF_STR_VOLUME_ID >= 1 and FF_VOLUME_STRS is +/ not defined, a user defined volume string table needs to be defined as: +/ +/ const char* VolumeStr[FF_VOLUMES] = {"ram","flash","sd","usb",... +*/ + + +#define FF_MULTI_PARTITION 0 +/* This option switches support for multiple volumes on the physical drive. +/ By default (0), each logical drive number is bound to the same physical drive +/ number and only an FAT volume found on the physical drive will be mounted. +/ When this function is enabled (1), each logical drive number can be bound to +/ arbitrary physical drive and partition listed in the VolToPart[]. Also f_fdisk() +/ funciton will be available. */ + + +#define FF_MIN_SS 512 +#define FF_MAX_SS 512 +/* This set of options configures the range of sector size to be supported. (512, +/ 1024, 2048 or 4096) Always set both 512 for most systems, generic memory card and +/ harddisk, but a larger value may be required for on-board flash memory and some +/ type of optical media. When FF_MAX_SS is larger than FF_MIN_SS, FatFs is configured +/ for variable sector size mode and disk_ioctl() function needs to implement +/ GET_SECTOR_SIZE command. */ + + +#define FF_LBA64 0 +/* This option switches support for 64-bit LBA. (0:Disable or 1:Enable) +/ To enable the 64-bit LBA, also exFAT needs to be enabled. (FF_FS_EXFAT == 1) */ + + +#define FF_MIN_GPT 0x10000000 +/* Minimum number of sectors to switch GPT as partitioning format in f_mkfs and +/ f_fdisk function. 0x100000000 max. This option has no effect when FF_LBA64 == 0. */ + + +#define FF_USE_TRIM 0 +/* This option switches support for ATA-TRIM. (0:Disable or 1:Enable) +/ To enable Trim function, also CTRL_TRIM command should be implemented to the +/ disk_ioctl() function. */ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/---------------------------------------------------------------------------*/ + +#define FF_FS_TINY 0 +/* This option switches tiny buffer configuration. (0:Normal or 1:Tiny) +/ At the tiny configuration, size of file object (FIL) is shrinked FF_MAX_SS bytes. +/ Instead of private sector buffer eliminated from the file object, common sector +/ buffer in the filesystem object (FATFS) is used for the file data transfer. */ + + +#define FF_FS_EXFAT 1 +/* This option switches support for exFAT filesystem. (0:Disable or 1:Enable) +/ To enable exFAT, also LFN needs to be enabled. (FF_USE_LFN >= 1) +/ Note that enabling exFAT discards ANSI C (C89) compatibility. */ + + +#define FF_FS_NORTC 1 +#define FF_NORTC_MON 1 +#define FF_NORTC_MDAY 1 +#define FF_NORTC_YEAR 2021 +/* The option FF_FS_NORTC switches timestamp functiton. If the system does not have +/ any RTC function or valid timestamp is not needed, set FF_FS_NORTC = 1 to disable +/ the timestamp function. Every object modified by FatFs will have a fixed timestamp +/ defined by FF_NORTC_MON, FF_NORTC_MDAY and FF_NORTC_YEAR in local time. +/ To enable timestamp function (FF_FS_NORTC = 0), get_fattime() function need to be +/ added to the project to read current time form real-time clock. FF_NORTC_MON, +/ FF_NORTC_MDAY and FF_NORTC_YEAR have no effect. +/ These options have no effect in read-only configuration (FF_FS_READONLY = 1). */ + + +#define FF_FS_NOFSINFO 0 +/* If you need to know correct free space on the FAT32 volume, set bit 0 of this +/ option, and f_getfree() function at first time after volume mount will force +/ a full FAT scan. Bit 1 controls the use of last allocated cluster number. +/ +/ bit0=0: Use free cluster count in the FSINFO if available. +/ bit0=1: Do not trust free cluster count in the FSINFO. +/ bit1=0: Use last allocated cluster number in the FSINFO if available. +/ bit1=1: Do not trust last allocated cluster number in the FSINFO. +*/ + + +#define FF_FS_LOCK 0 +/* The option FF_FS_LOCK switches file lock function to control duplicated file open +/ and illegal operation to open objects. This option must be 0 when FF_FS_READONLY +/ is 1. +/ +/ 0: Disable file lock function. To avoid volume corruption, application program +/ should avoid illegal open, remove and rename to the open objects. +/ >0: Enable file lock function. The value defines how many files/sub-directories +/ can be opened simultaneously under file lock control. Note that the file +/ lock control is independent of re-entrancy. */ + + +/* #include // O/S definitions */ +#define FF_FS_REENTRANT 0 +#define FF_FS_TIMEOUT 1000 +#define FF_SYNC_t HANDLE +/* The option FF_FS_REENTRANT switches the re-entrancy (thread safe) of the FatFs +/ module itself. Note that regardless of this option, file access to different +/ volume is always re-entrant and volume control functions, f_mount(), f_mkfs() +/ and f_fdisk() function, are always not re-entrant. Only file/directory access +/ to the same volume is under control of this function. +/ +/ 0: Disable re-entrancy. FF_FS_TIMEOUT and FF_SYNC_t have no effect. +/ 1: Enable re-entrancy. Also user provided synchronization handlers, +/ ff_req_grant(), ff_rel_grant(), ff_del_syncobj() and ff_cre_syncobj() +/ function, must be added to the project. Samples are available in +/ option/syscall.c. +/ +/ The FF_FS_TIMEOUT defines timeout period in unit of time tick. +/ The FF_SYNC_t defines O/S dependent sync object type. e.g. HANDLE, ID, OS_EVENT*, +/ SemaphoreHandle_t and etc. A header file for O/S definitions needs to be +/ included somewhere in the scope of ff.h. */ + + + +/*--- End of configuration options ---*/ + +#endif /* _FFCONF_H_ */ diff --git a/lib/flac b/lib/flac new file mode 160000 index 0000000..5d1402e --- /dev/null +++ b/lib/flac @@ -0,0 +1 @@ +Subproject commit 5d1402eae30b2daeeb40ecfb8892a98690850829 diff --git a/src/app_flac_callbacks.c b/src/app_flac_callbacks.c new file mode 100644 index 0000000..92893fb --- /dev/null +++ b/src/app_flac_callbacks.c @@ -0,0 +1,109 @@ +#include "fsl_debug_console.h" + +/* FS */ +/* clang-format off */ +#include "ff.h" +#include "diskio.h" +#include "fsl_debug_console.h" +#include "fsl_sd.h" +#include "fsl_sd_disk.h" +#include "sdmmc_config.h" +/* clang-format on */ + +#include "app_flac_callbacks.h" + +/** + * Initialize client data, while opening the file. + * @param client Pointer to the client struct + * @param filename File name to be opened + * @return 0 for success, negative for error. + */ +int app_flac_init(app_flac_client_t *client, const char *filename) { + if (f_open(&client->fd, filename, FA_READ) != FR_OK) { + return -1; + } + + return 0; +} + +FLAC__StreamDecoderReadStatus app_flac_read(const FLAC__StreamDecoder *decoder, FLAC__byte buffer[], size_t *bytes, + void *client_data) { + app_flac_client_t *client = client_data; + + if (*bytes > 0) { + if (f_read(&client->fd, buffer, *bytes, bytes) != FR_OK) { + /* Unexpected error */ + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; + } + + if (*bytes == 0) { + /* EOF reached */ + return FLAC__STREAM_DECODER_READ_STATUS_END_OF_STREAM; + } + + /* More data available */ + return FLAC__STREAM_DECODER_READ_STATUS_CONTINUE; + } + + return FLAC__STREAM_DECODER_READ_STATUS_ABORT; +} + +FLAC__StreamDecoderSeekStatus app_flac_seek(const FLAC__StreamDecoder *decoder, FLAC__uint64 absolute_byte_offset, + void *client_data) { + app_flac_client_t *client = client_data; + + if (f_lseek(&client->fd, (FSIZE_t)absolute_byte_offset) != FR_OK) { + return FLAC__STREAM_DECODER_SEEK_STATUS_ERROR; + } + + return FLAC__STREAM_DECODER_SEEK_STATUS_OK; +} + +FLAC__StreamDecoderTellStatus app_flac_tell(const FLAC__StreamDecoder *decoder, FLAC__uint64 *absolute_byte_offset, + void *client_data) { + app_flac_client_t *client = client_data; + + *absolute_byte_offset = (FLAC__uint64)f_tell(&client->fd); + + return FLAC__STREAM_DECODER_TELL_STATUS_OK; +} + +FLAC__StreamDecoderLengthStatus app_flac_length(const FLAC__StreamDecoder *decoder, FLAC__uint64 *stream_length, + void *client_data) { + app_flac_client_t *client = client_data; + + *stream_length = (FLAC__uint64)f_size(&client->fd); + + return FLAC__STREAM_DECODER_LENGTH_STATUS_OK; +} + +FLAC__bool app_flac_eof(const FLAC__StreamDecoder *decoder, void *client_data) { + app_flac_client_t *client = client_data; + + if (f_eof(&client->fd)) { + return true; + } + + return false; +} + +FLAC__StreamDecoderWriteStatus app_flac_write(const FLAC__StreamDecoder *decoder, const FLAC__Frame *frame, + const FLAC__int32 *const buffer[], void *client_data) { + app_flac_client_t *client = client_data; + + PRINTF("FP: %p, Decoded FLAC block size: %d\r\n", &client->fd, frame->header.blocksize); + + return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; +} + +void app_flac_meta(const FLAC__StreamDecoder *decoder, const FLAC__StreamMetadata *metadata, void *client_data) { + app_flac_client_t *client = client_data; + + PRINTF("FP: %p, meta type: %d\r\n", &client->fd, metadata->type); +} + +void app_flac_error(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorStatus status, void *client_data) { + app_flac_client_t *client = client_data; + + PRINTF("FP: %p, error: %d.\r\n", client, status); +} diff --git a/src/main.c b/src/main.c index 21245ea..cd4e2be 100644 --- a/src/main.c +++ b/src/main.c @@ -3,18 +3,109 @@ #include "peripherals.h" #include "pin_mux.h" +/* FS */ +/* clang-format off */ +#include "ff.h" +#include "diskio.h" #include "fsl_debug_console.h" +#include "fsl_sd.h" +#include "fsl_sd_disk.h" +#include "sdmmc_config.h" +/* clang-format on */ + +#include "app_flac_callbacks.h" + +#define FLAC_FILE_NAME "2:/re_tryment.flac" + +static FATFS s_fs; +static const TCHAR s_drive_num[] = {SDDISK + '0', ':', '/'}; + +static status_t sdcardWaitCardInsert(void); int main(void) { BOARD_InitBootPins(); - BOARD_BootClockFROHF96M(); + BOARD_InitBootClocks(); BOARD_InitBootPeripherals(); BOARD_InitDebugConsole(); PRINTF("Hello world!!\r\n"); - for(;;) { + if (sdcardWaitCardInsert() != kStatus_Success) { + PRINTF("Card detect failed...\r\n"); + goto dead_loop; + } + + PRINTF("SD inserted...\r\n"); + + if (f_mount(&s_fs, s_drive_num, 1U) != FR_OK) { /* Mount immediately */ + PRINTF("Failed to mount filesystem...\r\n"); + goto dead_loop; + } + + PRINTF("FS mounted...\r\n"); + + app_flac_client_t client; + if (app_flac_init(&client, FLAC_FILE_NAME) < 0) { + PRINTF("Open FLAC file failed...\r\n"); + goto dead_loop; + } + + PRINTF("File opened...\r\n"); + + FLAC__StreamDecoder *decoder = FLAC__stream_decoder_new(); + if (decoder == NULL) { + PRINTF("Error allocating decoder...\r\n"); + } + + FLAC__stream_decoder_set_md5_checking(decoder, true); + + FLAC__StreamDecoderInitStatus status = + FLAC__stream_decoder_init_stream(decoder, app_flac_read, app_flac_seek, app_flac_tell, app_flac_length, + app_flac_eof, app_flac_write, app_flac_meta, app_flac_error, &client); + + if (status != FLAC__STREAM_DECODER_INIT_STATUS_OK) { + PRINTF("Stream decoder init failed: %d...\r\n", status); + goto dead_loop; + } + + FLAC__bool ret = FLAC__stream_decoder_process_until_end_of_stream(decoder); + if (ret) { + PRINTF("Processed OK!\r\n"); + } else { + PRINTF("Processed error: %s...\r\n", FLAC__StreamDecoderStateString[FLAC__stream_decoder_get_state(decoder)]); + } + + FLAC__stream_decoder_delete(decoder); + +dead_loop: + for (;;) { __WFI(); } -} \ No newline at end of file + + return 0; +} + +static status_t sdcardWaitCardInsert(void) { + BOARD_SD_Config(&g_sd, NULL, BOARD_SDMMC_SD_HOST_IRQ_PRIORITY, NULL); + + /* SD host init function */ + if (SD_HostInit(&g_sd) != kStatus_Success) { + PRINTF("\r\nSD host init fail\r\n"); + return kStatus_Fail; + } + + /* wait card insert */ + if (SD_PollingCardInsert(&g_sd, kSD_Inserted) == kStatus_Success) { + PRINTF("\r\nCard inserted.\r\n"); + /* power off card */ + SD_SetCardPower(&g_sd, false); + /* power on the card */ + SD_SetCardPower(&g_sd, true); + } else { + PRINTF("\r\nCard detect fail.\r\n"); + return kStatus_Fail; + } + + return kStatus_Success; +}