Skip to content

Commit ce034e6

Browse files
authored
Merge pull request #4202 from OpenNuvoton/nuvoton
[Nuvoton] Support NUC980 ARM9 platform.
2 parents 858295f + c9892a8 commit ce034e6

File tree

167 files changed

+50456
-387
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

167 files changed

+50456
-387
lines changed

bsp/nuvoton/README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ Current supported BSP shown in below table:
33

44
| **BSP folder** | **Board name** |
55
|:------------------------- |:-------------------------- |
6-
| [numaker-iot-m487](numaker-iot-m487) | Nuvoton NuMaker-IoT-m487 |
7-
| [numaker-pfm-m487](numaker-pfm-m487) | Nuvoton NuMaker-PFM-m487 |
6+
| [numaker-iot-m487](numaker-iot-m487) | Nuvoton NuMaker-IoT-M487 |
7+
| [numaker-pfm-m487](numaker-pfm-m487) | Nuvoton NuMaker-PFM-M487 |
8+
| [nk-980iot](nk-980iot) | Nuvoton NK-980IOT |

bsp/nuvoton/libraries/m480/StdDriver/src/nu_can.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,11 +1148,11 @@ int32_t CAN_SetRxMsgAndMsk(CAN_T *tCAN, uint32_t u32MsgNum, uint32_t u32IDType,
11481148
int32_t CAN_SetMultiRxMsg(CAN_T *tCAN, uint32_t u32MsgNum, uint32_t u32MsgCount, uint32_t u32IDType, uint32_t u32ID)
11491149
{
11501150
int32_t rev = (int32_t)TRUE;
1151-
uint32_t i = 0ul;
1151+
uint32_t i;
11521152
uint32_t u32TimeOutCount;
11531153
uint32_t u32EOB_Flag = 0ul;
11541154

1155-
for(i = 1ul; i < u32MsgCount; i++)
1155+
for(i = 1ul; i <= u32MsgCount; i++)
11561156
{
11571157
u32TimeOutCount = 0ul;
11581158

bsp/nuvoton/libraries/m480/USBHostLib/inc/usbh_lib.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ typedef int (UAC_CB_FUNC)(struct uac_dev_t *dev, uint8_t *data, int len); /*!
141141
/* */
142142
/*------------------------------------------------------------------*/
143143
extern void usbh_core_init(void);
144-
extern int usbh_pooling_root_hubs(void);
144+
extern int usbh_polling_root_hubs(void);
145145
extern void usbh_install_conn_callback(CONN_FUNC *conn_func, CONN_FUNC *disconn_func);
146146
extern void usbh_suspend(void);
147147
extern void usbh_resume(void);

bsp/nuvoton/libraries/m480/USBHostLib/src/usb_core.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void usbh_core_init()
8080
* @retval 0 No any hub port status changes found.
8181
* @retval 1 There's hub port status changes.
8282
*/
83-
int usbh_pooling_root_hubs(void)
83+
int usbh_polling_root_hubs(void)
8484
{
8585
int ret, change = 0;
8686

bsp/nuvoton/libraries/m480/rtt_port/Kconfig

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -941,6 +941,13 @@ config SOC_SERIES_M480
941941
select RT_USING_USB_HOST
942942
select RT_USBH_MSTORAGE
943943

944+
if BSP_USING_USBH || BSP_USING_HSUSBH
945+
config NU_USBHOST_HUB_POLLING_INTERVAL
946+
int "USB Root Hub Polling Interval(in Mili-seconds)"
947+
range 100 2000
948+
default 100
949+
endif
950+
944951
config BSP_USING_HSOTG
945952
bool "Enable High-Speed USB On-The-Go(HSOTG)"
946953
select BSP_USING_HSUSBH

bsp/nuvoton/libraries/m480/rtt_port/drv_bpwm_capture.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <rtconfig.h>
1313

1414
#if defined(BSP_USING_BPWM_CAPTURE)
15+
#if ((BSP_USING_BPWM0_CAPTURE_CHMSK+BSP_USING_BPWM1_CAPTURE_CHMSK)!=0)
1516
#include <rtdevice.h>
1617
#include <NuMicro.h>
1718

@@ -211,7 +212,7 @@ static rt_err_t nu_bpwm_init(nu_capture_t *nu_capture)
211212
/* Enable BPWM0 clock */
212213
SYS_UnlockReg();
213214
CLK_EnableModuleClock(BPWM0_MODULE);
214-
CLK_SetModuleClock(BPWM0_MODULE, CLK_CLKSEL2_BPWM0SEL_PLL, (uint32_t)NULL);
215+
CLK_SetModuleClock(BPWM0_MODULE, CLK_CLKSEL2_BPWM0SEL_PLL, 0);
215216
SYS_LockReg();
216217
bpwm_config(nu_capture);
217218
bBPWM0Inited = RT_TRUE;
@@ -225,7 +226,7 @@ static rt_err_t nu_bpwm_init(nu_capture_t *nu_capture)
225226
/* Enable BPWM1 clock */
226227
SYS_UnlockReg();
227228
CLK_EnableModuleClock(BPWM1_MODULE);
228-
CLK_SetModuleClock(BPWM1_MODULE, CLK_CLKSEL2_BPWM1SEL_PLL, (uint32_t)NULL);
229+
CLK_SetModuleClock(BPWM1_MODULE, CLK_CLKSEL2_BPWM1SEL_PLL, 0);
229230
SYS_LockReg();
230231
bpwm_config(nu_capture);
231232
bBPWM1Inited = RT_TRUE;
@@ -330,4 +331,5 @@ static int nu_bpwm_capture_device_init(void)
330331
}
331332
INIT_DEVICE_EXPORT(nu_bpwm_capture_device_init);
332333

334+
#endif //#if ((BSP_USING_BPWM0_CAPTURE_CHMSK+BSP_USING_BPWM1_CAPTURE_CHMSK)!=0)
333335
#endif //#if defined(BSP_USING_BPWM_CAPTURE)

bsp/nuvoton/libraries/m480/rtt_port/drv_can.c

Lines changed: 41 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -166,46 +166,44 @@ static void nu_can_isr(nu_can_t can)
166166
CAN_T *can_base = ((nu_can_t)can)->can_base;
167167

168168
/* Get interrupt event */
169-
u32IIDRstatus = can_base->IIDR;
169+
u32IIDRstatus = CAN_GET_INT_PENDING_STATUS(can_base);
170170

171171
if (u32IIDRstatus == 0x00008000) /* Check Status Interrupt Flag (Error status Int and Status change Int) */
172172
{
173173
/**************************/
174174
/* Status Change interrupt*/
175175
/**************************/
176-
if (can_base->STATUS & CAN_STATUS_RXOK_Msk)
176+
if (can_base->STATUS & CAN_STATUS_TXOK_Msk)
177177
{
178-
178+
can_base->STATUS &= ~CAN_STATUS_TXOK_Msk; /* Clear Tx Ok status*/
179179
#ifndef RT_CAN_USING_HDR
180180
/* Using as Lisen,Loopback,Loopback+Lisen mode*/
181-
rt_hw_can_isr(&can->dev, RT_CAN_EVENT_RX_IND);
181+
rt_hw_can_isr(&can->dev, RT_CAN_EVENT_TX_DONE);
182182
#endif
183-
can_base->STATUS &= ~CAN_STATUS_RXOK_Msk; /* Clear Rx Ok status*/
184-
rt_kprintf("RX OK INT\n") ;
183+
//rt_kprintf("[%s]TX OK INT\n", can->name) ;
185184
}
186185

187-
if (can_base->STATUS & CAN_STATUS_TXOK_Msk)
186+
if (can_base->STATUS & CAN_STATUS_RXOK_Msk)
188187
{
189-
188+
can_base->STATUS &= ~CAN_STATUS_RXOK_Msk; /* Clear Rx Ok status*/
190189
#ifndef RT_CAN_USING_HDR
191190
/* Using as Lisen,Loopback,Loopback+Lisen mode*/
192-
rt_hw_can_isr(&can->dev, RT_CAN_EVENT_TX_DONE);
191+
rt_hw_can_isr(&can->dev, RT_CAN_EVENT_RX_IND);
193192
#endif
194-
can_base->STATUS &= ~CAN_STATUS_TXOK_Msk; /* Clear Tx Ok status*/
195-
rt_kprintf("TX OK INT\n") ;
193+
//rt_kprintf("[%s]RX OK INT\n", can->name) ;
196194
}
197195

198196
/**************************/
199197
/* Error Status interrupt */
200198
/**************************/
201199
if (can_base->STATUS & CAN_STATUS_EWARN_Msk)
202200
{
203-
rt_kprintf("EWARN INT\n") ;
201+
rt_kprintf("[%s]EWARN INT\n", can->name) ;
204202
}
205203

206204
if (can_base->STATUS & CAN_STATUS_BOFF_Msk)
207205
{
208-
rt_kprintf("BOFF INT\n") ;
206+
rt_kprintf("[%s]BUSOFF INT\n", can->name) ;
209207

210208
/* Do Init to release busoff pin */
211209
can_base->CON = (CAN_CON_INIT_Msk | CAN_CON_CCE_Msk);
@@ -214,18 +212,21 @@ static void nu_can_isr(nu_can_t can)
214212
}
215213
}
216214
#ifdef RT_CAN_USING_HDR
217-
/*Number of Message Object which caused the interrupt*/
218-
else if (u32IIDRstatus != 0 && u32IIDRstatus <= 32)
215+
/*IntId: 0x0001-0x0020, Number of Message Object which caused the interrupt.*/
216+
else if (u32IIDRstatus > 0 && u32IIDRstatus <= 32)
219217
{
220-
rt_kprintf("=> Interrupt Pointer = %d\n", can_base->IIDR - 1);
221-
/*Message RAM 0~15 for CAN Tx using*/
222-
if (u32IIDRstatus < 16)
218+
/*Message RAM 0~RX_MSG_ID_INDEX for CAN Tx using*/
219+
if (u32IIDRstatus <= RX_MSG_ID_INDEX)
220+
{
221+
//rt_kprintf("[%s-Tx]IntId = %d\n", can->name, u32IIDRstatus);
223222
rt_hw_can_isr(&can->dev, RT_CAN_EVENT_TX_DONE);
224-
else /*Message RAM 16~31 for CAN Rx using*/
223+
}
224+
else /*Message RAM RX_MSG_ID_INDEX~31 for CAN Rx using*/
225225
{
226-
rt_hw_can_isr(&can->dev, (RT_CAN_EVENT_RX_IND | (((can_base->IIDR) - 1) << 8)));
226+
//rt_kprintf("[%s-Rx]IntId = %d\n", can->name, u32IIDRstatus);
227+
rt_hw_can_isr(&can->dev, (RT_CAN_EVENT_RX_IND | ((u32IIDRstatus - 1) << 8)));
227228
}
228-
CAN_CLR_INT_PENDING_BIT(can_base, ((can_base->IIDR) - 1)); /* Clear Interrupt Pending */
229+
CAN_CLR_INT_PENDING_BIT(can_base, (u32IIDRstatus - 1)); /* Clear Interrupt Pending */
229230
}
230231
#endif
231232

@@ -316,7 +317,7 @@ static rt_err_t nu_can_control(struct rt_can_device *can, int cmd, void *arg)
316317
CAN_T *can_base = ((nu_can_t)can)->can_base;
317318

318319
RT_ASSERT(can_base != RT_NULL);
319-
/* Check baudrate */
320+
/* Check baud rate */
320321
RT_ASSERT(can->config.baud_rate != 0);
321322

322323
switch (cmd)
@@ -359,8 +360,8 @@ static rt_err_t nu_can_control(struct rt_can_device *can, int cmd, void *arg)
359360
}
360361
break;
361362

362-
case RT_CAN_CMD_SET_FILTER:
363363
#ifdef RT_CAN_USING_HDR
364+
case RT_CAN_CMD_SET_FILTER:
364365
filter_cfg = (struct rt_can_filter_config *)arg;
365366

366367
for (int i = 0; i < filter_cfg->count; i++)
@@ -369,7 +370,7 @@ static rt_err_t nu_can_control(struct rt_can_device *can, int cmd, void *arg)
369370
/*set the filter message object*/
370371
if (filter_cfg->items[i].mode == 1)
371372
{
372-
if (CAN_SetRxMsgObjAndMsk(can_base, MSG(i + RX_MSG_ID_INDEX), filter_cfg->items[i].ide, filter_cfg->items[i].id, filter_cfg->items[i].mask, FALSE) == FALSE)
373+
if (CAN_SetRxMsgObjAndMsk(can_base, MSG(filter_cfg->items[i].hdr + RX_MSG_ID_INDEX), filter_cfg->items[i].ide, filter_cfg->items[i].id, filter_cfg->items[i].mask, FALSE) == FALSE)
373374
{
374375
return -(RT_ERROR);
375376
}
@@ -378,14 +379,15 @@ static rt_err_t nu_can_control(struct rt_can_device *can, int cmd, void *arg)
378379

379380
{
380381
/*set the filter message object*/
381-
if (CAN_SetRxMsgAndMsk(can_base, MSG(i + RX_MSG_ID_INDEX), filter_cfg->items[i].ide, filter_cfg->items[i].id, filter_cfg->items[i].mask) == FALSE)
382+
if (CAN_SetRxMsgAndMsk(can_base, MSG(filter_cfg->items[i].hdr + RX_MSG_ID_INDEX), filter_cfg->items[i].ide, filter_cfg->items[i].id, filter_cfg->items[i].mask) == FALSE)
382383
{
383384
return -(RT_ERROR);
384385
}
385386
}
386387
}
387-
#endif
388388
break;
389+
#endif
390+
389391
case RT_CAN_CMD_SET_MODE:
390392
argval = (rt_uint32_t) arg;
391393
if (argval != RT_CAN_MODE_NORMAL && argval != RT_CAN_MODE_LISEN &&
@@ -399,6 +401,7 @@ static rt_err_t nu_can_control(struct rt_can_device *can, int cmd, void *arg)
399401
return nu_can_configure(can, &can->config);
400402
}
401403
break;
404+
402405
case RT_CAN_CMD_SET_BAUD:
403406
argval = (rt_uint32_t) arg;
404407
if (argval != CAN1MBaud && argval != CAN800kBaud && argval != CAN500kBaud && argval != CAN250kBaud &&
@@ -412,6 +415,7 @@ static rt_err_t nu_can_control(struct rt_can_device *can, int cmd, void *arg)
412415
return nu_can_configure(can, &can->config);
413416
}
414417
break;
418+
415419
case RT_CAN_CMD_SET_PRIV:
416420
argval = (rt_uint32_t) arg;
417421
if (argval != RT_CAN_MODE_PRIV && argval != RT_CAN_MODE_NOPRIV)
@@ -439,7 +443,7 @@ static rt_err_t nu_can_control(struct rt_can_device *can, int cmd, void *arg)
439443
}
440444
break;
441445
default:
442-
return -(RT_EINVAL);
446+
return -(RT_EINVAL);
443447

444448
}
445449

@@ -503,11 +507,16 @@ static int nu_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxn
503507
RT_ASSERT(buf != RT_NULL);
504508

505509
/* get data */
506-
CAN_Receive(can_base, boxno, &tMsg);
510+
if (CAN_Receive(can_base, boxno, &tMsg) == FALSE)
511+
{
512+
rt_kprintf("No available RX Msg.\n");
513+
return -(RT_ERROR);
514+
}
507515

508516
#ifdef RT_CAN_USING_HDR
509517
/* Hardware filter messages are valid */
510-
can->hdr->connected = 1;
518+
pmsg->hdr = boxno - RX_MSG_ID_INDEX;
519+
can->hdr[pmsg->hdr].connected = 1;
511520
#endif
512521

513522
/* Standard ID (11 bits)*/
@@ -521,6 +530,7 @@ static int nu_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxn
521530
pmsg->ide = RT_CAN_EXTID;
522531
pmsg->id = tMsg.Id;
523532
}
533+
524534
if (tMsg.FrameType == CAN_DATA_FRAME)
525535
{
526536
/* Data frame */
@@ -531,9 +541,10 @@ static int nu_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxn
531541
/* Remote frame */
532542
pmsg->rtr = RT_CAN_RTR;
533543
}
544+
534545
pmsg->len = tMsg.DLC ;
535-
rt_memcpy(pmsg->data, tMsg.Data, pmsg->len);
536546

547+
rt_memcpy(pmsg->data, tMsg.Data, pmsg->len);
537548

538549
return RT_EOK;
539550
}

bsp/nuvoton/libraries/m480/rtt_port/drv_clk.c

Lines changed: 20 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -89,64 +89,44 @@ static struct rt_pm_ops ops =
8989

9090
struct rt_device pm;
9191

92-
92+
/* Sleep and power-down mapping */
93+
const static uint32_t g_au32SleepingMode[PM_SLEEP_MODE_MAX] =
94+
{
95+
0,
96+
0,
97+
CONFIG_MODE_LIGHT,
98+
CONFIG_MODE_DEEP,
99+
CONFIG_MODE_STANDBY,
100+
CONFIG_MODE_SHUTDOWN
101+
};
93102

94103
/* pm sleep() entry */
95104
static void pm_sleep(struct rt_pm *pm, rt_uint8_t mode)
96105
{
97-
SYS_UnlockReg();
106+
RT_ASSERT(mode < PM_SLEEP_MODE_MAX);
107+
108+
if ((mode == PM_SLEEP_MODE_NONE) || (mode == PM_SLEEP_MODE_IDLE))
109+
return;
98110

99-
switch (mode)
100-
{
101111
/* wake-up source: */
102112
/* PM_SLEEP_MODE_LIGHT : TIMERn */
103113
/* PM_SLEEP_MODE_DEEP : TIMERn */
104114
/* PM_SLEEP_MODE_STANDBY : wake-up timer (optional) */
105115
/* PM_SLEEP_MODE_SHUTDOWN : wake-up timer (optional) */
106116

107-
case PM_SLEEP_MODE_NONE:
108-
case PM_SLEEP_MODE_IDLE:
109-
break;
110-
111-
case PM_SLEEP_MODE_LIGHT:
112-
113-
CLK_SetPowerDownMode(CONFIG_MODE_LIGHT);
114-
CLK_PowerDown();
115-
break;
116-
117-
case PM_SLEEP_MODE_DEEP:
118-
119-
CLK_SetPowerDownMode(CONFIG_MODE_DEEP);
120-
CLK_PowerDown();
121-
break;
122-
123-
case PM_SLEEP_MODE_STANDBY:
124-
125-
#if defined (NU_CLK_INVOKE_WKTMR)
126-
127-
/* Enable wake-up timer with pre-defined interval if it is invoked */
128-
CLK_SET_WKTMR_INTERVAL(WKTMR_INTERVAL);
129-
CLK_ENABLE_WKTMR();
130-
#endif
131-
CLK_SetPowerDownMode(CONFIG_MODE_STANDBY);
132-
CLK_PowerDown();
133-
break;
134-
135-
case PM_SLEEP_MODE_SHUTDOWN:
117+
SYS_UnlockReg();
136118

137119
#if defined (NU_CLK_INVOKE_WKTMR)
120+
if ((mode == PM_SLEEP_MODE_SHUTDOWN) || (mode == PM_SLEEP_MODE_STANDBY))
121+
{
138122
/* Enable wake-up timer with pre-defined interval if it is invoked */
139123
CLK_SET_WKTMR_INTERVAL(WKTMR_INTERVAL);
140124
CLK_ENABLE_WKTMR();
125+
}
141126
#endif
142-
CLK_SetPowerDownMode(CONFIG_MODE_SHUTDOWN);
143-
CLK_PowerDown();
144-
break;
145127

146-
default:
147-
RT_ASSERT(0);
148-
break;
149-
}
128+
CLK_SetPowerDownMode(g_au32SleepingMode[mode]);
129+
CLK_PowerDown();
150130

151131
SYS_LockReg();
152132
}

0 commit comments

Comments
 (0)