CCID basics working
This commit is contained in:
parent
32f920e372
commit
bde4c09c21
@ -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);
|
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;
|
pdev->ep_in[CCID_CMD_EP & 0xFU].is_used = 1U;
|
||||||
|
|
||||||
|
// dump_pma_header("ccid.c");
|
||||||
|
|
||||||
static USBD_CCID_HandleTypeDef mem;
|
static USBD_CCID_HandleTypeDef mem;
|
||||||
pdev->pClassData = &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)
|
static uint8_t USBD_CCID_DataIn (USBD_HandleTypeDef *pdev, uint8_t epnum)
|
||||||
{
|
{
|
||||||
//N
|
|
||||||
USBD_CCID_HandleTypeDef *hcdc = (USBD_CCID_HandleTypeDef*)pdev->pClassData;
|
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;
|
hcdc->TxState = 0U;
|
||||||
return USBD_OK;
|
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,
|
USBD_LL_Transmit(&Solo_USBD_Device, CCID_IN_EP, msg,
|
||||||
len);
|
len);
|
||||||
|
|
||||||
|
printf1(TAG_GREEN,"ccid<< ");
|
||||||
// /* Update the packet total length */
|
dump_hex1(TAG_GREEN, msg, len);
|
||||||
// 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);
|
|
||||||
|
|
||||||
|
|
||||||
return USBD_OK;
|
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];
|
uint8_t msg[CCID_HEADER_SIZE];
|
||||||
memset(msg,0,sizeof(msg));
|
memset(msg,0,sizeof(msg));
|
||||||
|
|
||||||
msg[0] = CCID_SLOT_STATUS_RES;
|
msg[0] = CCID_SLOT_STATUS_RES;
|
||||||
msg[6] = 1;
|
msg[6] = c->seq;
|
||||||
|
msg[7] = status;
|
||||||
|
|
||||||
USBD_CCID_TransmitPacket(msg, sizeof(msg));
|
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)
|
void handle_ccid(uint8_t * msg, int len)
|
||||||
{
|
{
|
||||||
@ -288,15 +266,16 @@ void handle_ccid(uint8_t * msg, int len)
|
|||||||
switch(h->type)
|
switch(h->type)
|
||||||
{
|
{
|
||||||
case CCID_SLOT_STATUS:
|
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;
|
break;
|
||||||
default:
|
default:
|
||||||
// while(1)
|
ccid_send_status(h, CCID_STATUS_ON);
|
||||||
// {
|
|
||||||
// led_rgb(0xff3520);
|
|
||||||
// }
|
|
||||||
//Y
|
|
||||||
ccid_send_status(h);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -316,24 +295,15 @@ uint8_t usb_ccid_recieve_callback(USBD_HandleTypeDef *pdev, uint8_t epnum)
|
|||||||
/* Get the received data length */
|
/* Get the received data length */
|
||||||
hcdc->RxLength = USBD_LL_GetRxDataSize (pdev, epnum);
|
hcdc->RxLength = USBD_LL_GetRxDataSize (pdev, epnum);
|
||||||
|
|
||||||
/* USB data will be immediately processed, this allow next USB traffic being
|
printf1(TAG_GREEN, "ccid>> ");
|
||||||
NAKed till the end of the application Xfer */
|
dump_hex1(TAG_GREEN, ccidmsg_buf, hcdc->RxLength);
|
||||||
if(pdev->pClassData != NULL)
|
|
||||||
{
|
|
||||||
// printf1(TAG_GREEN,"ccid>> ");
|
|
||||||
// dump_hex1(TAG_GREEN, hcdc->RxBuffer, hcdc->RxLength);
|
|
||||||
|
|
||||||
handle_ccid(hcdc->RxBuffer, hcdc->RxLength);
|
handle_ccid(ccidmsg_buf, hcdc->RxLength);
|
||||||
|
|
||||||
|
USBD_LL_PrepareReceive(&Solo_USBD_Device, CCID_OUT_EP, ccidmsg_buf,
|
||||||
|
CCID_DATA_PACKET_SIZE);
|
||||||
|
|
||||||
return USBD_OK;
|
return USBD_OK;
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
|
|
||||||
while(1){ led_rgb(0xff3520); }
|
|
||||||
|
|
||||||
return USBD_FAIL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -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)
|
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;
|
return USBD_OK;
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,18 @@
|
|||||||
|
|
||||||
#include "usbd_ioreq.h"
|
#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_OUT_EP 0x04U /* EP1 for data OUT */
|
||||||
#define CCID_CMD_EP 0x85U /* EP2 for CDC commands */
|
#define CCID_CMD_EP 0x85U /* EP2 for CDC commands */
|
||||||
|
|
||||||
@ -17,6 +28,10 @@
|
|||||||
#define CCID_GET_PARAMS 0x6C
|
#define CCID_GET_PARAMS 0x6C
|
||||||
#define CCID_RESET_PARAMS 0x6D
|
#define CCID_RESET_PARAMS 0x6D
|
||||||
#define CCID_XFR_BLOCK 0x6F
|
#define CCID_XFR_BLOCK 0x6F
|
||||||
|
|
||||||
|
#define CCID_STATUS_ON 0x00
|
||||||
|
#define CCID_STATUS_OFF 0x02
|
||||||
|
|
||||||
#define CCID_DATA_BLOCK_RES 0x80
|
#define CCID_DATA_BLOCK_RES 0x80
|
||||||
#define CCID_SLOT_STATUS_RES 0x81
|
#define CCID_SLOT_STATUS_RES 0x81
|
||||||
#define CCID_PARAMS_RES 0x82
|
#define CCID_PARAMS_RES 0x82
|
||||||
|
@ -52,6 +52,7 @@
|
|||||||
#include "usbd_hid.h"
|
#include "usbd_hid.h"
|
||||||
#include "usbd_cdc.h"
|
#include "usbd_cdc.h"
|
||||||
#include "usbd_ccid.h"
|
#include "usbd_ccid.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
void SystemClock_Config(void);
|
void SystemClock_Config(void);
|
||||||
|
|
||||||
@ -223,7 +224,6 @@ void HAL_PCD_DisconnectCallback(PCD_HandleTypeDef *hpcd)
|
|||||||
{
|
{
|
||||||
USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData);
|
USBD_LL_DevDisconnected((USBD_HandleTypeDef*)hpcd->pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Initializes the low level portion of the device driver.
|
* @brief Initializes the low level portion of the device driver.
|
||||||
* @param pdev: Device handle
|
* @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_EPOUT_ADDR , PCD_SNG_BUF, 0x98);
|
||||||
HAL_PCDEx_PMAConfig((PCD_HandleTypeDef*)pdev->pData , HID_EPIN_ADDR , PCD_SNG_BUF, 0xd8);
|
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
|
// 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_OUT_EP , PCD_SNG_BUF, 0xd8 + 64); // 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_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*6); // commands
|
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;
|
return USBD_OK;
|
||||||
}
|
}
|
||||||
@ -319,6 +321,7 @@ USBD_StatusTypeDef USBD_LL_OpenEP(USBD_HandleTypeDef *pdev,
|
|||||||
uint8_t ep_type,
|
uint8_t ep_type,
|
||||||
uint16_t ep_mps)
|
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,
|
HAL_PCD_EP_Open((PCD_HandleTypeDef*) pdev->pData,
|
||||||
ep_addr,
|
ep_addr,
|
||||||
ep_mps,
|
ep_mps,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user