diff --git a/targets/stm32l432/lib/usbd/usbd_ccid.c b/targets/stm32l432/lib/usbd/usbd_ccid.c index 2a81ef7..76b8b8e 100644 --- a/targets/stm32l432/lib/usbd/usbd_ccid.c +++ b/targets/stm32l432/lib/usbd/usbd_ccid.c @@ -64,6 +64,8 @@ static uint8_t USBD_CCID_Init (USBD_HandleTypeDef *pdev, uint8_t cfgidx) USBD_LL_OpenEP(pdev, CCID_CMD_EP, USBD_EP_TYPE_INTR, CCID_DATA_PACKET_SIZE); pdev->ep_in[CCID_CMD_EP & 0xFU].is_used = 1U; + // dump_pma_header("ccid.c"); + static USBD_CCID_HandleTypeDef mem; pdev->pClassData = &mem; @@ -207,30 +209,8 @@ static uint8_t USBD_CCID_DataOut (USBD_HandleTypeDef *pdev, uint8_t epnum) } static uint8_t USBD_CCID_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum) { - //N USBD_CCID_HandleTypeDef *hcdc = (USBD_CCID_HandleTypeDef*)pdev->pClassData; - PCD_HandleTypeDef *hpcd = pdev->pData; - // if(pdev->pClassData != NULL) - // { - // if((pdev->ep_in[epnum].total_length > 0U) && ((pdev->ep_in[epnum].total_length % hpcd->IN_ep[epnum].maxpacket) == 0U)) - // { - // /* Update the packet total length */ - // pdev->ep_in[epnum].total_length = 0U; - - // /* Send ZLP */ - // USBD_LL_Transmit (pdev, epnum, NULL, 0U); - // } - // else - // { - // hcdc->TxState = 0U; - // } - // return USBD_OK; - // } - // else - // { - // return USBD_FAIL; - // } hcdc->TxState = 0U; return USBD_OK; } @@ -246,41 +226,39 @@ uint8_t USBD_CCID_TransmitPacket(uint8_t * msg, int len) USBD_LL_Transmit(&Solo_USBD_Device, CCID_IN_EP, msg, len); - - // /* Update the packet total length */ - // Solo_USBD_Device.ep_in[CCID_CMD_EP & 0xFU].total_length = len; - - // /* Transmit next packet */ - // USBD_LL_Transmit(&Solo_USBD_Device, CCID_CMD_EP, msg, - // len); - + printf1(TAG_GREEN,"ccid<< "); + dump_hex1(TAG_GREEN, msg, len); return USBD_OK; } -#define CCID_HEADER_SIZE 10 -typedef struct -{ - uint8_t type; - uint32_t len; - uint8_t slot; - uint8_t seq; - uint8_t rsvd; - uint16_t param; -} __attribute__((packed)) CCID_HEADER; -void ccid_send_status(CCID_HEADER * c) + +void ccid_send_status(CCID_HEADER * c, uint8_t status) { uint8_t msg[CCID_HEADER_SIZE]; memset(msg,0,sizeof(msg)); msg[0] = CCID_SLOT_STATUS_RES; - msg[6] = 1; + msg[6] = c->seq; + msg[7] = status; USBD_CCID_TransmitPacket(msg, sizeof(msg)); } +void ccid_send_data_block(CCID_HEADER * c, uint8_t status) +{ + uint8_t msg[CCID_HEADER_SIZE]; + memset(msg,0,sizeof(msg)); + + msg[0] = CCID_DATA_BLOCK_RES; + msg[6] = c->seq; + msg[7] = status; + + USBD_CCID_TransmitPacket(msg, sizeof(msg)); + +} void handle_ccid(uint8_t * msg, int len) { @@ -288,15 +266,16 @@ void handle_ccid(uint8_t * msg, int len) switch(h->type) { case CCID_SLOT_STATUS: - ccid_send_status(h); + ccid_send_status(h, CCID_STATUS_ON); + break; + case CCID_POWER_ON: + ccid_send_data_block(h, CCID_STATUS_ON); + break; + case CCID_POWER_OFF: + ccid_send_status(h, CCID_STATUS_OFF); break; default: - // while(1) - // { - // led_rgb(0xff3520); - // } - //Y - ccid_send_status(h); + ccid_send_status(h, CCID_STATUS_ON); break; } } @@ -316,24 +295,15 @@ uint8_t usb_ccid_recieve_callback(USBD_HandleTypeDef *pdev, uint8_t epnum) /* Get the received data length */ hcdc->RxLength = USBD_LL_GetRxDataSize (pdev, epnum); - /* USB data will be immediately processed, this allow next USB traffic being - NAKed till the end of the application Xfer */ - if(pdev->pClassData != NULL) - { - // printf1(TAG_GREEN,"ccid>> "); - // dump_hex1(TAG_GREEN, hcdc->RxBuffer, hcdc->RxLength); + printf1(TAG_GREEN, "ccid>> "); + dump_hex1(TAG_GREEN, ccidmsg_buf, hcdc->RxLength); - handle_ccid(hcdc->RxBuffer, hcdc->RxLength); + handle_ccid(ccidmsg_buf, hcdc->RxLength); - return USBD_OK; - } - else - { + USBD_LL_PrepareReceive(&Solo_USBD_Device, CCID_OUT_EP, ccidmsg_buf, + CCID_DATA_PACKET_SIZE); - while(1){ led_rgb(0xff3520); } - - return USBD_FAIL; - } + return USBD_OK; } @@ -345,11 +315,5 @@ uint8_t usb_ccid_recieve_callback(USBD_HandleTypeDef *pdev, uint8_t epnum) */ static uint8_t USBD_CCID_EP0_RxReady (USBD_HandleTypeDef *pdev) { - USBD_CCID_HandleTypeDef *hcdc = (USBD_CCID_HandleTypeDef*) pdev->pClassData; - - // if((pdev->pUserData != NULL) && (hcdc->CmdOpCode != 0xFFU)) - // { - // hcdc->CmdOpCode = 0xFFU; - // } return USBD_OK; } diff --git a/targets/stm32l432/lib/usbd/usbd_ccid.h b/targets/stm32l432/lib/usbd/usbd_ccid.h index 6535987..513c796 100644 --- a/targets/stm32l432/lib/usbd/usbd_ccid.h +++ b/targets/stm32l432/lib/usbd/usbd_ccid.h @@ -3,7 +3,18 @@ #include "usbd_ioreq.h" -#define CCID_IN_EP 0x84U /* EP1 for data IN */ +#define CCID_HEADER_SIZE 10 +typedef struct +{ + uint8_t type; + uint32_t len; + uint8_t slot; + uint8_t seq; + uint8_t rsvd; + uint16_t param; +} __attribute__((packed)) CCID_HEADER; + +#define CCID_IN_EP 0x86U /* EP1 for data IN */ #define CCID_OUT_EP 0x04U /* EP1 for data OUT */ #define CCID_CMD_EP 0x85U /* EP2 for CDC commands */ @@ -17,6 +28,10 @@ #define CCID_GET_PARAMS 0x6C #define CCID_RESET_PARAMS 0x6D #define CCID_XFR_BLOCK 0x6F + +#define CCID_STATUS_ON 0x00 +#define CCID_STATUS_OFF 0x02 + #define CCID_DATA_BLOCK_RES 0x80 #define CCID_SLOT_STATUS_RES 0x81 #define CCID_PARAMS_RES 0x82 diff --git a/targets/stm32l432/lib/usbd/usbd_conf.c b/targets/stm32l432/lib/usbd/usbd_conf.c index 61bcecd..ad5b211 100644 --- a/targets/stm32l432/lib/usbd/usbd_conf.c +++ b/targets/stm32l432/lib/usbd/usbd_conf.c @@ -52,6 +52,7 @@ #include "usbd_hid.h" #include "usbd_cdc.h" #include "usbd_ccid.h" +#include "log.h" void SystemClock_Config(void); @@ -223,7 +224,6 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd) { USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData); } - /** * @brief Initializes the low level portion of the device driver. * @param pdev: Device handle @@ -260,15 +260,17 @@ USBD_StatusTypeDef USBD_LL_Init(USBD_HandleTypeDef *pdev) HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , HID_EPOUT_ADDR , PCD_SNG_BUF, 0x98); HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , HID_EPIN_ADDR , PCD_SNG_BUF, 0xd8); - // CDC / uart - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_OUT_EP , PCD_SNG_BUF, 0xd8 + 64); // data OUT - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_IN_EP , PCD_SNG_BUF, 0xd8 + 64*2); // data IN - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_CMD_EP , PCD_SNG_BUF, 0xd8 + 64*3); // commands - // CCID - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CCID_OUT_EP , PCD_SNG_BUF, 0xd8 + 64*4); // data OUT - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CCID_IN_EP , PCD_SNG_BUF, 0xd8 + 64*5); // data IN - HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CCID_CMD_EP , PCD_SNG_BUF, 0xd8 + 64*6); // commands + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CCID_OUT_EP , PCD_SNG_BUF, 0xd8 + 64); // data OUT + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CCID_IN_EP , PCD_SNG_BUF, 0xd8 + 64*2); // data IN + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CCID_CMD_EP , PCD_SNG_BUF, 0xd8 + 64*3); // commands + + // CDC / uart + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_CMD_EP , PCD_SNG_BUF, 0xd8 + 64*4); // commands + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_OUT_EP , PCD_SNG_BUF, 0xd8 + 64*5); // data OUT + HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , CDC_IN_EP , PCD_SNG_BUF, 0xd8 + 64*6); // data IN + + // dump_pma_header("usbd_conf"); return USBD_OK; } @@ -319,6 +321,7 @@ USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev, uint8_t ep_type, uint16_t ep_mps) { + // printf1(TAG_RED,"LL_Open. ep: %x, %x\r\n", ep_addr, ep_type); HAL_PCD_EP_Open((PCD_HandleTypeDef*) pdev->pData, ep_addr, ep_mps,