/**
* \file
*
* \brief CDC Application Main functions
*
* Copyright (c) 2011-2018 Microchip Technology Inc. and its subsidiaries.
*
* \asf_license_start
*
* \page License
*
* Subject to your compliance with these terms, you may use Microchip
* software and any derivatives exclusively with Microchip products.
* It is your responsibility to comply with third party license terms applicable
* to your use of third party software (including open source software) that
* may accompany Microchip software.
*
* THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
* WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
* INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
* AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
* LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
* LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
* SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
* POSSIBILITY OR THE DAMAGES ARE FORESEEABLE. TO THE FULLEST EXTENT
* ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
* RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
* THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
*
* \asf_license_stop
*
*/
/*
* Support and FAQ: visit Microchip Support
*/
#include
#include "conf_usb.h"
#include "ui.h"
#include "uart.h"
#include
static volatile bool main_b_cdc_enable = false;
void prvGetRegistersFromStack (uint32_t *pulFaultStackAddress);
void led_configure_port_pins(void);
void vApplicationMallocFailedHook (void);
void vApplicationStackOverflowHook (void);
void Task_cdc_rx_check(void *parameters);
void Task_led_blink(void *parameters);
void InitTask_cdc_rx_check(void);
void InitTask_led_blink(void);
/*! \brief Main function. Execution starts here.
*/
int main(void)
{
irq_initialize_vectors();
cpu_irq_enable();
// Initialize the sleep manager
sleepmgr_init();
#if !SAM0
sysclk_init();
board_init();
#else
system_init();
#endif
// Start USB stack to authorize VBus monitoring
InitTask_cdc_rx_check();
// Init LED
InitTask_led_blink();
//ui_init();//ui_powerdown();
vTaskStartScheduler();
while(true){
__BKPT();
}
}
void Task_cdc_rx_check(void *parameters)
{
#define PORT0 0
//volatile uint8_t led = 1;
char rcvBuff[128] = {0};
char *pStr = rcvBuff;
int len = 0;
while(true)
{
while(udi_cdc_multi_is_rx_ready(PORT0))
{
len += sprintf(pStr++, "%c", udi_cdc_multi_getc(PORT0));
}
if(len>0)
{
printf("<%s\n", rcvBuff);
len=0;
pStr = rcvBuff;
}
//cdc_rx_check();
/*#if !defined (DEBUG_CPU_IRQ_DISABLE)
cpu_irq_disable();
#endif
bool _tc_callback_flag = tc_callback_flag;
#if !defined (DEBUG_CPU_IRQ_DISABLE)
cpu_irq_enable();
#endif */
/*if(_tc_callback_flag){
tc_callback_flag=false;
periodic_event_100ms();
}*/
}
}
void InitTask_cdc_rx_check(void)
{
// Enable USB Stack Device
udc_start();
if (!udc_include_vbus_monitoring())
{
udc_attach();
}
stdio_usb_init();
stdio_usb_enable();
xTaskCreate(Task_cdc_rx_check, (const char*)"Task_cdc_rx_check", configMINIMAL_STACK_SIZE*2, NULL,configMAX_PRIORITIES-1, NULL);
}
void Task_led_blink(void *parameters)
{
//long int c1=0;
//long int c2=0;
int cnt=0;
while(1)
{
printf(">%u sec\n\r", 10*(cnt++));//// stdio_usb_putchar (NULL, "data");//
vTaskDelay(10000);
LED_Toggle(LED_PIN);
/*if((c1 % 50000) == 0){
//periodic_event_1s();
if(!stdio_cdc_opened){
if(c2 % 2){
set_led(false);
}else{
set_led(true);
}
}else{
if(c2 % 3){
set_led(false);
}else{
set_led(true);
}
}
c2++;
}
c1++;*/
}
}
void InitTask_led_blink(void)
{
led_configure_port_pins();
LED_Off(LED_PIN);
xTaskCreate(Task_led_blink, (const char*)"Task_led_blink", configMINIMAL_STACK_SIZE*2, NULL,configMAX_PRIORITIES-1, NULL);
}
void main_suspend_action(void)
{
ui_powerdown();
}
void main_resume_action(void)
{
ui_wakeup();
}
void main_sof_action(void)
{
if (!main_b_cdc_enable)
return;
ui_process(udd_get_frame_number());
}
#ifdef USB_DEVICE_LPM_SUPPORT
void main_suspend_lpm_action(void)
{
ui_powerdown();
}
void main_remotewakeup_lpm_disable(void)
{
ui_wakeup_disable();
}
void main_remotewakeup_lpm_enable(void)
{
ui_wakeup_enable();
}
#endif
bool main_cdc_enable(uint8_t port)
{
main_b_cdc_enable = true;
// Open communication
uart_open(port);
return true;
}
void main_cdc_disable(uint8_t port)
{
main_b_cdc_enable = false;
// Close communication
uart_close(port);
}
void main_cdc_set_dtr(uint8_t port, bool b_enable)
{
if (b_enable) {
// Host terminal has open COM
ui_com_open(port);
}else{
// Host terminal has close COM
ui_com_close(port);
}
}
void led_configure_port_pins(void)
{
struct port_config config_port_pin;
port_get_config_defaults(&config_port_pin);
config_port_pin.direction = PORT_PIN_DIR_OUTPUT;
config_port_pin.input_pull = PORT_PIN_PULL_NONE;
port_pin_set_config(LED_PIN, &config_port_pin);
}
void vApplicationMallocFailedHook (void) {
while (1)
{
__BKPT();
};
}
void vApplicationStackOverflowHook (void) {
while (1)
{
__BKPT();
};
}
void prvGetRegistersFromStack (uint32_t *pulFaultStackAddress) {
__attribute__((unused)) volatile uint32_t r0;
__attribute__((unused)) volatile uint32_t r1;
__attribute__((unused)) volatile uint32_t r2;
__attribute__((unused)) volatile uint32_t r3;
__attribute__((unused)) volatile uint32_t r12;
__attribute__((unused)) volatile uint32_t lr;
__attribute__((unused)) volatile uint32_t pc;
__attribute__((unused)) volatile uint32_t psr;
r0 = pulFaultStackAddress[0];
r1 = pulFaultStackAddress[1];
r2 = pulFaultStackAddress[2];
r3 = pulFaultStackAddress[3];
r12 = pulFaultStackAddress[4];
lr = pulFaultStackAddress[5];
pc = pulFaultStackAddress[6];
psr = pulFaultStackAddress[7];
#ifdef DEBUG
__BKPT();
#endif
NVIC_SystemReset();
while (1)
{
__BKPT();
};
}
/**
* \mainpage ASF USB Device CDC
*
* \section intro Introduction
* This example shows how to implement a USB Device CDC
* on Atmel MCU with USB module.
* The application note AVR4907 http://ww1.microchip.com/downloads/en/appnotes/doc8447.pdf
* provides more information about this implementation.
*
* \section desc Description of the Communication Device Class (CDC)
* The Communication Device Class (CDC) is a general-purpose way to enable all
* types of communications on the Universal Serial Bus (USB).
* This class makes it possible to connect communication devices such as
* digital telephones or analog modems, as well as networking devices
* like ADSL or Cable modems.
* While a CDC device enables the implementation of quite complex devices,
* it can also be used as a very simple method for communication on the USB.
* For example, a CDC device can appear as a virtual COM port, which greatly
* simplifies application development on the host side.
*
* \section startup Startup
* The example is a bridge between a USART from the main MCU
* and the USB CDC interface.
*
* In this example, we will use a PC as a USB host:
* it connects to the USB and to the USART board connector.
* - Connect the USART peripheral to the USART interface of the board.
* - Connect the application to a USB host (e.g. a PC)
* with a mini-B (embedded side) to A (PC host side) cable.
* The application will behave as a virtual COM (see Windows Device Manager).
* - Open a HyperTerminal on both COM ports (RS232 and Virtual COM)
* - Select the same configuration for both COM ports up to 115200 baud.
* - Type a character in one HyperTerminal and it will echo in the other.
*
* \note
* On the first connection of the board on the PC,
* the operating system will detect a new peripheral:
* - This will open a new hardware installation window.
* - Choose "No, not this time" to connect to Windows Update for this installation
* - click "Next"
* - When requested by Windows for a driver INF file, select the
* atmel_devices_cdc.inf file in the directory indicated in the Atmel Studio
* "Solution Explorer" window.
* - click "Next"
*
* \copydoc UI
*
* \section example About example
*
* The example uses the following module groups:
* - Basic modules:
* Startup, board, clock, interrupt, power management
* - USB Device stack and CDC modules:
*
services/usb/
*
services/usb/udc/
*
services/usb/class/cdc/
* - Specific implementation:
* - main.c,
*
initializes clock
*
initializes interrupt
*
manages UI
*
* - uart_xmega.c,
*
implementation of RS232 bridge for XMEGA parts
* - uart_uc3.c,
*
implementation of RS232 bridge for UC3 parts
* - uart_sam.c,
*
implementation of RS232 bridge for SAM parts
* - specific implementation for each target "./examples/product_board/":
* - conf_foo.h configuration of each module
* - ui.c implement of user's interface (leds,buttons...)
*/