diff --git a/ble/.cproject b/ble/.cproject new file mode 100644 index 0000000000000000000000000000000000000000..620b8679aa500cb6e6ecdbd596813adca48d49cd --- /dev/null +++ b/ble/.cproject @@ -0,0 +1,115 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage"> + <storageModule moduleId="org.eclipse.cdt.core.settings"> + <cconfiguration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962"> + <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962" moduleId="org.eclipse.cdt.core.settings" name="Debug"> + <externalSettings/> + <extensions> + <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.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.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/> + <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/> + </extensions> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <configuration artifactName="${ProjName}" 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.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962" name="Debug" parent="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962"> + <folderInfo id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962." name="/" resourcePath=""> + <toolChain id="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug.548125692" name="Cross ARM GCC" superClass="ilg.gnuarmeclipse.managedbuild.cross.toolchain.elf.debug"> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.1448195934" name="Optimization Level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.level.none" valueType="enumerated"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength.989348626" name="Message length (-fmessage-length=0)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.messagelength" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar.573934961" name="'char' is signed (-fsigned-char)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.signedchar" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections.1195068176" name="Function sections (-ffunction-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.functionsections" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections.1035348629" name="Data sections (-fdata-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.optimization.datasections" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.31679983" name="Debug level" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level" value="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.level.max" valueType="enumerated"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format.1676901946" name="Debug format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.debugging.format"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name.1729767352" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.toolchain.name" value="GNU Tools for ARM Embedded Processors" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.1708484008" name="Architecture" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.architecture" value="ilg.gnuarmeclipse.managedbuild.cross.option.architecture.arm" valueType="enumerated"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family.178519983" name="ARM family" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.family" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.mcpu.cortex-m3" valueType="enumerated"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.956545422" name="Instruction set" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset" value="ilg.gnuarmeclipse.managedbuild.cross.option.arm.target.instructionset.thumb" valueType="enumerated"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix.1580514969" name="Prefix" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.prefix" value="arm-none-eabi-" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.c.1246670973" name="C compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.c" value="gcc" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp.1674926322" name="C++ compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.cpp" value="g++" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar.2051566192" name="Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.ar" value="ar" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy.408066731" name="Hex/Bin converter" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objcopy" value="objcopy" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump.1900584936" name="Listing generator" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.objdump" value="objdump" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.size.1096852527" name="Size command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.size" value="size" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.make.937347953" name="Build command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.make" value="make" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm.1468247042" name="Remove command" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.command.rm" value="rm" valueType="string"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash.1529750846" name="Create flash image" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.createflash" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize.667765305" name="Print size" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.addtools.printsize" value="true" valueType="boolean"/> + <targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform.786533016" isAbstract="false" osList="all" superClass="ilg.gnuarmeclipse.managedbuild.cross.targetPlatform"/> + <builder arguments="-r ECLIPSE=1" buildPath="${workspace_loc:/BLE_fit}" command="make" id="ilg.gnuarmeclipse.managedbuild.cross.builder.592880777" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="ilg.gnuarmeclipse.managedbuild.cross.builder"/> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.1648672385" name="Cross ARM GNU Assembler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler"> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor.1969112665" name="Use preprocessor" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.assembler.usepreprocessor" value="true" valueType="boolean"/> + <inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input.507854261" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.assembler.input"/> + </tool> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1576427906" name="Cross ARM C Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler"> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.paths.1576427906" name="Include paths (-I)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.compiler.include.paths" useByScannerDiscovery="true" valueType="includePath"> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/Libraries/CMSIS/Device/Maxim/MAX32665/Include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/Libraries/MAX32665PeriphDriver/Include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/Libraries/Boards/EvKit_V1/Include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/Libraries/Boards/Include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/Libraries/CMSIS/Include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Toolchain/arm-none-eabi/include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Toolchain/arm-none-eabi/include/sys""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Toolchain/lib/gcc/arm-none-eabi/6.3.1/include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/wsf/common/include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/wsf/common/include/util""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/platform/common/include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/controller/sources/mac/include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/ble-host/include""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/ble-profiles/include/app""/> + <listOptionValue builtIn="false" value=""${MAXIM_PATH}/Firmware/MAX32665/NDALibraries/BTLE/ble-profiles/sources/profiles/include""/> + </option> + <inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.68945223" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input"/> + </tool> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler.794996645" name="Cross ARM C++ Compiler" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.compiler"/> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.675776866" name="Cross ARM C Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker"> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections.185399645" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.c.linker.gcsections" value="true" valueType="boolean"/> + <inputType id="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input.246156916" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.c.linker.input"> + <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/> + <additionalInput kind="additionalinput" paths="$(LIBS)"/> + </inputType> + </tool> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker.391142733" name="Cross ARM C++ Linker" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.cpp.linker"> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections.2099090970" name="Remove unused sections (-Xlinker --gc-sections)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.cpp.linker.gcsections" value="true" valueType="boolean"/> + </tool> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver.399743328" name="Cross ARM GNU Archiver" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.archiver"/> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash.822983655" name="Cross ARM GNU Create Flash Image" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createflash"/> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting.1050446219" name="Cross ARM GNU Create Listing" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.createlisting"> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source.335976671" name="Display source (--source|-S)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.source" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders.964898349" name="Display all headers (--all-headers|-x)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.allheaders" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle.972868647" name="Demangle names (--demangle|-C)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.demangle" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers.890608562" name="Display line numbers (--line-numbers|-l)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.linenumbers" value="true" valueType="boolean"/> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide.1669392057" name="Wide lines (--wide|-w)" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.createlisting.wide" value="true" valueType="boolean"/> + </tool> + <tool id="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize.403251962" name="Cross ARM GNU Print Size" superClass="ilg.gnuarmeclipse.managedbuild.cross.tool.printsize"> + <option id="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format.1919947275" name="Size format" superClass="ilg.gnuarmeclipse.managedbuild.cross.option.printsize.format"/> + </tool> + </toolChain> + </folderInfo> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/> + </cconfiguration> + </storageModule> + <storageModule moduleId="cdtBuildSystem" version="4.0.0"> + <project id="BLE_fit.ilg.gnuarmeclipse.managedbuild.cross.target.elf.737306620" name="Executable" projectType="ilg.gnuarmeclipse.managedbuild.cross.target.elf"/> + </storageModule> + <storageModule moduleId="scannerConfiguration"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> + <scannerConfigBuildInfo instanceId="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962;ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962.;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.1576427906;ilg.gnuarmeclipse.managedbuild.cross.tool.c.compiler.input.68945223"> + <autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/> + </scannerConfigBuildInfo> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/> + <storageModule moduleId="refreshScope" versionNumber="2"> + <configuration configurationName="Debug"> + <resource resourceType="PROJECT" workspacePath="/BLE_fit"/> + </configuration> + </storageModule> + <storageModule moduleId="org.eclipse.cdt.internal.ui.text.commentOwnerProjectMappings"/> + <storageModule moduleId="org.eclipse.cdt.make.core.buildtargets"/> +</cproject> diff --git a/ble/.gdbinit b/ble/.gdbinit new file mode 100644 index 0000000000000000000000000000000000000000..85b92cf79c0f29f412a886e093c13da55dfc1bcc --- /dev/null +++ b/ble/.gdbinit @@ -0,0 +1,3 @@ +file build/max32665.elf +target remote localhost:3333 + diff --git a/ble/.project b/ble/.project new file mode 100644 index 0000000000000000000000000000000000000000..f87dce9ca24d97fb9eedab424b85796010af452e --- /dev/null +++ b/ble/.project @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>BLE_fit</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> + <triggers>clean,full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + <buildCommand> + <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name> + <triggers>full,incremental,</triggers> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.cdt.core.cnature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature> + <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature> + </natures> +</projectDescription> diff --git a/ble/.settings/language.settings.xml b/ble/.settings/language.settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..e5a1647610f97197abe406e8ef1bb9e62065f5a1 --- /dev/null +++ b/ble/.settings/language.settings.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<project> + <configuration id="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962" name="Debug"> + <extension point="org.eclipse.cdt.core.LanguageSettingsProvider"> + <provider copy-of="extension" id="org.eclipse.cdt.ui.UserLanguageSettingsProvider"/> + <provider-reference id="org.eclipse.cdt.core.ReferencedProjectsLanguageSettingsProvider" ref="shared-provider"/> + <provider-reference id="org.eclipse.cdt.managedbuilder.core.MBSLanguageSettingsProvider" ref="shared-provider"/> + </extension> + </configuration> +</project> diff --git a/ble/BLE_fit.launch b/ble/BLE_fit.launch new file mode 100644 index 0000000000000000000000000000000000000000..61aab03847a6bacc23c49b9379148c245aaf522b --- /dev/null +++ b/ble/BLE_fit.launch @@ -0,0 +1,62 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="ilg.gnuarmeclipse.debug.gdbjtag.openocd.launchConfigurationType"> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doContinue" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.firstResetType" value="init"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="openocd"/> +<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerOther" value="-s ${env_var:TOOLCHAIN_PATH}/share/openocd/scripts -f interface/ftdi/olimex-arm-usb-ocd-h.cfg -f interface/ftdi/olimex-arm-jtag-swd.cfg -f target/max32665.cfg"/> +<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU ARM OpenOCD"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/> +<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/> +<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/> +<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/> +<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/> +<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/max32665.elf"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="BLE_fit"/> +<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962"/> +<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> +<listEntry value="/BLE_fit"/> +</listAttribute> +<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> +<listEntry value="4"/> +</listAttribute> +<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> +<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/> +</listAttribute> +<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"> <memoryBlockExpression address="536918388" label="0x2000b974"/> </memoryBlockExpressionList> "/> +<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> +</launchConfiguration> diff --git a/ble/Makefile b/ble/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..d302eacd114b78571329d216128ddea38743bf75 --- /dev/null +++ b/ble/Makefile @@ -0,0 +1,140 @@ +################################################################################ +# Copyright (C) 2014 Maxim Integrated Products, Inc., All Rights Reserved. +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +# IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES +# OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +# ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of Maxim Integrated +# Products, Inc. shall not be used except as stated in the Maxim Integrated +# Products, Inc. Branding Policy. +# +# The mere transfer of this software does not imply any licenses +# of trade secrets, proprietary technology, copyrights, patents, +# trademarks, maskwork rights, or any other form of intellectual +# property whatsoever. Maxim Integrated Products, Inc. retains all +# ownership rights. +# +# $Id: Makefile 38694 2018-10-24 20:41:14Z zach.metzinger $ +# +################################################################################ + +# This is the name of the build output file +ifeq "$(PROJECT)" "" +PROJECT=max32665 +endif + +# Specify the target processor +ifeq "$(TARGET)" "" +TARGET=MAX32665 +endif + +# Create Target name variables +TARGET_UC:=$(shell echo $(TARGET) | tr a-z A-Z) +TARGET_LC:=$(shell echo $(TARGET) | tr A-Z a-z) + +# Select 'GCC' or 'IAR' compiler +COMPILER=GCC + +# Specify the board used +ifeq "$(BOARD)" "" +#BOARD=EvKit_V1 +BOARD=card10 +endif + +# Last octet address modifier +ifneq "$(BLE_ADDR_LSB)" "" +PROJ_CFLAGS+=-DBLE_ADDR_LSB=$(BLE_ADDR_LSB) +endif + +## Subsitute WSF critical section entry for default MAXUSB +#PROJ_CFLAGS+=-DMAXUSB_ENTER_CRITICAL=WsfCsEnter +#PROJ_CFLAGS+=-DMAXUSB_EXIT_CRITICAL=WsfCsExit + +# This is the path to the CMSIS root directory +ifeq "$(MAXIM_PATH)" "" +LIBS_DIR=../sdk/Libraries +NDALIBS_DIR=../sdk/NDALibraries +else +LIBS_DIR=/$(subst \,/,$(subst :,,$(MAXIM_PATH))/Firmware/$(TARGET_UC)/Libraries) +NDALIBS_DIR=/$(subst \,/,$(subst :,,$(MAXIM_PATH))/Firmware/$(TARGET_UC)/NDALibraries) +endif +CMSIS_ROOT=$(LIBS_DIR)/CMSIS + +# Source files for this test (add path to VPATH below) +SRCS = main.c +SRCS += stack_fit.c +SRCS += fit_main.c +SRCS += svc_dis.c + +# Where to find source files for this test +VPATH = . + +# Where to find header files for this test +IPATH = . + +# Enable assertion checking for development +PROJ_CFLAGS+=-DMXC_ASSERT_ENABLE + +# Specify the target revision to override default +# "A2" in ASCII +# TARGET_REV=0x4132 + +# Use this variables to specify and alternate tool path +#TOOL_DIR=/opt/gcc-arm-none-eabi-4_8-2013q4/bin + +# Use these variables to add project specific tool options +#PROJ_CFLAGS+=--specs=nano.specs +#PROJ_LDFLAGS+=--specs=nano.specs + +PROJ_CFLAGS+=-std=c99 + +# Point this variable to a startup file to override the default file +#STARTUPFILE=start.S + +# Override the default optimization level using this variable +#MXC_OPTIMIZE_CFLAGS=-O1 + +# Point this variable to a linker file to override the default file +ifneq "$(APP)" "" +LINKERFILE=$(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/GCC/$(TARGET_LC)_app.ld +endif + +################################################################################ +# Include external library makefiles here + +# Include the BSP +BOARD_DIR=$(LIBS_DIR)/Boards/$(BOARD) +include $(BOARD_DIR)/board.mk + +# Include the Peripheral Driver Library +PERIPH_DRIVER_DIR=$(LIBS_DIR)/$(TARGET)PeriphDriver +include ${PERIPH_DRIVER_DIR}/periphdriver.mk + +# Include Cordio BTLE Library +TRACE=1 +CORDIO_DIR=$(NDALIBS_DIR)/BTLE +include ${CORDIO_DIR}/btle.mk + +# Include MAXUSB library +MAXUSB_DIR=$(LIBS_DIR)/MAXUSB +include $(MAXUSB_DIR)/maxusb.mk + +################################################################################ +# Include the rules for building for this target. All other makefiles should be +# included before this one. +include $(CMSIS_ROOT)/Device/Maxim/$(TARGET_UC)/Source/$(COMPILER)/$(TARGET_LC).mk diff --git a/ble/build_image b/ble/build_image new file mode 100755 index 0000000000000000000000000000000000000000..efcda785f8ef3137326531e085cdccaa7baac919 --- /dev/null +++ b/ble/build_image @@ -0,0 +1,5 @@ +make clean +make APP=1 +make build/max32665.bin +cp build/max32665.bin card10.bin +python ../bootloader/crc_patch.py card10.bin diff --git a/ble/card10.bin b/ble/card10.bin new file mode 100755 index 0000000000000000000000000000000000000000..cd36d5a1e2ba6831faf14db9728359de670c688b Binary files /dev/null and b/ble/card10.bin differ diff --git a/ble/fit.launch b/ble/fit.launch new file mode 100644 index 0000000000000000000000000000000000000000..8626291bfd99c08b8112481bb886daddc3c586d9 --- /dev/null +++ b/ble/fit.launch @@ -0,0 +1,65 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="ilg.gnuarmeclipse.debug.gdbjtag.openocd.launchConfigurationType"> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doContinue" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doDebugInRam" value="false"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doFirstReset" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateConsole" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doGdbServerAllocateTelnetConsole" value="false"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doSecondReset" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.doStartGdbServer" value="true"/> +<booleanAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.enableSemihosting" value="false"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.firstResetType" value="init"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherCommands" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbClientOtherOptions" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerConnectionAddress" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerExecutable" value="openocd"/> +<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerGdbPortNumber" value="3333"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerLog" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerOther" value="-s ${env_var:TOOLCHAIN_PATH}/share/openocd/scripts -f interface/ftdi/olimex-arm-usb-tiny-h.cfg -f target/MAX32650.cfg"/> +<intAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.gdbServerTelnetPortNumber" value="4444"/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherInitCommands" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.otherRunCommands" value=""/> +<stringAttribute key="ilg.gnuarmeclipse.debug.gdbjtag.openocd.secondResetType" value="halt"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageFileName" value=""/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.imageOffset" value=""/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.ipAddress" value="localhost"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.jtagDevice" value="GNU ARM OpenOCD"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadImage" value="true"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.loadSymbols" value="true"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.pcRegister" value=""/> +<intAttribute key="org.eclipse.cdt.debug.gdbjtag.core.portNumber" value="3333"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setPcRegister" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setResume" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.setStopAt" value="true"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.stopAt" value="main"/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsFileName" value=""/> +<stringAttribute key="org.eclipse.cdt.debug.gdbjtag.core.symbolsOffset" value=""/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForImage" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useFileForSymbols" value="false"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForImage" value="true"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useProjBinaryForSymbols" value="true"/> +<booleanAttribute key="org.eclipse.cdt.debug.gdbjtag.core.useRemoteTarget" value="true"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.commandFactory" value="Standard (Windows)"/> +<stringAttribute key="org.eclipse.cdt.debug.mi.core.protocol" value="mi"/> +<booleanAttribute key="org.eclipse.cdt.debug.mi.core.verboseMode" value="false"/> +<stringAttribute key="org.eclipse.cdt.dsf.gdb.DEBUG_NAME" value="arm-none-eabi-gdb"/> +<booleanAttribute key="org.eclipse.cdt.dsf.gdb.UPDATE_THREADLIST_ON_SUSPEND" value="false"/> +<intAttribute key="org.eclipse.cdt.launch.ATTR_BUILD_BEFORE_LAUNCH_ATTR" value="2"/> +<stringAttribute key="org.eclipse.cdt.launch.COREFILE_PATH" value=""/> +<stringAttribute key="org.eclipse.cdt.launch.DEBUGGER_REGISTER_GROUPS" value=""/> +<stringAttribute key="org.eclipse.cdt.launch.PROGRAM_NAME" value="build/fit.elf"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_ATTR" value="fit"/> +<booleanAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_AUTO_ATTR" value="true"/> +<stringAttribute key="org.eclipse.cdt.launch.PROJECT_BUILD_CONFIG_ID_ATTR" value="ilg.gnuarmeclipse.managedbuild.cross.config.elf.debug.1674944962"/> +<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS"> +<listEntry value="/fit"/> +</listAttribute> +<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES"> +<listEntry value="4"/> +</listAttribute> +<listAttribute key="org.eclipse.debug.ui.favoriteGroups"> +<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/> +</listAttribute> +<stringAttribute key="org.eclipse.dsf.launch.MEMORY_BLOCKS" value="<?xml version="1.0" encoding="UTF-8" standalone="no"?> <memoryBlockExpressionList context="Context string"/> "/> +<stringAttribute key="process_factory_id" value="org.eclipse.cdt.dsf.gdb.GdbProcessFactory"/> +</launchConfiguration> diff --git a/ble/fit_api.h b/ble/fit_api.h new file mode 100644 index 0000000000000000000000000000000000000000..aade452df891b30a71d5d968294600a4bbb22da2 --- /dev/null +++ b/ble/fit_api.h @@ -0,0 +1,76 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Fitness sample application interface. + * + * Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved. + * ARM Ltd. confidential and proprietary. + * + * IMPORTANT. Your use of this file is governed by a Software License Agreement + * ("Agreement") that must be accepted in order to download or otherwise receive a + * copy of this file. You may not use or copy this file for any purpose other than + * as described in the Agreement. If you do not agree to all of the terms of the + * Agreement do not use this file and delete all copies in your possession or control; + * if you do not have a copy of the Agreement, you must contact ARM Ltd. prior + * to any use, copying or further distribution of this software. + */ +/*************************************************************************************************/ +#ifndef FIT_API_H +#define FIT_API_H + +#include "wsf_os.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +#ifndef FIT_CONN_MAX +#define FIT_CONN_MAX 1 +#endif + +/************************************************************************************************** + Function Declarations +**************************************************************************************************/ +/*************************************************************************************************/ +/*! + * \brief Start the application. + * + * \return None. + */ +/*************************************************************************************************/ +void FitStart(void); + +/*************************************************************************************************/ +/*! + * \brief Application handler init function called during system initialization. + * + * \param handlerID WSF handler ID for App. + * + * \return None. + */ +/*************************************************************************************************/ +void FitHandlerInit(wsfHandlerId_t handlerId); + + +/*************************************************************************************************/ +/*! + * \brief WSF event handler for the application. + * + * \param event WSF event mask. + * \param pMsg WSF message. + * + * \return None. + */ +/*************************************************************************************************/ +void FitHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg); + +#ifdef __cplusplus +}; +#endif + +#endif /* FIT_API_H */ diff --git a/ble/fit_main.c b/ble/fit_main.c new file mode 100644 index 0000000000000000000000000000000000000000..6691b4eb94f4a8317720f4b418e1de14e1d410ec --- /dev/null +++ b/ble/fit_main.c @@ -0,0 +1,750 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Fitness sample application for the following profiles: + * Heart Rate profile + * + * Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved. + * ARM Ltd. confidential and proprietary. + * + * IMPORTANT. Your use of this file is governed by a Software License Agreement + * ("Agreement") that must be accepted in order to download or otherwise receive a + * copy of this file. You may not use or copy this file for any purpose other than + * as described in the Agreement. If you do not agree to all of the terms of the + * Agreement do not use this file and delete all copies in your possession or control; + * if you do not have a copy of the Agreement, you must contact ARM Ltd. prior + * to any use, copying or further distribution of this software. + */ +/*************************************************************************************************/ + +#include <string.h> +#include "wsf_types.h" +#include "util/bstream.h" +#include "wsf_msg.h" +#include "wsf_trace.h" +#include "hci_api.h" +#include "dm_api.h" +#include "att_api.h" +#include "smp_api.h" +#include "app_api.h" +#include "app_db.h" +#include "app_ui.h" +#include "app_hw.h" +#include "svc_ch.h" +#include "svc_core.h" +#include "svc_hrs.h" +#include "svc_dis.h" +#include "svc_batt.h" +#include "svc_rscs.h" +#include "bas/bas_api.h" +#include "hrps/hrps_api.h" +#include "rscp/rscp_api.h" +#include "fit_api.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! WSF message event starting value */ +#define FIT_MSG_START 0xA0 + +/* Default Running Speed and Cadence Measurement period (seconds) */ +#define FIT_DEFAULT_RSCM_PERIOD 1 + +/*! WSF message event enumeration */ +enum +{ + FIT_HR_TIMER_IND = FIT_MSG_START, /*! Heart rate measurement timer expired */ + FIT_BATT_TIMER_IND, /*! Battery measurement timer expired */ + FIT_RUNNING_TIMER_IND /*! Running speed and cadence measurement timer expired */ +}; + +/************************************************************************************************** + Data Types +**************************************************************************************************/ + +/*! Application message type */ +typedef union +{ + wsfMsgHdr_t hdr; + dmEvt_t dm; + attsCccEvt_t ccc; + attEvt_t att; +} fitMsg_t; + +/************************************************************************************************** + Configurable Parameters +**************************************************************************************************/ + +/*! configurable parameters for advertising */ +/* These intervals directly impact energy usage during the non-connected/advertising mode */ +static const appAdvCfg_t fitAdvCfg = +{ + { 1000, 0, 0}, /*! Advertising durations in ms */ + { 96, 200, 0} /*! Advertising intervals in 0.625 ms units */ +}; + +/*! configurable parameters for slave */ +static const appSlaveCfg_t fitSlaveCfg = +{ + FIT_CONN_MAX, /*! Maximum connections */ +}; + +/*! configurable parameters for security */ +static const appSecCfg_t fitSecCfg = +{ + DM_AUTH_BOND_FLAG | DM_AUTH_SC_FLAG, /*! Authentication and bonding flags */ + 0, /*! Initiator key distribution flags */ + DM_KEY_DIST_LTK, /*! Responder key distribution flags */ + FALSE, /*! TRUE if Out-of-band pairing data is present */ + TRUE /*! TRUE to initiate security upon connection */ +}; + +/*! configurable parameters for connection parameter update */ +static const appUpdateCfg_t fitUpdateCfg = +{ + 6000, /*! Connection idle period in ms before attempting + connection parameter update; set to zero to disable */ + 640, /*! Minimum connection interval in 1.25ms units */ + 800, /*! Maximum connection interval in 1.25ms units */ + 0, /*! Connection latency */ + 900, /*! Supervision timeout in 10ms units */ + 5 /*! Number of update attempts before giving up */ +}; + +/*! heart rate measurement configuration */ +static const hrpsCfg_t fitHrpsCfg = +{ + 2000 /*! Measurement timer expiration period in ms */ +}; + +/*! battery measurement configuration */ +static const basCfg_t fitBasCfg = +{ + 30, /*! Battery measurement timer expiration period in seconds */ + 1, /*! Perform battery measurement after this many timer periods */ + 100 /*! Send battery level notification to peer when below this level. */ +}; + +/*! SMP security parameter configuration */ +static const smpCfg_t fitSmpCfg = +{ + 3000, /*! 'Repeated attempts' timeout in msec */ + SMP_IO_NO_IN_NO_OUT, /*! I/O Capability */ + 7, /*! Minimum encryption key length */ + 16, /*! Maximum encryption key length */ + 3, /*! Attempts to trigger 'repeated attempts' timeout */ + 0, /*! Device authentication requirements */ +}; + +/************************************************************************************************** + Advertising Data +**************************************************************************************************/ + +/*! advertising data, discoverable mode */ +static const uint8_t fitAdvDataDisc[] = +{ + /*! flags */ + 2, /*! length */ + DM_ADV_TYPE_FLAGS, /*! AD type */ + DM_FLAG_LE_GENERAL_DISC | /*! flags */ + DM_FLAG_LE_BREDR_NOT_SUP, + + /*! tx power */ + 2, /*! length */ + DM_ADV_TYPE_TX_POWER, /*! AD type */ + 0, /*! tx power */ + + /*! service UUID list */ + 9, /*! length */ + DM_ADV_TYPE_16_UUID, /*! AD type */ + UINT16_TO_BYTES(ATT_UUID_HEART_RATE_SERVICE), + UINT16_TO_BYTES(ATT_UUID_RUNNING_SPEED_SERVICE), + UINT16_TO_BYTES(ATT_UUID_DEVICE_INFO_SERVICE), + UINT16_TO_BYTES(ATT_UUID_BATTERY_SERVICE) +}; + +/*! scan data, discoverable mode */ +static const uint8_t fitScanDataDisc[] = +{ + /*! device name */ + 4, /*! length */ + DM_ADV_TYPE_LOCAL_NAME, /*! AD type */ + 'F', + 'i', + 't' +}; + +/************************************************************************************************** + Client Characteristic Configuration Descriptors +**************************************************************************************************/ + +/*! enumeration of client characteristic configuration descriptors */ +enum +{ + FIT_GATT_SC_CCC_IDX, /*! GATT service, service changed characteristic */ + FIT_HRS_HRM_CCC_IDX, /*! Heart rate service, heart rate monitor characteristic */ + FIT_BATT_LVL_CCC_IDX, /*! Battery service, battery level characteristic */ + FIT_RSCS_SM_CCC_IDX, /*! Runninc speed and cadence measurement characteristic */ + FIT_NUM_CCC_IDX +}; + +/*! client characteristic configuration descriptors settings, indexed by above enumeration */ +static const attsCccSet_t fitCccSet[FIT_NUM_CCC_IDX] = +{ + /* cccd handle value range security level */ + {GATT_SC_CH_CCC_HDL, ATT_CLIENT_CFG_INDICATE, DM_SEC_LEVEL_NONE}, /* FIT_GATT_SC_CCC_IDX */ + {HRS_HRM_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* FIT_HRS_HRM_CCC_IDX */ + {BATT_LVL_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE}, /* FIT_BATT_LVL_CCC_IDX */ + {RSCS_RSM_CH_CCC_HDL, ATT_CLIENT_CFG_NOTIFY, DM_SEC_LEVEL_NONE} /* FIT_RSCS_SM_CCC_IDX */ +}; + +/************************************************************************************************** + Global Variables +**************************************************************************************************/ + +/*! WSF handler ID */ +wsfHandlerId_t fitHandlerId; + +/* WSF Timer to send running speed and cadence measurement data */ +wsfTimer_t fitRscmTimer; + +/* Running Speed and Cadence Measurement period - Can be changed at runtime to vary period */ +static uint16_t fitRscmPeriod = FIT_DEFAULT_RSCM_PERIOD; + +/* Heart Rate Monitor feature flags */ +static uint8_t fitHrmFlags = CH_HRM_FLAGS_VALUE_8BIT | CH_HRM_FLAGS_ENERGY_EXP; + +/*************************************************************************************************/ +/*! + * \brief Application DM callback. + * + * \param pDmEvt DM callback event + * + * \return None. + */ +/*************************************************************************************************/ +static void fitDmCback(dmEvt_t *pDmEvt) +{ + dmEvt_t *pMsg; + uint16_t len; + + len = DmSizeOfEvt(pDmEvt); + + if ((pMsg = WsfMsgAlloc(len)) != NULL) + { + memcpy(pMsg, pDmEvt, len); + WsfMsgSend(fitHandlerId, pMsg); + } +} + +/*************************************************************************************************/ +/*! + * \brief Application ATT callback. + * + * \param pEvt ATT callback event + * + * \return None. + */ +/*************************************************************************************************/ +static void fitAttCback(attEvt_t *pEvt) +{ + attEvt_t *pMsg; + + if ((pMsg = WsfMsgAlloc(sizeof(attEvt_t) + pEvt->valueLen)) != NULL) + { + memcpy(pMsg, pEvt, sizeof(attEvt_t)); + pMsg->pValue = (uint8_t *) (pMsg + 1); + memcpy(pMsg->pValue, pEvt->pValue, pEvt->valueLen); + WsfMsgSend(fitHandlerId, pMsg); + } +} + +/*************************************************************************************************/ +/*! + * \brief Application ATTS client characteristic configuration callback. + * + * \param pDmEvt DM callback event + * + * \return None. + */ +/*************************************************************************************************/ +static void fitCccCback(attsCccEvt_t *pEvt) +{ + attsCccEvt_t *pMsg; + appDbHdl_t dbHdl; + + /* if CCC not set from initialization and there's a device record */ + if ((pEvt->handle != ATT_HANDLE_NONE) && + ((dbHdl = AppDbGetHdl((dmConnId_t) pEvt->hdr.param)) != APP_DB_HDL_NONE)) + { + /* store value in device database */ + AppDbSetCccTblValue(dbHdl, pEvt->idx, pEvt->value); + } + + if ((pMsg = WsfMsgAlloc(sizeof(attsCccEvt_t))) != NULL) + { + memcpy(pMsg, pEvt, sizeof(attsCccEvt_t)); + WsfMsgSend(fitHandlerId, pMsg); + } +} + + +/*************************************************************************************************/ +/*! +* \brief Send a Running Speed and Cadence Measurement Notification. +* +* \param connId connection ID +* +* \return None. +*/ +/*************************************************************************************************/ +static void fitSendRunningSpeedMeasurement(dmConnId_t connId) +{ + if (AttsCccEnabled(connId, FIT_RSCS_SM_CCC_IDX)) + { + static uint8_t walk_run = 1; + + /* TODO: Set Running Speed and Cadence Measurement Parameters */ + + RscpsSetParameter(RSCP_SM_PARAM_SPEED, 1); + RscpsSetParameter(RSCP_SM_PARAM_CADENCE, 2); + RscpsSetParameter(RSCP_SM_PARAM_STRIDE_LENGTH, 3); + RscpsSetParameter(RSCP_SM_PARAM_TOTAL_DISTANCE, 4); + + /* Toggle running/walking */ + walk_run = walk_run? 0 : 1; + RscpsSetParameter(RSCP_SM_PARAM_STATUS, walk_run); + + RscpsSendSpeedMeasurement(connId); + } + + /* Configure and start timer to send the next measurement */ + fitRscmTimer.msg.event = FIT_RUNNING_TIMER_IND; + fitRscmTimer.msg.status = FIT_RSCS_SM_CCC_IDX; + fitRscmTimer.handlerId = fitHandlerId; + fitRscmTimer.msg.param = connId; + + WsfTimerStartSec(&fitRscmTimer, fitRscmPeriod); +} + +/*************************************************************************************************/ +/*! + * \brief Process CCC state change. + * + * \param pMsg Pointer to message. + * + * \return None. + */ +/*************************************************************************************************/ +static void fitProcCccState(fitMsg_t *pMsg) +{ + APP_TRACE_INFO3("ccc state ind value:%d handle:%d idx:%d", pMsg->ccc.value, pMsg->ccc.handle, pMsg->ccc.idx); + + /* handle heart rate measurement CCC */ + if (pMsg->ccc.idx == FIT_HRS_HRM_CCC_IDX) + { + if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY) + { + HrpsMeasStart((dmConnId_t) pMsg->ccc.hdr.param, FIT_HR_TIMER_IND, FIT_HRS_HRM_CCC_IDX); + } + else + { + HrpsMeasStop((dmConnId_t) pMsg->ccc.hdr.param); + } + return; + } + + /* handle running speed and cadence measurement CCC */ + if (pMsg->ccc.idx == FIT_RSCS_SM_CCC_IDX) + { + if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY) + { + fitSendRunningSpeedMeasurement((dmConnId_t)pMsg->ccc.hdr.param); + } + else + { + WsfTimerStop(&fitRscmTimer); + } + return; + } + + /* handle battery level CCC */ + if (pMsg->ccc.idx == FIT_BATT_LVL_CCC_IDX) + { + if (pMsg->ccc.value == ATT_CLIENT_CFG_NOTIFY) + { + BasMeasBattStart((dmConnId_t) pMsg->ccc.hdr.param, FIT_BATT_TIMER_IND, FIT_BATT_LVL_CCC_IDX); + } + else + { + BasMeasBattStop((dmConnId_t) pMsg->ccc.hdr.param); + } + return; + } +} + +/*************************************************************************************************/ +/*! + * \brief Perform UI actions on connection close. + * + * \param pMsg Pointer to message. + * + * \return None. + */ +/*************************************************************************************************/ +static void fitClose(fitMsg_t *pMsg) +{ + /* stop heart rate measurement */ + HrpsMeasStop((dmConnId_t) pMsg->hdr.param); + + /* stop battery measurement */ + BasMeasBattStop((dmConnId_t) pMsg->hdr.param); + + /* Stop running speed and cadence timer */ + WsfTimerStop(&fitRscmTimer); +} + +/*************************************************************************************************/ +/*! + * \brief Set up advertising and other procedures that need to be performed after + * device reset. + * + * \param pMsg Pointer to message. + * + * \return None. + */ +/*************************************************************************************************/ +static void fitSetup(fitMsg_t *pMsg) +{ + /* set advertising and scan response data for discoverable mode */ + AppAdvSetData(APP_ADV_DATA_DISCOVERABLE, sizeof(fitAdvDataDisc), (uint8_t *) fitAdvDataDisc); + AppAdvSetData(APP_SCAN_DATA_DISCOVERABLE, sizeof(fitScanDataDisc), (uint8_t *) fitScanDataDisc); + + /* set advertising and scan response data for connectable mode */ + AppAdvSetData(APP_ADV_DATA_CONNECTABLE, 0, NULL); + AppAdvSetData(APP_SCAN_DATA_CONNECTABLE, 0, NULL); + + /* start advertising; automatically set connectable/discoverable mode and bondable mode */ + AppAdvStart(APP_MODE_AUTO_INIT); +} + +/*************************************************************************************************/ +/*! + * \brief Button press callback. + * + * \param btn Button press. + * + * \return None. + */ +/*************************************************************************************************/ +static void fitBtnCback(uint8_t btn) +{ + dmConnId_t connId; + static uint8_t heartRate = 78; /* for testing/demonstration */ + + /* button actions when connected */ + if ((connId = AppConnIsOpen()) != DM_CONN_ID_NONE) + { + switch (btn) + { + case APP_UI_BTN_1_SHORT: + /* increment the heart rate */ + AppHwHrmTest(++heartRate); + break; + + case APP_UI_BTN_1_MED: + break; + + case APP_UI_BTN_1_LONG: + AppConnClose(connId); + break; + + case APP_UI_BTN_2_SHORT: + /* decrement the heart rate */ + AppHwHrmTest(--heartRate); + break; + + case APP_UI_BTN_2_MED: + /* Toggle HRM Sensor DET flags */ + if (!(fitHrmFlags & (CH_HRM_FLAGS_SENSOR_DET | CH_HRM_FLAGS_SENSOR_NOT_DET))) + { + fitHrmFlags |= CH_HRM_FLAGS_SENSOR_DET; + } + else if (fitHrmFlags & CH_HRM_FLAGS_SENSOR_DET) + { + fitHrmFlags &= ~CH_HRM_FLAGS_SENSOR_DET; + fitHrmFlags |= CH_HRM_FLAGS_SENSOR_NOT_DET; + } + else + { + fitHrmFlags &= ~CH_HRM_FLAGS_SENSOR_NOT_DET; + } + + HrpsSetFlags(fitHrmFlags); + break; + + case APP_UI_BTN_2_LONG: + /* Toggle HRM RR Interval feature flag */ + if (fitHrmFlags & CH_HRM_FLAGS_RR_INTERVAL) + { + fitHrmFlags &= ~CH_HRM_FLAGS_RR_INTERVAL; + } + else + { + fitHrmFlags |= CH_HRM_FLAGS_RR_INTERVAL; + } + + HrpsSetFlags(fitHrmFlags); + break; + + default: + break; + } + } + /* button actions when not connected */ + else + { + switch (btn) + { + case APP_UI_BTN_1_SHORT: + /* start or restart advertising */ + AppAdvStart(APP_MODE_AUTO_INIT); + break; + + case APP_UI_BTN_1_MED: + /* enter discoverable and bondable mode mode */ + AppSetBondable(TRUE); + AppAdvStart(APP_MODE_DISCOVERABLE); + break; + + case APP_UI_BTN_1_LONG: + /* clear bonded device info and restart advertising */ + AppDbDeleteAllRecords(); + AppAdvStart(APP_MODE_AUTO_INIT); + break; + + case APP_UI_BTN_2_SHORT: + /* Toggle HRM Flag for 8 and 16 bit values */ + if (fitHrmFlags & CH_HRM_FLAGS_VALUE_16BIT) + { + fitHrmFlags &= ~CH_HRM_FLAGS_VALUE_16BIT; + } + else + { + fitHrmFlags |= CH_HRM_FLAGS_VALUE_16BIT; + } + + HrpsSetFlags(fitHrmFlags); + break; + + default: + break; + } + } +} + +/*************************************************************************************************/ +/*! + * \brief Process messages from the event handler. + * + * \param pMsg Pointer to message. + * + * \return None. + */ +/*************************************************************************************************/ +static void fitProcMsg(fitMsg_t *pMsg) +{ + uint8_t uiEvent = APP_UI_NONE; + + switch(pMsg->hdr.event) + { + case FIT_RUNNING_TIMER_IND: + fitSendRunningSpeedMeasurement((dmConnId_t)pMsg->ccc.hdr.param); + break; + + case FIT_HR_TIMER_IND: + HrpsProcMsg(&pMsg->hdr); + break; + + case FIT_BATT_TIMER_IND: + BasProcMsg(&pMsg->hdr); + break; + + case ATTS_HANDLE_VALUE_CNF: + HrpsProcMsg(&pMsg->hdr); + BasProcMsg(&pMsg->hdr); + break; + + case ATTS_CCC_STATE_IND: + fitProcCccState(pMsg); + break; + + case DM_RESET_CMPL_IND: + DmSecGenerateEccKeyReq(); + fitSetup(pMsg); + uiEvent = APP_UI_RESET_CMPL; + break; + + case DM_ADV_START_IND: + uiEvent = APP_UI_ADV_START; + break; + + case DM_ADV_STOP_IND: + uiEvent = APP_UI_ADV_STOP; + break; + + case DM_CONN_OPEN_IND: + HrpsProcMsg(&pMsg->hdr); + BasProcMsg(&pMsg->hdr); + uiEvent = APP_UI_CONN_OPEN; + break; + + case DM_CONN_CLOSE_IND: + fitClose(pMsg); + uiEvent = APP_UI_CONN_CLOSE; + break; + + case DM_SEC_PAIR_CMPL_IND: + uiEvent = APP_UI_SEC_PAIR_CMPL; + break; + + case DM_SEC_PAIR_FAIL_IND: + uiEvent = APP_UI_SEC_PAIR_FAIL; + break; + + case DM_SEC_ENCRYPT_IND: + uiEvent = APP_UI_SEC_ENCRYPT; + break; + + case DM_SEC_ENCRYPT_FAIL_IND: + uiEvent = APP_UI_SEC_ENCRYPT_FAIL; + break; + + case DM_SEC_AUTH_REQ_IND: + AppHandlePasskey(&pMsg->dm.authReq); + break; + + case DM_SEC_ECC_KEY_IND: + DmSecSetEccKey(&pMsg->dm.eccMsg.data.key); + break; + + case DM_SEC_COMPARE_IND: + AppHandleNumericComparison(&pMsg->dm.cnfInd); + break; + + case DM_HW_ERROR_IND: + uiEvent = APP_UI_HW_ERROR; + break; + + default: + break; + } + + if (uiEvent != APP_UI_NONE) + { + AppUiAction(uiEvent); + } +} + +/*************************************************************************************************/ +/*! + * \brief Application handler init function called during system initialization. + * + * \param handlerID WSF handler ID. + * + * \return None. + */ +/*************************************************************************************************/ +void FitHandlerInit(wsfHandlerId_t handlerId) +{ + APP_TRACE_INFO0("FitHandlerInit"); + + /* store handler ID */ + fitHandlerId = handlerId; + + /* Set configuration pointers */ + pAppAdvCfg = (appAdvCfg_t *) &fitAdvCfg; + pAppSlaveCfg = (appSlaveCfg_t *) &fitSlaveCfg; + pAppSecCfg = (appSecCfg_t *) &fitSecCfg; + pAppUpdateCfg = (appUpdateCfg_t *) &fitUpdateCfg; + + /* Initialize application framework */ + AppSlaveInit(); + + /* Set stack configuration pointers */ + pSmpCfg = (smpCfg_t *) &fitSmpCfg; + + /* initialize heart rate profile sensor */ + HrpsInit(handlerId, (hrpsCfg_t *) &fitHrpsCfg); + HrpsSetFlags(fitHrmFlags); + + /* initialize battery service server */ + BasInit(handlerId, (basCfg_t *) &fitBasCfg); +} + +/*************************************************************************************************/ +/*! + * \brief WSF event handler for application. + * + * \param event WSF event mask. + * \param pMsg WSF message. + * + * \return None. + */ +/*************************************************************************************************/ +void FitHandler(wsfEventMask_t event, wsfMsgHdr_t *pMsg) +{ + if (pMsg != NULL) + { + APP_TRACE_INFO1("Fit got evt %d", pMsg->event); + + if (pMsg->event >= DM_CBACK_START && pMsg->event <= DM_CBACK_END) + { + /* process advertising and connection-related messages */ + AppSlaveProcDmMsg((dmEvt_t *) pMsg); + + /* process security-related messages */ + AppSlaveSecProcDmMsg((dmEvt_t *) pMsg); + } + + /* perform profile and user interface-related operations */ + fitProcMsg((fitMsg_t *) pMsg); + } +} + +/*************************************************************************************************/ +/*! + * \brief Start the application. + * + * \return None. + */ +/*************************************************************************************************/ +void FitStart(void) +{ + /* Register for stack callbacks */ + DmRegister(fitDmCback); + DmConnRegister(DM_CLIENT_ID_APP, fitDmCback); + AttRegister(fitAttCback); + AttConnRegister(AppServerConnCback); + AttsCccRegister(FIT_NUM_CCC_IDX, (attsCccSet_t *) fitCccSet, fitCccCback); + + /* Register for app framework callbacks */ + AppUiBtnRegister(fitBtnCback); + + /* Initialize attribute server database */ + SvcCoreAddGroup(); + SvcHrsCbackRegister(NULL, HrpsWriteCback); + SvcHrsAddGroup(); + SvcDisAddGroup(); + SvcBattCbackRegister(BasReadCback, NULL); + SvcBattAddGroup(); + SvcRscsAddGroup(); + + /* Set running speed and cadence features */ + RscpsSetFeatures(RSCS_ALL_FEATURES); + + /* Reset the device */ + DmDevReset(); +} diff --git a/ble/main.c b/ble/main.c new file mode 100644 index 0000000000000000000000000000000000000000..a1dd73a843969e1afb892d38df94cb87b9719d93 --- /dev/null +++ b/ble/main.c @@ -0,0 +1,246 @@ +/******************************************************************************* + * Copyright (C) 2018 Maxim Integrated Products, Inc., All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES + * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Except as contained in this notice, the name of Maxim Integrated + * Products, Inc. shall not be used except as stated in the Maxim Integrated + * Products, Inc. Branding Policy. + * + * The mere transfer of this software does not imply any licenses + * of trade secrets, proprietary technology, copyrights, patents, + * trademarks, maskwork rights, or any other form of intellectual + * property whatsoever. Maxim Integrated Products, Inc. retains all + * ownership rights. + * + * $Date: 2019-02-11 23:36:35 +0000 (Mon, 11 Feb 2019) $ + * $Revision: 40967 $ + * + ******************************************************************************/ + +#include <stdio.h> +#include <string.h> +#include "wsf_types.h" +#include "wsf_os.h" +#include "wsf_buf.h" +#include "wsf_timer.h" +#include "wsf_trace.h" +#include "app_ui.h" +#include "ll_api.h" +#include "sch_api.h" +#include "fit/fit_api.h" +#include "mxc_config.h" +#include "gcr_regs.h" +#include "mcr_regs.h" +#include "hci_core.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/* Number of WSF buffer pools */ +#define WSF_BUF_POOLS 6 + +/* Size of buffer for stdio functions */ +#define PRINTF_BUF_SIZE 128 + +/************************************************************************************************** + Local Variables +**************************************************************************************************/ + +/*! Buffer for stdio functions */ +char printf_buffer[PRINTF_BUF_SIZE]; + +/*! Free memory for pool buffers (use word elements for word alignment). */ +static uint32_t mainBufMem[3584/sizeof(uint32_t)+96]; + +/*! Default pool descriptor. */ +static wsfBufPoolDesc_t mainPoolDesc[WSF_BUF_POOLS] = +{ + { 16, 8 }, + { 32, 4 }, + { 64, 4 }, + { 128, 4 }, + { 256, 4 }, + { 384, 4 } +}; + +/************************************************************************************************** + Functions +**************************************************************************************************/ + +/*! \brief Stack initialization for app. */ +extern void StackInitFit(void); + +void HciVsSetPublicAddr(uint8_t *bdAddr); + +/*************************************************************************************************/ +void SysTick_Handler(void) +{ + WsfTimerUpdate(1); +} + +/*************************************************************************************************/ +static void myTrace(const char *pStr, va_list args) +{ + extern uint8_t wsfCsNesting; + + if (wsfCsNesting == 0) + { + vprintf(pStr, args); + printf("\r\n"); + } +} + +/*************************************************************************************************/ +/*! + * \brief Initialize WSF. + * + * \return None. + */ +/*************************************************************************************************/ +static void WsfInit(void) +{ + WsfTimerInit(); + WsfBufInit(sizeof(mainBufMem), (uint8_t*)mainBufMem, WSF_BUF_POOLS, mainPoolDesc); + WsfTraceRegister(myTrace); +} + +/*************************************************************************************************/ +/*! + * \brief Initialize platform. + * + * \param msPerTick Milliseconds per timer tick. + * + * \return None. + */ +/*************************************************************************************************/ +void PlatformInit(void) +{ + /* Change the pullup on the RST pin to 25K */ + MXC_MCR->ctrl = 0x202; + + /* Set VREGO_D to 1.3V */ + *((volatile uint32_t*)0x40004410) = 0x50; + + /* Set TX LDO to 1.1V and enable LDO. Set RX LDO to 0.9V and enable LDO */ + MXC_GCR->btleldocn = 0xD9; // TX 1.1V RX 0.9V + + /* Power up the 32MHz XO */ + MXC_GCR->clkcn |= MXC_F_GCR_CLKCN_X32M_EN; + + /* Enable peripheral clocks */ + MXC_GCR->perckcn0 &= ~(MXC_F_GCR_PERCKCN0_GPIO0D | MXC_F_GCR_PERCKCN0_GPIO1D); // Clear GPIO0 and GPIO1 Disable + MXC_GCR->perckcn1 &= ~(MXC_F_GCR_PERCKCN1_BTLED | MXC_F_GCR_PERCKCN1_TRNGD ); // Clear BTLE and ICACHE0 disable + + /* setup the systick */ + SysTick->LOAD = (SystemCoreClock / 1000) * WSF_MS_PER_TICK; + SysTick->VAL = 0; + SysTick->CTRL |= (SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk); + +#ifndef __IAR_SYSTEMS_ICC__ + /* Added to prevent printf() and friends from using malloc() */ + setvbuf(stdout, printf_buffer, _IOLBF, PRINTF_BUF_SIZE); +#endif +} + + +/* + * In two-chip solutions, setting the address must wait until the HCI interface is initialized. + * This handler can also catch other Application events, but none are currently implemented. + * See ble-profiles/sources/apps/app/common/app_ui.c for further details. + * + */ +void SetAddress(uint8_t event) +{ + uint8_t bdAddr[6] = {0x02, 0x02, 0x44, 0x8B, 0x05, 0x00}; + + switch (event) { + case APP_UI_RESET_CMPL: + printf("Setting address -- MAC %02X:%02X:%02X:%02X:%02X:%02X\n", bdAddr[5], bdAddr[4], bdAddr[3], bdAddr[2], bdAddr[1], bdAddr[0]); + LlSetBdAddr((uint8_t*)&bdAddr); + LlGetBdAddr(hciCoreCb.bdAddr); + break; + default: + break; + } +} + +/*************************************************************************************************/ +/*! + * \brief Initialize MAC layer. + * + * \param None. + * + * \return None. + */ +/*************************************************************************************************/ +extern int8_t tx_rfpower_on; +void MacInit(void) +{ + wsfHandlerId_t handlerId; + + /* Initialize link layer. */ + BbInit(); + handlerId = WsfOsSetNextHandler(SchHandler); + SchInit(handlerId); + LlAdvSlaveInit(); + LlConnSlaveInit(); + handlerId = WsfOsSetNextHandler(LlHandler); + LlHandlerInit(handlerId); +} + +/*************************************************************************************************/ +/*! + * \fn main + * + * \brief Entry point for demo software. + * + * \param None. + * + * \return None. + */ +/*************************************************************************************************/ +int main(void) +{ + printf("\n\n***** MAX32665 BLE Fitness Profile *****\n"); + + PlatformInit(); + WsfInit(); + MacInit(); + StackInitFit(); + FitStart(); + + printf("tx_rfpower_on = %d\n", tx_rfpower_on); + HciVsSetTxPower(-20); + //HciVsSetTxPower(-30); + //tx_rfpower_on = 10; + //LlSetTxPower(10); + printf("tx_rfpower_on = %d\n", tx_rfpower_on); + + /* Register a handler for Application events */ + AppUiActionRegister(SetAddress); + + printf("Setup Complete\n"); + + while (1) + { + wsfOsDispatcher(); + } +} diff --git a/ble/stack_fit.c b/ble/stack_fit.c new file mode 100644 index 0000000000000000000000000000000000000000..db5f59997c59a2240c7588859a09e8a387bb112b --- /dev/null +++ b/ble/stack_fit.c @@ -0,0 +1,94 @@ +/*************************************************************************************************/ +/*! + * \file + * + * \brief Stack initialization for fit. + * + * Copyright (c) 2016-2017 ARM Ltd. All Rights Reserved. + * ARM Ltd. confidential and proprietary. + * + * IMPORTANT. Your use of this file is governed by a Software License Agreement + * ("Agreement") that must be accepted in order to download or otherwise receive a + * copy of this file. You may not use or copy this file for any purpose other than + * as described in the Agreement. If you do not agree to all of the terms of the + * Agreement do not use this file and delete all copies in your possession or control; + * if you do not have a copy of the Agreement, you must contact ARM Ltd. prior + * to any use, copying or further distribution of this software. + */ +/*************************************************************************************************/ + +#include "wsf_types.h" +#include "wsf_os.h" +#include "util/bstream.h" +#include "fit/fit_api.h" +#include "hci_handler.h" +#include "dm_handler.h" +#include "l2c_handler.h" +#include "att_handler.h" +#include "smp_handler.h" +#include "l2c_api.h" +#include "att_api.h" +#include "smp_api.h" +#include "app_api.h" +#include "svc_dis.h" +#include "svc_core.h" +#include "sec_api.h" + +/*************************************************************************************************/ +/*! + * \brief Initialize stack. + * + * \return None. + */ +/*************************************************************************************************/ +void StackInitFit(void) +{ + wsfHandlerId_t handlerId; + uint8_t features[sizeof(uint64_t)]; + uint8_t mask[sizeof(uint64_t)]; + + SecInit(); + SecAesInit(); + SecCmacInit(); + SecEccInit(); + + // Only use legacy API. + Uint64ToBstream(features, 0); + Uint64ToBstream(mask, HCI_LE_SUP_FEAT_LE_EXT_ADV); + HciVsSetFeatures(features, mask); + + handlerId = WsfOsSetNextHandler(HciHandler); + HciHandlerInit(handlerId); + + handlerId = WsfOsSetNextHandler(DmHandler); + DmDevVsInit(0); + DmAdvInit(); + DmConnInit(); + DmConnSlaveInit(); + DmSecInit(); + DmSecLescInit(); + DmPrivInit(); + DmHandlerInit(handlerId); + + handlerId = WsfOsSetNextHandler(L2cSlaveHandler); + L2cSlaveHandlerInit(handlerId); + L2cInit(); + L2cSlaveInit(); + + handlerId = WsfOsSetNextHandler(AttHandler); + AttHandlerInit(handlerId); + AttsInit(); + AttsIndInit(); + + handlerId = WsfOsSetNextHandler(SmpHandler); + SmpHandlerInit(handlerId); + SmprInit(); + SmprScInit(); + HciSetMaxRxAclLen(100); + + handlerId = WsfOsSetNextHandler(AppHandler); + AppHandlerInit(handlerId); + + handlerId = WsfOsSetNextHandler(FitHandler); + FitHandlerInit(handlerId); +} diff --git a/ble/svc_dis.c b/ble/svc_dis.c new file mode 100644 index 0000000000000000000000000000000000000000..bbdf8cc18a0b8cbadf3077c80c61c41a9511277f --- /dev/null +++ b/ble/svc_dis.c @@ -0,0 +1,297 @@ +/*************************************************************************************************/ +/*! + * \file svc_dis.c + * + * \brief Example Device Information Service implementation. + * + * $Date: 2018-04-17 23:02:20 +0000 (Tue, 17 Apr 2018) $ + * $Revision: 34673 $ + * + * Copyright (c) 2011 Wicentric, Inc., all rights reserved. + * Wicentric confidential and proprietary. + * + * IMPORTANT. Your use of this file is governed by a Software License Agreement + * ("Agreement") that must be accepted in order to download or otherwise receive a + * copy of this file. You may not use or copy this file for any purpose other than + * as described in the Agreement. If you do not agree to all of the terms of the + * Agreement do not use this file and delete all copies in your possession or control; + * if you do not have a copy of the Agreement, you must contact Wicentric, Inc. prior + * to any use, copying or further distribution of this software. + */ +/*************************************************************************************************/ + +#include "wsf_types.h" +#include "att_api.h" +#include "wsf_trace.h" +#include "util/bstream.h" +#include "svc_dis.h" +#include "svc_cfg.h" + +/************************************************************************************************** + Macros +**************************************************************************************************/ + +/*! Characteristic read permissions */ +#ifndef DIS_SEC_PERMIT_READ +#define DIS_SEC_PERMIT_READ SVC_SEC_PERMIT_READ +#endif + +/************************************************************************************************** + Service variables +**************************************************************************************************/ + +/* Device information service declaration */ +static const uint8_t disValSvc[] = {UINT16_TO_BYTES(ATT_UUID_DEVICE_INFO_SERVICE)}; +static const uint16_t disLenSvc = sizeof(disValSvc); + +/* Manufacturer name string characteristic */ +static const uint8_t disValMfrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_MFR_HDL), UINT16_TO_BYTES(ATT_UUID_MANUFACTURER_NAME)}; +static const uint16_t disLenMfrCh = sizeof(disValMfrCh); + +/* Manufacturer name string */ +static const uint8_t disUuMfr[] = {UINT16_TO_BYTES(ATT_UUID_MANUFACTURER_NAME)}; +static const uint8_t disValMfr[] = "Maxim Integrated"; +static const uint16_t disLenMfr = sizeof(disValMfr) - 1; + +/* System ID characteristic */ +static const uint8_t disValSidCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_SID_HDL), UINT16_TO_BYTES(ATT_UUID_SYSTEM_ID)}; +static const uint16_t disLenSidCh = sizeof(disValSidCh); + +/* System ID */ +static const uint8_t disUuSid[] = {UINT16_TO_BYTES(ATT_UUID_SYSTEM_ID)}; +static uint8_t disValSid[] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08}; +static const uint16_t disLenSid = sizeof(disValSid); + +/* Model number string characteristic */ +static const uint8_t disValMnCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_MN_HDL), UINT16_TO_BYTES(ATT_UUID_MODEL_NUMBER)}; +static const uint16_t disLenMnCh = sizeof(disValMnCh); + +/* Model number string */ +static const uint8_t disUuMn[] = {UINT16_TO_BYTES(ATT_UUID_MODEL_NUMBER)}; +static const uint8_t disValMn[] = "MAX32565"; +static const uint16_t disLenMn = sizeof(disValMn) - 1; + +/* Serial number string characteristic */ +static const uint8_t disValSnCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_SN_HDL), UINT16_TO_BYTES(ATT_UUID_SERIAL_NUMBER)}; +static const uint16_t disLenSnCh = sizeof(disValSnCh); + +/* Serial number string */ +static const uint8_t disUuSn[] = {UINT16_TO_BYTES(ATT_UUID_SERIAL_NUMBER)}; +static const uint8_t disValSn[] = "serial num"; +static const uint16_t disLenSn = sizeof(disValSn) - 1; + +/* Firmware revision string characteristic */ +static const uint8_t disValFwrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_FWR_HDL), UINT16_TO_BYTES(ATT_UUID_FIRMWARE_REV)}; +static const uint16_t disLenFwrCh = sizeof(disValFwrCh); + +/* Firmware revision string */ +static const uint8_t disUuFwr[] = {UINT16_TO_BYTES(ATT_UUID_FIRMWARE_REV)}; +static const uint8_t disValFwr[] = "fw rev"; +static const uint16_t disLenFwr = sizeof(disValFwr) - 1; + +/* Hardware revision string characteristic */ +static const uint8_t disValHwrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_HWR_HDL), UINT16_TO_BYTES(ATT_UUID_HARDWARE_REV)}; +static const uint16_t disLenHwrCh = sizeof(disValHwrCh); + +/* Hardware revision string */ +static const uint8_t disUuHwr[] = {UINT16_TO_BYTES(ATT_UUID_HARDWARE_REV)}; +static const uint8_t disValHwr[] = "hw rev"; +static const uint16_t disLenHwr = sizeof(disValHwr) - 1; + +/* Software revision string characteristic */ +static const uint8_t disValSwrCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_SWR_HDL), UINT16_TO_BYTES(ATT_UUID_SOFTWARE_REV)}; +static const uint16_t disLenSwrCh = sizeof(disValSwrCh); + +/* Software revision string */ +static const uint8_t disUuSwr[] = {UINT16_TO_BYTES(ATT_UUID_SOFTWARE_REV)}; +static const uint8_t disValSwr[] = "sw rev"; +static const uint16_t disLenSwr = sizeof(disValSwr) - 1; + +/* Registration certificate data characteristic */ +static const uint8_t disValRcdCh[] = {ATT_PROP_READ, UINT16_TO_BYTES(DIS_RCD_HDL), UINT16_TO_BYTES(ATT_UUID_11073_CERT_DATA)}; +static const uint16_t disLenRcdCh = sizeof(disValRcdCh); + +/* Registration certificate data */ +static const uint8_t disUuRcd[] = {UINT16_TO_BYTES(ATT_UUID_11073_CERT_DATA)}; +static const uint8_t disValRcd[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; +static const uint16_t disLenRcd = sizeof(disValRcd); + +/* Attribute list for dis group */ +static const attsAttr_t disList[] = +{ + { + attPrimSvcUuid, + (uint8_t *) disValSvc, + (uint16_t *) &disLenSvc, + sizeof(disValSvc), + 0, + ATTS_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValMfrCh, + (uint16_t *) &disLenMfrCh, + sizeof(disValMfrCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuMfr, + (uint8_t *) disValMfr, + (uint16_t *) &disLenMfr, + sizeof(disValMfr) - 1, + 0, + DIS_SEC_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValSidCh, + (uint16_t *) &disLenSidCh, + sizeof(disValSidCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuSid, + disValSid, + (uint16_t *) &disLenSid, + sizeof(disValSid), + 0, + DIS_SEC_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValMnCh, + (uint16_t *) &disLenMnCh, + sizeof(disValMnCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuMn, + (uint8_t *) disValMn, + (uint16_t *) &disLenMn, + sizeof(disValMn) - 1, + 0, + DIS_SEC_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValSnCh, + (uint16_t *) &disLenSnCh, + sizeof(disValSnCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuSn, + (uint8_t *) disValSn, + (uint16_t *) &disLenSn, + sizeof(disValSn) - 1, + 0, + DIS_SEC_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValFwrCh, + (uint16_t *) &disLenFwrCh, + sizeof(disValFwrCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuFwr, + (uint8_t *) disValFwr, + (uint16_t *) &disLenFwr, + sizeof(disValFwr) - 1, + 0, + DIS_SEC_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValHwrCh, + (uint16_t *) &disLenHwrCh, + sizeof(disValHwrCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuHwr, + (uint8_t *) disValHwr, + (uint16_t *) &disLenHwr, + sizeof(disValHwr) - 1, + 0, + DIS_SEC_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValSwrCh, + (uint16_t *) &disLenSwrCh, + sizeof(disValSwrCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuSwr, + (uint8_t *) disValSwr, + (uint16_t *) &disLenSwr, + sizeof(disValSwr) - 1, + 0, + DIS_SEC_PERMIT_READ + }, + { + attChUuid, + (uint8_t *) disValRcdCh, + (uint16_t *) &disLenRcdCh, + sizeof(disValRcdCh), + 0, + ATTS_PERMIT_READ + }, + { + disUuRcd, + (uint8_t *) disValRcd, + (uint16_t *) &disLenRcd, + sizeof(disValRcd), + 0, + DIS_SEC_PERMIT_READ + }, +}; + +/* DIS group structure */ +static attsGroup_t svcDisGroup = +{ + NULL, + (attsAttr_t *) disList, + NULL, + NULL, + DIS_START_HDL, + DIS_END_HDL +}; + +/*************************************************************************************************/ +/*! + * \fn SvcDisAddGroup + * + * \brief Add the services to the attribute server. + * + * \return None. + */ +/*************************************************************************************************/ +void SvcDisAddGroup(void) +{ + AttsAddGroup(&svcDisGroup); +} + +/*************************************************************************************************/ +/*! + * \fn SvcDisRemoveGroup + * + * \brief Remove the services from the attribute server. + * + * \return None. + */ +/*************************************************************************************************/ +void SvcDisRemoveGroup(void) +{ + AttsRemoveGroup(DIS_START_HDL); +}