| 
									
										
										
										
											2023-03-17 16:12:49 +07:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |  * The MIT License (MIT) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2019 Ha Thach (tinyusb.org) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Permission is hereby granted, free of charge, to any person obtaining a copy | 
					
						
							|  |  |  |  * of this software and associated documentation files (the "Software"), to deal | 
					
						
							|  |  |  |  * in the Software without restriction, including without limitation the rights | 
					
						
							|  |  |  |  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
					
						
							|  |  |  |  * copies of the Software, and to permit persons to whom the Software is | 
					
						
							|  |  |  |  * furnished to do so, subject to the following conditions: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The above copyright notice and this permission notice shall be included in | 
					
						
							|  |  |  |  * all copies or substantial portions of the Software. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
					
						
							|  |  |  |  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
					
						
							|  |  |  |  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
					
						
							|  |  |  |  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
					
						
							|  |  |  |  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
					
						
							|  |  |  |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 
					
						
							|  |  |  |  * THE SOFTWARE. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdlib.h>
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <ctype.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-03 15:44:05 +07:00
										 |  |  | #include "bsp/board_api.h"
 | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  | #include "tusb.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  | /* Blink pattern
 | 
					
						
							|  |  |  |  * - 250 ms  : device not mounted | 
					
						
							|  |  |  |  * - 1000 ms : device mounted | 
					
						
							|  |  |  |  * - 2500 ms : device is suspended | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  |   BLINK_NOT_MOUNTED = 250, | 
					
						
							|  |  |  |   BLINK_MOUNTED = 1000, | 
					
						
							|  |  |  |   BLINK_SUSPENDED = 2500, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static uint32_t blink_interval_ms = BLINK_NOT_MOUNTED; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void led_blinking_task(void); | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  | static void cdc_task(void); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*------------- MAIN -------------*/ | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  | int main(void) { | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |   board_init(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-06 22:41:04 +07:00
										 |  |  |   // init device stack on configured roothub port
 | 
					
						
							|  |  |  |   tud_init(BOARD_TUD_RHPORT); | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-31 19:09:40 +07:00
										 |  |  |   if (board_init_after_tusb) { | 
					
						
							|  |  |  |     board_init_after_tusb(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  |   while (1) { | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |     tud_task(); // tinyusb device task
 | 
					
						
							|  |  |  |     cdc_task(); | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  |     led_blinking_task(); | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-11 12:59:02 +07:00
										 |  |  | // echo to either Serial0 or Serial1
 | 
					
						
							|  |  |  | // with Serial0 as all lower case, Serial1 as all upper case
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  | static void echo_serial_port(uint8_t itf, uint8_t buf[], uint32_t count) { | 
					
						
							| 
									
										
										
										
											2022-06-28 16:27:44 +07:00
										 |  |  |   uint8_t const case_diff = 'a' - 'A'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  |   for (uint32_t i = 0; i < count; i++) { | 
					
						
							|  |  |  |     if (itf == 0) { | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |       // echo back 1st port as lower case
 | 
					
						
							| 
									
										
										
										
											2022-06-28 16:27:44 +07:00
										 |  |  |       if (isupper(buf[i])) buf[i] += case_diff; | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  |     } else { | 
					
						
							| 
									
										
										
										
											2021-03-18 15:23:08 +07:00
										 |  |  |       // echo back 2nd port as upper case
 | 
					
						
							| 
									
										
										
										
											2022-06-28 16:27:44 +07:00
										 |  |  |       if (islower(buf[i])) buf[i] -= case_diff; | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-01-11 12:59:02 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |     tud_cdc_n_write_char(itf, buf[i]); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   tud_cdc_n_write_flush(itf); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  | // Invoked when device is mounted
 | 
					
						
							|  |  |  | void tud_mount_cb(void) { | 
					
						
							|  |  |  |   blink_interval_ms = BLINK_MOUNTED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Invoked when device is unmounted
 | 
					
						
							|  |  |  | void tud_umount_cb(void) { | 
					
						
							|  |  |  |   blink_interval_ms = BLINK_NOT_MOUNTED; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // USB CDC
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  | static void cdc_task(void) { | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |   uint8_t itf; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  |   for (itf = 0; itf < CFG_TUD_CDC; itf++) { | 
					
						
							| 
									
										
										
										
											2020-11-24 00:06:59 +07:00
										 |  |  |     // connected() check for DTR bit
 | 
					
						
							|  |  |  |     // Most but not all terminal client set this when making connection
 | 
					
						
							| 
									
										
										
										
											2021-03-18 15:23:08 +07:00
										 |  |  |     // if ( tud_cdc_n_connected(itf) )
 | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  |       if (tud_cdc_n_available(itf)) { | 
					
						
							| 
									
										
										
										
											2020-11-18 09:47:39 +01:00
										 |  |  |         uint8_t buf[64]; | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-18 09:47:39 +01:00
										 |  |  |         uint32_t count = tud_cdc_n_read(itf, buf, sizeof(buf)); | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-11-18 09:47:39 +01:00
										 |  |  |         // echo back to both serial ports
 | 
					
						
							|  |  |  |         echo_serial_port(0, buf, count); | 
					
						
							|  |  |  |         echo_serial_port(1, buf, count); | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2019-12-22 18:18:54 -06:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-05 15:40:02 +07:00
										 |  |  | // Invoked when cdc when line state changed e.g connected/disconnected
 | 
					
						
							|  |  |  | // Use to reset to DFU when disconnect with 1200 bps
 | 
					
						
							|  |  |  | void tud_cdc_line_state_cb(uint8_t instance, bool dtr, bool rts) { | 
					
						
							|  |  |  |   (void)rts; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // DTR = false is counted as disconnected
 | 
					
						
							|  |  |  |   if (!dtr) { | 
					
						
							|  |  |  |     // touch1200 only with first CDC instance (Serial)
 | 
					
						
							|  |  |  |     if (instance == 0) { | 
					
						
							|  |  |  |       cdc_line_coding_t coding; | 
					
						
							|  |  |  |       tud_cdc_get_line_coding(&coding); | 
					
						
							|  |  |  |       if (coding.bit_rate == 1200) { | 
					
						
							|  |  |  |         if (board_reset_to_bootloader) { | 
					
						
							|  |  |  |           board_reset_to_bootloader(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 22:00:21 +07:00
										 |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | // BLINKING TASK
 | 
					
						
							|  |  |  | //--------------------------------------------------------------------+
 | 
					
						
							|  |  |  | void led_blinking_task(void) { | 
					
						
							|  |  |  |   static uint32_t start_ms = 0; | 
					
						
							|  |  |  |   static bool led_state = false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Blink every interval ms
 | 
					
						
							|  |  |  |   if (board_millis() - start_ms < blink_interval_ms) return; // not enough time
 | 
					
						
							|  |  |  |   start_ms += blink_interval_ms; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   board_led_write(led_state); | 
					
						
							|  |  |  |   led_state = 1 - led_state; // toggle
 | 
					
						
							|  |  |  | } |