Compare commits

..

2 Commits

Author SHA1 Message Date
Ta-Shun Su 66d4a69a74 save 2019-05-08 15:29:46 +08:00
Ta-Shun Su 531580243d copy from origin/NeuLiveSTI 2019-05-08 15:26:58 +08:00
63 changed files with 3866 additions and 3720 deletions
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/common/cc26xx/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/controller/cc26xx/inc/
+1
View File
@@ -0,0 +1 @@
../tirtos_cc13xx_cc26xx_2_21_01_08/products/cc26xxware_2_24_03_17272/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/hal/src/inc/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common/cc26xx/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/heapmgr/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/examples/host_test/cc26xx/app/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/icall/inc/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/icall/src/inc/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/inc/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/npi/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/osal/src/inc/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/profiles/roles/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/profiles/dev_info/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/profiles/simple_profile/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/rom/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/services/src/saddr/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/components/services/src/sdata/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/examples/simple_peripheral/cc26xx/app/
+1
View File
@@ -0,0 +1 @@
../simplelink/ble_sdk_2_02_02_25/src/target/
@@ -9,6 +9,6 @@
<linkerCommandFile value="cc26x0f128.cmd"/>
<rts value="libc.a"/>
<createSlaveProjects value=""/>
<connection value="common/targetdb/connections/TIXDS110_Connection.xml"/>
<connection value="common/targetdb/connections/TIXDS100v3_Dot7_Connection.xml"/>
<isTargetManual value="false"/>
</projectOptions>
@@ -18,13 +18,13 @@
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
<configuration artifactExtension="out" artifactName="${ProjName}" buildProperties="" cleanCommand="${CG_CLEAN_CMD}" description="" errorParsers="org.eclipse.rtsc.xdctools.parsers.ErrorParser;com.ti.rtsc.XDCtools.parsers.ErrorParser;com.ti.ccstudio.errorparser.CoffErrorParser;com.ti.ccstudio.errorparser.LinkErrorParser;com.ti.ccstudio.errorparser.AsmErrorParser;org.eclipse.cdt.core.GmakeErrorParser" id="com.ti.ccstudio.buildDefinitions.TMS470.Default.67178137" name="FlashROM" parent="com.ti.ccstudio.buildDefinitions.TMS470.Default" postbuildStep="${CG_TOOL_HEX} -order MS --memwidth=8 --romwidth=8 --intel -o ${ProjName}.hex ${ProjName}.out" prebuildStep="">
<folderInfo id="com.ti.ccstudio.buildDefinitions.TMS470.Default.67178137." name="/" resourcePath="">
<toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.DebugToolchain.1369151231" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug.223507680">
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.732777020" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
<toolChain id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.DebugToolchain.308833195" name="TI Build Tools" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.DebugToolchain" targetTool="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug.2125878104">
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS.2138235341" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_TAGS" valueType="stringList">
<listOptionValue builtIn="false" value="DEVICE_CONFIGURATION_ID=Cortex M.CC2650F128"/>
<listOptionValue builtIn="false" value="DEVICE_ENDIANNESS=little"/>
<listOptionValue builtIn="false" value="OUTPUT_FORMAT=ELF"/>
<listOptionValue builtIn="false" value="RUNTIME_SUPPORT_LIBRARY=libc.a"/>
<listOptionValue builtIn="false" value="XDC_VERSION=3.32.2.25_core"/>
<listOptionValue builtIn="false" value="XDC_VERSION=3.32.0.06_core"/>
<listOptionValue builtIn="false" value="INACTIVE_REPOS="/>
<listOptionValue builtIn="false" value="EXPANDED_REPOS="/>
<listOptionValue builtIn="false" value="RTSC_PRODUCTS=com.ti.rtsc.TIRTOSCC13XX_CC26XX:2.21.01.08;"/>
@@ -34,17 +34,17 @@
<listOptionValue builtIn="false" value="LINK_ORDER=TOOLS/ccs_linker_defines.cmd;TOOLS/cc26xx_app.cmd;"/>
<listOptionValue builtIn="false" value="RTSC_MBS_VERSION=2.2.0"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.579299287" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="18.1.4.LTS" valueType="string"/>
<targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformDebug.2112816025" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformDebug"/>
<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderDebug.1418617668" name="GNU Make.FlashROM" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderDebug"/>
<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerDebug.1368914557" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerDebug">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.872349905" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.7M3" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.1023813954" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.16" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.1674413144" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.eabi" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN.184317276" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_LEVEL.1068578615" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_LEVEL.4" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_FOR_SPEED.1943600764" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH.644525479" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH" valueType="includePath">
<option id="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION.243195404" name="Compiler version" superClass="com.ti.ccstudio.buildDefinitions.core.OPT_CODEGEN_VERSION" value="18.1.4.LTS" valueType="string"/>
<targetPlatform id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformDebug.955793533" name="Platform" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.targetPlatformDebug"/>
<builder buildPath="${BuildDirectory}" id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderDebug.638576662" keepEnvironmentInBuildfile="false" name="GNU Make" parallelBuildOn="true" parallelizationNumber="optimal" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.builderDebug"/>
<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerDebug.1016177761" name="ARM Compiler" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.compilerDebug">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.2070806136" name="Target processor version (--silicon_version, -mv)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.SILICON_VERSION.7M3" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.1411365061" name="Designate code state, 16-bit (thumb) or 32-bit (--code_state)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CODE_STATE.16" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.193495829" name="Application binary interface. (--abi)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.ABI.eabi" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN.1573436637" name="Little endian code [See 'General' page to edit] (--little_endian, -me)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.LITTLE_ENDIAN" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_LEVEL.978889992" name="Optimization level (--opt_level, -O)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_LEVEL" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_LEVEL.4" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_FOR_SPEED.1392883332" name="Speed vs. size trade-offs (--opt_for_speed, -mf)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_FOR_SPEED" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.OPT_FOR_SPEED.0" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH.511635494" name="Add dir to #include search path (--include_path, -I)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.INCLUDE_PATH" valueType="includePath">
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
<listOptionValue builtIn="false" value="C:\ti\simplelink\ble_sdk_2_02_02_25\src\examples\simple_peripheral\cc26xx\app\headstage"/>
<listOptionValue builtIn="false" value="${SRC_EX}/examples/simple_peripheral/cc26xx/app"/>
@@ -70,11 +70,10 @@
<listOptionValue builtIn="false" value="${SRC_BLE_CORE}/rom"/>
<listOptionValue builtIn="false" value="${CC26XXWARE}"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE.1330623088" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE" valueType="definedSymbols">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE.521147483" name="Pre-define NAME (--define, -D)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEFINE" valueType="definedSymbols">
<listOptionValue builtIn="false" value="BOARD_DISPLAY_EXCLUDE_UART"/>
<listOptionValue builtIn="false" value="POWER_SAVING"/>
<listOptionValue builtIn="false" value="BOOSTXL_CC2650MA"/>
<listOptionValue builtIn="false" value="HEADSTAGE_MA_USE_SPI2"/>
<listOptionValue builtIn="false" value="CC26XX"/>
<listOptionValue builtIn="false" value="GAPROLE_TASK_STACK_SIZE=540"/>
<listOptionValue builtIn="false" value="HEAPMGR_SIZE=0"/>
@@ -86,71 +85,71 @@
<listOptionValue builtIn="false" value="xdc_runtime_Assert_DISABLE_ALL"/>
<listOptionValue builtIn="false" value="xdc_runtime_Log_DISABLE_ALL"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.1308360247" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.C_DIALECT.504235202" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.C_DIALECT" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.C_DIALECT.C99" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC.105967788" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_SUPPRESS.698913237" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_SUPPRESS" valueType="stringList">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.1861999587" name="Debugging model" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DEBUGGING_MODEL.SYMDEBUG__DWARF" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.C_DIALECT.1867564782" name="C Dialect" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.C_DIALECT" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.C_DIALECT.C99" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC.2052831394" name="Enable support for GCC extensions (DEPRECATED) (--gcc)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GCC" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_SUPPRESS.1102242787" name="Suppress diagnostic &lt;id&gt; (--diag_suppress, -pds)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_SUPPRESS" valueType="stringList">
<listOptionValue builtIn="false" value="48"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING.1399241416" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING" valueType="stringList">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING.727880917" name="Treat diagnostic &lt;id&gt; as warning (--diag_warning, -pdsw)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WARNING" valueType="stringList">
<listOptionValue builtIn="false" value="225"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.867926379" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER.980626282" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GEN_FUNC_SUBSECTIONS.374992114" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GEN_FUNC_SUBSECTIONS" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GEN_FUNC_SUBSECTIONS.on" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CMD_FILE.1890491357" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CMD_FILE" valueType="stringList">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.996618365" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DIAG_WRAP.off" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER.858761211" name="Emit diagnostic identifier numbers (--display_error_number, -pden)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GEN_FUNC_SUBSECTIONS.96303422" name="Place each function in a separate subsection (--gen_func_subsections, -ms)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GEN_FUNC_SUBSECTIONS" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.GEN_FUNC_SUBSECTIONS.on" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CMD_FILE.1634706392" name="Read options from specified file (--cmd_file, -@)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compilerID.CMD_FILE" valueType="stringList">
<listOptionValue builtIn="false" value="${SRC_EX}/config/build_components.opt"/>
<listOptionValue builtIn="false" value="${ORG_PROJ_DIR}/build_config.opt"/>
<listOptionValue builtIn="false" value="${ORG_PROJ_DIR}/../../ccs/config/ccs_compiler_defines.bcfg"/>
</option>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS.263445006" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS.1235873701" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS.207268648" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS.1068957263" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS.1149005836" name="C Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__C_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS.404213358" name="C++ Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__CPP_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS.1356338499" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS.1609020645" name="Assembly Sources" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.compiler.inputType__ASM2_SRCS"/>
</tool>
<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug.223507680" name="ARM Linker" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE.698430423" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE" value="256" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE.402182782" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE" value="0" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE.1628689699" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE" value="&quot;${ProjName}.map&quot;" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE.2141951901" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE" value="${ProjName}.out" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY.679112687" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY" valueType="libs">
<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug.2125878104" name="ARM Linker" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exe.linkerDebug">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE.1993482378" name="Set C system stack size (--stack_size, -stack)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.STACK_SIZE" value="256" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE.833137428" name="Heap size for C/C++ dynamic memory allocation (--heap_size, -heap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.HEAP_SIZE" value="0" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE.1072440081" name="Link information (map) listed into &lt;file&gt; (--map_file, -m)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.MAP_FILE" value="&quot;${ProjName}.map&quot;" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE.95815077" name="Specify output file name (--output_file, -o)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.OUTPUT_FILE" value="${ProjName}.out" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY.1766117832" name="Include library file or command file as input (--library, -l)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.LIBRARY" valueType="libs">
<listOptionValue builtIn="false" value="libc.a"/>
<listOptionValue builtIn="false" value="${CC26XXWARE}/driverlib/bin/ccs/driverlib.lib"/>
<listOptionValue builtIn="false" value="${ROM}/common_rom_releases/03282014/common_rom.symbols"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH.650613345" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH" valueType="libPaths">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH.1149343368" name="Add &lt;dir&gt; to library search path (--search_path, -i)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.SEARCH_PATH" valueType="libPaths">
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/lib"/>
<listOptionValue builtIn="false" value="${CG_TOOL_ROOT}/include"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_SUPPRESS.782343525" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_SUPPRESS" valueType="stringList">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_SUPPRESS.512740056" name="Suppress diagnostic &lt;id&gt; (--diag_suppress)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_SUPPRESS" valueType="stringList">
<listOptionValue builtIn="false" value="10247-D"/>
<listOptionValue builtIn="false" value="16002-D"/>
</option>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.1555270082" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER.16105060" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO.1713299511" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO" value="&quot;${ProjName}_linkInfo.xml&quot;" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.COMPRESS_DWARF.68776981" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.COMPRESS_DWARF" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.COMPRESS_DWARF.on" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.UNUSED_SECTION_ELIMINATION.1860389255" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.UNUSED_SECTION_ELIMINATION" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.UNUSED_SECTION_ELIMINATION.on" valueType="enumerated"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS.152379533" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS.158095632" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS.978853236" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.755787473" name="Wrap diagnostic messages (--diag_wrap)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DIAG_WRAP.off" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER.1039632635" name="Emit diagnostic identifier numbers (--display_error_number)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.DISPLAY_ERROR_NUMBER" value="true" valueType="boolean"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO.160090718" name="Detailed link information data-base into &lt;file&gt; (--xml_link_info, -xml_link_info)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.XML_LINK_INFO" value="&quot;${ProjName}_linkInfo.xml&quot;" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.COMPRESS_DWARF.1907564273" name="Aggressively reduce size of the DWARF information (--compress_dwarf)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.COMPRESS_DWARF" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.COMPRESS_DWARF.on" valueType="enumerated"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.UNUSED_SECTION_ELIMINATION.1278577864" name="Eliminate sections not needed in the executable (--unused_section_elimination)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.UNUSED_SECTION_ELIMINATION" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.linkerID.UNUSED_SECTION_ELIMINATION.on" valueType="enumerated"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS.1166775149" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS.1192919935" name="Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__CMD2_SRCS"/>
<inputType id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS.1491242603" name="Generated Linker Command Files" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.exeLinker.inputType__GEN_CMDS"/>
</tool>
<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.2015106526" name="ARM Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.ROMWIDTH.1270425102" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.ROMWIDTH" value="8" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.MEMWIDTH.16813235" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.MEMWIDTH" value="8" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.OUTPUT_FORMAT.318851558" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.OUTPUT_FORMAT" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.OUTPUT_FORMAT.INTEL" valueType="enumerated"/>
<tool id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.1967400950" name="ARM Hex Utility" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex">
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.ROMWIDTH.1242139870" name="Specify rom width (--romwidth, -romwidth=width)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.ROMWIDTH" value="8" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.MEMWIDTH.1863065780" name="Specify memory width (--memwidth, -memwidth=width)" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.MEMWIDTH" value="8" valueType="string"/>
<option id="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.OUTPUT_FORMAT.47746446" name="Output format" superClass="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.OUTPUT_FORMAT" value="com.ti.ccstudio.buildDefinitions.TMS470_18.1.hex.OUTPUT_FORMAT.INTEL" valueType="enumerated"/>
</tool>
<tool id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.927640565" name="XDCtools" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool">
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.XDC_PATH.1908494509" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.XDC_PATH" valueType="stringList">
<tool id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.1864525425" name="XDCtools" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool">
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.XDC_PATH.46430604" name="Package repositories (--xdcpath)" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.XDC_PATH" valueType="stringList">
<listOptionValue builtIn="false" value="${COM_TI_RTSC_TIRTOSCC13XX_CC26XX_REPOS}"/>
<listOptionValue builtIn="false" value="${TARGET_CONTENT_BASE}"/>
</option>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.TARGET.1746187707" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.TARGET" value="ti.targets.arm.elf.M3" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM.884959194" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM" value="ti.platforms.simplelink:CC2640F128" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM_RAW.943624305" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM_RAW" value="ti.platforms.simplelink:CC2640F128" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.BUILD_PROFILE.1521167272" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.BUILD_PROFILE" value="release" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.CODEGEN_TOOL_DIR.1901654533" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.CODEGEN_TOOL_DIR" value="${CG_TOOL_ROOT}" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.COMPILE_OPTIONS.138005453" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.COMPILE_OPTIONS" value="&quot;${COMPILER_FLAGS}&quot;" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.TARGET.313008504" name="Target (-t)" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.TARGET" value="ti.targets.arm.elf.M3" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM.807892561" name="Platform (-p)" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM" value="ti.platforms.simplelink:CC2640F128" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM_RAW.1808973543" name="Platform (-p)" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.PLATFORM_RAW" value="ti.platforms.simplelink:CC2640F128" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.BUILD_PROFILE.1028195441" name="Build-profile (-r)" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.BUILD_PROFILE" value="release" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.CODEGEN_TOOL_DIR.295955151" name="Compiler tools directory (-c)" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.CODEGEN_TOOL_DIR" value="${CG_TOOL_ROOT}" valueType="string"/>
<option id="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.COMPILE_OPTIONS.128448790" name="Additional compiler options (--compileOptions)" superClass="com.ti.rtsc.buildDefinitions.XDC_3.16.tool.COMPILE_OPTIONS" value="&quot;${COMPILER_FLAGS}&quot;" valueType="string"/>
</tool>
</toolChain>
</folderInfo>
@@ -1,20 +1,19 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<configurations XML_version="1.2" id="configurations_0">
<configuration XML_version="1.2" id="Texas Instruments XDS110 USB Debug Probe_0">
<instance XML_version="1.2" desc="Texas Instruments XDS110 USB Debug Probe_0" href="connections/TIXDS110_Connection.xml" id="Texas Instruments XDS110 USB Debug Probe_0" xml="TIXDS110_Connection.xml" xmlpath="connections"/>
<connection XML_version="1.2" id="Texas Instruments XDS110 USB Debug Probe_0">
<instance XML_version="1.2" href="drivers/tixds510icepick_c.xml" id="drivers" xml="tixds510icepick_c.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds510cs_dap.xml" id="drivers" xml="tixds510cs_dap.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds510cortexM.xml" id="drivers" xml="tixds510cortexM.xml" xmlpath="drivers"/>
<property Type="choicelist" Value="1" id="Power Selection">
<choice Name="Probe supplied power" value="1">
<property Type="stringfield" Value="3.3" id="Voltage Level"/>
</choice>
</property>
<property Type="choicelist" Value="0" id="JTAG Signal Isolation"/>
<property Type="choicelist" Value="4" id="SWD Mode Settings">
<choice Name="cJTAG (1149.7) 2-pin advanced modes" value="enable">
<property Type="choicelist" Value="1" id="XDS110 Aux Port"/>
<configuration XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe_0">
<instance XML_version="1.2" desc="Texas Instruments XDS100v3 USB Debug Probe_0" href="connections/TIXDS100v3_Dot7_Connection.xml" id="Texas Instruments XDS100v3 USB Debug Probe_0" xml="TIXDS100v3_Dot7_Connection.xml" xmlpath="connections"/>
<connection XML_version="1.2" id="Texas Instruments XDS100v3 USB Debug Probe_0">
<instance XML_version="1.2" href="drivers/tixds100v2icepick_c.xml" id="drivers" xml="tixds100v2icepick_c.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cs_dap.xml" id="drivers" xml="tixds100v2cs_dap.xml" xmlpath="drivers"/>
<instance XML_version="1.2" href="drivers/tixds100v2cortexM.xml" id="drivers" xml="tixds100v2cortexM.xml" xmlpath="drivers"/>
<property Type="choicelist" Value="2" id="The Converter Usage">
<choice Name="Generate 1149.7 2-pin advanced modes" value="enable">
<property Type="choicelist" Value="1" id="The Converter 1149.7 Frequency">
<choice Name="Overclock with user specified value" value="unused">
<property Type="choicelist" Value="5" id="-- Choose a value from 1.0MHz to 50.0MHz"/>
</choice>
</property>
<property Type="choicelist" Value="5" id="The Target Scan Format"/>
</choice>
</property>
<platform XML_version="1.2" id="platform_0">
@@ -16,11 +16,11 @@ BIOS_INC = -I"C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/pa
TARGET_INC = -I"C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/packages/"
INCS = $(BIOS_INC) $(TARGET_INC) --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.3.LTS/include" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/examples/simple_peripheral/cc26xx/app/headstage" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/examples/simple_peripheral/cc26xx/app" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/icall/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/dev_info" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/simple_profile/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/simple_profile" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/heapmgr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/controller/cc26xx/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/target" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/osal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/sdata" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/saddr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/icall/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/rom" --include_path="C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/cc26xxware_2_24_03_17272" -IC:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/packages/
INCS = $(BIOS_INC) $(TARGET_INC) --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/include" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/examples/simple_peripheral/cc26xx/app/headstage" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/examples/simple_peripheral/cc26xx/app" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/icall/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/dev_info" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/simple_profile/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/simple_profile" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/heapmgr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/controller/cc26xx/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/target" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/osal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/sdata" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/saddr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/icall/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/rom" --include_path="C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/cc26xxware_2_24_03_17272" -IC:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/packages/
CC = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.3.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.3.LTS/include
ASM = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.3.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.3.LTS/include
AR = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.3.LTS/bin/armar rq
CC = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/include
ASM = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/include
AR = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/bin/armar rq
DEL = C:/ti/xdctools_3_32_02_25_core/packages/../bin/rm -f
CP = C:/ti/xdctools_3_32_02_25_core/packages/../bin/cp -f
@@ -16,7 +16,7 @@
# sources were generated) is:
# C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650lp\host_test\ccs\config\src
#
GEN_SRC_DIR ?= ../../../../../ti/simplelink/ble_sdk_2_02_02_25/examples/cc2650lp/host_test/ccs/config/src
GEN_SRC_DIR ?= ../../config/src
ifeq (,$(wildcard $(GEN_SRC_DIR)))
$(error "ERROR: GEN_SRC_DIR must be set to the directory containing the generated sources")
@@ -16,11 +16,11 @@ BIOS_INC = -I"C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/pa
TARGET_INC = -I"C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/packages/"
INCS = $(BIOS_INC) $(TARGET_INC) --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-arm_16.9.4.LTS/include" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/examples/host_test/cc26xx/app" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/icall/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/npi/src" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/heapmgr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/controller/cc26xx/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/target" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/osal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/sdata" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/saddr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/icall/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/rom" --include_path="C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/cc26xxware_2_24_03_17272" -IC:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/packages/
INCS = $(BIOS_INC) $(TARGET_INC) --include_path="C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/include" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/examples/host_test/cc26xx/app/cc2650" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/examples/host_test/cc26xx/app" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/icall/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/profiles/roles" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/npi/src" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/heapmgr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/controller/cc26xx/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/target" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/target/_common/cc26xx" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/hal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/osal/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/sdata" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/services/src/saddr" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/components/icall/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/inc" --include_path="C:/ti/simplelink/ble_sdk_2_02_02_25/src/rom" --include_path="C:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/cc26xxware_2_24_03_17272" -IC:/ti/tirtos_cc13xx_cc26xx_2_21_01_08/products/bios_6_46_01_38/packages/
CC = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_16.9.4.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_16.9.4.LTS/include
ASM = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_16.9.4.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_16.9.4.LTS/include
AR = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_16.9.4.LTS/bin/armar rq
CC = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/include
ASM = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/bin/armcl -c $(CCOPTS) -I C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/include
AR = C:/ti/ccsv8/tools/compiler/ti-cgt-arm_18.1.4.LTS/bin/armar rq
DEL = C:/ti/xdctools_3_32_00_06_core/packages/../bin/rm -f
CP = C:/ti/xdctools_3_32_00_06_core/packages/../bin/cp -f
@@ -16,7 +16,7 @@
# sources were generated) is:
# C:\ti\simplelink\ble_sdk_2_02_02_25\examples\cc2650lp\simple_peripheral\ccs\config\src
#
GEN_SRC_DIR ?= ../../../../../ti/simplelink/ble_sdk_2_02_02_25/examples/cc2650lp/simple_peripheral/ccs/config/src
GEN_SRC_DIR ?= ../../config/src
ifeq (,$(wildcard $(GEN_SRC_DIR)))
$(error "ERROR: GEN_SRC_DIR must be set to the directory containing the generated sources")
@@ -47,6 +47,8 @@
#include <ti/drivers/PIN.h>
#include <ti/drivers/pin/PINCC26XX.h>
#include <ti/drivers/PWM.h>
#include <ti/drivers/ADC.h>
#include <ti/drivers/adc/ADCCC26XX.h>
#include <ti/drivers/pwm/PWMTimerCC26XX.h>
#include <ti/drivers/timer/GPTimerCC26XX.h>
#include <ti/drivers/Power.h>
@@ -80,7 +82,6 @@ const PIN_Config BoardGpioInitTable[] = {
Board_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* UART TX */
Board_SRDY | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* SRDY */
Board_MRDY | PIN_INPUT_EN | PIN_PULLDOWN, /* MRDY */
PIN_TERMINATE
};
@@ -190,6 +191,71 @@ const UDMACC26XX_Config UDMACC26XX_config[] = {
* ============================= UDMA end =====================================
*/
/*
* ========================== SPI DMA begin ===================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SPI_config, ".const:SPI_config")
#pragma DATA_SECTION(spiCC26XXDMAHWAttrs, ".const:spiCC26XXDMAHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/spi/SPICC26XXDMA.h>
/* SPI objects */
SPICC26XXDMA_Object spiCC26XXDMAObjects[BOOSTXL_CC2650MA_SPICOUNT];
/* SPI configuration structure, describing which pins are to be used */
const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[BOOSTXL_CC2650MA_UDMACOUNT] = {
{
.baseAddr = SSI0_BASE,
.intNum = INT_SSI0_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI0,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
.mosiPin = Board_SPI0_MOSI,
.misoPin = Board_SPI0_MISO,
.clkPin = Board_SPI0_CLK,
.csnPin = Board_SPI0_CSN
},
{
.baseAddr = SSI1_BASE,
.intNum = INT_SSI1_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI1,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI1_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI1_TX,
.mosiPin = Board_SPI1_MOSI,
.misoPin = Board_SPI1_MISO,
.clkPin = Board_SPI1_CLK,
.csnPin = Board_SPI1_CSN
}
};
/* SPI configuration structure */
const SPI_Config SPI_config[] = {
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[0],
.hwAttrs = &spiCC26XXDMAHWAttrs[0]
},
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[1],
.hwAttrs = &spiCC26XXDMAHWAttrs[1]
},
{NULL, NULL, NULL}
};
/*
* ========================== SPI DMA end =====================================
*/
/*
* ========================== Crypto begin ====================================
@@ -373,3 +439,115 @@ const PWM_Config PWM_config[BOOSTXL_CC2650MA_PWMCOUNT + 1] = {
/*
* ============================= PWM end ======================================
*/
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(ADC_config, ".const:ADC_config")
#pragma DATA_SECTION(adcCC26xxHWAttrs, ".const:adcCC26xxHWAttrs")
#endif
ADCCC26XX_Object adcCC26xxObjects[BOOSTXL_CC2650MA_ADCCOUNT];
const ADCCC26XX_HWAttrs adcCC26xxHWAttrs[BOOSTXL_CC2650MA_ADCCOUNT] = {
{
.adcDIO = DIO7,
.adcCompBInput = ADC_COMPB_IN_AUXIO7,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = DIO8,
.adcCompBInput = ADC_COMPB_IN_AUXIO6,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = DIO9,
.adcCompBInput = ADC_COMPB_IN_AUXIO5,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_AUXIO4,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_AUXIO3,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_AUXIO2,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_AUXIO1,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_AUXIO0,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_10P9_MS,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_DCOUPL,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_VSS,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
},
{
.adcDIO = PIN_UNASSIGNED,
.adcCompBInput = ADC_COMPB_IN_VDDS,
.refSource = ADCCC26XX_FIXED_REFERENCE,
.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,
.inputScalingEnabled = true,
.triggerSource = ADCCC26XX_TRIGGER_MANUAL
}
};
const ADC_Config ADC_config[] = {
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[0], &adcCC26xxHWAttrs[0]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[1], &adcCC26xxHWAttrs[1]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[2], &adcCC26xxHWAttrs[2]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[3], &adcCC26xxHWAttrs[3]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[4], &adcCC26xxHWAttrs[4]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[5], &adcCC26xxHWAttrs[5]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[6], &adcCC26xxHWAttrs[6]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[7], &adcCC26xxHWAttrs[7]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[8], &adcCC26xxHWAttrs[8]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[9], &adcCC26xxHWAttrs[9]},
{&ADCCC26XX_fxnTable, &adcCC26xxObjects[10], &adcCC26xxHWAttrs[10]},
{NULL, NULL, NULL},
};
@@ -89,49 +89,50 @@ extern const PIN_Config BoardGpioInitTable[];
*/
/* Connector J1 */
#define Board_BP_Pin_J1_2 IOID_UNUSED
#define Board_BP_Pin_J1_2 DIO7
#define Board_BP_Pin_J1_3 DIO0
#define Board_BP_Pin_J1_4 DIO1
#define Board_BP_Pin_J1_5 DIO2
#define Board_BP_Pin_J1_6 DIO3
#define Board_BP_Pin_J1_7 DIO11 /* SCLK */
#define Board_BP_Pin_J1_7 DIO10
#define Board_BP_Pin_J1_8 DIO4
#define Board_BP_Pin_J1_9 DIO5
#define Board_BP_Pin_J1_10 DIO6
/* Connector J2 */
#define Board_BP_Pin_J2_19 IOID_UNUSED
#define Board_BP_Pin_J2_18 IOID_UNUSED
#define Board_BP_Pin_J2_19 DIO8
#define Board_BP_Pin_J2_18 DIO9 /* CS */
#define Board_BP_Pin_J2_17 IOID_UNUSED /* NC */
#define Board_BP_Pin_J2_15 DIO8 /* MOSI */
#define Board_BP_Pin_J2_14 DIO7 /* MISO */
#define Board_BP_Pin_J2_13 DIO9 /* DAC_CS */
#define Board_BP_Pin_J2_12 DIO12 /* ADC_CS */
#define Board_BP_Pin_J2_15 DIO11 /* MOSI */
#define Board_BP_Pin_J2_14 DIO12 /* MISO */
#define Board_BP_Pin_J2_13 DIO13
#define Board_BP_Pin_J2_12 DIO14
#define Board_BP_Pin_J2_11 IOID_UNUSED /* NC */
/* Mapping of BoosterPack Connector Pins to BoosterPack Standard Functions (reflecting the BoosterPack Standard)
*/
/* Connector J1 */
#define Board_BP_AnalogIn_0 Board_BP_Pin_J1_2
#define Board_BP_AnalogIn_0 PIN_UNASSIGNED
#define Board_BP_UART_Rx Board_BP_Pin_J1_3 /* To MCU on LaunchPad */
#define Board_BP_UART_Tx Board_BP_Pin_J1_4 /* From MCU on LauchPad*/
#define Board_BP_GPIO_0 Board_BP_Pin_J1_5
#define Board_BP_AnalogIn_1 Board_BP_Pin_J1_6
#define Board_BP_SPI_CLK Board_BP_Pin_J1_7
#define Board_BP_GPIO_1 Board_BP_Pin_J1_8
#define Board_BP_I2C_SCL Board_BP_Pin_J1_9
#define Board_BP_I2C_SDA Board_BP_Pin_J1_10
#define Board_BP_AnalogIn_1 PIN_UNASSIGNED
#define Board_BP_SPI_CLK PIN_UNASSIGNED
#define Board_BP_GPIO_1 PIN_UNASSIGNED
#define Board_BP_I2C_SCL PIN_UNASSIGNED
#define Board_BP_I2C_SDA PIN_UNASSIGNED
/* Connector J2 */
#define Board_BP_PWM_0 Board_BP_Pin_J2_19
#define Board_BP_SPI_CS_Wireless PIN_UNASSIGNED
#define Board_BP_GPIO_3 Board_BP_Pin_J2_17
#define Board_BP_SPI_MOSI Board_BP_Pin_J2_15
#define Board_BP_SPI_MISO Board_BP_Pin_J2_14
#define Board_BP_SPI_MOSI PIN_UNASSIGNED
#define Board_BP_SPI_MISO PIN_UNASSIGNED
#define Board_BP_SPI_CS_Display PIN_UNASSIGNED
#define Board_BP_SPI_CS_Other PIN_UNASSIGNED
#define Board_BP_GPIO_2 Board_BP_Pin_J2_11
#define Board_BP_GPIO_2 PIN_UNASSIGNED
/* Mapping of application specific functionality of the BoosterPack to BoosterPack Pins (application dependent)
@@ -145,15 +146,18 @@ extern const PIN_Config BoardGpioInitTable[];
#define Board_UART_TX Board_BP_UART_Rx /* RXD */
#define Board_UART_RX Board_BP_UART_Tx /* TXD */
//#define Board_SPI0_MISO PIN_UNASSIGNED
//#define Board_SPI0_MOSI PIN_UNASSIGNED
/* SPI Board */
#define Board_SPI0_MISO PIN_UNASSIGNED /* RF1.20 */
#define Board_SPI0_MOSI PIN_UNASSIGNED /* RF1.18 */
#define Board_SPI0_CLK PIN_UNASSIGNED /* RF1.16 */
#define Board_SPI0_CSN PIN_UNASSIGNED
#define Board_SPI1_MISO PIN_UNASSIGNED
#define Board_SPI1_MOSI PIN_UNASSIGNED
#define Board_SPI1_CLK PIN_UNASSIGNED
#define Board_SPI1_CSN PIN_UNASSIGNED
/* Power Management Board */
#define Board_SRDY Board_BP_Pin_J2_19
#define Board_MRDY Board_BP_Pin_J1_2
#define Board_SRDY PIN_UNASSIGNED
#define Board_MRDY PIN_UNASSIGNED
/* PWM outputs */
#define Board_PWMPIN0 PIN_UNASSIGNED
@@ -163,7 +167,7 @@ extern const PIN_Config BoardGpioInitTable[];
#define Board_PWMPIN4 PIN_UNASSIGNED
#define Board_PWMPIN5 PIN_UNASSIGNED
#define Board_PWMPIN6 PIN_UNASSIGNED
#define Board_PWMPIN7 PIN_UNASSIGNED
#define Board_PWMPIN7 IOID_4
/** ============================================================================
* Instance identifiers
@@ -209,7 +213,15 @@ typedef enum BOOSTXL_CC2650MA_CryptoName {
} BOOSTXL_CC2650MA_CryptoName;
/*!
* @def BOOSTXL_CC2650MA_SPIName
* @brief Enum of SPI names on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_SPIName {
BOOSTXL_CC2650MA_SPI0 = 0,
BOOSTXL_CC2650MA_SPI1,
BOOSTXL_CC2650MA_SPICOUNT
} BOOSTXL_CC2650MA_SPIName;
/*!
* @def BOOSTXL_CC2650MA_TRNGName
@@ -287,6 +299,25 @@ typedef enum BOOSTXL_CC2650MA_PWM
BOOSTXL_CC2650MA_PWMCOUNT
} BOOSTXL_CC2650MA_PWM;
/*!
* @def CC2650_LAUNCHXL_ADCName
* @brief Enum of ADCs
*/
typedef enum BOOSTXL_CC2650MA_ADCName {
BOOSTXL_CC2650MA_ADC0 = 0,
BOOSTXL_CC2650MA_ADC1,
BOOSTXL_CC2650MA_ADC2,
BOOSTXL_CC2650MA_ADC3,
BOOSTXL_CC2650MA_ADC4,
BOOSTXL_CC2650MA_ADC5,
BOOSTXL_CC2650MA_ADC6,
BOOSTXL_CC2650MA_ADC7,
BOOSTXL_CC2650MA_ADCDCOUPL,
BOOSTXL_CC2650MA_ADCVSS,
BOOSTXL_CC2650MA_ADCVDDS,
BOOSTXL_CC2650MA_ADCCOUNT
} BOOSTXL_CC2650MA_ADCName;
#ifdef __cplusplus
}
#endif
@@ -39,7 +39,6 @@ extern "C" {
#include <ti/drivers/Power.h>
//#include "BOOSTXL_CC2650MA.h"
#include "BOOSTXL_CC2650MA.h"
/* These #defines allow us to reuse TI-RTOS across other device families */
@@ -0,0 +1,425 @@
/*
* Copyright (c) 2016, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/*
* ====================== BOOSTXL_CC2650MA.c ===================================
* This file is responsible for setting up the board specific items for the
* CC2650 Booster Pack.
*/
/*
* ====================== Includes ============================================
*/
#include <xdc/std.h>
#include <xdc/runtime/System.h>
#include <ti/sysbios/family/arm/m3/Hwi.h>
#include <ti/drivers/PIN.h>
#include <ti/drivers/pin/PINCC26XX.h>
#include <ti/drivers/PWM.h>
#include <ti/drivers/pwm/PWMTimerCC26XX.h>
#include <ti/drivers/timer/GPTimerCC26XX.h>
#include <ti/drivers/Power.h>
#include <ti/drivers/power/PowerCC26XX.h>
#include <inc/hw_memmap.h>
#include <inc/hw_ints.h>
#include <driverlib/ioc.h>
#include <driverlib/udma.h>
#include "Board.h"
/*
* ========================= IO driver initialization =========================
* From main, PIN_init(BoardGpioInitTable) should be called to setup safe
* settings for this board.
* When a pin is allocated and then de-allocated, it will revert to the state
* configured in this table.
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(BoardGpioInitTable, ".const:BoardGpioInitTable")
#pragma DATA_SECTION(PINCC26XX_hwAttrs, ".const:PINCC26XX_hwAttrs")
#endif
const PIN_Config BoardGpioInitTable[] = {
Board_RLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
Board_GLED | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, /* LED initially off */
Board_UART_RX | PIN_INPUT_EN | PIN_PULLDOWN, /* UART RX */
Board_UART_TX | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* UART TX */
Board_SRDY | PIN_GPIO_OUTPUT_EN | PIN_GPIO_HIGH | PIN_PUSHPULL, /* SRDY */
Board_MRDY | PIN_INPUT_EN | PIN_PULLDOWN, /* MRDY */
PIN_TERMINATE
};
const PINCC26XX_HWAttrs PINCC26XX_hwAttrs = {
.intPriority = ~0,
.swiPriority = 0
};
/*============================================================================*/
/*
* ============================= Power begin ==================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(PowerCC26XX_config, ".const:PowerCC26XX_config")
#endif
const PowerCC26XX_Config PowerCC26XX_config = {
.policyInitFxn = NULL,
.policyFxn = &PowerCC26XX_standbyPolicy,
.calibrateFxn = &PowerCC26XX_calibrate,
.enablePolicy = TRUE,
.calibrateRCOSC_LF = TRUE,
.calibrateRCOSC_HF = TRUE,
};
/*
* ============================= Power end ====================================
*/
/*
* ============================= UART begin ===================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(UART_config, ".const:UART_config")
#pragma DATA_SECTION(uartCC26XXHWAttrs, ".const:uartCC26XXHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/UART.h>
#include <ti/drivers/uart/UARTCC26XX.h>
/* UART objects */
UARTCC26XX_Object uartCC26XXObjects[BOOSTXL_CC2650MA_UARTCOUNT];
/* UART hardware parameter structure, also used to assign UART pins */
const UARTCC26XX_HWAttrsV2 uartCC26XXHWAttrs[BOOSTXL_CC2650MA_UARTCOUNT] = {
{
.baseAddr = UART0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_UART0,
.intNum = INT_UART0_COMB,
.intPriority = ~0,
.swiPriority = 0,
.txPin = Board_UART_TX,
.rxPin = Board_UART_RX,
.ctsPin = PIN_UNASSIGNED,
.rtsPin = PIN_UNASSIGNED
}
};
/* UART configuration structure */
const UART_Config UART_config[] = {
{
.fxnTablePtr = &UARTCC26XX_fxnTable,
.object = &uartCC26XXObjects[0],
.hwAttrs = &uartCC26XXHWAttrs[0]
},
{NULL, NULL, NULL}
};
/*
* ============================= UART end =====================================
*/
/*
* ============================= UDMA begin ===================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(UDMACC26XX_config, ".const:UDMACC26XX_config")
#pragma DATA_SECTION(udmaHWAttrs, ".const:udmaHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/dma/UDMACC26XX.h>
/* UDMA objects */
UDMACC26XX_Object udmaObjects[BOOSTXL_CC2650MA_UDMACOUNT];
/* UDMA configuration structure */
const UDMACC26XX_HWAttrs udmaHWAttrs[BOOSTXL_CC2650MA_UDMACOUNT] = {
{
.baseAddr = UDMA0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_UDMA,
.intNum = INT_DMA_ERR,
.intPriority = ~0
}
};
/* UDMA configuration structure */
const UDMACC26XX_Config UDMACC26XX_config[] = {
{
.object = &udmaObjects[0],
.hwAttrs = &udmaHWAttrs[0]
},
{NULL, NULL}
};
/*
* ============================= UDMA end =====================================
*/
/*
* ========================== SPI DMA begin ===================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SPI_config, ".const:SPI_config")
#pragma DATA_SECTION(spiCC26XXDMAHWAttrs, ".const:spiCC26XXDMAHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/spi/SPICC26XXDMA.h>
/* SPI objects */
SPICC26XXDMA_Object spiCC26XXDMAObjects[BOOSTXL_CC2650MA_SPICOUNT];
/* SPI configuration structure, describing which pins are to be used */
const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[BOOSTXL_CC2650MA_UDMACOUNT] = {
{
.baseAddr = SSI0_BASE,
.intNum = INT_SSI0_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI0,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
.mosiPin = Board_SPI0_MOSI,
.misoPin = Board_SPI0_MISO,
.clkPin = Board_SPI0_CLK,
.csnPin = Board_SPI0_CS
},
};
/* SPI configuration structure */
const SPI_Config SPI_config[] = {
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[0],
.hwAttrs = &spiCC26XXDMAHWAttrs[0]
},
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[1],
.hwAttrs = &spiCC26XXDMAHWAttrs[1]
},
{NULL, NULL, NULL}
};
/*
* ========================== SPI DMA end =====================================
*/
/*
* ========================== Crypto begin ====================================
* NOTE: The Crypto implementation should be considered experimental
* and not validated!
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(CryptoCC26XX_config, ".const:CryptoCC26XX_config")
#pragma DATA_SECTION(cryptoCC26XXHWAttrs, ".const:cryptoCC26XXHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/crypto/CryptoCC26XX.h>
/* Crypto objects */
CryptoCC26XX_Object cryptoCC26XXObjects[BOOSTXL_CC2650MA_CRYPTOCOUNT];
/* Crypto configuration structure, describing which pins are to be used */
const CryptoCC26XX_HWAttrs cryptoCC26XXHWAttrs[BOOSTXL_CC2650MA_CRYPTOCOUNT] = {
{
.baseAddr = CRYPTO_BASE,
.powerMngrId = PowerCC26XX_PERIPH_CRYPTO,
.intNum = INT_CRYPTO_RESULT_AVAIL_IRQ,
.intPriority = ~0,
}
};
/* Crypto configuration structure */
const CryptoCC26XX_Config CryptoCC26XX_config[] = {
{
.object = &cryptoCC26XXObjects[0],
.hwAttrs = &cryptoCC26XXHWAttrs[0]
},
{NULL, NULL}
};
/*
* ========================== Crypto end ======================================
*/
/*
* ========================= RF driver begin ==================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(RFCC26XX_hwAttrs, ".const:RFCC26XX_hwAttrs")
#endif
/* Include drivers */
#include <ti/drivers/rf/RF.h>
/* RF hwi and swi priority */
const RFCC26XX_HWAttrs RFCC26XX_hwAttrs = {
.hwiCpe0Priority = ~0,
.hwiHwPriority = ~0,
.swiCpe0Priority = 5,
.swiHwPriority = 5,
};
/*
* ========================== RF driver end ===================================
*/
/*
* ========================= TRNG begin ====================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(TRNGCC26XX_config, ".const:TRNGCC26XX_config")
#pragma DATA_SECTION(TRNGCC26XXHWAttrs, ".const:TRNGCC26XXHWAttrs")
#endif
/* Include drivers */
#include <TRNGCC26XX.h>
/* TRNG objects */
TRNGCC26XX_Object trngCC26XXObjects[BOOSTXL_CC2650MA_TRNGCOUNT];
/* TRNG configuration structure, describing which pins are to be used */
const TRNGCC26XX_HWAttrs TRNGCC26XXHWAttrs[BOOSTXL_CC2650MA_TRNGCOUNT] = {
{
.powerMngrId = PowerCC26XX_PERIPH_TRNG,
}
};
/* TRNG configuration structure */
const TRNGCC26XX_Config TRNGCC26XX_config[] = {
{
.object = &trngCC26XXObjects[0],
.hwAttrs = &TRNGCC26XXHWAttrs[0]
},
{NULL, NULL}
};
/*
* ========================= TRNG end ====================================
*/
/*
* ============================ GPTimer begin =================================
* Remove unused entries to reduce flash usage both in Board.c and Board.h
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(GPTimerCC26XX_config, ".const:GPTimerCC26XX_config")
#pragma DATA_SECTION(gptimerCC26xxHWAttrs, ".const:gptimerCC26xxHWAttrs")
#endif
/* GPTimer hardware attributes, one per timer part (Timer 0A, 0B, 1A, 1B..) */
const GPTimerCC26XX_HWAttrs gptimerCC26xxHWAttrs[BOOSTXL_CC2650MA_GPTIMERPARTSCOUNT] = {
{ .baseAddr = GPT0_BASE, .intNum = INT_GPT0A, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT0, .pinMux = GPT_PIN_0A, },
{ .baseAddr = GPT0_BASE, .intNum = INT_GPT0B, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT0, .pinMux = GPT_PIN_0B, },
{ .baseAddr = GPT1_BASE, .intNum = INT_GPT1A, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT1, .pinMux = GPT_PIN_1A, },
{ .baseAddr = GPT1_BASE, .intNum = INT_GPT1B, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT1, .pinMux = GPT_PIN_1B, },
{ .baseAddr = GPT2_BASE, .intNum = INT_GPT2A, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT2, .pinMux = GPT_PIN_2A, },
{ .baseAddr = GPT2_BASE, .intNum = INT_GPT2B, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT2, .pinMux = GPT_PIN_2B, },
{ .baseAddr = GPT3_BASE, .intNum = INT_GPT3A, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT3, .pinMux = GPT_PIN_3A, },
{ .baseAddr = GPT3_BASE, .intNum = INT_GPT3B, .intPriority = (~0), .powerMngrId = PowerCC26XX_PERIPH_GPT3, .pinMux = GPT_PIN_3B, },
};
/* GPTimer objects, one per full-width timer (A+B) (Timer 0, Timer 1..) */
GPTimerCC26XX_Object gptimerCC26XXObjects[BOOSTXL_CC2650MA_GPTIMERCOUNT];
/* GPTimer configuration (used as GPTimer_Handle by driver and application) */
const GPTimerCC26XX_Config GPTimerCC26XX_config[BOOSTXL_CC2650MA_GPTIMERPARTSCOUNT] = {
{ &gptimerCC26XXObjects[0], &gptimerCC26xxHWAttrs[0], GPT_A },
{ &gptimerCC26XXObjects[0], &gptimerCC26xxHWAttrs[1], GPT_B },
{ &gptimerCC26XXObjects[1], &gptimerCC26xxHWAttrs[2], GPT_A },
{ &gptimerCC26XXObjects[1], &gptimerCC26xxHWAttrs[3], GPT_B },
{ &gptimerCC26XXObjects[2], &gptimerCC26xxHWAttrs[4], GPT_A },
{ &gptimerCC26XXObjects[2], &gptimerCC26xxHWAttrs[5], GPT_B },
{ &gptimerCC26XXObjects[3], &gptimerCC26xxHWAttrs[6], GPT_A },
{ &gptimerCC26XXObjects[3], &gptimerCC26xxHWAttrs[7], GPT_B },
};
/*
* ============================ GPTimer end ===================================
*/
/*
* ============================= PWM begin ====================================
* Remove unused entries to reduce flash usage both in Board.c and Board.h
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(PWM_config, ".const:PWM_config")
#pragma DATA_SECTION(pwmtimerCC26xxHWAttrs, ".const:pwmtimerCC26xxHWAttrs")
#endif
/* PWM configuration, one per PWM output. */
PWMTimerCC26XX_HwAttrs pwmtimerCC26xxHWAttrs[BOOSTXL_CC2650MA_PWMCOUNT] = {
{ .pwmPin = Board_PWMPIN0, .gpTimerUnit = Board_GPTIMER0A },
{ .pwmPin = Board_PWMPIN1, .gpTimerUnit = Board_GPTIMER0B },
{ .pwmPin = Board_PWMPIN2, .gpTimerUnit = Board_GPTIMER1A },
{ .pwmPin = Board_PWMPIN3, .gpTimerUnit = Board_GPTIMER1B },
{ .pwmPin = Board_PWMPIN4, .gpTimerUnit = Board_GPTIMER2A },
{ .pwmPin = Board_PWMPIN5, .gpTimerUnit = Board_GPTIMER2B },
{ .pwmPin = Board_PWMPIN6, .gpTimerUnit = Board_GPTIMER3A },
{ .pwmPin = Board_PWMPIN7, .gpTimerUnit = Board_GPTIMER3B },
};
/* PWM object, one per PWM output */
PWMTimerCC26XX_Object pwmtimerCC26xxObjects[BOOSTXL_CC2650MA_PWMCOUNT];
extern const PWM_FxnTable PWMTimerCC26XX_fxnTable;
/* PWM configuration (used as PWM_Handle by driver and application) */
const PWM_Config PWM_config[BOOSTXL_CC2650MA_PWMCOUNT + 1] = {
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[0], &pwmtimerCC26xxHWAttrs[0] },
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[1], &pwmtimerCC26xxHWAttrs[1] },
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[2], &pwmtimerCC26xxHWAttrs[2] },
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[3], &pwmtimerCC26xxHWAttrs[3] },
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[4], &pwmtimerCC26xxHWAttrs[4] },
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[5], &pwmtimerCC26xxHWAttrs[5] },
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[6], &pwmtimerCC26xxHWAttrs[6] },
{ &PWMTimerCC26XX_fxnTable, &pwmtimerCC26xxObjects[7], &pwmtimerCC26xxHWAttrs[7] },
{ NULL, NULL, NULL }
};
/*
* ============================= PWM end ======================================
*/
@@ -0,0 +1,301 @@
/*
* Copyright (c) 2015-2016, Texas Instruments Incorporated
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of Texas Instruments Incorporated nor the names of
* its contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/** ============================================================================
* @file BOOSTXL_CC2650MA.h
*
* @brief CC2650 Booster Pack Board Specific header file.
*
* NB! This is the board file for CC2650 Booster Pack
*
* ============================================================================
*/
#ifndef __BOOSTXL_CC2650MA_BOARD_H__
#define __BOOSTXL_CC2650MA_BOARD_H__
#ifdef __cplusplus
extern "C" {
#endif
/** ============================================================================
* Includes
* ==========================================================================*/
#include <ti/drivers/PIN.h>
#include <driverlib/ioc.h>
/** ============================================================================
* Externs
* ==========================================================================*/
extern const PIN_Config BoardGpioInitTable[];
/** ============================================================================
* Defines
* ==========================================================================*/
#define CC2650M5A // Configures RF front-end
/* Mapping of chip I/Os to DIO (Chip specific for the CC26xx/CC13xx familiy)
*/
#define DIO0 IOID_0
#define DIO1 IOID_1
#define DIO2 IOID_2
#define DIO3 IOID_3
#define DIO4 IOID_4
#define DIO5 IOID_5
#define DIO6 IOID_6
#define DIO7 IOID_7
#define DIO8 IOID_8
#define DIO9 IOID_9
#define DIO10 IOID_10
#define DIO11 IOID_11
#define DIO12 IOID_12
#define DIO13 IOID_13
#define DIO14 IOID_14
/* Mapping of pins to board signals using general board aliases
* <board signal alias> <pin mapping>
*/
/* Mapping of DIOs to BoosterPack Connector Pins (reflecting the schematic of tbe BoosterPack)
*/
/* Connector J1 */
#define Board_BP_Pin_J1_2 DIO7
#define Board_BP_Pin_J1_3 DIO0
#define Board_BP_Pin_J1_4 DIO1
#define Board_BP_Pin_J1_5 DIO2
#define Board_BP_Pin_J1_6 DIO3
#define Board_BP_Pin_J1_7 DIO10
#define Board_BP_Pin_J1_8 DIO4
#define Board_BP_Pin_J1_9 DIO5
#define Board_BP_Pin_J1_10 DIO6
/* Connector J2 */
#define Board_BP_Pin_J2_19 DIO8
#define Board_BP_Pin_J2_18 DIO9 /* CS */
#define Board_BP_Pin_J2_17 IOID_UNUSED /* NC */
#define Board_BP_Pin_J2_15 DIO11 /* MOSI */
#define Board_BP_Pin_J2_14 DIO12 /* MISO */
#define Board_BP_Pin_J2_13 DIO13
#define Board_BP_Pin_J2_12 DIO14
#define Board_BP_Pin_J2_11 IOID_UNUSED /* NC */
/* Mapping of BoosterPack Connector Pins to BoosterPack Standard Functions (reflecting the BoosterPack Standard)
*/
/* Connector J1 */
#define Board_BP_AnalogIn_0 Board_BP_Pin_J1_2
#define Board_BP_UART_Rx Board_BP_Pin_J1_3 /* To MCU on LaunchPad */
#define Board_BP_UART_Tx Board_BP_Pin_J1_4 /* From MCU on LauchPad*/
#define Board_BP_GPIO_0 Board_BP_Pin_J1_5
#define Board_BP_AnalogIn_1 Board_BP_Pin_J1_6
#define Board_BP_SPI_CLK Board_BP_Pin_J1_7
#define Board_BP_GPIO_1 Board_BP_Pin_J1_8
#define Board_BP_I2C_SCL Board_BP_Pin_J1_9
#define Board_BP_I2C_SDA Board_BP_Pin_J1_10
/* Connector J2 */
#define Board_BP_PWM_0 Board_BP_Pin_J2_19
#define Board_BP_SPI_CS_Wireless Board_BP_Pin_J2_18
#define Board_BP_GPIO_3 Board_BP_Pin_J2_17
#define Board_BP_SPI_MOSI Board_BP_Pin_J2_15
#define Board_BP_SPI_MISO Board_BP_Pin_J2_14
#define Board_BP_SPI_CS_Display Board_BP_Pin_J2_13
#define Board_BP_SPI_CS_Other Board_BP_Pin_J2_12
#define Board_BP_GPIO_2 Board_BP_Pin_J2_11
/* Mapping of application specific functionality of the BoosterPack to BoosterPack Pins (application dependent)
*/
/* On-board LEDs */
#define Board_GLED DIO2 /* Green LED */
#define Board_RLED DIO4 /* Red LED */
/* UART Board */
#define Board_UART_TX Board_BP_UART_Rx /* RXD */
#define Board_UART_RX Board_BP_UART_Tx /* TXD */
/* SPI Board */
#define Board_SPI0_MISO Board_BP_SPI_MISO
#define Board_SPI0_MOSI Board_BP_SPI_MOSI
#define Board_SPI0_CLK Board_BP_SPI_CLK
#define Board_SPI0_CS Board_BP_SPI_CS_Wireless
/* Power Management Board */
#define Board_SRDY Board_BP_Pin_J2_19
#define Board_MRDY Board_BP_Pin_J1_2
/* PWM outputs */
#define Board_PWMPIN0 PIN_UNASSIGNED
#define Board_PWMPIN1 PIN_UNASSIGNED
#define Board_PWMPIN2 PIN_UNASSIGNED
#define Board_PWMPIN3 PIN_UNASSIGNED
#define Board_PWMPIN4 PIN_UNASSIGNED
#define Board_PWMPIN5 PIN_UNASSIGNED
#define Board_PWMPIN6 PIN_UNASSIGNED
#define Board_PWMPIN7 PIN_UNASSIGNED
/** ============================================================================
* Instance identifiers
* ==========================================================================*/
/* Generic SPI instance identifiers */
#define Board_SPI0 BOOSTXL_CC2650MA_SPI0
/* Generic UART instance identifiers */
#define Board_UART BOOSTXL_CC2650MA_UART0
/* Generic TRNG instance identiifer */
#define Board_TRNG BOOSTXL_CC2650MA_TRNG0
/* Generic GPTimer instance identifiers */
#define Board_GPTIMER0A BOOSTXL_CC2650MA_GPTIMER0A
#define Board_GPTIMER0B BOOSTXL_CC2650MA_GPTIMER0B
#define Board_GPTIMER1A BOOSTXL_CC2650MA_GPTIMER1A
#define Board_GPTIMER1B BOOSTXL_CC2650MA_GPTIMER1B
#define Board_GPTIMER2A BOOSTXL_CC2650MA_GPTIMER2A
#define Board_GPTIMER2B BOOSTXL_CC2650MA_GPTIMER2B
#define Board_GPTIMER3A BOOSTXL_CC2650MA_GPTIMER3A
#define Board_GPTIMER3B BOOSTXL_CC2650MA_GPTIMER3B
/* Generic PWM instance identifiers */
#define Board_PWM0 BOOSTXL_CC2650MA_PWM0
#define Board_PWM1 BOOSTXL_CC2650MA_PWM1
#define Board_PWM2 BOOSTXL_CC2650MA_PWM2
#define Board_PWM3 BOOSTXL_CC2650MA_PWM3
#define Board_PWM4 BOOSTXL_CC2650MA_PWM4
#define Board_PWM5 BOOSTXL_CC2650MA_PWM5
#define Board_PWM6 BOOSTXL_CC2650MA_PWM6
#define Board_PWM7 BOOSTXL_CC2650MA_PWM7
/** ============================================================================
* Number of peripherals and their names
* ==========================================================================*/
/*!
* @def BOOSTXL_CC2650MA_CryptoName
* @brief Enum of Crypto names on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_CryptoName {
BOOSTXL_CC2650MA_CRYPTO0 = 0,
BOOSTXL_CC2650MA_CRYPTOCOUNT
} BOOSTXL_CC2650MA_CryptoName;
/*!
* @def BOOSTXL_CC2650MA_SPIName
* @brief Enum of SPI names on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_SPIName {
BOOSTXL_CC2650MA_SPI0 = 0,
BOOSTXL_CC2650MA_SPICOUNT
} BOOSTXL_CC2650MA_SPIName;
/*!
* @def BOOSTXL_CC2650MA_TRNGName
* @brief Enum of TRNG names on the board
*/
typedef enum BOOSTXL_CC2650MA_TRNGName {
BOOSTXL_CC2650MA_TRNG0 = 0,
BOOSTXL_CC2650MA_TRNGCOUNT
} BOOSTXL_CC2650MA_TRNGName;
/*!
* @def BOOSTXL_CC2650MA_UARTName
* @brief Enum of UARTs on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_UARTName {
BOOSTXL_CC2650MA_UART0 = 0,
BOOSTXL_CC2650MA_UARTCOUNT
} BOOSTXL_CC2650MA_UARTName;
/*!
* @def BOOSTXL_CC2650MA_UdmaName
* @brief Enum of DMA buffers
*/
typedef enum BOOSTXL_CC2650MA_UdmaName {
BOOSTXL_CC2650MA_UDMA0 = 0,
BOOSTXL_CC2650MA_UDMACOUNT
} BOOSTXL_CC2650MA_UdmaName;
/*!
* @def BOOSTXL_CC2650MA_GPTimerName
* @brief Enum of GPTimer parts
*/
typedef enum BOOSTXL_CC2650MA_GPTimerName
{
BOOSTXL_CC2650MA_GPTIMER0A = 0,
BOOSTXL_CC2650MA_GPTIMER0B,
BOOSTXL_CC2650MA_GPTIMER1A,
BOOSTXL_CC2650MA_GPTIMER1B,
BOOSTXL_CC2650MA_GPTIMER2A,
BOOSTXL_CC2650MA_GPTIMER2B,
BOOSTXL_CC2650MA_GPTIMER3A,
BOOSTXL_CC2650MA_GPTIMER3B,
BOOSTXL_CC2650MA_GPTIMERPARTSCOUNT
} BOOSTXL_CC2650MA_GPTimerName;
/*!
* @def BOOSTXL_CC2650MA_GPTimers
* @brief Enum of GPTimers
*/
typedef enum BOOSTXL_CC2650MA_GPTimers
{
BOOSTXL_CC2650MA_GPTIMER0 = 0,
BOOSTXL_CC2650MA_GPTIMER1,
BOOSTXL_CC2650MA_GPTIMER2,
BOOSTXL_CC2650MA_GPTIMER3,
BOOSTXL_CC2650MA_GPTIMERCOUNT
} BOOSTXL_CC2650MA_GPTimers;
/*!
* @def BOOSTXL_CC2650MA_PWM
* @brief Enum of PWM outputs on the board
*/
typedef enum BOOSTXL_CC2650MA_PWM
{
BOOSTXL_CC2650MA_PWM0 = 0,
BOOSTXL_CC2650MA_PWM1,
BOOSTXL_CC2650MA_PWM2,
BOOSTXL_CC2650MA_PWM3,
BOOSTXL_CC2650MA_PWM4,
BOOSTXL_CC2650MA_PWM5,
BOOSTXL_CC2650MA_PWM6,
BOOSTXL_CC2650MA_PWM7,
BOOSTXL_CC2650MA_PWMCOUNT
} BOOSTXL_CC2650MA_PWM;
#ifdef __cplusplus
}
#endif
#endif /* __BOOSTXL_CC2650MA_BOARD_H__ */
@@ -68,8 +68,8 @@ extern const PIN_Config BoardGpioInitTable[];
*/
/* Discrete outputs */
#define Board_RLED IOID_6
#define Board_GLED IOID_7
#define Board_RLED PIN_UNASSIGNED
#define Board_GLED PIN_UNASSIGNED
#define Board_LED_ON 1
#define Board_LED_OFF 0
@@ -79,22 +79,23 @@ extern const PIN_Config BoardGpioInitTable[];
/* UART Board */
#define Board_UART_RX IOID_2 /* RXD */
#define Board_UART_TX PIN_UNASSIGNED /* TXD */
#define Board_UART_TX IOID_3 /* TXD */
#define Board_UART_CTS IOID_19 /* CTS */
#define Board_UART_RTS IOID_18 /* RTS */
/* SPI Board */
#define Board_SPI0_MISO IOID_0 /* RF1.20 */
#define Board_SPI0_MOSI IOID_1 /* RF1.18 */
#define Board_SPI0_CLK IOID_3 /* RF1.16 */
#define Board_SPI0_MISO PIN_UNASSIGNED /* RF1.20 */
#define Board_SPI0_MOSI PIN_UNASSIGNED /* RF1.18 */
#define Board_SPI0_CLK PIN_UNASSIGNED /* RF1.16 */
#define Board_SPI0_CSN PIN_UNASSIGNED
#define Board_SPI1_MISO PIN_UNASSIGNED
#define Board_SPI1_MOSI IOID_8 /* LED_MOSI */
#define Board_SPI1_CLK IOID_9 /* LED_CLK */
#define Board_SPI1_MOSI PIN_UNASSIGNED
#define Board_SPI1_CLK PIN_UNASSIGNED
#define Board_SPI1_CSN PIN_UNASSIGNED
/* I2C */
#define Board_I2C0_SCL0 PIN_UNASSIGNED
#define Board_I2C0_SDA0 PIN_UNASSIGNED
/* SPI */
#define Board_SPI_FLASH_CS IOID_20
@@ -102,8 +103,8 @@ extern const PIN_Config BoardGpioInitTable[];
#define Board_FLASH_CS_OFF 1
/* Booster pack generic */
#define Board_DIO0 PIN_UNASSIGNED
#define Board_DIO1_RFSW PIN_UNASSIGNED
#define Board_DIO0 IOID_0
#define Board_DIO1_RFSW IOID_1
#define Board_DIO12 IOID_12
#define Board_DIO15 IOID_15
#define Board_DIO16_TDO IOID_16
@@ -129,14 +130,14 @@ extern const PIN_Config BoardGpioInitTable[];
#define Board_LCD_CS_OFF 0
/* PWM outputs */
#define Board_PWMPIN0 Board_RLED
#define Board_PWMPIN1 Board_GLED
#define Board_PWMPIN2 PIN_UNASSIGNED
#define Board_PWMPIN3 PIN_UNASSIGNED
#define Board_PWMPIN4 PIN_UNASSIGNED
#define Board_PWMPIN5 PIN_UNASSIGNED
#define Board_PWMPIN6 PIN_UNASSIGNED
#define Board_PWMPIN7 PIN_UNASSIGNED
#define Board_PWMPIN0 PIN_UNASSIGNED
#define Board_PWMPIN1 PIN_UNASSIGNED
#define Board_PWMPIN2 PIN_UNASSIGNED
#define Board_PWMPIN3 PIN_UNASSIGNED
#define Board_PWMPIN4 PIN_UNASSIGNED
#define Board_PWMPIN5 PIN_UNASSIGNED
#define Board_PWMPIN6 PIN_UNASSIGNED
#define Board_PWMPIN7 IOID_4
/** ============================================================================
* Instance identifiers
@@ -55,6 +55,14 @@
#include <ti/sysbios/knl/Queue.h>
#include <Board.h>
#include <ti/drivers/SPI.h>
#include <ti/drivers/spi/SPICC26XXDMA.h>
#include <ti/drivers/dma/UDMACC26XX.h>
#include <string.h>
#include "hal_types.h"
@@ -95,14 +103,6 @@
#include "host_test_app.h"
//#define PERIODIC_USE_GPTIMER
#include "cc2650/cc2650_util.h"
//#include "cc2650/cc2650_slave.h"
#include "cc2650/cc2650_master.h"
// LE Event Lengths
#define HCI_CMD_COMPLETE_EVENT_LEN 3
#define HCI_CMD_VS_COMPLETE_EVENT_LEN 2
@@ -118,6 +118,10 @@ static void send_command_complete_event(uint8 eventCode, uint16 opcode, uint8 nu
static void send_command_status_event(uint8_t eventCode, uint16_t status, uint16_t opcode);
static void send_ble_complete_event(uint8 eventLen, uint8 *pEvent);
static void HTA_main_spi_init();
static void HTA_main_spi_callback(SPI_Handle handle, SPI_Transaction *transaction);
static void HTA_handle_spi_noti_data(attHandleValueNoti_t* att_notify);
extern void AssertHandler(uint8 assertCause, uint8 assertSubCause);
// Task configuration
@@ -149,13 +153,24 @@ void HostTestApp_createTask(void) {
static ICall_EntityID self;
// Semaphore globally used to post events to the application thread
extern ICall_Semaphore semaphore;
extern uint16_t event_flags;
static ICall_Semaphore semaphore;
// Stack build revision
ICall_BuildRevision build_reversion;
// GAP GATT Attributes
static const uint8_t att_device_name[GAP_DEVICE_NAME_LEN] = "Simple BLE Central";
// LED
static PIN_Config SBP_pin_config_table[] = {
Board_LED1 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Board_LED2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
PIN_TERMINATE
};
static PIN_State sbp_pins;
static PIN_Handle sbp_pins_handle;
/*
* @fn HTA_init
*
@@ -173,6 +188,11 @@ static void HTA_init(void) {
// so that the application can send and receive messages.
ICall_registerApp(&self, &semaphore);
// LED
sbp_pins_handle = PIN_open(&sbp_pins, SBP_pin_config_table);
GGS_SetParameter(GGS_DEVICE_NAME_ATT, strlen(att_device_name), (void*)att_device_name);
// Initialize GATT Client
VOID GATT_InitClient();
@@ -202,8 +222,9 @@ static void HTA_init(void) {
static void HTA_main(UArg a0, UArg a1) {
// Initialize application
HTA_init();
HTA_util_init();
HTA_main_init();
// initialize and start spi transcation
HTA_main_spi_init();
// Application main loop
for (;;) {
@@ -242,10 +263,6 @@ static void HTA_main(UArg a0, UArg a1) {
}
}
}
if (event_flags > 0) {
HTA_event_call();
}
}
}
@@ -325,24 +342,18 @@ static void HTA_handle_gap_event(ICall_HciExtEvt *message) {
}
}
static void HTA_handle_att_event(gattMsgEvent_t *message) {
uint8_t method = message->method;
static void HTA_handle_att_event(gattMsgEvent_t *message) {
if (message->hdr.status == blePending) {
// pass
} else if ((method == ATT_READ_RSP) || (method == ATT_ERROR_RSP && message->msg.errorRsp.reqOpcode == ATT_READ_REQ)) {
} else if ((message->method == ATT_READ_RSP) || (message->method == ATT_ERROR_RSP && message->msg.errorRsp.reqOpcode == ATT_READ_REQ)) {
// pass
} else if ((method == ATT_WRITE_RSP) || (method == ATT_ERROR_RSP && message->msg.errorRsp.reqOpcode == ATT_WRITE_REQ)) {
} else if ((message->method == ATT_WRITE_RSP) || (message->method == ATT_ERROR_RSP && message->msg.errorRsp.reqOpcode == ATT_WRITE_REQ)) {
// pass
} else if (method == ATT_HANDLE_VALUE_NOTI) {
#ifdef HTA_PIN_RS
if (!PIN_getInputValue(HTA_PIN_RS)) {
#endif
attHandleValueNoti_t *att_notify = (attHandleValueNoti_t *)(&message->msg);
HTA_main_handle_notify(att_notify->len, att_notify->pValue);
#ifdef HTA_PIN_RS
}
#endif
} else if (message->method == ATT_HANDLE_VALUE_NOTI) {
attHandleValueNoti_t* att_notify = (attHandleValueNoti_t*)(&message->msg);
HTA_handle_spi_noti_data(att_notify);
}
// Free message. Needed only for ATT Protocol messages
@@ -536,3 +547,99 @@ static void send_ble_complete_event(uint8 eventLen, uint8 *pEvent) {
NPITask_sendToHost((uint8_t *)msg);
}
}
// SPI depending clock
static uint32_t clock_counter = 0;
// SPI
#define SPI_BUFFER_SIZE 256
// header, clock, length
#define SPI_HEADER_SIZE 3
static uint8_t spi_tx_buffer[SPI_BUFFER_SIZE];
static uint32_t spi_noti_counter = 0; // increase when notify
static uint32_t spi_offset = 0;
// SPI parameter
static SPI_Handle spi_handle;
static SPI_Params spi_parameter;
static SPI_Transaction spi_transaction;
#define max(a, b) ((a) > (b) ? (a) : (b))
#define min(a, b) ((a) < (b) ? (a) : (b))
#define SPI_NOTI_OFFSET 3
static void HTA_handle_spi_noti_data(attHandleValueNoti_t* att_notify) {
uint16 length = att_notify->len;
uint8* value = att_notify->pValue;
// update counter
uint8_t counter = (uint8_t)(spi_noti_counter & 0xFF);
spi_noti_counter = (counter + 1) & 0xFF;
PIN_setOutputValue(sbp_pins_handle, Board_GLED,
(spi_noti_counter & 0x10)? Board_LED_ON: Board_LED_OFF);
uint16 offset = spi_offset;
// header, counter, length, [data]
if (offset < SPI_HEADER_SIZE) {
// first notify, initialize offset correctly
offset = SPI_HEADER_SIZE;
} else if (offset + SPI_NOTI_OFFSET + length >= SPI_BUFFER_SIZE){
// offset over buffer size, set it to the head
offset = SPI_HEADER_SIZE;
}
spi_offset = offset + SPI_NOTI_OFFSET + length;
spi_tx_buffer[offset++] = 0xFE; // data header
spi_tx_buffer[offset++] = counter;
spi_tx_buffer[offset++] = length;
memcpy(spi_tx_buffer + offset, value, length);
}
static void HTA_main_spi_init() {
// SPI initial
SPI_init();
// SPI parameters initialize
SPI_Params_init(&spi_parameter);
spi_parameter.transferMode = SPI_MODE_CALLBACK;
spi_parameter.transferCallbackFxn = HTA_main_spi_callback;
// spi_parameter.transferTimeout = 1000;
spi_parameter.mode = SPI_SLAVE;
spi_parameter.bitRate = 2000000; // 1 MHz, 100 us
spi_parameter.dataSize = 8;
spi_parameter.frameFormat = SPI_POL0_PHA1;
// SPI open
spi_handle = SPI_open(Board_SPI0, &spi_parameter);
// start transaction
HTA_main_spi_callback(spi_handle, &spi_transaction);
}
static void HTA_main_spi_callback(SPI_Handle handle, SPI_Transaction *transaction) {
// update clock
clock_counter++;
// update LED state
PIN_setOutputValue(sbp_pins_handle, Board_RLED,
(clock_counter & 0x10)? Board_LED_ON: Board_LED_OFF);
// update SPI buffer header
spi_tx_buffer[0] = 0xFF;
spi_tx_buffer[1] = (uint8_t)(clock_counter & 0xFF); // SPI clock
spi_tx_buffer[2] = SPI_BUFFER_SIZE - 3; // total length
spi_transaction.count = SPI_BUFFER_SIZE;
spi_transaction.txBuf = spi_tx_buffer;
spi_transaction.rxBuf = NULL;
// SPI transaction
SPI_transfer(spi_handle, &spi_transaction);
// XXX transaction status checking
}
@@ -1,179 +0,0 @@
{
"name": "Elite-ZM",
"version": "1.2.30",
"match_rule": {
"local_name_pattern": "Elite-ZM.+",
"major_product_number": 0,
"minor_product_number": 2,
"major_version_number": 1,
"minor_version_number": 2
},
"constant": {
"ADC_CHANNEL_NUMBER": [
12,
13,
14,
15
],
"VOLT_MAX": 4095
},
"parameters": {
"CHANNEL": {
"description": "record channels",
"record_meta": true,
"domain": "property",
"value": [
0,
1,
2
]
},
"SAMPLE_RATE": {
"description": "data sampling rate",
"record_meta": true,
"domain": "constant",
"value": 1
},
"AMP_GAIN": {
"description": "amp gain",
"record_meta": true,
"domain": "constant",
"value": 1
},
"MODE": {
"description": "working mode",
"value": [
"I-V Curve",
"Cyclic Voltammetry",
"Function Generator",
"Z-T Curve",
"V-T Curve",
"I-T Curve",
"ADC test"
]
},
"VOLT_ORIGIN": {
"description": "Origin Voltage of Scan",
"domain": [
"VOLT_MAX"
]
},
"VOLT_FINAL": {
"description": "The last Voltage of Scan",
"domain": [
"VOLT_MAX"
],
"value": "1365 * VALUE"
},
"VOLT_STEP": {
"description": "Voltage Step",
"domain": [
5
]
},
"STEP_TIME": {
"description": "How much time between two step",
"domain": [
4
]
},
"DAC_VOLT": {
"description": "DAC output Voltage",
"domain": [
"VOLT_MAX"
]
},
"ADC_CHANNEL": {
"description": "read ADC data",
"value": [
"ANA0",
"ANA1",
"ANA2",
"ANA3"
]
}
},
"instruction": {
"start": [
{
"expression": "MODE",
"when": {
"0": "curve_iv",
"1": "curve_cv",
"2": "func_gen",
"6": "adc_test"
}
}
],
"data_format": [
"_data_format('TDC4VAF2')"
],
"curve_iv": [
"data_format",
"_notify(True)",
"curve_iv0",
"_sync(True)",
"VIS_STI"
],
"curve_iv0": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0010",
"vb": "(VOLT_FINAL + 1) * 0x0010",
"dv": "VOLT_STEP * 0x40",
"dt": "STEP_TIME * 0x12"
},
"data": [
"1X10;2B>va;2B>vb;B>dv;B>dt"
]
},
"curve_cv": [
"data_format",
"_notify(True)",
"curve_cv0",
"_sync(True)",
"VIS_STI"
],
"curve_cv0": {
"type": "RIS",
"parameter": {
"va": "(VOLT_ORIGIN + 1) * 0x0010",
"vb": "(VOLT_FINAL + 1) * 0x0010",
"dv": "VOLT_STEP * 0x40",
"dt": "STEP_TIME * 0x12"
},
"data": [
"1X20;2B>va;2B>vb;B>dv;B>dt"
]
},
"func_gen": [
"data_format",
"func_gen0",
"VIS_STI"
],
"func_gen0": {
"type": "RIS",
"parameter": {
"v": "(DAC_VOLT + 1) * 0x0010"
},
"data": [
"X30;X30;2B>v"
]
},
"adc_test": [
"data_format",
"_notify(True)",
"adc_test0",
"_sync(True)",
"VIS_STI"
],
"adc_test0": {
"type": "RIS",
"data": [
"X90;B>ADC_CHANNEL"
]
}
}
}
@@ -1,124 +0,0 @@
#ifndef EliteADC
#define EliteADC
#include "Elite_PIN.h"
#include "EliteSPI.h"
#include "EliteNotify.h"
// Elite ADC macro
// ADC command, Elite will use these cmd to control ADC
#define CMD_CURRENT_MEASURE 0xC5
#define CMD_VOLT_MEASURE 0xD5
#define CMD_DAC_MEASURE 0xE5
#define CMD_BATTERY_MEASURE 0xF5
// controller command, these are command from control box
#define ADC_CH_CURRENT 0x00
#define ADC_CH_VOLT 0x01
#define ADC_CH_DAC 0x02
#define ADC_CH_BAT 0x03
static void ADC_write(uint8_t ADCin) {
/*
* This function can only define [15]~[8] through ADCin
* [7]~[0] should always be 0b11101011
*
* [15] : SS, 0 = no effect, 1 = start work, default 0b0
* [14]~[12] : MUX[2:0], default 0b000
* [11]~[9] : PGA[2:0], default 0b010 = FSR is ±2.048
* [8] : mode, 0 = continuous, 1 = one shot, default 0b1 (Power-down and single-shot mode )
*
* [7]~[5] : data rate, default 0b100 = 128 SPS
* [4] : Temperature? default 0b0 = ADC mode
* [3] : Pullup enable, default 0b1 = Pullup resistor enabled
* [2]~[1] : NOP, default 0b01
* [0] : reserved, default 0b1
*
*/
// spi_ADC_txbuf[0] = 0b00000101;
for(int i=0 ; i<SPI_ADC_SIZE ; i++){
spi_ADC_txbuf[i] = 0;
spi_ADC_rxbuf[i] = 0;
}
spi_ADC_txbuf[0] = ADCin;
spi_ADC_txbuf[1] = 0b11101011;
ADC_SPI(2, spi_ADC_txbuf, spi_ADC_rxbuf);
}
static void ADC_read(uint8_t *ADCdata){
for(int i=0 ; i<SPI_ADC_SIZE ; i++){
spi_ADC_txbuf[i] = 0;
spi_ADC_rxbuf[i] = 0;
}
ADC_SPI(SPI_ADC_SIZE, spi_ADC_txbuf, ADCdata);
}
static void ADCGainControl(uint8_t ADCLevel){
if(ADCLevel == 0){
// ADC gain level = 0, using 200R resister
PIN_setOutputValue(pin_handle, Turnon10K, 0);
PIN_setOutputValue(pin_handle, Turnon100R, 0);
}
else if(ADCLevel == 1){
// ADC gain level = 1, using 10K resister
PIN_setOutputValue(pin_handle, Turnon10K, 1);
PIN_setOutputValue(pin_handle, Turnon100R, 0);
}
else if(ADCLevel == 2){
// ADC gain level = 2, using 100R resister
PIN_setOutputValue(pin_handle, Turnon10K, 0);
PIN_setOutputValue(pin_handle, Turnon100R, 1);
}
else{
// default using 200R resister
PIN_setOutputValue(pin_handle, Turnon10K, 0);
PIN_setOutputValue(pin_handle, Turnon100R, 0);
}
}
static void ADCChannelSelect(uint8_t ADCChannel){
// set ADC parameter
// 0xC1~F1 = reading AIN0~AIN3. Using FSR+-6V, resolution = 187.5uV
// 0xC5~F5 = reading AIN0~AIN3. Using FSR+-2V, resolution = 62.5 uV
switch(ADCChannel){
// AINp is AIN0; AINn is GND
// measure AIN0, which is a current measure
case ADC_CH_CURRENT :{
ADC_write(CMD_CURRENT_MEASURE);
break;
}
// AINp is AIN1; AINn is GND
// AIN1, which is a volt measure
case ADC_CH_VOLT :{
ADC_write(CMD_VOLT_MEASURE);
break;
}
// AINp is AIN2; AINn is GND
// AIN2, measure DAC voltage (Note that this is NOT DAC real output value!!)
case ADC_CH_DAC :{
ADC_write(CMD_DAC_MEASURE);
break;
}
// measure battery volt
case ADC_CH_BAT :{
ADC_write(CMD_BATTERY_MEASURE);
break;
}
default :{
break;
}
}
}
#endif
@@ -1,62 +0,0 @@
#ifndef EliteDAC
#define EliteDAC
static bool DACreset = true;
/* DAC reset parameter */
#define DACzero 0x85B2
#define DACposMax 0x0000
#define DACnegMax 0xFFFF
#ifdef ELITE_VERSION_1_3
#define DACOUT 0x30
static void DAC_outputV(uint16_t voltLV) {
// C = command, X = don't care, D = data
// CCCC XXXX = command
// DDDD DDDD = v1
// DDDD XXXX = v2
uint8_t v1, v2 = 0;
v1 = (uint8_t) (voltLV >> 4) & 0xFF;
v2 = (uint8_t) ((voltLV & 0x000F) << 4) & 0xF0;
spi_DACtxbuf[0] = command;
spi_DACtxbuf[1] = v1;
spi_DACtxbuf[2] = v2;
for (int i = 3; i < SPI_DAC_SIZE; i++) {
spi_DACtxbuf[i] = 0;
}
DAC_SPI(SPI_DAC_SIZE, spi_DACtxbuf, spi_rxbuf);
}
#endif
#ifdef ELITE_VERSION_1_4
#define DACCLS 0x02
#define DACOUT 0x31
static void DAC_outputV(uint16_t voltLV) {
// C = command, X = don't care, D = data
// CCCC CCCC = command
// DDDD DDDD = v1
// DDDD DDDD = v2
// command
// 0x02 = clear
// 0x31 = output voltage
uint8_t v1, v2 = 0;
v1 = (uint8_t) ((voltLV & 0xFF00) >> 8);
v2 = (uint8_t) (voltLV & 0x00FF);
spi_DACtxbuf[0] = DACOUT;
spi_DACtxbuf[1] = v1;
spi_DACtxbuf[2] = v2;
DAC_SPI(SPI_DAC_SIZE, spi_DACtxbuf, spi_rxbuf);
}
#endif
#endif
@@ -1,292 +0,0 @@
#ifndef EliteCorrection
#define EliteCorrection
#include "EliteDAC.h"
#include "EliteADC.h"
/* DAC reset parameter */
#define DACzero 0x85A2
#define DACposMax 0x0000
#define DACnegMax 0xFFFF
typedef struct _formula{
int32_t coeff = 0;
int32_t offset = 0;
}Formula;
typedef struct _correction{
Formula ADC_volt = 0;
Formula ADC_current[3] = 0;
uint32_t Gain0Boundary[2] = {0, 0};
uint32_t Gain1BoundARY[2] = {0, 0};
}Correction_data;
/*
* Correction Array include all the correction coeff and offset
*
* Correction formula format is " RealValue = coeff * code + offset "
* RealValue can be RealCurrent, RealVolt, or RealResister ...
* code is the code we read from ADC buffer
*
* ADC measure Voltage
* Correction[0] = ADC Volt coeff
* Correction[1] = ADC Volt offset => RealVolt = Correction[0] * code + Correction[1]
*
* ADC measure Current
* Correctino[2] = ADC gain_lv0 coeff
* Correction[3] = ADC gain_lv0 offset => RealCurrent = Correction[2] * code + Correction[3]
* Correctino[4] = ADC gain_lv1 coeff
* Correction[5] = ADC gain_lv1 offset => RealCurrent = Correction[4] * code + Correction[5]
* Correctino[6] = ADC gain_lv2 coeff
* Correction[7] = ADC gain_lv2 offset => RealCurrent = Correction[6] * code + Correction[7]
*
* DAC output Voltage
* Correction[8] = DAC coeff
* Correction[9] = DAC offset => RealVolt = Correction[8] * DACcode + Correction[9]
*
*/
#define BORAD_Chao_I
#ifdef BORAD_CLASS_LEADER
static Correction_data Correction;
Correction.ADC_volt.coeff = (-629);
Correction.ADC_volt.offset = 15447740;
Correction.ADC_current_200k.coeff = 3056;
Correction.ADC_current_200k.offset = -74771591;
Correction.ADC_current_10K.coeff = 65461;
Correction.ADC_current_10K.offset = -1601786957;
Correction.ADC_current_200R.coeff = 3369;
Correction.ADC_current_200R.offset = -82598293;
Correction.Gain0Boundary[0] = 0x5F75;
Correction.Gain0Boundary[1] = 0x5FB2;
Correction.Gain1Boundary[0] = 0x5999;
Correction.Gain1Boundary[1] = 0x6589;
#endif
#ifdef BORAD_TRICERATOPS
static Correction_data Correction;
Correction.ADC_volt.coeff = (-626);
Correction.ADC_volt.offset = 15065046;
Correction.ADC_current_200k.coeff = 0;
Correction.ADC_current_200k.offset = 0;
Correction.ADC_current_10K.coeff = 0;
Correction.ADC_current_10K.offset = 0;
Correction.ADC_current_200R.coeff = 0;
Correction.ADC_current_200R.offset = 0;
Correction.Gain0Boundary[0] = 0;
Correction.Gain0Boundary[1] = 0;
Correction.Gain1Boundary[0] = 0;
Correction.Gain1Boundary[1] = 0;
#endif
#ifdef BORAD_Chao_I
static Correction_data Correction;
Correction.ADC_volt.coeff = (-627);
Correction.ADC_volt.offset = 15122868;
Correction.ADC_current_200k.coeff = 3091;
Correction.ADC_current_200k.offset = (-74147760);
Correction.ADC_current_10K.coeff = 66127;
Correction.ADC_current_10K.offset = (-1586449560);
Correction.ADC_current_200R.coeff = 3118;
Correction.ADC_current_200R.offset = (74817847);
Correction.Gain0Boundary[0] = 0x5D96;
Correction.Gain0Boundary[1] = 0x5DD9;
Correction.Gain1Boundary[0] = 0x57CD;
Correction.Gain1Boundary[1] = 0x639F;
#endif
#ifdef BOARD_TWENTY_ONE
static Correction_data Correction;
Correction.ADC_volt.coeff = (-625);
Correction.ADC_volt.offset = 15221058;
Correction.ADC_current[0].coeff = 3002;
Correction.ADC_current[0].offset = -72955265;
Correction.ADC_current[1].coeff = 65840;
Correction.ADC_current[1].offset = -1600149874;
Correction.ADC_current[2].coeff = 3090;
Correction.ADC_current[2].offset = -75102578;
Correction.Gain0Boundary[0] = 0x5ECD;
Correction.Gain0Boundary[1] = 0x5F0D;
Correction.Gain1Boundary[0] = 0x5900;
Correction.Gain1Boundary[1] = 0x64DD;
#endif
// this function turn ADC measure value (0xXXXX) into real voltage
// unit should be mV
static int32_t DecodeADCVolt(uint16_t ADC_measure){
int32_t ADCRealVolt = 0;
ADCRealVolt = (Correction.ADC_volt.coeff * ADC_measure + Correction.ADC_volt.offset);
ADCRealVolt = ADCRealVolt / 1000;
return ADCRealVolt;
}
// this function turn ADC measure value (0xXXXX) into real current
// unit should be pA
/* Decode ADC current for twenty-one */
static int32_t DecodeADCCurrent(uint8_t ADCGain, uint16_t ADC_measure){
int32_t ADCRealCurrent = 0;
int32_t coeff[3] = {0}, offset[3] = {0};
ADCRealCurrent = (Correction.ADC_current[ADCGain].coeff * ADC_measure + Correction.ADC_current[ADCGain].offset)/1000;
return ADCRealCurrent;
}
// Decode ADC measure value (could be a volt or current) and put it into notify buffer
static int32_t DecodeADCValue(uint8_t ADCGain, uint8_t ADCChannel, uint8_t *ADC_raw){
uint16_t ADC_measure = (uint16_t) (ADC_raw[0] << 8) | (uint16_t) (ADC_raw[1]);
int32_t ADCRealVolt = 0, ret = 0;
// return real volt to controller
if(ADCChannel == ADC_CH_VOLT){
ADCRealVolt = DecodeADCVolt(ADC_measure);
NotifyVolt[0] = (uint8_t) (ADCRealVolt >> 24);
NotifyVolt[1] = (uint8_t) ((ADCRealVolt & 0x00FF0000) >> 16);
NotifyVolt[2] = (uint8_t) ((ADCRealVolt & 0x0000FF00) >> 8);
NotifyVolt[3] = (uint8_t) (ADCRealVolt & 0x000000FF);
ret = ADCRealVolt;
}
// return real current to controller
else if(ADCChannel == ADC_CH_CURRENT){
if (INSTRUCTION.eliteFxn == IVCurve) {
ADCRealCurrent += DecodeADCCurrent(ADCGain, ADC_measure);
if ((SampleRate_counter % 10) == 0) {
ADCRealCurrent = ADCRealCurrent / 10;
if (avg_number > 2) { // to discard the first 20 current sample data
ADCRealCurrent_avg = (ADCRealCurrent + ADCRealCurrent_avg*(avg_number - 3)) / (avg_number - 2);
}
avg_number ++;
ADCRealCurrent = 0;
}
if (StepTimeCounter == StepTime - 1) {
NotifyCurrent[0] = (uint8_t) (ADCRealCurrent_avg >> 24);
NotifyCurrent[1] = (uint8_t) ((ADCRealCurrent_avg & 0x00FF0000) >> 16);
NotifyCurrent[2] = (uint8_t) ((ADCRealCurrent_avg & 0x0000FF00) >> 8);
NotifyCurrent[3] = (uint8_t) (ADCRealCurrent_avg & 0x000000FF);
avg_number = 1;
ADCRealCurrent_avg = 0;
}
}
else {
ADCRealCurrent = DecodeADCCurrent(ADCGain, ADC_measure);
NotifyCurrent[0] = (uint8_t) (ADCRealCurrent >> 24);
NotifyCurrent[1] = (uint8_t) ((ADCRealCurrent & 0x00FF0000) >> 16);
NotifyCurrent[2] = (uint8_t) ((ADCRealCurrent & 0x0000FF00) >> 8);
NotifyCurrent[3] = (uint8_t) (ADCRealCurrent & 0x000000FF);
ret = ADCRealCurrent;
}
}
else{
// not support AIN2 / AIN3 yet
}
return ret;
}
// #0 board, (0x5f75 <= rawdata) && (rawdata <= 0x5fb2)
// ((0x5f97 < rawdata) && (rawdata < 0x6589)) || ((0x5999 < rawdata) && (rawdata < 0x5f93))
static void ADC_overflow(uint8_t gain, uint8_t *rawdata){
// Gain boundary defines different ADC gain level working area
// Gain0Boundary = {lowerbound, upperbound}, is the lower and upper bound of gain level 0 working area.
uint16_t U16Rawdata = 0;
U16Rawdata = (((uint16_t) (rawdata[0]))<<8) | ((uint16_t) (rawdata[1]));
if(gain == GAIN_200K){
if( U16Rawdata <= Correction.Gain0Boundary[0]){
rawdata[0] = Correction.Gain0Boundary[0] >> 4;
rawdata[1] = (uint8_t) (Correction.Gain0Boundary[0] & 0x00FF);
}
else if(U16Rawdata >= Correction.Gain0Boundary[1]){
rawdata[0] = (uint8_t) (Correction.Gain0Boundary[1] >> 4);
rawdata[1] = (uint8_t) (Correction.Gain0Boundary[1] & 0x00FF);
}
}
else if(gain == GAIN_10K){
if( U16Rawdata <= Correction.Gain1Boundary[0]){
rawdata[0] = Correction.Gain1Boundary[0] >> 4;
rawdata[1] = (uint8_t) (Correction.Gain1Boundary[0] & 0x00FF);
}
else if(U16Rawdata >= Correction.Gain1Boundary[1]){
rawdata[0] = (uint8_t) (Correction.Gain1Boundary[1] >> 4);
rawdata[1] = (uint8_t) (Correction.Gain1Boundary[1] & 0x00FF);
}
}
}
// User will enter -5V~+5V in UI.
// websever and controler use 0~50000 represent -5~+5V
// this function should turn 0~50000 into DACcode which output the exactly voltage user want
static uint16_t Usercode_Correction_to_DAC(uint16_t usercode)
{
// DACcode to real_voltage correction function
//DACcode = -1.0548523(usercode) + 60597.718
int32_t usercode_32;
uint16_t DACcode = 0;
int32_t coeff = (-1054), offset = 60597718;
usercode_32 = (int32_t)(usercode);
DACcode = (uint16_t) ((coeff * usercode_32 + offset)/1000);
return DACcode;
}
static int32_t DAC_to_realV(uint16_t DACcode)
{
//volt = (DAC -6.4893275)/(-0.0001896)
int32_t RealV = 0;
int32_t volt_32 = 0;
int32_t coeff = (-1896), offset = 64893275;//*10e7
volt_32 = DACcode;
// RealV = (volt_32 - offset) / coeff;
RealV = (-1896) * volt_32 + offset;
RealV = RealV / 10e3; //(mV)
return RealV;
}
#endif
@@ -1,95 +0,0 @@
#ifndef ELITE_I2C
#define ELITE_I2C
/*
* Read I2C example in
* http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/tirtos/2_14_02_22/
* exports/tirtos_full_2_14_02_22/docs/doxygen/html/_i2_c_c_c26_x_x_8h.html
*
*/
#include <ti/drivers/I2C.h>
#include <ti/drivers/Power.h>
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
// I2C
static I2C_Handle I2Chandle;
static I2C_Params I2Cparams;
static I2C_Transaction i2cTrans;
#define I2CBufSize 4
static uint8_t I2CtxBuf[I2CBufSize]; // Transmit buffer
static uint8_t I2CrxBuf[I2CBufSize]; // Receive buffer
bool transferDone = false;
static void I2CCallbackFunction(I2C_Handle handle, I2C_Transaction *msg, bool transfer) {
if(transfer){
transferDone = true;
}
}
static void I2Cinit(){
I2C_init();
// Configure I2C parameters.
I2C_Params_init(&I2Cparams);
I2Cparams.transferMode = I2C_MODE_CALLBACK;
I2Cparams.transferCallbackFxn = I2CCallbackFunction;
I2Cparams.bitRate = I2C_100kHz;
// Initialize master I2C transaction structure
i2cTrans.writeCount = I2CBufSize;
i2cTrans.writeBuf = I2CtxBuf;
i2cTrans.readCount = I2CBufSize;
i2cTrans.readBuf = I2CrxBuf;
i2cTrans.slaveAddress = 0xA0;
for(int i=0 ; i<10 ; i++){
I2CtxBuf[i] = 0;
I2CrxBuf[i] = 0;
}
// Open I2C
I2Chandle = I2C_open(Board_I2C, &I2Cparams);
}
#define WriteMem 0b10100001
#define ReadMem 0b10100000
static void I2CWrite(uint8_t addr, uint8_t data){
for(int i=0 ; i<I2CBufSize ; i++){
I2CtxBuf[i] = 0;
I2CrxBuf[i] = 0;
}
I2CtxBuf[0] = WriteMem;
I2CtxBuf[1] = addr;
I2CtxBuf[2] = data;
// I2Chandle = I2C_open(Board_I2C, &I2Cparams);
I2C_transfer(I2Chandle, &i2cTrans);
// I2C_close(I2Chandle);
}
static void I2CRead(uint8_t addr){
for(int i=0 ; i<I2CBufSize ; i++){
I2CtxBuf[i] = 0;
I2CrxBuf[i] = 0;
}
I2CtxBuf[0] = ReadMem;
I2CtxBuf[1] = addr;
// I2Chandle = I2C_open(Board_I2C, &I2Cparams);
I2C_transfer(I2Chandle, &i2cTrans);
// I2C_close(I2Chandle);
}
#endif // ELITE_I2C
@@ -1,60 +0,0 @@
#ifndef ELITENOTIFY
#define ELITENOTIFY
#include "headstage.h"
/**
* notify data buffer.
* the length equals to the characteristic 4 which value is 20 bytes.
*
*/
#define NOT_BUF_OFFSET_INIT 8
/**
* the index where to start insert data into buffer.
* start from 6.
*/
static size_t not_buf_offset = NOT_BUF_OFFSET_INIT;
static uint32_t not_time_stamp;
static uint8_t NotifyCurrent[4] = {0};
static uint8_t NotifyVolt[4] = {0};
static uint8_t NotifyImpedance[4] = {0};
/**
* counter of notify send.
*/
static uint32_t notify_counter = 0;
/*
* Notify format
*
*
| | 1 | 2 | 3 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
-----------------------------------------------------------------
| header |
| current |
| voltage |
| impedance |
| time stamp |
| cycle number |
cycle number
for cyclic voltammetry use, we save it as channel number.
0xFF
* header = device ID
* I = current (0.001nA), V = voltage (mV),
* Z = impedance (k ohm), T = time (ms)
*
*
*/
#endif
@@ -1,88 +0,0 @@
#ifndef ELITE_SPI
#define ELITE_SPI
/*
* Read SPI example in
* http://software-dl.ti.com/dsps/dsps_public_sw/sdo_sb/targetcontent/tirtos/2_14_02_22/
* exports/tirtos_full_2_14_02_22/docs/doxygen/html/_s_p_i_c_c26_x_x_d_m_a_8h.html
*/
#include <Board.h>
#include <ti/drivers/SPI.h>
#include <ti/drivers/dma/UDMACC26XX.h>
#include <ti/drivers/spi/SPICC26XXDMA.h>
#include "Elite_PIN.h"
/* application use SPI parameters and buffers */
#define SPI_LED_SIZE 28
#define SPI_DAC_SIZE 3
#define SPI_ADC_SIZE 4
static uint16_t spi_LEDtxbuf[SPI_LED_SIZE] = {0};
static uint16_t spi_LEDrxbuf[SPI_LED_SIZE] = {0};
static uint8_t spi_DACtxbuf[SPI_DAC_SIZE] = {0};
static uint8_t spi_rxbuf[SPI_DAC_SIZE] = {0};
static uint8_t spi_ADC_txbuf[SPI_ADC_SIZE] = {0};
static uint8_t spi_ADC_rxbuf[SPI_ADC_SIZE] = {0};
/* system use SPI parameters */
static SPI_Handle spiHandle0 = NULL; // SPI0 = LED
static SPI_Handle spiHandle1 = NULL; // SPI1 = ADC +DAC
static SPI_Params spiParams0;
static SPI_Params spiParams1;
static SPI_Transaction LED_transaction;
static SPI_Transaction ADC_DAC_transaction;
static void Elite_SPI_init(){
SPI_init();
SPI_Params_init(&spiParams0);
spiParams0.bitRate = 2000; // 12k
spiParams0.mode = SPI_MASTER;
spiParams0.dataSize = 16;
spiParams0.frameFormat = SPI_POL0_PHA1;
spiHandle0 = SPI_open(Board_SPI0, &spiParams0); // LED SPI
SPI_Params_init(&spiParams1);
spiParams1.bitRate = 1000000; // 1M
spiParams1.mode = SPI_MASTER;
spiParams1.dataSize = 8;
spiParams1.frameFormat = SPI_POL0_PHA1;
spiHandle1 = SPI_open(Board_SPI1, &spiParams1); // ADC DAC SPI
}
static void LED_SPI(uint8_t length, uint16_t *spi_txbuf, uint16_t *spi_rxbuf) {
LED_transaction.count = length;
LED_transaction.txBuf = spi_txbuf;
LED_transaction.rxBuf = spi_rxbuf;
SPI_transfer(spiHandle0, &LED_transaction);
}
static void ADC_SPI(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
ADC_DAC_transaction.count = length;
ADC_DAC_transaction.txBuf = spi_txbuf;
ADC_DAC_transaction.rxBuf = spi_rxbuf;
PIN_setOutputValue(pin_handle, DAC_CS, 1); // DAC_CS HIGH
PIN_setOutputValue(pin_handle, ADC_CS, 0); // ADC_CS LOW
SPI_transfer(spiHandle1, &ADC_DAC_transaction);
PIN_setOutputValue(pin_handle, ADC_CS, 1); // ADC_CS HIGH
}
static void DAC_SPI(uint8_t length, uint8_t *spi_txbuf, uint8_t *spi_rxbuf) {
ADC_DAC_transaction.count = length;
ADC_DAC_transaction.txBuf = spi_txbuf;
ADC_DAC_transaction.rxBuf = spi_rxbuf;
PIN_setOutputValue(pin_handle, ADC_CS, 1); // ADC_CS HIGH
PIN_setOutputValue(pin_handle, DAC_CS, 0); // DAC_CS LOW
SPI_transfer(spiHandle1, &ADC_DAC_transaction);
PIN_setOutputValue(pin_handle, DAC_CS, 1); // DAC_CS HIGH
}
#endif // ELITE_SPI
@@ -1,190 +0,0 @@
#ifndef Elite_PIN
#define Elite_PIN
#include <ti/drivers/pin/PINCC26XX.h>
#include <Board.h>
#include <ti/drivers/PIN.h>
/* SPI Board */
#define Board_SPI0_MISO PIN_UNASSIGNED
#define Board_SPI0_MOSI IOID_1
#define Board_SPI0_CLK IOID_0
#define Board_SPI0_CS PIN_UNASSIGNED
#define Board_SPI1_MISO IOID_3
#define Board_SPI1_MOSI IOID_2
#define Board_SPI1_CLK IOID_4
#define Board_SPI1_CS PIN_UNASSIGNED
#define ADC_CS IOID_8
#define DAC_CS IOID_9
#define Turnon100R IOID_5
#define Turnon10K IOID_6
/* I2C */
#ifdef ELITE_VERSION_1_4
#define Board_I2C0_SCL0 IOID_7
#define Board_I2C0_SDA0 IOID_1
#endif
#define shutdown_6994 IOID_10
#define switch_on IOID_11
#define enable_10v IOID_12
#define enable_5v IOID_13
PIN_Handle pin_handle;
static PIN_State ZM_rst;
const PIN_Config BLE_IO[] = {
//
ADC_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, // ADC_CS
DAC_CS | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, // DAC_CS
enable_10v | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, // 10V_enable
enable_5v | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, // 5V_enable
shutdown_6994 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX, // turn off power
Turnon100R | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
Turnon10K | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL | PIN_DRVSTR_MAX,
switch_on | PIN_INPUT_EN | PIN_PULLDOWN,
PIN_TERMINATE
};
/*!
* @def BOOSTXL_CC2650MA_SPIName
* @brief Enum of SPI names on the CC2650 Booster Pack
*/
typedef enum BOOSTXL_CC2650MA_SPIName {
BOOSTXL_CC2650MA_SPI0 = 0,
BOOSTXL_CC2650MA_SPI1 = 1,
BOOSTXL_CC2650MA_SPICOUNT
} BOOSTXL_CC2650MA_SPIName;
/*
* ========================== SPI DMA begin ===================================
*/
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(SPI_config, ".const:SPI_config")
#pragma DATA_SECTION(spiCC26XXDMAHWAttrs, ".const:spiCC26XXDMAHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/spi/SPICC26XXDMA.h>
/* SPI objects */
SPICC26XXDMA_Object spiCC26XXDMAObjects[BOOSTXL_CC2650MA_SPICOUNT];
/* SPI configuration structure, describing which pins are to be used */
const SPICC26XXDMA_HWAttrsV1 spiCC26XXDMAHWAttrs[BOOSTXL_CC2650MA_SPICOUNT] = {
{
.baseAddr = SSI0_BASE,
.intNum = INT_SSI0_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI0,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI0_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI0_TX,
.mosiPin = Board_SPI0_MOSI,
.misoPin = Board_SPI0_MISO,
.clkPin = Board_SPI0_CLK,
.csnPin = Board_SPI0_CS
},
{
.baseAddr = SSI1_BASE,
.intNum = INT_SSI1_COMB,
.intPriority = ~0,
.swiPriority = 0,
.powerMngrId = PowerCC26XX_PERIPH_SSI1,
.defaultTxBufValue = 0,
.rxChannelBitMask = 1<<UDMA_CHAN_SSI1_RX,
.txChannelBitMask = 1<<UDMA_CHAN_SSI1_TX,
.mosiPin = Board_SPI1_MOSI,
.misoPin = Board_SPI1_MISO,
.clkPin = Board_SPI1_CLK,
.csnPin = Board_SPI1_CS
},
};
/* SPI configuration structure */
const SPI_Config SPI_config[] = {
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[0],
.hwAttrs = &spiCC26XXDMAHWAttrs[0]
},
{
.fxnTablePtr = &SPICC26XXDMA_fxnTable,
.object = &spiCC26XXDMAObjects[1],
.hwAttrs = &spiCC26XXDMAHWAttrs[1]
},
{NULL, NULL, NULL}
};
/*
* ========================== SPI DMA end =====================================
*/
/*
* ============================= I2C Begin=====================================
*/
#ifdef ELITE_VERSION_1_4
/* Generic I2C instance identifiers */
#define Board_I2C CC2650_MA_I2C0
/*!
* @def CC2650_LAUNCHXL_I2CName
* @brief Enum of I2C names on the CC2650 dev board
*/
typedef enum CC2650_MA_I2CName {
CC2650_MA_I2C0 = 0,
CC2650_MA_I2CCOUNT
} CC2650_MA_I2CName;
/* Place into subsections to allow the TI linker to remove items properly */
#if defined(__TI_COMPILER_VERSION__)
#pragma DATA_SECTION(I2C_config, ".const:I2C_config")
#pragma DATA_SECTION(i2cCC26xxHWAttrs, ".const:i2cCC26xxHWAttrs")
#endif
/* Include drivers */
#include <ti/drivers/i2c/I2CCC26XX.h>
/* I2C objects */
I2CCC26XX_Object i2cCC26xxObjects[CC2650_MA_I2CCOUNT];
/* I2C configuration structure, describing which pins are to be used */
const I2CCC26XX_HWAttrsV1 i2cCC26xxHWAttrs[CC2650_MA_I2CCOUNT] = {
{
.baseAddr = I2C0_BASE,
.powerMngrId = PowerCC26XX_PERIPH_I2C0,
.intNum = INT_I2C_IRQ,
.intPriority = ~0,
.swiPriority = 0,
.sdaPin = Board_I2C0_SDA0,
.sclPin = Board_I2C0_SCL0,
}
};
/* I2C configuration structure */
const I2C_Config I2C_config[] = {
{
.fxnTablePtr = &I2CCC26XX_fxnTable,
.object = &i2cCC26xxObjects[0],
.hwAttrs = &i2cCC26xxHWAttrs[0]
},
{NULL, NULL, NULL}
};
/*
* ========================== I2C end =========================================
*/
#endif
#endif
@@ -0,0 +1,520 @@
/*
* headstage_Uni.h
*
* Created on: 2018/10/5
* Author: s8807
*/
/*
===================
SET UP flow
===================
Raspberry Pi3 -> transmit instruction -> echo for set up done -> next instruction
===================
UNI1.2 control flow
===================
state machine architecture
--------------------------
(power on reset)
goto UMC_STATE_IDLE
(any state)
recv VIS_RST
goto UMC_STATE_IDLE
UMC_STATE_IDLE
goto UMC_STATE_HANDSHAKE
UMC_STATE_HANDSHAKE
need to check HANDSHAKE
if (handshake pass)
transmit UMC_HANDSHAKE_RESPONS
goto UMC_STATE_HANDSHAKE_RECEIVE
else
still recv handshake until it pass
UMC_STATE_HANDSHAKE_RECEIVE
cc2650 check PASS or FAIL
if( PASS )
goto UMC_STATE_INITIAL
else
cc2650 send HANDSHAKE_RESPONSE again until it recv pass
UMC_STATE_INITIAL
choose LSK format and define chip ID
goto UMC_STATE_CONFIGURE
UMC_STATE_CONFIGURE
# configuration UMC parameter
# cc2650 configure UMC parameter 1 by 1
# finally , send config done to exit config state
cc2650 recv [pass / fail]
if CONFIG_DONE is sent
goto UMC_STATE_WAIT_START
else
still configure UMC parameter
UMC_STATE_WAIT_START
# and pull-up trigger (gpio)
according to UMC_BHVR :
case : goto UMC_STATE_CONTINUOUS
case : goto UMC_STATE_LIMITED
case : goto UMC_STATE_WAIT_TRIGGER
UMC_STATE_TRIGGER
TODO (implement trigger code to do stimulus)
# DBS do the stimulus when it receive trigger
# otherwise , it will only record data
cc2650 send TRIGGER
goto UMC_STATE_WAIT_TRIGGER
send INTERRUPT
goto UMC_STATE_CONFIGURE
UMC_STATE_CONTINUOUS
# DBS will continuously stimulate brain and record data
send INTERRUPT
goto UMC_STATE_CONFIGURE
UMC_STATE_LIMITED
TODO (need to go back to config data)
# DBS will stimulate several times and record data
send INTERRUPT
goto UMC_STATE_CONFIGURE
*/
/*
// SIS is rebuild
| | 1 | 2 | 3 | |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
---------------------------------------------------------------------------------
| SIS | ID | length |0b001|AGN_U| SPW | SRT |S_B| UNI_S_F | UMC specific parameters
SRT
stimulus repeats times
SPW
stimulus pulse width
STI_F
stimulus frequency for uni
AGN_U
amp gain of UMC
S_B
stimulation behavior .
continuous mode , trigger mode or limited mode
*/
/*
* TODO list :
* bluetooth disconnect issue
* OAD : over air download
*/
#ifndef HEADSTAGE_H
#error "headstage.h not include"
#endif
#ifdef HEADSTAGE_H_H
#error "headstage_*.h has be included"
#endif
#ifndef NEULIVESTI_H
#define HEADSTAGE_H_H
#define NEULIVESTI_H
#define UNI
// product information
#define DEVICE_NAME "NeuliveSTI-M0.1"
#define MAJOR_PRODUCT_NUMBER 1
#define MINOR_PRODUCT_NUMBER 2
#define MAJOR_VERSION_NUMBER 0
#define MINOR_VERSION_NUMBER 1
#include <ti/drivers/PIN.h>
#include "board.h"
extern PWM_Handle hPWM;
extern PWM_Params pp;
extern GPTimerCC26XX_Handle hTimer;
extern GPTimerCC26XX_Handle hTimer_1;
extern GPTimerCC26XX_Handle hTimer_2;
extern ADC_Handle adc;
extern ADC_Handle adc_1;
extern ADC_Handle adc_2;
extern ADC_Params params;
extern ADC_Params params_1;
extern ADC_Params params_2;
/* application use SPI parameters and buffers */
/**
* initialize parameter and device.
*/
static void NeuLiveSTI_init() {
GPTimerCC26XX_Params params;
GPTimerCC26XX_Params_init(&params);
params.width = GPT_CONFIG_16BIT;
params.mode = GPT_MODE_PERIODIC_DOWN;
params.debugStallMode = GPTimerCC26XX_DEBUG_STALL_OFF;
hTimer = GPTimerCC26XX_open(BOOSTXL_CC2650MA_GPTIMER0A, &params);
hTimer_1 = GPTimerCC26XX_open(BOOSTXL_CC2650MA_GPTIMER1A, &params);
hTimer_2 = GPTimerCC26XX_open(BOOSTXL_CC2650MA_GPTIMER2A, &params);
// hTimer = GPTimerCC26XX_open(CC2650_LAUNCHXL_GPTIMER0A, &params);
// hTimer_1 = GPTimerCC26XX_open(CC2650_LAUNCHXL_GPTIMER1A, &params);
// hTimer_2 = GPTimerCC26XX_open(CC2650_LAUNCHXL_GPTIMER2A, &params);
GPTimerCC26XX_setLoadValue(hTimer, 0xFFFFFF);
GPTimerCC26XX_setLoadValue(hTimer_1, 0xFFFFFF);
GPTimerCC26XX_setLoadValue(hTimer_2, 0xFFFFFF);
GPTimerCC26XX_registerInterrupt(hTimer, GPTimer_callback, GPT_INT_TIMEOUT);
GPTimerCC26XX_registerInterrupt(hTimer_1, GPTimer_callback_1, GPT_INT_TIMEOUT);
GPTimerCC26XX_registerInterrupt(hTimer_2, GPTimer_callback_2, GPT_INT_TIMEOUT);
GPTimerCC26XX_start(hTimer);
GPTimerCC26XX_start(hTimer_1);
GPTimerCC26XX_start(hTimer_2);
PWM_init();
PWM_Params_init(&pp);
pp.idleLevel = PWM_IDLE_LOW;
pp.periodUnits = PWM_PERIOD_COUNTS;
pp.periodValue = duty_max_value;
pp.dutyUnits = PWM_DUTY_COUNTS;
pp.dutyValue = 1;
hPWM = PWM_open(BOOSTXL_CC2650MA_PWM7,&pp);
// hPWM = PWM_open(CC2650_LAUNCHXL_PWM7,&pp);
PWM_start(hPWM);
ADC_init();
ADC_Params_init(&params);
ADC_Params_init(&params_1);
ADC_Params_init(&params_2);
adc = ADC_open(BOOSTXL_CC2650MA_ADC0, &params);
adc_1 = ADC_open(BOOSTXL_CC2650MA_ADC1, &params_1);
adc_2 = ADC_open(BOOSTXL_CC2650MA_ADC2, &params_2);
// adc = ADC_open( CC2650_LAUNCHXL_ADC0, &params);
// adc_1 = ADC_open( CC2650_LAUNCHXL_ADC1, &params_1);
// adc_2 = ADC_open( CC2650_LAUNCHXL_ADC2, &params_2);
}
static void sti_mode(uint8_t channel,uint8_t mode){
switch(channel){
case(0x00):{
switch(mode){
case(0x00):{
PIN_setOutputValue(Test_handle, IOID_10, 0);
PIN_setOutputValue(Test_handle, IOID_11, 1);
// for(int i=0;i<((INSTRUCTION.first_ch_pulse_width*700)/2)/699-4;i++){
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
// SBP_collect_recording_data(0x00);
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
case(0x01):{
PIN_setOutputValue(Test_handle, IOID_10, 1);
PIN_setOutputValue(Test_handle, IOID_11, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
case(0x02):{
PIN_setOutputValue(Test_handle, IOID_10, 0);
PIN_setOutputValue(Test_handle, IOID_11, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_10, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
case(0x03):{
PIN_setOutputValue(Test_handle, IOID_10, 1);
PIN_setOutputValue(Test_handle, IOID_11, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_10, 0);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
}
break;
}
case(0x01):{
switch(mode){
case(0x00):{
PIN_setOutputValue(Test_handle, IOID_6, 0);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
case(0x01):{
PIN_setOutputValue(Test_handle, IOID_6, 1);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
case(0x02):{
PIN_setOutputValue(Test_handle, IOID_6, 0);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_6, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
case(0x03):{
PIN_setOutputValue(Test_handle, IOID_6, 1);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_6, 0);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
}
break;
}
NeuLiveSTI_collect_recording_data(0x01);
}
}
static void sti_mode_IPI(uint8_t channel,uint8_t mode){
switch(channel){
case(0x00):{
switch(mode){
case(0x00):{
PIN_setOutputValue(Test_handle, IOID_10, 0);
PIN_setOutputValue(Test_handle, IOID_11, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
case(0x01):{
PIN_setOutputValue(Test_handle, IOID_10, 1);
PIN_setOutputValue(Test_handle, IOID_11, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
case(0x02):{
PIN_setOutputValue(Test_handle, IOID_10, 0);
PIN_setOutputValue(Test_handle, IOID_11, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
for(int i=0;i<INSTRUCTION.first_ch_pw_IPI;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 1);
PIN_setOutputValue(Test_handle, IOID_10, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
case(0x03):{
PIN_setOutputValue(Test_handle, IOID_10, 1);
PIN_setOutputValue(Test_handle, IOID_11, 1);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
for(int i=0;i<INSTRUCTION.first_ch_pw_IPI;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 1);
PIN_setOutputValue(Test_handle, IOID_10, 0);
for(int i=0;i<INSTRUCTION.first_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_0, 1);
// PIN_setOutputValue(Test_handle, IOID_0, 0);
}
PIN_setOutputValue(Test_handle, IOID_11, 0);
break;
}
}
NeuLiveSTI_collect_recording_data(0x00);
break;
}
case(0x01):{
switch(mode){
case(0x00):{
PIN_setOutputValue(Test_handle, IOID_6, 0);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
case(0x01):{
PIN_setOutputValue(Test_handle, IOID_6, 1);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
case(0x02):{
PIN_setOutputValue(Test_handle, IOID_6, 0);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
for(int i=0;i<INSTRUCTION.second_ch_pw_IPI;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 1);
PIN_setOutputValue(Test_handle, IOID_6, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
case(0x03):{
PIN_setOutputValue(Test_handle, IOID_6, 1);
PIN_setOutputValue(Test_handle, IOID_5, 1);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
for(int i=0;i<INSTRUCTION.second_ch_pw_IPI;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 1);
PIN_setOutputValue(Test_handle, IOID_6, 0);
for(int i=0;i<INSTRUCTION.second_ch_pulse_width;i++){
PIN_setOutputValue(Test_handle, IOID_1, 1);
// PIN_setOutputValue(Test_handle, IOID_1, 0);
}
PIN_setOutputValue(Test_handle, IOID_5, 0);
break;
}
}
NeuLiveSTI_collect_recording_data(0x01);
break;
}
}
}
static void PWM_SetValue(uint32_t frequency, uint32_t duty_cycle,PWM_Handle Ph){
PWM_stop(Ph);
PWM_setPeriod(Ph,frequency);
PWM_setDuty(Ph,duty_cycle);
PWM_start(Ph);
}
/*====================================
==== UMC State machine interface ====
===================================*/
/*
* todo: interrupt
* -> stop SPI
* -> transmit interrupt
* -> wait another VIS_STI
*/
/*==========================
==== UMC SPI interface ====
=========================*/
// ASK interface
#endif
@@ -1,305 +0,0 @@
#ifndef HEADSTAGE_H
#error "headstage.h not include"
#endif
#ifdef HEADSTAGE_H_H
#error "headstage_*.h has be included"
#endif
#ifndef HEADSTAGE_TNI_H
#define HEADSTAGE_H_H
#define HEADSTAGE_TNI_H
// product information
#define DEVICE_NAME "Elite-v0.1"
#define MAJOR_PRODUCT_NUMBER 0
#define MINOR_PRODUCT_NUMBER 1
#define MAJOR_VERSION_NUMBER 0
#define MINOR_VERSION_NUMBER 1
// header
#include <ti/drivers/PIN.h>
#include "board.h"
/*============
==== SPI ====
===========*/
/* application use SPI parameters and buffers */
#define SPI_BUFFER_SIZE 16
static uint8_t spi_txbuf[SPI_BUFFER_SIZE] = {0};
static uint8_t spi_rxbuf[SPI_BUFFER_SIZE] = {0};
/*=============================
==== headstage variable ====
============================*/
PIN_Handle pin_handle;
static PIN_State DBS_rst;
// DBS reset pin
const PIN_Config BLE_IO[] = {
//
IOID_9 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
IOID_2 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
IOID_3 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
IOID_13 | PIN_GPIO_OUTPUT_EN | PIN_GPIO_LOW | PIN_PUSHPULL,
PIN_TERMINATE //
};
/**
* ADC clock switch signal.
*/
static bool adc_clock_signal = FALSE;
/*=======================================
==== headstage function declaration ====
======================================*/
static void headstage_tni_update_instruction_callback(uint8_t ins_type, uint8_t ins_op, uint8_t ins_len, uint8_t *ins);
/*=============================
==== ramp data generating ====
============================*/
static uint16_t ramp_data_counter = 0;
static void create_ramp(uint8_t *buff) {
buff[0] = 0b10110000 | (0b00001111 & (uint8_t)(ramp_data_counter >> 6));
buff[1] = (uint8_t)(ramp_data_counter << 2);
ramp_data_counter += 1;
}
/*=======================================
==== headstage function implemented ====
======================================*/
/**
* change channel value to little endian
*/
static uint8 encode_channel(uint8 channel) {
return 0x0F & (((channel & 0b1000) >> 3) | //
((channel & 0b0100) >> 1) | //
((channel & 0b0010) << 1) | //
((channel & 0b0001) << 3));
}
static void headstage_init() {
set_update_instruction_callback(headstage_tni_update_instruction_callback);
// initialize the DBS reset pin
pin_handle = PIN_open(&DBS_rst, BLE_IO);
PIN_setOutputValue(pin_handle, IOID_9, 1);
PIN_setOutputValue(pin_handle, IOID_2, 0);
PIN_setOutputValue(pin_handle, IOID_3, 0);
}
/**
* change the recording clock bit in the instruction buffer.
*/
static void update_ins_rec_clock(uint8_t *buf, bool adc_clock_signal) {
buf[3] = (buf[3] & 0b11110000) | ((adc_clock_signal) ? 0b1000 : 0);
}
/**
* change the recording channel bit in the instruction buffer.
*/
static void update_ins_rec_channel(uint8_t *buf, uint8 channel) {
buf[1] = (buf[1] & 0b00001111) | (encode_channel(channel) << 4);
}
/**
* change the stimulation enable bit in the instruction buffer.
*/
static void update_ins_sti_enable(uint8_t *buf, bool enable) {
buf[1] = (buf[1] & 0b11111101) | ((enable) ? 0b10 : 0);
}
/**
* change the stimulating channel bit in the instruction buffer.
*/
static void update_ins_sti_channel(uint8_t *buf, uint8 sti_chp, uint8 sti_chn) {
buf[2] = (buf[2] & 0b11110000) | encode_channel(sti_chp);
buf[3] = (buf[3] & 0b00001111) | (encode_channel(sti_chn) << 4);
}
static void update_ins_buffer() {
uint8 header = 0b10100000;
uint8 amp_gain = (INSTRUCTION.amp_gain & 0b11) << 3;
uint8 amp_lbf = INSTRUCTION.amp_low_band_freq & 0b111;
uint8 channel = 0; // should be call update_ins_channel to modify this value
uint8 chopper = (INSTRUCTION.chopper) ? 0b00001000 : 0;
uint8 fast_settle = (INSTRUCTION.fast_settle) ? 0b00000100 : 0;
uint8 sti_enable = (INSTRUCTION.work_mode != STI_MODE_DISABLE) ? 0b00000010 : 0;
uint8 sti_volt_l = (INSTRUCTION.sti_volt & 0b11111) >> 4;
uint8 sti_volt_h = (INSTRUCTION.sti_volt & 0b01111) << 4;
uint8 sti_chp = INSTRUCTION.sti_channel_pmos & 0b1111;
uint8 sti_chn = (INSTRUCTION.sti_channel_nmos & 0b1111) << 4;
uint8 clk_signal = 0; // should be call update_ins_clock to modify this value
spi_txbuf[0] = header | amp_gain | amp_lbf;
spi_txbuf[1] = channel | chopper | fast_settle | sti_enable | sti_volt_l;
spi_txbuf[2] = sti_volt_h | sti_chp;
spi_txbuf[3] = sti_chn | clk_signal;
}
static bool update_ins_rec_buffer() {
adc_clock_signal = (adc_clock_signal) ? FALSE : TRUE; // switch adc_clock
update_ins_rec_clock(spi_txbuf, adc_clock_signal);
if (adc_clock_signal) {
// change to next channel
if (next_active_channel()) {
update_ins_rec_channel(spi_txbuf, channel_pointer);
} else {
// no channel active
return false;
}
}
return true;
}
/**
* Change the instruction content for SPI buffer, which is depended on the
* work_mode. Expend the remind instruction according to the base instruction
* which allocated at the beginning 4 bytes of the SPI buffer.
*
* ========= ===========
* work_mode ins pattern
* ========= ===========
* POS, NEG 4 F D 0
* P2N, N2P 4 4' F D
* AWF not impl
* ========= ===========
*
* pattern *4*
* stimulation instruction.
*
* pattern *F*
* set pmos channel to 0xF, release the remain voltage in the capacitance.
*
* pattern *D*
* disable stimulation
*
* pattern *0*
* nop.
*
* @param: buf: pointer of the SPI buffer.
*/
static void update_ins_sti_buffer() {
switch (INSTRUCTION.work_mode) {
case STI_MODE_POS:
case STI_MODE_NEG:
// copy [4:7]
spi_txbuf[4] = spi_txbuf[0];
spi_txbuf[5] = spi_txbuf[1];
spi_txbuf[6] = spi_txbuf[2];
spi_txbuf[7] = spi_txbuf[3];
// copy [8:B]
spi_txbuf[8] = spi_txbuf[0];
spi_txbuf[9] = spi_txbuf[1];
spi_txbuf[10] = spi_txbuf[2];
spi_txbuf[11] = spi_txbuf[3];
// reset [C:F]
spi_txbuf[12] = 0;
spi_txbuf[13] = 0;
spi_txbuf[14] = 0;
spi_txbuf[15] = 0;
// change content
update_ins_sti_enable(spi_txbuf, TRUE);
// ins buf [4:7]
update_ins_sti_enable(spi_txbuf + 4, TRUE);
update_ins_sti_channel(spi_txbuf + 4, 0xF, INSTRUCTION.sti_channel_pmos);
// ins buf [8:B]
update_ins_sti_enable(spi_txbuf + 8, FALSE);
break;
case STI_MODE_P2N:
case STI_MODE_N2P:
// copy [4:7]
spi_txbuf[4] = spi_txbuf[0];
spi_txbuf[5] = spi_txbuf[1];
spi_txbuf[6] = spi_txbuf[2];
spi_txbuf[7] = spi_txbuf[3];
// copy [8:B]
spi_txbuf[8] = spi_txbuf[0];
spi_txbuf[9] = spi_txbuf[1];
spi_txbuf[10] = spi_txbuf[2];
spi_txbuf[11] = spi_txbuf[3];
// copy [C:F]
spi_txbuf[12] = spi_txbuf[0];
spi_txbuf[13] = spi_txbuf[1];
spi_txbuf[14] = spi_txbuf[2];
spi_txbuf[15] = spi_txbuf[3];
// change content
update_ins_sti_enable(spi_txbuf + 0, TRUE);
update_ins_sti_channel(spi_txbuf + 0, INSTRUCTION.sti_channel_pmos, INSTRUCTION.sti_channel_nmos);
// ins buf [4:7]
update_ins_sti_enable(spi_txbuf + 4, TRUE);
update_ins_sti_channel(spi_txbuf + 4, INSTRUCTION.sti_channel_nmos, INSTRUCTION.sti_channel_pmos);
// ins buf [8:B]
update_ins_sti_enable(spi_txbuf + 8, TRUE);
update_ins_sti_channel(spi_txbuf + 8, 0xF, INSTRUCTION.sti_channel_nmos);
// ins buf [C:F]
update_ins_sti_enable(spi_txbuf + 12, FALSE);
break;
case STI_MODE_AWF:
// XXX define the voltage change
break;
default:
// do nothing
break;
}
}
static void headstage_tni_update_instruction_callback(uint8_t ins_type, uint8_t ins_op, uint8_t ins_len, uint8_t *ins) {
switch (ins_type) {
case INS_TYPE_VIS: {
// reset
case VIS_RST:
// reset. reset all variable
adc_clock_signal = FALSE;
memset(spi_txbuf, 0, SPI_BUFFER_SIZE);
break;
// interrupt
case VIS_INT:
// stop. reset channel table
ramp_data_counter = 0;
memset(spi_txbuf, 0, SPI_BUFFER_SIZE);
break;
}
case INS_TYPE_RIS:
default:
break;
}
}
static uint8_t *spi_transact_rec_instruction() {
if (IS_REC_MODE(INSTRUCTION.work_mode)) {
PIN_setOutputValue(pin_handle, IOID_13, 1); // DBS_P2S turn on
headstage_spi_transaction(SPI_BUFFER_SIZE, spi_txbuf, spi_rxbuf);
PIN_setOutputValue(pin_handle, IOID_13, 0); // DBS_P2S turn off
} else if (IS_ARM_MODE(INSTRUCTION.work_mode) && !adc_clock_signal) {
create_ramp(spi_rxbuf);
}
if (adc_clock_signal) {
return NULL;
} else {
return spi_rxbuf;
}
}
static uint8_t *spi_transact_sti_instruction() {
headstage_spi_transaction(16, spi_txbuf, NULL);
return NULL;
}
#endif
@@ -60,8 +60,18 @@
#include <driverlib/ssi.h>
#include "board.h"
#include <ti/drivers/SPI.h>
#include <ti/drivers/PIN.h>
#include <ti/drivers/spi/SPICC26XXDMA.h>
#include <ti/drivers/dma/UDMACC26XX.h>
#include <ti/drivers/ADC.h>
#include "hci_tl.h"
#include "gatt.h"
@@ -96,12 +106,26 @@
#include "rcosc_calibration.h"
#endif // USE_RCOSC
#include <ti/mw/display/Display.h>
#include "board_key.h"
#include "board.h"
#include "simple_peripheral.h"
#include <xdc/runtime/Timestamp.h>
#include <ti/drivers/timer/GPTimerCC26XX.h>
#include <ti/drivers/PWM.h>
#include <driverlib/timer.h>
#include <xdc/runtime/Types.h>
#include <ti/sysbios/BIOS.h>
#include "headstage.h"
#if defined(USE_FPGA) || defined(DEBUG_SW_TRACE)
@@ -150,13 +174,14 @@
// Whether to enable automatic parameter update request when a connection is
// formed
#define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS // in throughput peripheral , this is false
// in throughput project , the periodic event will repeat every 102ms
#define DEFAULT_ENABLE_UPDATE_REQUEST GAPROLE_LINK_PARAM_UPDATE_INITIATE_BOTH_PARAMS
// Connection Pause Peripheral time value (in seconds)
#define DEFAULT_CONN_PAUSE_PERIPHERAL 2
// How often to perform periodic event (in msec)
#define SBP_PERIODIC_EVT_PERIOD 15
#ifdef FEATURE_OAD
// The size of an OAD packet.
#define OAD_PACKET_SIZE ((OAD_BLOCK_SIZE) + 2)
@@ -166,36 +191,38 @@
#define SBP_TASK_PRIORITY 1
#ifndef SBP_TASK_STACK_SIZE
#define SBP_TASK_STACK_SIZE 844
#define SBP_TASK_STACK_SIZE 644
#endif
// Internal Events for RTOS application
#ifndef RTOSPARA
#define RTOSPARA
#define SBP_STATE_CHANGE_EVT 0x0001
#define SBP_CHAR_CHANGE_EVT 0x0002
#define SBP_PERIODIC_EVT 0x0004
#define SBP_CONN_EVT_END_EVT 0x0008
#define SBP_KEY_CHANGE_EVT 0x0010
#endif
// Internal Events for RTOS application
#define SBP_GPTIMER_EVT 0x000F
// data length extension parameter
#define APP_SUGGESTED_PDU_SIZE 251
#define APP_SUGGESTED_TX_TIME 2120
// test for Data length extension
#define DLE_MAX_PDU_SIZE 251
#define DLE_MAX_TX_TIME 2120
#define DLE_MAX_TX_TIME 2120
#define DEFAULT_PDU_SIZE 27
#define DEFAULT_TX_TIME 328
// GATT notification don't need authenticated link
#define GATT_NO_AUTHENTICATION
#define DEFAULT_TX_TIME 328
#define TOTAL_PACKET_OVERHEAD 7
#define GATT_NO_AUTHENTICATION 0
//#define DEVICE_NAME "NeuliveSTI-v0.1"
//#define MAJOR_PRODUCT_NUMBER 1
//#define MINOR_PRODUCT_NUMBER 2
//#define MAJOR_VERSION_NUMBER 0
//#define MINOR_VERSION_NUMBER 1
#ifndef HEADSTAGE_H
static ICall_Semaphore semaphore;
#endif
/*********************************************************************
* TYPEDEFS
*/
@@ -209,17 +236,32 @@ typedef struct {
* GLOBAL VARIABLES
*/
// DBS reset pin
/*********************************************************************
* LOCAL VARIABLES
*/
/*============
==== SPI ====
===========*/
/* system use SPI parameters */
// Entity ID globally used to check for source and/or destination of messages
static ICall_EntityID selfEntity;
// Semaphore globally used to post events to the application thread
#ifndef HEADSTAGE_H
static ICall_Semaphore semaphore;
#endif
// Clock instances for internal periodic events.
static Clock_Struct periodicClock;
// Queue object used for app messages
static Queue_Struct appMsg;
@@ -231,13 +273,20 @@ static Queue_Struct oadQ;
static Queue_Handle hOadQ;
#endif // FEATURE_OAD
// events flag for internal application events.
static uint16_t events_gp;
static uint16_t events_gp_1;
static uint16_t events_stop;
static uint16_t events_stop_1;
// Task configuration
Task_Struct sbpTask;
Char sbpTaskStack[SBP_TASK_STACK_SIZE];
// Profile state and parameters
// static gaprole_States_t gapProfileState = GAPROLE_INIT;
// GAP - Advertisement data (max size = 31 bytes, though this is
// best kept short to conserve power while advertisting)
static uint8_t advertData[] = {
@@ -266,37 +315,59 @@ static uint8_t advertData[] = {
#endif // FEATURE_OAD_ONCHIP
};
// XXX GAP GATT Attributes
static uint8_t attDeviceName[GAP_DEVICE_NAME_LEN] = "Simple BLE Peripheral";
// Globals used for ATT Response retransmission
static gattMsgEvent_t *pAttRsp = NULL;
static uint8_t rspTxRetry = 0;
// Vars to keep track of active packet length settings
// static uint16_t txOctets = DEFAULT_PDU_SIZE;
// static uint16_t txTime = DEFAULT_TX_TIME;
/*********************************************************************
* LOCAL FUNCTIONS
*/
static void SimpleBLEPeripheral_init(void);
static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1);
static void SimpleBLEPeripheral_init(void);
static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1);
static uint8_t SimpleBLEPeripheral_processStackMsg(ICall_Hdr *pMsg);
static uint8_t SimpleBLEPeripheral_processGATTMsg(gattMsgEvent_t *pMsg);
static void SimpleBLEPeripheral_processAppMsg(sbpEvt_t *pMsg);
static void SimpleBLEPeripheral_processStateChangeEvt(gaprole_States_t newState);
static void SimpleBLEPeripheral_sendAttRsp(void);
static void SimpleBLEPeripheral_freeAttRsp(uint8_t status);
static void SimpleBLEPeripheral_stateChangeCB(gaprole_States_t newState);
static void SimpleBLEPeripheral_enqueueMsg(uint8_t event, uint8_t state);
static void SimpleBLEPeripheral_performPeriodicTask(uint8_t *rxbuf, uint8_t *txbuf);
static void SimpleBLEPeripheral_clockHandler(UArg arg);
static void SimpleBLEPeripheral_sendAttRsp(void);
static void SimpleBLEPeripheral_freeAttRsp(uint8_t status);
static void SimpleBLEPeripheral_stateChangeCB(gaprole_States_t newState);
#ifndef FEATURE_OAD_ONCHIP
static void SimpleBLEPeripheral_charValueChangeCB(uint8_t paramID);
#endif //! FEATURE_OAD_ONCHIP
static void SimpleBLEPeripheral_enqueueMsg(uint8_t event, uint8_t state);
#ifdef FEATURE_OAD
void SimpleBLEPeripheral_processOadWriteCB(uint8_t event, uint16_t connHandle, uint8_t *pData);
#endif // FEATURE_OAD
// ramp creator
static void create_ramp(uint8_t* buff);
// GPTimer
ICall_Semaphore semaphore;
//extern ICall_Semaphore semaphore;
static void NeuLiveSTI_collect_recording_data(uint8_t channel);
static void send_notify();
static void NeuLiveSTI_init();
static void GPTimer_SetFreq_2(uint32_t frequency, uint8_t p);
// SPI interface
static void headstage_instruction_update_handle(uint8_t characteristic);
/**
* signal of go/stop.
*/
/*********************************************************************
* EXTERN FUNCTIONS
*/
@@ -367,16 +438,6 @@ void SimpleBLEPeripheral_createTask(void) {
*
* @return None.
*/
// Clock instances for internal periodic events.
static void SimpleBLEPeripheral_clockHandler(UArg arg);
// Minimum connection interval (units of 1.25ms, 8=10ms) if automatic
// parameter update request is enabled
//#define DEFAULT_DESIRED_MIN_CONN_INTERVAL 80
// How often to perform periodic event (in msec)
#define SBP_PERIODIC_EVT_PERIOD 10 // 802 ~= 1 sec
static void SimpleBLEPeripheral_init(void) {
// ******************************************************************
// N0 STACK API CALLS CAN OCCUR BEFORE THIS CALL TO ICall_registerApp
@@ -385,6 +446,9 @@ static void SimpleBLEPeripheral_init(void) {
// so that the application can send and receive messages.
ICall_registerApp(&selfEntity, &semaphore);
/* NeuLiveSTI_spi_init();
GPTimer_init();
GPTimer_init_1();*/
#ifdef USE_RCOSC
RCOSC_enableCalibration();
#endif // USE_RCOSC
@@ -435,7 +499,7 @@ static void SimpleBLEPeripheral_init(void) {
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initialAdvertEnable);
GAPRole_SetParameter(GAPROLE_ADVERT_OFF_TIME, sizeof(uint16_t), &advertOffTime);
// GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(SCAN_RESP_DATA), SCAN_RESP_DATA);
// GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData);
GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData);
GAPRole_SetParameter(GAPROLE_PARAM_UPDATE_ENABLE, sizeof(uint8_t), &enableUpdateRequest);
@@ -446,7 +510,7 @@ static void SimpleBLEPeripheral_init(void) {
}
// Set the GAP Characteristics
// GGS_SetParameter(GGS_DEVICE_NAME_ATT, sizeof(DEVICE_NAME), DEVICE_NAME);
GGS_SetParameter(GGS_DEVICE_NAME_ATT, GAP_DEVICE_NAME_LEN, attDeviceName);
// Set advertising interval
{
@@ -536,41 +600,40 @@ static void SimpleBLEPeripheral_init(void) {
*
* @return None.
*/
// static Clock_Struct detectKeyClock;
// static void detectKey_clockHandler(UArg arg);
static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1) {
// Initialize application
SimpleBLEPeripheral_init();
headstage_init_device_info();
// headstage_gptimer_init();
ZM_init();
Elite_SPI_init();
uint8_t key = 0;
uint8_t counter6994 = 0;
bool EliteOn = 0;
Util_constructClock(&periodicClock, SimpleBLEPeripheral_clockHandler, SBP_PERIODIC_EVT_PERIOD, 0, false, SBP_PERIODIC_EVT); // create a clock clockduration = 42(~=0.01 sec)
Util_startClock(&periodicClock); // start the clock, timeup => call SimpleBLEPeripheral_clockHandler => wake up the device
// headstage_init();
NeuLiveSTI_init();
GPTimer_SetFreq_2(200,0);
// initialize the DBS reset pin
Test_handle = PIN_open(&Test_rst, Test);
PIN_setOutputValue(Test_handle, IOID_0, 0);
PIN_setOutputValue(Test_handle, IOID_1, 0);
PIN_setOutputValue(Test_handle, IOID_3, 1);
PIN_setOutputValue(Test_handle, IOID_5, 0);
PIN_setOutputValue(Test_handle, IOID_6, 0);
PIN_setOutputValue(Test_handle, IOID_10, 0);
PIN_setOutputValue(Test_handle, IOID_11, 0);
// Application main loops
for (;;) {
// Waits for a signal to the semaphore associated with the calling thread.
// Note that the semaphore associated with a thread is signaled when a
// message is queued to the message receive queue of the thread or when
// ICall_signal() function is called onto the semaphore.
ICall_Errno errno = ICall_wait(ICALL_TIMEOUT_FOREVER); // let errno wait for infinite time, if periodicClock time up then execute below code
ICall_Errno errno = ICall_wait(ICALL_TIMEOUT_FOREVER);
if (errno == ICALL_ERRNO_SUCCESS) {
ICall_EntityID dest;
ICall_ServiceEnum src;
ICall_HciExtEvt * pMsg = NULL;
if (ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) == ICALL_ERRNO_SUCCESS) { // if successfully retreived a meaasage from who?
if (ICall_fetchServiceMsg(&src, &dest, (void **)&pMsg) == ICALL_ERRNO_SUCCESS) {
uint8 safeToDealloc = TRUE;
if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) { // src: source id who sent the massage; dest: entity id of the destination of the massage
if ((src == ICALL_SERVICE_CLASS_BLE) && (dest == selfEntity)) {
ICall_Stack_Event *pEvt = (ICall_Stack_Event *)pMsg;
// Check for BLE stack events first
@@ -590,66 +653,20 @@ static void SimpleBLEPeripheral_taskFxn(UArg a0, UArg a1) {
}
}
// If RTOS queue is not empty, process app message. //RTOS is the OS on Elite
// If RTOS queue is not empty, process app message.
while (!Queue_empty(appMsgQueue)) {
sbpEvt_t *pMsg = (sbpEvt_t *)Util_dequeueMsg(appMsgQueue);
if (pMsg) {
// Process message.
// LED_color(0xf8, 0xfa, 0xfa, 0x0a); // orange LED
SimpleBLEPeripheral_processAppMsg(pMsg);
// Free the space from the message.
ICall_free(pMsg);
}
}
// headstage_gptimer_main_handle();
NeuLiveSTI_gptimer_main_handle();
if (!PeriodicEvent) { // if there is no periodic event
Util_startClock(&periodicClock); // manually restart the clock
key = PIN_getInputValue(switch_on);
if (EliteOn) {
if (counter6994 < 175) { // counter6994 enable a IC after 35 counts
counter6994++;
} else if (counter6994 == 175) {
PIN_setOutputValue(pin_handle, shutdown_6994, 1); // OFF = 1 => turn off 6994
// #ifdef ELITE_VERSION_1_4
// SPI_close(spiHandle0);
// I2Cinit();
// I2C_close(I2Chandle);
// spiHandle0 = SPI_open(Board_SPI0, &spiParams0); // LED SPI
// #endif
counter6994++;
}
EliteKeyPress(key);
} else {
EliteOn = TurnOnElite(key);
}
// if(DAC_reset) DAC_outputV(0x0000); //set DAC to 0v when no periodic event
} else { // if there is periodic event
Util_startClock(&periodicClock); // manually restart the clock
SimpleBLEPeripheral_performPeriodicTask();
key = PIN_getInputValue(switch_on);
EliteKeyPress(key); // onPress=> key = 0; 1.lighten LED 2.long press shut down 2650
}
}
// if(events & SBP_PERIODIC_EVT){
// Util_startClock(&periodicClock);
// events &= ~SBP_PERIODIC_EVT;
// // Perform periodic application task
// SimpleBLEPeripheral_performPeriodicTask();
// }
// if (events & SBP_PERIODIC_EVT)
// {
// events &= ~SBP_PERIODIC_EVT;
// Util_startClock(&periodicClock);
// Perform periodic application task
// SimpleBLEPeripheral_performPeriodicTask();
// }
// headstage_gptimer_main_handle();
#ifdef FEATURE_OAD
while (!Queue_empty(hOadQ)) {
@@ -695,15 +712,15 @@ static uint8_t SimpleBLEPeripheral_processStackMsg(ICall_Hdr *pMsg) {
case HCI_COMMAND_COMPLETE_EVENT_CODE:
// Process HCI Command Complete Event
break;
case HCI_BLE_HARDWARE_ERROR_EVENT_CODE: {
AssertHandler(HAL_ASSERT_CAUSE_HARDWARE_ERROR, 0);
break;
}
} break;
default:
break;
}
break;
}
} break;
default:
// do nothing
@@ -820,17 +837,13 @@ static void SimpleBLEPeripheral_freeAttRsp(uint8_t status) {
* @return None.
*/
static void SimpleBLEPeripheral_processAppMsg(sbpEvt_t *pMsg) {
// LED_color(0xFA, 0xF0, 0x00, 0xE0);
switch (pMsg->hdr.event) {
case SBP_STATE_CHANGE_EVT:
SimpleBLEPeripheral_processStateChangeEvt((gaprole_States_t)pMsg->hdr.state);
break;
case SBP_CHAR_CHANGE_EVT:
// headstage_instruction_update_handle(pMsg->hdr.state);
// LED_color(0xE6, 0xFF, 0xFA, 0x0A);
ZM_instruction_update_handle(pMsg->hdr.state);
headstage_instruction_update_handle(pMsg->hdr.state);
break;
default:
@@ -997,6 +1010,26 @@ static void SimpleBLEPeripheral_charValueChangeCB(uint8_t paramID) {
}
#endif //! FEATURE_OAD_ONCHIP
/*********************************************************************
* @fn SimpleBLEPeripheral_performPeriodicTask
*
* @brief Perform a periodic application task. This function gets called
* every five seconds (SBP_PERIODIC_EVT_PERIOD). In this example,
* the value of the third characteristic in the SimpleGATTProfile
* service is retrieved from the profile, and then copied into the
* value of the the fourth characteristic.
*
* @param None.
*
* @return None.
*/
static void SimpleBLEPeripheral_performPeriodicTask(uint8_t *rxbuf, uint8_t *txbuf) {
#ifndef FEATURE_OAD_ONCHIP
// Call to retrieve the value of the third characteristic in the profile
#endif //! FEATURE_OAD_ONCHIP
}
#ifdef FEATURE_OAD
/*********************************************************************
* @fn SimpleBLEPeripheral_processOadWriteCB
@@ -1024,13 +1057,30 @@ void SimpleBLEPeripheral_processOadWriteCB(uint8_t event, uint16_t connHandle, u
Queue_put(hOadQ, (Queue_Elem *)oadWriteEvt);
// Post the application's semaphore.
Semaphore_post(semaphore);
Semaphore_post(sem);
} else {
// Fail silently.
}
}
#endif // FEATURE_OAD
/*********************************************************************
* @fn SimpleBLEPeripheral_clockHandler
*
* @brief Handler function for clock timeouts.
*
* @param arg - event type
*
* @return None.
*/
static void SimpleBLEPeripheral_clockHandler(UArg arg) {
// Store the event.
// events |= arg;
// Wake up the application.
Semaphore_post(semaphore);
}
/*********************************************************************
* @fn SimpleBLEPeripheral_enqueueMsg
*
@@ -1053,3 +1103,451 @@ static void SimpleBLEPeripheral_enqueueMsg(uint8_t event, uint8_t state) {
Util_enqueueMsg(appMsgQueue, semaphore, (uint8 *)pMsg);
}
}
/*********************************************************************
*********************************************************************/
/*
**Chip Parameter Specification**
======================= =============================
parameter value range
======================= =============================
sampling rate 10K .. 180k Hz / channel
recording channel 1, 4, 8, 16
AMP Gain 400, 1000, 2000
AMP Fast Settling Time 1 us
Stimulation voltage 2V .. 5V
Stimulation pulse width 40 us .. 490 us (50 us/step)
Stimulation pulse shape POS, NEG, P2N, N2P, AWF
Stimulation pulse times 1 .. 253 (4 times/step)
Stimulation pulse freq 30 .. 10K Hz
======================= =============================
*/
/*
**Instruction Specification**
::
| | 1 | 2 | 3 |
012345678901234567890123456789012
---------------------------------
|RIS|ID | |LEN| ............. | real instruction send
|VIS|ID |OP |LEN| ............. | virtual instruction send
|VDR|ID |length | data | data receive
H
header
ID
chip ID
RIS
real instruction type
VIS
virtual instruction type
OP
virtual instruction
LEN, length
command length in bytes
TYP_RIS = 0b0011_0000 # 3x
TYP_VIS = 0b1100_0000 # Cx
TYP_VDR = 0b1010_0000 # Ax
VIS_RST = 0b1111_0000 # Fx reset
VIS_ASK = 0b0011_0000 # 3x ask in
VIS_STI = 0b1100_0000 # Cx stimulate
VIS_FUH = 0b1001_0000 # 9x flush
VIS_INT = 0b0110_0000 # 6x interrupt
*/
/*
Head Stage TNI
**Head Stage TNI Specification**
serial send ::
| | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
-----------------------------------------------------------------
|HEAD | -----------------------------------------³W-------------- |
|0b100| | MOD | RATE |a|b|c|d| CH[a] | CH[b] | CH[c] | CH[d] | artifact recording mode
|0b101|AGN| LBF | AMP |C|F|S| SVT | SCH_P | SCH_N |A| | actually instruction send to DBS
|0b101|AGN| LBF | AMP |C|F|S| SVT | SCH_P | SCH_N | RATE | direct command
|0b110|AGN| LBF | RATE |a|b|c|d| CH[a] | CH[b] | CH[c] | CH[d] | recording command
|0b111|SUB| --------------------------------------------------- | stimulation command
|0b111|00 |MODE | FREQ |C|F| | CH[p] | CH[n] | voltage | | simple stimulation command
|0b111|01 |P| m | pw | V | ch | FREQ | continuous stimulation freq(2kHz)
|0b111|10 | | (reserved)
|0b111|11 |00 | current_control | NeuLiveSTI global
|0b111|11 |01 |s_ch |P| m | FREQ | pw | pw_IPI | sti_num | NeuLiveSTI
|0b111|11 |10 |z|O|2|3|4|5|6|7|8|9|a|b|c|s|e|f| channel enable
|0b001|11-|11-|----------------------------------------------- | present information report
|0b010| ------------------------------------------------------ | (reserved)
|0b011| ------------------------------------------------------ | (reserved)
HEAD
instruction type header.
MOD
in artifact recording mode. select which wave from should be generated/
====== ===========
value description
====== ===========
0b0001 ramp
====== ===========
SUB
stimulation instruction sub-type.
AGN
amp gain
LBF
low frequency band [1]_
AMP
amp mux channel.
C
chopper clock enable
F
fast settling enable
SVT, voltage
stimulation voltage which value from 2V (0b11111) to 5V (0b00000) [1]_
SCH_P
stimulation for PMOS
SCH_N
stimulation for NMOS
RATE
ADC clock sample rate (index to a value table), used for slave side chip.
FREQ
frequency.
when ``SUB != 0b01`` (not continuous stimulation frequency mode),
the value means the index to the value table.
when ``SUB == 0b01`` (continuous stimulation frequency mode),
the value means the frequency value with 10 PREC-th power.
A
ADC clock signal, used for headstage
a, b, c, d
flag of field CH whether it is present or not.
p, n
PMOS and NMOS flag, work same as a, b, c and d.
CH[*]
channel number
MODE/m
stimulation mode
====== ============================
value description
====== ============================
MODE
0x000 DISABLE
0x001 POS. positive pulse
0x010 NEG. negative pulse
0x011 P2N. positive to negative
0x100 N2P. negative to positive
0x101 AWF. arbitrary waveform
0x110 (reserved)
0x111 (reserved)
m
0x01 POS. positive pulse
0x10 NEG. negative pulse
0x11 P2N. positive to negative
0x00 AWF. arbitrary waveform
====== ============================
PC
stimulation frequency precision.
====== ==================
value description
====== ==================
0x0 1 Hz
0x1 0.1 Hz
====== ==================
.. [1] : little-endian.
Arbitrary Waveform send (proposal) ::
| | 1 | 2 | 3 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
-----------------------------------------------------------------
|HEAD | ------------------------------------------------------- |
|0b001| |FLAG | -------------------------------------------- | AWF
|0b001| |0x00 | AWF reset
|0b001| |0x01 | index | CH[p] | CH[n] | voltage | | AWF set
FLAG
arbitrary waveform voltage data transmit flag.
====== =======================
value description
====== =======================
0x000 reset awf. (length=1)
0x001 set raw data
0x010 (reserved)
0x011 (reserved)
0x100 (reserved)
0x101 (reserved)
0x110 (reserved)
0x111 (reserved)
====== =======================
serial receive ::
| | 1 | 2 | 3 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
-----------------------------------------------------------------
| HEAD|E| data | .................................. received content from DBS
| CH | data | F | .............................. data in notify content
HEAD
0b101
E
EOC flag
CH
channel
data
data
F
flag
======= =======
F value mean
======= =======
0x00 success
0x11 invalid
======= =======
notify content::
follow the struct _NOTIFY_BUFFER.
| | 1 | 2 | 3 |
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
-----------------------------------------------------------------
| chip ID | data length |
| cpu time (little endian) |
| time delta | CH | data | F |
| ............................................................. |
data length
byte counter from cpu time to end.
cpu time
first data time
time delta
time difference to the previous data.
buffer size
6 + 3 * N, could be 9, 12, 15, 18, 21
*/
/*
working flow
SBP_SPI_init
SPI_init
SPI_open
GP Timer event
SBP_SPI_handle
[when recording mode]
update_ins_clock
SBP_next_recording_channel
update_ins_channel
SBP_SPI_transaction_recording
SPI_transfer [spi_txbuf -> DBS -> spi_rxbuf]
SBP_collect_recording_data
[spi_rxbuf -> not_buf]
SBP_send_notify
SimpleProfile_SetParameter(4) [not_buf -> characteristic 4]
[when stimulation mode]
update_ins_stimulation_enable
update_sti_mode
SBP_SPI_transaction_stimulating
SPI_transfer
characteristic update event
SBP_instruction_update_handle
SimpleProfile_GetParameter(3) [characteristic 3 -> ins_buf]
update_table [ins_buf -> INSTRUCTION] [switch]
[case] decode_direct_instruction
[case] decode_recording_instruction
[case] decode_stimulating_instruction
[case] VIS_RST
[case] VIS_INT
update_clock_period
update_ins_buffer [INSTRUCTION -> spi_txbuf]
*/
#define UMC_PREAMBLE 0b0_0000_1100_0101
#define UMC_HEADER 0b0101
#define UMC_HANDSHAKE 0b00_1100_0011
#define UMC_REPLY 0b00_1100_0110
/* application use SPI parameters and buffers */
/**
* application use instruction receive buffer.
* the length equals to the characteristic 3 which value is 12 bytes.
*/
/**
* notify data buffer.
* the length equals to the characteristic 4 which value is 20 bytes.
* the data storage follow the struct _NOTIFY_BUFFER
*
*/
#if FALSE
struct _NOTIFY_BUFFER {
uint8_t chip_id;
/**
* data size
*/
uint8_t size;
/**
* cpu time present in little endian
*/
uint32_t cpu_time;
struct _RAW_DATA {
/**
* cpu time delta
*/
uint8_t delta;
/**
* u4 channel
* u10 raw data
* u2 flag
*/
uint16_t value;
} data[4 /* size */];
};
#endif
/**
* ADC clock switch signal.
*/
static bool adc_clock_signal = FALSE;
/**
* counter of notify send.
*/
static uint16_t ramp_data_counter = 0;
static void create_ramp(uint8_t* buff)
{
buff[0] = 0b10110000 | (0b00001111 & (uint8_t)(ramp_data_counter >> 6));
buff[1] = (uint8_t)(ramp_data_counter << 2);
ramp_data_counter += 1;
}
/**
* Change the instruction content for SPI buffer, which is depended on the
* work_mode. Expend the remind instruction according to the base instruction
* which allocated at the beginning 4 bytes of the SPI buffer.
*
* ========= ===========
* work_mode ins pattern
* ========= ===========
* POS, NEG 4 F D 0
* P2N, N2P 4 4' F D
* AWF not impl
* ========= ===========
*
* pattern *4*
* stimulation instruction.
*
* pattern *F*
* set pmos channel to 0xF, release the remain voltage in the capacitance.
*
* pattern *D*
* disable stimulation
*
* pattern *0*
* nop.
*
* @param: buf: pointer of the SPI buffer.
*/
/**
* update the instruction buffer.
*/
#define INS_TYPE_RIS 0b00110000
#define INS_TYPE_VIS 0b11000000
#define VIS_RST 0b11110000
#define VIS_ASK 0b00110000
#define VIS_STI 0b11000000
#define VIS_FUH 0b10010000
#define VIS_INT 0b01100000
#define HDR_DIR 0b10100000
#define HDR_REC 0b11000000
#define HDR_ARM 0b10000000
#define HDR_STI 0b11100000
#define HDR_AWF 0b00100000
/**
* move data from spi_rxbuf to not_buf. If not_buf is full, send notify.
*/
@@ -50,14 +50,14 @@
*/
#include <string.h>
#include "att.h"
#include "bcomdef.h"
#include "gapbondmgr.h"
#include "osal.h"
#include "linkdb.h"
#include "att.h"
#include "gatt.h"
#include "gatt_uuid.h"
#include "gattservapp.h"
#include "linkdb.h"
#include "osal.h"
#include "gapbondmgr.h"
#include "simple_gatt_profile.h"
@@ -69,7 +69,7 @@
* CONSTANTS
*/
#define SERVAPP_NUM_ATTR_SUPPORTED 17
#define SERVAPP_NUM_ATTR_SUPPORTED 17
/*********************************************************************
* TYPEDEFS
@@ -79,22 +79,40 @@
* GLOBAL VARIABLES
*/
// Simple GATT Profile Service UUID: 0xFFF0
CONST uint8 simpleProfileServUUID[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID)};
CONST uint8 simpleProfileServUUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_SERV_UUID), HI_UINT16(SIMPLEPROFILE_SERV_UUID)
};
// Characteristic 1 UUID: 0xFFF1
CONST uint8 simpleProfilechar1UUID[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_CHAR1_UUID), HI_UINT16(SIMPLEPROFILE_CHAR1_UUID)};
CONST uint8 simpleProfilechar1UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR1_UUID), HI_UINT16(SIMPLEPROFILE_CHAR1_UUID)
};
// Characteristic 2 UUID: 0xFFF2
CONST uint8 simpleProfilechar2UUID[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_CHAR2_UUID), HI_UINT16(SIMPLEPROFILE_CHAR2_UUID)};
CONST uint8 simpleProfilechar2UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR2_UUID), HI_UINT16(SIMPLEPROFILE_CHAR2_UUID)
};
// Characteristic 3 UUID: 0xFFF3
CONST uint8 simpleProfilechar3UUID[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_CHAR3_UUID), HI_UINT16(SIMPLEPROFILE_CHAR3_UUID)};
CONST uint8 simpleProfilechar3UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR3_UUID), HI_UINT16(SIMPLEPROFILE_CHAR3_UUID)
};
// Characteristic 4 UUID: 0xFFF4
CONST uint8 simpleProfilechar4UUID[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_CHAR4_UUID), HI_UINT16(SIMPLEPROFILE_CHAR4_UUID)};
CONST uint8 simpleProfilechar4UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR4_UUID), HI_UINT16(SIMPLEPROFILE_CHAR4_UUID)
};
// Characteristic 5 UUID: 0xFFF5
CONST uint8 simpleProfilechar5UUID[ATT_BT_UUID_SIZE] = {LO_UINT16(SIMPLEPROFILE_CHAR5_UUID), HI_UINT16(SIMPLEPROFILE_CHAR5_UUID)};
CONST uint8 simpleProfilechar5UUID[ATT_BT_UUID_SIZE] =
{
LO_UINT16(SIMPLEPROFILE_CHAR5_UUID), HI_UINT16(SIMPLEPROFILE_CHAR5_UUID)
};
/*********************************************************************
* EXTERNAL VARIABLES
@@ -115,18 +133,19 @@ static simpleProfileCBs_t *simpleProfile_AppCBs = NULL;
*/
// Simple Profile Service attribute
static CONST gattAttrType_t simpleProfileService = {ATT_BT_UUID_SIZE, simpleProfileServUUID};
static CONST gattAttrType_t simpleProfileService = { ATT_BT_UUID_SIZE, simpleProfileServUUID };
// Simple Profile Characteristic 1 Properties
static uint8 simpleProfileChar1Props = GATT_PROP_READ;
// Characteristic 1 Value
#define SIMPLEPROFILE_CHAR1_LEN 20
static uint8 simpleProfileChar1[SIMPLEPROFILE_CHAR1_LEN] = {0};
// Simple Profile Characteristic 1 User Description
static uint8 simpleProfileChar1UserDesp[17] = "Characteristic 1";
// Simple Profile Characteristic 2 Properties
static uint8 simpleProfileChar2Props = GATT_PROP_READ;
@@ -136,6 +155,7 @@ static uint8 simpleProfileChar2[SIMPLEPROFILE_CHAR2_LEN] = {0};
// Simple Profile Characteristic 2 User Description
static uint8 simpleProfileChar2UserDesp[17] = "Characteristic 2";
// Simple Profile Characteristic 3 Properties
static uint8 simpleProfileChar3Props = GATT_PROP_WRITE;
@@ -145,6 +165,7 @@ static uint8 simpleProfileChar3[SIMPLEPROFILE_CHAR3_LEN] = {0};
// Simple Profile Characteristic 3 User Description
static uint8 simpleProfileChar3UserDesp[17] = "Characteristic 3";
// Simple Profile Characteristic 4 Properties
static uint8 simpleProfileChar4Props = GATT_PROP_NOTIFY;
@@ -160,11 +181,12 @@ static gattCharCfg_t *simpleProfileChar4Config;
// Simple Profile Characteristic 4 User Description
static uint8 simpleProfileChar4UserDesp[17] = "Characteristic 4";
// Simple Profile Characteristic 5 Properties
static uint8 simpleProfileChar5Props = GATT_PROP_READ;
static uint8 simpleProfileChar5Props = GATT_PROP_READ | GATT_PROP_WRITE;
// Characteristic 5 Value
static uint8 simpleProfileChar5[SIMPLEPROFILE_CHAR5_LEN] = {0, 0, 0, 0, 0};
static uint8 simpleProfileChar5[SIMPLEPROFILE_CHAR5_LEN] = { 0 };
// Simple Profile Characteristic 5 User Description
static uint8 simpleProfileChar5UserDesp[17] = "Characteristic 5";
@@ -173,69 +195,157 @@ static uint8 simpleProfileChar5UserDesp[17] = "Characteristic 5";
* Profile Attributes - Table
*/
static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] = {
// Simple Profile Service
{
{ATT_BT_UUID_SIZE, primaryServiceUUID}, /* type */
GATT_PERMIT_READ, /* permissions */
0, /* handle */
(uint8 *)&simpleProfileService /* pValue */
},
static gattAttribute_t simpleProfileAttrTbl[SERVAPP_NUM_ATTR_SUPPORTED] =
{
// Simple Profile Service
{
{ ATT_BT_UUID_SIZE, primaryServiceUUID }, /* type */
GATT_PERMIT_READ, /* permissions */
0, /* handle */
(uint8 *)&simpleProfileService /* pValue */
},
// Characteristic 1 Declaration
{{ATT_BT_UUID_SIZE, characterUUID}, GATT_PERMIT_READ, 0, &simpleProfileChar1Props},
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar1Props
},
// Characteristic Value 1
{{ATT_BT_UUID_SIZE, simpleProfilechar1UUID}, GATT_PERMIT_READ, 0, simpleProfileChar1},
// Characteristic Value 1
{
{ ATT_BT_UUID_SIZE, simpleProfilechar1UUID },
GATT_PERMIT_READ,
0,
simpleProfileChar1
},
// Characteristic 1 User Description
{{ATT_BT_UUID_SIZE, charUserDescUUID}, GATT_PERMIT_READ, 0, simpleProfileChar1UserDesp},
// Characteristic 1 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar1UserDesp
},
// Characteristic 2 Declaration
{{ATT_BT_UUID_SIZE, characterUUID}, GATT_PERMIT_READ, 0, &simpleProfileChar2Props},
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar2Props
},
// Characteristic Value 2
{{ATT_BT_UUID_SIZE, simpleProfilechar2UUID}, GATT_PERMIT_READ, 0, simpleProfileChar2},
// Characteristic Value 2
{
{ ATT_BT_UUID_SIZE, simpleProfilechar2UUID },
GATT_PERMIT_READ,
0,
simpleProfileChar2
},
// Characteristic 2 User Description
{{ATT_BT_UUID_SIZE, charUserDescUUID}, GATT_PERMIT_READ, 0, simpleProfileChar2UserDesp},
// Characteristic 2 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar2UserDesp
},
// Characteristic 3 Declaration
{{ATT_BT_UUID_SIZE, characterUUID}, GATT_PERMIT_READ, 0, &simpleProfileChar3Props},
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar3Props
},
// Characteristic Value 3
{{ATT_BT_UUID_SIZE, simpleProfilechar3UUID}, GATT_PERMIT_WRITE, 0, simpleProfileChar3},
// Characteristic Value 3
{
{ ATT_BT_UUID_SIZE, simpleProfilechar3UUID },
GATT_PERMIT_WRITE,
0,
simpleProfileChar3
},
// Characteristic 3 User Description
{{ATT_BT_UUID_SIZE, charUserDescUUID}, GATT_PERMIT_READ, 0, simpleProfileChar3UserDesp},
// Characteristic 3 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar3UserDesp
},
// Characteristic 4 Declaration
{{ATT_BT_UUID_SIZE, characterUUID}, GATT_PERMIT_READ, 0, &simpleProfileChar4Props},
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar4Props
},
// Characteristic Value 4
{{ATT_BT_UUID_SIZE, simpleProfilechar4UUID}, 0, 0, simpleProfileChar4},
// Characteristic Value 4
{
{ ATT_BT_UUID_SIZE, simpleProfilechar4UUID },
0,
0,
simpleProfileChar4
},
// Characteristic 4 configuration
{{ATT_BT_UUID_SIZE, clientCharCfgUUID}, GATT_PERMIT_READ | GATT_PERMIT_WRITE, 0, (uint8 *)&simpleProfileChar4Config},
// Characteristic 4 configuration
{
{ ATT_BT_UUID_SIZE, clientCharCfgUUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
(uint8 *)&simpleProfileChar4Config
},
// Characteristic 4 User Description
{{ATT_BT_UUID_SIZE, charUserDescUUID}, GATT_PERMIT_READ, 0, simpleProfileChar4UserDesp},
// Characteristic 4 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar4UserDesp
},
// Characteristic 5 Declaration
{{ATT_BT_UUID_SIZE, characterUUID}, GATT_PERMIT_READ, 0, &simpleProfileChar5Props},
{
{ ATT_BT_UUID_SIZE, characterUUID },
GATT_PERMIT_READ,
0,
&simpleProfileChar5Props
},
// Characteristic Value 5
{{ATT_BT_UUID_SIZE, simpleProfilechar5UUID}, GATT_PERMIT_AUTHEN_READ, 0, simpleProfileChar5},
// Characteristic Value 5
{
{ ATT_BT_UUID_SIZE, simpleProfilechar5UUID },
GATT_PERMIT_READ | GATT_PERMIT_WRITE,
0,
simpleProfileChar5
},
// Characteristic 5 User Description
{{ATT_BT_UUID_SIZE, charUserDescUUID}, GATT_PERMIT_READ, 0, simpleProfileChar5UserDesp},
// Characteristic 5 User Description
{
{ ATT_BT_UUID_SIZE, charUserDescUUID },
GATT_PERMIT_READ,
0,
simpleProfileChar5UserDesp
},
};
/*********************************************************************
* LOCAL FUNCTIONS
*/
static bStatus_t simpleProfile_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method);
static bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, uint16_t len, uint16_t offset, uint8_t method);
static bStatus_t simpleProfile_ReadAttrCB(uint16_t connHandle,
gattAttribute_t *pAttr,
uint8_t *pValue, uint16_t *pLen,
uint16_t offset, uint16_t maxLen,
uint8_t method);
static bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle,
gattAttribute_t *pAttr,
uint8_t *pValue, uint16_t len,
uint16_t offset, uint8_t method);
/*********************************************************************
* PROFILE CALLBACKS
@@ -249,10 +359,11 @@ static bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle, gattAttribute_t
// pfnAuthorizeAttrCB to check a client's authorization prior to calling
// pfnReadAttrCB or pfnWriteAttrCB, so no checks for authorization need to be
// made within these functions.
CONST gattServiceCBs_t simpleProfileCBs = {
simpleProfile_ReadAttrCB, // Read callback function pointer
simpleProfile_WriteAttrCB, // Write callback function pointer
NULL // Authorization callback function pointer
CONST gattServiceCBs_t simpleProfileCBs =
{
simpleProfile_ReadAttrCB, // Read callback function pointer
simpleProfile_WriteAttrCB, // Write callback function pointer
NULL // Authorization callback function pointer
};
/*********************************************************************
@@ -270,26 +381,35 @@ CONST gattServiceCBs_t simpleProfileCBs = {
*
* @return Success or Failure
*/
bStatus_t SimpleProfile_AddService(uint32 services) {
uint8 status;
bStatus_t SimpleProfile_AddService( uint32 services )
{
uint8 status;
// Allocate Client Characteristic Configuration table
simpleProfileChar4Config = (gattCharCfg_t *)ICall_malloc(sizeof(gattCharCfg_t) * linkDBNumConns);
if (simpleProfileChar4Config == NULL) {
return (bleMemAllocError);
}
// Allocate Client Characteristic Configuration table
simpleProfileChar4Config = (gattCharCfg_t *)ICall_malloc( sizeof(gattCharCfg_t) *
linkDBNumConns );
if ( simpleProfileChar4Config == NULL )
{
return ( bleMemAllocError );
}
// Initialize Client Characteristic Configuration attributes
GATTServApp_InitCharCfg(INVALID_CONNHANDLE, simpleProfileChar4Config);
// Initialize Client Characteristic Configuration attributes
GATTServApp_InitCharCfg( INVALID_CONNHANDLE, simpleProfileChar4Config );
if (services & SIMPLEPROFILE_SERVICE) {
// Register GATT attribute list and CBs with GATT Server App
status = GATTServApp_RegisterService(simpleProfileAttrTbl, GATT_NUM_ATTRS(simpleProfileAttrTbl), GATT_MAX_ENCRYPT_KEY_SIZE, &simpleProfileCBs);
} else {
status = SUCCESS;
}
if ( services & SIMPLEPROFILE_SERVICE )
{
// Register GATT attribute list and CBs with GATT Server App
status = GATTServApp_RegisterService( simpleProfileAttrTbl,
GATT_NUM_ATTRS( simpleProfileAttrTbl ),
GATT_MAX_ENCRYPT_KEY_SIZE,
&simpleProfileCBs );
}
else
{
status = SUCCESS;
}
return (status);
return ( status );
}
/*********************************************************************
@@ -302,14 +422,18 @@ bStatus_t SimpleProfile_AddService(uint32 services) {
*
* @return SUCCESS or bleAlreadyInRequestedMode
*/
bStatus_t SimpleProfile_RegisterAppCBs(simpleProfileCBs_t *appCallbacks) {
if (appCallbacks) {
simpleProfile_AppCBs = appCallbacks;
bStatus_t SimpleProfile_RegisterAppCBs( simpleProfileCBs_t *appCallbacks )
{
if ( appCallbacks )
{
simpleProfile_AppCBs = appCallbacks;
return (SUCCESS);
} else {
return (bleAlreadyInRequestedMode);
}
return ( SUCCESS );
}
else
{
return ( bleAlreadyInRequestedMode );
}
}
/*********************************************************************
@@ -326,61 +450,77 @@ bStatus_t SimpleProfile_RegisterAppCBs(simpleProfileCBs_t *appCallbacks) {
*
* @return bStatus_t
*/
bStatus_t SimpleProfile_SetParameter(uint8 param, uint8 len, void *value) {
bStatus_t ret = SUCCESS;
switch (param) {
bStatus_t SimpleProfile_SetParameter( uint8 param, uint8 len, void *value )
{
bStatus_t ret = SUCCESS;
switch ( param )
{
case SIMPLEPROFILE_CHAR1:
if (len <= SIMPLEPROFILE_CHAR1_LEN) {
memcpy(simpleProfileChar1, value, len);
// simpleProfileChar1 = *((uint8*)value);
} else {
ret = bleInvalidRange;
}
break;
if ( len <= SIMPLEPROFILE_CHAR1_LEN )
{
memcpy(simpleProfileChar1,value,len);
}
else
{
ret = bleInvalidRange;
}
break;
case SIMPLEPROFILE_CHAR2:
if (len <= SIMPLEPROFILE_CHAR2_LEN) {
memcpy(simpleProfileChar2, value, len);
// simpleProfileChar2 = *((uint8*)value);
} else {
ret = bleInvalidRange;
}
break;
if ( len <= SIMPLEPROFILE_CHAR2_LEN )
{
memcpy(simpleProfileChar2,value,len);
}
else
{
ret = bleInvalidRange;
}
break;
case SIMPLEPROFILE_CHAR3:
if (len <= SIMPLEPROFILE_CHAR3_LEN) {
memcpy(simpleProfileChar3, value, len);
} else {
ret = bleInvalidRange;
}
break;
if ( len <= SIMPLEPROFILE_CHAR3_LEN )
{
memcpy(simpleProfileChar3,value,len);
}
else
{
ret = bleInvalidRange;
}
break;
case SIMPLEPROFILE_CHAR4:
if (len <= SIMPLEPROFILE_CHAR4_LEN) {
memcpy(simpleProfileChar4, value, len);
if ( len <= SIMPLEPROFILE_CHAR4_LEN )
{
memcpy( simpleProfileChar4, value, len);
// See if Notification has been enabled
GATTServApp_ProcessCharCfg(simpleProfileChar4Config, simpleProfileChar4, FALSE, simpleProfileAttrTbl, GATT_NUM_ATTRS(simpleProfileAttrTbl), INVALID_TASK_ID, simpleProfile_ReadAttrCB);
} else {
ret = bleInvalidRange;
}
break;
// See if Notification has been enabled
GATTServApp_ProcessCharCfg( simpleProfileChar4Config, simpleProfileChar4, FALSE,
simpleProfileAttrTbl, GATT_NUM_ATTRS( simpleProfileAttrTbl ),
INVALID_TASK_ID, simpleProfile_ReadAttrCB );
}
else
{
ret = bleInvalidRange;
}
break;
case SIMPLEPROFILE_CHAR5:
if (len == SIMPLEPROFILE_CHAR5_LEN) {
VOID memcpy(simpleProfileChar5, value, SIMPLEPROFILE_CHAR5_LEN);
} else {
ret = bleInvalidRange;
}
break;
if ( len <= SIMPLEPROFILE_CHAR5_LEN )
{
memcpy( simpleProfileChar5, value, SIMPLEPROFILE_CHAR5_LEN );
}
else
{
ret = bleInvalidRange;
}
break;
default:
ret = INVALIDPARAMETER;
break;
}
ret = INVALIDPARAMETER;
break;
}
return (ret);
return ( ret );
}
/*********************************************************************
@@ -396,37 +536,37 @@ bStatus_t SimpleProfile_SetParameter(uint8 param, uint8 len, void *value) {
*
* @return bStatus_t
*/
bStatus_t SimpleProfile_GetParameter(uint8 param, void *value) {
bStatus_t ret = SUCCESS;
switch (param) {
bStatus_t SimpleProfile_GetParameter( uint8 param, void *value )
{
bStatus_t ret = SUCCESS;
switch ( param )
{
case SIMPLEPROFILE_CHAR1:
memcpy(value, simpleProfileChar1, SIMPLEPROFILE_CHAR1_LEN);
// *((uint8*)value) = simpleProfileChar1;
break;
memcpy( value, simpleProfileChar1, SIMPLEPROFILE_CHAR1_LEN );
break;
case SIMPLEPROFILE_CHAR2:
memcpy(value, simpleProfileChar2, SIMPLEPROFILE_CHAR2_LEN);
// *((uint8*)value) = simpleProfileChar2;
break;
memcpy( value, simpleProfileChar2, SIMPLEPROFILE_CHAR2_LEN );
break;
case SIMPLEPROFILE_CHAR3:
memcpy(value, simpleProfileChar3, SIMPLEPROFILE_CHAR3_LEN);
break;
memcpy( value, simpleProfileChar3, SIMPLEPROFILE_CHAR3_LEN );
break;
case SIMPLEPROFILE_CHAR4:
memcpy(value, simpleProfileChar4, SIMPLEPROFILE_CHAR4_LEN);
break;
memcpy( value, simpleProfileChar4, SIMPLEPROFILE_CHAR4_LEN );
break;
case SIMPLEPROFILE_CHAR5:
VOID memcpy(value, simpleProfileChar5, SIMPLEPROFILE_CHAR5_LEN);
break;
memcpy( value, simpleProfileChar5, SIMPLEPROFILE_CHAR5_LEN );
break;
default:
ret = INVALIDPARAMETER;
break;
}
ret = INVALIDPARAMETER;
break;
}
return (ret);
return ( ret );
}
/*********************************************************************
@@ -444,62 +584,66 @@ bStatus_t SimpleProfile_GetParameter(uint8 param, void *value) {
*
* @return SUCCESS, blePending or Failure
*/
static bStatus_t simpleProfile_ReadAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, uint16_t *pLen, uint16_t offset, uint16_t maxLen, uint8_t method) {
bStatus_t status = SUCCESS;
static bStatus_t simpleProfile_ReadAttrCB(uint16_t connHandle,
gattAttribute_t *pAttr,
uint8_t *pValue, uint16_t *pLen,
uint16_t offset, uint16_t maxLen,
uint8_t method)
{
bStatus_t status = SUCCESS;
// Make sure it's not a blob operation (no attributes in the profile are long)
if (offset > 0) {
return (ATT_ERR_ATTR_NOT_LONG);
// Make sure it's not a blob operation (no attributes in the profile are long)
if ( offset > 0 )
{
return ( ATT_ERR_ATTR_NOT_LONG );
}
if ( pAttr->type.len == ATT_BT_UUID_SIZE )
{
// 16-bit UUID
uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);
switch ( uuid )
{
// No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases;
// gattserverapp handles those reads
// characteristics 1 and 2 have read permissions
// characteritisc 3 does not have read permissions; therefore it is not
// included here
// characteristic 4 does not have read permissions, but because it
// can be sent as a notification, it is included here
case SIMPLEPROFILE_CHAR1_UUID:
*pLen = SIMPLEPROFILE_CHAR1_LEN;
VOID memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR1_LEN );
break;
case SIMPLEPROFILE_CHAR2_UUID:
*pLen = SIMPLEPROFILE_CHAR2_LEN;
VOID memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR2_LEN );
break;
case SIMPLEPROFILE_CHAR4_UUID:
*pLen = SIMPLEPROFILE_CHAR4_LEN;
VOID memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR4_LEN );
break;
case SIMPLEPROFILE_CHAR5_UUID:
*pLen = SIMPLEPROFILE_CHAR5_LEN;
VOID memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR5_LEN );
break;
default:
// Should never get here! (characteristics 3 and 4 do not have read permissions)
*pLen = 0;
status = ATT_ERR_ATTR_NOT_FOUND;
break;
}
}
else
{
// 128-bit UUID
*pLen = 0;
status = ATT_ERR_INVALID_HANDLE;
}
if (pAttr->type.len == ATT_BT_UUID_SIZE) {
// 16-bit UUID
uint16 uuid = BUILD_UINT16(pAttr->type.uuid[0], pAttr->type.uuid[1]);
switch (uuid) {
// No need for "GATT_SERVICE_UUID" or "GATT_CLIENT_CHAR_CFG_UUID" cases;
// gattserverapp handles those reads
// characteristics 1 and 2 have read permissions
// characteritisc 3 does not have read permissions; therefore it is not
// included here
// characteristic 4 does not have read permissions, but because it
// can be sent as a notification, it is included here
case SIMPLEPROFILE_CHAR1_UUID:
*pLen = SIMPLEPROFILE_CHAR1_LEN;
VOID memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR1_LEN);
break;
case SIMPLEPROFILE_CHAR2_UUID:
// *pLen = 1;
// pValue[0] = *pAttr->pValue;
*pLen = SIMPLEPROFILE_CHAR2_LEN;
VOID memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR2_LEN);
break;
case SIMPLEPROFILE_CHAR4_UUID:
*pLen = SIMPLEPROFILE_CHAR4_LEN;
VOID memcpy(pValue, pAttr->pValue, SIMPLEPROFILE_CHAR4_LEN);
break;
// case SIMPLEPROFILE_CHAR5_UUID:
// *pLen = SIMPLEPROFILE_CHAR5_LEN;
// VOID memcpy( pValue, pAttr->pValue, SIMPLEPROFILE_CHAR5_LEN );
// break;
default:
// Should never get here! (characteristics 3 and 4 do not have read permissions)
*pLen = 0;
status = ATT_ERR_ATTR_NOT_FOUND;
break;
}
} else {
// 128-bit UUID
*pLen = 0;
status = ATT_ERR_INVALID_HANDLE;
}
return (status);
return ( status );
}
/*********************************************************************
@@ -516,83 +660,98 @@ static bStatus_t simpleProfile_ReadAttrCB(uint16_t connHandle, gattAttribute_t *
*
* @return SUCCESS, blePending or Failure
*/
static bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle, gattAttribute_t *pAttr, uint8_t *pValue, uint16_t len, uint16_t offset, uint8_t method) {
bStatus_t status = SUCCESS;
uint8 notifyApp = 0xFF;
static bStatus_t simpleProfile_WriteAttrCB(uint16_t connHandle,
gattAttribute_t *pAttr,
uint8_t *pValue, uint16_t len,
uint16_t offset, uint8_t method)
{
bStatus_t status = SUCCESS;
uint8 notifyApp = 0xFF;
if (pAttr->type.len == ATT_BT_UUID_SIZE) {
// 16-bit UUID
uint16 uuid = BUILD_UINT16(pAttr->type.uuid[0], pAttr->type.uuid[1]);
switch (uuid) {
// Validate the value
// Make sure it's not a blob oper
/*
if ( offset == 0 )
if ( pAttr->type.len == ATT_BT_UUID_SIZE )
{
// 16-bit UUID
uint16 uuid = BUILD_UINT16( pAttr->type.uuid[0], pAttr->type.uuid[1]);
switch ( uuid )
{
case SIMPLEPROFILE_CHAR3_UUID:
if ( offset == 0 )
{
if ( len > SIMPLEPROFILE_CHAR3_LEN )
{
if ( len != 1 )
{
status = ATT_ERR_INVALID_VALUE_SIZE;
}
status = ATT_ERR_INVALID_VALUE_SIZE;
}
else
}
else
{
status = ATT_ERR_ATTR_NOT_LONG;
}
//Write the value
if ( status == SUCCESS )
{
// Copy pValue into the variable we point to from the attribute table.
memcpy(pAttr->pValue + offset, pValue, len);
memset(pAttr->pValue + len , 0 , SIMPLEPROFILE_CHAR3_LEN-len);
if( pAttr->pValue == simpleProfileChar3 )
{
status = ATT_ERR_ATTR_NOT_LONG;
notifyApp = SIMPLEPROFILE_CHAR3;
}
}
//Write the value
if ( status == SUCCESS )
break;
case SIMPLEPROFILE_CHAR5_UUID:
if ( offset == 0 )
{
if ( len > SIMPLEPROFILE_CHAR5_LEN )
{
uint8 *pCurValue = (uint8 *)pAttr->pValue;
*pCurValue = pValue[0];
if( pAttr->pValue == &simpleProfileChar1 )
{
notifyApp = SIMPLEPROFILE_CHAR1;
}
status = ATT_ERR_INVALID_VALUE_SIZE;
}
}
else
{
status = ATT_ERR_ATTR_NOT_LONG;
}
break;
*/
case SIMPLEPROFILE_CHAR3_UUID:
if (offset == 0) {
if (len > SIMPLEPROFILE_CHAR3_LEN) {
status = ATT_ERR_INVALID_VALUE_SIZE;
}
} else {
status = ATT_ERR_ATTR_NOT_LONG;
//Write the value
if ( status == SUCCESS )
{
// Copy pValue into the variable we point to from the attribute table.
memcpy(pAttr->pValue + offset, pValue, len);
memset(pAttr->pValue + len , 0 , SIMPLEPROFILE_CHAR5_LEN-len);
if( pAttr->pValue == simpleProfileChar5 )
{
notifyApp = SIMPLEPROFILE_CHAR5;
}
}
// Write the value
if (status == SUCCESS) {
// Copy pValue into the variable we point to from the attribute table.
memcpy(pAttr->pValue + offset, pValue, len);
memset(pAttr->pValue + len, 0, SIMPLEPROFILE_CHAR3_LEN - len);
break;
case GATT_CLIENT_CHAR_CFG_UUID:
status = GATTServApp_ProcessCCCWriteReq( connHandle, pAttr, pValue, len,
offset, GATT_CLIENT_CFG_NOTIFY );
break;
if (pAttr->pValue == simpleProfileChar3) {
notifyApp = SIMPLEPROFILE_CHAR3;
}
}
break;
case GATT_CLIENT_CHAR_CFG_UUID:
status = GATTServApp_ProcessCCCWriteReq(connHandle, pAttr, pValue, len, offset, GATT_CLIENT_CFG_NOTIFY);
break;
default:
// Should never get here! (characteristics 2 and 4 do not have write permissions)
status = ATT_ERR_ATTR_NOT_FOUND;
break;
}
} else {
// 128-bit UUID
status = ATT_ERR_INVALID_HANDLE;
default:
// Should never get here! (characteristics 2 and 4 do not have write permissions)
status = ATT_ERR_ATTR_NOT_FOUND;
break;
}
}
else
{
// 128-bit UUID
status = ATT_ERR_INVALID_HANDLE;
}
// If a characteristic value changed then callback function to notify application of change
if ((notifyApp != 0xFF) && simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange) {
simpleProfile_AppCBs->pfnSimpleProfileChange(notifyApp);
}
// If a characteristic value changed then callback function to notify application of change
if ( (notifyApp != 0xFF ) && simpleProfile_AppCBs && simpleProfile_AppCBs->pfnSimpleProfileChange )
{
simpleProfile_AppCBs->pfnSimpleProfileChange( notifyApp );
}
return (status);
return ( status );
}
/*********************************************************************
@@ -334,7 +334,7 @@ bStatus_t SimpleProfile_RegisterAppCB(simpleProfileWrite_t writeCB,
* @param value - pointer to data to write. This is dependent on
* the parameter ID and WILL be cast to the appropriate
* data type (example: data type of uint16 will be cast to
* uint16 pointer).1
* uint16 pointer).
*
* @return bStatus_t
*/
@@ -86,9 +86,9 @@ extern "C"
// Length of Characteristic 5 in bytes
#define SIMPLEPROFILE_CHAR5_LEN 5
#define SIMPLEPROFILE_CHAR4_LEN 20
#define SIMPLEPROFILE_CHAR3_LEN 20
#define SIMPLEPROFILE_CHAR3_LEN 12
#define SIMPLEPROFILE_CHAR2_LEN 20
#define SIMPLEPROFILE_CHAR1_LEN 20
/*********************************************************************
* TYPEDEFS
*/
@@ -98,7 +98,7 @@ extern "C"
* MACROS
*/
/*********************************************************************c
/*********************************************************************
* Profile Callbacks
*/