Unfortunately not all the six ports can be activate simultaneously. I suppose that it's due to a bug in the Kernel driver.
Using this device three I have enabled up to 3 USARTs and 2 UARTs
To test it just save this file in the /boot directory of Aria G25 or in the first microSD partition. I have used this image (Kernel Linux 4.19.128 - Debian Buster 10) to try.
To check the serial port enabled type this command:
acme@aria:~$ dmesg | grep serial
[ 0.359375] fffff200.serial: ttyS0 at MMIO 0xfffff200 (irq = 16, base_baud = 8333333) is a ATMEL_SERIAL
[ 0.679687] f801c000.serial: ttyS1 at MMIO 0xf801c000 (irq = 23, base_baud = 8333333) is a ATMEL_SERIAL
[ 0.687500] f8020000.serial: ttyS2 at MMIO 0xf8020000 (irq = 24, base_baud = 8333333) is a ATMEL_SERIAL
[ 0.695312] f8024000.serial: ttyS3 at MMIO 0xf8024000 (irq = 25, base_baud = 8333333) is a ATMEL_SERIAL
[ 0.710937] f8040000.serial: ttyS4 at MMIO 0xf8040000 (irq = 26, base_baud = 8333333) is a ATMEL_SERIAL
[ 0.718750] f8044000.serial: ttyS5 at MMIO 0xf8044000 (irq = 27, base_baud = 8333333) is a ATMEL_SERIAL
To see the devices activated type:
acme@aria:~$ ls -al /dev/ttyS*
crw------- 1 acme tty 4, 64 Mar 4 19:07 /dev/ttyS0
crw-rw---- 1 root dialout 4, 65 Mar 4 18:56 /dev/ttyS1
crw-rw---- 1 root dialout 4, 66 Mar 4 18:56 /dev/ttyS2
crw-rw---- 1 root dialout 4, 67 Mar 4 18:56 /dev/ttyS3
crw-rw---- 1 root dialout 4, 68 Mar 4 18:56 /dev/ttyS4
crw-rw---- 1 root dialout 4, 69 Mar 4 18:56 /dev/ttyS5
Signal | Dir | Description | Aria G25 |
---|---|---|---|
TXD0 | O | Transmit data | S23 (PA0) |
RXD0 | I | Receive data | S22 (PA1) |
RTS0 | O | Request to send | S21 (PA2) |
CTS0 | I | Clear to send | S20 (PA3) |
usart0: serial@f801c000 {
status = "okay";
};
Signal | Dir | Description | Aria G25 |
---|---|---|---|
TXD1 | O | Transmit data | S18 (PA5) |
RXD1 | I | Receive data | S17 (PA6) |
RTS1 | O | Request to send | E7 (PC27) |
CTS1 | I | Clear to send | E8 (PC28) |
usart1: serial@f8020000 {
status = "okay";
};
Signal | Dir | Description | Aria G25 |
---|---|---|---|
TXD2 | O | Transmit data | S16 (PA7) |
RXD2 | I | Receive data | S15 (PA8) |
RTS2 | O | Request to send | |
CTS2 | I | Clear to send |
usart2: serial@f8024000 {
status = "okay";
};
Signal | Dir | Description | Aria G25 |
---|---|---|---|
TXD3 | O | Transmit data | E2 (PC22) |
RXD3 | I | Receive data | E3 (PC23) |
RTS3 | O | Request to send | E4 (PC24) |
CTS3 | I | Clear to send | E5 (PC25) |
usart3: serial@f8028000 {
status = "okay";
};
Signal | Dir | Description | Aria G25 |
---|---|---|---|
UTXD0 | O | Transmit data | N10 (PC8) |
URXD0 | I | Receive data | N11 (PC9) |
uart0: serial@f8040000 {
status = "okay";
};
Signal | Dir | Description | Aria G25 |
---|---|---|---|
UTXD1 | O | Transmit data | N18 (PC16) |
URXD1 | I | Receive data | N19 (PC17) |
uart1: serial@f8044000 {
status = "okay";
};
The debug port is used just for the boot message
Signal | Dir | Description | Aria G25 |
---|---|---|---|
DTXD | O | Debug port tx data | S13 (PA10) |
DRXD | I | Debug port rx data | S14 (PA9) |
dbgu: serial@fffff200 {
status = "okay";
};
Install Python3 and Python Serial by typing:
sudo apt update
sudo apt install python3 python3-serial
Use this basic example or go to pySerial library web site:
import serial
import time
ser = serial.Serial(
port='/dev/ttyS1',
baudrate=460800,
timeout=1,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS
)
for packet in range(100):
for value in range(10):
for i in range(50):
ser.write(chr(value+0x30).encode())
ser.write(b'\r\n')
ser.write(b'\r\n\n')
print(packet)
ser.flush()
time.sleep(1)
ser.close()
Read any bytes received on serial line and print out on stdout in hex format:
import sys import serial ser = serial.Serial( port='/dev/ttyUSB1', baudrate=9600, timeout=1, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS ) linecounter=0 bytecounter=0 bytesperline = 8 while True: bytesToRead = ser.inWaiting() if bytesToRead>0: value=ser.read(1) if (bytecounter % bytesperline) == 0: print "\n[%04X] - " % bytecounter , sys.stdout.flush() linecounter=linecounter+1 print "%02X " % ord(value) , sys.stdout.flush() bytecounter=bytecounter+1 if bytecounter==0: print bytecounter=0
This is a basic example on how to use a serial port in C.
Refer to these links to understand how it works.
#include "stdio.h" #include "string.h" #include "unistd.h" #include "fcntl.h" #include "errno.h" #include "sys/types.h" #include "sys/stat.h" #include "stdlib.h" #include "stdarg.h" #include "termios.h" int main(void) { char txBuffer[10]; char rxBuffer[10]; int fd; struct termios tty_attributes; if ((fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY|O_NONBLOCK))<0) { fprintf (stderr,"Open error on %s\n", strerror(errno)); exit(EXIT_FAILURE); } else { tcgetattr(fd,&tty_attributes); // c_cflag // Enable receiver tty_attributes.c_cflag |= CREAD; // 8 data bit tty_attributes.c_cflag |= CS8; // c_iflag // Ignore framing errors and parity errors. tty_attributes.c_iflag |= IGNPAR; // c_lflag // DISABLE canonical mode. // Disables the special characters EOF, EOL, EOL2, // ERASE, KILL, LNEXT, REPRINT, STATUS, and WERASE, and buffers by lines. // DISABLE this: Echo input characters. tty_attributes.c_lflag &= ~(ICANON); tty_attributes.c_lflag &= ~(ECHO); // DISABLE this: If ICANON is also set, the ERASE character erases the preceding input // character, and WERASE erases the preceding word. tty_attributes.c_lflag &= ~(ECHOE); // DISABLE this: When any of the characters INTR, QUIT, SUSP, or DSUSP are received, generate the corresponding signal. tty_attributes.c_lflag &= ~(ISIG); // Minimum number of characters for non-canonical read. tty_attributes.c_cc[VMIN]=1; // Timeout in deciseconds for non-canonical read. tty_attributes.c_cc[VTIME]=0; // Set the baud rate cfsetospeed(&tty_attributes,B9600); cfsetispeed(&tty_attributes,B9600); tcsetattr(fd, TCSANOW, &tty_attributes); txBuffer[0]='A'; write(fd,txBuffer,1); // Read a char if (read(fd,&rxBuffer,1)==1) { printf("%c",rxBuffer[0]); printf("\n"); } } close(fd); return EXIT_SUCCESS; }