From ba8a20b928bfa971fb02667d512c14f53abfc8f1 Mon Sep 17 00:00:00 2001 From: Manoj Koppolu Date: Thu, 4 Jan 2024 19:36:21 +0530 Subject: [PATCH] am243x/am64x: pruicss_pwm: add pruicss pwm sync eg -update documentation -modify evm based examples to use IO breakout board -clean code Fixes: PINDSW-7096 Signed-off-by: Manoj Koppolu --- .metadata/.tirex/am243x.content.tirex.json | 32 ++ .metadata/.tirex/am64x.content.tirex.json | 32 ++ .project/device/project_am64x.js | 1 + .../components/pruicss_pwm/pruicss_pwm.md | 3 +- .../docs/api_guide/device/am64x/examples.cfg | 3 +- .../examples/pruicss_pwm_dutycycle.md | 49 +-- .../examples/pruicss_pwm_epwm_sync.md | 30 +- ...x_am243x_evm_duty_example_probe_output.png | Bin 32904 -> 0 bytes ...tput.png => duty_example_probe_output.png} | Bin ...=> epwm_pruicss_pwm_sync_probe_output.png} | Bin .../.project/project_am243x.js | 10 +- .../.project/project_am64x.js | 10 + .../r5fss0-0_freertos/example.syscfg | 20 +- .../r5fss0-0_freertos/pruicss_pwm_dutycycle.c | 163 --------- .../ti-arm-clang/example.projectspec | 3 +- .../r5fss0-0_freertos/ti-arm-clang/makefile | 1 + .../r5fss0-0_freertos/example.syscfg | 13 + .../ti-arm-clang/example.projectspec | 2 +- .../r5fss0-0_freertos/example.syscfg | 20 +- .../r5fss0-0_freertos/pruicss_pwm_dutycycle.c | 163 --------- .../ti-arm-clang/example.projectspec | 3 +- .../r5fss0-0_freertos/ti-arm-clang/makefile | 1 + .../pruicss_pwm_dutycycle.c | 63 ++-- .../.project/project_am243x.js | 11 +- .../.project/project_am64x.js | 129 ++++++++ .../r5fss0-0_freertos/example.syscfg | 101 ++++++ .../am243x-evm/r5fss0-0_freertos/main.c | 84 +++++ .../ti-arm-clang/example.projectspec | 116 +++++++ .../r5fss0-0_freertos/ti-arm-clang/linker.cmd | 148 +++++++++ .../r5fss0-0_freertos/ti-arm-clang/makefile | 310 +++++++++++++++++ .../ti-arm-clang/makefile_ccs_bootimage_gen | 106 ++++++ .../ti-arm-clang/makefile_projectspec | 20 ++ .../ti-arm-clang/syscfg_c.rov.xs | 8 + .../r5fss0-0_freertos/example.syscfg | 13 + .../ti-arm-clang/example.projectspec | 2 +- .../r5fss0-0_freertos/example.syscfg | 100 ++++++ .../am64x-evm/r5fss0-0_freertos/main.c | 84 +++++ .../ti-arm-clang/example.projectspec | 116 +++++++ .../r5fss0-0_freertos/ti-arm-clang/linker.cmd | 148 +++++++++ .../r5fss0-0_freertos/ti-arm-clang/makefile | 311 ++++++++++++++++++ .../ti-arm-clang/makefile_ccs_bootimage_gen | 107 ++++++ .../ti-arm-clang/makefile_projectspec | 20 ++ .../ti-arm-clang/syscfg_c.rov.xs | 8 + .../pruicss_pwm_epwm_sync.c | 58 ++-- makefile.am243x | 13 + makefile.am64x | 13 + makefile_projectspec.am243x | 13 + makefile_projectspec.am64x | 13 + .../.meta/soc/motor_control_am64x.syscfg.js | 1 + 49 files changed, 2245 insertions(+), 430 deletions(-) delete mode 100644 docs_src/docs/api_guide/images/pruicss_pwm/am64x_am243x_evm_duty_example_probe_output.png rename docs_src/docs/api_guide/images/pruicss_pwm/{am243x_lp_duty_example_probe_output.png => duty_example_probe_output.png} (100%) rename docs_src/docs/api_guide/images/pruicss_pwm/{am243x_lp_soc_epwm_pruicss_pwm_sync_probe_output.png => epwm_pruicss_pwm_sync_probe_output.png} (100%) delete mode 100644 examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/pruicss_pwm_dutycycle.c delete mode 100644 examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/pruicss_pwm_dutycycle.c rename examples/pruicss_pwm/pruicss_pwm_duty_cycle/{am243x-lp/r5fss0-0_freertos => }/pruicss_pwm_dutycycle.c (88%) create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am64x.js create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/example.syscfg create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/main.c create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/example.syscfg create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/main.c create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec create mode 100644 examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs rename examples/pruicss_pwm/pruicss_pwm_epwm_sync/{am243x-lp/r5fss0-0_freertos => }/pruicss_pwm_epwm_sync.c (90%) diff --git a/.metadata/.tirex/am243x.content.tirex.json b/.metadata/.tirex/am243x.content.tirex.json index 1b39fcf..665dac3 100644 --- a/.metadata/.tirex/am243x.content.tirex.json +++ b/.metadata/.tirex/am243x.content.tirex.json @@ -1456,6 +1456,38 @@ ] ] }, + { + "resourceType": "project.ccs", + "resourceClass": [ + "example" + ], + "resourceSubClass": [ + "example.general" + ], + "description": "A Pruicss Pwm Epwm Sync Example. CPU is R5FSS0-0 running FREERTOS.", + "name": "pruicss_pwm_epwm_sync", + "location": "../../examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec", + "devtools": [ + "AM243x_GP_EVM" + ], + "kernel": [ + "freertos" + ], + "compiler": [ + "ticlang" + ], + "subCategories": [ + "pruicss_pwm", + "pruicss_pwm_epwm_sync", + "r5fss0-0_freertos" + ], + "mainCategories": [ + [ + "Examples", + "Development Tools" + ] + ] + }, { "resourceType": "project.ccs", "resourceClass": [ diff --git a/.metadata/.tirex/am64x.content.tirex.json b/.metadata/.tirex/am64x.content.tirex.json index 8d29f75..8b956db 100644 --- a/.metadata/.tirex/am64x.content.tirex.json +++ b/.metadata/.tirex/am64x.content.tirex.json @@ -262,6 +262,38 @@ ] ] }, + { + "resourceType": "project.ccs", + "resourceClass": [ + "example" + ], + "resourceSubClass": [ + "example.general" + ], + "description": "A Pruicss Pwm Epwm Sync Example. CPU is R5FSS0-0 running FREERTOS.", + "name": "pruicss_pwm_epwm_sync", + "location": "../../examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec", + "devtools": [ + "AM64x_GP_EVM" + ], + "kernel": [ + "freertos" + ], + "compiler": [ + "ticlang" + ], + "subCategories": [ + "pruicss_pwm", + "pruicss_pwm_epwm_sync", + "r5fss0-0_freertos" + ], + "mainCategories": [ + [ + "Examples", + "Development Tools" + ] + ] + }, { "resourceType": "web.page", "resourceClass": [ diff --git a/.project/device/project_am64x.js b/.project/device/project_am64x.js index a0a31b7..6efe70e 100644 --- a/.project/device/project_am64x.js +++ b/.project/device/project_am64x.js @@ -22,6 +22,7 @@ const example_file_list = [ "examples/position_sense/tamagawa_diagnostic/multi_channel/.project/project.js", "examples/position_sense/tamagawa_diagnostic/single_channel/.project/project.js", "examples/pruicss_pwm/pruicss_pwm_duty_cycle/.project/project.js", + "examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project.js", "source/position_sense/endat/firmware/multi_channel_load_share/.project/project.js", "source/position_sense/endat/firmware/single_channel/.project/project.js", "source/position_sense/endat/firmware/multi_channel_single_pru/.project/project.js", diff --git a/docs_src/docs/api_guide/components/pruicss_pwm/pruicss_pwm.md b/docs_src/docs/api_guide/components/pruicss_pwm/pruicss_pwm.md index 95fd816..0a24658 100644 --- a/docs_src/docs/api_guide/components/pruicss_pwm/pruicss_pwm.md +++ b/docs_src/docs/api_guide/components/pruicss_pwm/pruicss_pwm.md @@ -37,7 +37,8 @@ Each Set has six signals (A0,A1,A2,B0,B1,B2) With Reference to Technical Referen ## Example Usage -\ref EXAMPLE_PRUICSS_PWM_DUTY_CYCLE +- \ref EXAMPLE_PRUICSS_PWM_DUTY_CYCLE +- \ref EXAMPLE_PRUICSS_PWM_EPWM_SYNC ## API diff --git a/docs_src/docs/api_guide/device/am64x/examples.cfg b/docs_src/docs/api_guide/device/am64x/examples.cfg index 5717736..0066916 100644 --- a/docs_src/docs/api_guide/device/am64x/examples.cfg +++ b/docs_src/docs/api_guide/device/am64x/examples.cfg @@ -3,4 +3,5 @@ INPUT+= $(MOTOR_CONTROL_SDK_PATH)/docs_src/docs/api_guide/examples/hdsl_example. INPUT+= $(MOTOR_CONTROL_SDK_PATH)/docs_src/docs/api_guide/examples/endat_example.md INPUT+= $(MOTOR_CONTROL_SDK_PATH)/docs_src/docs/api_guide/examples/tamagawa_example.md INPUT+= $(MOTOR_CONTROL_SDK_PATH)/docs_src/docs/api_guide/examples/sdfm_example.md -INPUT+= $(MOTOR_CONTROL_SDK_PATH)/docs_src/docs/api_guide/examples/pruicss_pwm_dutycycle.md \ No newline at end of file +INPUT+= $(MOTOR_CONTROL_SDK_PATH)/docs_src/docs/api_guide/examples/pruicss_pwm_dutycycle.md +INPUT+= $(MOTOR_CONTROL_SDK_PATH)/docs_src/docs/api_guide/examples/pruicss_pwm_epwm_sync.md \ No newline at end of file diff --git a/docs_src/docs/api_guide/examples/pruicss_pwm_dutycycle.md b/docs_src/docs/api_guide/examples/pruicss_pwm_dutycycle.md index 188c13e..013b10a 100644 --- a/docs_src/docs/api_guide/examples/pruicss_pwm_dutycycle.md +++ b/docs_src/docs/api_guide/examples/pruicss_pwm_dutycycle.md @@ -7,24 +7,6 @@ This example generates a signal for a specified period and duty cycle using PRUICSS PWM. The period and duty cycle can be configured by the user. -\cond SOC_AM243X - -## AM243X-EVM -The example Uses PRUICSSG1 PWM module and does below - -- This example uses PRUICSSG1 PWM module as probing PRUICSSG0 PWM signals requires IO breakout board -- Configures PWM0_2_NEG(alias signal PWM0_B2) to generate a 1KHz signal with 25% duty cycle -- PWM0_2_NEG(alias signal PWM0_B2) uses IEP0 CMP6 EVENT to control Duty cycle and IEP0 CMP0 to control output Frequency -- Configures IEP0 CMP0 value with PWM0_2_NEG(alias signal PWM0_B2) output period value -- Configures IEP0 CMP6 value with PWM0_2_NEG(alias signal PWM0_B2) output duty cycle value -- Configures IEP counter reset on CMP0 event -- PRG1_PWM0_B2 can be probed on J16 PIN1 - -#### AM243X-EVM Probe Output -\imageStyle{am64x_am243x_evm_duty_example_probe_output.png,width:70%} -\image html am64x_am243x_evm_duty_example_probe_output.png "PRUICSS PWM DUTY CYCLE PROBE OUTPUT" - -## AM243X-LP The example Uses PRUICSSG0 PWM module and does below - Configures PWM0_0_POS(alias signal PWM0_A0) to generate a 1KHz signal with 25% duty cycle @@ -36,33 +18,20 @@ The example Uses PRUICSSG0 PWM module and does below - Configures IEP0 CMP6 value with PWM0_0_POS(alias signal PWM0_A0) output duty cycle value - Configures IEP1 CMP12 value with PWM3_2_NEG(alias signal PWM3_B2) output duty cycle value - PWM0_0_POS(alias signal PWM0_A0) and PWM3_2_NEG(alias signal PWM3_B2) will be in sync with respect to each other as IEP0 CMP0 value is used to control output period of these signals + +#### AM243X-LP - PRG0_PWM0_A0 can be probed on J1.5 - PRG0_PWM3_B2 can be probed on J2.8 -#### AM243X-LP Probe Output -\image html am243x_lp_duty_example_probe_output.png "PRUICSS PWM DUTY CYCLE PROBE OUTPUT" +#### AM64X-EVM and AM243X-EVM +An IO Breakout Board (BB) is required to probe the PWM outputs +- PRG0_PWM0_A0 can be probed on J3.1 of IO Breakout Board +- PRG0_PWM3_B2 can be probed on J2.11 of IO Breakout Board -\endcond - -\cond SOC_AM64X - -## AM64X-EVM -The example Uses PRUICSSG1 PWM module and does below - -- This example uses PRUICSSG1 PWM module as probing PRUICSSG0 PWM signals requires IO breakout board -- Configures PWM0_2_NEG(alias signal PWM0_B2) to generate a 1KHz signal with 25% duty cycle -- PWM0_2_NEG(alias signal PWM0_B2) uses IEP0 CMP6 EVENT to control Duty cycle and IEP0 CMP0 to control output Frequency -- Configures IEP0 CMP0 value with PWM0_2_NEG(alias signal PWM0_B2) output period value -- Configures IEP0 CMP6 value with PWM0_2_NEG(alias signal PWM0_B2) output duty cycle value -- Configures IEP counter reset on CMP0 event -- PRG1_PWM0_B2 can be probed on J16 PIN1 - -#### AM64X-EVM Probe Output -\imageStyle{am64x_am243x_evm_duty_example_probe_output.png,width:70%} -\image html am64x_am243x_evm_duty_example_probe_output.png "PRUICSS PWM DUTY CYCLE PROBE OUTPUT" - -\endcond +#### Probe Output +\imageStyle{duty_example_probe_output.png,width:70%} +\image html duty_example_probe_output.png "PRUICSS PWM DUTY CYCLE PROBE OUTPUT" # Supported Combinations diff --git a/docs_src/docs/api_guide/examples/pruicss_pwm_epwm_sync.md b/docs_src/docs/api_guide/examples/pruicss_pwm_epwm_sync.md index 1a30b71..58c6c02 100644 --- a/docs_src/docs/api_guide/examples/pruicss_pwm_epwm_sync.md +++ b/docs_src/docs/api_guide/examples/pruicss_pwm_epwm_sync.md @@ -7,9 +7,6 @@ This example generates a signal for a specified period and duty cycle using PRUICSS PWM and SOC EPWM. The period and duty cycle can be configured by the user. -\cond SOC_AM243X - -## AM243X-LP The example Uses PRUICSSG0 PWM module and does below - Configures EPWM0_CHANNEL_A to generate a 1KHz signal with 25% duty cycle @@ -23,15 +20,23 @@ The example Uses PRUICSSG0 PWM module and does below - Configures IEP1 CMP12 value with PWM3_2_NEG(alias signal PWM3_B2) output duty cycle value - Configures IEP0 CMP0 value with zero to make state transition to intial on IEP counter reset - PWM0_0_POS(alias signal PWM0_A0) and PWM3_2_NEG(alias signal PWM3_B2) and EPWM0_CHANNEL_A will be in sync with respect to each other as EPWM0_SYNC_OUT is used to control output period of these signals + + +#### AM243X-LP - PRG0_PWM0_A0 can be probed on J1.5 - PRG0_PWM3_B2 can be probed on J2.8 - EPWM0_CHANNEL_A can be probed on J4.1 -#### AM243X-LP Probe Output -\imageStyle{am243x_lp_soc_epwm_pruicss_pwm_sync_probe_output.png,width:85%} -\image html am243x_lp_soc_epwm_pruicss_pwm_sync_probe_output.png "PRUICSS PWM EPWM SYNC PROBE OUTPUT" +#### AM64X-EVM and AM243X-EVM +An IO Breakout Board (BB) is required to probe the PWM outputs +- PRG0_PWM0_A0 can be probed on J3.1 of IO Breakout Board +- PRG0_PWM3_B2 can be probed on J2.11 of IO Breakout Board +- EPWM0_CHANNEL_A can be probed on J6.1 of IO Breakout Board -\endcond +#### Probe Output + +\imageStyle{epwm_pruicss_pwm_sync_probe_output.png,width:85%} +\image html epwm_pruicss_pwm_sync_probe_output.png "PRUICSS PWM EPWM SYNC PROBE OUTPUT" # Supported Combinations @@ -46,6 +51,17 @@ The example Uses PRUICSSG0 PWM module and does below \endcond +\cond SOC_AM243X + + Parameter | Value + ---------------|----------- + CPU + OS | r5fss0-0 freertos + Toolchain | ti-arm-clang + Boards | @VAR_BOARD_NAME_LOWER, @VAR_LP_BOARD_NAME_LOWER + Example folder | examples/pruicss_pwm/pruicss_pwm_epwm_sync + +\endcond + # Steps to Run the Example - **When using CCS projects to build**, import the CCS project for the required combination diff --git a/docs_src/docs/api_guide/images/pruicss_pwm/am64x_am243x_evm_duty_example_probe_output.png b/docs_src/docs/api_guide/images/pruicss_pwm/am64x_am243x_evm_duty_example_probe_output.png deleted file mode 100644 index e571ab6465e4677144cdf317c3dc49bb62c6fb1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32904 zcmY(q2UJtr);0{HVgnAKq98>9k*-wfR=S`dAT=nxD?LDniVdZ=NEZPSDS^;i5EbdY zB%!Kwl7Iw~03pf0IQQQ78^2?yV*|Rg*IM(LPnkRVu8AJUG5%vLEG!%b`nSwjSPoHG zSXf1m90p%`+;;aP_=`2bOz#FudH=Z;aB`km`6ES2%c_Z}Vs*GC`gTL-YPaDLza z&D!Dj*_nmqsi48F>-R$)h|}!vPrB4HpD?Lw<=kD0yr(hd>k2`O|aa%;(1(oxkShq17HrAIpoAGvK9=x{L zMMgzLM8tDU5F5A|6?qA->Xkb+B0R2VDr`*~oG79w+r`KBdBC0wgz@tDTkB}a$<5T3 zjcjdy4Y2z#V!j?lnLfJB%2MCTO<<$G51y!*D;v;a4MRG#EX>90B=3;j_shAc{svSy)put}hbcMtGd6^i(;=w`A>V_6z-8fd{Oo+g zQcfKiY2Vbpvx8I!S<_U5k_z@#OyNoW*-hBpp!;UUW`%{p#0j%9o1n>fDT^=sFo%{f zj&S78CSS!;(CTOqr?KY*Bb34o7W0V3gxgq&r(5s)^Kjba>^zgP&UF6s!(d!^JaPjZ zV&{!N;-u-2+3xPtlG51{x-ZPW@=<%4d^yaKSmgz=EAql+&CfgIF$j4`+c&IR(F&h@H(`rp(enZr%0klC;N`uKiga zvj%B6^{klkubk$@Bl$EoXbOc(?yTk4Y6;SW`%}0C1NW+Vw%e@7nJ=Gj)SzX zS|0?1IcoG`&OCe;)|FIPI)_B`$=TI+s;|IzdLUVGyNAxIc)vfi=hq6GR^P*qx167i zq?K*0(W?bdgz9eNm$OW@cYc)G)O3#{MPCNmN?VpzutmA$!YmbBy1lda@@~HF+FDU8 z9ntoi(cGcUGUdRQBo7xFO}4ei32J0TrL`I{83Wkp=OaY}Sd~EGPj@nXd*X$4+GgT| zcdg27WSQF?I^HSFrCj*K$q_o^&pY|~c=%p^_Sg4H9!XkoCVh6YEjrHEP+z~A`h@1T zk0CFPadb8X;pH$$NFAe$@>>}zths%=2(rhOt`Sl`T4FVD_*a%%fTh&^&zG#LUg6w# zgYe^O$Q`qp@O4;6xPs$X7Ta7(k47+Ixp@(Wt9Tf7^3vVGxT9NG$Lkn*}?)FbKD0-bnF{De72YfNaTw5 z5}N=K*>N^Z`RUp_ZH&`P%Q73B;{_N|A~(X5zD*%chSOz0iMoqm+4pX-1upnFc;@u) z{%L==0AcPTVtX<7H2J@Utd8R3O2+z|f~&zfcFm(t)OgAMldBDD%+d&PK-1PVj#ISq z*R4t)$iW$#R;PciPu4*!%k4bGg96dMRWKSSsasmKEMUDMFHOjJ*$Go_Ph`2RcVOjB zcs5crIGBKiDq`jB8)JePK@CabMm^OYBi^%1z3EOh+FEUlRwmugx-l@lH%rZkL4`9h z6kD#7Ti0%y3Z2u5oZ@_8iFELBc@=mtX>Ey!klF{&yc@L9_P3|1hEw@N@$O;7*;SF$ z@v_MWt@g-z`wGWAd+zYnQIF#k<$Axt4|&a-{Tj6~arHV+{uJ1sFM;_IqHj@8whE8?UC3GZ&Lh~`G_rgMB7LTUT8(rd|^=?#P}{cL{s^6Lflzm$6mT1 z*n*Vcb%460M9_#K!Q$Wk{+6Fy_-13WJl|zb8aBG=eKOg1q{?p}?JspDoX^+X>{T2$ z#U!QJOfuk%CAjz9J77PEUmg%A@z>5~qrEV4cpa}+$oEje6ZvexsD%$QC$?oKf;vsN)kfdGxXZxTMs}YkN&Gz!2^f_Uj zD%cQDdXD3)`4>IEZzV8zHnM|vLIRF2t1E=GMw-B3&!z|PKV$JImmW)x(a#&QG*GxV zj<;$55*;`aQWgt-=w?@{bl39$zn-w=WkFfL{QQV5mNs63X}0>b?j-)%v*7-kPc7pu z1IZHBpdYyA?*#?Mj{lIitAFETdo!pd%L-BzvhE-qwFz3B4J=&nPywDe)sP%>PHot? zzL1^UhPUR%E4>~Do#uic zmsPoAdZS>*6zqk_sB?c-`-*f3O8OqT+ni&PoXc4{#FKXD*vX2>atE~%mn*MNoP8AK zUOj8y;D4&AF7@!P&8jY~CsV}-MfMb~kJurpY%fGhF5Mwfy&INEYx zd(yA9vV_Bbso%-v3VHqoTB3#j0sD0G-)|z;)$WPjv*>Bvzj&>K)r5E<)hPxP5W~T1 z6E5)%GawV{W(HTmCj@hd$b&38E=hbE{tw&r^C%kCed*tzz* zb(RT~yXksb@Xwm6>1JraWUT}iWAwNtZZStIeEvr?Z}8XOlI{8U>?=;6?1lD5%}ou` zWUPt0wN4#z$vS(#MVs!erODdLcnhm|*9*Q_jy@(^oSzR3qY!+MD-$)DsRL?3t0~0S zIZp?<^&7du{!#E6_l8oZsin6P;uu3laqOHCZEE^wyhT&CNHd_XPP~C>y&vMf*$4@9 zc~<^?^551m<(2bHM!n)91ifcz3h^4_64ti!U+nd;!mNJf+zI~e%E1){@REXoRsyEi19&TTk*15Bs zAMbr_;Ad>6_fwM+%QE6U+OmXcPQ@InpnE=TO-(ZIVT(gzNe64#fona-R<7li+1BA2 zw+tshDXMh{vu9ILv*USm<|I;VA626qh4n>=zdAZPjQTS8S3?p3XEQJ}n}M8M4R`-r zzTl@R=t}IwcM5Wh3#j@&5)bF$mYhA5}3Gl~x(M`$AOcGU$dAtjbR8l895TcMk$&8pp>OiFO9*Bpj71rxK_5-crS zN2*}cX>q#4KFee5Vg5HDB~+flo|l=*UcUK>Th38J+kwl2ZJ(fPvcIgkz{mdQtx^F7 z-E^3eDrHd{iKGMs`!4D!M!d*#~D7Q${^quw^6JWFu`)czSXz& zZr%+_Be=wg2x<8aE;S0D&*e{!_-Cs_Xv`cckRms@+O!i6Cnl=hGFn?+ zsF=8pv_d|!AO9k_)O3`RTDK6C5tn3@6SNv2_$2>4jffmFX>vo?xoolAD#EwDVU%tL zo*f_wHBN!=1mUCEr@01{3XxQq5>5Q(xq{_@=^T>GI&|$fPIw;)?t4J4s;g5L9nYDz zVnz_;Em)0C`G9$=3Yj#Mw$W@!!xhuki)j?0#$MtG*^O9KwB{E6X&TLuy=GnKc6LBL zD1DNuNLB{`zkD9cK77qD!M4^L+N5cr*S!2DOdah}#Lkn$c4FY!%en;?mJq#3b5r+Z zaicRtX_l$7PJ&9e*7@^wTCM|;AyJ|G-#7JN?J^{OmqMNXRRmg}$NdV&>m}kyL`j;I zMK?OaEFRTnIwJ2nuvF**|6)<%tIFip46WEAPMQLS>>qIJB+DTuVHsg6$}|91I-r%k`A)301n6PFA@X$`+R@D%RBR1OLi7RVe?IM7lY8ZV?( zHg(pD#x?`)u01H=>jd4CFmqqHeF+c#=ZGotS?G)%-Y;^y@Op6tchk!VWrAqUz%|=Jc0lARa zm#NwVG*)MRytbWb-BV7~vc3SD4 zUn66!X}!C~3sV4A$$y9B0$p#R5_O})9$ENhY!4gBs}b?{)0I3>y}7N|0ATnM@y*ap zm+im5&FUX>H>uy5w93|T?S0T>-6(VkI?2USzkZc&^&H0XS4V3GBM^eWmI5@`K5f7ElfTEh@~FD5L^h@C&7En2`{7?eH`J^_WY%S@6^?j&v)~6 z@8C!Jb9Eq}jMF_;`C4JLuk@#m!haKA3FJJ642XHXzwzt0JrLe712}mMgL?Q~_jnqh zc#j|xkcf>!J9I=lbngbxJd$bwi_JT?k$I#0+74(|6fX;)gf9s*EgiblR=^^Mi%cO6 zfh$SbBG`t2qGsw$lV$J?%({;b%dg0fqS^PO4s-mgCeCR`U~fdWd?bJ^La9^(?c`6u zUh#6$2wZk&*Hc$m?Ng2KhA>EcxTcWYmkf30VBYufoK-LO6K5{z#ht6K_8z(^(JOFLVq5)y|#GCD|VsCpZVSCbxKGAVCrCfjW?xtn;huy;gE?xzTTy>nrgHg;i%z zUYt&ny!+vUy}IseX2+J|P}KsToLvHtx$t>Vc~yxtAh!^L8o^f~jk%pOE#V7Q1KP=e z>Kd(0L46O?_%FluHab-N;Xnb9`c!B2i%hZ!^G^>mfHzTlkI@)&*v4zTG%<|KfBBK{ zSD5MK_=^{I3XyxEYOvkvy*XiK1sgxdT#e5t<*w;-A<6kda)yOUkTYi{9;A+>O@*?Qh^xVBO~Eecj4e+ z$JfWc!odQAofq!$^!?vT4Vh>Q(sMuM_Wg)XcAiDkNz_)R{S2H5v#x)fXD?Tj$LLCy z0MwKL_~32YfpXir8ERYP_2ZNpl`X{qO$oo|N(b~F$*9<-CPT)d`NwmZY{%wm2~u6~ zS=8yj@a^Avz_$4Z|4-;7A4@&Neez2iV=(U~aef&*gqJ8$)n~$4wMW+cQ|XCwR|nPf zGn}k6TFB$d(uMi#xA_UeKsK4AjRRrYO>}>cEbKci8#a9a-twctZx*d$GaGQgqK7iy zm5iBi_X9+kda5W}9Lvta97eli%BQ_6a)g+8P>&nxe@&6i%mzou_lQ0|hcJ&f9L7UD zns+jkY8>HRN#et;aJbvFfcLK+aGqATVpS*ZK>v4^4&Iq*?jivhGGBs3qXs3VqyXsG ztOXcCv!_*tx4ymHG%J1Z;yzdnm{#*h1)R`KX-21m4OmdW5cp1)=I zG+?RUR#HeSTqk7Bu4F*3_y`MCqb0`LC|lWYW~%(vFgHcnbJU;H;ZYd};CipJmFQa| zrY_%J9359#Wi@Z`Um!kR0Xtlzq7%)KQY1&?8|BKfIryC@r0NBnr1%C)@`Fg4T z9FzAi6V?j-`>vmle9>d%Q(0;rw%VgA`|@B0J?z`l!J}W1FK6^i^%Fn#v-Ssqv*1%C zw0-~c-J$ZhiDu}#=@VA#NAua0CbU1v=zO2(2TR`x%2yin`9#1VJ3m~HB0kkO{fXZG zV>GUd_b;(RRz_Xqe9N-ud6g)*zaF`Vx78m2He-^m(5^e`C2X-0C|Fu#MF7>lv`F9F zdV;NZh;r&M!50Ouj#}6HOkUIqr&O2hk{cY#CXf&vVCIz_qGg-~>ai;2Pa6zas@LwW z=-<;)TyHpG!WF0VV<1)fUQ!YX>$ECwCm8+33Gvd%7(QJTd1rMgCn$8BgQfMDNv2)}7t6Ce*2r=@1Ba!; zwRpy8U=S_96s{a3Yza4M;rtbOy@E^RbKnnHjb{zfXnZn)+#hn( zVJwPwvakrN5j_F}OApa@^=Zdg82N1l64)Zxp|u&do#Q7H4;*?o^XUxB!CP%N+6&w( zhx-F2_*wquel(%k*nytwK`f=ZL@bm|f0Ctg!2G_-R>zW61X+G%Ubt;^sDgQHYF6kf zXa&G_>Tf2G+wOOGgWU7U_MB{ATQ6L=P+**XOgA^&b}_Ojq!tNjEzXXmstB_@rUq8) zu1$3Tr&U>CqaZ)GSr&1+aV=u!nEqrfu^@0oVHRQb&Jd@2zZ!%2nwc`tEteT2L=LZT zXxSYuwGL>i+>1xB|HG5jio;^B8gyq52+?uq17DHZlxLn8-%DW2tC83EH6H^o2Y~W+ zp8?I+U>uS=ga;D*2U))&f$tEkh{Y_;q&3WX#KL6TZ^iSrR2<`qcDBmUsmuV)R}Qb&6lvJdkIttwprD6TWS{-|qyz^^zbCCsrW1KL@1y3%k7Tf}q3LP?X(weKbe8`d{vbT#kuY0e zV4kk(hdv?9KvjET9NzNDpYO}8t9T6X@W{hic3QLn^eBb(>p(Tv{VG?jRxV@KNZJ2= zmh+MOAm;S5m!fI@Nrna3bbiaS&JqKZUo z5z8;P3G_vYr8@M}x*e9a81PUZH4f3Zxp6*95a7(qVC5m`k4keYTTr}cVb%0+=QgN9x%k+`cg zKQ3@S{73srUqaCRRykf-wSbG*Kss|gHz@3F3N&m?*W3GBA5_i%#{{Yv1Eqxp%)fcU z5a#s>d-TzPoVTEBR?ElByJXxGuo(o3?#W`ugyw+P-u2l!hVL|k#{S{}ebTrybrL!{ z3tR7DVOh(eJli^>?$)1@naozNagcWHAG%!yb1_rTWj{0d6~)!{_xJaOy`4?Va16## z=gO73(Nb$G(vrM0>z$u5Hl(GQ&J@YyR6df*fYr)~TYXWWaG)3>ZU$*nlNMwKn!lgV zm!`syNJxXkfq%NIeK46zmc?eGBB}#GkXdJ___&g{gd?}Pq4SA)+3R0k`#7Y@*r@m0 zPO@^*BdP_*o-*@Z3#EZLtoMG2<+M>n?z$_s?00yTtE@|RiU-QM%Pd_R_Nm%u(gCbC zaf^$;v)V(^dFW$1${XjO$s9G;A_Rd%D;1~|b=ccNg|MxwZW_vdN0)+HfHM^2pfl~D z3MJk5z*a!uv`n-LyK-TWxK!R(~?-swe960C(=fTa1XGl_ajLEm0|H>+q#^AHguer zyk%*MbMO1ERWUs4kCu<3Cu;}^bx`ym+4E>teSN6LBpkV{y&NkI>?}zT6Q*Gx5V6h0 zzJM|ydTa%kLF_d7+1#%c!m`$K?J#Wu4fenSguPNg_f~(!j_CHLD|Sr086_TW&IIYq z&hI5C>QVbKN&Cj$KHzdxAoG6urTnZUn-0-%odXC2_W@8mLf>Oc)O zp#qkCaV_ETTLfIsTF7JKgz^rdYG59yd=jRWF?N_ERF{YkE3qg!53+*4&c?Ga~{ zS1k^IVv+mjvm<2Es>RHov3F?vVyK_=W9s5$h$VH+6zfJHR_Q$kI_UaVfG9;7i@8Ue zZVWx&Wwi z75z94+dB9(ZV|)61UcvFK@4(sPY;B)4VbCykuaYw<2VQ7%P(XjZWMeoyxmP_*2^#ryN8$0WBX3Q7nq9C3(iD7iKYYQsOx@_YAq$cTN8!h;T9@CxeY>GPz&CNa+IL#lwJ*bE zA;i~DB0(iyJEQ-`U*PeFb5N8ogZwQkc0%6bOX+f-OVIs)Ef&`1nfh%wlM45_MK3f$ zxByXS)*LDcT%*PaIvGQn3K*CS+jelOST-V{}u=?vFhMex{m@@eeUajy8soPo&&*PcB;J-pmJ+A~vj_c(=2hi0xF2RR%>WoD5*c`Yh!Zpi4^ zbmX->$hi8SBtRE@_#Z9n7d1nVW2vuN^$1=SNEhd2(cSo*Y793)=M*9Q8$IQ+b`h|u zO!gyF>F5IGbr9l60||%P-K9~8b%}HkKGdktdgNPEz%rU7B_Hnu@F zh|6x%S^O4p4@Mg0B~Xcz7|-kBwueJZ*|ETCTKgbz=lE%vKh(#wyafEULlXy>L&n$E zn{HPKtN%;+0xFOXL+TBVqQ8q9o#rU5+BrA)!mI+x8u7uCz)PSB1N)LQho1%<`OWZH z*mL^VZE=w3kkkjXRKM!3;@x+Fi8`?bDs-l~*ry{d+gpsjHr?bh_wx>^oe%P$B3IQf z^7tREHgvhPl+==J8=5g=oU1)25e1W-0|n@?@0&$z|9;(1y{?FB44Ujqy4EOP$4&zc z1I6vnPr#2I3~PS|vYX-S`-2Dbt7CNqrn%@^ogAtGXm$&Gu)|+|YPUr??mui^8`@!I zZJnQXkoGJuouw_({eRRdGTNganHTBFKVIMlfd$-4y$x-&m*fcP84X++wg5vef>0)% zTIe$we0rQu+VaMDS@?GcP~G-!VYKxqx|RwZm?ml9%!}TBdlE5HWZJ_n9I?D7Tw7y9 z<^KktEGG5?rlRHX???U5)(?lr=3E;@JzZ~QhI@>cz69aOkjbTGC0VY|;(=SP&CE?5 zrs#gIIL`&&jtV61zBsf6@K_tRi+ffra2qZJf*P|R#7W-_wfv=3Mtxf~ka1BA~ zz;oCOrKR;`$60$IeyKoUnq>bxNR#{jEmEY&v=G5dKVO2|e`%aMxV-?lBb4_kDYUq@ z`u=yZeUc!Je9YlFF3n-%C++yZ#U#H?@fE z3cJR@F5O;yth@3hi~s>4WucoU5BVLT>W~V2x6UlJ%>uiIW5LLmiK2QFv7Th*$-4DG z&aXCCXS2s-9zcMDdQ#rOEGJA#`~${?Q&{_gsWxt8$G6YxHzPy2g!r=#AZi+5=!Q7d zDewE}SAQ!jHx!(Hdeh|Av6b)aSwARYF#>apeW#E2uzELS<@qAt{bJm;c=Zip9FJek?3x(DnAfUFYcY3q%bDH@#;7ccH7(nOO@m{_zu9J~M(gwQ#vh(`aLT7I4bxh>f?RWru zKBL1&z~Avv)*na|9ZxTM_=hV{srA)Ln7REx_51f%Gt>OdMB1R)LLz!b_wSdM=`F1& z*_*IM$Ud91))m$gf3oFTTZ}3B-Q?CHq<#l7ch(2FS)(~PT-bAq=@CmePDf2BG|Elq zpf83~Y^joD^`n3yncaXfYr%56519CHiQgak+F_C*OdpQAxN1xf70hjk ztNKn=WNzHay4t0?yF%h$!$-3Urs}wKpG?2}@OeN&4u;cADb#PK`DGw}{LXM;_|%Pc zkmA?_%gar42V~+hAXiEJ{T-49`pl%kp=nc7{n`2_yl$ZDfXOz>LMg4r8)qinm%n}+ zasIzxqjbhZUq6LMy!$G<-jf(?$TNtU)2ysgz5IiU{iJf%@UXJS@ZMtdbI4mq;XGre z3a`JoT71~YKAM8Zb+8o&X-~u5KR|#JLu(?d=#(9yu-#N-eNG?bQD}>Fc0S$pYtL+1 z{^y+)MZ?7k{VpM)i|JW9-7(gp;w0Kam2~FO>|BxP2AnN zZBScrd1_F08AbTUKTKVw0KJwbR<9CZD{?JedQr(Hw)QkM-jBb+TGpoXCYRPD{OH2|UNUC^G!HH{Kz&oCls{Ll^UOSl(a}9%&S)p{&e6u{ zTi>BAX4mxQ@$P$?P!iKUJ@=F9F_Q~eJ$HYGb_2A$>0kB%O%YNJ*tGjE+`PC|A$<0% zc%@oXcZH<6^F+)c6c~_A*YS(%J+t||8ku5+Lik*Q>Bc85c`hO9&m|^lNxfErQ7q2V zBP1kquNb48??;PZsNNz+`~7DqSM+XK8sy%$%+RF2HO_3gw%C^~ zKKF`}u=>Q>?-ix^rCXoWf{mtl{>3|qOPN2_Xy?u+_FoV2e&pcB)HPzp)ri^OIO;Lz zmtvf&rnlG|G*fk`xPPu5&BJ?Y;amYCHIA*Lvs!J_rLDO^!H00o!{SrI57%P|eXaDw z^L0wFhc#K6XyY&|;}i)2k3=Yu|e6Au{gHLDI2J-e}bxft@XC2&p4@S-Wyz-HNHoU&8+V(sY8u`YAb z#qJbt!NOo%FKIhJ+N=QzKdS*Nr^D|EY2D30bV~iMgPqP9$TuD-Cy};S6ar>6)0dht z4I>gg()0;^9JZ7vP1%fxWSO)kZ<3_8d$u>{ylD7%a+VrNpZHr~ez4qnxa?z<-F!TT zc+vL+CFlqGFm2y?03yu*2m+sUlWcWstm1x-{SFz=Pr|#03#KC3C5r2c12fY8sD=Lh z(3_*xp+3#u$tP)c9}GhH;PGHM$*07&ZcWwn#ByNEM-ffUZ{6$5?(i1wSzwt087J58 zcJ^Tp_kU^lLE74!EY?b0;Q_L7yJm=*y}QYJ<8T`qzkm3ySFFor9Q}vzIxXQSg*WMR z_m2EbDqD{R_;lHYOPiuDSbB;vB#4?e{Mu=eOn@Ry$n*Q z*mfdy=DQS(D863!iF-1<{qh;=*AEF&9kRSTE4V93QSU_+L;vWzZrQ>xSp=0q;@bJ1 zh$(Q|I9NOzQj^t0`P3^orRR{*YEZ(qVW1MXcIh|nf}icoj>|xTgH4Q`lplVeM>9Wb|M|CB5RL1*oH;U01NOcir*BJ5OVzB%LHGf0`Uu{;>$nkK)y!%!<_4h8Z)A+Nft7EpH`Fgaz4u0O5M_#LO zMVqv0VKMUh*+r@?T3`m%I76xHfQUVl*oHQdwnn9-{x#hRcIBGh#3+R_Tb z50IQPnSrOQ@>4tnuTZ4w?nvWan3*H6oobn3iqn7EjV?dZxdv!f$l$uCY`b}Ls7Ddk zbx9%B?P5pB%0R11@vP22o?Ac6BMuaXPCW+(2N&>GQcIlSbu)`ar~Z!dt(>7epBT;U*>nXxXw47*jLMAH>t8}$GA z?o1_@pgaO)4LXJ7&MLe#DlQjw9!ND;C~}gGhF!I5?8nJ3g~X=)xrY;XdxR>zx|2hA zPm9@G%j*zx`Wcf{vpAwaow|)1ZO%DymiEdnG9Ws|z%U`}N{jQ{0(GIgYYydnOLk|y z!jLpN>f|401S!rKz3yNeU?ykBd@zG!X54=lUBkL@MlM5!dqq(lFC*7u zik4?TttmRx?$!Ng&dRy{y)RGBm2Btkar4szwA|}YR*Cc2m?W%AbXEh(=#>>$a;c65 zqw~;>D_EaD*9JiAG{CHIaUHjx0MnpM2!cXv*q?0G}sth zw(86Sd4!yOE&uNBA)9LVEBWwn{v*YJ>OO!)7P9X7!D%0|jV}S4?al~sB^b;DdAqPqfhkEW z`#)j(N#``*|44F<5;;V`2yn#zpl>c0rRt?YXc?b#*Qab$$ZRC8E+D`6?6B@JJ?B)J z^Z-NLVY*A(c$EMApq%xUk7Xx~-==xbBK&p=&Dd$j**yiQf^O%pPr7Havb*cEaI_ez5V%#fBc0G-$^_4=E>B{L9`5YI*b_u43=a zRDFg0D}+%(r*~yi>#{x$x+@FajP>z%$CM0{8cY-z+aA^;E{_{=x+w@dn4Ek{R-rAN`$^|H`B~@2+|IZ;>5%POrKAKp&#LoBx)|rr@#huz@mu zC4Kb#jYml>2Wfs=N&Gt_)}hGX&JRL4qv2sScFoPUx_n%SnEu@wZP+;BN>Y&{w`9UU z;?^TIiPjqZJ>}60Vk+u4{v?sCD_R3)sz{xp@dmHXK?@$uTKg|&OQUM7Pf22flFl`T zUDI9c5^czNa8aUvEp5lVwx{i7RG~AYk<>d=<-c7xZZ_W*tl%;yiK~n#va1iXTMT@Y ze8de-I)#_#dM!O|Ik63 z%d|qL_Eu!q?{mFrzFKA!`vx&Dhhhn9QK!Pkm4A{{C9i)|(2~QIXvuq-W+z%q_ZU11 zcAGw`$gQ(|VN-!rt*6n~;qpbMxrx9|?E!CL6aq7)*0{>G&u4d` z2jO#z0p4o@*0rTst+(2~E0LuYKK>2HvEC6cEN@%qTh+MTI0G1f_1_#FIO}8@zk1;N zh^-;L;5mDuJHG1~nAEbqH2cLux?~cmx;#c)>4di^q9qD2dN5%SuY{mez8Buh|7qF3 zR8}|RUt2S}x`X#WNMnFGh59IpeRWp!xH9JPZ0_|d|Fh1h@Hc&Dm#855A+R6bKll90 ze3$NG*Tr}KPwbG6Kc|=SjE6Q8G^!25PRm{t$8#mPgj2do-M;ih?RXl_VpMznu=*6( zNZ(QjrRt>#VlbGw&7Wv0mjWV>pkX_er{WSFVpHmHyJMU$Lrwre^!R?0Y z&WSda3nn+zNc9v5@;R?RcQ8Y(tK(XO-!|KoAP5>YR)?!EiL{mtTb<5D%QSVEB={7` z^-wBLiRsyW9L=rO>nG02n0KrtZied`ynB}I@~tZw^)X1$p#R)O>+j#4r_wh4J;|Fo zPaYTkj(hX2y#eBG(KrM@=${<_Y|^*@?X+w;QnQ6V#^f%U1|Zaa15UC(Z_6`VT$zxAY45-@?G1_Hr+9h2@I#n|0mxm_;+@*1UFs+N zmbVdAk1InHxj9HjNk=KTRoVh{p`=;>vZo ze(Am5EJVyXr}m~dbxzsyxh%c# zKrMB1r;jNV%}Zal;_DUMe}`S?_8LPsl)jO zrJCE0eCd@d_G&GS&G!XbjODUt#G**25)H!TyC@i4gObx43*E{bl;Z~RR$M(V?db)N z5(zwu5s~-6Ba6bNuyx$D4wpxT!$}$!E&az)+wylI%%o}$qiq`=Lv-lUekAwk|ISneq`^PvISc{b zue1BMLleV>@By1zO9_iKFS-J3|Nl6+Yf{+tfA~ZnKHM;C?!Ir`>RGTQgRyfhwH2pl zE+N>3Wu)chY}TAA;D!#uS+^Bj8er-AT^W)Nhh@~n_)H-wb*8e2etuUzIZ>xzw5;&V zRau%uvj|xz?5@z4WFCTW&I1S1DAb@9qAqXi>X)ckWYsfLbId5Jp=jYJ+N#in_K8G_ zdq-NV2sV?t5arx;Pj7J@Ze$`09S(QmNxy?~8IbRLC6}6C6w>uWC7S2#T7*h}r1PfP zrdCje&Zp4p(Ost{T^t@rB4%38BTRBqm3iSuC`fn7oCC#%8!udv-wz`@%e}0e$9i1E zy44iej1sh)*{5O8^d)z+{#7UnV)M4flM$R|+e8>q(%}G;M z>2}^6#rPE4NDw1xTVxarh@}TuB}!cMNmhJ~Fs%EsBQA6Ebk{C@-R!<`Qm@WlEg@(6 zB{$9EuX!6<$NksbZyyG6D@60cg(eIX4b07dBMBv}>HkF%NB1+ytX5NwE#8175K-)3 z?;i$>cic4J|HLK@?;PQI)m=j89}c}NbeMHPK^awM`S+d9R=K7&kA6zfOe)Wac~EI` zu}}@0EAOU_7U_8%dYqEYHZGH1F#p%WpBSany>rS`zxK_MuB5xSJez}!(X^3C)O>p! z53}<-=|KxC>dzlN|3_iU263^7$dd9-VI8`D+`x)lqMDKZW+C6gcV6B?*ha)~*q~*D zKVUM1L4Ea>Mw@=E+Z30A(QXIIfb6!^jniqCZ~9r6*r@zPAG|YI7&c~T zCWfdQuq8h%eN)eQ=$DCElWV|=noE8bI#mBt?H8HK zRxhcMkSxS>vb4Upv0*H|W=SWF{*E2WL8*G}mfCB-*ttU0PA$>UGY~3z*u!IS&2wuO zyjwv_B%B*JH~bWSO9-|nnO;Tb@_!Ow(Utq&+QvjjCUJm1cv%%5H#Qx!6t+Y+=(v>x;|%YfaQ{Fgd$hKUqBGhdt9*>@8E?Mr`8@(L_z0?(P_zqy1F z8C(ed$5(Ha!TKrO;3tB=P!dMulgb4iZrhV#O0%Y8fIxoJCUeN*OU_*w+nXP9d};nWeitzeordA zB?@&N2B{1TLBKX!x;Bs6Bmov|JbiljQ;?U(nAB~&N?F0fnsHL^Uk}uy?-z0P&`j`3 z;LX}~?0Jpa@`RV7nFdv-ixGbEu_Y2lBj_mSp|{qCl2vI8smHIo6K~{ z9v8SI(voZQPj@YrO*&7ixY;+N1vOkcUU>|wU9`M_LZtP7=j+^+Rfjcs+t)q#N%4|- znRFqWnqlAAj}=`CiBC1V*WVTqk<_f|7i%0=8Rgu~!Ty#Q|CKat-6r9d2i2Gp4ch$ zq_3bNb^?Y!dLD)nemi^o{c#3Lk0qjvk5X+DyMv!acSKZ5XHXzF}}aqVor{m!|KfN^##%1AnycKe%xo>88^ z&wQceJLeUA)xubjr;%9%=kZu`zj?%)nBEI#g$6FAqjU{8HZSCdU%Ofbnu zbWMzvn8~)@OKTp#Z@3h0ECe0J)x8nc{{PxL^FS!q|L^OlRE|_i-*ix^knL2KLzY&1 zoRowZg=06em0^Zx&lbfgG0K)KBg@D#gLY)s3tg)!7oKn;0d-WWXv5&$&+BffeaP=L|Ru5z!)7jooxTb%qxj`BlPqKK_ zdaiNvA^eHdso*d2Dfp5Rbm~D(d}vM4q0(nQj9AO2L|&mIsSdv6>>y+ATjAY zX8LGvuc5buJ*nPQ?)%^QJOd2|jh?eSHvFp(VSeSTVC(5nO1SLj{DU_9z3%np;iAK? zcJtVQ$8$xwu{QY*t&O~!UY7jx?+;!xc)7ZC(cUsBUz=(Uo_* zUA}d$Q^)vbPVW=hvI~#(mrIzw^1R{erT!^>_7&ZX{SouGV^wwbludCSSc{QLPplvL zbN9#{NA9T+T=C8})3rU2pi9iD8RrRK({8Bq$vTsHB;v13tGBOY^e8g@T+P9B8viw| zozJ(E+_^8oAyRQq9sY`8$Nk&hVn@)mFD?D6;}r19gB?a4XX~UMz9uPrRfHtass8Z^ z3GDR#fbpuEo)c~MgSf(Moq?(vsVL2T!dlaLiECPvtc1S$>G&qd(x?GZ^q>1@N)!oG z5?JL#g+LBQt5$QmQHmnl=r}zyx94j>j;BQilXbx1gN(4w{H>GJ*;2_&YDVqgWT|Nq zxADE6M8HR48dINCu2!m9r5$3otL?HRk}|Ae+1x~WouSyvP0Lf~G8+fg>S5oX3LK^m zjFC6US{`(Y`)C;~BiZ}MlTE|StH+KWRqWsK6pz^X;uLN60h8o%b~MO3=AVwwc{b?RiJb@+-HE6E)01oNK?L%)dNvdO#My0WqM+Ht4TUOl;WuihS#k-;jHYsQft@ zQXt!(JS^h5maUQsW}z@dO&PaM**W_7i4!#DcF+JGbgK6z7N4`dav}Q7+qbl>rtSF* z&~xrrW2cxTmWsA9=cav{LKtcBw%)AFn>j{on?wI8jm)(vYgg5xEyyC~my@*2`(~Ps zGH<^wo^!w7dB3PHN!}b)_7BB_j{Q4hGjP^gmigy^rS4o((4?%OCkQuoGHM!UrDNaA0MKkcK|u37#j$pH^<3dS?|f-wS%phcXO<%nVe6crA8nO z^5?&m!tZ&y{;|3gBBKOl_y_p49NykxusTGfO+JLI;2$pd6C9V^dBBQPgBQ}_>pP)( z+OuWV{q#kqIy-dU3>yl-N6C>MT?4jC+|>JoVH#_`A!WIpl&TLNHU)US*yYIbz2-k zwkW!iX~1WL0;!(7v*aQF?2*&ppm4Wo(3}ci#lwUiVe6p)W?&0)MvH8Pjshpb?!9~4 z4c2hYz;#cID5v_lx=7fV#8YQ6gGsArFy6@sjcB~*h)d_o+Yxz>bb_yvOvMukoaf9Y zZsW#prIMhV$YBC)u9 z!Y(Lmym#obc1GQu3Af*kzfanG7Sko&z(oAn@8=&8f$S81^+!*&-1(a#VM(W~ROrpv zXOyB_mv-rE9PSCT*$;f+eSbV7Ku;CSPyS?m!M3gV8){bX`o=#W6AhteS(t)8=#S4_ z5C+M=)Cu}_>*wvN9|L&Vk2M3DU(G1ml-3NkWGGBiPmPNG>Gmgq))cmxwC*tVNy^MY zhY!2o-g%H$PmF8^no-Pyw@tBvVxI2p`EP5+j1yE(5g_r~R-nJqL$RxWn4gKVr@U}yi=6y5 zDwcY0WNr$`Fdn@XHztxaxMFJtw@$s8&`WPn0a%x6njJwI~=*YKm1 z`qxeKhSc^{gW7~A1%_G|gCPK^#@HMS8SPYu5pwjZ z8H|s$0y~A_WrEkXSNS%h0uss>gQW|l6$S<+9toxOAp8nOp@W}blcaRR^9Dh+8hbj! zq+Q$M`I&0Np#dKS`qX5t)UXPeOp26vtx~L+8|9d^kkJate2dv}V1mTll)${nJ>2N% zJ00xpO}5r$%7MwQs&6ez&iuLVkH-VU=;cGZ$nD@o(9$eRgcdg>y1B6EjXLU&?pFb* zuFQAjxGzopNnRZy!*1=r2>HyhgLM(btB{y-;dZL4o~2touv# z@~knv3eD5#gK3I9d)8aTD@harwhd~v1duO^I=)$T=%Mfjw8HMoS=8t5`p<7($vLkJ za9uh!x@;2oCPky2lL;+=lW?rPFY9)JOkq>)3{7R6J%STaPmdcgr`ZEdExCNa)S=tj zqd<(>mBJy6oi^e*S1vRj6Q*4~H^eps$6i~ZO?X5^EQmf%FYPCGBiU}4jkQ~jLyP6y zS0+SmOIgi>waW;sG#JG#wfDA^_aLsb?~qMV|xdO&5qm%~^piDjU1 zVuri*JeisHO91(NAy?j}v=FfZ*YFPtVPC&~J(7BD^%N%NhK>v~w(UmEbUL1yF_H#PRnFS>1`ykh-Fa zFTB2CR_v*DD6>bsDH)`sl9i-n0bQ{nIDTeQ{%WGw{9`(11pY!g?HpvPf0N+tt0GJM z2B(cBpU#zWyTH+Hez`MWX82M-L`f8F8e5xof5=;1|eC~(3~4L2&gYi>H%%cuPKa6zGWDDn+CVi%VUa&o5bIM zp98|%54x?)lbFDnAx947g}q+cq#a}ktW_zf9z%3wR*O^JBLzUI6|&P>;Lx~Wv3(%0 zDPe@@M&w*h%M*Wu8OzCZ}KvE4?FrW4vpA z$6-ly%5|9R*}YrC!`bEb?b}m-JK6BRYVWLmCH;@p<4mF_^SUqzi-+A0MXt=5P%J|> zB4s*YD8Nb@wcRBLPq-S1lXb1$CPeYuT;b$f5!W@_H74O3Cs<&`1p#6-oyWRN48Orh z+CGqOi>@iZFE*=jl1gy&^5tsK3p~>}03Rfn3S%U2-%bUd9CDm4!o(a#vRcrWHglZR&glh}p?G5e_XpTX3aBT|o-b-En4Z~%37yJ8* zhZjn0*zFnWrT%`G_WUAc56bx=HD{UX*>&e$jyhWzahk4u_E!GHDQ2cpDpi*G$tBQGi2zvSr_y z7Zuk3D+S>;+v#ZR%{cSyoTV+0x5C9#3~g}%*Y5ALp`=UiVU&~@clQQ~&QY_?Y3ayayf>;>hai%d@$sd;GXv!F%A7bt~7f zjsXm7!|@7`#x}7HN~R2-ygHHQm_?bKtR?6_%xC1tLol654PJ0cRC+da05O@b#{uWYyJq>m z+cK>QSB?L(@ThRC@zfU)Z|*aBQyHlI#=kUdNc#RV#5fqnS+EwtGD7MKarqu}z4fQoCv2~Es`teld7!3^2a zX_K-oo>*-101>wL%GmzC5>TH@FSUh{HnC?C^ZNuU!^9pw+Vo@j2d!lp#mhQLeJk^4 zDnjNGf9dPHTHvx7fnm^ncQEiz7{G4R2VlbAp9SNy3e9*{fUTtdQr%`D^!Ee(913*nCl?Ph`?-#y?VG-j&=$8?A-tcd z&VA-tMoHzf?xhsEk_8xS-MX7SpJz$2%)zb}p>0Z%Kv&`VK3akl#aOgW2Aibr^G8C) zg|bnq93lKZU@F@_U_1)_9zx}OM#FDtH`D>d)g+_%Tm*4C*!Uz2aSccQqAm~VQ!FGQ zZIl!yg&&Yl1nSJ?;Wh)v=pCxaxX(krHhX7yvR&_cdxP@9c!5AVm0epuu#WW);-JXY zLrUluFJ2JW3yrDlK+3&v39WZ=O(R1*us%VvYTHF=0pA3Tu4BbM93u9~*h6sG|2oLl z&u(G$*Cm*xwBiMHJJOd$cM=-W#|7#Jw2aH^el%RdxS^}={{D~iK5b7M02g!pzWMp` z8ZW#~J6v_t-|mTWrK#2d`a!K3jaCp_-B8vjB{@{b_$NO#yf5Q2^U$w15HX8`G52hL z?%}IHiQZu10B2Hjbn+^{KuuMcKpKbx4}5ITnCfq+?Wqb=Xrx9z1qceF8PK!jgaVKA z7C2Dr(g)+8gFWR;WF7SXS{E570%b#MD|pEVWDf+*^c5dnM4i0dw>%P5E>inW!a%B zdNnSO?m{G#AdZ02?Id`kYB@JG+PL*pOgC?kOGsI91$M<_hH1?`DRd1uKYG7S zd_B7!5F`AP2+Ihp5e~q(_5L<~A+YX+{dtGB$uh%*Q@8H?QV zRTBX4KwvXgYsF0~a|P7Ec~a<+gQ}=%ugAHxjZ>i38CJ3?{9y7sP=aWd{eK811M_cJ z?^OXFetz__upxMlfoqb3KtQ+czj)2VI-Ydt>y42>5FR0JK=f>Q5W;w9n+`m#bU_ik zv2>#o-=n6O##`y#8d0(g3GVf!AjfW;f8ySL$Dfh;_qN^Aaj6O-&wVJpQ6~#^Gev$f z_95OUFpnUV7gyC@wat!%{T zEIR`NA<+AnaZPg_J5k_Oz0Ol2DYqKV!~7~<-tuA!3lOSGfNQzmSu)l3X(do_x&zRr zhQK=+xfV7`h~!bj(&_Vk#b>`b0efe1j!7^|(hTq@b)u2M#kaxz|0R8B-Zad44f}_Z zLjBc-+0p==8w4b}q9hU%JX+EZ(-S!P!6f%I+nRj?!3hjefP-u<5j4INSPi6MdhlTY zFM2Yr6!J)vF6u^>MkwNRSIsw|W?l^(>N#I=W+wI3Y15f#u*$djcHvvoyb6QrV@2;gRY^x$VIF>ux8a@e-0;I zS{4|fX!fe{erN0nWKpbPbs=rRwLd&qJ7B>4<2Z*#U`BX&gKNqp#5!4l^{K73)Kjxo zq44xhsy?+rs|LE|(d#_#1ZF@M<0o{r=va>Q`svzf*2W3Ql^=i?eYmf%wTe7y4bCNn z;YKrcq%+u6#{K{tM+Jx<#m!n`^Wbz$!%jcv?|KIwn2~)eg!HF-Ln*xAo~r`A6$>0S zvsC^4foP43D0*?^7wUoIVALckNj2bRA>|0MYq8VWxwG0uptd9JBd9BYOyVUhzBwjZ zPA%=q`Q>97!iMXA2|T}>o?P;}!E%|EK&T>j2l=yx)z5AX1|lSjp$1%Qgry69w`vKM z)+RGGjY%6Lnln^TOqJc}mh_10qnMw1`ayhT`FiBk>s{CdjE@cJA%T}YU6OmOc7EUk z54^|-64?P@W%Z?#ZKaxNR|?w&Y{xTJ$pRDb$3QSWcAnDvGe|8&Jb$*bOm z-ZQb*z&0!ZH4s65r0f!4G@dI ztq$Ah=T;)2b-M?8i_Me2C7t48ghRk#XvCcpa(_f-ffM&0Jdqlxo7^`)xWR)4`HOK| z_60Ds5yO!K9YvbWjT3D?wE)=L%tiSbPQ04H-qzDsf{^w`lj%}t_w8EZdZ@_kT~1V$ zz3$xpB$6RE8i?8p(2%7x*#iX#J=%WK{|aSbw6u62M~%*B>@zqY^t9_&s-*WjMohk= z+-*>Qh_w#*7g5No$L1U}5_^DI-d^YFw=&So%yWA+VUL8eZ)1Si8?cCdiDUS_Aw^Qa zt&==ep0{ecR6FM~fl1xoH^lNSD=nwIVh@Mmt}?4v2&qo1WU`wI%18B@o}Ta^CCxa0 zBQQdJx0i+|=|3||dwx)%oux;RhxSImi2MMjQEtV$%`(m$c<$sTs<6t4}sy8$w z`30nB*cR&n1ulRB+r6s*l{AA%wXLXc@uDA8n3?lUa(bkVVNt)D&`booB#@ms*{NCV z%@~4~)l$n(yA2Xlummg?Eq+YZzP^%wT0P0&G$(Ex=A|-QqjmhogOtGe$+??LJ)J?P z&BH7MiO_ZxW@)bA5kMU$mjGuY46*5b1tD;di{4NKWj2{RYhS-zy)pn!fb=UH>puAzyZ56|U#|>4~vR z{TvHqiDjL}KU)lUD@-5l`$zI|JP*Iiny61`!7f|34mtmt9slcA1*_(zT{1GtLsIFg z)Am4X5^McY3qY$C;w1v zdJH~1NHEh}eA7_nf-|zfjJPb)2S*8z`Jsk4&m&wtlB8K}_Tr*SzfnPH!~pcB`?OA# zZ!u0<6f`|FE{%CZZzIoYoQMpWpFWeU~60QLyq)6zBEy9AHKX> zmIatEz4kZ7IQ`e^fgkA`=iP5G%t0QO!F?aEUOLPC`w1(ijSw4_$JuY`vmuMIVQDo$ z95B>_X6L$Bx3HIyy>WzggmkS$|K28?(w6Vm%;S3R^@EN+wb{t{ac)asnhSjgC;c5O zmQN)}Ss(>lvn!N)UyK7d5wC6?usZ`^)Jp*Bb@1RW_8DLwFY5lxJd+mpE_@3NlELh1 zgKB>}vV;E5soe77g&%kQ?Ynm`lh3;u9EYe0E&@17s}L?69aZy-Ufvi8Qy0IHRjBmN z{l#>&iOKipnTN_W^Xnf|1v>gFX!9&C#g!acwRcTTsqF=vF{6Z~7s762nIFRj(|hiH zFD3lVY3G8AzaK|;`}nUqqt>#xQLqr<`yYXT=sop9Gax3hA3VH>(>RP6rV*oTk=rS% zJ$vx)XM1Gzpyq$=5GxZi4&lGv=ji5PCLqwwKEx@!eI zHV{t|v(@GJ;#^~Cd6?z_SSetwpkTp{cT#~YnSQ>75P552CvWxZSNWFT5-|@sS1D~u zW~nc+qVQC%<4hnVtmLfdS_{7{SKQMK~TPtPNOOii@u=?3IZ=8hj=-xK= zK~sc?F^QeU3U``LqgD5+)(3=7YUt#E(fK?Ch6i@^22JRXZ@t3lTybr^&=jQcf2goX z(0%YgQFE+e0Xacy{`0F7fL0tV|4yJ${-|jF{4qkof`GXjb}-36&q_iEca%avjmd9! zlv14Pt(H4+SG3HrgmVP`ce#nFoDHfy-;n{los}G1dKC{MYAWQUG2k~K;B`V8Kaa7@ z2X9RRwAV5ZuP83%Gk+qCd+g?V12`Y}Cl^-lm}b-`TEn#*iZK7a2ZPiA4#>5@IW4#FA1~~@o=*V z0k74(_t=eaXglU{M%f!)(g9mz%^K~JL*T!xM%n>#quf*72r)+w_o3QU*`2ZeR$rVy zzq-y^=o>jGutB5HrVBtMs17QPQz?sGP+Vz>OI1764KzRn{K1gMH10>Oz|j2PfOi zsA;VqXD@7Njzl7*X#^Gxgs?{+`WsMQJW+yS1&+(8md3|Gs&19?5Tjn)lF$#c+Aril z6rY#U;E}s=zF;uDK}RQLF)5Xq$8JV0;^ayI&;x11o`iHMDZkWAB9qUHeyKxkBtyEl z#v{tbV{FiPy>JOJdyL;1KzgaJa8chd;pf^`Q~9 z10X36uJWUzVbRq9=PM1^HKN8_lx%;hxQNLNgu8CWMW&}FSS3}f9Bs+-NoNB0C8 zy9H(t!qG3P-E6OZ)gAjwI5-!3}r z_FG!flcMlzH%@=^YxV-&$6m97KRhzc1&do6(rihq{mrtE35?-)js|y_xCUm9q!aNS zk?DmQ1@hxme~L9n5W(wq+;5IN+<_bdzWp0H_e4hn!TJ(_N_s&tik@P~eQ3YJH!kII zx(H^pUvC3_%58fV(@_7z9zX*>fbqIvOL|=|T$2%79h=eip#^c&8LZ6_i9ivcRbuGv zjjK-B+PzzPs~68?oe_kU;i-M+e`ENx=r#C6wd&Bdm1YVL)s=Beit%W?e+Gk8H)UMb zQjUKVoDopmu#i?ucj-2*Gv&^kOx=Z>THfA`FMLny55TdEjkxm^yr4m*Sz1n4D`3%1 zd6-%gTm6eNiwdTrR?K%m*Y6lK4DHlcge`=WAzQC0F%+AY7!XD4?^2pR@KwW4OnnS* zrpec%gz^4ORyGQH`ftbL4=_uMfXnvVC+|%iIB55}Gfr3)xhkw(yH-`G!glV^)07eD zN%YT4^!e?k*@LX~&6_vs0weo3ZBN(%pm1Zhe2NaFw;l7t?e>q~pW|5eOYiNww0_d3 z!#9oDwpJ*m@cgyz1;$P9OYMn_(S|Yk z`2(08qib0+&o>Gc%$y2#f)ybTsD}Gg+k|PXbJ79R_@+vd1)&>MRQQ+G|kjQufU=D;>dGej`N|cksLPlr%J8? zX9FOy1=7D2EUcTi(rnDJHicWqiUTIAGt#gePw1BWz~wWmLin61*%1?}W7K4*;Q<*G zNSNZ|bD^dh$hmZv=M)um_i>I=yPlihl*9(BxL;v_av*QIz3dU2a!Zx_SauMqvn-NvOC7 zE&OT(r3Rpx7;pg_P;*Ud;!!*U)^NKL$XyB=$pKSm0X6G%Xqy-4=wR>}ia_8WK)5#m z_Hys|XEg@E=|~ZC3zM}1p^krtS0S-aScR3jA1*)XG&Q>W=6(Mhd9$hE zNKjhQuwDe_(@$)eQgmjc2!%=53S7en{KEVLpr>`&g341_@Z-((SWD0_x~0rQJ6aZz zE_kb>$pNjp6ehOHwe^`}S`aAN98%`txj0qLNAEl~qDzKO_KQVj-sEh5aG}{@t6V4O z#n!7XxH|@F&de84c%a;pe+g>JRD}%A^C;+77Kw;J4@#u z;~e<~*5}Kuh?LNBwb(bn6W8$7hkoOwf^1Vmtp#TS9=XvZT6B@%+F9oVSE+QqLsjtr zZZQS~wgd+6Odg?#eOiDcve&pU8Ar)(R|~^pNu&1AbMKJBk;FjZ_Po9jV0^*6qeMx` z;Q1HIZWOZ)qK8s2@ZW)Qm{zZ?68-w7aIH0(qyTwn?B(u&29{CrLZ=UZs&%n+s$JDC zHTpqdp2Mw>5sT#?7Vhw>C`quR`?Pcpx2GtyEevI$9RS;?iiVa9a@j#m-UX@b@_Lw& zxVHwv1%L9&)E@5iV2fy*MW$IDG2`JK=A3IBcf3cm8b40&;fMSO3qqQLnFg?wDXfCT|l%Ea*%Tu?L|CCgQ2}wyRHaLZwf_tjq0_kG0-Y$ zTYD1*xow=*gq6Xt@Xo3Z6jAqfu*^JngLE2xg9T_oh5{=Ro+BFPl1KRLfAy#9;Pc%J zjOaasU1d=b_v!hLSrL`=5}#u3{2LL|Y8aeZ1tdslVc^0Qc2Oe^rt0U2-n+M}OlK!dlQPf4WnE%wp03jSp^pIf`>a{& zGVt?-aOx66xf5Td&)HxUZl~9@z6UN_qsftCdNqi1(*SsV zwwMPIAU}aZhG^;^+vz`|p$~M_8YevW6cRzL8}Pho>41s1JCRH&>n1^sPV#0v?|S18 zLy_j>BgX*eisxoesm#O0Knbn6Hq_7nZU(by1TLs}<2nwvtJUQ0XtZ1CC@SuS7#T;& zp&0-L+I<#QLI)YI6{w4xxMh=v*{4j8yLY~<_9T|U%|{s(7WF@2K_v$lsKRXn8;(O; z5UvrK0;}1Lb|4qU-4>Cqjx}ZF;r-5(Q_3WNwM&NUEsqaTa?m;r32LZ!QNbrcxa`hw zQ$7>?`Fa)bm^B}&xJ6D6ebQUERk2UTRqfd)7XXG8&0NuKcl)O8H{@$g{cw+92&&CQ z?A?2NPd*B+h*$+I@ReEZgqblET<`#4;uzFYZc?02AT>C|l)F%c>n@)iF$_TnoDf#- z0Wz;P)gX4{PAF74G$IN&yT!mnaR=<-d=I!ROKr}# zP-4p#xwUHzh^D2&#ptiBnZN;MQ=6bPo&FCS-Kxr)9Shf2cplWys3)e>X1LP|BH9wh zUV|0~9xhK8(!7nxR(?sJ-!Qze!Qm^&gW(h7YDjH>{E(Gg84V4J?hEFcfX;oFJ;j>{ z7Tc~Y48y+(DTL2gOEaX z@!Kwbh=P9y9Tj9d!kB{ktUo-8o2}f&BS5O8gs4|BZ#V|lY3@dXpuq`~ -#include -#include "ti_drivers_config.h" -#include "ti_drivers_open_close.h" -#include "ti_board_open_close.h" -#include -#include -#include - -/** \brief Global Structure pointer holding PRUICSSG1 memory Map. */ - -PRUICSS_Handle gPruIcssHandle; - -/* - * This example uses the PRUICSS PWM module to generate a signal - * with a specified duty cycle. - * - * The default parameters are : Frequency : 1kHz, Duty cycle : 25%, - * All these parameters are configurable. - * - * In this example PWM0_2_NEG(alias signal B2) is used to generate the signal, the user can also - * select a different one. - * - * PWM0_2_NEG(alias signal B2) uses IEP0 CMP6 EVENT to control Duty cycle - * & IEP0 CMP0 to control output Frequency - * This example also showcases how to configure and use the PRUICSS PWM module. - */ - -/*FIXME: IEP0_CLK_FREQ macro to be included in driver_config.h sysconfig generated file*/ -#define PRUICSS_IEP0_CLK_FREQ (200000000U) -/* Modify this to change the IEP counter increment value*/ -#define PRUICSS_IEP_COUNT_INCREMENT_VALUE (1U) -/* Duty Cycle of PWM output signal in % - give value from 1 to 99 */ -#define APP_PRUICSS_PWM_DUTY_CYCLE (25U) -/* Frequency of PWM output signal in Hz - 1 KHz is selected */ -#define APP_PRUICSS_PWM_OUTPUT_FREQ (1U * 1000U) -/* PRD value - this determines the period */ -#define APP_PRUICSS_PWM_PRD_VAL (((PRUICSS_IEP0_CLK_FREQ / APP_PRUICSS_PWM_OUTPUT_FREQ))*(PRUICSS_IEP_COUNT_INCREMENT_VALUE)) -/* DUTY CYCLE width - this determines width of PWM output signal duty cycle*/ -#define APP_PRUICSS_IEP0_COMP6_VAL (APP_PRUICSS_PWM_PRD_VAL-((APP_PRUICSS_PWM_DUTY_CYCLE*APP_PRUICSS_PWM_PRD_VAL)/100)) - -Pinmux_PerCfg_t gPinMuxMainDomainCfg1[] = { - - /* PRU_ICSSG1_PWM0 pin config */ - /* PRG1_PWM0_B2 -> PRG1_PRU0_GPO17 (U7) */ - { - PIN_PRG1_PRU0_GPO17, - ( PIN_MODE(3) | PIN_PULL_DISABLE ) - }, - - {PINMUX_END, PINMUX_END} -}; -void pruicss_iep_init(void *args) -{ - int32_t status; - /*Disable IEP0 counter*/ - status = PRUICSS_controlIepCounter(gPruIcssHandle, PRUICSS_IEP_INST0, 0); - DebugP_assert(SystemP_SUCCESS == status); - - Pinmux_config(gPinMuxMainDomainCfg1, PINMUX_DOMAIN_ID_MAIN); - - /*Intialize IEP0 count value*/ - PRUICSS_PWM_setIepCounterLower_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0, 0xFFFFFFFF); - PRUICSS_PWM_setIepCounterUpper_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0, 0xFFFFFFFF); - - /*configure cmp 0 value with APP_PRUICSS_PWM_PRD_VAL*/ - status = PRUICSS_PWM_setIepCompareEventLower_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0, CMP_EVENT0, (APP_PRUICSS_PWM_PRD_VAL & 0xFFFFFFFF)); - DebugP_assert(SystemP_SUCCESS == status); - - /*configure cmp 6 value with APP_PRUICSS_IEP0_COMP6_VAL*/ - status = PRUICSS_PWM_setIepCompareEventLower_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0, CMP_EVENT6, (APP_PRUICSS_IEP0_COMP6_VAL & 0xFFFFFFFF)); - DebugP_assert(SystemP_SUCCESS == status); - - /*Enable cmp 0 and cmp 6*/ - status = PRUICSS_PWM_configureIepCompareEnable(gPruIcssHandle, PRUICSS_IEP_INST0, 0x41); - DebugP_assert(SystemP_SUCCESS == status); - - /*Set IEP0 counter Increment value*/ - status = PRUICSS_setIepCounterIncrementValue(gPruIcssHandle, PRUICSS_IEP_INST0, PRUICSS_IEP_COUNT_INCREMENT_VALUE); - DebugP_assert(SystemP_SUCCESS == status); - - /*Enable cmp 0 reset of counter*/ - PRUICSS_PWM_configureIepCmp0ResetEnable(gPruIcssHandle, PRUICSS_IEP_INST0, 0x1); - - /*Enable IEP0 counter*/ - status=PRUICSS_controlIepCounter(gPruIcssHandle, PRUICSS_IEP_INST0, 1); - DebugP_assert(SystemP_SUCCESS == status); - -} - -void pruicss_pwm_init(void *args) -{ - int32_t status; - /*Enable IEP CMP flags to auto clear after state transition*/ - status = PRUICSS_PWM_configurePwmEfficiencyModeEnable(gPruIcssHandle, 1); - DebugP_assert(SystemP_SUCCESS == status); - /*Enable compare0 trip reset */ - PRUICSS_PWM_configurePwmCmp0TripResetEnable(gPruIcssHandle, PRUICSS_PWM_SET0, 1); - /*configure PWM B2 signal of set 0, intial state to low*/ - status = PRUICSS_PWM_actionOnOutputCfgPwmSignalB2(gPruIcssHandle, PRUICSS_PWM_SET0, PRUICSS_PWM_INTIAL_STATE, PRUICSS_PWM_OUTPUT_LOW); - DebugP_assert(SystemP_SUCCESS == status); - /*configure PWM B2 signal of set 0, active state to high*/ - status = PRUICSS_PWM_actionOnOutputCfgPwmSignalB2(gPruIcssHandle, PRUICSS_PWM_SET0, PRUICSS_PWM_ACTIVE_STATE, PRUICSS_PWM_OUTPUT_HIGH); - DebugP_assert(SystemP_SUCCESS == status); -} - -void pruicss_pwm_duty_cycle_main(void *args) -{ - - int32_t status; - - Drivers_open(); // check return status - - status = Board_driversOpen(); - DebugP_assert(SystemP_SUCCESS == status); - - gPruIcssHandle = PRUICSS_open(CONFIG_PRU_ICSS0); - DebugP_assert(gPruIcssHandle != NULL); - - pruicss_pwm_init(NULL); - - pruicss_iep_init(NULL); - - while (1) - { - ClockP_usleep(1); - } - - Board_driversClose(); - Drivers_close(); -} diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec index 98b8b4b..33fa1d4 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -47,6 +47,7 @@ -Wno-gnu-variable-sized-type-not-at-end -Wno-unused-function -DSOC_AM243X + -Dam243x_evm " linkerBuildOptions=" -i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib @@ -98,7 +99,7 @@ - + diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile index d083a02..8e0122b 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile @@ -66,6 +66,7 @@ INCLUDES_common := \ DEFINES_common := \ -DSOC_AM243X \ + -Dam243x_evm \ CFLAGS_common := \ -mcpu=cortex-r5 \ diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/example.syscfg b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/example.syscfg index 0edc809..446b5a3 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/example.syscfg +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/example.syscfg @@ -17,6 +17,9 @@ const mpu_armv72 = mpu_armv7.addInstance(); const mpu_armv73 = mpu_armv7.addInstance(); const mpu_armv74 = mpu_armv7.addInstance(); const mpu_armv75 = mpu_armv7.addInstance(); +const pwm = scripting.addModule("/pru_icssg/pwm", {}, false); +const pwm1 = pwm.addInstance(); +const pwm2 = pwm.addInstance(); /** * Write custom configuration values to the imported modules. @@ -53,6 +56,16 @@ mpu_armv75.baseAddr = 0x60000000; mpu_armv75.size = 28; mpu_armv75.accessPermissions = "Supervisor RD, User RD"; +pwm1.$name = "CONFIG_PRU_ICSS_PWM0"; +pwm1.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM0"; +pwm1.PRU_ICSSG0_PWM.A0.$assign = "PRG0_PRU0_GPO12"; +pwm1.PRU_ICSSG0_PWM.A0.$used = true; + +pwm2.$name = "CONFIG_PRU_ICSS_PWM1"; +pwm2.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM3"; +pwm2.PRU_ICSSG0_PWM.B2.$assign = "PRG0_PRU0_GPO5"; +pwm2.PRU_ICSSG0_PWM.B2.$used = true; + /** * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec index 718b305..806ba2a 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -98,7 +98,7 @@ - + diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/example.syscfg b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/example.syscfg index 7f5f8f6..7bbede0 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/example.syscfg +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/example.syscfg @@ -8,6 +8,8 @@ /** * Import the modules used in this configuration. */ +const i2c = scripting.addModule("/drivers/i2c/i2c", {}, false); +const i2c1 = i2c.addInstance(); const pruicss = scripting.addModule("/drivers/pruicss/pruicss", {}, false); const pruicss1 = pruicss.addInstance(); const debug_log = scripting.addModule("/kernel/dpl/debug_log"); @@ -18,12 +20,15 @@ const mpu_armv73 = mpu_armv7.addInstance(); const mpu_armv74 = mpu_armv7.addInstance(); const mpu_armv75 = mpu_armv7.addInstance(); const mpu_armv76 = mpu_armv7.addInstance(); +const pwm = scripting.addModule("/pru_icssg/pwm", {}, false); +const pwm1 = pwm.addInstance(); +const pwm2 = pwm.addInstance(); /** * Write custom configuration values to the imported modules. */ +i2c1.$name = "CONFIG_I2C0"; pruicss1.$name = "CONFIG_PRU_ICSS0"; -pruicss1.instance = "ICSSG1"; pruicss1.AdditionalICSSSettings[0].$name = "CONFIG_PRU_ICSS_IO0"; debug_log.enableUartLog = true; @@ -64,6 +69,16 @@ mpu_armv76.$name = "CONFIG_MPU_REGION5"; mpu_armv76.baseAddr = 0x80000000; mpu_armv76.size = 31; +pwm1.$name = "CONFIG_PRU_ICSS_PWM0"; +pwm1.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM0"; +pwm1.PRU_ICSSG0_PWM.A0.$assign = "PRG0_PRU0_GPO12"; +pwm1.PRU_ICSSG0_PWM.A0.$used = true; + +pwm2.$name = "CONFIG_PRU_ICSS_PWM1"; +pwm2.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM3"; +pwm2.PRU_ICSSG0_PWM.B2.$assign = "PRG0_PRU0_GPO5"; +pwm2.PRU_ICSSG0_PWM.B2.$used = true; + /** * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to @@ -71,3 +86,6 @@ mpu_armv76.size = 31; */ debug_log.uartLog.UART.RXD.$suggestSolution = "UART0_RXD"; debug_log.uartLog.UART.TXD.$suggestSolution = "UART0_TXD"; +i2c1.I2C.$suggestSolution = "I2C0"; +i2c1.I2C.SCL.$suggestSolution = "I2C0_SCL"; +i2c1.I2C.SDA.$suggestSolution = "I2C0_SDA"; \ No newline at end of file diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/pruicss_pwm_dutycycle.c b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/pruicss_pwm_dutycycle.c deleted file mode 100644 index f008d27..0000000 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/pruicss_pwm_dutycycle.c +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2023 Texas Instruments Incorporated - * - * 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. - */ - -#include -#include -#include "ti_drivers_config.h" -#include "ti_drivers_open_close.h" -#include "ti_board_open_close.h" -#include -#include -#include - -/** \brief Global Structure pointer holding PRUICSSG1 memory Map. */ - -PRUICSS_Handle gPruIcssHandle; - -/* - * This example uses the PRUICSS PWM module to generate a signal - * with a specified duty cycle. - * - * The default parameters are : Frequency : 1kHz, Duty cycle : 25%, - * All these parameters are configurable. - * - * In this example PWM0_2_NEG(alias signal B2) is used to generate the signal, the user can also - * select a different one. - * - * PWM0_2_NEG(alias signal B2) uses IEP0 CMP6 EVENT to control Duty cycle - * & IEP0 CMP0 to control output Frequency - * This example also showcases how to configure and use the PRUICSS PWM module. - */ - -/*FIXME: IEP0_CLK_FREQ macro to be included in driver_config.h sysconfig generated file*/ -#define PRUICSS_IEP0_CLK_FREQ (200000000U) -/* Modify this to change the IEP counter increment value*/ -#define PRUICSS_IEP_COUNT_INCREMENT_VALUE (1U) -/* Duty Cycle of PWM output signal in % - give value from 1 to 99 */ -#define APP_PRUICSS_PWM_DUTY_CYCLE (25U) -/* Frequency of PWM output signal in Hz - 1 KHz is selected */ -#define APP_PRUICSS_PWM_OUTPUT_FREQ (1U * 1000U) -/* PRD value - this determines the period */ -#define APP_PRUICSS_PWM_PRD_VAL (((PRUICSS_IEP0_CLK_FREQ / APP_PRUICSS_PWM_OUTPUT_FREQ))*(PRUICSS_IEP_COUNT_INCREMENT_VALUE)) -/* DUTY CYCLE width - this determines width of PWM output signal duty cycle*/ -#define APP_PRUICSS_IEP0_COMP6_VAL (APP_PRUICSS_PWM_PRD_VAL-((APP_PRUICSS_PWM_DUTY_CYCLE*APP_PRUICSS_PWM_PRD_VAL)/100)) - -Pinmux_PerCfg_t gPinMuxMainDomainCfg1[] = { - - /* PRU_ICSSG1_PWM0 pin config */ - /* PRG1_PWM0_B2 -> PRG1_PRU0_GPO17 (U7) */ - { - PIN_PRG1_PRU0_GPO17, - ( PIN_MODE(3) | PIN_PULL_DISABLE ) - }, - - {PINMUX_END, PINMUX_END} -}; -void pruicss_iep_init(void *args) -{ - int32_t status; - /*Disable IEP0 counter*/ - status = PRUICSS_controlIepCounter(gPruIcssHandle, PRUICSS_IEP_INST0, 0); - DebugP_assert(SystemP_SUCCESS == status); - - Pinmux_config(gPinMuxMainDomainCfg1, PINMUX_DOMAIN_ID_MAIN); - - /*Intialize IEP0 count value*/ - PRUICSS_PWM_setIepCounterLower_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0, 0xFFFFFFFF); - PRUICSS_PWM_setIepCounterUpper_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0, 0xFFFFFFFF); - - /*configure cmp 0 value with APP_PRUICSS_PWM_PRD_VAL*/ - status = PRUICSS_PWM_setIepCompareEventLower_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0, CMP_EVENT0, (APP_PRUICSS_PWM_PRD_VAL & 0xFFFFFFFF)); - DebugP_assert(SystemP_SUCCESS == status); - - /*configure cmp 6 value with APP_PRUICSS_IEP0_COMP6_VAL*/ - status = PRUICSS_PWM_setIepCompareEventLower_32bitValue(gPruIcssHandle, PRUICSS_IEP_INST0,CMP_EVENT6, (APP_PRUICSS_IEP0_COMP6_VAL & 0xFFFFFFFF)); - DebugP_assert(SystemP_SUCCESS == status); - - /*Enable cmp 0 and cmp 6*/ - status = PRUICSS_PWM_configureIepCompareEnable(gPruIcssHandle, PRUICSS_IEP_INST0, 0x41); - DebugP_assert(SystemP_SUCCESS == status); - - /*Set IEP0 counter Increment value*/ - status = PRUICSS_setIepCounterIncrementValue(gPruIcssHandle, PRUICSS_IEP_INST0, PRUICSS_IEP_COUNT_INCREMENT_VALUE); - DebugP_assert(SystemP_SUCCESS == status); - - /*Enable cmp 0 reset of counter*/ - PRUICSS_PWM_configureIepCmp0ResetEnable(gPruIcssHandle, PRUICSS_IEP_INST0, 0x1); - - /*Enable IEP0 counter*/ - status = PRUICSS_controlIepCounter(gPruIcssHandle, PRUICSS_IEP_INST0, 1); - DebugP_assert(SystemP_SUCCESS == status); - -} - -void pruicss_pwm_init(void *args) -{ - int32_t status; - /*Enable IEP CMP flags to auto clear after state transition*/ - status = PRUICSS_PWM_configurePwmEfficiencyModeEnable(gPruIcssHandle, 1); - DebugP_assert(SystemP_SUCCESS == status); - /*Enable compare0 trip reset */ - PRUICSS_PWM_configurePwmCmp0TripResetEnable(gPruIcssHandle, PRUICSS_PWM_SET0, 1); - /*configure PWM B2 signal of set 0, intial state to low*/ - status = PRUICSS_PWM_actionOnOutputCfgPwmSignalB2(gPruIcssHandle, PRUICSS_PWM_SET0, PRUICSS_PWM_INTIAL_STATE, PRUICSS_PWM_OUTPUT_LOW); - DebugP_assert(SystemP_SUCCESS == status); - /*configure PWM B2 signal of set 0, active state to high*/ - status = PRUICSS_PWM_actionOnOutputCfgPwmSignalB2(gPruIcssHandle, PRUICSS_PWM_SET0, PRUICSS_PWM_ACTIVE_STATE, PRUICSS_PWM_OUTPUT_HIGH); - DebugP_assert(SystemP_SUCCESS == status); -} - -void pruicss_pwm_duty_cycle_main(void *args) -{ - - int32_t status; - - Drivers_open(); // check return status - - status = Board_driversOpen(); - DebugP_assert(SystemP_SUCCESS == status); - - gPruIcssHandle = PRUICSS_open(CONFIG_PRU_ICSS0); - DebugP_assert(gPruIcssHandle != NULL); - - pruicss_pwm_init(NULL); - - pruicss_iep_init(NULL); - - while (1) - { - ClockP_usleep(1); - } - - Board_driversClose(); - Drivers_close(); -} diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec index cd122fb..676b890 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -47,6 +47,7 @@ -Wno-gnu-variable-sized-type-not-at-end -Wno-unused-function -DSOC_AM64X + -Dam64x_evm " linkerBuildOptions=" -i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib @@ -98,7 +99,7 @@ - + diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile index e647562..0be861a 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile @@ -66,6 +66,7 @@ INCLUDES_common := \ DEFINES_common := \ -DSOC_AM64X \ + -Dam64x_evm \ CFLAGS_common := \ -mcpu=cortex-r5 \ diff --git a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/pruicss_pwm_dutycycle.c b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/pruicss_pwm_dutycycle.c similarity index 88% rename from examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/pruicss_pwm_dutycycle.c rename to examples/pruicss_pwm/pruicss_pwm_duty_cycle/pruicss_pwm_dutycycle.c index 74a60c0..5dbf03e 100644 --- a/examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/pruicss_pwm_dutycycle.c +++ b/examples/pruicss_pwm/pruicss_pwm_duty_cycle/pruicss_pwm_dutycycle.c @@ -37,11 +37,6 @@ #include "ti_board_open_close.h" #include #include -#include - -/** \brief Global Structure pointer holding PRUICSSG0 memory Map. */ - -PRUICSS_Handle gPruIcssHandle; /* * This example uses the PRUICSS PWM module to generate a signal @@ -61,6 +56,39 @@ PRUICSS_Handle gPruIcssHandle; * * This example also showcases how to configure and use the PRUICSS PWM module. */ +#if defined(am243x_evm) || defined(am64x_evm) +#include + +static TCA6424_Config gTCA6424_Config; + +static void i2c_io_expander(void *args) +{ + int32_t status = SystemP_SUCCESS; + TCA6424_Params tca6424Params; + TCA6424_Params_init(&tca6424Params); + status = TCA6424_open(&gTCA6424_Config, &tca6424Params); + uint32_t ioIndex; + + if(status == SystemP_SUCCESS) + { + /* set P12 high which controls CPSW_FET_SEL -> enable PRU1 and PRU0 GPIOs */ + ioIndex = 0x0a; + status = TCA6424_setOutput( + &gTCA6424_Config, + ioIndex, + TCA6424_OUT_STATE_HIGH); + + /* Configure as output */ + status += TCA6424_config( + &gTCA6424_Config, + ioIndex, + TCA6424_MODE_OUTPUT); + } + TCA6424_close(&gTCA6424_Config); +} +#endif +/** \brief Global Structure pointer holding PRUICSSG0 memory Map. */ +PRUICSS_Handle gPruIcssHandle; /*FIXME: IEP0_CLK_FREQ macro to be included in driver_config.h sysconfig generated file*/ #define PRUICSS_IEP0_CLK_FREQ (200000000U) @@ -79,26 +107,6 @@ PRUICSS_Handle gPruIcssHandle; /* DUTY CYCLE width - this determines width of PWM output signal duty cycle*/ #define APP_PRUICSS_IEP1_COMP12_VAL (APP_PRUICSS_PWM_PRD_VAL-((APP_PRUICSS_PWM3_B2_DUTY_CYCLE*APP_PRUICSS_PWM_PRD_VAL)/100)) -/*FIXME: Add pinmux in sysconfig generated file*/ -Pinmux_PerCfg_t gPinMuxMainDomainCfg1[] = { - - /* PRU_ICSSG0_PWM0 pin config */ - /* PRG0_PWM0_A0 -> PRG0_PRU0_GPO12 (K1) */ - { - PIN_PRG0_PRU0_GPO12, - ( PIN_MODE(3) | PIN_PULL_DISABLE ) - }, - /* PRU_ICSSG0_PWM3 pin config */ - /* PRG0_PWM3_B2 -> PRG0_PRU0_GPO5 (F2) */ - { - PIN_PRG0_PRU0_GPO5, - ( PIN_MODE(3) | PIN_PULL_DISABLE ) - }, - {PINMUX_END, PINMUX_END} - -}; - - void pruicss_iep_init(void *args) { @@ -194,7 +202,10 @@ void pruicss_pwm_duty_cycle_main(void *args) gPruIcssHandle = PRUICSS_open(CONFIG_PRU_ICSS0); DebugP_assert(gPruIcssHandle != NULL); - Pinmux_config(gPinMuxMainDomainCfg1, PINMUX_DOMAIN_ID_MAIN); + #if defined(am243x_evm) || defined(am64x_evm) + /* Configure the IO Expander to connect the PRU IOs to HSE */ + i2c_io_expander(NULL); + #endif pruicss_pwm_init(NULL); diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am243x.js b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am243x.js index 3eddb53..7a4ac35 100644 --- a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am243x.js +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am243x.js @@ -48,7 +48,11 @@ const libs_freertos_r5f = { ], }; - +const defines = { + common: [ + "am243x_evm", + ], +}; const lnkfiles = { common: [ @@ -77,6 +81,7 @@ const templates_freertos_r5f = const buildOptionCombos = [ { device: device, cpu: "r5fss0-0", cgt: "ti-arm-clang", board: "am243x-lp", os: "freertos"}, + { device: device, cpu: "r5fss0-0", cgt: "ti-arm-clang", board: "am243x-evm", os: "freertos"} ]; function getComponentProperty() { @@ -101,6 +106,10 @@ function getComponentBuildProperty(buildOption) { build_property.syscfgfile = syscfgfile; build_property.readmeDoxygenPageTag = readmeDoxygenPageTag; + if(buildOption.board=="am243x-evm"){ + build_property.defines = defines; + } + if(buildOption.cpu.match(/r5f*/)) { if(buildOption.os.match(/freertos*/) ) { diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am64x.js b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am64x.js new file mode 100644 index 0000000..1a09855 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/.project/project_am64x.js @@ -0,0 +1,129 @@ +let path = require('path'); + +let device = "am64x"; + +const files = { + common: [ + "main.c", + "pruicss_pwm_epwm_sync.c" + ], +}; + +/* Relative to where the makefile will be generated + * Typically at /// + */ +const filedirs = { + common: [ + "..", /* core_os_combo base */ + "../../..", /* Example base */ + ], +}; + +const libdirs_freertos = { + common: [ + "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib", + "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/lib", + "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/board/lib", + "${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/lib" + ], +}; + +const includes_freertos_r5f = { + common: [ + "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/FreeRTOS-Kernel/include", + "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F", + "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am64x/r5f", + "${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/pruicss/g_v0", + "${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/include" + + ], +}; + +const libs_freertos_r5f = { + common: [ + "freertos.am64x.r5f.ti-arm-clang.${ConfigName}.lib", + "drivers.am64x.r5f.ti-arm-clang.${ConfigName}.lib", + "board.am64x.r5f.ti-arm-clang.${ConfigName}.lib", + "pruicss_pwm.am64x.r5f.ti-arm-clang.${ConfigName}.lib", + ], +}; + +const defines = { + common: [ + "am64x_evm", + ], +}; + +const lnkfiles = { + common: [ + "linker.cmd", + ] +}; + +const syscfgfile = "../example.syscfg"; + +const readmeDoxygenPageTag = "EXAMPLE_PRUICSS_PWM_EPWM_SYNC"; + +const templates_freertos_r5f = +[ + { + input: ".project/templates/am64x/common/linker_r5f.cmd.xdt", + output: "linker.cmd", + }, + { + input: ".project/templates/am64x/freertos/main_freertos.c.xdt", + output: "../main.c", + options: { + entryFunction: "pruicss_pwm_epwm_sync_main", + }, + } +]; + +const buildOptionCombos = [ + { device: device, cpu: "r5fss0-0", cgt: "ti-arm-clang", board: "am64x-evm", os: "freertos"}, +]; + +function getComponentProperty() { + let property = {}; + + property.dirPath = path.resolve(__dirname, ".."); + property.type = "executable"; + property.name = "pruicss_pwm_epwm_sync"; + property.isInternal = false; + property.buildOptionCombos = buildOptionCombos; + property.isSkipTopLevelBuild = false; + + return property; +} + +function getComponentBuildProperty(buildOption) { + let build_property = {}; + + build_property.files = files; + build_property.filedirs = filedirs; + build_property.lnkfiles = lnkfiles; + build_property.syscfgfile = syscfgfile; + build_property.readmeDoxygenPageTag = readmeDoxygenPageTag; + + if(buildOption.board=="am64x-evm"){ + build_property.defines = defines; + } + + if(buildOption.cpu.match(/r5f*/)) { + if(buildOption.os.match(/freertos*/) ) + { + build_property.includes = includes_freertos_r5f; + build_property.libdirs = libdirs_freertos; + build_property.libs = libs_freertos_r5f; + build_property.templates = templates_freertos_r5f; + + } + } + + return build_property; +} + +module.exports = { + getComponentProperty, + getComponentBuildProperty, +}; diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/example.syscfg b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/example.syscfg new file mode 100644 index 0000000..36832ae --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/example.syscfg @@ -0,0 +1,101 @@ +/** + * These arguments were used when this file was generated. They will be automatically applied on subsequent loads + * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments. + * @cliArgs --device "AM243x_ALV_beta" --package "ALV" --part "ALV" --context "r5fss0-0" --product "MOTOR_CONTROL_SDK@09.01.00" + * @versions {"tool":"1.18.0+3266"} + */ + +/** + * Import the modules used in this configuration. + */ +const epwm = scripting.addModule("/drivers/epwm/epwm", {}, false); +const epwm1 = epwm.addInstance(); +const i2c = scripting.addModule("/drivers/i2c/i2c", {}, false); +const i2c1 = i2c.addInstance(); +const pruicss = scripting.addModule("/drivers/pruicss/pruicss", {}, false); +const pruicss1 = pruicss.addInstance(); +const debug_log = scripting.addModule("/kernel/dpl/debug_log"); +const mpu_armv7 = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false); +const mpu_armv71 = mpu_armv7.addInstance(); +const mpu_armv72 = mpu_armv7.addInstance(); +const mpu_armv73 = mpu_armv7.addInstance(); +const mpu_armv74 = mpu_armv7.addInstance(); +const mpu_armv75 = mpu_armv7.addInstance(); +const mpu_armv76 = mpu_armv7.addInstance(); +const pwm = scripting.addModule("/pru_icssg/pwm", {}, false); +const pwm1 = pwm.addInstance(); +const pwm2 = pwm.addInstance(); + +/** + * Write custom configuration values to the imported modules. + */ +epwm1.$name = "CONFIG_EPWM0"; +epwm1.EPWM.B.$used = false; +epwm1.EPWM.SYNCO.$used = false; +epwm1.EPWM.SYNCI.$used = false; + +i2c1.$name = "CONFIG_I2C0"; + +pruicss1.$name = "CONFIG_PRU_ICSS0"; +pruicss1.AdditionalICSSSettings[0].$name = "CONFIG_PRU_ICSS_IO0"; + +debug_log.enableUartLog = true; +debug_log.uartLog.$name = "CONFIG_UART_CONSOLE"; +debug_log.uartLog.UART.$assign = "USART0"; + +const uart_v0_template = scripting.addModule("/drivers/uart/v0/uart_v0_template", {}, false); +const uart_v0_template1 = uart_v0_template.addInstance({}, false); +uart_v0_template1.$name = "drivers_uart_v0_uart_v0_template0"; +debug_log.uartLog.child = uart_v0_template1; + +mpu_armv71.$name = "CONFIG_MPU_REGION0"; +mpu_armv71.size = 31; +mpu_armv71.attributes = "Device"; +mpu_armv71.accessPermissions = "Supervisor RD+WR, User RD"; +mpu_armv71.allowExecute = false; + +mpu_armv72.$name = "CONFIG_MPU_REGION1"; +mpu_armv72.size = 15; +mpu_armv72.accessPermissions = "Supervisor RD+WR, User RD"; + +mpu_armv73.$name = "CONFIG_MPU_REGION2"; +mpu_armv73.baseAddr = 0x41010000; +mpu_armv73.size = 15; +mpu_armv73.accessPermissions = "Supervisor RD+WR, User RD"; + +mpu_armv74.$name = "CONFIG_MPU_REGION3"; +mpu_armv74.accessPermissions = "Supervisor RD+WR, User RD"; +mpu_armv74.baseAddr = 0x70000000; +mpu_armv74.size = 21; + +mpu_armv75.$name = "CONFIG_MPU_REGION4"; +mpu_armv75.baseAddr = 0x60000000; +mpu_armv75.size = 28; +mpu_armv75.accessPermissions = "Supervisor RD, User RD"; + +mpu_armv76.$name = "CONFIG_MPU_REGION5"; +mpu_armv76.baseAddr = 0x80000000; +mpu_armv76.size = 31; + +pwm1.$name = "CONFIG_PRU_ICSS_PWM0"; +pwm1.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM0"; +pwm1.PRU_ICSSG0_PWM.A0.$assign = "PRG0_PRU0_GPO12"; +pwm1.PRU_ICSSG0_PWM.A0.$used = true; + +pwm2.$name = "CONFIG_PRU_ICSS_PWM1"; +pwm2.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM3"; +pwm2.PRU_ICSSG0_PWM.B2.$assign = "PRG0_PRU0_GPO5"; +pwm2.PRU_ICSSG0_PWM.B2.$used = true; + +/** + * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future + * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to + * re-solve from scratch. + */ +epwm1.EPWM.$suggestSolution = "EHRPWM0"; +epwm1.EPWM.A.$suggestSolution = "GPMC0_AD3"; +i2c1.I2C.$suggestSolution = "I2C1"; +i2c1.I2C.SCL.$suggestSolution = "I2C1_SCL"; +i2c1.I2C.SDA.$suggestSolution = "I2C1_SDA"; +debug_log.uartLog.UART.RXD.$suggestSolution = "UART0_RXD"; +debug_log.uartLog.UART.TXD.$suggestSolution = "UART0_TXD"; diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/main.c b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/main.c new file mode 100644 index 0000000..c9ab9b3 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/main.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2018-2021 Texas Instruments Incorporated + * + * 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. + */ + +#include +#include +#include "ti_drivers_config.h" +#include "ti_board_config.h" +#include "FreeRTOS.h" +#include "task.h" + +#define MAIN_TASK_PRI (configMAX_PRIORITIES-1) + +#define MAIN_TASK_SIZE (16384U/sizeof(configSTACK_DEPTH_TYPE)) +StackType_t gMainTaskStack[MAIN_TASK_SIZE] __attribute__((aligned(32))); + +StaticTask_t gMainTaskObj; +TaskHandle_t gMainTask; + +void pruicss_pwm_epwm_sync_main(void *args); + +void freertos_main(void *args) +{ + pruicss_pwm_epwm_sync_main(NULL); + + vTaskDelete(NULL); +} + + +int main(void) +{ + /* init SOC specific modules */ + System_init(); + Board_init(); + + /* This task is created at highest priority, it should create more tasks and then delete itself */ + gMainTask = xTaskCreateStatic( freertos_main, /* Pointer to the function that implements the task. */ + "freertos_main", /* Text name for the task. This is to facilitate debugging only. */ + MAIN_TASK_SIZE, /* Stack depth in units of StackType_t typically uint32_t on 32b CPUs */ + NULL, /* We are not using the task parameter. */ + MAIN_TASK_PRI, /* task priority, 0 is lowest priority, configMAX_PRIORITIES-1 is highest */ + gMainTaskStack, /* pointer to stack base */ + &gMainTaskObj ); /* pointer to statically allocated task object memory */ + configASSERT(gMainTask != NULL); + + /* Start the scheduler to start the tasks executing. */ + vTaskStartScheduler(); + + /* The following line should never be reached because vTaskStartScheduler() + will only return if there was not enough FreeRTOS heap memory available to + create the Idle and (if configured) Timer tasks. Heap management, and + techniques for trapping heap exhaustion, are described in the book text. */ + DebugP_assertNoLog(0); + + return 0; +} diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec new file mode 100644 index 0000000..e5cc8fe --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd new file mode 100644 index 0000000..69640f4 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd @@ -0,0 +1,148 @@ + +/* This is the stack that is used by code running within main() + * In case of NORTOS, + * - This means all the code outside of ISR uses this stack + * In case of FreeRTOS + * - This means all the code until vTaskStartScheduler() is called in main() + * uses this stack. + * - After vTaskStartScheduler() each task created in FreeRTOS has its own stack + */ +--stack_size=16384 +/* This is the heap size for malloc() API in NORTOS and FreeRTOS + * This is also the heap used by pvPortMalloc in FreeRTOS + */ +--heap_size=32768 +-e_vectors /* This is the entry of the application, _vector MUST be plabed starting address 0x0 */ + +/* This is the size of stack when R5 is in IRQ mode + * In NORTOS, + * - Here interrupt nesting is enabled + * - This is the stack used by ISRs registered as type IRQ + * In FreeRTOS, + * - Here interrupt nesting is disabled + * - This is stack that is used initally when a IRQ is received + * - But then the mode is switched to SVC mode and SVC stack is used for all user ISR callbacks + * - Hence in FreeRTOS, IRQ stack size is less and SVC stack size is more + */ +__IRQ_STACK_SIZE = 256; +/* This is the size of stack when R5 is in IRQ mode + * - In both NORTOS and FreeRTOS nesting is disabled for FIQ + */ +__FIQ_STACK_SIZE = 256; +__SVC_STACK_SIZE = 4096; /* This is the size of stack when R5 is in SVC mode */ +__ABORT_STACK_SIZE = 256; /* This is the size of stack when R5 is in ABORT mode */ +__UNDEFINED_STACK_SIZE = 256; /* This is the size of stack when R5 is in UNDEF mode */ + +SECTIONS +{ + /* This has the R5F entry point and vector table, this MUST be at 0x0 */ + .vectors:{} palign(8) > R5F_VECS + + /* This has the R5F boot code until MPU is enabled, this MUST be at a address < 0x80000000 + * i.e this cannot be placed in DDR + */ + GROUP { + .text.hwi: palign(8) + .text.cache: palign(8) + .text.mpu: palign(8) + .text.boot: palign(8) + .text:abort: palign(8) /* this helps in loading symbols when using XIP mode */ + } > MSRAM + + /* This is rest of code. This can be placed in DDR if DDR is available and needed */ + GROUP { + .text: {} palign(8) /* This is where code resides */ + .rodata: {} palign(8) /* This is where const's go */ + } > MSRAM + + /* This is rest of initialized data. This can be placed in DDR if DDR is available and needed */ + GROUP { + .data: {} palign(8) /* This is where initialized globals and static go */ + } > MSRAM + + /* This is rest of uninitialized data. This can be placed in DDR if DDR is available and needed */ + GROUP { + .bss: {} palign(8) /* This is where uninitialized globals go */ + RUN_START(__BSS_START) + RUN_END(__BSS_END) + .sysmem: {} palign(8) /* This is where the malloc heap goes */ + .stack: {} palign(8) /* This is where the main() stack goes */ + } > MSRAM + + /* This is where the stacks for different R5F modes go */ + GROUP { + .irqstack: {. = . + __IRQ_STACK_SIZE;} align(8) + RUN_START(__IRQ_STACK_START) + RUN_END(__IRQ_STACK_END) + .fiqstack: {. = . + __FIQ_STACK_SIZE;} align(8) + RUN_START(__FIQ_STACK_START) + RUN_END(__FIQ_STACK_END) + .svcstack: {. = . + __SVC_STACK_SIZE;} align(8) + RUN_START(__SVC_STACK_START) + RUN_END(__SVC_STACK_END) + .abortstack: {. = . + __ABORT_STACK_SIZE;} align(8) + RUN_START(__ABORT_STACK_START) + RUN_END(__ABORT_STACK_END) + .undefinedstack: {. = . + __UNDEFINED_STACK_SIZE;} align(8) + RUN_START(__UNDEFINED_STACK_START) + RUN_END(__UNDEFINED_STACK_END) + } > MSRAM + + /* Sections needed for C++ projects */ + GROUP { + .ARM.exidx: {} palign(8) /* Needed for C++ exception handling */ + .init_array: {} palign(8) /* Contains function pointers called before main */ + .fini_array: {} palign(8) /* Contains function pointers called after main */ + } > MSRAM + + /* General purpose user shared memory, used in some examples */ + .bss.user_shared_mem (NOLOAD) : {} > USER_SHM_MEM + /* this is used when Debug log's to shared memory are enabled, else this is not used */ + .bss.log_shared_mem (NOLOAD) : {} > LOG_SHM_MEM + /* this is used only when IPC RPMessage is enabled, else this is not used */ + .bss.ipc_vring_mem (NOLOAD) : {} > RTOS_NORTOS_IPC_SHM_MEM + /* General purpose non cacheable memory, used in some examples */ + .bss.nocache (NOLOAD) : {} > NON_CACHE_MEM +} + +/* +NOTE: Below memory is reserved for DMSC usage + - During Boot till security handoff is complete + 0x701E0000 - 0x701FFFFF (128KB) + - After "Security Handoff" is complete (i.e at run time) + 0x701F4000 - 0x701FFFFF (48KB) + + Security handoff is complete when this message is sent to the DMSC, + TISCI_MSG_SEC_HANDOVER + + This should be sent once all cores are loaded and all application + specific firewall calls are setup. +*/ + +MEMORY +{ + R5F_VECS : ORIGIN = 0x00000000 , LENGTH = 0x00000040 + R5F_TCMA : ORIGIN = 0x00000040 , LENGTH = 0x00007FC0 + R5F_TCMB0 : ORIGIN = 0x41010000 , LENGTH = 0x00008000 + + /* memory segment used to hold CPU specific non-cached data, MAKE to add a MPU entry to mark this as non-cached */ + NON_CACHE_MEM : ORIGIN = 0x70060000 , LENGTH = 0x8000 + + /* when using multi-core application's i.e more than one R5F/M4F active, make sure + * this memory does not overlap with other R5F's + */ + MSRAM : ORIGIN = 0x70080000 , LENGTH = 0x40000 + + /* This section can be used to put XIP section of the application in flash, make sure this does not overlap with + * other CPUs. Also make sure to add a MPU entry for this section and mark it as cached and code executable + */ + FLASH : ORIGIN = 0x60100000 , LENGTH = 0x80000 + + /* shared memory segments */ + /* On R5F, + * - make sure there is a MPU entry which maps below regions as non-cache + */ + USER_SHM_MEM : ORIGIN = 0x701D0000, LENGTH = 0x180 + LOG_SHM_MEM : ORIGIN = 0x701D0000 + 0x180, LENGTH = 0x00004000 - 0x180 + RTOS_NORTOS_IPC_SHM_MEM : ORIGIN = 0x701D4000, LENGTH = 0x0000C000 +} diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile new file mode 100644 index 0000000..70e3b3d --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile @@ -0,0 +1,310 @@ +# +# Auto generated makefile +# + +export MOTOR_CONTROL_SDK_PATH?=$(abspath ../../../../../..) +include $(MOTOR_CONTROL_SDK_PATH)/imports.mak +include $(MOTOR_CONTROL_SDK_PATH)/devconfig/devconfig.mak + +CG_TOOL_ROOT=$(CGT_TI_ARM_CLANG_PATH) + +CC=$(CG_TOOL_ROOT)/bin/tiarmclang +LNK=$(CG_TOOL_ROOT)/bin/tiarmclang +STRIP=$(CG_TOOL_ROOT)/bin/tiarmstrip +OBJCOPY=$(CG_TOOL_ROOT)/bin/tiarmobjcopy +ifeq ($(OS), Windows_NT) + PYTHON=python +else + PYTHON=python3 +endif + +PROFILE?=release +ConfigName:=$(PROFILE) + +OUTNAME:=pruicss_pwm_epwm_sync.$(PROFILE).out + +BOOTIMAGE_PATH=$(abspath .) +BOOTIMAGE_NAME:=pruicss_pwm_epwm_sync.$(PROFILE).appimage +BOOTIMAGE_NAME_XIP:=pruicss_pwm_epwm_sync.$(PROFILE).appimage_xip +BOOTIMAGE_NAME_SIGNED:=pruicss_pwm_epwm_sync.$(PROFILE).appimage.signed +BOOTIMAGE_RPRC_NAME:=pruicss_pwm_epwm_sync.$(PROFILE).rprc +BOOTIMAGE_RPRC_NAME_XIP:=pruicss_pwm_epwm_sync.$(PROFILE).rprc_xip +BOOTIMAGE_RPRC_NAME_TMP:=pruicss_pwm_epwm_sync.$(PROFILE).rprc_tmp +BOOTIMAGE_NAME_HS:=pruicss_pwm_epwm_sync.$(PROFILE).appimage.hs +BOOTIMAGE_NAME_HS_FS:=pruicss_pwm_epwm_sync.$(PROFILE).appimage.hs_fs +TARGETS := $(BOOTIMAGE_NAME) +ifeq ($(DEVICE_TYPE), HS) + TARGETS += $(BOOTIMAGE_NAME_HS) +endif + +FILES_common := \ + main.c \ + pruicss_pwm_epwm_sync.c \ + ti_drivers_config.c \ + ti_drivers_open_close.c \ + ti_board_config.c \ + ti_board_open_close.c \ + ti_dpl_config.c \ + ti_pinmux_config.c \ + ti_power_clock_config.c \ + +FILES_PATH_common = \ + .. \ + ../../.. \ + generated \ + +INCLUDES_common := \ + -I${CG_TOOL_ROOT}/include/c \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source \ + -I${MOTOR_CONTROL_SDK_PATH}/source \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/FreeRTOS-Kernel/include \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am243x/r5f \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/pruicss/g_v0 \ + -I${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/include \ + -Igenerated \ + +DEFINES_common := \ + -DSOC_AM243X \ + -Dam243x_evm \ + +CFLAGS_common := \ + -mcpu=cortex-r5 \ + -mfloat-abi=hard \ + -mfpu=vfpv3-d16 \ + -mthumb \ + -Wall \ + -Werror \ + -g \ + -Wno-gnu-variable-sized-type-not-at-end \ + -Wno-unused-function \ + +CFLAGS_cpp_common := \ + -Wno-c99-designator \ + -Wno-extern-c-compat \ + -Wno-c++11-narrowing \ + -Wno-reorder-init-list \ + -Wno-deprecated-register \ + -Wno-writable-strings \ + -Wno-enum-compare \ + -Wno-reserved-user-defined-literal \ + -Wno-unused-const-variable \ + -x c++ \ + +CFLAGS_debug := \ + -D_DEBUG_=1 \ + +CFLAGS_release := \ + -Os \ + +LNK_FILES_common = \ + linker.cmd \ + +LIBS_PATH_common = \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/board/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/lib \ + -Wl,-i${CG_TOOL_ROOT}/lib \ + +LIBS_common = \ + -lfreertos.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -ldrivers.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -lboard.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -lpruicss_pwm.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + -llibc.a \ + -llibsysbm.a \ + +LFLAGS_common = \ + -Wl,--diag_suppress=10063 \ + -Wl,--ram_model \ + -Wl,--reread_libs \ + + +LIBS_NAME = \ + freertos.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + drivers.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + board.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + pruicss_pwm.am243x.r5f.ti-arm-clang.${ConfigName}.lib \ + libc.a \ + libsysbm.a \ + +LIBS_PATH_NAME = \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/lib \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/board/lib \ + ${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/lib \ + ${CG_TOOL_ROOT}/lib \ + +FILES := $(FILES_common) $(FILES_$(PROFILE)) +ASMFILES := $(ASMFILES_common) $(ASMFILES_$(PROFILE)) +FILES_PATH := $(FILES_PATH_common) $(FILES_PATH_$(PROFILE)) +CFLAGS := $(CFLAGS_common) $(CFLAGS_$(PROFILE)) +DEFINES := $(DEFINES_common) $(DEFINES_$(PROFILE)) +INCLUDES := $(INCLUDES_common) $(INCLUDE_$(PROFILE)) +LIBS := $(LIBS_common) $(LIBS_$(PROFILE)) +LIBS_PATH := $(LIBS_PATH_common) $(LIBS_PATH_$(PROFILE)) +LFLAGS := $(LFLAGS_common) $(LFLAGS_$(PROFILE)) +LNKOPTFLAGS := $(LNKOPTFLAGS_common) $(LNKOPTFLAGS_$(PROFILE)) +LNK_FILES := $(LNK_FILES_common) $(LNK_FILES_$(PROFILE)) + +OBJDIR := obj/$(PROFILE)/ +OBJS := $(FILES:%.c=%.obj) +OBJS += $(ASMFILES:%.S=%.obj) +DEPS := $(FILES:%.c=%.d) + +vpath %.obj $(OBJDIR) +vpath %.c $(FILES_PATH) +vpath %.S $(FILES_PATH) +vpath %.lib $(LIBS_PATH_NAME) +vpath %.a $(LIBS_PATH_NAME) + +$(OBJDIR)/%.obj %.obj: %.c + @echo Compiling: am243x:r5fss0-0:freertos:ti-arm-clang $(OUTNAME): $< + $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) -MMD -o $(OBJDIR)/$@ $< + +$(OBJDIR)/%.obj %.obj: %.S + @echo Compiling: am243x:r5fss0-0:freertos:ti-arm-clang $(LIBNAME): $< + $(CC) -c $(CFLAGS) -o $(OBJDIR)/$@ $< + +all: $(TARGETS) + +SYSCFG_GEN_FILES=generated/ti_drivers_config.c generated/ti_drivers_config.h +SYSCFG_GEN_FILES+=generated/ti_drivers_open_close.c generated/ti_drivers_open_close.h +SYSCFG_GEN_FILES+=generated/ti_dpl_config.c generated/ti_dpl_config.h +SYSCFG_GEN_FILES+=generated/ti_pinmux_config.c generated/ti_power_clock_config.c +SYSCFG_GEN_FILES+=generated/ti_board_config.c generated/ti_board_config.h +SYSCFG_GEN_FILES+=generated/ti_board_open_close.c generated/ti_board_open_close.h + +$(OUTNAME): syscfg $(SYSCFG_GEN_FILES) $(OBJS) $(LNK_FILES) $(LIBS_NAME) + @echo . + @echo Linking: am243x:r5fss0-0:freertos:ti-arm-clang $@ ... + $(LNK) $(LNKOPTFLAGS) $(LFLAGS) $(LIBS_PATH) -Wl,-m=$(basename $@).map -o $@ $(addprefix $(OBJDIR), $(OBJS)) $(LIBS) $(LNK_FILES) + @echo Linking: am243x:r5fss0-0:freertos:ti-arm-clang $@ Done !!! + @echo . + +clean: + @echo Cleaning: am243x:r5fss0-0:freertos:ti-arm-clang $(OUTNAME) ... + $(RMDIR) $(OBJDIR) + $(RM) $(OUTNAME) + $(RM) $(BOOTIMAGE_NAME) + $(RM) $(BOOTIMAGE_NAME_XIP) + $(RM) $(BOOTIMAGE_NAME_SIGNED) + $(RM) $(BOOTIMAGE_NAME_HS) + $(RM) $(BOOTIMAGE_NAME_HS_FS) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(RM) $(BOOTIMAGE_RPRC_NAME_XIP) + $(RMDIR) generated/ + +scrub: + @echo Scrubing: am243x:r5fss0-0:freertos:ti-arm-clang pruicss_pwm_epwm_sync ... + $(RMDIR) obj +ifeq ($(OS),Windows_NT) + $(RM) \*.out + $(RM) \*.map + $(RM) \*.appimage* + $(RM) \*.rprc* + $(RM) \*.tiimage* + $(RM) \*.bin +else + $(RM) *.out + $(RM) *.map + $(RM) *.appimage* + $(RM) *.rprc* + $(RM) *.tiimage* + $(RM) *.bin +endif + $(RMDIR) generated + +$(OBJS): | $(OBJDIR) + +$(OBJDIR): + $(MKDIR) $@ + + +.NOTPARALLEL: + +.INTERMEDIATE: syscfg +$(SYSCFG_GEN_FILES): syscfg + +syscfg: ../example.syscfg + @echo Generating SysConfig files ... + $(SYSCFG_NODE) $(SYSCFG_CLI_PATH)/dist/cli.js --product $(SYSCFG_SDKPRODUCT) --context r5fss0-0 --part ALV --package ALV --output generated/ ../example.syscfg + +syscfg-gui: + $(SYSCFG_NWJS) $(SYSCFG_PATH) --product $(SYSCFG_SDKPRODUCT) --device AM243x_ALV_beta --context r5fss0-0 --part ALV --package ALV --output generated/ ../example.syscfg + +# +# Generation of boot image which can be loaded by Secondary Boot Loader (SBL) +# +ifeq ($(OS),Windows_NT) +EXE_EXT=.exe +endif +ifeq ($(OS),Windows_NT) + BOOTIMAGE_CERT_GEN_CMD=powershell -executionpolicy unrestricted -command $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.ps1 +else + BOOTIMAGE_CERT_GEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.sh +endif +BOOTIMAGE_TEMP_OUT_FILE=temp_stdout_$(PROFILE).txt + +BOOTIMAGE_CERT_KEY=$(APP_SIGNING_KEY) + +BOOTIMAGE_CORE_ID_r5fss0-0 = 4 +BOOTIMAGE_CORE_ID_r5fss0-1 = 5 +BOOTIMAGE_CORE_ID_r5fss1-0 = 6 +BOOTIMAGE_CORE_ID_r5fss1-1 = 7 +BOOTIMAGE_CORE_ID_m4fss0-0 = 14 +SBL_RUN_ADDRESS=0x70000000 +SBL_DEV_ID=55 + +MULTI_CORE_IMAGE_GEN = $(SYSCFG_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/multicoreImageGen/multicoreImageGen.js +OUTRPRC_CMD = $(SYSCFG_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/out2rprc/elf2rprc.js +APP_IMAGE_SIGN_CMD = $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/appimage_x509_cert_gen.py + +ifeq ($(OS),Windows_NT) + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.exe +else + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.out +endif + +MULTI_CORE_IMAGE_PARAMS = \ + $(BOOTIMAGE_RPRC_NAME)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +MULTI_CORE_IMAGE_PARAMS_XIP = \ + $(BOOTIMAGE_RPRC_NAME_XIP)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +$(BOOTIMAGE_NAME): $(OUTNAME) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$@ ... +ifneq ($(OS),Windows_NT) + $(CHMOD) a+x $(XIPGEN_CMD) +endif + $(OUTRPRC_CMD) $(OUTNAME) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(COPY) $(BOOTIMAGE_RPRC_NAME) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(XIPGEN_CMD) -i $(BOOTIMAGE_RPRC_NAME_TMP) -o $(BOOTIMAGE_RPRC_NAME) -x $(BOOTIMAGE_RPRC_NAME_XIP) --flash-start-addr 0x60000000 -v > $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME) $(MULTI_CORE_IMAGE_PARAMS) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME_XIP) $(MULTI_CORE_IMAGE_PARAMS_XIP) >> $(BOOTIMAGE_TEMP_OUT_FILE) +# Sign the appimage for HS-FS using appimage signing script + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME_HS_FS) + $(RM) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_TEMP_OUT_FILE) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$@ Done !!! + @echo . + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$(BOOTIMAGE_NAME_HS_FS) Done !!! + @echo . + +$(BOOTIMAGE_NAME_HS): $(BOOTIMAGE_NAME) +ifeq ($(DEVICE_TYPE), HS) +# Sign the appimage using appimage signing script +ifeq ($(ENC_ENABLED),no) + @echo Boot image signing: Encryption is disabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME_HS) +else + @echo Boot image signing: Encryption is enabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --enc y --enckey $(APP_ENCRYPTION_KEY) --output $(BOOTIMAGE_NAME_HS) + $(RM) $(BOOTIMAGE_NAME)-enc +endif + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$(BOOTIMAGE_NAME_HS) Done !!! + @echo . +endif +-include $(addprefix $(OBJDIR)/, $(DEPS)) diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen new file mode 100644 index 0000000..8666cfd --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen @@ -0,0 +1,106 @@ +# +# Auto generated makefile +# + +# Below variables need to be defined outside this file or via command line +# - MOTOR_CONTROL_SDK_PATH +# - PROFILE +# - CG_TOOL_ROOT +# - OUTNAME +# - CCS_INSTALL_DIR +# - CCS_IDE_MODE + +CCS_PATH=$(CCS_INSTALL_DIR) +include ${MOTOR_CONTROL_SDK_PATH}/imports.mak +include ${MOTOR_CONTROL_SDK_PATH}/devconfig/devconfig.mak + +STRIP=$(CG_TOOL_ROOT)/bin/tiarmstrip +OBJCOPY=$(CG_TOOL_ROOT)/bin/tiarmobjcopy +ifeq ($(OS), Windows_NT) + PYTHON=python +else + PYTHON=python3 +endif + +OUTFILE=$(PROFILE)/$(OUTNAME).out +BOOTIMAGE_PATH=$(abspath ${PROFILE}) +BOOTIMAGE_NAME:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage +BOOTIMAGE_NAME_XIP:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage_xip +BOOTIMAGE_NAME_SIGNED:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage.signed +BOOTIMAGE_RPRC_NAME:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc +BOOTIMAGE_RPRC_NAME_XIP:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc_xip +BOOTIMAGE_RPRC_NAME_TMP:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc_tmp + +# +# Generation of boot image which can be loaded by Secondary Boot Loader (SBL) +# +ifeq ($(OS),Windows_NT) +EXE_EXT=.exe +endif +ifeq ($(OS),Windows_NT) + BOOTIMAGE_CERT_GEN_CMD=powershell -executionpolicy unrestricted -command $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.ps1 +else + BOOTIMAGE_CERT_GEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.sh +endif +BOOTIMAGE_TEMP_OUT_FILE=$(PROFILE)/temp_stdout_$(PROFILE).txt + +BOOTIMAGE_CORE_ID_r5fss0-0 = 4 +BOOTIMAGE_CORE_ID_r5fss0-1 = 5 +BOOTIMAGE_CORE_ID_r5fss1-0 = 6 +BOOTIMAGE_CORE_ID_r5fss1-1 = 7 +BOOTIMAGE_CORE_ID_m4fss0-0 = 14 +SBL_RUN_ADDRESS=0x70000000 +SBL_DEV_ID=55 + +MULTI_CORE_IMAGE_GEN = $(CCS_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/multicoreImageGen/multicoreImageGen.js +OUTRPRC_CMD = $(CCS_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/out2rprc/elf2rprc.js +APP_IMAGE_SIGN_CMD = $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/appimage_x509_cert_gen.py + +ifeq ($(OS),Windows_NT) + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.exe +else + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.out +endif + +MULTI_CORE_IMAGE_PARAMS = \ + $(BOOTIMAGE_RPRC_NAME)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +MULTI_CORE_IMAGE_PARAMS_XIP = \ + $(BOOTIMAGE_RPRC_NAME_XIP)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +all: +ifeq ($(CCS_IDE_MODE),cloud) +# No post build steps +else + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME) ... + $(OUTRPRC_CMD) $(OUTFILE) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(COPY) $(OUTNAME).rprc $(BOOTIMAGE_RPRC_NAME) + $(COPY) $(BOOTIMAGE_RPRC_NAME) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(XIPGEN_CMD) -i $(BOOTIMAGE_RPRC_NAME_TMP) -o $(BOOTIMAGE_RPRC_NAME) -x $(BOOTIMAGE_RPRC_NAME_XIP) --flash-start-addr 0x60000000 -v > $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME) $(MULTI_CORE_IMAGE_PARAMS) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME_XIP) $(MULTI_CORE_IMAGE_PARAMS_XIP) >> $(BOOTIMAGE_TEMP_OUT_FILE) +# Sign the appimage for HS-FS using appimage signing script + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME).hs_fs +ifeq ($(DEVICE_TYPE),HS) +# Sign the appimage using appimage signing script +ifeq ($(ENC_ENABLED),no) + @echo Boot image signing: Encryption is disabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME).hs +else + @echo Boot image signing: Encryption is enabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --enc y --enckey $(APP_ENCRYPTION_KEY) --output $(BOOTIMAGE_NAME).hs + $(RM) $(BOOTIMAGE_NAME)-enc +endif +endif + $(RM) $(BOOTIMAGE_RPRC_NAME_TMP) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME) Done !!! + @echo . +ifeq ($(DEVICE_TYPE),HS) + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME).hs Done !!! + @echo . +else + @echo Boot image: am243x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME).hs_fs Done !!! + @echo . +endif +endif diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec new file mode 100644 index 0000000..2445dec --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec @@ -0,0 +1,20 @@ +# +# Auto generated makefile +# + +export MOTOR_CONTROL_SDK_PATH?=$(abspath ../../../../../..) +include $(MOTOR_CONTROL_SDK_PATH)/imports.mak + +PROFILE?=Release + +PROJECT_NAME=pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang + +all: + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectBuild -ccs.projects $(PROJECT_NAME) -ccs.configuration $(PROFILE) + +clean: + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectBuild -ccs.projects $(PROJECT_NAME) -ccs.configuration $(PROFILE) -ccs.clean + +export: + $(MKDIR) $(MOTOR_CONTROL_SDK_PATH)/ccs_projects + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectCreate -ccs.projectSpec example.projectspec -ccs.overwrite full diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs new file mode 100644 index 0000000..d46875e --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs @@ -0,0 +1,8 @@ +/* + * ======== syscfg_c.rov.xs ======== + * This file contains the information needed by the Runtime Object + * View (ROV) tool. + */ +var crovFiles = [ + "mcu_plus_sdk/source/kernel/freertos/rov/FreeRTOS.rov.js", +]; diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/example.syscfg b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/example.syscfg index 5a18d00..dcdc9f7 100644 --- a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/example.syscfg +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/example.syscfg @@ -19,6 +19,9 @@ const mpu_armv72 = mpu_armv7.addInstance(); const mpu_armv73 = mpu_armv7.addInstance(); const mpu_armv74 = mpu_armv7.addInstance(); const mpu_armv75 = mpu_armv7.addInstance(); +const pwm = scripting.addModule("/pru_icssg/pwm", {}, false); +const pwm1 = pwm.addInstance(); +const pwm2 = pwm.addInstance(); /** * Write custom configuration values to the imported modules. @@ -66,6 +69,16 @@ mpu_armv75.baseAddr = 0x60000000; mpu_armv75.size = 28; mpu_armv75.accessPermissions = "Supervisor RD, User RD"; +pwm1.$name = "CONFIG_PRU_ICSS_PWM0"; +pwm1.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM0"; +pwm1.PRU_ICSSG0_PWM.A0.$assign = "PRG0_PRU0_GPO12"; +pwm1.PRU_ICSSG0_PWM.A0.$used = true; + +pwm2.$name = "CONFIG_PRU_ICSS_PWM1"; +pwm2.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM3"; +pwm2.PRU_ICSSG0_PWM.B2.$assign = "PRG0_PRU0_GPO5"; +pwm2.PRU_ICSSG0_PWM.B2.$used = true; + /** * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec index b248fdd..00097d5 100644 --- a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -98,7 +98,7 @@ - + diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/example.syscfg b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/example.syscfg new file mode 100644 index 0000000..551186c --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/example.syscfg @@ -0,0 +1,100 @@ +/** + * These arguments were used when this file was generated. They will be automatically applied on subsequent loads + * via the GUI or CLI. Run CLI with '--help' for additional information on how to override these arguments. + * @cliArgs --device "AM64x" --package "ALV" --part "Default" --context "r5fss0-0" --product "MOTOR_CONTROL_SDK@09.01.00" + * @versions {"tool":"1.18.0+3266"} + */ + +/** + * Import the modules used in this configuration. + */ +const epwm = scripting.addModule("/drivers/epwm/epwm", {}, false); +const epwm1 = epwm.addInstance(); +const i2c = scripting.addModule("/drivers/i2c/i2c", {}, false); +const i2c1 = i2c.addInstance(); +const pruicss = scripting.addModule("/drivers/pruicss/pruicss", {}, false); +const pruicss1 = pruicss.addInstance(); +const debug_log = scripting.addModule("/kernel/dpl/debug_log"); +const mpu_armv7 = scripting.addModule("/kernel/dpl/mpu_armv7", {}, false); +const mpu_armv71 = mpu_armv7.addInstance(); +const mpu_armv72 = mpu_armv7.addInstance(); +const mpu_armv73 = mpu_armv7.addInstance(); +const mpu_armv74 = mpu_armv7.addInstance(); +const mpu_armv75 = mpu_armv7.addInstance(); +const mpu_armv76 = mpu_armv7.addInstance(); +const pwm = scripting.addModule("/pru_icssg/pwm", {}, false); +const pwm1 = pwm.addInstance(); +const pwm2 = pwm.addInstance(); + +/** + * Write custom configuration values to the imported modules. + */ +epwm1.$name = "CONFIG_EPWM0"; +epwm1.EPWM.B.$used = false; +epwm1.EPWM.SYNCO.$used = false; +epwm1.EPWM.SYNCI.$used = false; + +i2c1.$name = "CONFIG_I2C0"; +pruicss1.$name = "CONFIG_PRU_ICSS0"; +pruicss1.AdditionalICSSSettings[0].$name = "CONFIG_PRU_ICSS_IO0"; + +debug_log.enableUartLog = true; +debug_log.uartLog.$name = "CONFIG_UART_CONSOLE"; +debug_log.uartLog.UART.$assign = "USART0"; + +const uart_v0_template = scripting.addModule("/drivers/uart/v0/uart_v0_template", {}, false); +const uart_v0_template1 = uart_v0_template.addInstance({}, false); +uart_v0_template1.$name = "drivers_uart_v0_uart_v0_template0"; +debug_log.uartLog.child = uart_v0_template1; + +mpu_armv71.$name = "CONFIG_MPU_REGION0"; +mpu_armv71.size = 31; +mpu_armv71.attributes = "Device"; +mpu_armv71.accessPermissions = "Supervisor RD+WR, User RD"; +mpu_armv71.allowExecute = false; + +mpu_armv72.$name = "CONFIG_MPU_REGION1"; +mpu_armv72.size = 15; +mpu_armv72.accessPermissions = "Supervisor RD+WR, User RD"; + +mpu_armv73.$name = "CONFIG_MPU_REGION2"; +mpu_armv73.baseAddr = 0x41010000; +mpu_armv73.size = 15; +mpu_armv73.accessPermissions = "Supervisor RD+WR, User RD"; + +mpu_armv74.$name = "CONFIG_MPU_REGION3"; +mpu_armv74.accessPermissions = "Supervisor RD+WR, User RD"; +mpu_armv74.baseAddr = 0x70000000; +mpu_armv74.size = 21; + +mpu_armv75.$name = "CONFIG_MPU_REGION4"; +mpu_armv75.baseAddr = 0x60000000; +mpu_armv75.size = 28; +mpu_armv75.accessPermissions = "Supervisor RD, User RD"; + +mpu_armv76.$name = "CONFIG_MPU_REGION5"; +mpu_armv76.baseAddr = 0x80000000; +mpu_armv76.size = 31; + +pwm1.$name = "CONFIG_PRU_ICSS_PWM0"; +pwm1.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM0"; +pwm1.PRU_ICSSG0_PWM.A0.$assign = "PRG0_PRU0_GPO12"; +pwm1.PRU_ICSSG0_PWM.A0.$used = true; + +pwm2.$name = "CONFIG_PRU_ICSS_PWM1"; +pwm2.PRU_ICSSG0_PWM.$assign = "PRU_ICSSG0_PWM3"; +pwm2.PRU_ICSSG0_PWM.B2.$assign = "PRG0_PRU0_GPO5"; +pwm2.PRU_ICSSG0_PWM.B2.$used = true; + +/** + * Pinmux solution for unlocked pins/peripherals. This ensures that minor changes to the automatic solver in a future + * version of the tool will not impact the pinmux you originally saw. These lines can be completely deleted in order to + * re-solve from scratch. + */ +epwm1.EPWM.$suggestSolution = "EHRPWM0"; +epwm1.EPWM.A.$suggestSolution = "GPMC0_AD3"; +i2c1.I2C.$suggestSolution = "I2C1"; +i2c1.I2C.SCL.$suggestSolution = "I2C1_SCL"; +i2c1.I2C.SDA.$suggestSolution = "I2C1_SDA"; +debug_log.uartLog.UART.RXD.$suggestSolution = "UART0_RXD"; +debug_log.uartLog.UART.TXD.$suggestSolution = "UART0_TXD"; \ No newline at end of file diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/main.c b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/main.c new file mode 100644 index 0000000..c9ab9b3 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/main.c @@ -0,0 +1,84 @@ +/* + * Copyright (C) 2018-2021 Texas Instruments Incorporated + * + * 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. + */ + +#include +#include +#include "ti_drivers_config.h" +#include "ti_board_config.h" +#include "FreeRTOS.h" +#include "task.h" + +#define MAIN_TASK_PRI (configMAX_PRIORITIES-1) + +#define MAIN_TASK_SIZE (16384U/sizeof(configSTACK_DEPTH_TYPE)) +StackType_t gMainTaskStack[MAIN_TASK_SIZE] __attribute__((aligned(32))); + +StaticTask_t gMainTaskObj; +TaskHandle_t gMainTask; + +void pruicss_pwm_epwm_sync_main(void *args); + +void freertos_main(void *args) +{ + pruicss_pwm_epwm_sync_main(NULL); + + vTaskDelete(NULL); +} + + +int main(void) +{ + /* init SOC specific modules */ + System_init(); + Board_init(); + + /* This task is created at highest priority, it should create more tasks and then delete itself */ + gMainTask = xTaskCreateStatic( freertos_main, /* Pointer to the function that implements the task. */ + "freertos_main", /* Text name for the task. This is to facilitate debugging only. */ + MAIN_TASK_SIZE, /* Stack depth in units of StackType_t typically uint32_t on 32b CPUs */ + NULL, /* We are not using the task parameter. */ + MAIN_TASK_PRI, /* task priority, 0 is lowest priority, configMAX_PRIORITIES-1 is highest */ + gMainTaskStack, /* pointer to stack base */ + &gMainTaskObj ); /* pointer to statically allocated task object memory */ + configASSERT(gMainTask != NULL); + + /* Start the scheduler to start the tasks executing. */ + vTaskStartScheduler(); + + /* The following line should never be reached because vTaskStartScheduler() + will only return if there was not enough FreeRTOS heap memory available to + create the Idle and (if configured) Timer tasks. Heap management, and + techniques for trapping heap exhaustion, are described in the book text. */ + DebugP_assertNoLog(0); + + return 0; +} diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec new file mode 100644 index 0000000..66090ce --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/example.projectspec @@ -0,0 +1,116 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd new file mode 100644 index 0000000..c4848c3 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/linker.cmd @@ -0,0 +1,148 @@ + +/* This is the stack that is used by code running within main() + * In case of NORTOS, + * - This means all the code outside of ISR uses this stack + * In case of FreeRTOS + * - This means all the code until vTaskStartScheduler() is called in main() + * uses this stack. + * - After vTaskStartScheduler() each task created in FreeRTOS has its own stack + */ +--stack_size=16384 +/* This is the heap size for malloc() API in NORTOS and FreeRTOS + * This is also the heap used by pvPortMalloc in FreeRTOS + */ +--heap_size=32768 +-e_vectors /* This is the entry of the application, _vector MUST be plabed starting address 0x0 */ + +/* This is the size of stack when R5 is in IRQ mode + * In NORTOS, + * - Here interrupt nesting is enabled + * - This is the stack used by ISRs registered as type IRQ + * In FreeRTOS, + * - Here interrupt nesting is disabled + * - This is stack that is used initally when a IRQ is received + * - But then the mode is switched to SVC mode and SVC stack is used for all user ISR callbacks + * - Hence in FreeRTOS, IRQ stack size is less and SVC stack size is more + */ +__IRQ_STACK_SIZE = 256; +/* This is the size of stack when R5 is in IRQ mode + * - In both NORTOS and FreeRTOS nesting is disabled for FIQ + */ +__FIQ_STACK_SIZE = 256; +__SVC_STACK_SIZE = 4096; /* This is the size of stack when R5 is in SVC mode */ +__ABORT_STACK_SIZE = 256; /* This is the size of stack when R5 is in ABORT mode */ +__UNDEFINED_STACK_SIZE = 256; /* This is the size of stack when R5 is in UNDEF mode */ + +SECTIONS +{ + /* This has the R5F entry point and vector table, this MUST be at 0x0 */ + .vectors:{} palign(8) > R5F_VECS + + /* This has the R5F boot code until MPU is enabled, this MUST be at a address < 0x80000000 + * i.e this cannot be placed in DDR + */ + GROUP { + .text.hwi: palign(8) + .text.cache: palign(8) + .text.mpu: palign(8) + .text.boot: palign(8) + .text:abort: palign(8) /* this helps in loading symbols when using XIP mode */ + } > MSRAM + + /* This is rest of code. This can be placed in DDR if DDR is available and needed */ + GROUP { + .text: {} palign(8) /* This is where code resides */ + .rodata: {} palign(8) /* This is where const's go */ + } > MSRAM + + /* This is rest of initialized data. This can be placed in DDR if DDR is available and needed */ + GROUP { + .data: {} palign(8) /* This is where initialized globals and static go */ + } > MSRAM + + /* This is rest of uninitialized data. This can be placed in DDR if DDR is available and needed */ + GROUP { + .bss: {} palign(8) /* This is where uninitialized globals go */ + RUN_START(__BSS_START) + RUN_END(__BSS_END) + .sysmem: {} palign(8) /* This is where the malloc heap goes */ + .stack: {} palign(8) /* This is where the main() stack goes */ + } > MSRAM + + /* This is where the stacks for different R5F modes go */ + GROUP { + .irqstack: {. = . + __IRQ_STACK_SIZE;} align(8) + RUN_START(__IRQ_STACK_START) + RUN_END(__IRQ_STACK_END) + .fiqstack: {. = . + __FIQ_STACK_SIZE;} align(8) + RUN_START(__FIQ_STACK_START) + RUN_END(__FIQ_STACK_END) + .svcstack: {. = . + __SVC_STACK_SIZE;} align(8) + RUN_START(__SVC_STACK_START) + RUN_END(__SVC_STACK_END) + .abortstack: {. = . + __ABORT_STACK_SIZE;} align(8) + RUN_START(__ABORT_STACK_START) + RUN_END(__ABORT_STACK_END) + .undefinedstack: {. = . + __UNDEFINED_STACK_SIZE;} align(8) + RUN_START(__UNDEFINED_STACK_START) + RUN_END(__UNDEFINED_STACK_END) + } > MSRAM + + /* Sections needed for C++ projects */ + GROUP { + .ARM.exidx: {} palign(8) /* Needed for C++ exception handling */ + .init_array: {} palign(8) /* Contains function pointers called before main */ + .fini_array: {} palign(8) /* Contains function pointers called after main */ + } > MSRAM + + /* General purpose user shared memory, used in some examples */ + .bss.user_shared_mem (NOLOAD) : {} > USER_SHM_MEM + /* this is used when Debug log's to shared memory are enabled, else this is not used */ + .bss.log_shared_mem (NOLOAD) : {} > LOG_SHM_MEM + /* this is used only when IPC RPMessage is enabled, else this is not used */ + .bss.ipc_vring_mem (NOLOAD) : {} > RTOS_NORTOS_IPC_SHM_MEM + /* General purpose non cacheable memory, used in some examples */ + .bss.nocache (NOLOAD) : {} > NON_CACHE_MEM +} + +/* +NOTE: Below memory is reserved for DMSC usage + - During Boot till security handoff is complete + 0x701E0000 - 0x701FFFFF (128KB) + - After "Security Handoff" is complete (i.e at run time) + 0x701F4000 - 0x701FFFFF (48KB) + + Security handoff is complete when this message is sent to the DMSC, + TISCI_MSG_SEC_HANDOVER + + This should be sent once all cores are loaded and all application + specific firewall calls are setup. +*/ + +MEMORY +{ + R5F_VECS : ORIGIN = 0x00000000 , LENGTH = 0x00000040 + R5F_TCMA : ORIGIN = 0x00000040 , LENGTH = 0x00007FC0 + R5F_TCMB0 : ORIGIN = 0x41010000 , LENGTH = 0x00008000 + + /* memory segment used to hold CPU specific non-cached data, MAKE to add a MPU entry to mark this as non-cached */ + NON_CACHE_MEM : ORIGIN = 0x70060000 , LENGTH = 0x8000 + + /* when using multi-core application's i.e more than one R5F/M4F active, make sure + * this memory does not overlap with other R5F's + */ + MSRAM : ORIGIN = 0x70080000 , LENGTH = 0x40000 + + /* This section can be used to put XIP section of the application in flash, make sure this does not overlap with + * other CPUs. Also make sure to add a MPU entry for this section and mark it as cached and code executable + */ + FLASH : ORIGIN = 0x60100000 , LENGTH = 0x80000 + + /* shared memory segments */ + /* On R5F, + * - make sure there is a MPU entry which maps below regions as non-cache + */ + USER_SHM_MEM : ORIGIN = 0x701D0000, LENGTH = 0x80 + LOG_SHM_MEM : ORIGIN = 0x701D0000 + 0x80, LENGTH = 0x00004000 - 0x80 + RTOS_NORTOS_IPC_SHM_MEM : ORIGIN = 0x701D4000, LENGTH = 0x0000C000 +} diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile new file mode 100644 index 0000000..a0dd135 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile @@ -0,0 +1,311 @@ +# +# Auto generated makefile +# + +export MOTOR_CONTROL_SDK_PATH?=$(abspath ../../../../../..) +include $(MOTOR_CONTROL_SDK_PATH)/imports.mak +include $(MOTOR_CONTROL_SDK_PATH)/devconfig/devconfig.mak + +CG_TOOL_ROOT=$(CGT_TI_ARM_CLANG_PATH) + +CC=$(CG_TOOL_ROOT)/bin/tiarmclang +LNK=$(CG_TOOL_ROOT)/bin/tiarmclang +STRIP=$(CG_TOOL_ROOT)/bin/tiarmstrip +OBJCOPY=$(CG_TOOL_ROOT)/bin/tiarmobjcopy +ifeq ($(OS), Windows_NT) + PYTHON=python +else + PYTHON=python3 +endif + +PROFILE?=release +ConfigName:=$(PROFILE) + +OUTNAME:=pruicss_pwm_epwm_sync.$(PROFILE).out + +BOOTIMAGE_PATH=$(abspath .) +BOOTIMAGE_NAME:=pruicss_pwm_epwm_sync.$(PROFILE).appimage +BOOTIMAGE_NAME_XIP:=pruicss_pwm_epwm_sync.$(PROFILE).appimage_xip +BOOTIMAGE_NAME_SIGNED:=pruicss_pwm_epwm_sync.$(PROFILE).appimage.signed +BOOTIMAGE_RPRC_NAME:=pruicss_pwm_epwm_sync.$(PROFILE).rprc +BOOTIMAGE_RPRC_NAME_XIP:=pruicss_pwm_epwm_sync.$(PROFILE).rprc_xip +BOOTIMAGE_RPRC_NAME_TMP:=pruicss_pwm_epwm_sync.$(PROFILE).rprc_tmp +BOOTIMAGE_NAME_HS:=pruicss_pwm_epwm_sync.$(PROFILE).appimage.hs +BOOTIMAGE_NAME_HS_FS:=pruicss_pwm_epwm_sync.$(PROFILE).appimage.hs_fs +TARGETS := $(BOOTIMAGE_NAME) +ifeq ($(DEVICE_TYPE), HS) + TARGETS += $(BOOTIMAGE_NAME_HS) +endif + +FILES_common := \ + main.c \ + pruicss_pwm_epwm_sync.c \ + ti_drivers_config.c \ + ti_drivers_open_close.c \ + ti_board_config.c \ + ti_board_open_close.c \ + ti_dpl_config.c \ + ti_pinmux_config.c \ + ti_power_clock_config.c \ + +FILES_PATH_common = \ + .. \ + ../../.. \ + generated \ + +INCLUDES_common := \ + -I${CG_TOOL_ROOT}/include/c \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source \ + -I${MOTOR_CONTROL_SDK_PATH}/source \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/FreeRTOS-Kernel/include \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/portable/TI_ARM_CLANG/ARM_CR5F \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/config/am64x/r5f \ + -I${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/pruicss/g_v0 \ + -I${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/include \ + -Igenerated \ + +DEFINES_common := \ + -DSOC_AM64X \ + -Dam64x_evm \ + +CFLAGS_common := \ + -mcpu=cortex-r5 \ + -mfloat-abi=hard \ + -mfpu=vfpv3-d16 \ + -mthumb \ + -Wall \ + -Werror \ + -g \ + -Wno-gnu-variable-sized-type-not-at-end \ + -Wno-unused-function \ + +CFLAGS_cpp_common := \ + -Wno-c99-designator \ + -Wno-extern-c-compat \ + -Wno-c++11-narrowing \ + -Wno-reorder-init-list \ + -Wno-deprecated-register \ + -Wno-writable-strings \ + -Wno-enum-compare \ + -Wno-reserved-user-defined-literal \ + -Wno-unused-const-variable \ + -x c++ \ + +CFLAGS_debug := \ + -D_DEBUG_=1 \ + +CFLAGS_release := \ + -Os \ + +LNK_FILES_common = \ + linker.cmd \ + +LIBS_PATH_common = \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/board/lib \ + -Wl,-i${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/lib \ + -Wl,-i${CG_TOOL_ROOT}/lib \ + +LIBS_common = \ + -lfreertos.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + -ldrivers.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + -lboard.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + -lpruicss_pwm.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + -llibc.a \ + -llibsysbm.a \ + +LFLAGS_common = \ + -Wl,--diag_suppress=10063 \ + -Wl,--ram_model \ + -Wl,--reread_libs \ + + +LIBS_NAME = \ + freertos.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + drivers.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + board.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + pruicss_pwm.am64x.r5f.ti-arm-clang.${ConfigName}.lib \ + libc.a \ + libsysbm.a \ + +LIBS_PATH_NAME = \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/kernel/freertos/lib \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/drivers/lib \ + ${MOTOR_CONTROL_SDK_PATH}/mcu_plus_sdk/source/board/lib \ + ${MOTOR_CONTROL_SDK_PATH}/source/pruicss_pwm/lib \ + ${CG_TOOL_ROOT}/lib \ + +FILES := $(FILES_common) $(FILES_$(PROFILE)) +ASMFILES := $(ASMFILES_common) $(ASMFILES_$(PROFILE)) +FILES_PATH := $(FILES_PATH_common) $(FILES_PATH_$(PROFILE)) +CFLAGS := $(CFLAGS_common) $(CFLAGS_$(PROFILE)) +DEFINES := $(DEFINES_common) $(DEFINES_$(PROFILE)) +INCLUDES := $(INCLUDES_common) $(INCLUDE_$(PROFILE)) +LIBS := $(LIBS_common) $(LIBS_$(PROFILE)) +LIBS_PATH := $(LIBS_PATH_common) $(LIBS_PATH_$(PROFILE)) +LFLAGS := $(LFLAGS_common) $(LFLAGS_$(PROFILE)) +LNKOPTFLAGS := $(LNKOPTFLAGS_common) $(LNKOPTFLAGS_$(PROFILE)) +LNK_FILES := $(LNK_FILES_common) $(LNK_FILES_$(PROFILE)) + +OBJDIR := obj/$(PROFILE)/ +OBJS := $(FILES:%.c=%.obj) +OBJS += $(ASMFILES:%.S=%.obj) +DEPS := $(FILES:%.c=%.d) + +vpath %.obj $(OBJDIR) +vpath %.c $(FILES_PATH) +vpath %.S $(FILES_PATH) +vpath %.lib $(LIBS_PATH_NAME) +vpath %.a $(LIBS_PATH_NAME) + +$(OBJDIR)/%.obj %.obj: %.c + @echo Compiling: am64x:r5fss0-0:freertos:ti-arm-clang $(OUTNAME): $< + $(CC) -c $(CFLAGS) $(INCLUDES) $(DEFINES) -MMD -o $(OBJDIR)/$@ $< + +$(OBJDIR)/%.obj %.obj: %.S + @echo Compiling: am64x:r5fss0-0:freertos:ti-arm-clang $(LIBNAME): $< + $(CC) -c $(CFLAGS) -o $(OBJDIR)/$@ $< + +all: $(TARGETS) + +SYSCFG_GEN_FILES=generated/ti_drivers_config.c generated/ti_drivers_config.h +SYSCFG_GEN_FILES+=generated/ti_drivers_open_close.c generated/ti_drivers_open_close.h +SYSCFG_GEN_FILES+=generated/ti_dpl_config.c generated/ti_dpl_config.h +SYSCFG_GEN_FILES+=generated/ti_pinmux_config.c generated/ti_power_clock_config.c +SYSCFG_GEN_FILES+=generated/ti_board_config.c generated/ti_board_config.h +SYSCFG_GEN_FILES+=generated/ti_board_open_close.c generated/ti_board_open_close.h + +$(OUTNAME): syscfg $(SYSCFG_GEN_FILES) $(OBJS) $(LNK_FILES) $(LIBS_NAME) + @echo . + @echo Linking: am64x:r5fss0-0:freertos:ti-arm-clang $@ ... + $(LNK) $(LNKOPTFLAGS) $(LFLAGS) $(LIBS_PATH) -Wl,-m=$(basename $@).map -o $@ $(addprefix $(OBJDIR), $(OBJS)) $(LIBS) $(LNK_FILES) + @echo Linking: am64x:r5fss0-0:freertos:ti-arm-clang $@ Done !!! + @echo . + +clean: + @echo Cleaning: am64x:r5fss0-0:freertos:ti-arm-clang $(OUTNAME) ... + $(RMDIR) $(OBJDIR) + $(RM) $(OUTNAME) + $(RM) $(BOOTIMAGE_NAME) + $(RM) $(BOOTIMAGE_NAME_XIP) + $(RM) $(BOOTIMAGE_NAME_SIGNED) + $(RM) $(BOOTIMAGE_NAME_HS) + $(RM) $(BOOTIMAGE_NAME_HS_FS) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(RM) $(BOOTIMAGE_RPRC_NAME_XIP) + $(RMDIR) generated/ + +scrub: + @echo Scrubing: am64x:r5fss0-0:freertos:ti-arm-clang pruicss_pwm_epwm_sync ... + $(RMDIR) obj +ifeq ($(OS),Windows_NT) + $(RM) \*.out + $(RM) \*.map + $(RM) \*.appimage* + $(RM) \*.rprc* + $(RM) \*.tiimage* + $(RM) \*.bin +else + $(RM) *.out + $(RM) *.map + $(RM) *.appimage* + $(RM) *.rprc* + $(RM) *.tiimage* + $(RM) *.bin +endif + $(RMDIR) generated + +$(OBJS): | $(OBJDIR) + +$(OBJDIR): + $(MKDIR) $@ + + +.NOTPARALLEL: + +.INTERMEDIATE: syscfg +$(SYSCFG_GEN_FILES): syscfg + +syscfg: ../example.syscfg + @echo Generating SysConfig files ... + $(SYSCFG_NODE) $(SYSCFG_CLI_PATH)/dist/cli.js --product $(SYSCFG_SDKPRODUCT) --context r5fss0-0 --part Default --package ALV --output generated/ ../example.syscfg + +syscfg-gui: + $(SYSCFG_NWJS) $(SYSCFG_PATH) --product $(SYSCFG_SDKPRODUCT) --device AM64x --context r5fss0-0 --part Default --package ALV --output generated/ ../example.syscfg + +# +# Generation of boot image which can be loaded by Secondary Boot Loader (SBL) +# +ifeq ($(OS),Windows_NT) +EXE_EXT=.exe +endif +ifeq ($(OS),Windows_NT) + BOOTIMAGE_CERT_GEN_CMD=powershell -executionpolicy unrestricted -command $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.ps1 +else + BOOTIMAGE_CERT_GEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.sh +endif +BOOTIMAGE_TEMP_OUT_FILE=temp_stdout_$(PROFILE).txt + +BOOTIMAGE_CERT_KEY=$(APP_SIGNING_KEY) + +BOOTIMAGE_CORE_ID_a53ss0-0 = 0 +BOOTIMAGE_CORE_ID_r5fss0-0 = 4 +BOOTIMAGE_CORE_ID_r5fss0-1 = 5 +BOOTIMAGE_CORE_ID_r5fss1-0 = 6 +BOOTIMAGE_CORE_ID_r5fss1-1 = 7 +BOOTIMAGE_CORE_ID_m4fss0-0 = 14 +SBL_RUN_ADDRESS=0x70000000 +SBL_DEV_ID=55 + +MULTI_CORE_IMAGE_GEN = $(SYSCFG_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/multicoreImageGen/multicoreImageGen.js +OUTRPRC_CMD = $(SYSCFG_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/out2rprc/elf2rprc.js +APP_IMAGE_SIGN_CMD = $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/appimage_x509_cert_gen.py + +ifeq ($(OS),Windows_NT) + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.exe +else + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.out +endif + +MULTI_CORE_IMAGE_PARAMS = \ + $(BOOTIMAGE_RPRC_NAME)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +MULTI_CORE_IMAGE_PARAMS_XIP = \ + $(BOOTIMAGE_RPRC_NAME_XIP)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +$(BOOTIMAGE_NAME): $(OUTNAME) + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$@ ... +ifneq ($(OS),Windows_NT) + $(CHMOD) a+x $(XIPGEN_CMD) +endif + $(OUTRPRC_CMD) $(OUTNAME) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(COPY) $(BOOTIMAGE_RPRC_NAME) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(XIPGEN_CMD) -i $(BOOTIMAGE_RPRC_NAME_TMP) -o $(BOOTIMAGE_RPRC_NAME) -x $(BOOTIMAGE_RPRC_NAME_XIP) --flash-start-addr 0x60000000 -v > $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME) $(MULTI_CORE_IMAGE_PARAMS) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME_XIP) $(MULTI_CORE_IMAGE_PARAMS_XIP) >> $(BOOTIMAGE_TEMP_OUT_FILE) +# Sign the appimage for HS-FS using appimage signing script + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME_HS_FS) + $(RM) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_TEMP_OUT_FILE) + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$@ Done !!! + @echo . + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$(BOOTIMAGE_NAME_HS_FS) Done !!! + @echo . + +$(BOOTIMAGE_NAME_HS): $(BOOTIMAGE_NAME) +ifeq ($(DEVICE_TYPE), HS) +# Sign the appimage using appimage signing script +ifeq ($(ENC_ENABLED),no) + @echo Boot image signing: Encryption is disabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME_HS) +else + @echo Boot image signing: Encryption is enabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --enc y --enckey $(APP_ENCRYPTION_KEY) --output $(BOOTIMAGE_NAME_HS) + $(RM) $(BOOTIMAGE_NAME)-enc +endif + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_PATH)/$(BOOTIMAGE_NAME_HS) Done !!! + @echo . +endif +-include $(addprefix $(OBJDIR)/, $(DEPS)) diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen new file mode 100644 index 0000000..a314cd1 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_ccs_bootimage_gen @@ -0,0 +1,107 @@ +# +# Auto generated makefile +# + +# Below variables need to be defined outside this file or via command line +# - MOTOR_CONTROL_SDK_PATH +# - PROFILE +# - CG_TOOL_ROOT +# - OUTNAME +# - CCS_INSTALL_DIR +# - CCS_IDE_MODE + +CCS_PATH=$(CCS_INSTALL_DIR) +include ${MOTOR_CONTROL_SDK_PATH}/imports.mak +include ${MOTOR_CONTROL_SDK_PATH}/devconfig/devconfig.mak + +STRIP=$(CG_TOOL_ROOT)/bin/tiarmstrip +OBJCOPY=$(CG_TOOL_ROOT)/bin/tiarmobjcopy +ifeq ($(OS), Windows_NT) + PYTHON=python +else + PYTHON=python3 +endif + +OUTFILE=$(PROFILE)/$(OUTNAME).out +BOOTIMAGE_PATH=$(abspath ${PROFILE}) +BOOTIMAGE_NAME:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage +BOOTIMAGE_NAME_XIP:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage_xip +BOOTIMAGE_NAME_SIGNED:=$(BOOTIMAGE_PATH)/$(OUTNAME).appimage.signed +BOOTIMAGE_RPRC_NAME:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc +BOOTIMAGE_RPRC_NAME_XIP:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc_xip +BOOTIMAGE_RPRC_NAME_TMP:=$(BOOTIMAGE_PATH)/$(OUTNAME).rprc_tmp + +# +# Generation of boot image which can be loaded by Secondary Boot Loader (SBL) +# +ifeq ($(OS),Windows_NT) +EXE_EXT=.exe +endif +ifeq ($(OS),Windows_NT) + BOOTIMAGE_CERT_GEN_CMD=powershell -executionpolicy unrestricted -command $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.ps1 +else + BOOTIMAGE_CERT_GEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/x509CertificateGen.sh +endif +BOOTIMAGE_TEMP_OUT_FILE=$(PROFILE)/temp_stdout_$(PROFILE).txt + +BOOTIMAGE_CORE_ID_a53ss0-0 = 0 +BOOTIMAGE_CORE_ID_r5fss0-0 = 4 +BOOTIMAGE_CORE_ID_r5fss0-1 = 5 +BOOTIMAGE_CORE_ID_r5fss1-0 = 6 +BOOTIMAGE_CORE_ID_r5fss1-1 = 7 +BOOTIMAGE_CORE_ID_m4fss0-0 = 14 +SBL_RUN_ADDRESS=0x70000000 +SBL_DEV_ID=55 + +MULTI_CORE_IMAGE_GEN = $(CCS_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/multicoreImageGen/multicoreImageGen.js +OUTRPRC_CMD = $(CCS_NODE) $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/out2rprc/elf2rprc.js +APP_IMAGE_SIGN_CMD = $(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/signing/appimage_x509_cert_gen.py + +ifeq ($(OS),Windows_NT) + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.exe +else + XIPGEN_CMD=$(MOTOR_CONTROL_SDK_PATH)/mcu_plus_sdk/tools/boot/xipGen/xipGen.out +endif + +MULTI_CORE_IMAGE_PARAMS = \ + $(BOOTIMAGE_RPRC_NAME)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +MULTI_CORE_IMAGE_PARAMS_XIP = \ + $(BOOTIMAGE_RPRC_NAME_XIP)@$(BOOTIMAGE_CORE_ID_r5fss0-0) \ + +all: +ifeq ($(CCS_IDE_MODE),cloud) +# No post build steps +else + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME) ... + $(OUTRPRC_CMD) $(OUTFILE) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(COPY) $(OUTNAME).rprc $(BOOTIMAGE_RPRC_NAME) + $(COPY) $(BOOTIMAGE_RPRC_NAME) $(BOOTIMAGE_RPRC_NAME_TMP) + $(RM) $(BOOTIMAGE_RPRC_NAME) + $(XIPGEN_CMD) -i $(BOOTIMAGE_RPRC_NAME_TMP) -o $(BOOTIMAGE_RPRC_NAME) -x $(BOOTIMAGE_RPRC_NAME_XIP) --flash-start-addr 0x60000000 -v > $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME) $(MULTI_CORE_IMAGE_PARAMS) >> $(BOOTIMAGE_TEMP_OUT_FILE) + $(MULTI_CORE_IMAGE_GEN) --devID $(SBL_DEV_ID) --out $(BOOTIMAGE_NAME_XIP) $(MULTI_CORE_IMAGE_PARAMS_XIP) >> $(BOOTIMAGE_TEMP_OUT_FILE) +# Sign the appimage for HS-FS using appimage signing script + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME).hs_fs +ifeq ($(DEVICE_TYPE),HS) +# Sign the appimage using appimage signing script +ifeq ($(ENC_ENABLED),no) + @echo Boot image signing: Encryption is disabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --output $(BOOTIMAGE_NAME).hs +else + @echo Boot image signing: Encryption is enabled. + $(PYTHON) $(APP_IMAGE_SIGN_CMD) --bin $(BOOTIMAGE_NAME) --authtype 1 --key $(APP_SIGNING_KEY) --enc y --enckey $(APP_ENCRYPTION_KEY) --output $(BOOTIMAGE_NAME).hs + $(RM) $(BOOTIMAGE_NAME)-enc +endif +endif + $(RM) $(BOOTIMAGE_RPRC_NAME_TMP) + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME) Done !!! + @echo . +ifeq ($(DEVICE_TYPE),HS) + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME).hs Done !!! + @echo . +else + @echo Boot image: am64x:r5fss0-0:freertos:ti-arm-clang $(BOOTIMAGE_NAME).hs_fs Done !!! + @echo . +endif +endif diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec new file mode 100644 index 0000000..a332dc5 --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/makefile_projectspec @@ -0,0 +1,20 @@ +# +# Auto generated makefile +# + +export MOTOR_CONTROL_SDK_PATH?=$(abspath ../../../../../..) +include $(MOTOR_CONTROL_SDK_PATH)/imports.mak + +PROFILE?=Release + +PROJECT_NAME=pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang + +all: + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectBuild -ccs.projects $(PROJECT_NAME) -ccs.configuration $(PROFILE) + +clean: + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectBuild -ccs.projects $(PROJECT_NAME) -ccs.configuration $(PROFILE) -ccs.clean + +export: + $(MKDIR) $(MOTOR_CONTROL_SDK_PATH)/ccs_projects + $(CCS_ECLIPSE) -noSplash -data $(MOTOR_CONTROL_SDK_PATH)/ccs_projects -application com.ti.ccstudio.apps.projectCreate -ccs.projectSpec example.projectspec -ccs.overwrite full diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs new file mode 100644 index 0000000..d46875e --- /dev/null +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang/syscfg_c.rov.xs @@ -0,0 +1,8 @@ +/* + * ======== syscfg_c.rov.xs ======== + * This file contains the information needed by the Runtime Object + * View (ROV) tool. + */ +var crovFiles = [ + "mcu_plus_sdk/source/kernel/freertos/rov/FreeRTOS.rov.js", +]; diff --git a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/pruicss_pwm_epwm_sync.c b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/pruicss_pwm_epwm_sync.c similarity index 90% rename from examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/pruicss_pwm_epwm_sync.c rename to examples/pruicss_pwm/pruicss_pwm_epwm_sync/pruicss_pwm_epwm_sync.c index 7a7d62e..57ced35 100644 --- a/examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/pruicss_pwm_epwm_sync.c +++ b/examples/pruicss_pwm/pruicss_pwm_epwm_sync/pruicss_pwm_epwm_sync.c @@ -42,6 +42,38 @@ #include #include +#if defined(am243x_evm) || defined(am64x_evm) +#include + +static TCA6424_Config gTCA6424_Config; + +static void i2c_io_expander(void *args) +{ + int32_t status = SystemP_SUCCESS; + TCA6424_Params tca6424Params; + TCA6424_Params_init(&tca6424Params); + status = TCA6424_open(&gTCA6424_Config, &tca6424Params); + uint32_t ioIndex; + + if(status == SystemP_SUCCESS) + { + /* set P12 high which controls CPSW_FET_SEL -> enable PRU1 and PRU0 GPIOs */ + ioIndex = 0x0a; + status = TCA6424_setOutput( + &gTCA6424_Config, + ioIndex, + TCA6424_OUT_STATE_HIGH); + + /* Configure as output */ + status += TCA6424_config( + &gTCA6424_Config, + ioIndex, + TCA6424_MODE_OUTPUT); + } + TCA6424_close(&gTCA6424_Config); +} +#endif + /* Frequency of PWM output signal in Hz - 1 KHz is selected */ #define SOC_EPWM_OUTPUT_FREQ (1U * 1000U) /* TB frequency in Hz - so that /4 divider is used */ @@ -70,25 +102,6 @@ /* DUTY CYCLE width - this determines width of PWM output signal duty cycle*/ #define APP_PRUICSS_IEP1_COMP12_VAL (APP_PRUICSS_PWM_PRD_VAL-((APP_PRUICSS_PWM3_B2_DUTY_CYCLE*APP_PRUICSS_PWM_PRD_VAL)/100)) -/*FIXME: Add pinmux in sysconfig generated file*/ -Pinmux_PerCfg_t gPinMuxMainDomainCfg1[] = { - - /* PRU_ICSSG0_PWM0 pin config */ - /* PRG0_PWM0_A0 -> PRG0_PRU0_GPO12 (K1) */ - { - PIN_PRG0_PRU0_GPO12, - ( PIN_MODE(3) | PIN_PULL_DISABLE ) - }, - /* PRU_ICSSG0_PWM3 pin config */ - /* PRG0_PWM3_B2 -> PRG0_PRU0_GPO5 (F2) */ - { - PIN_PRG0_PRU0_GPO5, - ( PIN_MODE(3) | PIN_PULL_DISABLE ) - }, - {PINMUX_END, PINMUX_END} - -}; - /* Function Prototypes */ static void App_epwmConfig(uint32_t epwmBaseAddr, uint32_t epwmCh, uint32_t epwmFuncClk); static void pruicss_iep_init(void *args); @@ -110,8 +123,11 @@ void pruicss_pwm_epwm_sync_main(void *args) gPruIcssHandle = PRUICSS_open(CONFIG_PRU_ICSS0); DebugP_assert(gPruIcssHandle != NULL); - Pinmux_config(gPinMuxMainDomainCfg1, PINMUX_DOMAIN_ID_MAIN); - + #if defined(am243x_evm) || defined(am64x_evm) + /* Configure the IO Expander to connect the PRU IOs to HSE */ + i2c_io_expander(NULL); + #endif + pruicss_pwm_init(NULL); pruicss_iep_init(NULL); diff --git a/makefile.am243x b/makefile.am243x index cde500a..6310083 100644 --- a/makefile.am243x +++ b/makefile.am243x @@ -92,6 +92,7 @@ help: @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] + @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-rtupru0_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-txpru0_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @@ -284,6 +285,7 @@ BUILD_COMBO_EXAMPLE_ALL += icss_sdfm_three_channel_with_phase_compensation_am243 BUILD_COMBO_EXAMPLE_ALL += pruicss_pwm_duty_cycle_am243x-evm_r5fss0-0_freertos_ti-arm-clang BUILD_COMBO_EXAMPLE_ALL += pruicss_pwm_duty_cycle_am243x-lp_r5fss0-0_freertos_ti-arm-clang BUILD_COMBO_EXAMPLE_ALL += pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang +BUILD_COMBO_EXAMPLE_ALL += pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang # Various System Example Targets BUILD_COMBO_EXAMPLE_ALL += single_chip_servo_am243x-lp_system_freertos_nortos @@ -447,6 +449,9 @@ examples-private: $(BUILD_COMBO_EXAMPLE_PRIVATE_ALL) pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile all + pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile all + sdfm_firmware_multi_axis_load_share_am243x-evm_icssg0-pru0_fw_ti-pru-cgt: $(MAKE) -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile all @@ -573,6 +578,7 @@ BUILD_COMBO_EXAMPLE_CLEAN_ALL += icss_sdfm_three_channel_with_phase_compensation BUILD_COMBO_EXAMPLE_CLEAN_ALL += pruicss_pwm_duty_cycle_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_CLEAN_ALL += pruicss_pwm_duty_cycle_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_CLEAN_ALL += pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean +BUILD_COMBO_EXAMPLE_CLEAN_ALL += pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean # Various System Example Clean Targets BUILD_COMBO_EXAMPLE_CLEAN_ALL += single_chip_servo_am243x-lp_system_freertos_nortos_clean @@ -736,6 +742,9 @@ examples-private-clean: $(BUILD_COMBO_EXAMPLE_PRIVATE_CLEAN_ALL) pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile clean + pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile clean + sdfm_firmware_multi_axis_load_share_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_clean: $(MAKE) -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile clean @@ -862,6 +871,7 @@ BUILD_COMBO_EXAMPLE_SCRUB_ALL += icss_sdfm_three_channel_with_phase_compensation BUILD_COMBO_EXAMPLE_SCRUB_ALL += pruicss_pwm_duty_cycle_am243x-evm_r5fss0-0_freertos_ti-arm-clang_scrub BUILD_COMBO_EXAMPLE_SCRUB_ALL += pruicss_pwm_duty_cycle_am243x-lp_r5fss0-0_freertos_ti-arm-clang_scrub BUILD_COMBO_EXAMPLE_SCRUB_ALL += pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_scrub +BUILD_COMBO_EXAMPLE_SCRUB_ALL += pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_scrub # Various System Example Scrub Targets BUILD_COMBO_EXAMPLE_SCRUB_ALL += single_chip_servo_am243x-lp_system_freertos_nortos_scrub @@ -1025,6 +1035,9 @@ examples-scrub-private: $(BUILD_COMBO_EXAMPLE_PRIVATE_SCRUB_ALL) pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_scrub: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile scrub + pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_scrub: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile scrub + sdfm_firmware_multi_axis_load_share_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_scrub: $(MAKE) -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile scrub diff --git a/makefile.am64x b/makefile.am64x index e5cd713..7dc3fc6 100644 --- a/makefile.am64x +++ b/makefile.am64x @@ -54,6 +54,7 @@ help: @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/multi_channel/am64x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/single_channel/am64x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] + @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-rtupru1_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-txpru1_fw/ti-pru-cgt [all clean syscfg-gui syscfg] @@ -176,6 +177,7 @@ BUILD_COMBO_EXAMPLE_ALL += hdsl_diagnostic_single_channel_am64x-evm_r5fss0-0_fre BUILD_COMBO_EXAMPLE_ALL += tamagawa_diagnostic_multi_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang BUILD_COMBO_EXAMPLE_ALL += tamagawa_diagnostic_single_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang BUILD_COMBO_EXAMPLE_ALL += pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang +BUILD_COMBO_EXAMPLE_ALL += pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang # Various System Example Targets BUILD_COMBO_EXAMPLE_PRIVATE_ALL = @@ -225,6 +227,9 @@ examples-private: $(BUILD_COMBO_EXAMPLE_PRIVATE_ALL) pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile all + pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile all + endat_peripheral_interface_multi_ch_load_share_am64x-evm_icssg0-pru1_fw_ti-pru-cgt: $(MAKE) -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile all @@ -281,6 +286,7 @@ BUILD_COMBO_EXAMPLE_CLEAN_ALL += hdsl_diagnostic_single_channel_am64x-evm_r5fss0 BUILD_COMBO_EXAMPLE_CLEAN_ALL += tamagawa_diagnostic_multi_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_CLEAN_ALL += tamagawa_diagnostic_single_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_CLEAN_ALL += pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean +BUILD_COMBO_EXAMPLE_CLEAN_ALL += pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean # Various System Example Clean Targets BUILD_COMBO_EXAMPLE_PRIVATE_CLEAN_ALL = @@ -330,6 +336,9 @@ examples-private-clean: $(BUILD_COMBO_EXAMPLE_PRIVATE_CLEAN_ALL) pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile clean + pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile clean + endat_peripheral_interface_multi_ch_load_share_am64x-evm_icssg0-pru1_fw_ti-pru-cgt_clean: $(MAKE) -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile clean @@ -386,6 +395,7 @@ BUILD_COMBO_EXAMPLE_SCRUB_ALL += hdsl_diagnostic_single_channel_am64x-evm_r5fss0 BUILD_COMBO_EXAMPLE_SCRUB_ALL += tamagawa_diagnostic_multi_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_scrub BUILD_COMBO_EXAMPLE_SCRUB_ALL += tamagawa_diagnostic_single_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_scrub BUILD_COMBO_EXAMPLE_SCRUB_ALL += pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_scrub +BUILD_COMBO_EXAMPLE_SCRUB_ALL += pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_scrub # Various System Example Scrub Targets BUILD_COMBO_EXAMPLE_PRIVATE_SCRUB_ALL = @@ -435,6 +445,9 @@ examples-scrub-private: $(BUILD_COMBO_EXAMPLE_PRIVATE_SCRUB_ALL) pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_scrub: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile scrub + pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_scrub: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile scrub + endat_peripheral_interface_multi_ch_load_share_am64x-evm_icssg0-pru1_fw_ti-pru-cgt_scrub: $(MAKE) -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile scrub diff --git a/makefile_projectspec.am243x b/makefile_projectspec.am243x index 23cd256..3277200 100644 --- a/makefile_projectspec.am243x +++ b/makefile_projectspec.am243x @@ -49,6 +49,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += icss_sdfm_three_channel_with_phase_ BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += pruicss_pwm_duty_cycle_am243x-evm_r5fss0-0_freertos_ti-arm-clang_build BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += pruicss_pwm_duty_cycle_am243x-lp_r5fss0-0_freertos_ti-arm-clang_build BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_build +BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_build # Various System Example Projectspec Build Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += single_chip_servo_am243x-lp_system_freertos_nortos_build @@ -212,6 +213,9 @@ all-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_PRIVATE_ALL) pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_build: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec all + pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_build: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec all + sdfm_firmware_multi_axis_load_share_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_build: $(MAKE) -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec all @@ -339,6 +343,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += icss_sdfm_three_channel_with_phase_ BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += pruicss_pwm_duty_cycle_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += pruicss_pwm_duty_cycle_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean +BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean # Various System Example Projectspec Clean Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += single_chip_servo_am243x-lp_system_freertos_nortos_clean @@ -502,6 +507,9 @@ clean-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_PRIVATE_ALL) pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_clean: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec clean + pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_clean: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec clean + sdfm_firmware_multi_axis_load_share_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_clean: $(MAKE) -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec clean @@ -629,6 +637,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += icss_sdfm_three_channel_with_phase BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += pruicss_pwm_duty_cycle_am243x-evm_r5fss0-0_freertos_ti-arm-clang_export BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += pruicss_pwm_duty_cycle_am243x-lp_r5fss0-0_freertos_ti-arm-clang_export BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_export +BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_export # Various System Example Projectspec Export Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += single_chip_servo_am243x-lp_system_freertos_nortos_export @@ -792,6 +801,9 @@ export-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_PRIVATE_ALL) pruicss_pwm_epwm_sync_am243x-lp_r5fss0-0_freertos_ti-arm-clang_export: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec export + pruicss_pwm_epwm_sync_am243x-evm_r5fss0-0_freertos_ti-arm-clang_export: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec export + sdfm_firmware_multi_axis_load_share_am243x-evm_icssg0-pru0_fw_ti-pru-cgt_export: $(MAKE) -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec export @@ -944,6 +956,7 @@ help: @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-lp/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] + @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am243x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-pru0_fw/ti-pru-cgt -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-rtupru0_fw/ti-pru-cgt -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/current_sense/sdfm/firmware/multi_axis_load_share/am243x-evm/icssg0-txpru0_fw/ti-pru-cgt -f makefile_projectspec [export all clean] diff --git a/makefile_projectspec.am64x b/makefile_projectspec.am64x index d56fffc..588a3cb 100644 --- a/makefile_projectspec.am64x +++ b/makefile_projectspec.am64x @@ -15,6 +15,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += hdsl_diagnostic_single_channel_am64 BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += tamagawa_diagnostic_multi_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_build BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += tamagawa_diagnostic_single_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_build BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_build +BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_ALL += pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_build # Various System Example Projectspec Build Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_PRIVATE_ALL = @@ -64,6 +65,9 @@ all-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_BUILD_PRIVATE_ALL) pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_build: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec all + pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_build: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec all + endat_peripheral_interface_multi_ch_load_share_am64x-evm_icssg0-pru1_fw_ti-pru-cgt_build: $(MAKE) -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile_projectspec all @@ -121,6 +125,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += hdsl_diagnostic_single_channel_am64 BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += tamagawa_diagnostic_multi_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += tamagawa_diagnostic_single_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean +BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_ALL += pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean # Various System Example Projectspec Clean Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_PRIVATE_ALL = @@ -170,6 +175,9 @@ clean-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_CLEAN_PRIVATE_ALL) pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec clean + pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_clean: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec clean + endat_peripheral_interface_multi_ch_load_share_am64x-evm_icssg0-pru1_fw_ti-pru-cgt_clean: $(MAKE) -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile_projectspec clean @@ -227,6 +235,7 @@ BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += hdsl_diagnostic_single_channel_am6 BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += tamagawa_diagnostic_multi_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_export BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += tamagawa_diagnostic_single_channel_am64x-evm_r5fss0-0_freertos_ti-arm-clang_export BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_export +BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_ALL += pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_export # Various System Example Projectspec Export Targets BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_PRIVATE_ALL = @@ -276,6 +285,9 @@ export-private: $(BUILD_COMBO_EXAMPLE_PROJECTSPEC_EXPORT_PRIVATE_ALL) pruicss_pwm_duty_cycle_am64x-evm_r5fss0-0_freertos_ti-arm-clang_export: $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec export + pruicss_pwm_epwm_sync_am64x-evm_r5fss0-0_freertos_ti-arm-clang_export: + $(MAKE) -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec export + endat_peripheral_interface_multi_ch_load_share_am64x-evm_icssg0-pru1_fw_ti-pru-cgt_export: $(MAKE) -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile_projectspec export @@ -358,6 +370,7 @@ help: @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/multi_channel/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C examples/position_sense/tamagawa_diagnostic/single_channel/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_duty_cycle/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] + @echo $(MAKE) -s -C examples/pruicss_pwm/pruicss_pwm_epwm_sync/am64x-evm/r5fss0-0_freertos/ti-arm-clang -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-pru1_fw/ti-pru-cgt -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-rtupru1_fw/ti-pru-cgt -f makefile_projectspec [export all clean] @echo $(MAKE) -s -C source/position_sense/endat/firmware/multi_channel_load_share/am64x-evm/icssg0-txpru1_fw/ti-pru-cgt -f makefile_projectspec [export all clean] diff --git a/source/.meta/soc/motor_control_am64x.syscfg.js b/source/.meta/soc/motor_control_am64x.syscfg.js index 2722ea1..ec281fa 100644 --- a/source/.meta/soc/motor_control_am64x.syscfg.js +++ b/source/.meta/soc/motor_control_am64x.syscfg.js @@ -5,6 +5,7 @@ const topModules_main = [ "/position_sense/endat", "/position_sense/hdsl", "/position_sense/tamagawa", + "/pru_icssg/pwm" ]; const topModules_mcu = [