* RFID: pull antenna down when emulating * Rfid: fixed HID emulation by adding zero pulse every 4 bits * Rfid: HID emulation fixed with DSP based FSK oscillator. * Rfid: receive 125KHz clock for emulation timer from antenna and comparator * Rfid: commented unused variable * Firmware: rollback changes in f6. * Add F7 target based on F6. * F7/F6: update cube projects, apply changes to the targets, update linker scripts with correct RAM start values. * FuriHal: RFID init routine. * Scripts: update OTP tool for v11 board Co-authored-by: Aleksandr Kutuzov <alleteam@gmail.com>
		
			
				
	
	
		
			143 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			143 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include "usbd_cdc_if.h"
 | 
						|
#include <furi-hal-vcp_i.h>
 | 
						|
 | 
						|
extern USBD_HandleTypeDef hUsbDeviceFS;
 | 
						|
 | 
						|
static int8_t CDC_Init_FS(void);
 | 
						|
static int8_t CDC_DeInit_FS(void);
 | 
						|
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length);
 | 
						|
static int8_t CDC_Receive_FS(uint8_t* pbuf, uint32_t *Len);
 | 
						|
static int8_t CDC_TransmitCplt_FS(uint8_t *pbuf, uint32_t *Len, uint8_t epnum);
 | 
						|
 | 
						|
USBD_CDC_ItfTypeDef USBD_Interface_fops_FS =
 | 
						|
{
 | 
						|
    CDC_Init_FS,
 | 
						|
    CDC_DeInit_FS,
 | 
						|
    CDC_Control_FS,
 | 
						|
    CDC_Receive_FS,
 | 
						|
    CDC_TransmitCplt_FS
 | 
						|
};
 | 
						|
 | 
						|
uint8_t UserRxBufferFS[APP_RX_DATA_SIZE];
 | 
						|
uint8_t UserTxBufferFS[APP_TX_DATA_SIZE];
 | 
						|
 | 
						|
/** Initializes the CDC media low layer over the FS USB IP
 | 
						|
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 | 
						|
 */
 | 
						|
static int8_t CDC_Init_FS(void) {
 | 
						|
    /* Set Application Buffers */
 | 
						|
    USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, 0);
 | 
						|
    USBD_CDC_SetRxBuffer(&hUsbDeviceFS, UserRxBufferFS);
 | 
						|
    return (USBD_OK);
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * @brief  DeInitializes the CDC media low layer
 | 
						|
 * @retval USBD_OK if all operations are OK else USBD_FAIL
 | 
						|
 */
 | 
						|
static int8_t CDC_DeInit_FS(void) {
 | 
						|
    return (USBD_OK);
 | 
						|
}
 | 
						|
 | 
						|
/** Manage the CDC class requests
 | 
						|
 * @param  cmd: Command code
 | 
						|
 * @param  pbuf: Buffer containing command data (request parameters)
 | 
						|
 * @param  length: Number of data to be sent (in bytes)
 | 
						|
 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 | 
						|
 */
 | 
						|
static int8_t CDC_Control_FS(uint8_t cmd, uint8_t* pbuf, uint16_t length) {
 | 
						|
    if (cmd == CDC_SEND_ENCAPSULATED_COMMAND) {
 | 
						|
    } else if (cmd == CDC_GET_ENCAPSULATED_RESPONSE) {
 | 
						|
    } else if (cmd == CDC_SET_COMM_FEATURE) {
 | 
						|
    } else if (cmd == CDC_GET_COMM_FEATURE) {
 | 
						|
    } else if (cmd == CDC_CLEAR_COMM_FEATURE) {
 | 
						|
    } else if (cmd == CDC_SET_LINE_CODING) {
 | 
						|
        /*******************************************************************************/
 | 
						|
        /* Line Coding Structure                                                       */
 | 
						|
        /*-----------------------------------------------------------------------------*/
 | 
						|
        /* Offset | Field       | Size | Value  | Description                          */
 | 
						|
        /* 0      | dwDTERate   |   4  | Number |Data terminal rate, in bits per second*/
 | 
						|
        /* 4      | bCharFormat |   1  | Number | Stop bits                            */
 | 
						|
        /*                                        0 - 1 Stop bit                       */
 | 
						|
        /*                                        1 - 1.5 Stop bits                    */
 | 
						|
        /*                                        2 - 2 Stop bits                      */
 | 
						|
        /* 5      | bParityType |  1   | Number | Parity                               */
 | 
						|
        /*                                        0 - None                             */
 | 
						|
        /*                                        1 - Odd                              */
 | 
						|
        /*                                        2 - Even                             */
 | 
						|
        /*                                        3 - Mark                             */
 | 
						|
        /*                                        4 - Space                            */
 | 
						|
        /* 6      | bDataBits  |   1   | Number Data bits (5, 6, 7, 8 or 16).          */
 | 
						|
        /*******************************************************************************/
 | 
						|
    } else if (cmd == CDC_GET_LINE_CODING) {
 | 
						|
    } else if (cmd == CDC_SET_CONTROL_LINE_STATE) {
 | 
						|
        furi_hal_vcp_on_cdc_control_line(((USBD_SetupReqTypedef*)pbuf)->wValue);
 | 
						|
    } else if (cmd == CDC_SEND_BREAK) {
 | 
						|
    } else {
 | 
						|
    }
 | 
						|
 | 
						|
    return (USBD_OK);
 | 
						|
}
 | 
						|
 | 
						|
/** Data received over USB OUT endpoint are sent over CDC interface through this function.
 | 
						|
 *
 | 
						|
 * @note
 | 
						|
 * This function will issue a NAK packet on any OUT packet received on
 | 
						|
 * USB endpoint until exiting this function. If you exit this function
 | 
						|
 * before transfer is complete on CDC interface (ie. using DMA controller)
 | 
						|
 * it will result in receiving more data while previous ones are still
 | 
						|
 * not sent.
 | 
						|
 *
 | 
						|
 * @param  Buf: Buffer of data to be received
 | 
						|
 * @param  Len: Number of data received (in bytes)
 | 
						|
 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 | 
						|
 */
 | 
						|
static int8_t CDC_Receive_FS(uint8_t* Buf, uint32_t *Len) {
 | 
						|
    if (*Len) {
 | 
						|
        furi_hal_vcp_on_cdc_rx(Buf, *Len);
 | 
						|
    } else {
 | 
						|
        USBD_CDC_ReceivePacket(&hUsbDeviceFS);
 | 
						|
    }
 | 
						|
    
 | 
						|
    return (USBD_OK);
 | 
						|
}
 | 
						|
 | 
						|
/** CDC_Transmit_FS Data to send over USB IN endpoint are sent over CDC interface
 | 
						|
 * through this function.
 | 
						|
 * @param  Buf: Buffer of data to be sent
 | 
						|
 * @param  Len: Number of data to be sent (in bytes)
 | 
						|
 * @retval USBD_OK if all operations are OK else USBD_FAIL or USBD_BUSY
 | 
						|
 */
 | 
						|
uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
 | 
						|
{
 | 
						|
    uint8_t result = USBD_OK;
 | 
						|
 | 
						|
    USBD_CDC_HandleTypeDef *hcdc = (USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
 | 
						|
    if (hcdc->TxState != 0){
 | 
						|
        return USBD_BUSY;
 | 
						|
    }
 | 
						|
    memcpy(UserTxBufferFS, Buf, Len);
 | 
						|
    USBD_CDC_SetTxBuffer(&hUsbDeviceFS, UserTxBufferFS, Len);
 | 
						|
    result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
 | 
						|
 | 
						|
    return result;
 | 
						|
}
 | 
						|
 | 
						|
/** CDC_TransmitCplt_FS Data transmited callback
 | 
						|
 *
 | 
						|
 * @note
 | 
						|
 * This function is IN transfer complete callback used to inform user that
 | 
						|
 * the submitted Data is successfully sent over USB.
 | 
						|
 *
 | 
						|
 * @param  Buf: Buffer of data to be received
 | 
						|
 * @param  Len: Number of data received (in bytes)
 | 
						|
 * @retval Result of the operation: USBD_OK if all operations are OK else USBD_FAIL
 | 
						|
 */
 | 
						|
static int8_t CDC_TransmitCplt_FS(uint8_t *Buf, uint32_t *Len, uint8_t epnum) {
 | 
						|
    uint8_t result = USBD_OK;
 | 
						|
 | 
						|
    furi_hal_vcp_on_cdc_tx_complete(*Len);
 | 
						|
 | 
						|
    return result;
 | 
						|
}
 |