|
|
Line 1: |
Line 1: |
− |
| |
| | | |
| == BSP Version == | | == BSP Version == |
| | | |
− | BSP : NXP W1.0.0
| + | Windows : W21H2 (19044.1288.211006-0501.21h2_release_svc_refresh_CLIENT_ENTERPRISES_OEM_A64FRE_en-us.iso) |
− | | |
− | Windows : W21H2 | |
− | <div id="gtx-trans" style="position: absolute; left: -7px; top: 45px;"><div class="gtx-trans-icon"> </div> </div>
| |
| | | |
| + | NXP BSP : W1809 (W21H2-1-0-0-imx-windows-bsp.zip) |
| | | |
| == Released Image == | | == Released Image == |
| | | |
− | *[[IoTGateway/BSP/Linux/OS_Support_List_Windows_On_Arm_for_ROM5720|OS_Support_List_Windows_On_Arm_for_ROM5720]] | + | *[[IoTGateway/BSP/Linux/OS_Support_List_Windows_On_Arm_for_ROM5720|OS_Support_List_Windows_On_Arm_for_ROM5720]] |
| | | |
| == Build Environment on Host == | | == Build Environment on Host == |
Line 20: |
Line 17: |
| | | |
| Docker command: | | Docker command: |
− | <pre>$ docker pull advrisc/u18.04-imx8lbv1</pre> | + | <pre>$ docker pull advrisc/u18.04-imx8lbv1:latest</pre> |
| | | |
| == Run Docker example == | | == Run Docker example == |
| | | |
| Step1 Run docker container (example) | | Step1 Run docker container (example) |
− | <pre>sudo docker run -it --name jetson_linux_risc -v /home/bsp/myLinux:/home/adv/BSP:rw --privileged advrisc/u18.04-imx8lbv1:latest /bin/bash | + | <pre>$ docker run -it --name <CONTAINER_NAME> -v <BSP_PATH>:/home/adv/BSP:rw advrisc/u18.04-imx8lbv1:latest /bin/bash |
| </pre> | | </pre> |
| | | |
Line 31: |
Line 28: |
| <pre> adv@7cc0fa834366:~$ sudo chown adv:adv -R BSP</pre> | | <pre> adv@7cc0fa834366:~$ sudo chown adv:adv -R BSP</pre> |
| | | |
− | == Install Some tools == | + | == Install Dependency Packages == |
− | <pre>$sudo apt-get install expect | + | <pre>$ sudo apt-get update |
| + | $ sudo apt-get upgrade -y |
| + | $ sudo apt-get install attr build-essential python3.8 python3.8-dev python3.8-venv device-tree-compiler bison flex swig iasl uuid-dev wget git bc libssl-dev zlib1g-dev python3-pip mono-devel gawk -y |
| + | $ python3.8 -m venv ~/venv/win_fw_build |
| + | $ source ~/venv/win_fw_build/bin/activate |
| + | $ pushd mu_platform_nxp/ |
| + | $ pip3 install -r requirements.txt --upgrade |
| + | $ sudo apt remove python3-crypto |
| + | $ pip3 install pycryptodome |
| + | $ git config --global --add safe.directory /home/adv/BSP |
| + | $ git submodule sync |
| + | $ python3 NXP/<PROJECT>/PlatformBuild.py --setup |
| </pre> | | </pre> |
| | | |
− | == Getting Linux Source Code ==
| + | If get python error at last command, please do following command |
− | <pre>$ export GIT_SSL_NO_VERIFY=1</pre>
| + | <pre>$ sudo apt install gnupg ca-certificates |
− | | + | $ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF |
− | EPC-R7200
| + | $ echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list |
− | <pre>$ cd ~/BSP
| + | $ sudo apt update |
− | $ mkdir jetson_linux_risc
| + | $ sudo apt-get install attr build-essential python3.8 python3.8-dev python3.8-venv device-tree-compiler bison flex swig iasl uuid-dev wget git bc libssl-dev zlib1g-dev python3-pip mono-devel gawk -y |
− | $ cd jetson_linux_risc
| + | $ python3.8 -m venv ~/venv/win_fw_build |
− | $ git config --global user.name "Your Name"
| + | $ pip3 install pycryptodome |
− | $ git config --global user.email you@example.com
| |
− | $ ../repo/repo init -u https://AIM-Linux@dev.azure.com/AIM-Linux/EPC-R7200/_git/manifests
| |
− | $ ../repo/repo sync
| |
− | </pre>
| |
− | | |
− | AIR-020
| |
− | <pre>$ cd ~/BSP
| |
− | $ mkdir jetson_linux_risc
| |
− | $ cd jetson_linux_risc
| |
− | $ git config --global user.name "Your Name"
| |
− | $ git config --global user.email you@example.com
| |
− | $ ../repo/repo init -u https://AIM-Linux@dev.azure.com/AIM-Linux/AIR-020/_git/manifests
| |
− | $ ../repo/repo sync
| |
− | </pre>
| |
− | | |
− | == Build Image - AIR-020 / EPC-R7200 ==
| |
− | | |
− | Build Release Image
| |
− | <pre>sudo ./scripts/build_release.sh -s <SOC> -v <VERSION>
| |
− | Where
| |
− | "-v : Image version" 00001~99999
| |
− | "-s : 186 - Jetson TX2 NX"
| |
− | " : 194 - Jetson Xavier NX"
| |
− | " : 210 - Jetson Nano"</pre>
| |
− | | |
− | == Build Kernel - AIR-020 / EPC-R7200 ==
| |
− | <pre>sudo ./scripts/build_ota.sh -s <SOC> -v <VERSION></pre>
| |
− | | |
− | == Enter Download Mode ==
| |
− | | |
− | Press following button + power ON, or
| |
− | | |
− | {| border="1" cellpadding="1" cellspacing="1" style="width:500px;"
| |
− | |-
| |
− | | style="width: 389px; background-color: rgb(80, 80, 80); color: rgb(255, 255, 255); text-align: center;" | EPC-R7200
| |
− | | style="width: 389px; background-color: rgb(80, 80, 80); color: rgb(255, 255, 255); text-align: center;" | AIR020
| |
− | |-
| |
− | | style="text-align: center;" | [[File:Epcr7200 recovery button.jpg|200px|Epcr7200 recovery button.jpg]]]
| |
− | | style="text-align: center;" | [[File:Air020 recovery button.png|200px|Air020 recovery button.png]]
| |
− | |}
| |
− | | |
− | Enter following command in the device,
| |
− | <pre>$ sudo reboot --force forced-recovery</pre> | |
− | | |
− | == Flash Image ==
| |
− | | |
− | Before flashing the image, power off the DUT, press recovery button and power on.
| |
− | | |
− | {| border="1" cellpadding="1" cellspacing="1" style="width: 1100px;"
| |
− | |-
| |
− | ! scope="row" |
| |
− | ! scope="col" style="width: 389px;background-color:rgb(80, 80, 80);color:#FFFFFF" | EPC-R7200
| |
− | ! scope="col" style="width: 438px;background-color:rgb(80, 80, 80);color:#FFFFFF" | AIR-020
| |
− | |-
| |
− | ! scope="row" | Xavier NX
| |
− | | style="width: 700px;" |
| |
− | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh -d <span style="color:#800080;">./kernel/dtb/</span><span style="color:#0000FF;">tegra194-epcr7200.dtb</span> <span style="color:#0000FF;">jetson-xavier-nx-devkit-emmc</span> mmcblk0p1<br/> or<br/> $ sudo ./flash.sh <span style="color:#0000FF;">jetson-xavier-nx-devkit-emmc</span> mmcblk0p1
| |
− | | |
− | | style="width: 438px;" | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh <span style="color:#0000FF;">jetson-xavier-nx-devkit-emmc</span> mmcblk0p1
| |
− | |-
| |
− | ! scope="row" | TX2 NX
| |
− | | style="width: 700px;" | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh -d ./<span style="color:#800080;">kernel/dtb/</span><span style="color:#0000FF;">tegra186-epcr7200.dtb</span> <span style="color:#0000FF;">jetson-xavier-nx-devkit-tx2-nx</span> mmcblk0p1<br/> or<br/> $ sudo ./flash.sh <span style="color:#0000FF;">jetson-xavier-nx-devkit-tx2-nx</span> mmcblk0p1
| |
− | | style="width: 438px;" | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh <span style="color:#0000FF;">jetson-xavier-nx-devkit-tx2-nx</span> mmcblk0p1
| |
− | |-
| |
− | ! scope="row" | Nano
| |
− | | style="width: 700px;" |
| |
− | $ cd $TOP/Linux_for_Tegra/210/<br/> $ sudo ./flash.sh -d ./<span style="color:#800080;">kernel/dtb/</span><span style="color:#0000FF;">tegra210-epcr7200.dtb</span> <span style="color:#0000FF;">jetson-nano-devkit-emmc</span> mmcblk0p1<br/> or<br/> $ sudo ./flash.sh <span style="color:#0000FF;">jetson-nano-devkit-emmc</span> mmcblk0p1
| |
− | | |
− | | style="width: 438px;" | $ cd $TOP/Linux_for_Tegra/210/<br/> $ sudo ./flash.sh <span style="color:#0000FF;">jetson-nano-devkit-emmc</span> mmcblk0p1
| |
− | |}
| |
− | | |
− | == Flash DTB ==
| |
− | | |
− | {| border="1" cellpadding="1" cellspacing="1" style="width: 891px;"
| |
− | |-
| |
− | ! scope="row" |
| |
− | ! scope="col" style="width: 389px;background-color:rgb(80, 80, 80);color:#FFFFFF" | EPC-R7200
| |
− | ! scope="col" style="width: 438px;background-color:rgb(80, 80, 80);color:#FFFFFF" | AIR-020
| |
− | |-
| |
− | ! scope="row" | Xavier NX
| |
− | | style="width: 389px;" | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh -r -k kernel-dtb <span style="color:#0000FF;">xavier-nx-epcr7200</span> mmcblk0p1
| |
− | | style="width: 438px;" | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh -r -k kernel-dtb <span style="color:#0000FF;">jetson-xavier-nx-devkit-emmc</span> mmcblk0p1
| |
− | |-
| |
− | ! scope="row" | TX2 NX
| |
− | | style="width: 389px;" | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh -r -k kernel-dtb <span style="color:#0000FF;">tx2-nx-epcr7200</span> mmcblk0p1
| |
− | | style="width: 438px;" | $ cd $TOP/Linux_for_Tegra/186/<br/> $ sudo ./flash.sh -r -k kernel-dtb <span style="color:#0000FF;">jetson-xavier-nx-devkit-tx2-nx</span> mmcblk0p1
| |
− | |-
| |
− | ! scope="row" | Nano
| |
− | | style="width: 389px;" | $ cd $TOP/Linux_for_Tegra/210/<br/> $ sudo ./flash.sh -r -k DTB <span style="color:#0000FF;">nano-epcr7200</span> mmcblk0p1
| |
− | | style="width: 438px;" | $ cd $TOP/Linux_for_Tegra/210/<br/> $ sudo ./flash.sh -r -k kernel-dtb <span style="color:#0000FF;">jetson-nano-devkit-emmc</span> mmcblk0p1
| |
− | |}
| |
− | | |
− | == Flash Mac Address ==
| |
− | | |
− | === <span style="color:#0000CD;">GBE in eeprom</span> ===
| |
− | <pre>$ sudo ./eeprom $SOC $mac_address</pre>
| |
− | | |
− | Where SOC
| |
− | <pre> 186 : TX2-NX
| |
− | 194 : XavierNX
| |
− | 210 : Nano
| |
| </pre> | | </pre> |
| | | |
− | === <span style="color:#0000CD;">Intel I210</span> ===
| + | Do the final set up |
− | <pre>$ sudo -s | + | <pre>$ python3 NXP/<PROJECT>/PlatformBuild.py --setup |
− | $ BDF=`lspci | grep 210 | awk '{print $1}'`
| + | $ python3 NXP/<PROJECT>/PlatformBuild.py --update |
− | $ setpci -s $BDF COMMAND=0007
| |
| </pre> | | </pre> |
| | | |
− | Get NIC
| + | Download the Arm64 cross-compiler. |
− | <pre>$./EepromAccessTool</pre> | + | <pre>$ pushd ~ |
− | | + | $ wget https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-linux-gnu |
− | Flash I210 address with mac_address = D4E5F6123456 ( If mac address = D4:E5:F6:12:34:56 )
| + | /gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz |
− | <pre>$ ./EepromAccessTool -nic=<NIC> -f=Dev_Start_I210_Copper_NOMNG_8Mb_A2_3.25_0.03.hex -mac=$mac_address</pre>
| + | $ tar xf gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz |
− | | + | $ rm gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu.tar.xz |
− | Cold reboot the device.
| + | $ popd |
− | | |
− | == Reference ==
| |
− | | |
− | <span style="font-size:medium;"><span style="color:#006400;">'''Boot Device'''</span></span>
| |
− | | |
− | In CBoot, there is bootable menu,
| |
− | <pre>[0002.262] I> Using default boot order
| |
− | [0002.265] I> boot-dev-order :-
| |
− | [0002.268] I> 1.sd
| |
− | [0002.270] I> 2.usb
| |
− | [0002.272] I> 3.nvme
| |
− | [0002.274] I> 4.emmc
| |
− | [0002.276] I> 5.net
| |
− | [0002.277] I> Hit any key to stop autoboot: 4 3 2 1
| |
| </pre> | | </pre> |
| | | |
− | Change the boot order, you may type
| + | The cross compiler prefix is required to be exported later into AARCH64_TOOLCHAIN_PATH variable. |
− | <pre>$ setvar boot-order emmc, sd, usb, net | + | <pre>export AARCH64_TOOLCHAIN_PATH=~/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu |
| </pre> | | </pre> |
| | | |
− | or
| + | == Building == |
− | <pre>$ setvar boot-order emmc | + | <pre>$ cd ~/<BSP>/ |
| + | $ source ~/venv/win_fw_build/bin/activate |
| + | $ export AARCH64_TOOLCHAIN_PATH=~/gcc-linaro-7.4.1-2019.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu- |
| + | $ $ ./adv-buildme64.sh -b 5720 -t all -c -fw |
| </pre> | | </pre> |
| | | |
− | And boot the system
| + | The firmware will be generated in the |
− | <pre>$ boot | + | <pre>~/<BSP>/imx-windows-iot/BSP/firmware/<PRODUCT>/firmware.bin |
| </pre> | | </pre> |
− |
| |
− | For example, there are two of bootable devices - NVME SSD and EMMC If the NVME SSD was plugged-in, the system will always boot NVME SSD.
| |
− |
| |
− | <span style="font-size:medium;"><span style="color:#006400;">'''Boot to Rootfs in external storage'''</span></span>
| |
− |
| |
− | <span style="font-size:bold;">'''Make Rootfs'''</span>
| |
− |
| |
− | 1.Check the external drive’s device name (e.g. NVME : /dev/nvmeXn1, U-Disk : /dev/sdX): The <search_keyword> will be NVME : nvme and U-Disk : sd
| |
− | <pre>$ lsblk -d -p | grep <search_keyword> | cut -d\ -f 1</pre>
| |
− |
| |
− | Note that there must be two spaces after the ‑d\.
| |
− |
| |
− | 2.Create a new GPT:
| |
− | <pre>$ sudo parted /dev/<device> mklabel gpt</pre>
| |
− |
| |
− | Where <device> is the device name that your host computer assigns to the external drive. For example, if the host computer assigns the NVMe drive device name nvme0n1, the command is:
| |
− | <pre>$ sudo parted /dev/nvme0n1 mklabel gpt</pre>
| |
− |
| |
− | 3.Add the APP partition:
| |
− | <pre>$ sudo parted /dev/<device> mkpart APP 0GB <size></pre>
| |
− |
| |
− | Where <size> is the size of the partition. It must be at least 16 GB. It may be larger if the external drive has enough space. For example, if <device> is nvme0n1 and the partition is to contain 16 GB, enter:
| |
− | <pre>$ sudo parted /dev/nvme0n1 mkpart APP 0GB 16GB</pre>
| |
− |
| |
− | The NVME device name of the APP partition <DPART> is then <nvmeXn1>p1.<br/> The U-Disk device name of the APP partition <DPART> is then <sdX>1.
| |
− |
| |
− | 4.Format APP as an ext4 partition and mount it.
| |
− | <pre>$ sudo mkfs.ext4 /dev/<DPART>
| |
− | $ sudo mount /dev/<DPART> /mnt
| |
− | </pre>
| |
− |
| |
− | You may format APP as ext2 or ext3, but ext4 is strongly recommended because it is faster, more compact, and more reliable.
| |
− |
| |
− | 5.Connect the Jetson device to a host computer and put it into recovery mode, then enter the following commands to generate the rootfs without flashing the device:
| |
− | <pre>$ cd Linux_for_Tegra/
| |
− | $ sudo BOOTDEV=<DPART> ./flash.sh --no-flash <board> <DPART>
| |
− | $ sudo mkdir tmp_system
| |
− | $ sudo mount bootloader/system.img.raw ./tmp_system
| |
− | $ sudo rsync -axHAWX --numeric-ids --info=progress2 --exclude=/proc ./tmp_system/ /mnt
| |
− | </pre>
| |
− |
| |
− | Where <DPART> is the device name that the Jetson device will assign to APP.
| |
− |
| |
− | 6.Unmount the external drive and disconnect it from the host computer:
| |
− | <pre>$ sudo umount /mnt
| |
− | $ sudo umount ./tmp_system
| |
− | </pre>
| |
− |
| |
− | 7.Plug the external drive into the target device and power on.
| |
− |
| |
− | reference : [https://docs.nvidia.com/jetson/l4t/index.html#page/Tegra%20Linux%20Driver%20Package%20Development%20Guide/flashing.html#wwpID0E0VM0HA nVidia]
| |
− |
| |
− | <span style="font-size:bold;">'''Set up boot menu for multi-rootfs'''</span>
| |
− |
| |
− | During system boot to u-boot, it will check the file /boot/extlinux/extlinux.conf to select one of rootfs.<br/> The following example added NVME and SD card for candidate. the default rootfs will be '''''primary'''''. You may choose one of option in console termianl or default if there was no any selection.<br/> Modify the root path to the <DPART> for every external storage
| |
− | <pre>TIMEOUT 30
| |
− | DEFAULT primary
| |
− |
| |
− | MENU TITLE L4T boot options
| |
− |
| |
− | LABEL primary
| |
− | MENU LABEL primary kernel
| |
− | LINUX /boot/Image
| |
− | INITRD /boot/initrd
| |
− | FDT /boot/tegra194-epcr7200.dtb
| |
− | APPEND ${cbootargs} quiet root=/dev/mmcblk0p1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
| |
− |
| |
− | LABEL sdcard
| |
− | MENU LABEL Boot from SD Card
| |
− | LINUX /boot/Image
| |
− | INITRD /boot/initrd
| |
− | FDT /boot/tegra194-epcr7200.dtb
| |
− | APPEND ${cbootargs} quiet root=/dev/sda1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
| |
− |
| |
− | LABEL UIO-4040
| |
− | MENU LABEL Boot from UIO-4040
| |
− | LINUX /boot/Image
| |
− | INITRD /boot/initrd
| |
− | FDT /boot/tegra194-epcr7200.dtb
| |
− | APPEND ${cbootargs} quiet root=/dev/sda1 rw rootwait rootfstype=ext4 console=ttyTCU0,115200n8 console=tty0 fbcon=map:0 net.ifnames=0
| |
− | </pre>
| |
− |
| |
− | <span style="font-size:medium;"><span style="color:#006400;">'''Calculate GPIO value from pin number'''</span></span>
| |
− |
| |
− | [[:File:AIR-020-nVidia_GPIO.docx|AIR-020-nVidia_GPIO.docx]]
| |
− |
| |
− | <span style="font-size:medium;"><span style="color:#006400;">'''Device PID VID'''</span></span>
| |
− |
| |
− | Open a terminal window on your host and enter the command '''''lsusb'''''.<br/> The Jetson module is in Force Recovery mode if you see this message:
| |
− | <pre>Bus <bbb> Device <ddd>: ID 0955: <nnnn> Nvidia Corp.</pre>
| |
− |
| |
− | Where:
| |
− |
| |
− | •<bbb> is any three-digit number<br/> •<ddd> is any three-digit number<br/> •<nnnn> is a four-digit number that represents the type of Jetson module:
| |
− |
| |
− | [[File:Nvidia pidvid.png|RTENOTITLE]]
| |
− |
| |
− | <span style="font-size:medium;"><span style="color:#006400;">'''Simultaneous flashing to multiple target devices.'''</span></span>
| |
− |
| |
− | '''Create MFI'''
| |
− | <pre>$ sudo BOARDID=<boardid> BOARDSKU=<boardsku> FAB=<fab> BOARDREV=<boardrev> FUSELEVEL=fuselevel_production ./nvmassflashgen.sh <BOARD> <DEV_PART>
| |
− | </pre>
| |
− |
| |
− | ex : Create a MFI tarball for a TX2 board.
| |
− | <pre>$ cd Linux_for_Tegra
| |
− | $ sudo BOARDID=3636 BOARDSKU=0001 FAB=100 BOARDREV=B.0 FUSELEVEL=fuselevel_production ./nvmassflashgen.sh jetson-xavier-nx-devkit-tx2-nx mmcblk0p1</pre>
| |
− |
| |
− | The tarball mfi_<BOARD>.tbz2 will be created in the Linux_for_Tegra/
| |
− |
| |
− | [[File:Jetson board nvmassflashgen.jpg|RTENOTITLE]]
| |
− |
| |
− | '''Flash this tarball to device'''
| |
− |
| |
− | 1.Download mfi_jetson-xavier-nx-devkit-emmc.tbz2 to each flashing hosts.<br/> 2.Untar mfi_<BOARD>.tbz2.
| |
− | <pre>$ tar xvjf mfi_mfi_<BOARD>.tbz2
| |
− | $ cd mfi_jetson-xavier-nx-devkit-emmc</pre>
| |
− |
| |
− | 3. Connect Jetson boards(jetson-xavier-nx-devkit-emmc only) and put them in RCM mode.
| |
− | <pre>$ ./nvmflash.sh</pre>
| |
Windows : W21H2 (19044.1288.211006-0501.21h2_release_svc_refresh_CLIENT_ENTERPRISES_OEM_A64FRE_en-us.iso)
You can get the latest version of advrisc/u18.04-imx8lbv1 Docker image for developing nVidia jetson projects.
Step2 In container, change the user. (example)
Download the Arm64 cross-compiler.
The cross compiler prefix is required to be exported later into AARCH64_TOOLCHAIN_PATH variable.