Skip to content

Commit d6136b9

Browse files
Merge pull request #5157 from OpenNuvoton/nuvoton
NUC472/M453/M487/NANO130: Add updates for Nuvoton targets
2 parents d60f145 + bf426b0 commit d6136b9

File tree

36 files changed

+110
-660
lines changed

36 files changed

+110
-660
lines changed

features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_NUVOTON/TARGET_M480/m480_eth.c

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,15 @@ static void __eth_clk_pin_init()
215215
/* Init I/O Multi-function */
216216
/*---------------------------------------------------------------------------------------------------------*/
217217
// Configure RMII pins
218-
SYS->GPA_MFPL = SYS_GPA_MFPL_PA6MFP_EMAC_RMII_RXERR | SYS_GPA_MFPL_PA7MFP_EMAC_RMII_CRSDV;
219-
SYS->GPC_MFPL = SYS_GPC_MFPL_PC6MFP_EMAC_RMII_RXD1 | SYS_GPC_MFPL_PC7MFP_EMAC_RMII_RXD0;
220-
SYS->GPC_MFPH = SYS_GPC_MFPH_PC8MFP_EMAC_RMII_REFCLK;
221-
SYS->GPE_MFPH = SYS_GPE_MFPH_PE8MFP_EMAC_RMII_MDC |
218+
SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA6MFP_Msk | SYS_GPA_MFPL_PA7MFP_Msk);
219+
SYS->GPA_MFPL |= SYS_GPA_MFPL_PA6MFP_EMAC_RMII_RXERR | SYS_GPA_MFPL_PA7MFP_EMAC_RMII_CRSDV;
220+
SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC6MFP_Msk | SYS_GPC_MFPL_PC7MFP_Msk);
221+
SYS->GPC_MFPL |= SYS_GPC_MFPL_PC6MFP_EMAC_RMII_RXD1 | SYS_GPC_MFPL_PC7MFP_EMAC_RMII_RXD0;
222+
SYS->GPC_MFPH &= ~SYS_GPC_MFPH_PC8MFP_Msk;
223+
SYS->GPC_MFPH |= SYS_GPC_MFPH_PC8MFP_EMAC_RMII_REFCLK;
224+
SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE8MFP_Msk | SYS_GPE_MFPH_PE9MFP_Msk | SYS_GPE_MFPH_PE10MFP_Msk |
225+
SYS_GPE_MFPH_PE11MFP_Msk | SYS_GPE_MFPH_PE12MFP_Msk);
226+
SYS->GPE_MFPH |= SYS_GPE_MFPH_PE8MFP_EMAC_RMII_MDC |
222227
SYS_GPE_MFPH_PE9MFP_EMAC_RMII_MDIO |
223228
SYS_GPE_MFPH_PE10MFP_EMAC_RMII_TXD0 |
224229
SYS_GPE_MFPH_PE11MFP_EMAC_RMII_TXD1 |

features/FEATURE_LWIP/lwip-interface/lwip-eth/arch/TARGET_NUVOTON/TARGET_NUC472/nuc472_eth.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ static void __eth_clk_pin_init()
207207
/* Init I/O Multi-function */
208208
/*---------------------------------------------------------------------------------------------------------*/
209209
// Configure RMII pins
210+
SYS->GPC_MFPL &= ~( SYS_GPC_MFPL_PC0MFP_Msk | SYS_GPC_MFPL_PC1MFP_Msk |
211+
SYS_GPC_MFPL_PC2MFP_Msk | SYS_GPC_MFPL_PC3MFP_Msk |
212+
SYS_GPC_MFPL_PC4MFP_Msk | SYS_GPC_MFPL_PC6MFP_Msk | SYS_GPC_MFPL_PC7MFP_Msk );
210213
SYS->GPC_MFPL |= SYS_GPC_MFPL_PC0MFP_EMAC_REFCLK |
211214
SYS_GPC_MFPL_PC1MFP_EMAC_MII_RXERR |
212215
SYS_GPC_MFPL_PC2MFP_EMAC_MII_RXDV |
@@ -215,12 +218,13 @@ static void __eth_clk_pin_init()
215218
SYS_GPC_MFPL_PC6MFP_EMAC_MII_TXD0 |
216219
SYS_GPC_MFPL_PC7MFP_EMAC_MII_TXD1;
217220

218-
221+
SYS->GPC_MFPH &= ~SYS_GPC_MFPH_PC8MFP_Msk;
219222
SYS->GPC_MFPH |= SYS_GPC_MFPH_PC8MFP_EMAC_MII_TXEN;
220223
// Enable high slew rate on all RMII pins
221224
PC->SLEWCTL |= 0x1DF;
222225

223226
// Configure MDC, MDIO at PB14 & PB15
227+
SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB14MFP_Msk | SYS_GPB_MFPH_PB15MFP_Msk);
224228
SYS->GPB_MFPH |= SYS_GPB_MFPH_PB14MFP_EMAC_MII_MDC | SYS_GPB_MFPH_PB15MFP_EMAC_MII_MDIO;
225229

226230
}

targets/TARGET_NUVOTON/TARGET_M451/TARGET_NUMAKER_PFM_M453/objects.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,10 +117,6 @@ struct pwmout_s {
117117
uint32_t pulsewidth_us;
118118
};
119119

120-
struct sleep_s {
121-
int powerdown;
122-
};
123-
124120
struct can_s {
125121
CANName can;
126122
char index;

targets/TARGET_NUVOTON/TARGET_M451/i2c_api.c

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -339,25 +339,6 @@ static int i2c_set_int(i2c_t *obj, int inten)
339339
return inten_back;
340340
}
341341

342-
int i2c_allow_powerdown(void)
343-
{
344-
uint32_t modinit_mask = i2c_modinit_mask;
345-
while (modinit_mask) {
346-
int i2c_idx = nu_ctz(modinit_mask);
347-
const struct nu_modinit_s *modinit = i2c_modinit_tab + i2c_idx;
348-
struct nu_i2c_var *var = (struct nu_i2c_var *) modinit->var;
349-
if (var->obj) {
350-
// Disallow entering power-down mode if I2C transfer is enabled.
351-
if (i2c_active(var->obj)) {
352-
return 0;
353-
}
354-
}
355-
modinit_mask &= ~(1 << i2c_idx);
356-
}
357-
358-
return 1;
359-
}
360-
361342
static int i2c_do_tran(i2c_t *obj, char *buf, int length, int read, int naklastdata)
362343
{
363344
if (! buf || ! length) {

targets/TARGET_NUVOTON/TARGET_M451/pwmout_api.c

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -172,26 +172,6 @@ void pwmout_pulsewidth_us(pwmout_t* obj, int us)
172172
pwmout_config(obj);
173173
}
174174

175-
int pwmout_allow_powerdown(void)
176-
{
177-
uint32_t modinit_mask = pwm_modinit_mask;
178-
while (modinit_mask) {
179-
int pwm_idx = nu_ctz(modinit_mask);
180-
const struct nu_modinit_s *modinit = pwm_modinit_tab + pwm_idx;
181-
if (modinit->modname != NC) {
182-
PWM_T *pwm_base = (PWM_T *) NU_MODBASE(modinit->modname);
183-
uint32_t chn = NU_MODSUBINDEX(modinit->modname);
184-
// Disallow entering power-down mode if PWM counter is enabled.
185-
if ((pwm_base->CNTEN & (1 << chn)) && pwm_base->CMPDAT[chn]) {
186-
return 0;
187-
}
188-
}
189-
modinit_mask &= ~(1 << pwm_idx);
190-
}
191-
192-
return 1;
193-
}
194-
195175
static void pwmout_config(pwmout_t* obj)
196176
{
197177
PWM_T *pwm_base = (PWM_T *) NU_MODBASE(obj->pwm);

targets/TARGET_NUVOTON/TARGET_M451/rtc_api.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ time_t rtc_read(void)
8787
timeinfo.tm_mday = rtc_datetime.u32Day;
8888
timeinfo.tm_wday = rtc_datetime.u32DayOfWeek;
8989
timeinfo.tm_hour = rtc_datetime.u32Hour;
90+
if (rtc_datetime.u32TimeScale == RTC_CLOCK_12 && rtc_datetime.u32AmPm == RTC_PM) {
91+
timeinfo.tm_hour += 12;
92+
}
9093
timeinfo.tm_min = rtc_datetime.u32Minute;
9194
timeinfo.tm_sec = rtc_datetime.u32Second;
9295

targets/TARGET_NUVOTON/TARGET_M451/serial_api.c

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -656,33 +656,6 @@ int serial_irq_handler_asynch(serial_t *obj)
656656
return (obj->serial.event & (event_rx | event_tx));
657657
}
658658

659-
int serial_allow_powerdown(void)
660-
{
661-
uint32_t modinit_mask = uart_modinit_mask;
662-
while (modinit_mask) {
663-
int uart_idx = nu_ctz(modinit_mask);
664-
const struct nu_modinit_s *modinit = uart_modinit_tab + uart_idx;
665-
if (modinit->modname != NC) {
666-
UART_T *uart_base = (UART_T *) NU_MODBASE(modinit->modname);
667-
// Disallow entering power-down mode if Tx FIFO has data to flush
668-
if (! UART_IS_TX_EMPTY((uart_base))) {
669-
return 0;
670-
}
671-
// Disallow entering power-down mode if async Rx transfer (not PDMA) is on-going
672-
if (uart_base->INTEN & (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk)) {
673-
return 0;
674-
}
675-
// Disallow entering power-down mode if async Rx transfer (PDMA) is on-going
676-
if (uart_base->INTEN & UART_INTEN_RXPDMAEN_Msk) {
677-
return 0;
678-
}
679-
}
680-
modinit_mask &= ~(1 << uart_idx);
681-
}
682-
683-
return 1;
684-
}
685-
686659
static void uart0_vec_async(void)
687660
{
688661
uart_irq_async(uart0_var.obj);

targets/TARGET_NUVOTON/TARGET_M451/sleep.c

Lines changed: 8 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515
*/
1616

1717
#include "sleep_api.h"
18-
#include "serial_api.h"
19-
#include "lp_ticker_api.h"
2018

2119
#if DEVICE_SLEEP
2220

@@ -25,77 +23,24 @@
2523
#include "objects.h"
2624
#include "PeripheralPins.h"
2725

28-
static void mbed_enter_sleep(struct sleep_s *obj);
29-
static void mbed_exit_sleep(struct sleep_s *obj);
30-
31-
int serial_allow_powerdown(void);
32-
int spi_allow_powerdown(void);
33-
int i2c_allow_powerdown(void);
34-
int pwmout_allow_powerdown(void);
35-
3626
/**
37-
* Enter Idle mode.
27+
* Enter idle mode, in which just CPU is halted.
3828
*/
3929
void hal_sleep(void)
4030
{
41-
struct sleep_s sleep_obj;
42-
sleep_obj.powerdown = 0;
43-
mbed_enter_sleep(&sleep_obj);
44-
mbed_exit_sleep(&sleep_obj);
31+
SYS_UnlockReg();
32+
CLK_Idle();
33+
SYS_LockReg();
4534
}
4635

4736
/**
48-
* Enter Power-down mode while no peripheral is active; otherwise, enter Idle mode.
37+
* Enter power-down mode, in which HXT/HIRC are halted.
4938
*/
5039
void hal_deepsleep(void)
5140
{
52-
struct sleep_s sleep_obj;
53-
sleep_obj.powerdown = 1;
54-
mbed_enter_sleep(&sleep_obj);
55-
mbed_exit_sleep(&sleep_obj);
56-
}
57-
58-
static void mbed_enter_sleep(struct sleep_s *obj)
59-
{
60-
// Check if serial allows entering power-down mode
61-
if (obj->powerdown) {
62-
obj->powerdown = serial_allow_powerdown();
63-
}
64-
// Check if spi allows entering power-down mode
65-
if (obj->powerdown) {
66-
obj->powerdown = spi_allow_powerdown();
67-
}
68-
// Check if i2c allows entering power-down mode
69-
if (obj->powerdown) {
70-
obj->powerdown = i2c_allow_powerdown();
71-
}
72-
// Check if pwmout allows entering power-down mode
73-
if (obj->powerdown) {
74-
obj->powerdown = pwmout_allow_powerdown();
75-
}
76-
// TODO: Check if other peripherals allow entering power-down mode
77-
78-
if (obj->powerdown) { // Power-down mode (HIRC/HXT disabled, LIRC/LXT enabled)
79-
SYS_UnlockReg();
80-
CLK_PowerDown();
81-
SYS_LockReg();
82-
}
83-
else { // CPU halt mode (HIRC/HXT enabled, LIRC/LXT enabled)
84-
SYS_UnlockReg();
85-
CLK_Idle();
86-
SYS_LockReg();
87-
}
88-
__NOP();
89-
__NOP();
90-
__NOP();
91-
__NOP();
92-
}
93-
94-
static void mbed_exit_sleep(struct sleep_s *obj)
95-
{
96-
// TODO: TO BE CONTINUED
97-
98-
(void)obj;
41+
SYS_UnlockReg();
42+
CLK_PowerDown();
43+
SYS_LockReg();
9944
}
10045

10146
#endif

targets/TARGET_NUVOTON/TARGET_M451/spi_api.c

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -470,25 +470,6 @@ uint8_t spi_active(spi_t *obj)
470470
return (spi_base->CTL & SPI_CTL_SPIEN_Msk);
471471
}
472472

473-
int spi_allow_powerdown(void)
474-
{
475-
uint32_t modinit_mask = spi_modinit_mask;
476-
while (modinit_mask) {
477-
int spi_idx = nu_ctz(modinit_mask);
478-
const struct nu_modinit_s *modinit = spi_modinit_tab + spi_idx;
479-
if (modinit->modname != NC) {
480-
SPI_T *spi_base = (SPI_T *) NU_MODBASE(modinit->modname);
481-
// Disallow entering power-down mode if SPI transfer is enabled.
482-
if (spi_base->CTL & SPI_CTL_SPIEN_Msk) {
483-
return 0;
484-
}
485-
}
486-
modinit_mask &= ~(1 << spi_idx);
487-
}
488-
489-
return 1;
490-
}
491-
492473
static int spi_writeable(spi_t * obj)
493474
{
494475
// Receive FIFO must not be full to avoid receive FIFO overflow on next transmit/receive

targets/TARGET_NUVOTON/TARGET_M480/TARGET_NUMAKER_PFM_M487/objects.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,10 +118,6 @@ struct pwmout_s {
118118
uint32_t pulsewidth_us;
119119
};
120120

121-
struct sleep_s {
122-
int powerdown;
123-
};
124-
125121
struct trng_s {
126122
uint8_t dummy;
127123
};

targets/TARGET_NUVOTON/TARGET_M480/i2c_api.c

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -330,25 +330,6 @@ static int i2c_set_int(i2c_t *obj, int inten)
330330
return inten_back;
331331
}
332332

333-
int i2c_allow_powerdown(void)
334-
{
335-
uint32_t modinit_mask = i2c_modinit_mask;
336-
while (modinit_mask) {
337-
int i2c_idx = nu_ctz(modinit_mask);
338-
const struct nu_modinit_s *modinit = i2c_modinit_tab + i2c_idx;
339-
struct nu_i2c_var *var = (struct nu_i2c_var *) modinit->var;
340-
if (var->obj) {
341-
// Disallow entering power-down mode if I2C transfer is enabled.
342-
if (i2c_active(var->obj)) {
343-
return 0;
344-
}
345-
}
346-
modinit_mask &= ~(1 << i2c_idx);
347-
}
348-
349-
return 1;
350-
}
351-
352333
static int i2c_do_tran(i2c_t *obj, char *buf, int length, int read, int naklastdata)
353334
{
354335
if (! buf || ! length) {

targets/TARGET_NUVOTON/TARGET_M480/pwmout_api.c

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -167,26 +167,6 @@ void pwmout_pulsewidth_us(pwmout_t* obj, int us)
167167
pwmout_config(obj, 1);
168168
}
169169

170-
int pwmout_allow_powerdown(void)
171-
{
172-
uint32_t modinit_mask = pwm_modinit_mask;
173-
while (modinit_mask) {
174-
int pwm_idx = nu_ctz(modinit_mask);
175-
const struct nu_modinit_s *modinit = pwm_modinit_tab + pwm_idx;
176-
if (modinit->modname != NC) {
177-
EPWM_T *pwm_base = (EPWM_T *) NU_MODBASE(modinit->modname);
178-
uint32_t chn = NU_MODSUBINDEX(modinit->modname);
179-
// Disallow entering power-down mode if PWM counter is enabled.
180-
if ((pwm_base->CNTEN & (1 << chn)) && pwm_base->CMPDAT[chn]) {
181-
return 0;
182-
}
183-
}
184-
modinit_mask &= ~(1 << pwm_idx);
185-
}
186-
187-
return 1;
188-
}
189-
190170
static void pwmout_config(pwmout_t* obj, int start)
191171
{
192172
EPWM_T *pwm_base = (EPWM_T *) NU_MODBASE(obj->pwm);

targets/TARGET_NUVOTON/TARGET_M480/rtc_api.c

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "mbed_error.h"
2323
#include "nu_modutil.h"
2424
#include "nu_miscutil.h"
25+
#include "mbed_mktime.h"
2526

2627
#define YEAR0 1900
2728
//#define EPOCH_YR 1970
@@ -88,11 +89,14 @@ time_t rtc_read(void)
8889
timeinfo.tm_mday = rtc_datetime.u32Day;
8990
timeinfo.tm_wday = rtc_datetime.u32DayOfWeek;
9091
timeinfo.tm_hour = rtc_datetime.u32Hour;
92+
if (rtc_datetime.u32TimeScale == RTC_CLOCK_12 && rtc_datetime.u32AmPm == RTC_PM) {
93+
timeinfo.tm_hour += 12;
94+
}
9195
timeinfo.tm_min = rtc_datetime.u32Minute;
9296
timeinfo.tm_sec = rtc_datetime.u32Second;
9397

9498
// Convert to timestamp
95-
time_t t = mktime(&timeinfo);
99+
time_t t = _rtc_mktime(&timeinfo);
96100

97101
return t;
98102
}
@@ -104,18 +108,21 @@ void rtc_write(time_t t)
104108
}
105109

106110
// Convert timestamp to struct tm
107-
struct tm *timeinfo = localtime(&t);
111+
struct tm timeinfo;
112+
if (_rtc_localtime(t, &timeinfo) == false) {
113+
return;
114+
}
108115

109116
S_RTC_TIME_DATA_T rtc_datetime;
110117

111118
// Convert S_RTC_TIME_DATA_T to struct tm
112-
rtc_datetime.u32Year = timeinfo->tm_year + YEAR0;
113-
rtc_datetime.u32Month = timeinfo->tm_mon + 1;
114-
rtc_datetime.u32Day = timeinfo->tm_mday;
115-
rtc_datetime.u32DayOfWeek = timeinfo->tm_wday;
116-
rtc_datetime.u32Hour = timeinfo->tm_hour;
117-
rtc_datetime.u32Minute = timeinfo->tm_min;
118-
rtc_datetime.u32Second = timeinfo->tm_sec;
119+
rtc_datetime.u32Year = timeinfo.tm_year + YEAR0;
120+
rtc_datetime.u32Month = timeinfo.tm_mon + 1;
121+
rtc_datetime.u32Day = timeinfo.tm_mday;
122+
rtc_datetime.u32DayOfWeek = timeinfo.tm_wday;
123+
rtc_datetime.u32Hour = timeinfo.tm_hour;
124+
rtc_datetime.u32Minute = timeinfo.tm_min;
125+
rtc_datetime.u32Second = timeinfo.tm_sec;
119126
rtc_datetime.u32TimeScale = RTC_CLOCK_24;
120127

121128
// NOTE: Timing issue with write to RTC registers. This delay is empirical, not rational.

0 commit comments

Comments
 (0)