Let us learn Arduino UNO Q step-by-step

1. On the UNO Q board, there is a four-core MPU (Mcroprocessor Unit, QRB2210, Fig-1) and a single-core MCU (Microcontroller Unit, STM32U585, Fig-1). By definition, an MPU does not contain memory in the same pacakge/die; whereas, an MCU does contain memory in the same package/die.



Figure-1: (at my coneptual level)

2. On the UNO Q board, there are four RGB leds which are marked as: QRB/1 2 (connected with MPU) and STM/3 4 (connected with MCU). The symbolic DPin (digital pin) numbers for these leds are respectively: (numerical values/Port-pins for these DPin numbers are shown in Fig-2)

LED1_R, LED1_G, LED1_B
LED2_R, LED2_G, LED2_B

LED3_R, LED3_G, LED3_B
LED4_R, LED4_G, LED4_B


Figure-2:

3. Arduino Sketch to blink LED3_R (Fig-1) at 2 sec interval using IDE 2.3.7. (tested ok)

void setup() 
{
   pinMode(LED3_R, OUTPUT);  //numerical value of LED3_R is not known to me
}

void loop() 
{
  digitalWrite(LED3_R, LOW);      // turn on led; in UNO Q the logic is active low
  delay(1000);                               // wait for a second
  digitalWrite(LED3_R, HIGH);   // turn led off by making the logic HIGH
  delay(1000);                             // wait for a second
}

4. Arduino Sketch to do color modulation/mixing for LED3_R/G/B (Fig-1).
... looks like analogWrite() function does not work!

5. Python Script to blink LED1_G (Fig-1) at 2 sec interval (1 sec On and 1 sec Off) (tested ok)

(1) Open App Lab, click on Examples, click on Blink LED icon, click on Copy and edit app, change the name to Blink LED1_G, and then click on Create new. You have got your new application.

(2) Goto the Editor window, open python file, and click on main.py. A window appears with a default script which is to be deleted. Now, copy and paste the following script which I have taken from this document: https://docs.arduino.cc/tutorials/uno-q/user-manual/#from-serial-to-monitor (To know what the python lines are doing -- place them line-by-line to ChatGPT who will explain and be careful to accept their opinon.)

import time

LED1_R = "/sys/class/leds/red:user/brightness"
LED1_G = "/sys/class/leds/green:user/brightness"
LED1_B = "/sys/class/leds/blue:user/brightness"

LED2_R = "/sys/class/leds/red:panic/brightness"
LED2_G = "/sys/class/leds/green:wlan/brightness"
LED2_B = "/sys/class/leds/blue:bt/brightness"

def set_led_brightness(led_file, value):
    try:
        with open(led_file, "w") as f:
            f.write(f"{value}\n")
    except Exception as e:
        print(f"Error writing to {led_file}: {e}")

def main():
  # turn off all LEDs
  set_led_brightness(LED1_R, 0)
  set_led_brightness(LED1_G, 0)
  set_led_brightness(LED1_B, 0)
  set_led_brightness(LED2_R, 0)
  set_led_brightness(LED2_G, 0)
  set_led_brightness(LED2_B, 0)

  while True:
    #blink the LED 1 GREEN segment
    set_led_brightness(LED1_G, 1)
    time.sleep(1)
    set_led_brightness(LED1_G, 0)
    time.sleep(1)

if __name__ == "__main__":
    main()

(3) Run the applicaton and check that LED1_G is blinking.

6. Passing ADC data from MCU to MPU using Router bridge


Figure-3:

Python Script for MPU (tested)

from arduino.app_utils import *
import time

last_print = 0
interval = 0.1  # seconds between loop checks

# A container to hold the latest ADC value
latest_adc = None

# This function will be called automatically when MCU sends notify
def on_adc(value):
    global latest_adc
    latest_adc = value

# Subscribe to MCU notifications
Bridge.provide("adc_data", on_adc)

def loop():
    global last_print, latest_adc
    current_time = time.time()
    
    # Check every 100ms if there is new data
    if latest_adc is not None and current_time - last_print >= 1:
        voltage = latest_adc * (3.3 / 1023.0)
        print(f"ADC: {latest_adc}, Voltage: {voltage:.3f} V") #shows on: Python console
        last_print = current_time

App.run(user_loop=loop)

Arduino Sketch for MCU (tested)

#include "Arduino_RouterBridge.h"

void setup() 
{
    analogReadResolution(10); 
    Monitor.begin();  
    Bridge.begin();           
}

void loop() 
{
    int adc = analogRead(A0);        
    Bridge.notify("adc_data", adc);   
    Monitor.println("Seding data to MPU."); //shows on: Serial Monitor of IDE and Console
    delay(1000);                       
}

7. Serial Communication Ports of STM32U585 MCU
(1) USART1
(2) USART2
(3) USART3

(4) UART4
(5) UART5

(6) LPUART1
(7) LPUART2

Q1: Which Serial port of the above is connected with
DPin-0 (RX) and DPin-1 (TX) pins of UNO Q?

Q2: What are the corresponding C++ object names for the above hardware ports. For example: Serial1 for UART1, .....

Q3: Which UART port is used by the Arduino_RouterBridge.h Library for inter-communication between MCU and MPU? I have read in the diagram of #4 of this thread that it is : LPUART1 (Serial1 at Bd = 115200).

8. The C++ compiler and the Python interpreter are pre-stored in eMMC storage media, then they are loaded into RAM, then executed by the MPU to generate the corresponding executable files, and then te sketch is flashed into MCU and the script remains in RAM for runtime execution. To be a bit more precise all those components are part of the pre-loaded Debian image of the UNO Q. ref: #21 #22.

As a result, the execution of the sketch in the MCU tends to begin earlier but is delayed until the MPU has started execution, which is have guaranteed in by including the following codes at the setup() function of the MCU sketch:

#include "Arduino_RouterBridge.h"

int data = 0;

void setup() {
  Bridge.begin();
  delay(2000);

  boolean start = false;

  // Wait until the python is started
  while(!start)
  {
    Bridge.call("linux_started").result(start);
  }
}

void loop() {
  data++;
  Bridge.notify("python_func", data);
  delay(1000);
}
from arduino.app_utils import *
import time

#used only for sync purposes
def linux_started():
  return True

def python_func (data: int):
  print(data)

Bridge.provide("linux_started", linux_started)
Bridge.provide("python_func", python_func)

def loop():
  time.sleep(1)

App.run(user_loop=loop)

9. SPI port operation of UNO Q and 74HC595 shift register
(1) 1. Connection diagram between Arduino UNO Q and 74HC595 shift register using SPI port.

(2) Reeceive Newline terminated string of decimal digits from InputBox of APp Lab Console.Serial Monitor, extract the single-valued decimal number, save it and then transmits to 74C595 shift register over SPI port. The received number would also be shown on Console.python.

Sketch:

#include <Arduino_RouterBridge.h>
#include <SPI.h>

const int storePin = 10;  // ST_CP
char myData[10];

void setup() 
{
  Bridge.begin();
  Monitor.begin();
  pinMode(storePin, OUTPUT);
  SPI.begin();
  SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
  digitalWrite(storePin, LOW);  // Prepare latch
  //--------------------
  SPI.transfer(0b10101010);      // 0xAA
  digitalWrite(storePin, HIGH);  // Output appears on Q0–Q7
  delayMicroseconds(5);
  digitalWrite(storePin, LOW);
}

void loop() 
{
  byte n = Monitor.available();
  if (n != 0) 
{
    byte m = Monitor.readBytesUntil('\n', myData, sizeof myData - 1);
    myData[m] = '\0';
    byte y = atoi(myData);
    Monitor.println(y, BIN);
    Bridge.notify("data_sm", y);
    //--------------------
    SPI.transfer(y);               // 0xAA
    digitalWrite(storePin, HIGH);  // Output appears on Q0–Q7
    delayMicroseconds(5);
    digitalWrite(storePin, LOW);
  }
}

Script:

from arduino.app_utils import *
import time

# This function will be called automatically when MCU sends notify
def data_sm(value):
    print(value)

# Subscribe to MCU notifications
Bridge.provide("data_sm", data_sm)

def loop():
    time.sleep(1)

App.run(user_loop=loop)

10. Troubleshooting Tips
If it happens that you cannot run any application from App Lab that involves Bridge.provide()/call()/notify(), then carryout the following tasks:

(1) From linux terminal (>_) of App Lab, type the following and then press Enter key.
arduino-app-cli system cleanup

(2) Then type the following and then press Enter key.
docker network prune

10. Electrical Characteristics of an IO Pin

11. Negative Logic to turn on LED_BUILTIN of UNO Q Board
UNO Q represents a remarkable migration from the UNO R3 platform. However, in the UNO Q board design, the onboard LED (LED_BUILTIN = LED3_R, lebeled STM-3) is implemented using active-LOW (negative) logic, meaning the LED turns ON when its cathode terminal is pulled LOW (Fig-1).

In contrast, on the UNO R3, the LED_BUILTIN is implemented using active-HIGH (positive) logic, where the cathode is permanently grounded and the LED turns ON when a HIGH level is applied to its anode terminal.

Since LED_BUILTIN on the UNO Q is not driven from header pin D13, the board designers likely had valid architectural or electrical reasons for choosing an active-LOW configuration in this case. It is worth noting that all header GPIO pins on the UNO Q continue to follow positive logic, consistent with the behavior of the UNO R3 header pins.

12. Procedures to update software (Linux, Compiler, Interpreter, Zephyr) into UNO Q
I have carried out the following steps from this Arduino Documents https://docs.arduino.cc/tutorials/uno-q/update-image/) to update software (Debian Linux Operating System and others) in my UNO Q board :

(1) I have downloaded Arduino Flasher CLI software and have unziped it under the same folder where the zip file is saved. I have copied this folder: arduino-flasher-cli-0.5.3-windows-amd64> from unzipped path under C drive.

(2) I have unplugged the board from PC.

(3) I have shorted the following two-pins (red wire, Fig-1) to bring the board into OS updating mode.

Figure-1:
(4) I have connected back the UNO Q board with PC.

(5) From the Start icon of the PC, I have executed cmd.exe to get text screen.

(6) I have changed the directory to:
C:\arduino-flasher-cli-0.5.3-windows-amd64>

(7) From the command prompt of Step-6, I have executed the following command:
arduino-flasher-cli

(8) After a while, the prompt has come back and then I have executed the folloiwng command from the prompt:
arduino-flasher-cli flash latest

(9) That statred the downloading of the Debian image of size 2.4 GB.

(10) I have waited until the image is completely downloaded and then have entered yes in response to queries.

(11) Ulltimately, the image was flashed into UNO Q board with the following message:

The board has been successfully flashed. You can now power-cycle the board (unplug and re-plug). Remember to remove the jumper.

(12) I have taken out the board from PC, removed the jumper, and connected back the board with PC.

(13) I have launced the App Lab and then have clicked on Blink LED icon and then on Run button. After a while, the led-3 has started blinking.

13. Scrpt and Script Loading in MPU and MCU
(1) IDE 2.3.7 based sketch is compiled in the PC. The application file (in Intel-Hex format) is transmitted to the MPU which extracts the binary codes and then writes them into Flash or RAM (Tools ---> Flash mode: Flash or RAM) of the MCU using boot loader based ISP Programmer (Fig-1).

(2) App Lab based sketch is compiled in the MPU using a pre-installed C++ compiler. After that the MPU writes the binary codes of the sketch into RAM (no option for Flash like IDE based sketch) of the MCU using boot loader based ISP Programmer.

(3) When we create a new app (application) in App Lab (My Apps ---> Create new app+ ---> + Create New App ---> Test-1 (Insert title) ---> Create new) for an application (sketch+ script), the following two components appear in the espective Edit Window by default.

(My Apps ---> Test-1 ---> Files ---> sketch ---> sketch)
Sketch:

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}

(My Apps ---> Test-1 ---> Files ---> pyhon ---> main.py)
Script:

import time

from arduino.app_utils import App

print("Hello world!")


def loop():
    """This function is called repeatedly by the App framework."""
    # You can replace this with any code you want your App to run repeatedly.
    time.sleep(10)


# See: https://docs.arduino.cc/software/app-lab/tutorials/getting-started/#app-run
App.run(user_loop=loop)

(4) We enter our Arduino codes into Editor>>sketch.ino window. For example, the following codes to blink the LED_BUILTIN (LED3_R) led.

#include <Arduino_RouterBridge.h>

void setup() {
  Bridge.begin();
  Monitor.begin();
  delay(5000);

  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {

  digitalWrite(LED_BUILTIN, LOW);   // active LOW; turn LED on
  delay(1000);                      //1000 ms
  digitalWrite(LED_BUILTIN, HIGH);  // active low,LED off
  delay(1000);                      // wait for a second
}

(5) We do not do anything with the default script of Editor>>main.py window.

(6) When we click on the RUN button, the source codes of both the sketch and the script are transferred to the MPU (which one goes firts?); where, the script is interpreted by a pre-installed Python Interpreter and the application codes are written into the 2 GB RAM space. Here, the python script does not do anything useful except suspending the loop() thread in every 10 sec with the help of the resident Linux OS.

(7) The source codes of the sketch are compiled by the MPU with the assistance of a pre-installed C++ compiler, the binary codes are written into RAM of MCU, and then the LED_BUILTIN starts blinking at every 2 sec intervals.

14. What are "IDE: Serial Monitor Console", "IDE: Serial Monitor", "App Lab: Serial Monitor Console", "App Lab: Python Console"

I have prepared this tutorial to explain and clarify the definitions of the objects mentioned in the title. I would greatly appreciate feedback to correct any misconceptions if any from my part.

With the advent of UNO Q Board, we have the following monitoring/communicating windows (Fig-1):

  • Arduino IDE: Serial Monitor Console (Monitor object driven console window frpm Arduino skech)

  • Ardino IDE: Serial Monitor (Serial object driven console window from Arduino Sketch)

  • App Lab: Serial Monitor Console (Monitor object driven console window Arduino sketch)

  • App Lab: Python Console (print driven console window from Python script)


Figure-1:
//====================================================

1. Arduino IDE: Serial Monitor Console
This console window communicates with the MCU of UNO Q board in the followin path (Fig-1)

Arduino IDE 2.3.7 ----> Serial Monitor Console <----> virtual COMX Port in PC <----> USB-A Port of PC <----> USB-C Port of UNO Q <----> MPU <----> Router Bridge <-----> flash of MCU

Test Sketch: Hello message appears on Serial Monitor Console
Use IDE 2.3.7 to upload the following sketch into the flash of MCU and check the message Hello appears on the Serial Monitor Console.

#include <Arduino_RouterBridge.h>

void setup() {
  Bridge.begin();
  Monitor.begin(); //creates Serial Monitor Console
  delay(5000);
  }

void loop() {

  Monitor.println("Hello");
  delay(1000);                      // wait for a second
}

//=====================================================

2. Arduino IDE: Serial Monitor
This console window communicates with the MCU of UNO Q board in the following path (Fig-1). From this IDE, it is not possible to upload sketch into flash of MCU.

Arduino IDE 1.8.19 ---> Serial Monitor <----> virtaul COMX Port in PC <----> USB-A Port of PC<----> USB to TTL Converter <----> RX/TX Pins of Header of UNO Q (MCU's UART1 Port) <-----> flash of MCU

Test sketch: Welcome message appears on Serial Monitor
(a) Connect UNO Q, PC, TTL<--->USB Converter as per Fig-2 (tested).


Figure-2:

(b) Use IDE 2.3.7 to upload the following sketch into flash of MCU.

#include <Arduino_RouterBridge.h>

void setup() {
  Bridge.begin();
  Monitor.begin();
  delay(5000);
  Serial.begin(9600);   //creates Serial Monitor
  }

void loop() {

  Monitor.println("Hello");
  Serial.println("welcome");
  delay(1000);                      // wait for a second
}

(c) Open IDE 1.8.19 and open Serial Monitor at Bd = 9600. Check that Welcome message appears on the Serial Monior.
//========================================================

3. App Lab: Serial Monitor Console
This window communicates with MCU of UNO Q board in this way (Fig-1):
Arduino IDE 2.3.7 ----> Serial Monitor Console <----> virtual COMX Port in PC <----> USB-A Port of PC <----> USB-C Port of UNO Q <----> MPU <----> Router Bridge <-----> (after compilation) flash of MCU

Test Sketch: MCU message appers on Serial Monitor Console of App Lab.
(a) Close IDE2.3.7 and IDE 1.8.19
(b) Open App Lab and then My Apps ----> create new app + -----> +Create New App -----> serailTest ----> Create new

(c) Editor ---> sketch ----> sketch and delete whatever is there.
(d) Copy and paste the following sketch.

#include <Arduino_RouterBridge.h>

void setup() {
  Bridge.begin();
  Monitor.begin(); //creates Serial Monitor Console
  delay(5000);
  }

void loop() {

  Monitor.println("MCU");
  delay(1000);                      // wait for a second
}

(e) Click on Run button.
(f) Go to: Console ----> Serial Monior (this is App Lab: Serial Moitor Console)
(g) works OK!
//========================================================

4. App Lab: Python Console
The window communicates with the MPU in this way (Fig-1).

App Lab ----> USB-A Port of PC ----> USB-C Port of UNO Q ----> (after interpretation) RAM MPU

Python Console <---- USB-A Port of PC <---- USB-C Port of UNO Q <---- RAM MPU

Teast Sketch: MPU message appers on Python Console
(a) App Lab ----> My Apps ----> serialTest --- > python ---> main.py ----> delete watever is there and then paste the following codes:

import time

def main():
    while True:
        print("UNO Q")
        time.sleep(1)

if __name__ == "__main__":
    main()

(b) Click on Run button
(c) Go to: Console ----> Python (this is the Python Console) and check that UNO Q message appears here.
//===========================================================

15. ???
... in progress

Is there a question, or should this be in the showcase category, or perhaps a tutorial?

I would describe this work as a kind of notebook that may serve as a quick source of information (mostly at conceptual level) for both myself and readers. I welcome questions from readers and will incorporate the answers (known from my own knowledge or from readers’ contributions) at the appropriate places in the text.

I would prefer to see this thread under the present category.

Did you create figure 1 or is there another source for this? That is not how I imagined the connection to the USB.

Page 13 of the user manual:

It looks here like the USB connects to the MPU and the MPU then connects to the MCU.

1. I have created Fig-1 of post #1 based on my conceptual understanding that the MCU remains electrically isolated from the MPU during sketch uploading, and vice versa. SWA and SWB are shown to represent this isolation, which may be implemented either through parallel signal paths or through a daisy-chained arrangement.

2. I have illustrated a purely hardware-based ISP programmer for Flash programming of both the MCU and the MPU, borrowing concepts from the ATmega328P. In reality, however, it may be that USB signal decoding and the subsequent Flash programming process are largely software-driven, implemented through a bootloader. I have gone through the STM32U585 datasheet but have not found detailed information on the Flash programming mechanism. I would be glad to receive any information you may have in this regard.

3. I am studying the diagram in your post #4 to obtain more realistic information about the actual hardware connectivity, after which I plan to update my conceptual diagram shown in Fig-1 of post #1.

4. Also, I do not have documentary confirmation that UART2 is used by the Bridge tool for message exchange between the MPU and the MCU. This assumption is based on the observation that UART2 is not available on the header pins of the Arduino UNO Q board.

5. Arduino official diagram in post #4 indicates two additional interfaces (SPI3 and SW) for inter-communication between the MPU and the MCU. Have these interfaces been implemented in the current hardware and software design?

I have been told that when using AppLab the MCU program is loaded into RAM and not Flash. When using the Arduino IDE 2 one has a choice to load the MCU program into either Flash or RAM. I am under the impression that previous Arduino boards use a bootloader. Devices that I am familiar with that use in circuit programming usually make use of a hardware ISP programmer/debugger.
As I said previously the documentation from Arduino shows a connection from the USB to the MPU. It makes it looks as though the MPU acts as a programmer for the MCU.

During ATmega328P uploading process using IDE, it is the bootloader based programmer inside the MCU that collects code/data from its UART port, decode them, and then write them into its flash memory

I think similar programming strategy exists for MPU/MCU programming of UNO Q except that I am not sure if it is the UART or USB port of the processor.

Now, I undersatnd this is how (Fig-1) code writing takes place inside the flash.

Figure-1:

Dear @GolamMostafa, SWD is a Hardware Block not like Boot Loader in UNO R3. Boot Loader(actually Zephyr RTOS) also can be flashed with SWD (remoteocd & openocd)

  MPU SE1*: jlink/SWD  <-> MCU SWD
    SOC GPIO  25       <-> UNO Q MCU SWDIO (STM32 SWD Data)
    SOC GPIO  26       <-> UNO Q MCU SWCLK (STM32 SWD Clock)
    SOC GPIO  38       <-> UNO Q MCU SRST TRST (Reset)
    SOC GPIO  37       <-> UNO Q MCU BOOT0 (Boot Mode)
*SE1 : Serial Engine 1

Until now I can find total 6 Serial Engines used in UNO Q MPU:

[SE0] 4a80000.serial
  - Name: JMISC / J37
  - Connection: External Expansion Headers (User UART / I2C)
  - Purpose: Connecting external sensors and devices directly to the Qualcomm MPU

[SE1] 4a84000.serial
  - Name: MCU SWD & SYNC Control
  - Connection: STM32U585 MCU Debug & Control Interface
  - Pin Mapping (/dev/gpiochip1):
    * GPIO 25 -> SWDIO (Serial Wire Data Input/Output)
    * GPIO 26 -> SWCLK (Serial Wire Clock)
    * GPIO 38 -> SRST / TRST (Hardware System Reset)
    * GPIO 70 -> Triggers MCU Boot Animation
  - Purpose: Firmware flashing via OpenOCD, hardware reset, and boot sync

[SE2] 4a88000.serial
  - Name: MCU LPUART1 Bridge
  - Connection: /dev/ttyHS1 <-> STM32U585 LPUART1
  - Protocol: RPC (Remote Procedure Call) Bridge
  - Purpose: Main inter-processor communication (IPC) for Arduino sketches

[SE3] 4a8c000.serial
  - Name: Bluetooth / Wi-Fi
  - Connection: /dev/ttyHS2
  - Purpose: Controlling the on-board Qualcomm wireless connectivity module

[SE4] 4a90000.serial
  - Name: JCTL Debug Console
  - Connection: /dev/ttyMSM0
  - Purpose: Linux OS system debugging and serial command-line console

[SE5] 4a94000.serial
  - Name: MCU SPI3 Data Bus
  - Connection: /dev/spidev0.0 <-> STM32U585 SPI3
  - Purpose: High-speed hardware synchronous data bus between MPU and MCU

And pin mapping:

  . SE0: User Configurable (Header Pins / JMISC)
     Default Node: /dev/ttyHS0 or /dev/spidev1.0
     MOSI/TX - SOC GPIO   0        -> JMISC Connector Pin 37
     MISO/RX - SOC GPIO   1       <-  JMISC Connector Pin 39
     CS/CTS  - SOC GPIO   2       <-> JMISC Connector Pin 41
     CLK/RTS - SOC GPIO   3        -> JMISC Connector Pin 43
               SOC GPIO  86       <-> JMISC Connector Pin 45
               SOC GPIO  82       <-> JMISC Connector Pin 47
 
               SOC GPIO  18       <-> JMISC Connector Pin 49
               SOC GPIO  28       <-> JMISC Connector Pin 51

  . SE1: JTAG / Debug Bridge
            SOC GPIO  25       <-> UNO Q MCU SWDIO (STM32 SWD Data)
            SOC GPIO  26       <-> UNO Q MCU SWCLK (STM32 SWD Clock)
            SOC GPIO  38       <-> UNO Q MCU SRST TRST (Reset)
*           SOC GPIO  37       <-> UNO Q MCU BOOT0 (Boot Mode)

  . SE2: /dev/ttyHS1 (Main MCU Inter-Processor Communication Channel)
     TX   - SOC GPIO  71       <-> UNO Q MCU LPUART1 RX  PG7
     RX   - SOC GPIO  80       <-> UNO Q MCU LPUART1 TX  PG8
     CTS  - SOC GPIO   6       <-> UNO Q MCU LPUART1 RTS PG5
     RTS  - SOC GPIO   7       <-> UNO Q MCU LPUART1 CTS PG6

  . SE3: /dev/ttyHS2 (On-board Wireless Connectivity)
     TX   - SOC GPIO  10       <-> Bluetooth RX
     RX   - SOC GPIO  11       <-> Bluetooth TX
     RTS  - SOC GPIO   9       <-> Bluetooth CTS
     CTS  - SOC GPIO   8       <-> Bluetooth RTS

  . SE4: /dev/ttyMSM0 (* twisted debug console / JCTL)
     TX   - SOC GPIO  12       <-> JCTL1 4 RX
     RX   - SOC GPIO  13       <-> JCTL1 6 TX 

  . SE5: /dev/spidev0.0 (* High-speed Data Bridge, default not supported on basic SDK)
     CS   - SOC GPIO  17       <-> UNO Q MCU SPI3 CS     PG12
     RDY  - SOC GPIO  70       <-> UNO Q MCU SPI3 READY  PG13
     CLK  - SOC GPIO  16       <-> UNO Q MCU SPI3 CLK    PG9
     MISO - SOC GPIO  15       <-> UNO Q MCU SPI3 MOSI   PG10
     MOSI - SOC GPIO  14       <-> UNO Q MCU SPI3 MOSI   PB5

I have drawn the path to get an understanding at conceptual level of how Intel-Hex formatted file from App Lab/IDE get written into the flash of MCU. Putting the word (bootloader) within parentheses, I have wanted to mean someting similar to UNO R3's bootloader.

Thank you for your exploration to find various communication peripherals at the MPU/MCU side.

MPU is 1.8V device and MCU is 3.3V device. Does MPU contain onboard level shifters or offboard level shifters?

In drawing, 2. MCU SWD and 3. SoC SWDIO/SWCLK are the same thing, but 2. is described to Do not exist, and 3. is described as different. This could cause misunderstanding.

Then in Fig-1 of post #8, are the following lines belong to single SWD Logic?
2. MU SWD
3. SoC SWDIO/SWCLK

Does the following ChatGPT generated Block Diagram (Fig-1) for the QRB2210 MPU contain any erroneous hardware items?


Figure-1:

In Page 13 of the user manual, SoC SWDIO/SWCLK are connected to MCU. And also MCU SWD lines are connected with SoC. So those lines look like same SWD interface lines.

Qualcomm QRB2210 MPU has several Serial Engines which can be used for SPI, UART, I2C or SWDIO. SE1 also is used for SWD interface with MCU. As I posted in a pin mapping, I couldn't find out any more hardware signal lines connected with MPU and MCU for SWD interface.

You can find out connections in Arduino UNO Q schematics especially in page 9 and 19:

image

In EEE-3109/3110 Microprocessor and Microcontroller Theory/Lab Class of EEE Department of Ahsanullah University of Science and Technology, we have introduced the state-of-art Dual-brain Arduino UNO Q architecture based on 64-bit 4-core QRB2210 MPU and 32-bit STM32U585 MCU.

EEE-3109 Theory Coursee Plan: (2nd Half Semeter: 7 Weeks, 21 Classes)
1. UNO Q Board Hardware Components Layout: 3x50 mins
2. QRB2210 Micrprpocessor Hardware: 3x50 mins
3. STM32U585 Microcontroller Hardware: 3x50 mins
4. Linux Operating system: 3x50 mins
5. Zephyr RTOS Operating System: 3x50 mins
6. Python Programming Language: 3x50 mins
7. C++ Programming Language: 3x50 mins

EEE-3110 Lab Course Plan: (2nd Half Semester, 7 week, 7 Lab Classes)
Based oon EE-3109

Note: Ist half semester (7 weeks, 50 mins x 21 classes) are taught 8-bit ATme328P MCU using Arduino UNO R3
1. Architecture
2. Digital IO Controller
3. ADC
4. UART
5. I2C
6. SPI
7. Timer/Counter

Then can I erase MCU SWD block from Fig-1 of post #8? As a result, the revised diagram would stand as Fig-1.


Figure-1: