|  |  |  | @ -25,85 +25,10 @@ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #include "usbcfg.h" | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | /*===========================================================================*/ | 
		
	
		
			
				|  |  |  |  | /* Command line related.                                                     */ | 
		
	
		
			
				|  |  |  |  | /*===========================================================================*/ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | #define SHELL_WA_SIZE   THD_WORKING_AREA_SIZE(2048) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | /* Can be measured using dd if=/dev/xxxx of=/dev/null bs=512 count=10000.*/ | 
		
	
		
			
				|  |  |  |  | static void cmd_write(BaseSequentialStream *chp, int argc, char *argv[]) { | 
		
	
		
			
				|  |  |  |  |   static uint8_t buf[] = | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef" | 
		
	
		
			
				|  |  |  |  |       "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   (void)argv; | 
		
	
		
			
				|  |  |  |  |   if (argc > 0) { | 
		
	
		
			
				|  |  |  |  |     chprintf(chp, "Usage: write\r\n"); | 
		
	
		
			
				|  |  |  |  |     return; | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   while (chnGetTimeout((BaseChannel *)chp, TIME_IMMEDIATE) == Q_TIMEOUT) { | 
		
	
		
			
				|  |  |  |  | #if 1 | 
		
	
		
			
				|  |  |  |  |     /* Writing in channel mode.*/ | 
		
	
		
			
				|  |  |  |  |     chnWrite(&SDU1, buf, sizeof buf - 1); | 
		
	
		
			
				|  |  |  |  | #else | 
		
	
		
			
				|  |  |  |  |     /* Writing in buffer mode.*/ | 
		
	
		
			
				|  |  |  |  |     (void) obqGetEmptyBufferTimeout(&SDU1.obqueue, TIME_INFINITE); | 
		
	
		
			
				|  |  |  |  |     memcpy(SDU1.obqueue.ptr, buf, SERIAL_USB_BUFFERS_SIZE); | 
		
	
		
			
				|  |  |  |  |     obqPostFullBuffer(&SDU1.obqueue, SERIAL_USB_BUFFERS_SIZE); | 
		
	
		
			
				|  |  |  |  | #endif | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  |   chprintf(chp, "\r\n\nstopped\r\n"); | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | static const ShellCommand commands[] = { | 
		
	
		
			
				|  |  |  |  |   {"write", cmd_write}, | 
		
	
		
			
				|  |  |  |  |   {NULL, NULL} | 
		
	
		
			
				|  |  |  |  | }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | static const ShellConfig shell_cfg1 = { | 
		
	
		
			
				|  |  |  |  |   (BaseSequentialStream *)&SDU1, | 
		
	
		
			
				|  |  |  |  |   commands | 
		
	
		
			
				|  |  |  |  | }; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | /*===========================================================================*/ | 
		
	
		
			
				|  |  |  |  | /* Generic code.                                                             */ | 
		
	
		
			
				|  |  |  |  | /*===========================================================================*/ | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | /*
 | 
		
	
		
			
				|  |  |  |  |  * LED blinker thread, times are in milliseconds. | 
		
	
		
			
				|  |  |  |  |  */ | 
		
	
		
			
				|  |  |  |  | static THD_WORKING_AREA(waThread1, 128); | 
		
	
		
			
				|  |  |  |  | static THD_FUNCTION(Thread1, arg) { | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   (void)arg; | 
		
	
		
			
				|  |  |  |  |   chRegSetThreadName("blinker"); | 
		
	
		
			
				|  |  |  |  |   while (true) { | 
		
	
		
			
				|  |  |  |  |     systime_t time; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |     time = serusbcfg.usbp->state == USB_ACTIVE ? 250 : 500; | 
		
	
		
			
				|  |  |  |  |     palClearLine(LINE_LED_RED); | 
		
	
		
			
				|  |  |  |  |     chThdSleepMilliseconds(time); | 
		
	
		
			
				|  |  |  |  |     palSetLine(LINE_LED_RED); | 
		
	
		
			
				|  |  |  |  |     chThdSleepMilliseconds(time); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | } | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | /*
 | 
		
	
		
			
				|  |  |  |  |  * Application entry point. | 
		
	
		
			
				|  |  |  |  |  */ | 
		
	
	
		
			
				
					|  |  |  | @ -119,42 +44,17 @@ int main(void) { | 
		
	
		
			
				|  |  |  |  |   halInit(); | 
		
	
		
			
				|  |  |  |  |   chSysInit(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   /*
 | 
		
	
		
			
				|  |  |  |  |    * Initializes a serial-over-USB CDC driver. | 
		
	
		
			
				|  |  |  |  |    */ | 
		
	
		
			
				|  |  |  |  |   sduObjectInit(&SDU1); | 
		
	
		
			
				|  |  |  |  |   sduStart(&SDU1, &serusbcfg); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   /*
 | 
		
	
		
			
				|  |  |  |  |    * Activates the USB driver and then the USB bus pull-up on D+. | 
		
	
		
			
				|  |  |  |  |    * Note, a delay is inserted in order to not have to disconnect the cable | 
		
	
		
			
				|  |  |  |  |    * after a reset. | 
		
	
		
			
				|  |  |  |  |    */ | 
		
	
		
			
				|  |  |  |  |   usbDisconnectBus(serusbcfg.usbp); | 
		
	
		
			
				|  |  |  |  |   usbDisconnectBus(&USBD1); | 
		
	
		
			
				|  |  |  |  |   chThdSleepMilliseconds(1500); | 
		
	
		
			
				|  |  |  |  |   usbStart(serusbcfg.usbp, &usbcfg); | 
		
	
		
			
				|  |  |  |  |   usbConnectBus(serusbcfg.usbp); | 
		
	
		
			
				|  |  |  |  |   usbStart(&USBD1, &usbcfg); | 
		
	
		
			
				|  |  |  |  |   usbConnectBus(&USBD1); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   /*
 | 
		
	
		
			
				|  |  |  |  |    * Shell manager initialization. | 
		
	
		
			
				|  |  |  |  |    */ | 
		
	
		
			
				|  |  |  |  |   shellInit(); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   /*
 | 
		
	
		
			
				|  |  |  |  |    * Creates the blinker thread. | 
		
	
		
			
				|  |  |  |  |    */ | 
		
	
		
			
				|  |  |  |  |   chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   /*
 | 
		
	
		
			
				|  |  |  |  |    * Normal main() thread activity, spawning shells. | 
		
	
		
			
				|  |  |  |  |    */ | 
		
	
		
			
				|  |  |  |  |   while (true) { | 
		
	
		
			
				|  |  |  |  |     if (SDU1.config->usbp->state == USB_ACTIVE) { | 
		
	
		
			
				|  |  |  |  |       thread_t *shelltp = chThdCreateFromHeap(NULL, SHELL_WA_SIZE, | 
		
	
		
			
				|  |  |  |  |                                               "shell", NORMALPRIO + 1, | 
		
	
		
			
				|  |  |  |  |                                               shellThread, (void *)&shell_cfg1); | 
		
	
		
			
				|  |  |  |  |       chThdWait(shelltp);               /* Waiting termination.             */ | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   while(true) { | 
		
	
		
			
				|  |  |  |  |     chThdSleepMilliseconds(1000); | 
		
	
		
			
				|  |  |  |  |   } | 
		
	
		
			
				|  |  |  |  | } | 
		
	
	
		
			
				
					|  |  |  | 
 |