Files
TX/source/USB/usbComms.c

414 lines
9.1 KiB
C

/*
* usbComms.c
*
* Created on: May 17, 2023
* Author: Brian.Bailey
*/
/*
* USB Comms
* Data is received by APP_and placed in rxBuffer[]
*/
#include <stdio.h>
#include <stdlib.h>
//Drivers
#include "fsl_gpio.h"
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "board.h"
//Application Includes
#include "virtual_com.h"
#include "flashUpdate.h"
#include "bootloader.h"
#include "eeprom.h"
#include "System/system.h"
#include "frq.h"
#include "hwFixes.h"
#include "usbComms.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define USB_DETECT_PORT 1 //USB VBUS on GPIO1_6. Not sure we can read this
#define USB_DETECT_PIN 6
#define CR '\r' //carriage return
#define LF '\n' //line feed
#define null 0 //NULL is defined at (void *)0 so it causes errors
/*******************************************************************************
* Variables
******************************************************************************/
USB_t usb;
extern SYSTEM_DATA_t sys;
extern BL_DATA_t blData;
extern usb_cdc_vcom_struct_t s_cdcVcom;
extern uint8_t frq_update_flag;
extern HARDWARE_FIX_t hwf;
//temp storage for string data
uint8_t usbTempString[USB_RX_BUFFER_SIZE];
/*******************************************************************************
* Static Function Declarations
******************************************************************************/
/*******************************************************************************
* Static Functions
******************************************************************************/
/*******************************************************************************
* Public Functions
******************************************************************************/
uint8_t USB_IsConnected(void)
{
return GPIO_PinRead(GPIO, USB_DETECT_PORT, USB_DETECT_PIN);
}
/* Process incoming USB string
* Commands are LF terminated ASCII text
* @param size number of bytes to process
*/
void USB_ProcessString(uint32_t size)
{
//operates on usb.rxDataBuffer[]
//index is usb.rxCommandIndex
uint32_t usbBusyCount = 0;
usb.rxStringReceived = false;
for(uint32_t i = 0; i < size; i++) //Look for LF character in rxDataBuffer
{
if(LF == usb.rxDataBuffer[i])
{
usb.rxDataBuffer[i] = 0; //replace LF with NULL to terminate string
usb.rxStringReceived = true;
break;
}
}
if(usb.rxStringReceived)
{
//Process the command
USB_ProcessCommand();
}
else
{
//This is an error. search the ringbuffer for the next LF and throw away everything before it.
}
}
/*
* Process Incoming USB commands
*/
void USB_ProcessCommand(void)
{
if(USB_CommandCompare("dID")) //device ID
{
USB_SendString("UM_TX");
}
else if(USB_CommandPrefixCompare("p"))
{
USB_ProcessProgramCommand();
}
else if(USB_CommandPrefixCompare("s"))
{
USB_ProcessSystemCommand();
}
else if(USB_CommandPrefixCompare("f"))
{
USB_ProcessFrequencyCommand();
}
else
{
//Bad Command
USB_SendString(NAK);
}
}
/*
* Process Program commands
*/
void USB_ProcessProgramCommand(void)
{
if (USB_CommandCompare("pLoaderRunRequest")) //Request bootloader run
{
blData.loaderRunRequest = 1;
EE_WriteMemoryUINT32(BL_LOADERRUNREQUEST_EEPROM_ADDR, &blData.loaderRunRequest);
//TESTING: Verify write
EE_ReadMemoryUINT32(BL_LOADERRUNREQUEST_EEPROM_ADDR, &blData.loaderRunRequest);
if(blData.loaderRunRequest == 1)
{
USB_SendString(ACK);
}
else
{
USB_SendString(NAK);
}
}
else if (USB_CommandPrefixCompare("pProgramSetup,")) //Program setup information - RX can ONLY update the bootloader at 0x6000 0000
{
FU_ProgramSetup(usb.rxDataBuffer);
}
else if(USB_CommandCompare("pVerifyImage")) //verify image in FLASH - compare hashes
{
FU_VerifyImage();
}
else if(USB_CommandCompare("pReset"))
{
FU_ResetProcessor();
}
else if (USB_CommandCompare("pClearProgramFlag"))
{
blData.transmitterProgrammed = false;
EE_WriteMemoryUINT32(BL_PROGRAMMED_EEPROM_ADDR, &blData.transmitterProgrammed);
//TESTING: Verify write
EE_ReadMemoryUINT32(BL_PROGRAMMED_EEPROM_ADDR, &blData.transmitterProgrammed);
if(blData.transmitterProgrammed == false)
{
USB_SendString(ACK);
}
else
{
USB_SendString(NAK);
}
}
else if (USB_CommandCompare("pEraseAllData")) //Erase settings and factory data. Leave bootloader data
{
EE_EraseAllData(); // Erase EEPROM data
USB_SendString(ACK);
}
else
{
USB_SendString(NAK);
}
}
/*
* Process System commands
*/
void USB_ProcessSystemCommand(void)
{
static uint8_t *p; //pointer for strtok - static so it doesn't get optimized out.
if (USB_CommandPrefixCompare("sSetMfg,"))
{
p = strtok(usb.rxDataBuffer, ","); //points to command
p = strtok(null, ","); //points to arg
strncpy(sys.manufacturer, p, SYS_INFO_LENGTH);
USB_SendString(ACK);
}
else if (USB_CommandPrefixCompare("sSetModelNumber,"))
{
char* token = strtok(usb.rxDataBuffer, ",");
token = strtok(null, ","); //points to arg
strncpy(sys.modelNumber, token, SYS_INFO_LENGTH);
USB_SendString(ACK);
}
else if (USB_CommandPrefixCompare("sSetModelName,"))
{
char* token = strtok(usb.rxDataBuffer, ",");
token = strtok(null, ","); //points to arg
strncpy(sys.modelName, token, SYS_INFO_LENGTH);
USB_SendString(ACK);
}
else if (USB_CommandPrefixCompare("sSetSerial,"))
{
char* token = strtok(usb.rxDataBuffer, ",");
token = strtok(null, ","); //points to arg
strncpy(sys.serialNumber, token, SYS_INFO_LENGTH);
USB_SendString(ACK);
}
else if (USB_CommandPrefixCompare("sSetMfgDate,"))
{
char* token = strtok(usb.rxDataBuffer, ",");
token = strtok(null, ","); //points to arg
strncpy(sys.mfgDate, token, SYS_INFO_LENGTH);
USB_SendString(ACK);
}
else if (USB_CommandPrefixCompare("sSetHourCount,"))
{
//do nothing
USB_SendString(ACK);
}
else if(USB_CommandPrefixCompare("sSetMainPcbaPN,"))
{
char* token = strtok(usb.rxDataBuffer, ",");
token = strtok(null, ","); //points to arg
hwf.mainPcbaPN = atoi(token);
EE_WriteUINT32(EE_HWFIX_MAIN_PCBA_PN, hwf.mainPcbaPN);
USB_SendString(ACK);
}
else if (USB_CommandCompare("sSaveSettings"))
{
//Save settings data
EE_SaveData();
frq_update_flag = false;
Change_To_Next_BC_Freq();
USB_SendString(ACK);
}
else if (USB_CommandCompare("sGetSwVersion"))
{
USB_SendString(SW_VERSION);
}
else if (USB_CommandCompare("sGetMfg"))
{
USB_SendString(sys.manufacturer);
}
else if (USB_CommandCompare("sGetModelNumber"))
{
USB_SendString(sys.modelNumber);
}
else if (USB_CommandCompare("sGetModelName"))
{
USB_SendString(sys.modelName);
}
else if (USB_CommandCompare("sGetSerial"))
{
USB_SendString(sys.serialNumber);
}
else if (USB_CommandCompare("sGetMfgDate"))
{
USB_SendString(sys.mfgDate);
}
else if(USB_CommandCompare("sGetMainPcbaPN"))
{
sprintf(usbTempString, "%d", hwf.mainPcbaPN);
USB_SendString(usbTempString);
}
else if(USB_CommandCompare("sGetbootloaderVerion"))
{
sprintf(usbTempString, "%d", sys.bootloaderVersion);
USB_SendString(usbTempString);
}
else //Unknown command
{
USB_SendString(NAK);
}
}
/*
* Process Frequency Commands
*/
void USB_ProcessFrequencyCommand(void)
{
static uint8_t *p; //pointer for strtok - static so it doesn't get optimized out.
if (USB_CommandPrefixCompare("fAdd,"))
{
//Add a frequency to FreqArray[]
//Parse message
p = strtok(usb.rxDataBuffer, ","); //points to "fAdd"
p = strtok(null, ","); //frequency
uint32_t frequency = atoi(p);
p = strtok(null, ","); //type
uint32_t type = atoi(p);
p = strtok(null, ","); //enabled
uint32_t enabled = atoi(p);
p = strtok(null, ","); //inMenu
uint32_t inMenu = atoi(p);
FREQ_AddFrequency(frequency, enabled, inMenu, type);
USB_SendString(ACK);
}
else if (USB_CommandCompare("fClear"))
{
//Clear the frequency list
frq_update_flag = true;
FREQ_ClearFrequencies();
USB_SendString(ACK);
}
else if (USB_CommandCompare("fSave"))
{
//Save frequency data to EEPROM
EE_SaveData();
USB_SendString(ACK);
}
else if (USB_CommandCompare("fGetNum")) //Get number of frequencies in the receiver
{
sprintf(usbTempString, "%d", FREQ_GetNumFrequencies());
USB_SendString(usbTempString);
}
else if (USB_CommandPrefixCompare("fGet,")) //Get string representing a single frequency
{
p = strtok(usb.rxDataBuffer, ","); //points to "fGet"
p = strtok(null, ","); //index
uint32_t index = atoi(p);
FREQUENCY_t frq = FREQ_GetFreqByIndex(index);
sprintf(usbTempString, "%d,%d,%d,%d", frq.frequency1, 0, frq.enabled, 1); //FREQ_TYPE-t always 0, inMenu always 1
USB_SendString(usbTempString);
}
else //Unknown command
{
USB_SendString(NAK);
}
}
/*
* Return true if str matches data in usb.rxDataBuffer
*/
bool USB_CommandCompare(uint8_t *str)
{
return (0 == strncmp(str, usb.rxDataBuffer, USB_RX_BUFFER_SIZE));
}
/* Compare str to contents of usb.rxDataBuffer
* Return true if str matches data in usb.rxDataBuffer
*/
bool USB_CommandPrefixCompare(uint8_t *str)
{
return (0 == strncmp(str, usb.rxDataBuffer, strlen(str)));
}