Merge pull request #4255 from greedyhao/bluetrum
[bsp][bluetrum] add sdio support
This commit is contained in:
commit
e81f1a0eec
|
@ -381,6 +381,7 @@ CONFIG_RT_USING_LIBC=y
|
||||||
# CONFIG_PKG_USING_UC_MODBUS is not set
|
# CONFIG_PKG_USING_UC_MODBUS is not set
|
||||||
# CONFIG_PKG_USING_PPOOL is not set
|
# CONFIG_PKG_USING_PPOOL is not set
|
||||||
# CONFIG_PKG_USING_OPENAMP is not set
|
# CONFIG_PKG_USING_OPENAMP is not set
|
||||||
|
# CONFIG_PKG_USING_RT_PRINTF is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# peripheral libraries and drivers
|
# peripheral libraries and drivers
|
||||||
|
@ -501,11 +502,17 @@ CONFIG_RT_USING_LIBC=y
|
||||||
CONFIG_BSP_USING_USB_TO_USART=y
|
CONFIG_BSP_USING_USB_TO_USART=y
|
||||||
CONFIG_BSP_USING_AUDIO=y
|
CONFIG_BSP_USING_AUDIO=y
|
||||||
CONFIG_BSP_USING_AUDIO_PLAY=y
|
CONFIG_BSP_USING_AUDIO_PLAY=y
|
||||||
|
# CONFIG_BSP_USING_SDCARD is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# On-chip Peripheral Drivers
|
# On-chip Peripheral Drivers
|
||||||
#
|
#
|
||||||
CONFIG_BSP_USING_UART0=y
|
CONFIG_BSP_USING_UART0=y
|
||||||
|
# CONFIG_BSP_USING_SDIO is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# On-chip Peripheral Drivers
|
||||||
|
#
|
||||||
|
|
||||||
#
|
#
|
||||||
# Board extended module Drivers
|
# Board extended module Drivers
|
||||||
|
|
|
@ -1,155 +1,158 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
<storageModule moduleId="org.eclipse.cdt.core.settings">
|
||||||
<cconfiguration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909">
|
<cconfiguration id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909">
|
||||||
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909" moduleId="org.eclipse.cdt.core.settings" name="Debug">
|
||||||
<externalSettings />
|
<externalSettings/>
|
||||||
<extensions>
|
<extensions>
|
||||||
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser" />
|
<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
|
<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
|
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
|
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser" />
|
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser" />
|
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
|
||||||
</extensions>
|
</extensions>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<configuration artifactName="rtthread" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909" name="Debug" optionalBuildProperties="" parent="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug">
|
<configuration artifactName="rtthread" buildArtefactType="org.eclipse.cdt.build.core.buildArtefactType.exe" buildProperties="org.eclipse.cdt.build.core.buildArtefactType=org.eclipse.cdt.build.core.buildArtefactType.exe,org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug" cleanCommand="${cross_rm} -rf" description="" id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909" name="Debug" optionalBuildProperties="" parent="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug">
|
||||||
<folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909." name="/" resourcePath="">
|
<folderInfo id="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909." name="/" resourcePath="">
|
||||||
<toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug.1210330260" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug">
|
<toolChain id="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug.1210330260" name="RISC-V Cross GCC" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.toolchain.elf.debug">
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1042345964" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash.1042345964" name="Create flash image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createflash" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.803191781" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting.803191781" name="Create extended listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.createlisting" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1709948392" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize.1709948392" name="Print size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.addtools.printsize" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1404915023" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.none" valueType="enumerated" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.1404915023" name="Optimization Level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.level.none" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.1138769506" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" useByScannerDiscovery="true" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength.1138769506" name="Message length (-fmessage-length=0)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.messagelength" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.1114111796" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" useByScannerDiscovery="true" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar.1114111796" name="'char' is signed (-fsigned-char)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.signedchar" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.467071281" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" useByScannerDiscovery="true" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections.467071281" name="Function sections (-ffunction-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.functionsections" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.847037745" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections" useByScannerDiscovery="true" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections.847037745" name="Data sections (-fdata-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.optimization.datasections" useByScannerDiscovery="true" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.1675162840" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.max" valueType="enumerated" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.1675162840" name="Debug level" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level" useByScannerDiscovery="true" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.level.max" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.746344305" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format" useByScannerDiscovery="true" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format.746344305" name="Debug format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.debugging.format" useByScannerDiscovery="true"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.973718284" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" useByScannerDiscovery="false" value="GNU MCU RISC-V GCC" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name.973718284" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.name" useByScannerDiscovery="false" value="GNU MCU RISC-V GCC" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.874295166" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix" useByScannerDiscovery="false" value="riscv64-unknown-elf-" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix.874295166" name="Prefix" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.prefix" useByScannerDiscovery="false" value="riscv64-unknown-elf-" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.874956812" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c" useByScannerDiscovery="false" value="gcc" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c.874956812" name="C compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.c" useByScannerDiscovery="false" value="gcc" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.1631756287" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp" useByScannerDiscovery="false" value="g++" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp.1631756287" name="C++ compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.cpp" useByScannerDiscovery="false" value="g++" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1192183138" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar" useByScannerDiscovery="false" value="ar" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar.1192183138" name="Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.ar" useByScannerDiscovery="false" value="ar" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.1509822712" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy" useByScannerDiscovery="false" value="objcopy" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy.1509822712" name="Hex/Bin converter" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objcopy" useByScannerDiscovery="false" value="objcopy" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.410212088" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump" useByScannerDiscovery="false" value="objdump" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump.410212088" name="Listing generator" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.objdump" useByScannerDiscovery="false" value="objdump" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.1033691835" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size" useByScannerDiscovery="false" value="size" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size.1033691835" name="Size command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.size" useByScannerDiscovery="false" value="size" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.165021533" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make" useByScannerDiscovery="false" value="make" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make.165021533" name="Build command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.make" useByScannerDiscovery="false" value="make" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.366517344" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" useByScannerDiscovery="false" value="rm" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm.366517344" name="Remove command" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.command.rm" useByScannerDiscovery="false" value="rm" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.1691164793" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id" useByScannerDiscovery="false" value="512258282" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id.1691164793" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.toolchain.id" useByScannerDiscovery="false" value="512258282" valueType="string"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1598161476" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.arch.default" valueType="enumerated" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base.1598161476" name="Architecture" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.base" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.arch.default" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.562211802" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.integer.default" valueType="enumerated" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer.562211802" name="Integer ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.integer" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.integer.default" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.fp.929485575" name="Floating point ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.fp" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.fp.none" valueType="enumerated" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.fp.929485575" name="Floating point ABI" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.abi.fp" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.abi.fp.none" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.fp.2086917901" name="Floating point" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.fp" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.isa.fp.none" valueType="enumerated" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.fp.2086917901" name="Floating point" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.isa.fp" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.isa.fp.none" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.2138403588" name="Output file format (-O)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.binary" valueType="enumerated" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.2138403588" name="Output file format (-O)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.binary" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.smalldatalimit.954692637" name="Small data limit" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.smalldatalimit" useByScannerDiscovery="false" value="" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.smalldatalimit.954692637" name="Small data limit" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.target.smalldatalimit" useByScannerDiscovery="false" value="" valueType="string"/>
|
||||||
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.631468712" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform" />
|
<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform.631468712" isAbstract="false" osList="all" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.targetPlatform"/>
|
||||||
<builder buildPath="${workspace_loc:/${ProjName}}" cleanBuildTarget="clean" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.56173494" incrementalBuildTarget="all" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="GNU Make 构建器" parallelBuildOn="true" parallelizationNumber="optimal" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder" />
|
<builder buildPath="${workspace_loc:/${ProjName}}" cleanBuildTarget="clean2" id="ilg.gnumcueclipse.managedbuild.cross.riscv.builder.56173494" incrementalBuildTarget="all2" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="GNU Make 构建器" parallelBuildOn="true" parallelizationNumber="optimal" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.builder"/>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.773327382" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">
|
<tool commandLinePattern="${COMMAND} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.773327382" name="GNU RISC-V Cross Assembler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler">
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1045079702" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor.1045079702" name="Use preprocessor" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.usepreprocessor" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths.302555696" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths" useByScannerDiscovery="true" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths.302555696" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.include.paths" useByScannerDiscovery="true" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/bmsis/include}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/bmsis/include}""/>
|
||||||
</option>
|
</option>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.other.651906394" name="Other assembler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.other" useByScannerDiscovery="false" value="-c -mcmodel=medany -march=rv32imc -mabi=ilp32 -x assembler-with-cpp" valueType="string" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.other.651906394" name="Other assembler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.assembler.other" useByScannerDiscovery="false" value="-c -mcmodel=medany -march=rv32imc -mabi=ilp32 -x assembler-with-cpp" valueType="string"/>
|
||||||
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.2020551447" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input" />
|
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input.2020551447" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.assembler.input"/>
|
||||||
</tool>
|
</tool>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.2003680225" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">
|
<tool commandLinePattern="${COMMAND} ${FLAGS} -c ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.2003680225" name="GNU RISC-V Cross C Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler">
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1466730804" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths.1466730804" name="Include paths (-I)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath">
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/rt-thread/include/libc}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/rt-thread/include/libc}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//.}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//.}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//applications}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//applications}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//board}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//board}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libcpu/cpu}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libcpu/cpu}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_drivers}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_drivers}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/ab32vg1_hal/include}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/ab32vg1_hal/include}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/ab32vg1_hal}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/ab32vg1_hal}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/bmsis/include}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/bmsis/include}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/bmsis}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//libraries/hal_libraries/bmsis}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/drivers/include}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/dfs/filesystems/romfs}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/finsh}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/dfs/include}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/libc/compilers/common}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/drivers/audio}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/libc/compilers/newlib}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/drivers/include}""/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/include}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/finsh}""/>
|
||||||
</option>
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/libc/compilers/common}""/>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs.1133181116" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/components/libc/compilers/newlib}""/>
|
||||||
<listOptionValue builtIn="false" value="DEBUG" />
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//rt-thread/include}""/>
|
||||||
</option>
|
</option>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.files.1721531593" name="Include files (-include)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.files" useByScannerDiscovery="true" valueType="includeFiles">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs.1133181116" name="Defined symbols (-D)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.defs" useByScannerDiscovery="true" valueType="definedSymbols">
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/rtconfig_preinc.h}"" />
|
<listOptionValue builtIn="false" value="DEBUG"/>
|
||||||
</option>
|
</option>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.systempaths.1138643188" name="Include system paths (-isystem)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.systempaths" useByScannerDiscovery="true" valueType="includePath">
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.files.1721531593" name="Include files (-include)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.files" useByScannerDiscovery="true" valueType="includeFiles">
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}}"" />
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/rtconfig_preinc.h}""/>
|
||||||
</option>
|
</option>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other.68088914" name="Other compiler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other" useByScannerDiscovery="true" value="-c -mcmodel=medany -march=rv32imc -mabi=ilp32 -Os" valueType="string" />
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.systempaths.1138643188" name="Include system paths (-isystem)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.include.systempaths" useByScannerDiscovery="true" valueType="includePath">
|
||||||
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.2078217664" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input" />
|
<listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}}""/>
|
||||||
</tool>
|
</option>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.282359881" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other.68088914" name="Other compiler flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.compiler.other" useByScannerDiscovery="true" value="-c -mcmodel=medany -march=rv32imc -mabi=ilp32 -Os" valueType="string"/>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.1082822632" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker">
|
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.2078217664" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.1342883380" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
</tool>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other.1506934091" name="Other linker flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other" useByScannerDiscovery="false" value="-mcmodel=medany -march=rv32imc -mabi=ilp32 -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start" valueType="string" />
|
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler.282359881" name="GNU RISC-V Cross C++ Compiler" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.compiler"/>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs.1209561486" name="Libraries (-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs" useByScannerDiscovery="false" valueType="libs">
|
<tool commandLinePattern="${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}" id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.1082822632" name="GNU RISC-V Cross C Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker">
|
||||||
<listOptionValue builtIn="false" value="c " />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections.1342883380" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.gcsections" useByScannerDiscovery="false" value="false" valueType="boolean"/>
|
||||||
<listOptionValue builtIn="false" value="m " />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other.1506934091" name="Other linker flags" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.other" useByScannerDiscovery="false" value="-mcmodel=medany -march=rv32imc -mabi=ilp32 -nostartfiles -Wl,-cref,-u,_start" valueType="string"/>
|
||||||
</option>
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs.1209561486" name="Libraries (-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.libs" useByScannerDiscovery="false" valueType="libs">
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths.1480740818" name="Library search path (-L)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths" useByScannerDiscovery="false" valueType="libPaths" />
|
<listOptionValue builtIn="false" value="c "/>
|
||||||
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile.808366667" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile" useByScannerDiscovery="false" valueType="stringList">
|
<listOptionValue builtIn="false" value="m "/>
|
||||||
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//link.lds}"" />
|
</option>
|
||||||
</option>
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="true" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths.1480740818" name="Library search path (-L)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.paths" useByScannerDiscovery="false" valueType="libPaths"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart.1148948111" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option IS_BUILTIN_EMPTY="false" IS_VALUE_EMPTY="false" id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile.808366667" name="Script files (-T)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.scriptfile" useByScannerDiscovery="false" valueType="stringList">
|
||||||
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input.216686783" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input">
|
<listOptionValue builtIn="false" value=""${workspace_loc://${ProjName}//link.lds}""/>
|
||||||
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)" />
|
</option>
|
||||||
<additionalInput kind="additionalinput" paths="$(LIBS)" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart.1148948111" name="Do not use standard start files (-nostartfiles)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.c.linker.nostart" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
</inputType>
|
<inputType id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input.216686783" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.linker.input">
|
||||||
</tool>
|
<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.394785702" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker">
|
<additionalInput kind="additionalinput" paths="$(LIBS)"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections.2024033290" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections" value="true" valueType="boolean" />
|
</inputType>
|
||||||
</tool>
|
</tool>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.1401777352" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver" />
|
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker.394785702" name="GNU RISC-V Cross C++ Linker" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.cpp.linker">
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.1268552146" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash">
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections.2024033290" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.cpp.linker.gcsections" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.1142036741" name="Output file format (-O)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.binary" valueType="enumerated" />
|
</tool>
|
||||||
</tool>
|
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver.1401777352" name="GNU RISC-V Cross Archiver" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.archiver"/>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.1402684207" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting">
|
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash.1268552146" name="GNU RISC-V Cross Create Flash Image" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createflash">
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source.2107259167" name="Display source (--source|-S)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.1142036741" name="Output file format (-O)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice" useByScannerDiscovery="false" value="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createflash.choice.binary" valueType="enumerated"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders.1517068442" name="Display all headers (--all-headers|-x)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
</tool>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle.1334666714" name="Demangle names (--demangle|-C)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting.1402684207" name="GNU RISC-V Cross Create Listing" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.createlisting">
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers.1102744915" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source.2107259167" name="Display source (--source|-S)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.source" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide.382638533" name="Wide lines (--wide|-w)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide" useByScannerDiscovery="false" value="true" valueType="boolean" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders.1517068442" name="Display all headers (--all-headers|-x)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.allheaders" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
</tool>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle.1334666714" name="Demangle names (--demangle|-C)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.demangle" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.252011996" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize">
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers.1102744915" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.linenumbers" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format.196205319" name="Size format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format" useByScannerDiscovery="false" />
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide.382638533" name="Wide lines (--wide|-w)" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.createlisting.wide" useByScannerDiscovery="false" value="true" valueType="boolean"/>
|
||||||
</tool>
|
</tool>
|
||||||
</toolChain>
|
<tool id="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize.252011996" name="GNU RISC-V Cross Print Size" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.tool.printsize">
|
||||||
</folderInfo>
|
<option id="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format.196205319" name="Size format" superClass="ilg.gnumcueclipse.managedbuild.cross.riscv.option.printsize.format" useByScannerDiscovery="false"/>
|
||||||
<sourceEntries>
|
</tool>
|
||||||
<entry excluding="//rt-thread/components/cplusplus|//rt-thread/components/dfs|//rt-thread/components/drivers/audio|//rt-thread/components/drivers/can|//rt-thread/components/drivers/cputime|//rt-thread/components/drivers/hwcrypto|//rt-thread/components/drivers/hwtimer|//rt-thread/components/drivers/i2c|//rt-thread/components/drivers/misc/adc.c|//rt-thread/components/drivers/misc/dac.c|//rt-thread/components/drivers/misc/pulse_encoder.c|//rt-thread/components/drivers/misc/rt_drv_pwm.c|//rt-thread/components/drivers/misc/rt_inputcapture.c|//rt-thread/components/drivers/mtd|//rt-thread/components/drivers/pm|//rt-thread/components/drivers/rtc|//rt-thread/components/drivers/sdio|//rt-thread/components/drivers/sensors|//rt-thread/components/drivers/spi|//rt-thread/components/drivers/touch|//rt-thread/components/drivers/usb|//rt-thread/components/drivers/watchdog|//rt-thread/components/drivers/wlan|//rt-thread/components/finsh/msh_file.c|//rt-thread/components/finsh/symbol.c|//rt-thread/components/libc/aio|//rt-thread/components/libc/compilers/armlibc|//rt-thread/components/libc/compilers/common/unistd.c|//rt-thread/components/libc/compilers/dlib|//rt-thread/components/libc/compilers/minilibc|//rt-thread/components/libc/getline|//rt-thread/components/libc/libdl|//rt-thread/components/libc/mmap|//rt-thread/components/libc/pthreads|//rt-thread/components/libc/signal|//rt-thread/components/libc/termios|//rt-thread/components/libc/time|//rt-thread/components/lwp|//rt-thread/components/net|//rt-thread/components/utilities|//rt-thread/components/vbus|//rt-thread/components/vmm|//rt-thread/libcpu|//rt-thread/src/cpu.c|//rt-thread/src/slab.c|//rt-thread/tools" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="" />
|
</toolChain>
|
||||||
</sourceEntries>
|
</folderInfo>
|
||||||
</configuration>
|
<sourceEntries>
|
||||||
</storageModule>
|
<entry excluding="//rt-thread/components/cplusplus|//rt-thread/components/dfs/filesystems/devfs|//rt-thread/components/dfs/filesystems/elmfat|//rt-thread/components/dfs/filesystems/jffs2|//rt-thread/components/dfs/filesystems/nfs|//rt-thread/components/dfs/filesystems/ramfs|//rt-thread/components/dfs/filesystems/skeleton|//rt-thread/components/dfs/filesystems/uffs|//rt-thread/components/dfs/src/poll.c|//rt-thread/components/dfs/src/select.c|//rt-thread/components/drivers/can|//rt-thread/components/drivers/cputime|//rt-thread/components/drivers/hwcrypto|//rt-thread/components/drivers/hwtimer|//rt-thread/components/drivers/i2c|//rt-thread/components/drivers/misc/adc.c|//rt-thread/components/drivers/misc/dac.c|//rt-thread/components/drivers/misc/pulse_encoder.c|//rt-thread/components/drivers/misc/rt_drv_pwm.c|//rt-thread/components/drivers/misc/rt_inputcapture.c|//rt-thread/components/drivers/mtd|//rt-thread/components/drivers/phy|//rt-thread/components/drivers/pm|//rt-thread/components/drivers/rtc|//rt-thread/components/drivers/sdio|//rt-thread/components/drivers/sensors|//rt-thread/components/drivers/spi|//rt-thread/components/drivers/touch|//rt-thread/components/drivers/usb|//rt-thread/components/drivers/watchdog|//rt-thread/components/drivers/wlan|//rt-thread/components/finsh/symbol.c|//rt-thread/components/libc/aio|//rt-thread/components/libc/compilers/armlibc|//rt-thread/components/libc/compilers/common/unistd.c|//rt-thread/components/libc/compilers/dlib|//rt-thread/components/libc/compilers/minilibc|//rt-thread/components/libc/getline|//rt-thread/components/libc/libdl|//rt-thread/components/libc/mmap|//rt-thread/components/libc/pthreads|//rt-thread/components/libc/signal|//rt-thread/components/libc/termios|//rt-thread/components/libc/time|//rt-thread/components/lwp|//rt-thread/components/net|//rt-thread/components/utilities|//rt-thread/components/vbus|//rt-thread/components/vmm|//rt-thread/libcpu|//rt-thread/src/cpu.c|//rt-thread/src/slab.c|//rt-thread/tools" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name=""/>
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.externalSettings" />
|
</sourceEntries>
|
||||||
<storageModule moduleId="ilg.gnumcueclipse.managedbuild.packs" />
|
</configuration>
|
||||||
</cconfiguration>
|
</storageModule>
|
||||||
</storageModule>
|
<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
|
||||||
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
<storageModule moduleId="ilg.gnumcueclipse.managedbuild.packs"/>
|
||||||
<project id="RISC-V-Project.ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf.621045364" name="Executable" projectType="ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf" />
|
</cconfiguration>
|
||||||
</storageModule>
|
</storageModule>
|
||||||
<storageModule moduleId="scannerConfiguration">
|
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="" />
|
<project id="RISC-V-Project.ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf.621045364" name="Executable" projectType="ilg.gnumcueclipse.managedbuild.cross.riscv.target.elf"/>
|
||||||
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.2003680225;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.2078217664">
|
</storageModule>
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="" />
|
<storageModule moduleId="scannerConfiguration">
|
||||||
</scannerConfigBuildInfo>
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1649151570;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1649151570.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1094470304;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.506460738">
|
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.576542909.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.2003680225;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.2078217664">
|
||||||
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="" />
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
</scannerConfigBuildInfo>
|
</scannerConfigBuildInfo>
|
||||||
</storageModule>
|
<scannerConfigBuildInfo instanceId="ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1649151570;ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.release.1649151570.;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.1094470304;ilg.gnumcueclipse.managedbuild.cross.riscv.tool.c.compiler.input.506460738">
|
||||||
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders" />
|
<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
|
||||||
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets" />
|
</scannerConfigBuildInfo>
|
||||||
<storageModule moduleId="refreshScope" versionNumber="2">
|
</storageModule>
|
||||||
<configuration configurationName="Debug">
|
<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
|
||||||
<resource resourceType="PROJECT" workspacePath="/ab32vg1" />
|
<storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/>
|
||||||
</configuration>
|
<storageModule moduleId="refreshScope" versionNumber="2">
|
||||||
<configuration configurationName="Release">
|
<configuration configurationName="Debug">
|
||||||
<resource resourceType="PROJECT" workspacePath="/ab32vg1" />
|
<resource resourceType="PROJECT" workspacePath="/ab32vg1"/>
|
||||||
</configuration>
|
</configuration>
|
||||||
</storageModule>
|
<configuration configurationName="Release">
|
||||||
|
<resource resourceType="PROJECT" workspacePath="/ab32vg1"/>
|
||||||
|
</configuration>
|
||||||
|
</storageModule>
|
||||||
</cproject>
|
</cproject>
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
## 开发板介绍
|
## 开发板介绍
|
||||||
|
|
||||||
ab32vg1-prougen 是 中科蓝讯(Bluetrum) 推出的一款基于 RISC-V 内核的开发板,最高主频为 120Mhz,该开发板芯片为 AB5301A。
|
ab32vg1-prougen 是 中科蓝讯(Bluetrum) 推出的一款基于 RISC-V 内核的开发板,最高主频为 120Mhz,该开发板芯片为 AB32VG1。
|
||||||
|
|
||||||
开发板外观如下图所示:
|
开发板外观如下图所示:
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ ab32vg1-prougen 是 中科蓝讯(Bluetrum) 推出的一款基于 RISC-V 内核
|
||||||
|
|
||||||
该开发板常用 **板载资源** 如下:
|
该开发板常用 **板载资源** 如下:
|
||||||
|
|
||||||
- MCU:AB5301A,主频 120MHz,可超频至 192MHz,4Mbit FLASH ,192KB RAM。
|
- MCU:AB32VG1,主频 120MHz,可超频至 192MHz,8Mbit FLASH ,192KB RAM。
|
||||||
- 常用外设
|
- 常用外设
|
||||||
- LED: RGB灯
|
- LED: RGB灯
|
||||||
- 按键: 3 个, USER(s2,s3) and RESET(s1)
|
- 按键: 3 个, USER(s2,s3) and RESET(s1)
|
||||||
|
@ -33,9 +33,9 @@ ab32vg1-prougen 是 中科蓝讯(Bluetrum) 推出的一款基于 RISC-V 内核
|
||||||
| **板载外设** | **支持情况** | **备注** |
|
| **板载外设** | **支持情况** | **备注** |
|
||||||
| :----------- | :----------: | :---------- |
|
| :----------- | :----------: | :---------- |
|
||||||
| USB 转串口 | 支持 | |
|
| USB 转串口 | 支持 | |
|
||||||
| SD卡 | 即将支持 | |
|
| SD卡 | 支持 | |
|
||||||
| IRDA | 即将支持 | |
|
| IRDA | 即将支持 | |
|
||||||
| 音频接口 | 即将支持 | |
|
| 音频接口 | 支持 | |
|
||||||
| **片上外设** | **支持情况** | **备注** |
|
| **片上外设** | **支持情况** | **备注** |
|
||||||
| GPIO | 支持 | PA PB PE PF |
|
| GPIO | 支持 | PA PB PE PF |
|
||||||
| UART | 支持 | UART0/1/2 |
|
| UART | 支持 | UART0/1/2 |
|
||||||
|
@ -73,11 +73,11 @@ ab32vg1-prougen 是 中科蓝讯(Bluetrum) 推出的一款基于 RISC-V 内核
|
||||||
|
|
||||||
#### 编译下载
|
#### 编译下载
|
||||||
|
|
||||||
运行 `scons` 编译得到 `.dcf` 固件,通过 `downloader` 进行下载
|
通过 `RT-Thread Studio` 或者 `scons` 编译得到 `.dcf` 固件,通过 `Downloader` 进行下载
|
||||||
|
|
||||||
#### 运行结果
|
#### 运行结果
|
||||||
|
|
||||||
下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LED 常亮、绿色 LED 会周期性闪烁。
|
下载程序成功之后,系统会自动运行,观察开发板上 LED 的运行效果,红色 LED 会周期性闪烁。
|
||||||
|
|
||||||
连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息:
|
连接开发板对应串口到 PC , 在终端工具里打开相应的串口(115200-8-1-N),复位设备后,可以看到 RT-Thread 的输出信息:
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2020, Bluetrum Development Team
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,21 +1,61 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021/01/21 greedyhao The first version
|
||||||
|
*/
|
||||||
|
|
||||||
#include <rtthread.h>
|
#include <rtthread.h>
|
||||||
|
|
||||||
#ifdef RT_USING_DFS
|
#ifdef BSP_USING_SDIO
|
||||||
#include <dfs_fs.h>
|
|
||||||
#include "dfs_romfs.h"
|
|
||||||
|
|
||||||
int mnt_init(void)
|
#include <dfs_elm.h>
|
||||||
|
#include <dfs_fs.h>
|
||||||
|
#include <dfs_posix.h>
|
||||||
|
#include "drv_gpio.h"
|
||||||
|
|
||||||
|
// #define DRV_DEBUG
|
||||||
|
#define DBG_TAG "app.card"
|
||||||
|
#include <rtdbg.h>
|
||||||
|
|
||||||
|
void sd_mount(void *parameter)
|
||||||
{
|
{
|
||||||
if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) == 0)
|
while (1)
|
||||||
{
|
{
|
||||||
rt_kprintf("ROM file system initializated!\n");
|
rt_thread_mdelay(500);
|
||||||
|
if(rt_device_find("sd0") != RT_NULL)
|
||||||
|
{
|
||||||
|
if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK)
|
||||||
|
{
|
||||||
|
LOG_I("sd card mount to '/'");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_W("sd card mount to '/' failed!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int ab32_sdcard_mount(void)
|
||||||
|
{
|
||||||
|
rt_thread_t tid;
|
||||||
|
|
||||||
|
tid = rt_thread_create("sd_mount", sd_mount, RT_NULL,
|
||||||
|
1024, RT_THREAD_PRIORITY_MAX - 2, 20);
|
||||||
|
if (tid != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_thread_startup(tid);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rt_kprintf("ROM file system initializate failed!\n");
|
LOG_E("create sd_mount thread err!");
|
||||||
}
|
}
|
||||||
|
return RT_EOK;
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
INIT_ENV_EXPORT(mnt_init);
|
INIT_APP_EXPORT(ab32_sdcard_mount);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,17 +0,0 @@
|
||||||
/* Generated by mkromfs. Edit with caution. */
|
|
||||||
#include <rtthread.h>
|
|
||||||
|
|
||||||
#ifdef RT_USING_DFS
|
|
||||||
#include <dfs_romfs.h>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static const struct romfs_dirent _romfs_root[] = {
|
|
||||||
{ROMFS_DIRENT_FILE, "ab32vg1", RT_NULL, 0}
|
|
||||||
};
|
|
||||||
|
|
||||||
const struct romfs_dirent romfs_root = {
|
|
||||||
ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root)/sizeof(_romfs_root[0])
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -19,6 +19,18 @@ menu "Onboard Peripheral Drivers"
|
||||||
default y
|
default y
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
config BSP_USING_SDCARD
|
||||||
|
bool "Enable SDCARD"
|
||||||
|
select BSP_USING_SDIO
|
||||||
|
default n
|
||||||
|
|
||||||
|
if BSP_USING_SDCARD
|
||||||
|
config SDIO_MAX_FREQ
|
||||||
|
int "sdio max freq"
|
||||||
|
range 0 24000000
|
||||||
|
default 24000000
|
||||||
|
endif
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "On-chip Peripheral Drivers"
|
menu "On-chip Peripheral Drivers"
|
||||||
|
@ -28,6 +40,13 @@ menu "On-chip Peripheral Drivers"
|
||||||
select RT_USING_SERIAL
|
select RT_USING_SERIAL
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config BSP_USING_SDIO
|
||||||
|
bool "Enable SDIO"
|
||||||
|
select RT_USING_SDIO
|
||||||
|
select RT_USING_DFS
|
||||||
|
select RT_USING_DFS_ELMFAT
|
||||||
|
default n
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Board extended module Drivers"
|
menu "Board extended module Drivers"
|
||||||
|
|
|
@ -34,9 +34,17 @@ SECTIONS
|
||||||
} > init
|
} > init
|
||||||
|
|
||||||
.ram1 __ram1_vma : {
|
.ram1 __ram1_vma : {
|
||||||
*components*drivers**.o(.text* .rodata*)
|
. = ALIGN(4);
|
||||||
*device.o(.text*)
|
PROVIDE(__ctors_start__ = .);
|
||||||
. = ALIGN(32);
|
KEEP (*(SORT(.init_array.*)))
|
||||||
|
KEEP (*(.init_array))
|
||||||
|
PROVIDE(__ctors_end__ = .);
|
||||||
|
|
||||||
|
. = ALIGN(4);
|
||||||
|
*components*drivers**.o (.text*)
|
||||||
|
*device.o (.text*)
|
||||||
|
*components.o (.text*)
|
||||||
|
*idle.o (.text*)
|
||||||
} > ram1 AT > flash
|
} > ram1 AT > flash
|
||||||
|
|
||||||
.rti : {
|
.rti : {
|
||||||
|
@ -60,15 +68,23 @@ SECTIONS
|
||||||
} > ram1 AT > flash
|
} > ram1 AT > flash
|
||||||
|
|
||||||
.comm : {
|
.comm : {
|
||||||
|
. = ALIGN(4);
|
||||||
KEEP(*(.vector))
|
KEEP(*(.vector))
|
||||||
EXCLUDE_FILE(*components*finsh**.o *components*libc**.o *romfs.o *lib_a**.o) *(.text*)
|
EXCLUDE_FILE(*components*finsh**.o *components*libc**.o *romfs.o
|
||||||
|
*lib_a**.o *divdi3.o *moddi3.o *divdf3.o *muldf3.o *eqtf2.o *getf2.o
|
||||||
|
*letf2.o *multf3.o *subtf3.o *fixtfsi.o *floatsitf.o *extenddftf2.o
|
||||||
|
*trunctfdf2.o *_clzsi2.o *cp-demangle.o *unwind*.o) *(.text)
|
||||||
*finsh*shell.o (.text*)
|
*finsh*shell.o (.text*)
|
||||||
EXCLUDE_FILE (*components*libc**.o *romfs.o *lib_a**.o) *(.rodata*)
|
*(.text.unlikely)
|
||||||
*(.srodata*)
|
*(.text.startup)
|
||||||
|
EXCLUDE_FILE (*components*libc**.o *romfs.o *lib_a**.o *cp-demangle.o
|
||||||
|
*divdf3.o *muldf3.o *multf3.o *unwind*.o *_clz.o) *(.rodata)
|
||||||
|
*(.rodata.name)
|
||||||
|
EXCLUDE_FILE(*lib_a**.o *cp-demangle.o) *(.rodata.str1.4)
|
||||||
|
EXCLUDE_FILE(*lib_a**.o *unwind*.o) *(.srodata)
|
||||||
*(.rela*)
|
*(.rela*)
|
||||||
*(.data*)
|
*(.data*)
|
||||||
*(.sdata*)
|
*(.sdata*)
|
||||||
. = ALIGN(512);
|
|
||||||
} > comm AT > flash
|
} > comm AT > flash
|
||||||
|
|
||||||
.bss (NOLOAD):
|
.bss (NOLOAD):
|
||||||
|
@ -98,6 +114,7 @@ SECTIONS
|
||||||
.flash : {
|
.flash : {
|
||||||
*(.text*)
|
*(.text*)
|
||||||
*(.rodata*)
|
*(.rodata*)
|
||||||
|
*(.srodata*)
|
||||||
. = ALIGN(512);
|
. = ALIGN(512);
|
||||||
} > flash
|
} > flash
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,10 @@
|
||||||
rtthread.siz:
|
all2: all
|
||||||
riscv64-unknown-elf-size --format=berkeley "rtthread.elf"
|
|
||||||
sh ../pre_build.sh
|
sh ../pre_build.sh
|
||||||
riscv32-elf-xmaker -b rtthread.xm
|
riscv32-elf-xmaker -b rtthread.xm
|
||||||
riscv32-elf-xmaker -b download.xm
|
riscv32-elf-xmaker -b download.xm
|
||||||
|
|
||||||
clean2:
|
clean2:
|
||||||
-$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
|
-$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
|
||||||
-$(RM) $(OBJS) *.elf
|
-$(RM) $(OBJS) *.elf
|
||||||
-@echo ' '
|
-@echo ' '
|
||||||
|
|
||||||
|
|
||||||
*.elf: $(wildcard D:/Softwares/RT-ThreadStudio/workspace/ab32vg1/link.lds)
|
|
||||||
|
|
|
@ -176,6 +176,8 @@
|
||||||
|
|
||||||
#define BSP_USING_UART0
|
#define BSP_USING_UART0
|
||||||
|
|
||||||
|
/* On-chip Peripheral Drivers */
|
||||||
|
|
||||||
/* Board extended module Drivers */
|
/* Board extended module Drivers */
|
||||||
|
|
||||||
#define BOARD_BLUETRUM_EVB
|
#define BOARD_BLUETRUM_EVB
|
||||||
|
|
|
@ -4,7 +4,8 @@ from building import *
|
||||||
|
|
||||||
cwd = GetCurrentDir()
|
cwd = GetCurrentDir()
|
||||||
src = []
|
src = []
|
||||||
CPPPATH = [cwd]
|
path = [cwd]
|
||||||
|
path += [cwd + '/config']
|
||||||
|
|
||||||
if GetDepend('RT_USING_PIN'):
|
if GetDepend('RT_USING_PIN'):
|
||||||
src += ['drv_gpio.c']
|
src += ['drv_gpio.c']
|
||||||
|
@ -12,7 +13,10 @@ if GetDepend('RT_USING_PIN'):
|
||||||
if GetDepend('RT_USING_SERIAL'):
|
if GetDepend('RT_USING_SERIAL'):
|
||||||
src += ['drv_usart.c']
|
src += ['drv_usart.c']
|
||||||
|
|
||||||
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH)
|
if GetDepend('RT_USING_SDIO'):
|
||||||
|
src += ['drv_sdio.c']
|
||||||
|
|
||||||
|
group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path)
|
||||||
|
|
||||||
objs = [group]
|
objs = [group]
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2021/01/18 greedyhao The first version
|
||||||
|
*/
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2020, Bluetrum Development Team
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2020, Bluetrum Development Team
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2020, Bluetrum Development Team
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2020, Bluetrum Development Team
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
|
|
|
@ -0,0 +1,658 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2020-11-30 greedyhao first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "drv_sdio.h"
|
||||||
|
#include "interrupt.h"
|
||||||
|
#include <rthw.h>
|
||||||
|
|
||||||
|
#ifdef BSP_USING_SDIO
|
||||||
|
|
||||||
|
// #define DRV_DEBUG
|
||||||
|
#define LOG_TAG "drv.sdio"
|
||||||
|
#include <drv_log.h>
|
||||||
|
|
||||||
|
#define SDIO_USING_1_BIT
|
||||||
|
|
||||||
|
static struct ab32_sdio_config sdio_config[] =
|
||||||
|
{
|
||||||
|
{.instance = SDMMC0_BASE,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
static struct rt_mmcsd_host *host = RT_NULL;
|
||||||
|
|
||||||
|
#define RTHW_SDIO_LOCK(_sdio) rt_mutex_take(&(_sdio)->mutex, RT_WAITING_FOREVER)
|
||||||
|
#define RTHW_SDIO_UNLOCK(_sdio) rt_mutex_release(&(_sdio)->mutex);
|
||||||
|
|
||||||
|
struct sdio_pkg
|
||||||
|
{
|
||||||
|
struct rt_mmcsd_cmd *cmd;
|
||||||
|
void *buff;
|
||||||
|
rt_uint32_t flag;
|
||||||
|
rt_uint32_t xfer_blks;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rthw_sdio
|
||||||
|
{
|
||||||
|
struct rt_mmcsd_host *host;
|
||||||
|
struct ab32_sdio_des sdio_des;
|
||||||
|
struct rt_event event;
|
||||||
|
struct rt_mutex mutex;
|
||||||
|
struct sdio_pkg *pkg;
|
||||||
|
};
|
||||||
|
|
||||||
|
ALIGN(SDIO_ALIGN_LEN)
|
||||||
|
static rt_uint8_t cache_buf[SDIO_BUFF_SIZE];
|
||||||
|
|
||||||
|
static uint8_t sd_baud = 119;
|
||||||
|
|
||||||
|
uint8_t sysclk_update_baud(uint8_t baud);
|
||||||
|
|
||||||
|
static rt_uint32_t ab32_sdio_clk_get(hal_sfr_t hw_sdio)
|
||||||
|
{
|
||||||
|
return (get_sysclk_nhz() / (sd_baud+1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function get order from sdio.
|
||||||
|
* @param data
|
||||||
|
* @retval sdio order
|
||||||
|
*/
|
||||||
|
static int get_order(rt_uint32_t data)
|
||||||
|
{
|
||||||
|
int order = 0;
|
||||||
|
|
||||||
|
switch (data)
|
||||||
|
{
|
||||||
|
case 1:
|
||||||
|
order = 0;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
order = 1;
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
order = 2;
|
||||||
|
break;
|
||||||
|
case 8:
|
||||||
|
order = 3;
|
||||||
|
break;
|
||||||
|
case 16:
|
||||||
|
order = 4;
|
||||||
|
break;
|
||||||
|
case 32:
|
||||||
|
order = 5;
|
||||||
|
break;
|
||||||
|
case 64:
|
||||||
|
order = 6;
|
||||||
|
break;
|
||||||
|
case 128:
|
||||||
|
order = 7;
|
||||||
|
break;
|
||||||
|
case 256:
|
||||||
|
order = 8;
|
||||||
|
break;
|
||||||
|
case 512:
|
||||||
|
order = 9;
|
||||||
|
break;
|
||||||
|
case 1024:
|
||||||
|
order = 10;
|
||||||
|
break;
|
||||||
|
case 2048:
|
||||||
|
order = 11;
|
||||||
|
break;
|
||||||
|
case 4096:
|
||||||
|
order = 12;
|
||||||
|
break;
|
||||||
|
case 8192:
|
||||||
|
order = 13;
|
||||||
|
break;
|
||||||
|
case 16384:
|
||||||
|
order = 14;
|
||||||
|
break;
|
||||||
|
default :
|
||||||
|
order = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return order;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function wait sdio completed.
|
||||||
|
* @param sdio rthw_sdio
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void rthw_sdio_wait_completed(struct rthw_sdio *sdio)
|
||||||
|
{
|
||||||
|
rt_uint32_t status = 0;
|
||||||
|
struct rt_mmcsd_cmd *cmd = sdio->pkg->cmd;
|
||||||
|
struct rt_mmcsd_data *data = cmd->data;
|
||||||
|
hal_sfr_t hw_sdio = sdio->sdio_des.hw_sdio;
|
||||||
|
rt_err_t tx_finish = -RT_ERROR;
|
||||||
|
|
||||||
|
if (rt_event_recv(&sdio->event, 0xFFFFFFFF & ~HW_SDIO_CON_DFLAG, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
|
||||||
|
rt_tick_from_millisecond(5000), &status) != RT_EOK)
|
||||||
|
{
|
||||||
|
LOG_E("wait completed timeout");
|
||||||
|
cmd->err = -RT_ETIMEOUT;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sdio->pkg == RT_NULL)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd->resp[0] = hw_sdio[SDxARG3];
|
||||||
|
cmd->resp[1] = hw_sdio[SDxARG2];
|
||||||
|
cmd->resp[2] = hw_sdio[SDxARG1];
|
||||||
|
cmd->resp[3] = hw_sdio[SDxARG0];
|
||||||
|
|
||||||
|
if (!(status & HW_SDIO_CON_NRPS)) {
|
||||||
|
cmd->err = RT_EOK;
|
||||||
|
LOG_D("sta:0x%08X [%08X %08X %08X %08X]", status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]);
|
||||||
|
} else {
|
||||||
|
cmd->err = -RT_ERROR;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function transfer data by dma.
|
||||||
|
* @param sdio rthw_sdio
|
||||||
|
* @param pkg sdio package
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void rthw_sdio_transfer_by_dma(struct rthw_sdio *sdio, struct sdio_pkg *pkg)
|
||||||
|
{
|
||||||
|
struct rt_mmcsd_data *data;
|
||||||
|
int size;
|
||||||
|
void *buff;
|
||||||
|
hal_sfr_t hw_sdio = sdio->sdio_des.hw_sdio;
|
||||||
|
|
||||||
|
if ((RT_NULL == pkg) || (RT_NULL == sdio))
|
||||||
|
{
|
||||||
|
LOG_E("rthw_sdio_transfer_by_dma invalid args");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
data = pkg->cmd->data;
|
||||||
|
if (RT_NULL == data)
|
||||||
|
{
|
||||||
|
LOG_E("rthw_sdio_transfer_by_dma invalid args");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
buff = pkg->buff;
|
||||||
|
if (RT_NULL == buff)
|
||||||
|
{
|
||||||
|
LOG_E("rthw_sdio_transfer_by_dma invalid args");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
hw_sdio = sdio->sdio_des.hw_sdio;
|
||||||
|
size = data->blks * data->blksize;
|
||||||
|
|
||||||
|
if (data->flags & DATA_DIR_WRITE)
|
||||||
|
{
|
||||||
|
LOG_D("DATA_DIR_WRITE %d", pkg->xfer_blks);
|
||||||
|
sdio->sdio_des.txconfig((rt_uint32_t *)((rt_uint8_t *)buff + (pkg->xfer_blks * data->blksize)), 512);
|
||||||
|
}
|
||||||
|
else if (data->flags & DATA_DIR_READ)
|
||||||
|
{
|
||||||
|
LOG_D("DATA_DIR_WRITE %d", pkg->xfer_blks);
|
||||||
|
sdio->sdio_des.rxconfig((rt_uint32_t *)((rt_uint8_t *)buff + (pkg->xfer_blks * data->blksize)), data->blksize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function send command.
|
||||||
|
* @param sdio rthw_sdio
|
||||||
|
* @param pkg sdio package
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void rthw_sdio_send_command(struct rthw_sdio *sdio, struct sdio_pkg *pkg)
|
||||||
|
{
|
||||||
|
struct rt_mmcsd_cmd *cmd = pkg->cmd;
|
||||||
|
struct rt_mmcsd_data *data = cmd->data;
|
||||||
|
hal_sfr_t hw_sdio = sdio->sdio_des.hw_sdio;
|
||||||
|
rt_uint32_t reg_cmd = 0;
|
||||||
|
rt_uint32_t data_flag = 0;
|
||||||
|
|
||||||
|
/* save pkg */
|
||||||
|
sdio->pkg = pkg;
|
||||||
|
|
||||||
|
#define CK8E BIT(11) //在命令/数据包后加上8CLK
|
||||||
|
#define CBUSY BIT(10) //Busy Check
|
||||||
|
#define CLRSP BIT(9) //17Byte Long Rsp
|
||||||
|
#define CRSP BIT(8) //Need Rsp
|
||||||
|
|
||||||
|
/* config cmd reg */
|
||||||
|
if (cmd->cmd_code != 18) {
|
||||||
|
reg_cmd = cmd->cmd_code | 0x40 | CK8E;
|
||||||
|
} else {
|
||||||
|
reg_cmd = cmd->cmd_code | 0x40;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (resp_type(cmd))
|
||||||
|
{
|
||||||
|
case RESP_R1B:
|
||||||
|
reg_cmd |= CBUSY | CRSP;
|
||||||
|
break;
|
||||||
|
case RESP_R2:
|
||||||
|
reg_cmd |= CLRSP | CRSP;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
reg_cmd |= CRSP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_D("CMD:%d 0x%04X ARG:0x%08x RES:%s%s%s%s%s%s%s%s%s rw:%c len:%d blksize:%d",
|
||||||
|
cmd->cmd_code,
|
||||||
|
reg_cmd,
|
||||||
|
cmd->arg,
|
||||||
|
resp_type(cmd) == RESP_NONE ? "NONE" : "",
|
||||||
|
resp_type(cmd) == RESP_R1 ? "R1" : "",
|
||||||
|
resp_type(cmd) == RESP_R1B ? "R1B" : "",
|
||||||
|
resp_type(cmd) == RESP_R2 ? "R2" : "",
|
||||||
|
resp_type(cmd) == RESP_R3 ? "R3" : "",
|
||||||
|
resp_type(cmd) == RESP_R4 ? "R4" : "",
|
||||||
|
resp_type(cmd) == RESP_R5 ? "R5" : "",
|
||||||
|
resp_type(cmd) == RESP_R6 ? "R6" : "",
|
||||||
|
resp_type(cmd) == RESP_R7 ? "R7" : "",
|
||||||
|
data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-',
|
||||||
|
data ? data->blks * data->blksize : 0,
|
||||||
|
data ? data->blksize : 0
|
||||||
|
);
|
||||||
|
|
||||||
|
/* config data reg */
|
||||||
|
if (data != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_uint32_t dir = 0;
|
||||||
|
rt_uint32_t size = data->blks * data->blksize;
|
||||||
|
int order;
|
||||||
|
|
||||||
|
order = get_order(data->blksize);
|
||||||
|
dir = (data->flags & DATA_DIR_READ) ? HW_SDIO_TO_HOST : 0;
|
||||||
|
|
||||||
|
data_flag = data->flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* transfer config */
|
||||||
|
if (data_flag & DATA_DIR_READ)
|
||||||
|
{
|
||||||
|
rthw_sdio_transfer_by_dma(sdio, pkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* send cmd */
|
||||||
|
hw_sdio[SDxARG3] = cmd->arg;
|
||||||
|
hw_sdio[SDxCMD] = reg_cmd;
|
||||||
|
|
||||||
|
/* wait cmd completed */
|
||||||
|
rthw_sdio_wait_completed(sdio);
|
||||||
|
|
||||||
|
/* transfer config */
|
||||||
|
if (data != RT_NULL)
|
||||||
|
{
|
||||||
|
do {
|
||||||
|
if ((data_flag & DATA_DIR_WRITE) || ((data_flag & DATA_DIR_READ) && (pkg->xfer_blks != 0))) {
|
||||||
|
rthw_sdio_transfer_by_dma(sdio, pkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_uint32_t status = 0;
|
||||||
|
|
||||||
|
if (rt_event_recv(&sdio->event, 0xFFFFFFFF & ~HW_SDIO_CON_DFLAG, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
|
||||||
|
rt_tick_from_millisecond(5000), &status) != RT_EOK)
|
||||||
|
{
|
||||||
|
LOG_E("wait completed timeout");
|
||||||
|
LOG_E("SDxCON=0x%X SDxCMD=0x%X\n", hw_sdio[SDxCON], hw_sdio[SDxCMD]);
|
||||||
|
cmd->err = -RT_ETIMEOUT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data_flag & DATA_DIR_WRITE) {
|
||||||
|
if (((hw_sdio[SDxCON] & HW_SDIO_CON_CRCS) >> 17) != 2) {
|
||||||
|
LOG_E("Write CRC error!");
|
||||||
|
cmd->err = -RT_ERROR;
|
||||||
|
hw_sdio[SDxCPND] = HW_SDIO_CON_DFLAG;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while(++pkg->xfer_blks != data->blks);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* clear pkg */
|
||||||
|
sdio->pkg = RT_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function send sdio request.
|
||||||
|
* @param host rt_mmcsd_host
|
||||||
|
* @param req request
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void rthw_sdio_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req)
|
||||||
|
{
|
||||||
|
struct sdio_pkg pkg;
|
||||||
|
struct rthw_sdio *sdio = host->private_data;
|
||||||
|
struct rt_mmcsd_data *data;
|
||||||
|
|
||||||
|
RTHW_SDIO_LOCK(sdio);
|
||||||
|
|
||||||
|
if (req->cmd != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_memset(&pkg, 0, sizeof(pkg));
|
||||||
|
data = req->cmd->data;
|
||||||
|
pkg.cmd = req->cmd;
|
||||||
|
|
||||||
|
if (data != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_uint32_t size = data->blks * data->blksize;
|
||||||
|
|
||||||
|
RT_ASSERT(size <= SDIO_BUFF_SIZE);
|
||||||
|
|
||||||
|
pkg.buff = data->buf;
|
||||||
|
if ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1))
|
||||||
|
{
|
||||||
|
pkg.buff = cache_buf;
|
||||||
|
if (data->flags & DATA_DIR_WRITE)
|
||||||
|
{
|
||||||
|
rt_memcpy(cache_buf, data->buf, size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rthw_sdio_send_command(sdio, &pkg);
|
||||||
|
|
||||||
|
if ((data != RT_NULL) && (data->flags & DATA_DIR_READ) && ((rt_uint32_t)data->buf & (SDIO_ALIGN_LEN - 1)))
|
||||||
|
{
|
||||||
|
rt_memcpy(data->buf, cache_buf, data->blksize * data->blks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (req->stop != RT_NULL)
|
||||||
|
{
|
||||||
|
rt_memset(&pkg, 0, sizeof(pkg));
|
||||||
|
pkg.cmd = req->stop;
|
||||||
|
rthw_sdio_send_command(sdio, &pkg);
|
||||||
|
}
|
||||||
|
|
||||||
|
RTHW_SDIO_UNLOCK(sdio);
|
||||||
|
|
||||||
|
mmcsd_req_complete(sdio->host);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function config sdio.
|
||||||
|
* @param host rt_mmcsd_host
|
||||||
|
* @param io_cfg rt_mmcsd_io_cfg
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
static void rthw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg)
|
||||||
|
{
|
||||||
|
rt_uint32_t clkcr, div, clk_src;
|
||||||
|
rt_uint32_t clk = io_cfg->clock;
|
||||||
|
struct rthw_sdio *sdio = host->private_data;
|
||||||
|
hal_sfr_t hw_sdio = sdio->sdio_des.hw_sdio;
|
||||||
|
|
||||||
|
clk_src = sdio->sdio_des.clk_get(sdio->sdio_des.hw_sdio);
|
||||||
|
if (clk_src < 240 * 1000)
|
||||||
|
{
|
||||||
|
LOG_E("The clock rate is too low! rata:%d", clk_src);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (clk > host->freq_max) clk = host->freq_max;
|
||||||
|
|
||||||
|
if (clk > clk_src)
|
||||||
|
{
|
||||||
|
// LOG_W("Setting rate(%d) is greater than clock source rate(%d).", clk, clk_src);
|
||||||
|
// clk = clk_src;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_D("clk:%d width:%s%s%s power:%s%s%s",
|
||||||
|
clk,
|
||||||
|
io_cfg->bus_width == MMCSD_BUS_WIDTH_8 ? "8" : "",
|
||||||
|
io_cfg->bus_width == MMCSD_BUS_WIDTH_4 ? "4" : "",
|
||||||
|
io_cfg->bus_width == MMCSD_BUS_WIDTH_1 ? "1" : "",
|
||||||
|
io_cfg->power_mode == MMCSD_POWER_OFF ? "OFF" : "",
|
||||||
|
io_cfg->power_mode == MMCSD_POWER_UP ? "UP" : "",
|
||||||
|
io_cfg->power_mode == MMCSD_POWER_ON ? "ON" : ""
|
||||||
|
);
|
||||||
|
|
||||||
|
RTHW_SDIO_LOCK(sdio);
|
||||||
|
|
||||||
|
switch (io_cfg->power_mode)
|
||||||
|
{
|
||||||
|
case MMCSD_POWER_OFF:
|
||||||
|
hw_sdio[SDxCON] &= ~BIT(0);
|
||||||
|
break;
|
||||||
|
case MMCSD_POWER_UP:
|
||||||
|
sd_baud = 199;
|
||||||
|
hw_sdio[SDxCON] = 0;
|
||||||
|
rt_thread_mdelay(1);
|
||||||
|
|
||||||
|
hw_sdio[SDxCON] |= BIT(0); /* SD control enable */
|
||||||
|
hw_sdio[SDxBAUD] = sysclk_update_baud(sd_baud);
|
||||||
|
hw_sdio[SDxCON] |= BIT(3); /* Keep clock output */
|
||||||
|
hw_sdio[SDxCON] |= BIT(4);
|
||||||
|
hw_sdio[SDxCON] |= BIT(5); /* Data interrupt enable */
|
||||||
|
|
||||||
|
hal_mdelay(40);
|
||||||
|
break;
|
||||||
|
case MMCSD_POWER_ON:
|
||||||
|
if (clk == SDIO_MAX_FREQ) {
|
||||||
|
hw_sdio[SDxCON] &= ~BIT(3);
|
||||||
|
sd_baud = 3;
|
||||||
|
hw_sdio[SDxBAUD] = sysclk_update_baud(sd_baud);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LOG_W("unknown power_mode %d", io_cfg->power_mode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
RTHW_SDIO_UNLOCK(sdio);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function update sdio interrupt.
|
||||||
|
* @param host rt_mmcsd_host
|
||||||
|
* @param enable
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void rthw_sdio_irq_update(struct rt_mmcsd_host *host, rt_int32_t enable)
|
||||||
|
{
|
||||||
|
struct rthw_sdio *sdio = host->private_data;
|
||||||
|
hal_sfr_t hw_sdio = sdio->sdio_des.hw_sdio;
|
||||||
|
|
||||||
|
if (enable)
|
||||||
|
{
|
||||||
|
LOG_D("enable sdio irq");
|
||||||
|
rt_hw_irq_enable(IRQ_SD_VECTOR);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LOG_D("disable sdio irq");
|
||||||
|
rt_hw_irq_disable(IRQ_SD_VECTOR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function detect sdcard.
|
||||||
|
* @param host rt_mmcsd_host
|
||||||
|
* @retval 0x01
|
||||||
|
*/
|
||||||
|
static rt_int32_t rthw_sd_detect(struct rt_mmcsd_host *host)
|
||||||
|
{
|
||||||
|
LOG_D("try to detect device");
|
||||||
|
return 0x01;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function interrupt process function.
|
||||||
|
* @param host rt_mmcsd_host
|
||||||
|
* @retval None
|
||||||
|
*/
|
||||||
|
void rthw_sdio_irq_process(struct rt_mmcsd_host *host)
|
||||||
|
{
|
||||||
|
int complete = 0;
|
||||||
|
struct rthw_sdio *sdio = host->private_data;
|
||||||
|
hal_sfr_t hw_sdio = sdio->sdio_des.hw_sdio;
|
||||||
|
rt_uint32_t intstatus = hw_sdio[SDxCON];
|
||||||
|
|
||||||
|
/* clear flag */
|
||||||
|
if (intstatus & HW_SDIO_CON_CFLAG) {
|
||||||
|
complete = 1;
|
||||||
|
hw_sdio[SDxCPND] = HW_SDIO_CON_CFLAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (intstatus & HW_SDIO_CON_DFLAG) {
|
||||||
|
complete = 1;
|
||||||
|
hw_sdio[SDxCPND] = HW_SDIO_CON_DFLAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (complete)
|
||||||
|
{
|
||||||
|
rt_event_send(&sdio->event, intstatus);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct rt_mmcsd_host_ops ab32_sdio_ops =
|
||||||
|
{
|
||||||
|
rthw_sdio_request,
|
||||||
|
rthw_sdio_iocfg,
|
||||||
|
rthw_sd_detect,
|
||||||
|
rthw_sdio_irq_update,
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief This function create mmcsd host.
|
||||||
|
* @param sdio_des ab32_sdio_des
|
||||||
|
* @retval rt_mmcsd_host
|
||||||
|
*/
|
||||||
|
struct rt_mmcsd_host *sdio_host_create(struct ab32_sdio_des *sdio_des)
|
||||||
|
{
|
||||||
|
struct rt_mmcsd_host *host;
|
||||||
|
struct rthw_sdio *sdio = RT_NULL;
|
||||||
|
|
||||||
|
if ((sdio_des == RT_NULL) || (sdio_des->txconfig == RT_NULL) || (sdio_des->rxconfig == RT_NULL))
|
||||||
|
{
|
||||||
|
LOG_E("L:%d F:%s %s %s %s",
|
||||||
|
(sdio_des == RT_NULL ? "sdio_des is NULL" : ""),
|
||||||
|
(sdio_des ? (sdio_des->txconfig ? "txconfig is NULL" : "") : ""),
|
||||||
|
(sdio_des ? (sdio_des->rxconfig ? "rxconfig is NULL" : "") : "")
|
||||||
|
);
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdio = rt_malloc(sizeof(struct rthw_sdio));
|
||||||
|
if (sdio == RT_NULL)
|
||||||
|
{
|
||||||
|
LOG_E("L:%d F:%s malloc rthw_sdio fail");
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
rt_memset(sdio, 0, sizeof(struct rthw_sdio));
|
||||||
|
|
||||||
|
host = mmcsd_alloc_host();
|
||||||
|
if (host == RT_NULL)
|
||||||
|
{
|
||||||
|
LOG_E("L:%d F:%s mmcsd alloc host fail");
|
||||||
|
rt_free(sdio);
|
||||||
|
return RT_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rt_memcpy(&sdio->sdio_des, sdio_des, sizeof(struct ab32_sdio_des));
|
||||||
|
sdio->sdio_des.hw_sdio = (sdio_des->hw_sdio == RT_NULL ? SDMMC0_BASE : sdio_des->hw_sdio);
|
||||||
|
sdio->sdio_des.clk_get = (sdio_des->clk_get == RT_NULL ? ab32_sdio_clk_get : sdio_des->clk_get);
|
||||||
|
|
||||||
|
rt_event_init(&sdio->event, "sdio", RT_IPC_FLAG_FIFO);
|
||||||
|
rt_mutex_init(&sdio->mutex, "sdio", RT_IPC_FLAG_FIFO);
|
||||||
|
|
||||||
|
/* set host defautl attributes */
|
||||||
|
host->ops = &ab32_sdio_ops;
|
||||||
|
host->freq_min = 240 * 1000;
|
||||||
|
host->freq_max = SDIO_MAX_FREQ;
|
||||||
|
host->valid_ocr = 0X00FFFF80;/* The voltage range supported is 1.65v-3.6v */
|
||||||
|
#ifndef SDIO_USING_1_BIT
|
||||||
|
host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ;
|
||||||
|
#else
|
||||||
|
host->flags = MMCSD_MUTBLKWRITE | MMCSD_SUP_SDIO_IRQ;
|
||||||
|
#endif
|
||||||
|
host->max_seg_size = SDIO_BUFF_SIZE;
|
||||||
|
host->max_dma_segs = 1;
|
||||||
|
host->max_blk_size = 512;
|
||||||
|
host->max_blk_count = 512;
|
||||||
|
|
||||||
|
/* link up host and sdio */
|
||||||
|
sdio->host = host;
|
||||||
|
host->private_data = sdio;
|
||||||
|
|
||||||
|
rthw_sdio_irq_update(host, 1);
|
||||||
|
|
||||||
|
/* ready to change */
|
||||||
|
mmcsd_change(host);
|
||||||
|
|
||||||
|
return host;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t _dma_txconfig(rt_uint32_t *src, int Size)
|
||||||
|
{
|
||||||
|
hal_sfr_t sdiox = sdio_config->instance;
|
||||||
|
|
||||||
|
sdiox[SDxDMAADR] = DMA_ADR(src);
|
||||||
|
sdiox[SDxDMACNT] = BIT(18) | BIT(17) | BIT(16) | Size;
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static rt_err_t _dma_rxconfig(rt_uint32_t *dst, int Size)
|
||||||
|
{
|
||||||
|
hal_sfr_t sdiox = sdio_config->instance;
|
||||||
|
|
||||||
|
sdiox[SDxDMAADR] = DMA_ADR(dst);
|
||||||
|
sdiox[SDxDMACNT] = (Size);
|
||||||
|
return RT_EOK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sdio_isr(int vector, void *param)
|
||||||
|
{
|
||||||
|
/* enter interrupt */
|
||||||
|
rt_interrupt_enter();
|
||||||
|
/* Process All SDIO Interrupt Sources */
|
||||||
|
rthw_sdio_irq_process(host);
|
||||||
|
|
||||||
|
/* leave interrupt */
|
||||||
|
rt_interrupt_leave();
|
||||||
|
}
|
||||||
|
|
||||||
|
int rt_hw_sdio_init(void)
|
||||||
|
{
|
||||||
|
struct ab32_sdio_des sdio_des = {0};
|
||||||
|
struct sd_handle hsd = {0};
|
||||||
|
uint8_t param = 0;
|
||||||
|
hsd.instance = SDMMC0_BASE;
|
||||||
|
|
||||||
|
hal_rcu_periph_clk_enable(RCU_SD0);
|
||||||
|
hal_sd_mspinit(&hsd);
|
||||||
|
|
||||||
|
rt_hw_interrupt_install(IRQ_SD_VECTOR, sdio_isr, ¶m, "sd_isr");
|
||||||
|
|
||||||
|
sdio_des.clk_get = ab32_sdio_clk_get;
|
||||||
|
sdio_des.hw_sdio = SDMMC0_BASE;
|
||||||
|
sdio_des.rxconfig = _dma_rxconfig;
|
||||||
|
sdio_des.txconfig = _dma_txconfig;
|
||||||
|
|
||||||
|
host = sdio_host_create(&sdio_des);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
INIT_DEVICE_EXPORT(rt_hw_sdio_init);
|
||||||
|
|
||||||
|
void ab32_mmcsd_change(void)
|
||||||
|
{
|
||||||
|
mmcsd_change(host);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // 0
|
|
@ -0,0 +1,140 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
* Change Logs:
|
||||||
|
* Date Author Notes
|
||||||
|
* 2020-11-30 greedyhao first version
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef DEV_SDIO_H__
|
||||||
|
#define DEV_SDIO_H__
|
||||||
|
|
||||||
|
#include "drv_common.h"
|
||||||
|
#include "board.h"
|
||||||
|
#include "drivers/mmcsd_core.h"
|
||||||
|
#include "drivers/sdio.h"
|
||||||
|
|
||||||
|
#define SDIO_BUFF_SIZE 1024
|
||||||
|
#define SDIO_ALIGN_LEN 32
|
||||||
|
|
||||||
|
#ifndef SDIO_MAX_FREQ
|
||||||
|
#define SDIO_MAX_FREQ (1000000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDIO_BASE_ADDRESS
|
||||||
|
#define SDIO_BASE_ADDRESS (0x40012800U)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDIO_CLOCK_FREQ
|
||||||
|
#define SDIO_CLOCK_FREQ (48U * 1000 * 1000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDIO_BUFF_SIZE
|
||||||
|
#define SDIO_BUFF_SIZE (4096)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDIO_ALIGN_LEN
|
||||||
|
#define SDIO_ALIGN_LEN (32)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef SDIO_MAX_FREQ
|
||||||
|
#define SDIO_MAX_FREQ (24 * 1000 * 1000)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define HW_SDIO_CON_
|
||||||
|
#define HW_SDIO_CON_CFLAG (0x01u << 12) /*!< 0:send command or received response not finish \
|
||||||
|
1:send command or received response finish */
|
||||||
|
#define HW_SDIO_CON_DFLAG (0x01u << 13) /*!< 0:send or received data not finish \
|
||||||
|
1:send or received data finish */
|
||||||
|
#define HW_SDIO_CON_CCRCE (0x01u << 14) /*!< 0:command crc no error \
|
||||||
|
1:command crc error detected */
|
||||||
|
#define HW_SDIO_CON_NRPS (0x01u << 15) /*!< 0:response received 1:no response received */
|
||||||
|
#define HW_SDIO_CON_DCRCE (0x01u << 16) /*!< 0:read data crc no error \
|
||||||
|
1:read data crc error detected */
|
||||||
|
#define HW_SDIO_CON_CRCS (0x07u << 17) /*!< 101:error transmission \
|
||||||
|
010:non-erroneous transmission \
|
||||||
|
111:flash error */
|
||||||
|
#define HW_SDIO_CON_BUSY (0x01u << 20) /*!< 0:device busy 1:device not busy */
|
||||||
|
|
||||||
|
#define HW_SDIO_ERRORS \
|
||||||
|
(0)
|
||||||
|
|
||||||
|
#define HW_SDIO_POWER_OFF (0x00U)
|
||||||
|
#define HW_SDIO_POWER_UP (0x02U)
|
||||||
|
#define HW_SDIO_POWER_ON (0x03U)
|
||||||
|
|
||||||
|
#define HW_SDIO_FLOW_ENABLE (0x01U << 14)
|
||||||
|
#define HW_SDIO_BUSWIDE_1B (0x00U << 11)
|
||||||
|
#define HW_SDIO_BUSWIDE_4B (0x01U << 11)
|
||||||
|
#define HW_SDIO_BUSWIDE_8B (0x02U << 11)
|
||||||
|
#define HW_SDIO_BYPASS_ENABLE (0x01U << 10)
|
||||||
|
#define HW_SDIO_IDLE_ENABLE (0x01U << 9)
|
||||||
|
#define HW_SDIO_CLK_ENABLE (0x01U << 8)
|
||||||
|
|
||||||
|
#define HW_SDIO_SUSPEND_CMD (0x01U << 11)
|
||||||
|
#define HW_SDIO_CPSM_ENABLE (0x01U << 10)
|
||||||
|
#define HW_SDIO_WAIT_END (0x01U << 9)
|
||||||
|
#define HW_SDIO_WAIT_INT (0x01U << 8)
|
||||||
|
#define HW_SDIO_RESPONSE_NO (0x00U << 6)
|
||||||
|
#define HW_SDIO_RESPONSE_SHORT (0x01U << 6)
|
||||||
|
#define HW_SDIO_RESPONSE_LONG (0x03U << 6)
|
||||||
|
|
||||||
|
#define HW_SDIO_DATA_LEN_MASK (0x01FFFFFFU)
|
||||||
|
|
||||||
|
#define HW_SDIO_IO_ENABLE (0x01U << 11)
|
||||||
|
#define HW_SDIO_RWMOD_CK (0x01U << 10)
|
||||||
|
#define HW_SDIO_RWSTOP_ENABLE (0x01U << 9)
|
||||||
|
#define HW_SDIO_RWSTART_ENABLE (0x01U << 8)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_1 (0x00U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_2 (0x01U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_4 (0x02U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_8 (0x03U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_16 (0x04U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_32 (0x05U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_64 (0x06U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_128 (0x07U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_256 (0x08U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_512 (0x09U << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_1024 (0x0AU << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_2048 (0x0BU << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_4096 (0x0CU << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_8192 (0x0DU << 4)
|
||||||
|
#define HW_SDIO_DBLOCKSIZE_16384 (0x0EU << 4)
|
||||||
|
#define HW_SDIO_DMA_ENABLE (0x01U << 3)
|
||||||
|
#define HW_SDIO_STREAM_ENABLE (0x01U << 2)
|
||||||
|
#define HW_SDIO_TO_HOST (0x01U << 1)
|
||||||
|
#define HW_SDIO_DPSM_ENABLE (0x01U << 0)
|
||||||
|
|
||||||
|
#define HW_SDIO_DATATIMEOUT (0xF0000000U)
|
||||||
|
|
||||||
|
// struct ab32_sdio
|
||||||
|
// {};
|
||||||
|
|
||||||
|
typedef rt_err_t (*dma_txconfig)(rt_uint32_t *src, int size);
|
||||||
|
typedef rt_err_t (*dma_rxconfig)(rt_uint32_t *dst, int size);
|
||||||
|
typedef rt_uint32_t (*sdio_clk_get)(hal_sfr_t hw_sdio);
|
||||||
|
|
||||||
|
struct ab32_sdio_des
|
||||||
|
{
|
||||||
|
hal_sfr_t hw_sdio;
|
||||||
|
dma_txconfig txconfig;
|
||||||
|
dma_rxconfig rxconfig;
|
||||||
|
sdio_clk_get clk_get;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ab32_sdio_config
|
||||||
|
{
|
||||||
|
hal_sfr_t instance;
|
||||||
|
// struct dma_config dma_rx, dma_tx;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ab32_sdio_class
|
||||||
|
{
|
||||||
|
const struct ab32_sdio_config *cfg;
|
||||||
|
struct rt_mmcsd_host host;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2020-2020, Bluetrum Development Team
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2006-2020, Bluetrum Development Team
|
* Copyright (c) 2020-2021, Bluetrum Development Team
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
* Change Logs:
|
* Change Logs:
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
#define HAL_RCU_MODULE_ENABLED
|
#define HAL_RCU_MODULE_ENABLED
|
||||||
#define HAL_WDT_MODULE_ENABLED
|
#define HAL_WDT_MODULE_ENABLED
|
||||||
// #define HAL_DAC_MODULE_ENABLED
|
// #define HAL_DAC_MODULE_ENABLED
|
||||||
// #define HAL_SD_MODULE_ENABLED
|
#define HAL_SD_MODULE_ENABLED
|
||||||
|
|
||||||
/* Includes */
|
/* Includes */
|
||||||
#ifdef HAL_GPIO_MODULE_ENABLED
|
#ifdef HAL_GPIO_MODULE_ENABLED
|
||||||
|
|
|
@ -8,35 +8,73 @@
|
||||||
#define AB32VG1_HAL_SD_H__
|
#define AB32VG1_HAL_SD_H__
|
||||||
|
|
||||||
#include "ab32vg1_hal_def.h"
|
#include "ab32vg1_hal_def.h"
|
||||||
|
#include "ab32vg1_ll_sdio.h"
|
||||||
struct sd_init
|
#include <stdbool.h>
|
||||||
{
|
|
||||||
// uint8_t
|
|
||||||
};
|
|
||||||
|
|
||||||
struct sd_card_info
|
struct sd_card_info
|
||||||
{
|
{
|
||||||
uint32_t rca; /*!< Specifies the Relative Card Address */
|
uint32_t rca; /*!< Specifies the Relative Card Address */
|
||||||
uint8_t type; /*!< Specifies the card type */
|
uint32_t capacity; /*!< Specifies the capacity of the card */
|
||||||
|
uint8_t abend; /*!< Specifies if the card is abnormal end */
|
||||||
|
uint8_t flag_sdhc; /*!< Specifies if the card is SDHC card */
|
||||||
|
uint8_t type; /*!< Specifies the card type */
|
||||||
|
uint8_t state; /*!< Specifies the card state */
|
||||||
|
uint8_t rw_state; /*!< Specifies the last r/w state of the card */
|
||||||
};
|
};
|
||||||
typedef struct sd_card_info* sd_card_info_t;
|
typedef struct sd_card_info* sd_card_info_t;
|
||||||
|
|
||||||
|
struct sd_cfg
|
||||||
|
{
|
||||||
|
uint16_t go_ready_retry;
|
||||||
|
uint8_t identification_retry;
|
||||||
|
uint8_t rw_retry;
|
||||||
|
uint8_t rw_init_retry;
|
||||||
|
uint8_t stop_retry;
|
||||||
|
uint8_t rw_need_stop;
|
||||||
|
};
|
||||||
|
|
||||||
struct sd_handle
|
struct sd_handle
|
||||||
{
|
{
|
||||||
hal_sfr_t instance;
|
hal_sfr_t instance;
|
||||||
struct sd_init init;
|
struct sdio_init init;
|
||||||
struct sd_card_info sdcard;
|
struct sd_card_info sdcard;
|
||||||
|
struct sd_cfg cfg;
|
||||||
};
|
};
|
||||||
typedef struct sd_handle* sd_handle_t;
|
typedef struct sd_handle* sd_handle_t;
|
||||||
|
|
||||||
#define SD0N (0x00u)
|
#define SD0N (0x00u)
|
||||||
|
|
||||||
#define CARD_V1 (0x01u)
|
// #define CARD_SDSC (0x00u)
|
||||||
#define CARD_V2 (0x02u)
|
// #define CARD_SDHC (0x01u)
|
||||||
#define CARD_MMC (0x03u)
|
// #define CARD_SECURED (0x03u)
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
CARD_INVAL = 0x00,
|
||||||
|
CARD_V1,
|
||||||
|
CARD_V2,
|
||||||
|
CARD_MMC
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HAL_SD_RW_STATE_IDLE = 0x00,
|
||||||
|
HAL_SD_RW_STATE_READ,
|
||||||
|
HAL_SD_RW_STATE_WRITE,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
HAL_SD_STATE_RESET = 0x00,
|
||||||
|
HAL_SD_STATE_NEW,
|
||||||
|
HAL_SD_STATE_OK,
|
||||||
|
HAL_SD_STATE_INVAL,
|
||||||
|
};
|
||||||
|
|
||||||
#define SDMMC_CHECK_PATTERM (0x000001AAu)
|
#define SDMMC_CHECK_PATTERM (0x000001AAu)
|
||||||
|
|
||||||
|
#define SDMMC0_BASE ((hal_sfr_t)&SD0CON)
|
||||||
|
|
||||||
/* Initialization functions */
|
/* Initialization functions */
|
||||||
hal_error_t hal_sd_init(sd_handle_t hsd);
|
hal_error_t hal_sd_init(sd_handle_t hsd);
|
||||||
void hal_sd_deinit(uint32_t sdx);
|
void hal_sd_deinit(uint32_t sdx);
|
||||||
|
@ -44,7 +82,7 @@ void hal_sd_mspinit(sd_handle_t hsd);
|
||||||
|
|
||||||
hal_error_t hal_sd_control(uint32_t control, uint32_t arg);
|
hal_error_t hal_sd_control(uint32_t control, uint32_t arg);
|
||||||
void hal_sd_write(uint32_t sdx, uint32_t data);
|
void hal_sd_write(uint32_t sdx, uint32_t data);
|
||||||
uint32_t hal_sd_read(uint32_t sdx);
|
bool hal_sd_read(sd_handle_t hsd, void *buf, uint32_t lba);
|
||||||
// void hal_uart_write_it(uint32_t uartx, uint8_t data);
|
// void hal_uart_write_it(uint32_t uartx, uint8_t data);
|
||||||
// uint8_t hal_uart_read_it(uint32_t uartx);
|
// uint8_t hal_uart_read_it(uint32_t uartx);
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,28 @@
|
||||||
|
|
||||||
struct sdio_init
|
struct sdio_init
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
uint32_t clock_power_save; /*!< Specifies whether SDMMC Clock output is enabled or
|
||||||
|
disabled when the bus is idle. */
|
||||||
|
uint32_t clock_div; /*!< Specifies the clock frequency of the SDMMC controller.
|
||||||
|
This parameter can be a value between Min_Data = 0 and Max_Data = 255 */
|
||||||
};
|
};
|
||||||
typedef struct sdio_init* sdio_init_t;
|
typedef struct sdio_init* sdio_init_t;
|
||||||
|
|
||||||
|
#define SDMMC_CLOCK_POWER_SAVE_DISABLE (0x00u)
|
||||||
|
#define SDMMC_CLOCK_POWER_SAVE_ENABLE (0x01u)
|
||||||
|
|
||||||
|
enum
|
||||||
|
{
|
||||||
|
SDxCON = 0, /* [20]:BUSY [19:17]:CRCS [16]:DCRCE [15]:NRPS [1]:Data bus width [0]:SD enable */
|
||||||
|
SDxCPND,
|
||||||
|
SDxBAUD,
|
||||||
|
SDxCMD,
|
||||||
|
SDxARG3,
|
||||||
|
SDxARG2,
|
||||||
|
SDxARG1,
|
||||||
|
SDxARG0,
|
||||||
|
SDxDMAADR,
|
||||||
|
SDxDMACNT,
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
#include "ab32vg1_hal.h"
|
#include "ab32vg1_hal.h"
|
||||||
#include "ab32vg1_ll_sdio.h"
|
|
||||||
|
|
||||||
#ifdef HAL_SD_MODULE_ENABLED
|
#ifdef HAL_SD_MODULE_ENABLED
|
||||||
|
|
||||||
#include <stdbool.h>
|
|
||||||
|
|
||||||
#define HAL_LOG(...) hal_printf(__VA_ARGS__)
|
#define HAL_LOG(...) hal_printf(__VA_ARGS__)
|
||||||
|
|
||||||
/************************* LL ************************************/
|
/************************* LL ************************************/
|
||||||
|
@ -27,37 +24,27 @@
|
||||||
#define RSP_BUSY_TIMEOUT 2400000 //大约2s
|
#define RSP_BUSY_TIMEOUT 2400000 //大约2s
|
||||||
#define RSP_TIMEOUT 6000 //大约5ms
|
#define RSP_TIMEOUT 6000 //大约5ms
|
||||||
|
|
||||||
enum
|
|
||||||
{
|
|
||||||
SDCON = 0, /* [20]:BUSY [19:17]:CRCS [16]:DCRCE [15]:NRPS [1]:Data bus width [0]:SD enable */
|
|
||||||
SDCPND,
|
|
||||||
SDBAUD,
|
|
||||||
SDCMD,
|
|
||||||
SDARG3,
|
|
||||||
SDARG2,
|
|
||||||
SDARG1,
|
|
||||||
SDARG0,
|
|
||||||
SDDMAADR,
|
|
||||||
SDDMACNT,
|
|
||||||
};
|
|
||||||
|
|
||||||
uint8_t sysclk_update_baud(uint8_t baud);
|
uint8_t sysclk_update_baud(uint8_t baud);
|
||||||
|
|
||||||
void sdio_setbaud(hal_sfr_t sdiox, uint8_t baud)
|
void sdio_setbaud(hal_sfr_t sdiox, uint8_t baud)
|
||||||
{
|
{
|
||||||
sdiox[SDBAUD] = sysclk_update_baud(baud);
|
sdiox[SDxBAUD] = sysclk_update_baud(baud);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdio_init(hal_sfr_t sdiox, sdio_init_t init)
|
void sdio_init(hal_sfr_t sdiox, sdio_init_t init)
|
||||||
{
|
{
|
||||||
/* Set clock */
|
sdiox[SDxCON] = 0;
|
||||||
sdio_setbaud(sdiox, 199);
|
|
||||||
|
|
||||||
sdiox[SDCON] = 0;
|
|
||||||
hal_udelay(20);
|
hal_udelay(20);
|
||||||
sdiox[SDCON] |= BIT(0); /* SD control enable */
|
sdiox[SDxCON] |= BIT(0); /* SD control enable */
|
||||||
sdiox[SDCON] |= BIT(3); /* Keep clock output */
|
sdio_setbaud(sdiox, init->clock_div); /* Set clock */
|
||||||
sdiox[SDCON] |= BIT(5); /* Data interrupt enable */
|
if (init->clock_power_save == SDMMC_CLOCK_POWER_SAVE_DISABLE) {
|
||||||
|
sdiox[SDxCON] |= BIT(3); /* Keep clock output */
|
||||||
|
} else {
|
||||||
|
sdiox[SDxCON] &= ~BIT(3); /* Keep clock output */
|
||||||
|
}
|
||||||
|
sdiox[SDxCON] |= BIT(5); /* Data interrupt enable */
|
||||||
|
|
||||||
hal_mdelay(40);
|
hal_mdelay(40);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -70,8 +57,8 @@ void sdio_init(hal_sfr_t sdiox, sdio_init_t init)
|
||||||
*/
|
*/
|
||||||
bool sdio_check_finish(hal_sfr_t sdiox)
|
bool sdio_check_finish(hal_sfr_t sdiox)
|
||||||
{
|
{
|
||||||
if (sdiox[SDCON] & BIT(12)) {
|
if (sdiox[SDxCON] & BIT(12)) {
|
||||||
sdiox[SDCPND] = BIT(12);
|
sdiox[SDxCPND] = BIT(12);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -86,19 +73,21 @@ bool sdio_check_finish(hal_sfr_t sdiox)
|
||||||
*/
|
*/
|
||||||
bool sdio_check_rsp(hal_sfr_t sdiox)
|
bool sdio_check_rsp(hal_sfr_t sdiox)
|
||||||
{
|
{
|
||||||
return !(sdiox[SDCON] & BIT(15));
|
return !(sdiox[SDxCON] & BIT(15));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool sdio_send_cmd(hal_sfr_t sdiox, uint32_t cmd, uint32_t arg)
|
bool sdio_send_cmd(hal_sfr_t sdiox, uint32_t cmd, uint32_t arg, uint8_t *abend)
|
||||||
{
|
{
|
||||||
uint32_t time_out = (cmd & CBUSY) ? RSP_BUSY_TIMEOUT : RSP_TIMEOUT;
|
uint32_t time_out = (cmd & CBUSY) ? RSP_BUSY_TIMEOUT : RSP_TIMEOUT;
|
||||||
sdiox[SDCMD] = cmd;
|
sdiox[SDxARG3] = arg;
|
||||||
sdiox[SDARG3] = arg;
|
sdiox[SDxCMD] = cmd;
|
||||||
|
|
||||||
while (sdio_check_finish(sdiox) == false) {
|
while (sdio_check_finish(sdiox) == false) {
|
||||||
if (--time_out == 0) {
|
if (--time_out == 0) {
|
||||||
HAL_LOG("cmd time out\n");
|
HAL_LOG("cmd time out\n");
|
||||||
// card.abend = 1;
|
if (abend != HAL_NULL) {
|
||||||
|
*abend = 1;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -108,57 +97,258 @@ bool sdio_send_cmd(hal_sfr_t sdiox, uint32_t cmd, uint32_t arg)
|
||||||
|
|
||||||
uint8_t sdio_get_cmd_rsp(hal_sfr_t sdiox)
|
uint8_t sdio_get_cmd_rsp(hal_sfr_t sdiox)
|
||||||
{
|
{
|
||||||
return -1;
|
return sdiox[SDxCMD];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t sdio_get_rsp(hal_sfr_t sdiox, uint32_t rsp)
|
uint32_t sdio_get_rsp(hal_sfr_t sdiox, uint32_t rsp_reg)
|
||||||
{
|
{
|
||||||
return -1;
|
return sdiox[rsp_reg];
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdio_read_kick(hal_sfr_t sdiox, void* buf)
|
void sdio_read_kick(hal_sfr_t sdiox, void* buf)
|
||||||
{}
|
{
|
||||||
|
sdiox[SDxDMAADR] = DMA_ADR(buf);
|
||||||
|
sdiox[SDxDMACNT] = 512;
|
||||||
|
}
|
||||||
|
|
||||||
void sdio_write_kick(hal_sfr_t sdiox, void* buf)
|
void sdio_write_kick(hal_sfr_t sdiox, void* buf)
|
||||||
{}
|
{
|
||||||
|
sdiox[SDxDMAADR] = DMA_ADR(buf);
|
||||||
|
sdiox[SDxDMACNT] = BIT(18) | BIT(17) | BIT(16) | 512;
|
||||||
|
}
|
||||||
|
|
||||||
bool sdio_isbusy(hal_sfr_t sdiox)
|
bool sdio_isbusy(hal_sfr_t sdiox)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdmmc_go_idle_state(hal_sfr_t sdiox)
|
bool sdmmc_cmd_go_idle_state(sd_handle_t hsd)
|
||||||
{
|
{
|
||||||
// hal_sfr_t sdiox = hsd->instance;
|
return sdio_send_cmd(hsd->instance, 0 | RSP_NO, hsd->sdcard.rca, &(hsd->sdcard.abend));
|
||||||
sdio_send_cmd(sdiox, 0x00 | RSP_NO, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdmmc_send_if_cond(hal_sfr_t sdiox)
|
bool sdmmc_cmd_send_if_cond(sd_handle_t hsd)
|
||||||
{
|
{
|
||||||
// hal_sfr_t sdiox = hsd->instance;
|
return sdio_send_cmd(hsd->instance, 8 | RSP_7, SDMMC_CHECK_PATTERM, &(hsd->sdcard.abend));
|
||||||
sdio_send_cmd(sdiox, 0x08 | RSP_7, SDMMC_CHECK_PATTERM);
|
}
|
||||||
|
|
||||||
|
bool sdmmc_cmd_all_send_cid(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
return sdio_send_cmd(hsd->instance, 2 | RSP_2, 0, &(hsd->sdcard.abend));
|
||||||
|
}
|
||||||
|
|
||||||
|
void sdmmc_cmd_set_rel_addr(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
hal_sfr_t sdiox = hsd->instance;
|
||||||
|
|
||||||
|
if (hsd->sdcard.type == CARD_MMC) {
|
||||||
|
hsd->sdcard.rca = 0x00010000;
|
||||||
|
sdio_send_cmd(sdiox, 3 | RSP_1, hsd->sdcard.rca, &(hsd->sdcard.abend));
|
||||||
|
} else {
|
||||||
|
sdio_send_cmd(sdiox, 3 | RSP_6, 0, &(hsd->sdcard.abend));
|
||||||
|
hsd->sdcard.rca = sdio_get_rsp(sdiox, SDxARG3) & 0xffff0000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void sdmmc_cmd_send_csd(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
hal_sfr_t sdiox = hsd->instance;
|
||||||
|
|
||||||
|
sdio_send_cmd(sdiox, 9 | RSP_2, hsd->sdcard.rca, &(hsd->sdcard.abend));
|
||||||
|
if (hsd->sdcard.type == CARD_MMC) {
|
||||||
|
//
|
||||||
|
} else {
|
||||||
|
if (hsd->sdcard.flag_sdhc == 1) {
|
||||||
|
hsd->sdcard.capacity = (sdio_get_rsp(sdiox, SDxARG2) << 24) & 0x00ff0000; /* rspbuf[8] */
|
||||||
|
hsd->sdcard.capacity |= ((sdio_get_rsp(sdiox, SDxARG1) >> 16) & 0x0000ffff); /* rspbuf[9] rspbuf[10] */
|
||||||
|
hsd->sdcard.capacity += 1;
|
||||||
|
hsd->sdcard.capacity <<= 10;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HAL_LOG("sd capacity=%d\n", hsd->sdcard.capacity);
|
||||||
|
}
|
||||||
|
|
||||||
|
void sdmmc_cmd_select_card(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
sdio_send_cmd(hsd->instance, 7 | RSP_1B, hsd->sdcard.rca, &(hsd->sdcard.abend));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sdmmc_cmd_read_multiblock(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
return sdio_send_cmd(hsd->instance, REQ_MULTREAD, hsd->sdcard.rca, &(hsd->sdcard.abend));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sdmmc_cmd_app(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
return sdio_send_cmd(hsd->instance, 55 | RSP_1, hsd->sdcard.rca, &(hsd->sdcard.abend));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool sdmmc_acmd_op_cond(sd_handle_t hsd, uint32_t voltage)
|
||||||
|
{
|
||||||
|
/* SEND CMD55 APP_CMD with RCA */
|
||||||
|
if (sdmmc_cmd_app(hsd)) {
|
||||||
|
/* Send CMD41 */
|
||||||
|
if (sdio_send_cmd(hsd->instance, 41 | RSP_3, voltage, &(hsd->sdcard.abend))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************* HAL ************************************/
|
/************************* HAL ************************************/
|
||||||
|
|
||||||
|
static bool sd_type_identification(sd_handle_t hsd)
|
||||||
static void sd_poweron(sd_handle_t hsd)
|
|
||||||
{
|
{
|
||||||
sdmmc_go_idle_state(hsd->instance);
|
uint8_t retry = hsd->cfg.identification_retry;
|
||||||
sdmmc_send_if_cond(hsd->instance);
|
while (retry-- > 0)
|
||||||
if (hsd->instance[SDCMD] == 0x08) {
|
{
|
||||||
hsd->sdcard.type = CARD_V2;
|
/* CMD0: GO_IDLE_STATE */
|
||||||
HAL_LOG("SD 2.0\n");
|
sdmmc_cmd_go_idle_state(hsd);
|
||||||
|
|
||||||
|
/* CMD8: SEND_IF_COND: Command available only on V2.0 cards */
|
||||||
|
if (sdmmc_cmd_send_if_cond(hsd)) {
|
||||||
|
if (sdio_get_cmd_rsp(hsd->instance) == 0x08) {
|
||||||
|
hsd->sdcard.type = CARD_V2;
|
||||||
|
HAL_LOG("SD 2.0\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (sdmmc_acmd_op_cond(hsd, 0x00ff8000)) {
|
||||||
|
hsd->sdcard.type = CARD_V1;
|
||||||
|
HAL_LOG("SD 1.0\n");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
hal_mdelay(20);
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool sd_go_ready_try(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
uint32_t tmp = 0;
|
||||||
|
switch (hsd->sdcard.type)
|
||||||
|
{
|
||||||
|
case CARD_V1:
|
||||||
|
sdmmc_acmd_op_cond(hsd, 0x00ff8000);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CARD_V2:
|
||||||
|
sdmmc_acmd_op_cond(hsd, 0x40ff8000);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (0 == (hsd->instance[SDxARG3] & BIT(31))) {
|
||||||
|
return false; // no ready
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((hsd->sdcard.type == CARD_V2) && (hsd->instance[SDxARG3] & BIT(30))) {
|
||||||
|
HAL_LOG("SDHC\n");
|
||||||
|
hsd->sdcard.flag_sdhc = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool sd_go_ready(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
if (hsd->sdcard.type == CARD_INVAL) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t retry = hsd->cfg.go_ready_retry;
|
||||||
|
while (retry-- > 0)
|
||||||
|
{
|
||||||
|
if (sd_go_ready_try(hsd) == true) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
hal_mdelay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool sd_poweron(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
if (sd_type_identification(hsd) == false) {
|
||||||
|
HAL_LOG("card invalid\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sd_go_ready(hsd) == false) {
|
||||||
|
HAL_LOG("no ready\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sd_init_card(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
/* Send CMD2 ALL_SEND_CID */
|
||||||
|
sdmmc_cmd_all_send_cid(hsd);
|
||||||
|
/* Send CMD3 SET_REL_ADDR */
|
||||||
|
sdmmc_cmd_set_rel_addr(hsd);
|
||||||
|
/* Send CMD9 SEND_CSD */
|
||||||
|
sdmmc_cmd_send_csd(hsd);
|
||||||
|
/* Select the Card */
|
||||||
|
sdmmc_cmd_select_card(hsd);
|
||||||
|
|
||||||
|
hsd->init.clock_div = 3;
|
||||||
|
hsd->init.clock_power_save = SDMMC_CLOCK_POWER_SAVE_ENABLE;
|
||||||
|
|
||||||
|
sdio_init(hsd->instance, &(hsd->init));
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool sd_read_wait(sd_handle_t hsd)
|
||||||
|
{
|
||||||
|
bool ret = false;
|
||||||
|
hal_sfr_t sdiox = hsd->instance;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sd_read_start(sd_handle_t hsd, void *buf, uint32_t lba)
|
||||||
|
{
|
||||||
|
if (hsd->sdcard.rw_state == HAL_SD_RW_STATE_READ) {
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (hsd->sdcard.rw_state == HAL_SD_RW_STATE_WRITE) {
|
||||||
|
|
||||||
|
}
|
||||||
|
sdio_read_kick(hsd->instance, buf);
|
||||||
|
sdmmc_cmd_read_multiblock(hsd);
|
||||||
|
}
|
||||||
|
|
||||||
|
hsd->sdcard.rw_state = HAL_SD_RW_STATE_READ;
|
||||||
|
// hsd->sdcard.rw_lba
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool sd_read_try(sd_handle_t hsd, void *buf, uint32_t lba)
|
||||||
|
{
|
||||||
|
HAL_LOG("read: %08x\n", lba);
|
||||||
|
|
||||||
|
if (hsd->sdcard.capacity < lba) {
|
||||||
|
lba = hsd->sdcard.capacity - 1;
|
||||||
|
}
|
||||||
|
sd_read_start(hsd, buf, lba);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hal_sd_initcard(sd_handle_t hsd)
|
void hal_sd_initcard(sd_handle_t hsd)
|
||||||
{
|
{
|
||||||
struct sdio_init init = {0};
|
|
||||||
hal_sfr_t sdiox = hsd->instance;
|
hal_sfr_t sdiox = hsd->instance;
|
||||||
|
|
||||||
sdio_init(sdiox, &init);
|
hsd->init.clock_div = 119; /* SD clk 240KHz when system clk is 48MHz */
|
||||||
|
hsd->init.clock_power_save = SDMMC_CLOCK_POWER_SAVE_DISABLE;
|
||||||
|
|
||||||
|
sdio_init(sdiox, &(hsd->init));
|
||||||
sd_poweron(hsd);
|
sd_poweron(hsd);
|
||||||
|
sd_init_card(hsd);
|
||||||
}
|
}
|
||||||
|
|
||||||
WEAK void hal_sd_mspinit(sd_handle_t hsd)
|
WEAK void hal_sd_mspinit(sd_handle_t hsd)
|
||||||
|
@ -171,6 +361,11 @@ hal_error_t hal_sd_init(sd_handle_t hsd)
|
||||||
return -HAL_ERROR;
|
return -HAL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hsd->cfg.go_ready_retry = 200;
|
||||||
|
hsd->cfg.identification_retry = 5;
|
||||||
|
hsd->cfg.rw_init_retry = 3;
|
||||||
|
hsd->cfg.rw_retry = 3;
|
||||||
|
|
||||||
hal_sd_mspinit(hsd);
|
hal_sd_mspinit(hsd);
|
||||||
hal_sd_initcard(hsd);
|
hal_sd_initcard(hsd);
|
||||||
|
|
||||||
|
@ -181,4 +376,25 @@ void hal_sd_deinit(uint32_t sdx)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool hal_sd_read(sd_handle_t hsd, void *buf, uint32_t lba)
|
||||||
|
{
|
||||||
|
uint8_t init_retry = hsd->cfg.rw_init_retry;
|
||||||
|
|
||||||
|
while (init_retry-- > 0)
|
||||||
|
{
|
||||||
|
uint8_t retry = hsd->cfg.rw_retry;
|
||||||
|
while (retry-- > 0)
|
||||||
|
{
|
||||||
|
if (sd_read_try(hsd, buf, lba)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
hsd->sdcard.state = HAL_SD_STATE_INVAL;
|
||||||
|
|
||||||
|
hal_mdelay(20);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue