Skip to content

Commit 30d1509

Browse files
Tavish Narukantavish
authored andcommitted
hal: add startup code for TMS570LC43
Adds soc init code including MPU configuration and PLL errata handling for the TI Hercules family SoC TMS570LC43xx. Portions of this code were taken or adapter from Halcogen code generator. This HAL is not really complete, as the currently implemented drivers do not depend on Halcogen and so were not needed. Signed-off-by: Tavish Naruka <[email protected]>
1 parent bc8e7b9 commit 30d1509

File tree

7 files changed

+1153
-0
lines changed

7 files changed

+1153
-0
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
add_subdirectory(simplelink)
22
add_subdirectory(simplelink_lpf3)
33
add_subdirectory(mspm0)
4+
add_subdirectory(hercules/tms570lc43)

hercules/tms570lc43/CMakeLists.txt

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
if(CONFIG_HAS_TMS570_HALCOGEN_CODE)
2+
zephyr_include_directories(
3+
include
4+
)
5+
6+
zephyr_library()
7+
zephyr_library_compile_definitions(${COMPILER})
8+
zephyr_library_sources(
9+
source/soc_init.c
10+
source/asm_funcs.S
11+
source/soc_pll_errata.c
12+
)
13+
endif()
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* Copyright (C) 2025 ispace, inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef __TMS570_SOC_PRIVATE_H__
8+
#define __TMS570_SOC_PRIVATE_H__
9+
10+
#define OSC_IN_FREQ_MHZ DT_PROP(DT_NODELABEL(osc_in), clock_frequency) / 1000000
11+
12+
/**
13+
* - BPOS = 1, Bypass on PLL Slip is enabled
14+
* - PLLDIV = 31 (R = 32)
15+
* - REFCLKDIV = OSC_IN_FREQ_MHZ - 1 (ref clock divider)
16+
* - PLLMUL = 0x9500 (NF, multiplication factor = 0x95+1 = 150)
17+
*
18+
* NOTE: the divider value is changed later on, to be 0 (R=1)
19+
*/
20+
#define PLLCTL1_INIT_VALUE (1 << PLLCTL1_BPOS_OFFSET | \
21+
31 << PLLCTL1_PLLDIV_OFFSET | \
22+
(OSC_IN_FREQ_MHZ - 1) << PLLCTL1_REFCLKDIV_OFFSET | \
23+
0x9500)
24+
25+
/**
26+
*- SPREADINGRATE = 255 (NS = 256)
27+
*- MULMOD = 7
28+
*- ODPLL = 0 (OD, output divider = 0)
29+
*- SPR_AMOUNT = 61 (NV = 62/2048)
30+
*/
31+
#define PLLCTL2_INIT_VALUE (255 << PLLCTL2_SPREADINGRATE_OFFSET | \
32+
7 << PLLCTL2_MULMOD_OFFSET | \
33+
61 << PLLCTL2_SPR_AMOUNT_OFFSET)
34+
35+
/**
36+
*- ODPLL2 = 0 (OD2 = 1)
37+
*- PLLDIV2 = 31 (R2 = 32)
38+
*- REFCLKDIV2 = 7 (NR2 = 8)
39+
*- PLLMUL2 = 0x9500 (NF2 = 150)
40+
*/
41+
#define PLLCTL3_INIT_VALUE (31 << PLLCTL3_PLLDIV2_OFFSET | \
42+
7 << PLLCTL3_REFCLKDIV2_OFFSET | \
43+
0x9500 << PLLCTL3_PLLMUL2_OFFSET)
44+
45+
/**
46+
*- RWAIT = 3 Random/data Read Wait State
47+
*- PFUENB = 1 Prefetch Enable for Port B
48+
*- PFUENA = 1 Prefetch Enable for Port A
49+
*/
50+
#define FRDCNTL_INIT_VALUE (3 << FRDCNTL_RWAIT_OFFSET | FRDCNTL_PFUENA | FRDCNTL_PFUENB)
51+
52+
/**
53+
* - EEPROM Wait state Counter = 9
54+
*/
55+
#define EEPROM_CONFIG_INIT_VALUE (9 << EWAIT_OFFSET)
56+
57+
#define FBPWRMODE_INIT_VALUE (BANKPWR_VAL_ACTIVE << BANKPWR0_OFFSET | \
58+
BANKPWR_VAL_ACTIVE << BANKPWR1_OFFSET | \
59+
BANKPWR_VAL_ACTIVE << BANKPWR7_OFFSET)
60+
61+
/* GCLK, HCLK and VCLK source is PLL1 */
62+
#define GHVSRC_INIT_VALUE (1 << GHVWAKE_OFFSET | 1 << HVLPM_OFFSET | 1 << GHVSRC_OFFSET)
63+
64+
/**
65+
* - RTI1DIV = 0, divider = 1 (NOTE: divider is bypassed when VCLK is the source)
66+
* - RTI1SRC = 9, VCLK as source, 8 to 0xF is VCLK
67+
*/
68+
#define RCLKSRC_INIT_VALUE (0 << RTI1DIV_OFFSET | 9 << RTI1SRC_OFFSET)
69+
70+
/**
71+
*- VCLKA1S = 9, VCLK is source
72+
*- VCLKA2S = 9, VCLK is source
73+
*/
74+
#define VCLKASRC_INIT_VALUE (9 << VCLKA1S_OFFSET | 9 << VCLKA2S_OFFSET)
75+
76+
/*
77+
* - VCLKA4R = 0, divider=1
78+
* - VCLKA4_DIV_CDDIS = 0, Disable the VCLKA4 divider output
79+
* - VCLKA4S = 9, source=VCLK
80+
*/
81+
#define VCLKACON1_INIT_VALUE (0 << VCLKA4R_OFFSET | VCLKA4_DIV_CDDIS | 9 << VCLKA4S_OFFSET)
82+
83+
#endif /* __TMS570_SOC_PRIVATE_H__ */
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
/*
2+
* Copyright (C) 2025 ispace, inc.
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#ifndef __TMS570_SOC_INTERNAL_H__
8+
#define __TMS570_SOC_INTERNAL_H__
9+
10+
#include <zephyr/kernel.h>
11+
#include <soc.h>
12+
13+
/* Primary System Control Registers (SYS) */
14+
#define REG_SYS1_CSDIS (DRV_SYS1 + 0x0030)
15+
#define REG_SYS1_CSDISSET (DRV_SYS1 + 0x0034)
16+
#define REG_SYS1_CSDISCLR (DRV_SYS1 + 0x0038)
17+
#define REG_SYS1_CDDIS (DRV_SYS1 + 0x003C)
18+
#define REG_SYS1_GHVSRC (DRV_SYS1 + 0x0048)
19+
#define REG_SYS1_VCLKASRC (DRV_SYS1 + 0x004C)
20+
#define REG_SYS1_RCLKSRC (DRV_SYS1 + 0x0050)
21+
#define REG_SYS1_CSVSTAT (DRV_SYS1 + 0x0054)
22+
#define REG_SYS1_PLLCTL1 (DRV_SYS1 + 0x0070)
23+
#define REG_SYS1_PLLCTL2 (DRV_SYS1 + 0x0074)
24+
#define REG_SYS1_CLKCNTL (DRV_SYS1 + 0x00D0)
25+
#define REG_SYS1_GBLSTAT (DRV_SYS1 + 0x00EC)
26+
27+
/* Secondary System Control Registers (SYS2) */
28+
#define REG_SYS2_PLLCTL3 (DRV_SYS2 + 0x0000)
29+
#define REG_SYS2_CLK2CNTRL (DRV_SYS2 + 0x003C)
30+
#define REG_SYS2_VCLKACON1 (DRV_SYS2 + 0x0040)
31+
#define REG_SYS2_HCLKCNTL (DRV_SYS2 + 0x0054)
32+
33+
/* peripheral control resgisters */
34+
#define REG_PCR1_PSPWRDWNCLR0 (DRV_PCR1 + 0x00A0)
35+
#define REG_PCR1_PSPWRDWNCLR1 (DRV_PCR1 + 0x00A4)
36+
#define REG_PCR1_PSPWRDWNCLR2 (DRV_PCR1 + 0x00A8)
37+
#define REG_PCR1_PSPWRDWNCLR3 (DRV_PCR1 + 0x00AC)
38+
39+
#define REG_PCR2_PSPWRDWNCLR0 (DRV_PCR2 + 0x00A0)
40+
#define REG_PCR2_PSPWRDWNCLR1 (DRV_PCR2 + 0x00A4)
41+
#define REG_PCR2_PSPWRDWNCLR2 (DRV_PCR2 + 0x00A8)
42+
#define REG_PCR2_PSPWRDWNCLR3 (DRV_PCR2 + 0x00AC)
43+
44+
#define REG_PCR3_PSPWRDWNCLR0 (DRV_PCR3 + 0x00A0)
45+
#define REG_PCR3_PSPWRDWNCLR1 (DRV_PCR3 + 0x00A4)
46+
#define REG_PCR3_PSPWRDWNCLR2 (DRV_PCR3 + 0x00A8)
47+
#define REG_PCR3_PSPWRDWNCLR3 (DRV_PCR3 + 0x00AC)
48+
49+
/* flash control registers */
50+
#define REG_FCR_FRDCNTL (DRV_FCR + 0x0000)
51+
#define REG_FCR_FBPWRMODE (DRV_FCR + 0x0040)
52+
#define REG_FCR_FSM_WR_ENA (DRV_FCR + 0x0288)
53+
#define REG_FCR_EEPROM_CONFIG (DRV_FCR + 0x02B8)
54+
55+
/* error signalling module registers */
56+
#define REG_ESM_EEPAPR1 (DRV_ESM + 0x0000)
57+
#define REG_ESM_DEPAPR1 (DRV_ESM + 0x0004)
58+
#define REG_ESM_IESR1 (DRV_ESM + 0x0008)
59+
#define REG_ESM_IECR1 (DRV_ESM + 0x000C)
60+
#define REG_ESM_ILSR1 (DRV_ESM + 0x0010)
61+
#define REG_ESM_ILCR1 (DRV_ESM + 0x0014)
62+
#define REG_ESM_SR1_0 (DRV_ESM + 0x0018)
63+
#define REG_ESM_SR1_1 (DRV_ESM + 0x001C)
64+
#define REG_ESM_SR1_2 (DRV_ESM + 0x0020)
65+
#define REG_ESM_EPSR (DRV_ESM + 0x0024)
66+
#define REG_ESM_IOFFHR (DRV_ESM + 0x0028)
67+
#define REG_ESM_IOFFLR (DRV_ESM + 0x002C)
68+
#define REG_ESM_LTCR (DRV_ESM + 0x0030)
69+
#define REG_ESM_LTCPR (DRV_ESM + 0x0034)
70+
#define REG_ESM_EKR (DRV_ESM + 0x0038)
71+
#define REG_ESM_SSR2 (DRV_ESM + 0x003C)
72+
#define REG_ESM_IEPSR4 (DRV_ESM + 0x0040)
73+
#define REG_ESM_IEPCR4 (DRV_ESM + 0x0044)
74+
#define REG_ESM_IESR4 (DRV_ESM + 0x0048)
75+
#define REG_ESM_IECR4 (DRV_ESM + 0x004C)
76+
#define REG_ESM_ILSR4 (DRV_ESM + 0x0050)
77+
#define REG_ESM_ILCR4 (DRV_ESM + 0x0054)
78+
#define REG_ESM_SR4_0 (DRV_ESM + 0x0058)
79+
#define REG_ESM_SR4_1 (DRV_ESM + 0x005C)
80+
#define REG_ESM_SR4_2 (DRV_ESM + 0x0060)
81+
#define REG_ESM_IEPSR7 (DRV_ESM + 0x0080)
82+
#define REG_ESM_IEPCR7 (DRV_ESM + 0x0084)
83+
#define REG_ESM_IESR7 (DRV_ESM + 0x0088)
84+
#define REG_ESM_IECR7 (DRV_ESM + 0x008C)
85+
#define REG_ESM_ILSR7 (DRV_ESM + 0x0090)
86+
#define REG_ESM_ILCR7 (DRV_ESM + 0x0094)
87+
#define REG_ESM_SR7_0 (DRV_ESM + 0x0098)
88+
#define REG_ESM_SR7_1 (DRV_ESM + 0x009C)
89+
#define REG_ESM_SR7_2 (DRV_ESM + 0x00A0)
90+
91+
#define REG_SYSECR (DRV_SYSBASE + 0xE0)
92+
#define REG_SYSESR (DRV_SYSBASE + 0xE4)
93+
94+
#define REG_POMGLBCTRL (DRV_POM_CONTROL + 0x00)
95+
96+
#define CSDIS_SRC_OSC BIT(0)
97+
#define CSDIS_SRC_PLL1 BIT(1)
98+
#define CSDIS_SRC_LFLPO BIT(4)
99+
#define CSDIS_SRC_HFLPO BIT(5)
100+
#define CSDIS_SRC_PLL2 BIT(6)
101+
#define CSDIS_SRC_MASK (0xFF)
102+
103+
#define GLBSTAT_OSCFAIL BIT(0)
104+
#define GLBSTAT_RFSLIP BIT(8)
105+
#define GLBSTAT_FBSLIP BIT(9)
106+
107+
#define CLKCNTL_PERIPHENA BIT(8)
108+
109+
#define FRDCNTL_RWAIT_OFFSET (8)
110+
#define FRDCNTL_PFUENB BIT(1)
111+
#define FRDCNTL_PFUENA BIT(0)
112+
113+
#define FSM_WR_ENA_ENABLE_VAL (5 << 0)
114+
#define FSM_WR_ENA_DISABLE_VAL (2 << 0)
115+
116+
#define EWAIT_OFFSET (16)
117+
118+
#define BANKPWR0_OFFSET (0)
119+
#define BANKPWR1_OFFSET (2)
120+
#define BANKPWR7_OFFSET (14)
121+
#define BANKPWR_VAL_ACTIVE (3)
122+
123+
#define GHVWAKE_OFFSET (24)
124+
#define HVLPM_OFFSET (16)
125+
#define GHVSRC_OFFSET (0)
126+
127+
#define RTI1DIV_OFFSET (8)
128+
#define RTI1SRC_OFFSET (0)
129+
130+
#define VCLKA1S_OFFSET (0)
131+
#define VCLKA2S_OFFSET (8)
132+
133+
#define CLKCNTL_VCLKR_OFFSET (16)
134+
#define CLKCNTL_VCLKR_MASK (0xF << CLKCNTL_VCLKR_OFFSET)
135+
#define CLKCNTL_VCLK2R_OFFSET (24)
136+
#define CLKCNTL_VCLK2R_MASK (0xF << CLKCNTL_VCLK2R_OFFSET)
137+
#define CLKCNTL_PENA BIT(8)
138+
#define CLK2CNTRL_VCLK3R_OFFSET (0)
139+
#define CLK2CNTRL_VCLK3R_MASK (0xF << CLK2CNTRL_VCLK3R_OFFSET)
140+
141+
#define VCLKA4R_OFFSET (24)
142+
#define VCLKA4_DIV_CDDIS BIT(20)
143+
#define VCLKA4S_OFFSET (16)
144+
145+
#define PLLCTL1_PLLDIV_OFFSET (24)
146+
#define PLLCTL1_PLLDIV_MASK ~(0x1F << PLLCTL1_PLLDIV_OFFSET)
147+
#define PLLCTL1_BPOS_OFFSET (29)
148+
#define PLLCTL1_REFCLKDIV_OFFSET (16)
149+
150+
#define PLLCTL2_SPREADINGRATE_OFFSET (22)
151+
#define PLLCTL2_MULMOD_OFFSET (12)
152+
#define PLLCTL2_SPR_AMOUNT_OFFSET (0)
153+
154+
#define PLLCTL3_PLLDIV2_OFFSET (24)
155+
#define PLLCTL3_PLLDIV2_MASK ~(0x1F << PLLCTL3_PLLDIV2_OFFSET)
156+
#define PLLCTL3_REFCLKDIV2_OFFSET (16)
157+
#define PLLCTL3_PLLMUL2_OFFSET (0)
158+
159+
#define HCLKCNTL_HCLKR_OFFSET (0)
160+
161+
#define CDDIS_VCLKA2 BIT(5)
162+
163+
typedef enum {
164+
POWERON_RESET = 0x8000U, /**< Alias for Power On Reset */
165+
OSC_FAILURE_RESET = 0x4000U, /**< Alias for Osc Failure Reset */
166+
WATCHDOG_RESET = 0x2000U, /**< Alias for Watch Dog Reset */
167+
WATCHDOG2_RESET = 0x1000U, /**< Alias for Watch Dog 2 Reset */
168+
DEBUG_RESET = 0x0800U, /**< Alias for Debug Reset */
169+
INTERCONNECT_RESET = 0x0080U, /**< Alias for Interconnect Reset */
170+
CPU0_RESET = 0x0020U, /**< Alias for CPU 0 Reset */
171+
SW_RESET = 0x0010U, /**< Alias for Software Reset */
172+
EXT_RESET = 0x0008U, /**< Alias for External Reset */
173+
NO_RESET = 0x0000U /**< Alias for No Reset */
174+
} resetSource_t;
175+
176+
177+
void _mpuInit_(void);
178+
uint32_t _errata_SSWF021_45_both_plls(uint32_t count);
179+
180+
#endif /* __TMS570_SOC_INTERNAL_H__ */

0 commit comments

Comments
 (0)