Hi all!
We have:
Module Nvidia Jetson Orin NX 16 Gb,
Connect Tech Boson Carrier Board for NVIDIA® Jetson Orin™ NX (https://connecttech.com/product/boson-for-framos-carrier-board-for-nvidia-jetson-orin-nx/),
BSP from Connect Tech JetPack 5.1.1 – L4T r35.3.1 - Orin NX L4T r35.3.1 BSP.
I installed the relevant software components using the sdkmanager package manager. I downloaded the sources to the sources folder. I copied Orin NX L4T r35.3.1 BSP to nvidia_sdk/JetPack_5.1.1_Linux_JETSON_ORIN_NX_TARGETS/Linux_for_Tegra/, unpacked it and did it according to the instructions.
The task is this: the changed GPIOs must be flashed onto the Boson Carrier Board along with the Orin NX 16 Gb and toggled.
Required gpio’s - GPIO0 and GPIO4. There is program code below that will toggle values.
We were given files with modified GPIOs (gpio.dtsi, padvoltage.dtsi, pinmux.dtsi). Generated using Jetson_Orin_NX_series_and_Orin_Nano_series_Pinmux_Config_Template.xlsm. According to instructions
Jetson Orin NX Series — Jetson Linux Developer Guide documentation ,
copy the padvoltage.dtsi and pinmux.dtsi files to the <l4t_top>/bootloader/t186ref/BCT/ directory and copy the gpio.dtsi file to the <l4t_top>/bootloader/ directory. From Linux_for_Tegra/CTI-L4T/conf/cti/orin-nx/boson copied base.conf to Linux_for_Tegra/, Linux_for_Tegra/CTI-L4T/conf copied cti-orin-nx.conf.common to /Linux_for_Tegra/
I changed file base.conf:
source "${LDK_DIR}/cti-orin-nx.conf.common";
DTB_FILE="tegra234-orin-nx-cti-NGX007.dtb";
PINMUX_CONFIG="**pinmux.dtsi**"; <<
DEFAULT_EMC_FUSE="0";
PMC_CONFIG="**padvoltage.dtsi**"; <<
BPFDTB_FILE="tegra234-bpmp-3767-0000-a02-3509-a02.dtb";
TBCDTB_FILE="${DTB_FILE}";
EMMC_CFG="flash_t234_qspi_sd.xml";
MB2_BCT="tegra234-cti-orin-nx-mb2-bct-misc.dts";
ext_target_board=cti-orin-nx-ngx007-00;
Saved file and run in terminal:
$ sudo ./tools/kernel_flash/l4t_initrd_flash.sh --external-device nvme0n1p1 \
-c tools/kernel_flash/flash_l4t_external.xml -p "-c bootloader/t186ref/cfg/flash_t234_qspi.xml" \
--showlogs --network usb0 base internal
The firmware was successful, now we had to check the GPIO - toggle gpio’s. Perhaps I did it right?
Further,
GPIO0 - SODIMM pin - 87 gpio number 479 PZ.01
GPIO4 - SODIMM pin - 127 gpio number 329 PCC.01
In terminal I run commands:
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# echo PZ.01 > /sys/class/gpio/export
bash: echo: write error: Device or resource busy
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# ls -l /sys/class/gpio/export
--w------- 1 root root 4096 Dec 28 09:20 /sys/class/gpio/export
root@demon-desktop:/home/demon# ls -l /sys/class/gpio/
export gpiochip300/ gpiochip316/ gpiochip348/ unexport
root@demon-desktop:/home/demon# ls -l /sys/class/gpio/
total 0
--w------- 1 root root 4096 Dec 28 09:20 export
lrwxrwxrwx 1 root root 0 Sep 8 2022 gpiochip300 -> ../../devices/platform/c250000.i2c/i2c-7/7-0074/gpio/gpiochip300
lrwxrwxrwx 1 root root 0 Sep 8 2022 gpiochip316 -> ../../devices/platform/c2f0000.gpio/gpio/gpiochip316
lrwxrwxrwx 1 root root 0 Sep 8 2022 gpiochip348 -> ../../devices/platform/2200000.gpio/gpio/gpiochip348
--w------- 1 root root 4096 Sep 8 2022 unexport
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# echo PCC.01 > /sys/class/gpio/export
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# ls -l /sys/class/gpio/
export gpiochip300/ gpiochip316/ gpiochip348/ PCC.01/ unexport
root@demon-desktop:/home/demon# ls -l /sys/class/gpio/PCC.01/
active_low device/ direction edge power/ subsystem/ uevent value
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# echo out > /sys/class/gpio/
export gpiochip300/ gpiochip316/ gpiochip348/ PCC.01/ unexport
root@demon-desktop:/home/demon# echo out > /sys/class/gpio/PCC.01/direction
I change the values to see something on the oscilloscope screen
root@demon-desktop:/home/demon# echo 1 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 0 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# echo 1 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 0 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# echo 0 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 1 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon# echo 1 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 0 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 1 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 0 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 1 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon# echo 0 > /sys/class/gpio/PCC.01/value
root@demon-desktop:/home/demon#
The logical level does not change on the oscilloscope screen
root@demon-desktop:/home/demon# ls -l /sys/class/gpio/
export gpiochip300/ gpiochip316/ gpiochip348/ PCC.01/ unexport
root@demon-desktop:/home/demon#
root@demon-desktop:/home/demon/Projects# echo PZ.01 > /sys/class/gpio/export
bash: echo: write error: Device or resource busy
root@demon-desktop:/home/demon/Projects#
root@demon-desktop:/home/demon#
There is a small example of a program that switches logic level values. The program does not output anything to the terminal. An oscilloscope is used to check the functionality of the logic level.
Summary
include <stdio.h>
include <stdlib.h>
include <stdint.h>
include <unistd.h>
include <sys/fcntl.h>
include <sys/mman.h>
//Values taken from TRM for Orin NX, pages: 6584, 6587
//define GPIO_392 0x02212420 //GPIO0 config
//define DAP1_SCLK 0x0243d0b0 //GPIO0 pinmux padctl_a13
define GPIO_392 0x0c2f1220 //GPIO4 config
define DAP1_SCLK 0x0c302050 //GPIO4 pinmux padctl_a14
define GPIO_ENABLE_CONFIG 0x00
define GPIO_OUTPUT_CONTROL 0x0c
define GPIO_OUTPUT_VALUE 0x10
int main(void) {
int fd = open(“/dev/mem”, O_RDWR | O_SYNC);
if (fd < 0) {
perror(“/dev/mem”);
fprintf(stderr, “Please run this program as root (for example with sudo)\n”);
exit(1);
}
uint32_t pagesize = getpagesize();
uint32_t pagemask = pagesize - 1;
void *gpio_address = mmap(0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (GPIO_392 & ~pagemask));
void *pad_ctl_address = mmap(0, pagesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, (DAP1_SCLK & ~pagemask));
if (gpio_address == NULL || pad_ctl_address == NULL) {
perror("mmap()");
exit(1);
}
volatile char *gpio_base = ((char *)gpio_address + (GPIO_392 & pagemask));
volatile char *pad_ctl = ((char *)pad_ctl_address + (DAP1_SCLK & pagemask));
*pad_ctl = 0x00000000; // Select GPIO
*(gpio_base + GPIO_OUTPUT_CONTROL) = 0x00000000; // Driven
*(gpio_base + GPIO_ENABLE_CONFIG) = 0x00000003; // GPIO Enable, Out
uint32_t val = 0x00000001;
volatile char *output_value = gpio_base + GPIO_OUTPUT_VALUE;
for(int i=0; i<10000; i++) {
usleep(100000);
val = val ^ 0x00000001;
*output_value = val;
}
*output_value = 0x00000000;
munmap(gpio_address, pagesize);
munmap(pad_ctl_address, pagesize);
close(fd);
return 0 ;
}
We checked it with an oscilloscope - no toggled gpio’s. How to fix it?
The links below didn’t help
Thank you for your help.