58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// NOTE: make sure you disable the Arduino reset when using it as a serial terminal
 | 
						|
// run: `systemctl enable serial-getty@ttyACM0.service` (or the appropriate Arduino serial device 
 | 
						|
// edit: `/etc/systemd/system/getty.target.wants/serial-getty@ttyACM0.service`
 | 
						|
// and change
 | 
						|
// ExecStart=...... $TERM
 | 
						|
// into:
 | 
						|
// ExecStart=...... vt52
 | 
						|
// then run: `systemctl daemon-reload`
 | 
						|
// and: `systemctl restart serial-getty@ttyACM0.service`
 | 
						|
 | 
						|
#define SERIAL_BUFFER_SIZE 1024
 | 
						|
 | 
						|
//from https://forum.arduino.cc/index.php?topic=52111.0
 | 
						|
#include "pins_arduino.h"
 | 
						|
 | 
						|
volatile char serialByte = 0;
 | 
						|
volatile char spiByte = 0;
 | 
						|
 | 
						|
void setup (void)
 | 
						|
{
 | 
						|
  // Note: The Atmega16u2 uses U2X mode, where 300 baud isn't possible
 | 
						|
  // CH340G has a minimum of 2400 baud
 | 
						|
  // https://github.com/arduino/ArduinoCore-avr/issues/265
 | 
						|
  // Fetch updated firmware from: https://github.com/facchinm/Arduino_avrusb_firmware/tree/master/arduino-usbserial
 | 
						|
  // https://www.arduino.cc/en/Hacking/DFUProgramming8U2
 | 
						|
  // see https://forum.arduino.cc/index.php?topic=385567.0
 | 
						|
  Serial.begin( 300 );
 | 
						|
 | 
						|
  // have to send on master in, *slave out*
 | 
						|
  pinMode(MISO, OUTPUT);
 | 
						|
 | 
						|
  // turn on SPI in slave mode
 | 
						|
  SPCR |= _BV(SPE);
 | 
						|
 | 
						|
  // turn on interrupts
 | 
						|
  SPCR |= _BV(SPIE);
 | 
						|
}
 | 
						|
 | 
						|
// SPI interrupt routine
 | 
						|
ISR (SPI_STC_vect)
 | 
						|
{
 | 
						|
  spiByte = SPDR;
 | 
						|
  SPDR = serialByte;
 | 
						|
  serialByte = 0;
 | 
						|
}
 | 
						|
 | 
						|
// main loop - wait for flag set in interrupt routine
 | 
						|
void loop (void)
 | 
						|
{
 | 
						|
  if ( spiByte && spiByte > 0 )
 | 
						|
  {
 | 
						|
    Serial.print( spiByte );
 | 
						|
    spiByte = 0;
 | 
						|
  }
 | 
						|
  if ( !serialByte && Serial.available() )
 | 
						|
    serialByte = Serial.read();  
 | 
						|
}
 |