From ee0153372dfed2e37b953610230ca7bc95f3d6cc Mon Sep 17 00:00:00 2001 From: XIVN1987 Date: Sat, 8 Jan 2022 11:22:38 +0800 Subject: [PATCH] code optimizing --- DAPLink.uvoptx | 89 +---- DAPLink.uvprojx | 66 ---- out/DAPLink.bin | Bin 14780 -> 0 bytes out/DAPLink.hex | 927 --------------------------------------------- src/descriptors.c | 32 +- src/hid_transfer.c | 185 ++++----- src/hid_transfer.h | 45 +-- src/main.c | 67 ++-- src/vcom_serial.c | 158 ++++---- src/vcom_serial.h | 50 +-- 10 files changed, 243 insertions(+), 1376 deletions(-) delete mode 100644 out/DAPLink.bin delete mode 100644 out/DAPLink.hex diff --git a/DAPLink.uvoptx b/DAPLink.uvoptx index f8a3acf..9685e72 100644 --- a/DAPLink.uvoptx +++ b/DAPLink.uvoptx @@ -120,7 +120,7 @@ 0 DLGUARM - d + 0 @@ -135,7 +135,7 @@ 0 JL2CM3 - -U59509350 -O206 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC2000 -FN1 -FF0M481_AP_512.FLM -FS00 -FL080000 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM) + -U59607536 -O206 -S4 -ZTIFSpeedSel2000 -A0 -C0 -JU1 -JI127.0.0.1 -JP0 -RST0 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -TB1 -TFE0 -FO15 -FD20000000 -FC2000 -FN1 -FF0M481_AP_512.FLM -FS00 -FL080000 -FP0($$Device:M482ZIDAE$Flash\M481_AP_512.FLM) 0 @@ -153,40 +153,7 @@ - - - 0 - 0 - 249 - 1 -
2812
- 0 - 0 - 0 - 0 - 0 - 1 - D:\寰帶鍒跺櫒\DAPLink\src\DAP_config.h - - \\DAPLink\src/DAP/DAP.c\249 -
- - 1 - 0 - 1481 - 1 -
4930
- 0 - 0 - 0 - 0 - 0 - 1 - D:\寰帶鍒跺櫒\DAPLink\src\DAP\DAP.c - - \\DAPLink\src/DAP/DAP.c\1481 -
-
+ 0 @@ -246,7 +213,7 @@ APP - 0 + 1 0 0 0 @@ -413,18 +380,6 @@ 0 0 0 - .\src\CSL\NUCM480_StdPeriph_Driver\i2c.c - i2c.c - 0 - 0 - - - 4 - 13 - 1 - 0 - 0 - 0 .\src\CSL\NUCM480_StdPeriph_Driver\pdma.c pdma.c 0 @@ -432,31 +387,7 @@ 4 - 14 - 1 - 0 - 0 - 0 - .\src\CSL\NUCM480_StdPeriph_Driver\retarget.c - retarget.c - 0 - 0 - - - 4 - 15 - 1 - 0 - 0 - 0 - .\src\CSL\NUCM480_StdPeriph_Driver\spi.c - spi.c - 0 - 0 - - - 4 - 16 + 13 1 0 0 @@ -468,7 +399,7 @@ 4 - 17 + 14 1 0 0 @@ -480,7 +411,7 @@ 4 - 18 + 15 1 0 0 @@ -492,7 +423,7 @@ 4 - 19 + 16 1 0 0 @@ -512,7 +443,7 @@ 0 5 - 20 + 17 1 0 0 @@ -524,7 +455,7 @@ 5 - 21 + 18 2 0 0 diff --git a/DAPLink.uvprojx b/DAPLink.uvprojx index 63ac65c..524976c 100644 --- a/DAPLink.uvprojx +++ b/DAPLink.uvprojx @@ -453,77 +453,11 @@ 1 .\src\CSL\NUCM480_StdPeriph_Driver\gpio.c - - i2c.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\i2c.c - pdma.c 1 .\src\CSL\NUCM480_StdPeriph_Driver\pdma.c - - retarget.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\retarget.c - - - 2 - 0 - 0 - 0 - 0 - 0 - 2 - 2 - 2 - 2 - 11 - - - 1 - - - - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 2 - 0 - 2 - 2 - 2 - 2 - 2 - 0 - 0 - 2 - 2 - 2 - 2 - 2 - - - - - - - - - - - - spi.c - 1 - .\src\CSL\NUCM480_StdPeriph_Driver\spi.c - sys.c 1 diff --git a/out/DAPLink.bin b/out/DAPLink.bin deleted file mode 100644 index 799ab47827777ad841c380c00e83e8a8671a45cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14780 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 8, // wTotalLength - 0x03, // bNumInterfaces + 0x03, // bNumInterfaces 0x01, // bConfigurationValue 0x00, // iConfiguration 0x00, // bmAttributes, D6: self power D5: remote wake-up @@ -174,7 +174,7 @@ uint8_t gu8ConfigDescriptor[] = }; -uint8_t gu8StringLang[4] = +uint8_t gu8StringLang[] = { 4, DESC_STRING, @@ -195,7 +195,7 @@ uint8_t gu8ProductStringDesc[] = 'M', 0, '4', 0, '8', 0, '0', 0, ' ', 0, 'C', 0, 'M', 0, 'S', 0, 'I', 0, 'S', 0, '-', 0, 'D', 0, 'A', 0, 'P', 0 }; -uint8_t *gpu8UsbString[4] = +uint8_t *gpu8UsbString[] = { gu8StringLang, gu8VendorStringDesc, @@ -204,26 +204,22 @@ uint8_t *gpu8UsbString[4] = }; -uint8_t *gu8UsbHidReport[3] = +uint8_t *gu8UsbHidReport[] = { HID_DeviceReportDescriptor, NULL, - NULL, }; -uint32_t gu32UsbHidReportLen[3] = +uint32_t gu32UsbHidReportLen[] = { sizeof(HID_DeviceReportDescriptor), 0, - 0, }; - -uint32_t gu32ConfigHidDescIdx[3] = +uint32_t gu32ConfigHidDescIdx[] = { (LEN_CONFIG + LEN_INTERFACE), 0, - 0, }; @@ -231,14 +227,14 @@ uint8_t gu8BOSDescriptor[] = { LEN_BOS, DESC_BOS, - 0x0C & 0x00FF, ((0x0C & 0xFF00) >> 8), // wTotalLength - 0x01, // bNumDeviceCaps + 0x0C, // wTotalLength + 0x01, // bNumDeviceCaps /* Device Capability */ - LEN_BOSCAP, // bLength - DESC_CAPABILITY, // bDescriptorType - CAP_USB20_EXT, // bDevCapabilityType - 0x02, 0x00, 0x00, 0x00 // bmAttributes + LEN_BOSCAP, // bLength + DESC_CAPABILITY, // bDescriptorType + CAP_USB20_EXT, // bDevCapabilityType + 0x02, 0x00, 0x00, 0x00 // bmAttributes }; diff --git a/src/hid_transfer.c b/src/hid_transfer.c index a048988..4e21b24 100644 --- a/src/hid_transfer.c +++ b/src/hid_transfer.c @@ -1,68 +1,111 @@ -#include -#include #include "NuMicro.h" #include "vcom_serial.h" #include "hid_transfer.h" +void HID_Init(void) +{ + /* Init setup packet buffer */ + USBD->STBUFSEG = SETUP_BUF_BASE; + + /*****************************************************/ + /* EP0 ==> control IN endpoint, address 0 */ + USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0); + USBD_SET_EP_BUF_ADDR(EP0, EP0_BUF_BASE); + + /* EP1 ==> control OUT endpoint, address 0 */ + USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0); + USBD_SET_EP_BUF_ADDR(EP1, EP1_BUF_BASE); + + /*****************************************************/ + /* EP2 ==> Interrupt IN endpoint, address 1 */ + USBD_CONFIG_EP(EP2, USBD_CFG_EPMODE_IN | HID_INT_IN_EP); + USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE); + + /* EP3 ==> Interrupt OUT endpoint, address 1 */ + USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_OUT | HID_INT_OUT_EP); + USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE); + /* trigger to receive OUT data */ + USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); + + /*****************************************************/ + /* EP4 ==> Interrupt IN endpoint, address 2 */ + USBD_CONFIG_EP(EP4, USBD_CFG_EPMODE_IN | CDC_INT_IN_EP); + USBD_SET_EP_BUF_ADDR(EP4, EP4_BUF_BASE); + + /* EP5 ==> Bulk IN endpoint, address 3 */ + USBD_CONFIG_EP(EP5, USBD_CFG_EPMODE_IN | CDC_BULK_IN_EP); + USBD_SET_EP_BUF_ADDR(EP5, EP5_BUF_BASE); + + /* EP6 ==> Bulk Out endpoint, address 3 */ + USBD_CONFIG_EP(EP6, USBD_CFG_EPMODE_OUT | CDC_BULK_OUT_EP); + USBD_SET_EP_BUF_ADDR(EP6, EP6_BUF_BASE); + /* trigger receive OUT data */ + USBD_SET_PAYLOAD_LEN(EP6, EP6_MAX_PKT_SIZE); +} + + +void EP2_Handler(void) // Interrupt IN +{ + HID_SetInReport(); +} + +void EP3_Handler(void) // Interrupt OUT +{ + uint8_t *ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP3)); + + HID_GetOutReport(ptr, USBD_GET_PAYLOAD_LEN(EP3)); + + USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); +} + void USBD_IRQHandler(void) { uint32_t u32IntSts = USBD_GET_INT_FLAG(); uint32_t u32State = USBD_GET_BUS_STATE(); -//------------------------------------------------------------------ - if(u32IntSts & USBD_INTSTS_FLDET) + if(u32IntSts & USBD_INTSTS_FLDET) // Floating detect { - // Floating detect USBD_CLR_INT_FLAG(USBD_INTSTS_FLDET); - if(USBD_IS_ATTACHED()) + if(USBD_IS_ATTACHED()) // USB Plug In { - /* USB Plug In */ USBD_ENABLE_USB(); } - else + else // USB Un-plug { - /* USB Un-plug */ USBD_DISABLE_USB(); } } - -//------------------------------------------------------------------ + if(u32IntSts & USBD_INTSTS_BUS) { USBD_CLR_INT_FLAG(USBD_INTSTS_BUS); - if(u32State & USBD_STATE_USBRST) + if(u32State & USBD_STATE_USBRST) // Bus reset { - /* Bus reset */ USBD_ENABLE_USB(); USBD_SwReset(); } - if(u32State & USBD_STATE_SUSPEND) + if(u32State & USBD_STATE_SUSPEND) // Suspend { - /* Enable USB but disable PHY */ USBD_DISABLE_PHY(); } - if(u32State & USBD_STATE_RESUME) + if(u32State & USBD_STATE_RESUME) // Resume { - /* Enable USB and enable PHY */ USBD_ENABLE_USB(); } } - -//------------------------------------------------------------------ - if(u32IntSts & USBD_INTSTS_WAKEUP) + + if(u32IntSts & USBD_INTSTS_WAKEUP) // Wakeup { USBD_CLR_INT_FLAG(USBD_INTSTS_WAKEUP); } - -//------------------------------------------------------------------ + if(u32IntSts & USBD_INTSTS_USB) { if(u32IntSts & USBD_INTSTS_SETUP) { - // Setup packet USBD_CLR_INT_FLAG(USBD_INTSTS_SETUP); /* Clear the data IN/OUT ready flag of control end-points */ @@ -72,14 +115,14 @@ void USBD_IRQHandler(void) USBD_ProcessSetupPacket(); } - if(u32IntSts & USBD_INTSTS_EP0) // control IN + if(u32IntSts & USBD_INTSTS_EP0) // Control IN { USBD_CLR_INT_FLAG(USBD_INTSTS_EP0); USBD_CtrlIn(); } - if(u32IntSts & USBD_INTSTS_EP1) // control OUT + if(u32IntSts & USBD_INTSTS_EP1) // Control OUT { USBD_CLR_INT_FLAG(USBD_INTSTS_EP1); @@ -89,8 +132,7 @@ void USBD_IRQHandler(void) extern uint8_t g_usbd_SetupPacket[]; if(g_usbd_SetupPacket[1] == SET_LINE_CODE) { - if(g_usbd_SetupPacket[4] == 1) // Interface number - VCOM_LineCoding(); + VCOM_LineCoding(); } } @@ -130,55 +172,6 @@ void USBD_IRQHandler(void) } -void EP2_Handler(void) // Interrupt IN handler -{ - HID_SetInReport(); -} - - -void EP3_Handler(void) // Interrupt OUT handler -{ - uint8_t *ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP3)); - - HID_GetOutReport(ptr, USBD_GET_PAYLOAD_LEN(EP3)); - - USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); -} - - -void HID_Init(void) -{ - /* Init setup packet buffer */ - /* Buffer range for setup packet -> [0 ~ 0x7] */ - USBD->STBUFSEG = SETUP_BUF_BASE; - - /*****************************************************/ - /* EP0 ==> control IN endpoint, address 0 */ - USBD_CONFIG_EP(EP0, USBD_CFG_CSTALL | USBD_CFG_EPMODE_IN | 0); - /* Buffer range for EP0 */ - USBD_SET_EP_BUF_ADDR(EP0, EP0_BUF_BASE); - - /* EP1 ==> control OUT endpoint, address 0 */ - USBD_CONFIG_EP(EP1, USBD_CFG_CSTALL | USBD_CFG_EPMODE_OUT | 0); - /* Buffer range for EP1 */ - USBD_SET_EP_BUF_ADDR(EP1, EP1_BUF_BASE); - - /*****************************************************/ - /* EP2 ==> Interrupt IN endpoint, address 1 */ - USBD_CONFIG_EP(EP2, USBD_CFG_EPMODE_IN | HID_INT_IN_EP); - /* Buffer range for EP2 */ - USBD_SET_EP_BUF_ADDR(EP2, EP2_BUF_BASE); - - /* EP3 ==> Interrupt OUT endpoint, address 1 */ - USBD_CONFIG_EP(EP3, USBD_CFG_EPMODE_OUT | HID_INT_OUT_EP); - /* Buffer range for EP3 */ - USBD_SET_EP_BUF_ADDR(EP3, EP3_BUF_BASE); - /* trigger to receive OUT data */ - USBD_SET_PAYLOAD_LEN(EP3, EP3_MAX_PKT_SIZE); - -} - - void HID_ClassRequest(void) { uint8_t buf[8]; @@ -192,17 +185,11 @@ void HID_ClassRequest(void) case GET_REPORT: case GET_IDLE: case GET_PROTOCOL: - /* Setup error, stall the device */ USBD_SetStall(0); break; case GET_LINE_CODE: - if(buf[4] == 1) - { - USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)), (uint8_t *)&LineCfg, 7); - } - - /* Data stage */ + USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP0)), (uint8_t *)&LineCfg, 7); USBD_SET_DATA1(EP0); USBD_SET_PAYLOAD_LEN(EP0, 7); @@ -236,25 +223,20 @@ void HID_ClassRequest(void) break; case SET_PROTOCOL: - /* Setup error, stall the device */ USBD_SetStall(0); break; - case SET_CONTROL_LINE_STATE: - if(buf[4] == 1) - { - vcom.hw_flow = (buf[3] << 8) | buf[2]; - } - + case SET_LINE_CODE: + USBD_PrepareCtrlOut((uint8_t *)&LineCfg, 7); + /* Status stage */ USBD_SET_DATA1(EP0); USBD_SET_PAYLOAD_LEN(EP0, 0); break; - - case SET_LINE_CODE: - if(buf[4] == 1) - USBD_PrepareCtrlOut((uint8_t *)&LineCfg, 7); - + + case SET_CONTROL_LINE: + Vcom.hw_flow = (buf[3] << 8) | buf[2]; + /* Status stage */ USBD_SET_DATA1(EP0); USBD_SET_PAYLOAD_LEN(EP0, 0); @@ -290,7 +272,6 @@ uint8_t usbd_hid_process(void) { uint32_t n; - // Process pending requests if((USB_RequestOut != USB_RequestIn) || USB_RequestFlag) { DAP_ProcessCommand(USB_Request[USB_RequestOut], USB_Response[USB_ResponseIn]); @@ -305,24 +286,26 @@ uint8_t usbd_hid_process(void) USB_RequestFlag = 0; if(USB_ResponseIdle) - { // Request that data is send back to host + { USB_ResponseIdle = 0; USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP2)), USB_Response[USB_ResponseIn], DAP_PACKET_SIZE); USBD_SET_PAYLOAD_LEN(EP2, DAP_PACKET_SIZE); } else - { // Update response index and flag + { n = USB_ResponseIn + 1; - if (n == DAP_PACKET_COUNT) + if(n == DAP_PACKET_COUNT) n = 0; USB_ResponseIn = n; - if (USB_ResponseIn == USB_ResponseOut) + if(USB_ResponseIn == USB_ResponseOut) USB_ResponseFlag = 1; } + return 1; } + return 0; } @@ -339,7 +322,7 @@ void HID_GetOutReport(uint8_t *EpBuf, uint32_t len) return; // Discard packet when buffer is full // Store data into request packet buffer - memcpy(USB_Request[USB_RequestIn], EpBuf, len); + USBD_MemCopy(USB_Request[USB_RequestIn], EpBuf, len); USB_RequestIn++; if(USB_RequestIn == DAP_PACKET_COUNT) diff --git a/src/hid_transfer.h b/src/hid_transfer.h index d8c7708..e51d468 100644 --- a/src/hid_transfer.h +++ b/src/hid_transfer.h @@ -1,5 +1,5 @@ -#ifndef __USBD_HID_H__ -#define __USBD_HID_H__ +#ifndef __HID_TRANSFER_H__ +#define __HID_TRANSFER_H__ #define USBD_VID 0x0416 @@ -9,6 +9,9 @@ /* Define the EP number */ #define HID_INT_IN_EP 1 #define HID_INT_OUT_EP 1 +#define CDC_INT_IN_EP 2 +#define CDC_BULK_IN_EP 3 +#define CDC_BULK_OUT_EP 3 /* Define EP maximum packet size */ @@ -16,40 +19,38 @@ #define EP1_MAX_PKT_SIZE EP0_MAX_PKT_SIZE #define EP2_MAX_PKT_SIZE 64 #define EP3_MAX_PKT_SIZE 64 +#define EP4_MAX_PKT_SIZE 8 +#define EP5_MAX_PKT_SIZE 64 +#define EP6_MAX_PKT_SIZE 64 #define SETUP_BUF_BASE 0 -#define SETUP_BUF_LEN 8 -#define EP0_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN) -#define EP0_BUF_LEN EP0_MAX_PKT_SIZE -#define EP1_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_LEN) -#define EP1_BUF_LEN EP1_MAX_PKT_SIZE -#define EP2_BUF_BASE (EP1_BUF_BASE + EP1_BUF_LEN) -#define EP2_BUF_LEN EP2_MAX_PKT_SIZE -#define EP3_BUF_BASE (EP2_BUF_BASE + EP2_BUF_LEN) -#define EP3_BUF_LEN EP3_MAX_PKT_SIZE - +#define SETUP_BUF_SIZE 8 +#define EP0_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_SIZE) +#define EP1_BUF_BASE (SETUP_BUF_BASE + SETUP_BUF_SIZE) +#define EP2_BUF_BASE (EP1_BUF_BASE + EP1_MAX_PKT_SIZE) +#define EP3_BUF_BASE (EP2_BUF_BASE + EP2_MAX_PKT_SIZE) +#define EP4_BUF_BASE (EP3_BUF_BASE + EP3_MAX_PKT_SIZE) +#define EP5_BUF_BASE (EP4_BUF_BASE + EP4_MAX_PKT_SIZE) +#define EP6_BUF_BASE (EP5_BUF_BASE + EP5_MAX_PKT_SIZE) /* HID Class Specific Request */ -#define GET_REPORT 0x01 -#define GET_IDLE 0x02 -#define GET_PROTOCOL 0x03 -#define SET_REPORT 0x09 -#define SET_IDLE 0x0A -#define SET_PROTOCOL 0x0B +#define GET_REPORT 0x01 +#define GET_IDLE 0x02 +#define GET_PROTOCOL 0x03 +#define SET_REPORT 0x09 +#define SET_IDLE 0x0A +#define SET_PROTOCOL 0x0B void HID_Init(void); void HID_ClassRequest(void); +uint8_t usbd_hid_process(void); -void EP2_Handler(void); -void EP3_Handler(void); void HID_SetInReport(void); void HID_GetOutReport(uint8_t *pu8EpBuf, uint32_t u32Size); -uint8_t usbd_hid_process(void); - #endif diff --git a/src/main.c b/src/main.c index 8f026d6..bb993e5 100644 --- a/src/main.c +++ b/src/main.c @@ -1,4 +1,3 @@ -#include #include "NuMicro.h" #include "vcom_serial.h" #include "hid_transfer.h" @@ -7,15 +6,12 @@ void systemInit(void); -void SerialInit(void); void USB_Config(void); int main(void) -{ +{ systemInit(); - SerialInit(); - DAP_Setup(); USB_Config(); @@ -35,34 +31,6 @@ int main(void) } -void USB_Config(void) -{ - SYS_UnlockReg(); - - SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA14MFP_Msk); - SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA12MFP_USB_VBUS | SYS_GPA_MFPH_PA13MFP_USB_D_N | SYS_GPA_MFPH_PA14MFP_USB_D_P); - - SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk; - - CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_USBDIV_Msk) | CLK_CLKDIV0_USB(4); - - CLK_EnableModuleClock(USBD_MODULE); - - SYS_LockReg(); - - - USBD_Open(&gsInfo, HID_ClassRequest, NULL); - - HID_Init(); // Endpoint configuration - - VCOM_Init(); // Endpoint configuration - - USBD_Start(); - - NVIC_EnableIRQ(USBD_IRQn); -} - - void systemInit(void) { SYS_UnlockReg(); @@ -74,7 +42,6 @@ void systemInit(void) CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); // ȴHXTȶ CLK_SetCoreClock(192000000); // PLLָƵΪϵͳʱ - // HXTʹܣPLLʱԴѡHXTʵ޸__HXTֵ CLK->PCLKDIV = (CLK_PCLKDIV_PCLK0DIV2 | CLK_PCLKDIV_PCLK1DIV2); @@ -86,17 +53,29 @@ void systemInit(void) } -void SerialInit(void) -{ - GPIO_SetPullCtl(PB, BIT0, GPIO_PUSEL_PULL_UP); - SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB0MFP_Msk | SYS_GPB_MFPL_PB1MFP_Msk); - SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB0MFP_UART2_RXD | SYS_GPB_MFPL_PB1MFP_UART2_TXD); +void USB_Config(void) +{ + SYS_UnlockReg(); + + SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA14MFP_Msk); + SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA12MFP_USB_VBUS | SYS_GPA_MFPH_PA13MFP_USB_D_N | SYS_GPA_MFPH_PA14MFP_USB_D_P); + + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk; + + CLK->CLKDIV0 = (CLK->CLKDIV0 & ~CLK_CLKDIV0_USBDIV_Msk) | CLK_CLKDIV0_USB(4); + + CLK_EnableModuleClock(USBD_MODULE); + + SYS_LockReg(); - CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL3_UART2SEL_HXT, CLK_CLKDIV4_UART2(1)); - CLK_EnableModuleClock(UART2_MODULE); - UART_Open(UART2, 115200); - UART_ENABLE_INT(UART2, (UART_INTEN_RDAIEN_Msk | UART_INTEN_THREIEN_Msk | UART_INTEN_RXTOIEN_Msk)); + USBD_Open(&gsInfo, HID_ClassRequest, NULL); + + HID_Init(); + + VCOM_Init(); + + USBD_Start(); - NVIC_EnableIRQ(UART2_IRQn); + NVIC_EnableIRQ(USBD_IRQn); } diff --git a/src/vcom_serial.c b/src/vcom_serial.c index 174577e..1cd7cf1 100644 --- a/src/vcom_serial.c +++ b/src/vcom_serial.c @@ -1,61 +1,45 @@ -#include #include "NuMicro.h" #include "vcom_serial.h" +#include "hid_transfer.h" +void VCOM_Init(void) +{ + GPIO_SetPullCtl(PB, BIT0, GPIO_PUSEL_PULL_UP); + SYS->GPB_MFPL &= ~(SYS_GPB_MFPL_PB0MFP_Msk | SYS_GPB_MFPL_PB1MFP_Msk); + SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB0MFP_UART2_RXD | SYS_GPB_MFPL_PB1MFP_UART2_TXD); + + CLK_SetModuleClock(UART2_MODULE, CLK_CLKSEL3_UART2SEL_HXT, CLK_CLKDIV4_UART2(1)); + CLK_EnableModuleClock(UART2_MODULE); + + UART_Open(UART2, 115200); + UART_ENABLE_INT(UART2, (UART_INTEN_RDAIEN_Msk | UART_INTEN_THREIEN_Msk | UART_INTEN_RXTOIEN_Msk)); + + NVIC_EnableIRQ(UART2_IRQn); +} + + +volatile VCOM Vcom; + void EP5_Handler(void) // Bulk IN { - vcom.in_bytes = 0; + Vcom.in_bytes = 0; } void EP6_Handler(void) // Bulk OUT { - vcom.out_bytes = USBD_GET_PAYLOAD_LEN(EP6); - vcom.out_ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP6)); + Vcom.out_bytes = USBD_GET_PAYLOAD_LEN(EP6); + Vcom.out_ptr = (uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP6)); - vcom.out_ready = 1; + Vcom.out_ready = 1; } -void VCOM_Init(void) -{ - /*****************************************************/ - /* EP4 ==> Interrupt IN endpoint, address 3 */ - USBD_CONFIG_EP(EP4, USBD_CFG_EPMODE_IN | CDC_INT_IN_EP); - /* Buffer offset for EP4 -> */ - USBD_SET_EP_BUF_ADDR(EP4, EP4_BUF_BASE); - - /* EP5 ==> Bulk IN endpoint, address 4 */ - USBD_CONFIG_EP(EP5, USBD_CFG_EPMODE_IN | CDC_BULK_IN_EP); - /* Buffer offset for EP5 */ - USBD_SET_EP_BUF_ADDR(EP5, EP5_BUF_BASE); - - /* EP6 ==> Bulk Out endpoint, address 5 */ - USBD_CONFIG_EP(EP6, USBD_CFG_EPMODE_OUT | CDC_BULK_OUT_EP); - /* Buffer offset for EP6 */ - USBD_SET_EP_BUF_ADDR(EP6, EP6_BUF_BASE); - /* trigger receive OUT data */ - USBD_SET_PAYLOAD_LEN(EP6, EP6_MAX_PKT_SIZE); -} - +VCOM_LINE_CODING LineCfg = {115200, 0, 0, 8}; // Baud rate, stop bits, parity bits, data bits void VCOM_LineCoding(void) { uint32_t data_len, parity, stop_len; - - NVIC_DisableIRQ(UART2_IRQn); - - // Reset software FIFO - vcom.rx_bytes = 0; - vcom.rx_head = 0; - vcom.rx_tail = 0; - - vcom.tx_bytes = 0; - vcom.tx_head = 0; - vcom.tx_tail = 0; - - // Reset hardware FIFO - UART2->FIFO = 0x3; switch(LineCfg.u8DataBits) { @@ -84,18 +68,26 @@ void VCOM_LineCoding(void) default: stop_len = UART_STOP_BIT_1; break; } - UART_SetLineConfig(UART2, LineCfg.u32DTERate, data_len, parity, stop_len); + NVIC_DisableIRQ(UART2_IRQn); + + // Reset software FIFO + Vcom.rx_bytes = 0; + Vcom.rx_head = 0; + Vcom.rx_tail = 0; + + Vcom.tx_bytes = 0; + Vcom.tx_head = 0; + Vcom.tx_tail = 0; + // Reset hardware FIFO + UART2->FIFO = 0x3; + + UART_SetLineConfig(UART2, LineCfg.u32DTERate, data_len, parity, stop_len); + NVIC_EnableIRQ(UART2_IRQn); } -STR_VCOM_LINE_CODING LineCfg = {115200, 0, 0, 8}; // Baud rate : 115200, stop bits, parity bits, data bits - - -volatile VCOM vcom; - - void UART2_IRQHandler(void) { uint8_t chr; @@ -107,22 +99,22 @@ void UART2_IRQHandler(void) { chr = UART2->DAT; - if(vcom.rx_bytes < RX_BUFF_SIZE) // Check if buffer full + if(Vcom.rx_bytes < RX_BUFF_SIZE) // Check if buffer full { - vcom.rx_buff[vcom.rx_tail++] = chr; - if(vcom.rx_tail >= RX_BUFF_SIZE) - vcom.rx_tail = 0; - vcom.rx_bytes++; + Vcom.rx_buff[Vcom.rx_tail++] = chr; + if(Vcom.rx_tail >= RX_BUFF_SIZE) + Vcom.rx_tail = 0; + Vcom.rx_bytes++; } } } if(UART2->INTSTS & UART_INTSTS_THREIF_Msk) { - if(vcom.tx_bytes) + if(Vcom.tx_bytes) { /* Fill the Tx FIFO */ - size = vcom.tx_bytes; + size = Vcom.tx_bytes; if(size >= TX_FIFO_SIZE) { size = TX_FIFO_SIZE; @@ -130,10 +122,10 @@ void UART2_IRQHandler(void) while(size) { - UART2->DAT = vcom.tx_buff[vcom.tx_head++]; - if(vcom.tx_head >= TX_BUFF_SIZE) - vcom.tx_head = 0; - vcom.tx_bytes--; + UART2->DAT = Vcom.tx_buff[Vcom.tx_head++]; + if(Vcom.tx_head >= TX_BUFF_SIZE) + Vcom.tx_head = 0; + Vcom.tx_bytes--; size--; } } @@ -151,33 +143,33 @@ void VCOM_TransferData(void) int32_t i, len; /* Check whether USB is ready for next packet or not */ - if(vcom.in_bytes == 0) + if(Vcom.in_bytes == 0) { /* Check whether we have new COM Rx data to send to USB or not */ - if(vcom.rx_bytes) + if(Vcom.rx_bytes) { - len = vcom.rx_bytes; + len = Vcom.rx_bytes; if(len > EP5_MAX_PKT_SIZE) len = EP5_MAX_PKT_SIZE; for(i = 0; i < len; i++) { - vcom.in_buff[i] = vcom.rx_buff[vcom.rx_head++]; - if(vcom.rx_head >= RX_BUFF_SIZE) - vcom.rx_head = 0; + Vcom.in_buff[i] = Vcom.rx_buff[Vcom.rx_head++]; + if(Vcom.rx_head >= RX_BUFF_SIZE) + Vcom.rx_head = 0; } __disable_irq(); - vcom.rx_bytes -= len; + Vcom.rx_bytes -= len; __enable_irq(); - vcom.in_bytes = len; - USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP5)), (uint8_t *)vcom.in_buff, len); + Vcom.in_bytes = len; + USBD_MemCopy((uint8_t *)(USBD_BUF_BASE + USBD_GET_EP_BUF_ADDR(EP5)), (uint8_t *)Vcom.in_buff, len); USBD_SET_PAYLOAD_LEN(EP5, len); } else { - /* Prepare a zero packet if previous packet size is EP2_MAX_PKT_SIZE and + /* Prepare a zero packet if previous packet size is EP5_MAX_PKT_SIZE and no more data to send at this moment to note Host the transfer has been done */ len = USBD_GET_PAYLOAD_LEN(EP5); if(len == EP5_MAX_PKT_SIZE) @@ -186,40 +178,40 @@ void VCOM_TransferData(void) } /* Process the Bulk out data when bulk out data is ready. */ - if(vcom.out_ready && (vcom.out_bytes <= TX_BUFF_SIZE - vcom.tx_bytes)) + if(Vcom.out_ready && (Vcom.out_bytes <= TX_BUFF_SIZE - Vcom.tx_bytes)) { - for(i = 0; i < vcom.out_bytes; i++) + for(i = 0; i < Vcom.out_bytes; i++) { - vcom.tx_buff[vcom.tx_tail++] = vcom.out_ptr[i]; - if(vcom.tx_tail >= TX_BUFF_SIZE) - vcom.tx_tail = 0; + Vcom.tx_buff[Vcom.tx_tail++] = Vcom.out_ptr[i]; + if(Vcom.tx_tail >= TX_BUFF_SIZE) + Vcom.tx_tail = 0; } __disable_irq(); - vcom.tx_bytes += vcom.out_bytes; + Vcom.tx_bytes += Vcom.out_bytes; __enable_irq(); - vcom.out_bytes = 0; - vcom.out_ready = 0; /* Clear bulk out ready flag */ + Vcom.out_bytes = 0; + Vcom.out_ready = 0; /* Ready to get next BULK out */ USBD_SET_PAYLOAD_LEN(EP6, EP6_MAX_PKT_SIZE); } /* Process the software Tx FIFO */ - if(vcom.tx_bytes) + if(Vcom.tx_bytes) { /* Check if Tx is working */ if((UART2->INTEN & UART_INTEN_THREIEN_Msk) == 0) { /* Send one bytes out */ - UART2->DAT = vcom.tx_buff[vcom.tx_head++]; - if(vcom.tx_head >= TX_BUFF_SIZE) - vcom.tx_head = 0; + UART2->DAT = Vcom.tx_buff[Vcom.tx_head++]; + if(Vcom.tx_head >= TX_BUFF_SIZE) + Vcom.tx_head = 0; - __set_PRIMASK(1); - vcom.tx_bytes--; - __set_PRIMASK(0); + __disable_irq(); + Vcom.tx_bytes--; + __enable_irq(); /* Enable Tx Empty Interrupt. (Trigger first one) */ UART2->INTEN |= UART_INTEN_THREIEN_Msk; diff --git a/src/vcom_serial.h b/src/vcom_serial.h index 8cb2aef..75a8db9 100644 --- a/src/vcom_serial.h +++ b/src/vcom_serial.h @@ -1,42 +1,22 @@ -#ifndef __USBD_CDC_H__ -#define __USBD_CDC_H__ +#ifndef __VCOM_SERIAL_H__ +#define __VCOM_SERIAL_H__ -/* Define the EP number */ -#define CDC_INT_IN_EP 2 -#define CDC_BULK_IN_EP 3 -#define CDC_BULK_OUT_EP 3 - - -/* Define EP maximum packet size */ -#define EP4_MAX_PKT_SIZE 8 -#define EP5_MAX_PKT_SIZE 64 -#define EP6_MAX_PKT_SIZE 64 - - -#define EP4_BUF_BASE (8 + 64 + 64 + 64) -#define EP4_BUF_LEN EP4_MAX_PKT_SIZE -#define EP5_BUF_BASE (EP4_BUF_BASE + EP4_BUF_LEN) -#define EP5_BUF_LEN EP5_MAX_PKT_SIZE -#define EP6_BUF_BASE (EP5_BUF_BASE + EP5_BUF_LEN) -#define EP6_BUF_LEN EP6_MAX_PKT_SIZE - - -/*!