Skip to content

Commit fc7e117

Browse files
committed
Changed weak target family descriptors to references.
- This causes the g_families[] entries to be NULL if the family descriptor is not defined. So the g_families terminator was changed to all Fs and init_families() updated appropriately. - This changed saves quite a bit of .rodata.
1 parent 5e423b7 commit fc7e117

File tree

1 file changed

+32
-38
lines changed

1 file changed

+32
-38
lines changed

source/target/target_family.c

Lines changed: 32 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -43,31 +43,21 @@ const target_family_descriptor_t g_sw_sysresetreq_family = {
4343
.soft_reset_type = SYSRESETREQ,
4444
};
4545

46-
//Weakly define family
47-
__attribute__((weak))
48-
const target_family_descriptor_t g_nxp_kinetis_kseries = {0};
49-
__attribute__((weak))
50-
const target_family_descriptor_t g_nxp_kinetis_lseries = {0};
51-
__attribute__((weak))
52-
const target_family_descriptor_t g_nxp_kinetis_k32w_series = {0};
53-
__attribute__((weak))
54-
const target_family_descriptor_t g_nxp_mimxrt = {0};
55-
__attribute__((weak))
56-
const target_family_descriptor_t g_nxp_rapid_iot = {0};
57-
__attribute__((weak))
58-
const target_family_descriptor_t g_nordic_nrf51 = {0};
59-
__attribute__((weak))
60-
const target_family_descriptor_t g_nordic_nrf52 = {0};
61-
__attribute__((weak))
62-
const target_family_descriptor_t g_realtek_rtl8195am = {0};
63-
__attribute__((weak))
64-
const target_family_descriptor_t g_ti_family = {0};
65-
__attribute__((weak))
66-
const target_family_descriptor_t g_wiznet_family = {0};
67-
__attribute__((weak))
68-
const target_family_descriptor_t g_renesas_family = {0};
69-
__attribute__((weak))
70-
const target_family_descriptor_t g_toshiba_tz_family = {0};
46+
// Weak references to family definitions.
47+
extern __WEAK const target_family_descriptor_t g_nxp_kinetis_kseries;
48+
extern __WEAK const target_family_descriptor_t g_nxp_kinetis_lseries;
49+
extern __WEAK const target_family_descriptor_t g_nxp_kinetis_k32w_series;
50+
extern __WEAK const target_family_descriptor_t g_nxp_mimxrt;
51+
extern __WEAK const target_family_descriptor_t g_nxp_rapid_iot;
52+
extern __WEAK const target_family_descriptor_t g_nordic_nrf51;
53+
extern __WEAK const target_family_descriptor_t g_nordic_nrf52;
54+
extern __WEAK const target_family_descriptor_t g_realtek_rtl8195am;
55+
extern __WEAK const target_family_descriptor_t g_ti_family;
56+
extern __WEAK const target_family_descriptor_t g_wiznet_family;
57+
extern __WEAK const target_family_descriptor_t g_renesas_family;
58+
extern __WEAK const target_family_descriptor_t g_toshiba_tz_family;
59+
60+
#define FAMILY_LIST_TERMINATOR ((const target_family_descriptor_t *)(0xffffffff))
7161

7262
__attribute__((weak))
7363
const target_family_descriptor_t *g_families[] = {
@@ -86,30 +76,34 @@ const target_family_descriptor_t *g_families[] = {
8676
&g_wiznet_family,
8777
&g_renesas_family,
8878
&g_toshiba_tz_family,
89-
0 // list terminator
90-
};
79+
FAMILY_LIST_TERMINATOR // list terminator
80+
};
9181

9282
__attribute__((weak))
9383
const target_family_descriptor_t *g_target_family = NULL;
9484

9585

9686
void init_family(void)
9787
{
98-
uint8_t index = 0;
99-
uint16_t family_id = get_family_id();
100-
if (g_target_family != NULL){ //already set
88+
// Check if the family is already set.
89+
if (g_target_family != NULL) {
10190
return;
10291
}
103-
104-
while (g_families[index]!=0) {
105-
if (g_families[index]->family_id && (g_families[index]->family_id == family_id)) {
92+
93+
// Scan families table looking for matching family ID.
94+
uint8_t index = 0;
95+
uint16_t family_id = get_family_id();
96+
97+
while (g_families[index] != FAMILY_LIST_TERMINATOR) {
98+
if ((g_families[index] != NULL) && (g_families[index]->family_id == family_id)) {
10699
g_target_family = g_families[index];
107100
break;
108101
}
109102
index++;
110103
}
111-
112-
if(g_target_family == NULL){ //default family
104+
105+
// Last resort is to use a default family.
106+
if (g_target_family == NULL) {
113107
g_target_family = &g_hw_reset_family;
114108
}
115109
}
@@ -138,11 +132,11 @@ uint8_t target_set_state(TARGET_RESET_STATE state)
138132
swd_set_soft_reset(g_target_family->soft_reset_type);
139133
}
140134
return swd_set_target_state_sw(state);
141-
}else {
135+
} else {
142136
return 1;
143137
}
144138
}
145-
}else{
139+
} else {
146140
return 0;
147141
}
148142
}
@@ -151,7 +145,7 @@ void swd_set_target_reset(uint8_t asserted)
151145
{
152146
if (g_target_family && g_target_family->swd_set_target_reset) {
153147
g_target_family->swd_set_target_reset(asserted);
154-
}else {
148+
} else {
155149
(asserted) ? PIN_nRESET_OUT(0) : PIN_nRESET_OUT(1);
156150
}
157151
}

0 commit comments

Comments
 (0)