Skip to content

Commit 5a1ccc0

Browse files
authored
Merge pull request #11780 from OpenNuvoton/nuvoton_fpga_perif_free
Nuvoton: Add implementations of HAL API i2c_free and analogin_free
2 parents a927ab8 + 0260f1b commit 5a1ccc0

File tree

14 files changed

+423
-41
lines changed

14 files changed

+423
-41
lines changed

targets/TARGET_NUVOTON/TARGET_M2351/analogin_api.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,40 @@ void analogin_init(analogin_t *obj, PinName pin)
9292
eadc_modinit_mask |= 1 << chn;
9393
}
9494

95+
void analogin_free(analogin_t *obj)
96+
{
97+
const struct nu_modinit_s *modinit = get_modinit(obj->adc, adc_modinit_tab);
98+
MBED_ASSERT(modinit->modname == (int) obj->adc);
99+
100+
/* Module subindex (aka channel) */
101+
uint32_t chn = NU_MODSUBINDEX(obj->adc);
102+
103+
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
104+
105+
/* Channel-level windup from here */
106+
107+
/* Mark channel free */
108+
eadc_modinit_mask &= ~(1 << chn);
109+
110+
/* Module-level windup from here */
111+
112+
/* See analogin_init() for reason */
113+
if (! eadc_modinit_mask) {
114+
/* Disable EADC module */
115+
EADC_Close(eadc_base);
116+
117+
/* Disable IP clock
118+
*
119+
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
120+
*/
121+
CLK_DisableModuleClock_S(modinit->clkidx);
122+
}
123+
124+
/* Free up pins */
125+
gpio_set(obj->pin);
126+
obj->pin = NC;
127+
}
128+
95129
uint16_t analogin_read_u16(analogin_t *obj)
96130
{
97131
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);

targets/TARGET_NUVOTON/TARGET_M2351/i2c_api.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,37 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
147147
i2c_modinit_mask |= 1 << i;
148148
}
149149

150+
void i2c_free(i2c_t *obj)
151+
{
152+
const struct nu_modinit_s *modinit = get_modinit(obj->i2c.i2c, i2c_modinit_tab);
153+
MBED_ASSERT(modinit != NULL);
154+
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
155+
156+
/* Disable I2C interrupt */
157+
NVIC_DisableIRQ(modinit->irq_n);
158+
159+
I2C_T *i2c_base = (I2C_T *) NU_MODBASE(obj->i2c.i2c);
160+
161+
/* Disable I2C module */
162+
I2C_Close(i2c_base);
163+
164+
/* Disable IP clock
165+
*
166+
* NOTE: We must call secure version (from non-secure domain) because SYS/CLK regions are secure.
167+
*/
168+
CLK_DisableModuleClock_S(modinit->clkidx);
169+
170+
// Mark this module to be deinited.
171+
int i = modinit - i2c_modinit_tab;
172+
i2c_modinit_mask &= ~(1 << i);
173+
174+
/* Free up pins */
175+
gpio_set(obj->i2c.pin_sda);
176+
gpio_set(obj->i2c.pin_scl);
177+
obj->i2c.pin_sda = NC;
178+
obj->i2c.pin_scl = NC;
179+
}
180+
150181
int i2c_start(i2c_t *obj)
151182
{
152183
return i2c_do_trsn(obj, I2C_CTL0_STA_Msk | I2C_CTL0_SI_Msk, 1);

targets/TARGET_NUVOTON/TARGET_M251/analogin_api.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,37 @@ void analogin_init(analogin_t *obj, PinName pin)
9393
eadc_modinit_mask |= 1 << chn;
9494
}
9595

96+
void analogin_free(analogin_t *obj)
97+
{
98+
const struct nu_modinit_s *modinit = get_modinit(obj->adc, adc_modinit_tab);
99+
MBED_ASSERT(modinit->modname == (int) obj->adc);
100+
101+
/* Module subindex (aka channel) */
102+
uint32_t chn = NU_MODSUBINDEX(obj->adc);
103+
104+
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
105+
106+
/* Channel-level windup from here */
107+
108+
/* Mark channel free */
109+
eadc_modinit_mask &= ~(1 << chn);
110+
111+
/* Module-level windup from here */
112+
113+
/* See analogin_init() for reason */
114+
if (! eadc_modinit_mask) {
115+
/* Disable EADC module */
116+
EADC_Close(eadc_base);
117+
118+
/* Disable IP clock */
119+
CLK_DisableModuleClock(modinit->clkidx);
120+
}
121+
122+
/* Free up pins */
123+
gpio_set(obj->pin);
124+
obj->pin = NC;
125+
}
126+
96127
uint16_t analogin_read_u16(analogin_t *obj)
97128
{
98129
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);

targets/TARGET_NUVOTON/TARGET_M251/i2c_api.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,34 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
137137
i2c_modinit_mask |= 1 << i;
138138
}
139139

140+
void i2c_free(i2c_t *obj)
141+
{
142+
const struct nu_modinit_s *modinit = get_modinit(obj->i2c.i2c, i2c_modinit_tab);
143+
MBED_ASSERT(modinit != NULL);
144+
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
145+
146+
/* Disable I2C interrupt */
147+
NVIC_DisableIRQ(modinit->irq_n);
148+
149+
I2C_T *i2c_base = (I2C_T *) NU_MODBASE(obj->i2c.i2c);
150+
151+
/* Disable I2C module */
152+
I2C_Close(i2c_base);
153+
154+
/* Disable IP clock */
155+
CLK_DisableModuleClock(modinit->clkidx);
156+
157+
// Mark this module to be deinited.
158+
int i = modinit - i2c_modinit_tab;
159+
i2c_modinit_mask &= ~(1 << i);
160+
161+
/* Free up pins */
162+
gpio_set(obj->i2c.pin_sda);
163+
gpio_set(obj->i2c.pin_scl);
164+
obj->i2c.pin_sda = NC;
165+
obj->i2c.pin_scl = NC;
166+
}
167+
140168
int i2c_start(i2c_t *obj)
141169
{
142170
return i2c_do_trsn(obj, I2C_CTL0_STA_Msk | I2C_CTL0_SI_Msk, 1);

targets/TARGET_NUVOTON/TARGET_M261/analogin_api.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,37 @@ void analogin_init(analogin_t *obj, PinName pin)
8484
eadc_modinit_mask |= 1 << chn;
8585
}
8686

87+
void analogin_free(analogin_t *obj)
88+
{
89+
const struct nu_modinit_s *modinit = get_modinit(obj->adc, adc_modinit_tab);
90+
MBED_ASSERT(modinit->modname == (int) obj->adc);
91+
92+
/* Module subindex (aka channel) */
93+
uint32_t chn = NU_MODSUBINDEX(obj->adc);
94+
95+
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
96+
97+
/* Channel-level windup from here */
98+
99+
/* Mark channel free */
100+
eadc_modinit_mask &= ~(1 << chn);
101+
102+
/* Module-level windup from here */
103+
104+
/* See analogin_init() for reason */
105+
if (! eadc_modinit_mask) {
106+
/* Disable EADC module */
107+
EADC_Close(eadc_base);
108+
109+
/* Disable IP clock */
110+
CLK_DisableModuleClock(modinit->clkidx);
111+
}
112+
113+
/* Free up pins */
114+
gpio_set(obj->pin);
115+
obj->pin = NC;
116+
}
117+
87118
uint16_t analogin_read_u16(analogin_t *obj)
88119
{
89120
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);

targets/TARGET_NUVOTON/TARGET_M261/i2c_api.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,34 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
142142
i2c_modinit_mask |= 1 << i;
143143
}
144144

145+
void i2c_free(i2c_t *obj)
146+
{
147+
const struct nu_modinit_s *modinit = get_modinit(obj->i2c.i2c, i2c_modinit_tab);
148+
MBED_ASSERT(modinit != NULL);
149+
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
150+
151+
/* Disable I2C interrupt */
152+
NVIC_DisableIRQ(modinit->irq_n);
153+
154+
I2C_T *i2c_base = (I2C_T *) NU_MODBASE(obj->i2c.i2c);
155+
156+
/* Disable I2C module */
157+
I2C_Close(i2c_base);
158+
159+
/* Disable IP clock */
160+
CLK_DisableModuleClock(modinit->clkidx);
161+
162+
// Mark this module to be deinited.
163+
int i = modinit - i2c_modinit_tab;
164+
i2c_modinit_mask &= ~(1 << i);
165+
166+
/* Free up pins */
167+
gpio_set(obj->i2c.pin_sda);
168+
gpio_set(obj->i2c.pin_scl);
169+
obj->i2c.pin_sda = NC;
170+
obj->i2c.pin_scl = NC;
171+
}
172+
145173
int i2c_start(i2c_t *obj)
146174
{
147175
return i2c_do_trsn(obj, I2C_CTL0_STA_Msk | I2C_CTL0_SI_Msk, 1);

targets/TARGET_NUVOTON/TARGET_M451/analogin_api.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,37 @@ void analogin_init(analogin_t *obj, PinName pin)
8484
eadc_modinit_mask |= 1 << chn;
8585
}
8686

87+
void analogin_free(analogin_t *obj)
88+
{
89+
const struct nu_modinit_s *modinit = get_modinit(obj->adc, adc_modinit_tab);
90+
MBED_ASSERT(modinit->modname == (int) obj->adc);
91+
92+
/* Module subindex (aka channel) */
93+
uint32_t chn = NU_MODSUBINDEX(obj->adc);
94+
95+
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
96+
97+
/* Channel-level windup from here */
98+
99+
/* Mark channel free */
100+
eadc_modinit_mask &= ~(1 << chn);
101+
102+
/* Module-level windup from here */
103+
104+
/* See analogin_init() for reason */
105+
if (! eadc_modinit_mask) {
106+
/* Disable EADC module */
107+
EADC_Close(eadc_base);
108+
109+
/* Disable IP clock */
110+
CLK_DisableModuleClock(modinit->clkidx);
111+
}
112+
113+
/* Free up pins */
114+
gpio_set(obj->pin);
115+
obj->pin = NC;
116+
}
117+
87118
uint16_t analogin_read_u16(analogin_t *obj)
88119
{
89120
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);

targets/TARGET_NUVOTON/TARGET_M451/i2c_api.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,34 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
150150
i2c_modinit_mask |= 1 << i;
151151
}
152152

153+
void i2c_free(i2c_t *obj)
154+
{
155+
const struct nu_modinit_s *modinit = get_modinit(obj->i2c.i2c, i2c_modinit_tab);
156+
MBED_ASSERT(modinit != NULL);
157+
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
158+
159+
/* Disable I2C interrupt */
160+
NVIC_DisableIRQ(modinit->irq_n);
161+
162+
I2C_T *i2c_base = (I2C_T *) NU_MODBASE(obj->i2c.i2c);
163+
164+
/* Disable I2C module */
165+
I2C_Close(i2c_base);
166+
167+
/* Disable IP clock */
168+
CLK_DisableModuleClock(modinit->clkidx);
169+
170+
// Mark this module to be deinited.
171+
int i = modinit - i2c_modinit_tab;
172+
i2c_modinit_mask &= ~(1 << i);
173+
174+
/* Free up pins */
175+
gpio_set(obj->i2c.pin_sda);
176+
gpio_set(obj->i2c.pin_scl);
177+
obj->i2c.pin_sda = NC;
178+
obj->i2c.pin_scl = NC;
179+
}
180+
153181
int i2c_start(i2c_t *obj)
154182
{
155183
return i2c_do_trsn(obj, I2C_CTL_STA_Msk | I2C_CTL_SI_Msk, 1);

targets/TARGET_NUVOTON/TARGET_M480/analogin_api.c

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,37 @@ void analogin_init(analogin_t *obj, PinName pin)
8383
eadc_modinit_mask |= 1 << chn;
8484
}
8585

86+
void analogin_free(analogin_t *obj)
87+
{
88+
const struct nu_modinit_s *modinit = get_modinit(obj->adc, adc_modinit_tab);
89+
MBED_ASSERT(modinit->modname == (int) obj->adc);
90+
91+
/* Module subindex (aka channel) */
92+
uint32_t chn = NU_MODSUBINDEX(obj->adc);
93+
94+
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);
95+
96+
/* Channel-level windup from here */
97+
98+
/* Mark channel free */
99+
eadc_modinit_mask &= ~(1 << chn);
100+
101+
/* Module-level windup from here */
102+
103+
/* See analogin_init() for reason */
104+
if (! eadc_modinit_mask) {
105+
/* Disable EADC module */
106+
EADC_Close(eadc_base);
107+
108+
/* Disable IP clock */
109+
CLK_DisableModuleClock(modinit->clkidx);
110+
}
111+
112+
/* Free up pins */
113+
gpio_set(obj->pin);
114+
obj->pin = NC;
115+
}
116+
86117
uint16_t analogin_read_u16(analogin_t *obj)
87118
{
88119
EADC_T *eadc_base = (EADC_T *) NU_MODBASE(obj->adc);

targets/TARGET_NUVOTON/TARGET_M480/i2c_api.c

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,34 @@ void i2c_init(i2c_t *obj, PinName sda, PinName scl)
141141
i2c_modinit_mask |= 1 << i;
142142
}
143143

144+
void i2c_free(i2c_t *obj)
145+
{
146+
const struct nu_modinit_s *modinit = get_modinit(obj->i2c.i2c, i2c_modinit_tab);
147+
MBED_ASSERT(modinit != NULL);
148+
MBED_ASSERT(modinit->modname == (int) obj->i2c.i2c);
149+
150+
/* Disable I2C interrupt */
151+
NVIC_DisableIRQ(modinit->irq_n);
152+
153+
I2C_T *i2c_base = (I2C_T *) NU_MODBASE(obj->i2c.i2c);
154+
155+
/* Disable I2C module */
156+
I2C_Close(i2c_base);
157+
158+
/* Disable IP clock */
159+
CLK_DisableModuleClock(modinit->clkidx);
160+
161+
// Mark this module to be deinited.
162+
int i = modinit - i2c_modinit_tab;
163+
i2c_modinit_mask &= ~(1 << i);
164+
165+
/* Free up pins */
166+
gpio_set(obj->i2c.pin_sda);
167+
gpio_set(obj->i2c.pin_scl);
168+
obj->i2c.pin_sda = NC;
169+
obj->i2c.pin_scl = NC;
170+
}
171+
144172
int i2c_start(i2c_t *obj)
145173
{
146174
return i2c_do_trsn(obj, I2C_CTL0_STA_Msk | I2C_CTL0_SI_Msk, 1);

0 commit comments

Comments
 (0)