#include "hdl_usb.h"

static void USB_IRQ_Handler(void)
{
	extern void USBD_IRQHandler(uint8_t busid);

    USBD_IRQHandler(0);
}

void hdl_usb_init(void)
{
	stc_clock_pllx_init_t stcUpllInit;
	stc_gpio_init_t stcGpioCfg;
	stc_irq_signin_config_t stcIrqRegiConf;
	
	LL_PERIPH_WE(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_GPIO | LL_PERIPH_PWC_CLK_RMU | LL_PERIPH_SRAM);
	
	/* 时钟配置 */
	(void)CLK_PLLxStructInit(&stcUpllInit);
    stcUpllInit.u8PLLState = CLK_PLLX_ON;
    stcUpllInit.PLLCFGR = 0UL;
    stcUpllInit.PLLCFGR_f.PLLM = (4UL  - 1UL);
    stcUpllInit.PLLCFGR_f.PLLN = (84UL - 1UL);
    stcUpllInit.PLLCFGR_f.PLLR = (7UL  - 1UL);
    stcUpllInit.PLLCFGR_f.PLLQ = (7UL - 1UL);
    stcUpllInit.PLLCFGR_f.PLLP = (7UL - 1UL); //48M
    (void)CLK_PLLxInit(&stcUpllInit);
	CLK_SetUSBClockSrc(CLK_USBCLK_PLLXP);
	
	/* 引脚配置 */
	(void)GPIO_StructInit(&stcGpioCfg);
	
	stcGpioCfg.u16PinAttr = PIN_ATTR_ANALOG;
    (void)GPIO_Init(USB_DM_PORT, USB_DM_PIN, &stcGpioCfg);
    (void)GPIO_Init(USB_DP_PORT, USB_DP_PIN, &stcGpioCfg);
//	GPIO_SetFunc(USB_DM_PORT, USB_DM_PIN, GPIO_FUNC_10);
//	GPIO_SetFunc(USB_DP_PORT, USB_DP_PIN, GPIO_FUNC_10);
//    GPIO_SetFunc(USB_VBUS_PORT, USB_VBUS_PIN, GPIO_FUNC_10); /* VBUS */
    FCG_Fcg1PeriphClockCmd(FCG1_PERIPH_USBFS, ENABLE);
	
	/* 中断配置 */
    stcIrqRegiConf.enIRQn = INT030_IRQn;
    stcIrqRegiConf.enIntSrc = INT_SRC_USBFS_GLB;
    stcIrqRegiConf.pfnCallback = &USB_IRQ_Handler;	// 添加中断函数
    (void)INTC_IrqSignIn(&stcIrqRegiConf);
    NVIC_ClearPendingIRQ(stcIrqRegiConf.enIRQn);
    NVIC_SetPriority(stcIrqRegiConf.enIRQn, DDL_IRQ_PRIO_15);
    NVIC_EnableIRQ(stcIrqRegiConf.enIRQn);
	
	LL_PERIPH_WP(LL_PERIPH_EFM | LL_PERIPH_FCG | LL_PERIPH_SRAM);
}
