This commit is contained in:
2025-04-12 19:57:48 +02:00
parent cfe3d87612
commit 4aede093f1
11 changed files with 175 additions and 196 deletions

4
.gitmodules vendored
View File

@@ -16,3 +16,7 @@
[submodule "storno_cqp6xx_digital_xtal/avr_eeprom_driver"]
path = storno_cqp6xx_digital_xtal/avr_eeprom_driver
url = https://OZ1CM@bitbucket.org/oz1cm/avr_eeprom_driver.git
[submodule "storno_cqp6xx_digital_xtal/cm_task_manager"]
path = storno_cqp6xx_digital_xtal/cm_task_manager
url = https://OZ1CM@bitbucket.org/oz1cm/cm_task_manager.git
branch = master

View File

@@ -38,6 +38,7 @@ SUBDIRS := \
../avr_i2c_driver/ \
../avr_uart_driver/ \
../cm_msg/ \
../cm_task_manager/ \
../si5351_driver/
@@ -48,6 +49,7 @@ C_SRCS += \
../avr_i2c_driver/avr_i2c.c \
../avr_uart_driver/avr_uart.c \
../cm_msg/cm_msg.c \
../cm_task_manager/cm_task_manager.c \
../cqm6xx_app.c \
../main.c \
../si5351_driver/si5351_driver.c
@@ -65,6 +67,7 @@ avr_gpio_driver/avr_gpio.o \
avr_i2c_driver/avr_i2c.o \
avr_uart_driver/avr_uart.o \
cm_msg/cm_msg.o \
cm_task_manager/cm_task_manager.o \
cqm6xx_app.o \
main.o \
si5351_driver/si5351_driver.o
@@ -75,6 +78,7 @@ avr_gpio_driver/avr_gpio.o \
avr_i2c_driver/avr_i2c.o \
avr_uart_driver/avr_uart.o \
cm_msg/cm_msg.o \
cm_task_manager/cm_task_manager.o \
cqm6xx_app.o \
main.o \
si5351_driver/si5351_driver.o
@@ -85,6 +89,7 @@ avr_gpio_driver/avr_gpio.d \
avr_i2c_driver/avr_i2c.d \
avr_uart_driver/avr_uart.d \
cm_msg/cm_msg.d \
cm_task_manager/cm_task_manager.d \
cqm6xx_app.d \
main.d \
si5351_driver/si5351_driver.d
@@ -95,6 +100,7 @@ avr_gpio_driver/avr_gpio.d \
avr_i2c_driver/avr_i2c.d \
avr_uart_driver/avr_uart.d \
cm_msg/cm_msg.d \
cm_task_manager/cm_task_manager.d \
cqm6xx_app.d \
main.d \
si5351_driver/si5351_driver.d
@@ -148,6 +154,13 @@ cm_msg/cm_msg.o: ../cm_msg/cm_msg.c
@echo Finished building: $<
cm_task_manager/cm_task_manager.o: ../cm_task_manager/cm_task_manager.c
@echo Building file: $<
@echo Invoking: AVR/GNU C Compiler : 5.4.0
$(QUOTE)E:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -funsigned-char -funsigned-bitfields -DDEBUG -I"E:\cm_programs\microchip_studio\7.0\Packs\atmel\ATtiny_DFP\1.10.348\include" -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=attiny402 -B "E:\cm_programs\microchip_studio\7.0\Packs\atmel\ATtiny_DFP\1.10.348\gcc\dev\attiny402" -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<"
@echo Finished building: $<
./cqm6xx_app.o: .././cqm6xx_app.c
@echo Building file: $<
@echo Invoking: AVR/GNU C Compiler : 5.4.0

View File

@@ -0,0 +1,14 @@
cm_task_manager/cm_task_manager.d cm_task_manager/cm_task_manager.o: \
../cm_task_manager/cm_task_manager.c \
../cm_task_manager/cm_task_manager.h \
e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stdint.h \
e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\stdint.h \
e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stddef.h
../cm_task_manager/cm_task_manager.h:
e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stdint.h:
e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\stdint.h:
e:\cm_programs\microchip_studio\7.0\toolchain\avr8\avr8-gnu-toolchain\lib\gcc\avr\5.4.0\include\stddef.h:

View File

@@ -12,6 +12,8 @@ avr_uart_driver\avr_uart.c
cm_msg\cm_msg.c
cm_task_manager\cm_task_manager.c
cqm6xx_app.c
main.c

View File

@@ -12,7 +12,8 @@
#include "avr_global_config.h"
#include "avr_eeprom_driver/avr_eeprom_driver.h"
#include "cm_msg/cm_msg.h"
//#include <util/delay.h>
#include "cm_task_manager/cm_task_manager.h"
#define PLLA_SETTINGS_EEPROM_ADDR 0x00 // addr 0
#define PLLB_SETTINGS_EEPROM_ADDR 0x20 // addr 32 (64 bytes total memory)
@@ -24,136 +25,45 @@ static uint8_t isStructValid(storno_xtal_app_t *inst){
return 0;
}
static void cqm6xx_app_updateOsc(storno_xtal_app_t *inst){
void setRTXOscMode(storno_xtal_app_t *inst){
if(inst->rtx_mode != STORNO_APP_TX_MODE){
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_ENABLE); // RX
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_DISABLE); // TX
}else{
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_DISABLE); // RX
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_ENABLE); // TX
}
}
void cqm6xx_app_taskHandler(storno_xtal_app_t *inst){
// Check Struct
if(isStructValid(inst) != 0)return;
// We will only do this once, aka when transisioning from RX to TX and TX to RX..
if(inst->state_next == inst->state_now)return;
// Run next task:
cm_taskManager_run_tasks(&inst->storno_xtal_task);
switch(inst->state_next){
// Find out if we are in RX or TX
case STORNO_APP_RX_MODE:
//_delay_ms(1);
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_ENABLE); // RX
//_delay_ms(1);
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_DISABLE); // TX
// If TX pin is not set, then turn on RX output on PLL and disable TX clock. Run setRTXOscMode once, so pll isnt constantly written to!!
if((gpio_get_level(GPIO_PORTA,GPIO_PIN_PTT) != GPIO_LEVEL_SET) && (inst->rtx_mode != STORNO_APP_RX_MODE )){
break;
inst->rtx_mode = STORNO_APP_RX_MODE;
cm_taskManager_addTaskToList(&inst->storno_xtal_task,setRTXOscMode,inst);
case STORNO_APP_TX_MODE:
//_delay_ms(1);
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_0,SI5351_OUTPUT_DISABLE); // RX
//_delay_ms(1);
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_1,SI5351_OUTPUT_ENABLE); // TX
break;
default:
break;
}else if (inst->rtx_mode != STORNO_APP_TX_MODE){
inst->rtx_mode = STORNO_APP_TX_MODE;
cm_taskManager_addTaskToList(&inst->storno_xtal_task,setRTXOscMode,inst);
}
}
static void cqm_setPLLParam(storno_xtal_app_t *inst, si5351_PLLs pll_num, si5351_Outputs output){
cm_setPllParamRaw(inst->si5351_dev,pll_num, inst->plla_param_data.MSNx_P1, inst->plla_param_data.MSNx_P2, inst->plla_param_data.MSNx_P3);
//_delay_ms(1);
cm_setOutputMultiSynthRaw(inst->si5351_dev,output, inst->plla_param_data.MSx_P1, inst->plla_param_data.MSx_P2, inst->plla_param_data.MSx_P3);
//_delay_ms(1);
cm_setCLKControl(inst->si5351_dev,output,SI5351_CLK_POWER_UP);
}
static void cqm6xx_app_loadPLLParam(storno_xtal_app_t *inst){
// Read settings for PLLA first
cm_EEPROM_read((uint8_t*)PLLA_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg));
//_delay_ms(1);
cm_setInputSource(inst->si5351_dev, SI5351_CLK_SOURCE_XTAL);
//_delay_ms(1);
cqm_setPLLParam(inst, SI5351_PLL_A, SI5351_OUTPUT_0);
//_delay_ms(1);
cm_EEPROM_read((uint8_t*)PLLB_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg));
//_delay_ms(1);
cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_1);
// Set third output to crystal freq for calibration!
cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_2);
cm_setCLKControl(inst->si5351_dev, SI5351_OUTPUT_2,SI5351_CLK_POWER_UP);
//_delay_ms(1);
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_2,SI5351_OUTPUT_ENABLE);
}
void cqm6xx_app_statemachine(storno_xtal_app_t *inst){
// Check Struct
if(isStructValid(inst) != 0)return;
switch (inst->state_next)
{
case STORNO_APP_PROGRAM_OSC:
// Read PLL parameters from EEPROM and Program PLL values here:
inst->state_now = inst->state_next;
cqm6xx_app_loadPLLParam(inst);
// if ok, then go to RX mode:
inst->state_next = STORNO_APP_RX_MODE;
break;
case STORNO_APP_RX_MODE:
// If we just came from another state, then Enable RX osc here..
cqm6xx_app_updateOsc(inst);
// Update state now..
inst->state_now = inst->state_next;
// If PTT is hold, then disable RX osc, and go to STORNO_APP_TX_MODE, to enable tx osc.
if(gpio_get_level(GPIO_PORTA,GPIO_PIN_PTT) == GPIO_LEVEL_SET) inst->state_next = STORNO_APP_TX_MODE;
break;
case STORNO_APP_TX_MODE:
// If we just came from another state, then Enable TX osc here..
cqm6xx_app_updateOsc(inst);
// Update state now..
inst->state_now = inst->state_next;
// If PTT is released, then disable TX osc, and go to STORNO_APP_RX_MODE, to enable rx osc.
if(gpio_get_level(GPIO_PORTA,GPIO_PIN_PTT) == GPIO_LEVEL_RESET) inst->state_next = STORNO_APP_RX_MODE;
break;
case STORNO_APP_RST_TO_BOOTLOADER:
break;
default:
break;
}
}
void programPLL_Parameters(storno_xtal_app_t *inst){
//uint8_t *data_ptr = (void *)&inst->plla_param_data;
void EepromWritePLLParameters(storno_xtal_app_t *inst){
//Burn settings into eeprom here:
switch(inst->plla_param_data.header.PLL_Ident){
@@ -180,25 +90,6 @@ void programPLL_Parameters(storno_xtal_app_t *inst){
}
/*if((inst->plla_param_data.PLL_Ident == MSG_GET_PLLA_PARAM) && (inst->plla_param_data.PLL_Ident == MSG_GET_PLLB_PARAM)){
cm_uart_send('O');
cm_uart_send('Z');
cm_uart_send('1');
cm_uart_send('C');
cm_uart_send('M');
for(uint8_t idx = 0; idx < sizeof(storno_pll_param_msg);idx++){
cm_uart_send(data_ptr[idx]);
}
}*/
// Send status back maybe..
//Force state machine to load new settings from eeprom:
inst->state_next = STORNO_APP_PROGRAM_OSC;
}
static int writeDefaultSettingsEEprom(storno_xtal_app_t *inst){
@@ -239,6 +130,44 @@ static int isEEPROMValid(storno_xtal_app_t *inst){
return 0;
}
static void cqm_setPLLParam(storno_xtal_app_t *inst, si5351_PLLs pll_num, si5351_Outputs output){
cm_setPllParamRaw(inst->si5351_dev,pll_num, inst->plla_param_data.MSNx_P1, inst->plla_param_data.MSNx_P2, inst->plla_param_data.MSNx_P3);
//_delay_ms(1);
cm_setOutputMultiSynthRaw(inst->si5351_dev,output, inst->plla_param_data.MSx_P1, inst->plla_param_data.MSx_P2, inst->plla_param_data.MSx_P3);
//_delay_ms(1);
cm_setCLKControl(inst->si5351_dev,output,SI5351_CLK_POWER_UP);
}
static void cqm6xx_app_loadPLLParam(storno_xtal_app_t *inst){
// Read settings for PLLA first
cm_EEPROM_read((uint8_t*)PLLA_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg));
//_delay_ms(1);
cm_setInputSource(inst->si5351_dev, SI5351_CLK_SOURCE_XTAL);
//_delay_ms(1);
cqm_setPLLParam(inst, SI5351_PLL_A, SI5351_OUTPUT_0);
//_delay_ms(1);
cm_EEPROM_read((uint8_t*)PLLB_SETTINGS_EEPROM_ADDR,(uint8_t *)&inst->plla_param_data,sizeof(storno_pll_param_msg));
//_delay_ms(1);
cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_1);
// Set third output to crystal freq for calibration!
cqm_setPLLParam(inst, SI5351_PLL_B, SI5351_OUTPUT_2);
cm_setCLKControl(inst->si5351_dev, SI5351_OUTPUT_2,SI5351_CLK_POWER_UP);
//_delay_ms(1);
cm_setOutputEnable(inst->si5351_dev,SI5351_OUTPUT_2,SI5351_OUTPUT_ENABLE);
}
int uart_rx_event(storno_xtal_app_t *inst, void *rxData){
@@ -257,6 +186,11 @@ int uart_rx_event(storno_xtal_app_t *inst, void *rxData){
}
// Add EepromWritePLLParameters to trigger to write setting to eeprom as soon as we can after ISR!
cm_taskManager_addTaskToList(&inst->storno_xtal_task,(void*)EepromWritePLLParameters,inst);
// Add write pll to list.. so the settings are updated immitialy
return 0;
}
@@ -265,14 +199,11 @@ void cqm6xx_app_init(storno_xtal_app_t *inst, void *si5351_dev){
if(si5351_dev == NULL) return;
if(inst == NULL)return;
inst->state_next = STORNO_APP_PROGRAM_OSC;
inst->state_now = STORNO_APP_PROGRAM_OSC;
inst->si5351_dev = si5351_dev;
cm_MsgCompleteEvt_Register(inst,(Get_msgComplete_Event_fpt)uart_rx_event);
cm_uart_init(inst,(get_UART_Event_fpt)cm_msg_DecodeMsg_Byte);
cm_taskManager_init(&inst->storno_xtal_task);
// Check if data is vaild (if this is a new mcu)
if(!isEEPROMValid(inst)){
@@ -280,4 +211,6 @@ void cqm6xx_app_init(storno_xtal_app_t *inst, void *si5351_dev){
writeDefaultSettingsEEprom(inst);
}
cqm6xx_app_loadPLLParam(inst);
}

View File

@@ -46,28 +46,24 @@ typedef struct {
typedef enum {
STORNO_APP_RX_MODE = 0,
STORNO_APP_TX_MODE = 1,
STORNO_APP_PROGRAM_OSC = 0,
STORNO_APP_RX_MODE = 1,
STORNO_APP_TX_MODE = 2,
STORNO_APP_RST_TO_BOOTLOADER = 5,
}storno_app_states;
}storno_app_modes;
typedef struct {
storno_app_states state_now;
storno_app_states state_next;
storno_app_modes rtx_mode;
void *si5351_dev;
storno_pll_param_msg plla_param_data;
storno_pll_param_msg pllb_param_data;
cm_task_manager_t storno_xtal_task;
}__attribute__((packed))storno_xtal_app_t;
void cqm6xx_app_statemachine(storno_xtal_app_t *inst);
void cqm6xx_app_taskHandler(storno_xtal_app_t *inst);
void cqm6xx_app_init(storno_xtal_app_t *inst, void *si5351_dev);

View File

@@ -13,6 +13,7 @@
#include "cqm6xx_app.h"
#include "avr_eeprom_driver/avr_eeprom_driver.h"
storno_xtal_app_t storno_xtal_app;
int main(void)
@@ -31,10 +32,12 @@ int main(void)
cm_si5351_init(&si5351_dev,&si5351_i2c,(setGet_I2C_Event_fpt)cm_i2c_transfer);
cqm6xx_app_init(&storno_xtal_app, &si5351_dev);
while (1)
{
cqm6xx_app_statemachine(&storno_xtal_app);
//_delay_ms(100);
cqm6xx_app_taskHandler(&storno_xtal_app);
}
}

View File

@@ -103,47 +103,47 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.Device>-mmcu=attiny402 -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\gcc\dev\attiny402"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.linker.libraries.LibrarySearchPaths>
<ListValues>
<Value>D:\cm_projects\microchip_studio_projects\storno_cqp6xx_digital_xtal\storno_cqp6xx_digital_xtal\si5351_driver\include</Value>
<Value>../avr_uart_driver</Value>
</ListValues>
</avrgcc.linker.libraries.LibrarySearchPaths>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
<avrgcc.common.Device>-mmcu=attiny402 -B "%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\gcc\dev\attiny402"</avrgcc.common.Device>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize (-O1)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.linker.libraries.LibrarySearchPaths>
<ListValues>
<Value>D:\cm_projects\microchip_studio_projects\storno_cqp6xx_digital_xtal\storno_cqp6xx_digital_xtal\si5351_driver\include</Value>
<Value>../avr_uart_driver</Value>
</ListValues>
</avrgcc.linker.libraries.LibrarySearchPaths>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\ATtiny_DFP\1.10.348\include\</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings>
</PropertyGroup>
<ItemGroup>
@@ -180,6 +180,12 @@
<Compile Include="cm_msg\cm_msg.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="cm_task_manager\cm_task_manager.c">
<SubType>compile</SubType>
</Compile>
<Compile Include="cm_task_manager\cm_task_manager.h">
<SubType>compile</SubType>
</Compile>
<Compile Include="cqm6xx_app.c">
<SubType>compile</SubType>
</Compile>
@@ -205,6 +211,7 @@
<Folder Include="avr_i2c_driver\" />
<Folder Include="avr_uart_driver\" />
<Folder Include="cm_msg\" />
<Folder Include="cm_task_manager\" />
<Folder Include="si5351_driver\" />
</ItemGroup>
<ItemGroup>
@@ -244,6 +251,12 @@
<None Include="cm_msg\.gitignore">
<SubType>compile</SubType>
</None>
<None Include="cm_task_manager\.git">
<SubType>compile</SubType>
</None>
<None Include="cm_task_manager\.gitignore">
<SubType>compile</SubType>
</None>
<None Include="si5351_driver\.git">
<SubType>compile</SubType>
</None>