FC2カウンター FPGAの部屋 2023年04月
fc2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.2 を動作させてみる3

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみる2”の続き。

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみよう(現在は ZynqMP-FPGA-Debian11-0.1.2)ということで、前回、再度、MicroSD カードに Debian11 を書いて、起動してみたが、ブート途中で止まってしまった。今回、ikwzm さんに修正していただいた Debian11 を起動してみたところ、見事に起動した。

v0.1.0.tar.gz と ZynqMP-FPGA-Debian11-0.1.0 を一旦削除した。

再度 v0.1.2.tar.gz を wget して展開した。
wget https://github.com/ikwzm/ZynqMP-FPGA-Debian11/archive/refs/tags/v0.1.2.tar.gz
tar xfz v0.1.2.tar.gz
cd ZynqMP-FPGA-Debian11-0.1.2


MicroSD カードの boot , root パーティションのファイルを全部消去した。
rm /media/masaaki/boot/*
sudo rm /media/masaaki/root/*


MicroSD カードの boot パーティションにファイルをコピーした。
cp target/Kr260/boot/* /media/masaaki/boot
gzip -d -c files/vmlinuz-5.15.108-zynqmp-fpga-generic-1 > /media/masaaki/boot/image-5.15.108-zynqmp-fpga-generic


root パーティションにファイルを転送する。
cat debian11-rootfs-vanilla.tgz.files/* | sudo tar xfz - -C /media/masaaki/root
sudo mkdir /media/masaaki/root/home/fpga/debian
sudo cp debian/* /media/masaaki/root/home/fpga/debian


/etc/fstab に boot パーティションをマウントする設定を書き込む。
sudo su
vi /media/masaaki/root/etc/fstab

vi 上で o コマンドを実行して、下に以下の行を追加した。

/dev/sda1       /mnt/boot       auto            defaults        0       0


exit

MicroSD カードの boot, root パーティションをアンマウントして、KR260 に挿入して、電源ON でブートしたところ、正常に起動した。
kr260_Debian11_10_230429.png

イーサーネットへの接続だが、いつもの GEM0 PS Ethernet の口では DHCP の割当がなかった。GEM1 PS Ethernet の口にLAN ケーブルを接続したところ eth0 に IP アドレスが割り当てられた。(Kria KR260 ロボティクス スターター キット ユーザー ガイド (UG1092) のインターフェイスの図:インターフェイスおよびカードコネクタ:カード表面参照)
kr260_Debian11_11_230429.png

Linux イメージ・パッケージをインストールする。
cd /home/fpga/debian
sudo dpkg -i linux-image-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-3_arm64.deb
sudo dpkg -i linux-headers-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-3_arm64.deb

ログを示す。

fpga@debian-fpga:~/debian$ sudo dpkg -i linux-image-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-3_arm64.deb^C
fpga@ddpkg -i linux-headers-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-3_arm64.debp-fpga-gesudo: unable to resolve host debian-fpga: Name or service not known
Selecting previously unselected package linux-headers-5.15.108-zynqmp-fpga-generic.
(Reading database ... 27322 files and directories currently installed.)
Preparing to unpack linux-headers-5.15.108-zynqmp-fpga-generic_5.15.108-zynqmp-fpga-generic-3_arm64.deb ...
Unpacking linux-headers-5.15.108-zynqmp-fpga-generic (5.15.108-zynqmp-fpga-generic-3) ...
Setting up linux-headers-5.15.108-zynqmp-fpga-generic (5.15.108-zynqmp-fpga-generic-3) ...
make: Entering directory '/usr/src/linux-headers-5.15.108-zynqmp-fpga-generic'
  SYNC    include/config/auto.conf.cmd
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/confdata.o
  HOSTCC  scripts/kconfig/expr.o
  LEX     scripts/kconfig/lexer.lex.c
  YACC    scripts/kconfig/parser.tab.[ch]
  HOSTCC  scripts/kconfig/lexer.lex.o
  HOSTCC  scripts/kconfig/menu.o
  HOSTCC  scripts/kconfig/parser.tab.o
  HOSTCC  scripts/kconfig/preprocess.o
  HOSTCC  scripts/kconfig/symbol.o
  HOSTCC  scripts/kconfig/util.o
  HOSTLD  scripts/kconfig/conf
*
* Restart config...
*
*
* ARMv8.5 architectural features
*
Branch Target Identification support (ARM64_BTI) [Y/n/?] y
Enable support for E0PD (ARM64_E0PD) [Y/n/?] y
Enable support for random number generation (ARCH_RANDOM) [Y/n/?] y
Memory Tagging Extension support (ARM64_MTE) [Y/n/?] (NEW) y
*
* KASAN: runtime memory debugger
*
KASAN: runtime memory debugger (KASAN) [N/y/?] (NEW) y
  KASAN mode
  > 1. Generic mode (KASAN_GENERIC) (NEW)
  choice[1]: 1
  Instrumentation type
  > 1. Outline instrumentation (KASAN_OUTLINE) (NEW)
    2. Inline instrumentation (KASAN_INLINE) (NEW)
  choice[1-2?]: 
  Back mappings in vmalloc space with real shadow memory (KASAN_VMALLOC) [Y/?] (NEW) y
  KUnit-incompatible tests of KASAN bug detection capabilities (KASAN_MODULE_TEST) [N/m/?] (NEW) 
*
* Restart config...
*
*
* Library routines
*
Automatically choose fastest RAID6 PQ functions (RAID6_PQ_BENCHMARK) [Y/n/?] y
Generic bitfield packing and unpacking (PACKING) [N/y/?] n
CORDIC algorithm (CORDIC) [N/m/y/?] n
Simple prime number generator for testing (PRIME_NUMBERS) [N/m/y/?] n
Access I/O in non-MMIO mode (INDIRECT_PIO) [N/y/?] n
CRC-CCITT functions (CRC_CCITT) [Y/?] y
CRC16 functions (CRC16) [Y/?] y
CRC calculation for the T10 Data Integrity Field (CRC_T10DIF) [N/m/y/?] n
CRC ITU-T V.41 functions (CRC_ITU_T) [M/y/?] m
CRC32/CRC32c functions (CRC32) [Y/?] y
  CRC32 perform self test on init (CRC32_SELFTEST) [N/m/y/?] n
  CRC32 implementation
  > 1. Slice by 8 bytes (CRC32_SLICEBY8)
    2. Slice by 4 bytes (CRC32_SLICEBY4)
    3. Sarwate's Algorithm (one byte at a time) (CRC32_SARWATE)
    4. Classic Algorithm (one bit at a time) (CRC32_BIT)
  choice[1-4?]: 1
CRC64 functions (CRC64) [N/m/y/?] n
CRC4 functions (CRC4) [N/m/y/?] n
CRC7 functions (CRC7) [Y/?] y
CRC32c (Castagnoli, et al) Cyclic Redundancy-Check (LIBCRC32C) [M/y/?] m
CRC8 function (CRC8) [N/m/y/?] n
PRNG perform self test on init (RANDOM32_SELFTEST) [N/y/?] n
XZ decompression support (XZ_DEC) [Y/?] y
  x86 BCJ filter decoder (XZ_DEC_X86) [Y/n/?] y
  PowerPC BCJ filter decoder (XZ_DEC_POWERPC) [Y/n/?] y
  IA-64 BCJ filter decoder (XZ_DEC_IA64) [Y/n/?] y
  ARM BCJ filter decoder (XZ_DEC_ARM) [Y/n/?] y
  ARM-Thumb BCJ filter decoder (XZ_DEC_ARMTHUMB) [Y/n/?] y
  SPARC BCJ filter decoder (XZ_DEC_SPARC) [Y/n/?] y
XZ decompressor tester (XZ_DEC_TEST) [N/m/y/?] n
DMA Restricted Pool (DMA_RESTRICTED_POOL) [N/y/?] n
DMA Contiguous Memory Allocator (DMA_CMA) [Y/n/?] y
  Enable separate DMA Contiguous Memory Area for each NUMA Node (DMA_PERNUMA_CMA) [N/y/?] n
  *
  * Default contiguous memory area size:
  *
  Size in Mega Bytes (CMA_SIZE_MBYTES) [256] 256
  Selected region size
  > 1. Use mega bytes value only (CMA_SIZE_SEL_MBYTES)
    2. Use percentage value only (CMA_SIZE_SEL_PERCENTAGE)
    3. Use lower value (minimum) (CMA_SIZE_SEL_MIN)
    4. Use higher value (maximum) (CMA_SIZE_SEL_MAX)
  choice[1-4?]: 1
  Maximum PAGE_SIZE order of alignment for contiguous buffers (CMA_ALIGNMENT) [8] 8
Enable debugging of DMA-API usage (DMA_API_DEBUG) [N/y/?] n
Enable benchmarking of streaming DMA mapping (DMA_MAP_BENCHMARK) [N/y/?] n
glob self-test on init (GLOB_SELFTEST) [N/m/y/?] n
IRQ polling library (IRQ_POLL) [N/y/?] n
stack depot hash size (12 => 4KB, 20 => 1024KB) (STACK_HASH_ORDER) [20] (NEW) [  313.470093] macb ff0c0000.ethernet eth0: Link is Down
[  314.494902] macb ff0c0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off

  HOSTCC  scripts/dtc/dtc.o
  HOSTCC  scripts/dtc/flattree.o
  HOSTCC  scripts/dtc/fstree.o
  HOSTCC  scripts/dtc/data.o
  HOSTCC  scripts/dtc/livetree.o
  HOSTCC  scripts/dtc/treesource.o
  HOSTCC  scripts/dtc/srcpos.o
  HOSTCC  scripts/dtc/checks.o
  HOSTCC  scripts/dtc/util.o
  HOSTCC  scripts/dtc/dtc-lexer.lex.o
  HOSTCC  scripts/dtc/dtc-parser.tab.o
  HOSTLD  scripts/dtc/dtc
  HOSTCC  scripts/dtc/libfdt/fdt.o
  HOSTCC  scripts/dtc/libfdt/fdt_ro.o
  HOSTCC  scripts/dtc/libfdt/fdt_wip.o
  HOSTCC  scripts/dtc/libfdt/fdt_sw.o
  HOSTCC  scripts/dtc/libfdt/fdt_rw.o
  HOSTCC  scripts/dtc/libfdt/fdt_strerror.o
  HOSTCC  scripts/dtc/libfdt/fdt_empty_tree.o
  HOSTCC  scripts/dtc/libfdt/fdt_addresses.o
  HOSTCC  scripts/dtc/libfdt/fdt_overlay.o
  HOSTCC  scripts/dtc/fdtoverlay.o
  HOSTLD  scripts/dtc/fdtoverlay
  HOSTCC  scripts/selinux/genheaders/genheaders
  HOSTCC  scripts/selinux/mdp/mdp
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/sorttable
  HOSTCC  scripts/asn1_compiler
  HOSTCC  scripts/extract-cert
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  MKELF   scripts/mod/elfconfig.h
  CC      scripts/mod/devicetable-offsets.s
  HOSTCC  scripts/mod/modpost.o
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
scripts/Makefile.build:459: warning: overriding recipe for target 'modules.order'
Makefile:1508: warning: ignoring old recipe for target 'modules.order'
make: Leaving directory '/usr/src/linux-headers-5.15.108-zynqmp-fpga-generic'
fpga@debian-fpga:~/debian$


sudo dpkg -i fclkcfg-5.15.108-zynqmp-fpga-generic_1.7.2-1_arm64.deb
sudo dpkg -i u-dma-buf-5.15.108-zynqmp-fpga-generic_4.4.1-0_arm64.deb


起動ログを示す。

Xilinx Zynq MP First Stage Boot Loader 
Release 2022.1   Sep 16 2022  -  04:56:15
MultiBootOffset: 0x1F0
Reset Mode  :   System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode 
FlashID=0x20 0xBB 0x20
Pr�NOTICE:  BL31: v2.6(release):0897efd
NOTICE:  BL31: Built : 04:58:29, Sep 16 2022


U-Boot 2022.01-g91ad7924-dirty (Sep 15 2022 - 23:00:49 -0600), Build: jenkins-BUILDS-2022.1-som_qspi_generation-131

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-rev1-sck-kr-g-rev1
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1CYY0C2I3
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: 1
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1V0BJCWOF
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: 1
EL Level:   EL2
Chip ID:    xck26
NAND:  0 MiB
MMC:   
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT 
Net:   
ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii
eth0: ethernet@ff0b0000
ZYNQ GEM: ff0c0000, mdio bus ff0c0000, phyaddr 8, interface rgmii-id
, eth1: ethernet@ff0c0000
starting USB...
Bus usb@fe200000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
Bus usb@fe300000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus usb@fe200000 for devices... 5 USB Device(s) found
scanning bus usb@fe300000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
Hit any key to stop autoboot:  0 
model=SMK-K26-XCL2G

Device 0: Vendor: Generic  Rev: 1.98 Prod: Ultra HS-COMBO
            Type: Removable Hard Disk
            Capacity: 30474.0 MB = 29.7 GB (62410752 x 512)
... is now current device
Scanning usb 0:1...
Found U-Boot script /boot.scr
2661 bytes read in 2 ms (1.3 MiB/s)
## Executing script at 20000000
Trying to load boot images from usb0
2280 bytes read in 1 ms (2.2 MiB/s)
Importing environment(uEnv.txt) from usb0...
Running uenvcmd ...
23929344 bytes read in 1567 ms (14.6 MiB/s)
44332 bytes read in 4 ms (10.6 MiB/s)
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Device Tree to 000000000fff2000, end 000000000ffffd2b ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.15.108-zynqmp-fpga-generic (ichiro@Jabberwock) (aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0, GNU ld (GNU Binutils for Ubuntu) 2.30) #3 SMP Sat Apr 29 05:26:24 JST 2023
[    0.000000] Machine model: ZynqMP SMK-K26 Rev1/B/A
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000000000000-0x00000000ffffffff]
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000087fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000007fffffff]
[    0.000000]   node   0: [mem 0x0000000800000000-0x000000087fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000087fffffff]
[    0.000000] cma: Reserved 1000 MiB at 0x0000000041800000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 27 pages/cpu s73496 r8192 d28904 u110592
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: ARM erratum 845719
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1032192
[    0.000000] Kernel command line: console=ttyPS1,115200 root=/dev/sda2 rw rootwait systemd.unit=multi-user.target cpuidle.off=1 cma=1000M uio_pdrv_genirq.of_id=generic-uio
[    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] software IO TLB: mapped [mem 0x000000003d800000-0x0000000041800000] (64MB)
[    0.000000] Memory: 2999408K/4194304K available (14272K kernel code, 1928K rwdata, 3884K rodata, 3136K init, 591K bss, 170896K reserved, 1024000K cma-reserved)
[    0.000000] trace event string verifier disabled
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000]  Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GIC: Adjusting CPU interface base to 0x00000000f902f000
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] arch_timer: cp15 timer(s) running at 99.99MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171015c90f, max_idle_ns: 440795203080 ns
[    0.000000] sched_clock: 56 bits at 99MHz, resolution 10ns, wraps every 4398046511101ns
[    0.000394] Console: colour dummy device 80x25
[    0.000426] Calibrating delay loop (skipped), value calculated using timer frequency.. 199.99 BogoMIPS (lpj=399996)
[    0.000437] pid_max: default: 32768 minimum: 301
[    0.000612] LSM: Security Framework initializing
[    0.000704] AppArmor: AppArmor initialized
[    0.000790] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.000809] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.002000] rcu: Hierarchical SRCU implementation.
[    0.002285] EFI services will not be available.
[    0.002460] smp: Bringing up secondary CPUs ...
[    0.002901] Detected VIPT I-cache on CPU1
[    0.002942] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[    0.003415] Detected VIPT I-cache on CPU2
[    0.003438] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[    0.003870] Detected VIPT I-cache on CPU3
[    0.003892] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[    0.003960] smp: Brought up 1 node, 4 CPUs
[    0.003976] SMP: Total of 4 processors activated.
[    0.003981] CPU features: detected: 32-bit EL0 Support
[    0.003986] CPU features: detected: CRC32 instructions
[    0.004030] CPU: All CPU(s) started at EL2
[    0.004045] alternatives: patching kernel code
[    0.005073] devtmpfs: initialized
[    0.011279] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.011296] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.033544] pinctrl core: initialized pinctrl subsystem
[    0.034494] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.035603] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[    0.035694] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.035725] audit: initializing netlink subsys (disabled)
[    0.035820] audit: type=2000 audit(0.032:1): state=initialized audit_enabled=0 res=1
[    0.036270] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.036336] ASID allocator initialised with 65536 entries
[    0.054005] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.054021] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[    0.054027] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.054033] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[    0.055423] cryptd: max_cpu_qlen set to 1000
[    0.057125] iommu: Default domain type: Translated 
[    0.057132] iommu: DMA domain TLB invalidation policy: strict mode 
[    0.057269] vgaarb: loaded
[    0.057483] SCSI subsystem initialized
[    0.057626] usbcore: registered new interface driver usbfs
[    0.057655] usbcore: registered new interface driver hub
[    0.057678] usbcore: registered new device driver usb
[    0.057738] mc: Linux media interface: v0.10
[    0.057758] videodev: Linux video capture interface: v2.00
[    0.057793] pps_core: LinuxPPS API ver. 1 registered
[    0.057799] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.057811] PTP clock support registered
[    0.057840] EDAC MC: Ver: 3.0.0
[    0.058186] zynqmp-ipi-mbox mailbox@ff990400: Registered ZynqMP IPI mbox with TX/RX channels.
[    0.058362] FPGA manager framework
[    0.058486] Advanced Linux Sound Architecture Driver Initialized.
[    0.058819] NetLabel: Initializing
[    0.058824] NetLabel:  domain hash size = 128
[    0.058828] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[    0.058876] NetLabel:  unlabeled traffic allowed by default
[    0.059250] clocksource: Switched to clocksource arch_sys_counter
[    0.086313] VFS: Disk quotas dquot_6.6.0
[    0.086372] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.086728] AppArmor: AppArmor Filesystem Enabled
[    0.159299] NET: Registered PF_INET protocol family
[    0.159450] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    0.160956] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[    0.160999] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.161011] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    0.161198] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)
[    0.161560] TCP: Hash tables configured (established 32768 bind 32768)
[    0.161637] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.161708] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.161847] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.163585] RPC: Registered named UNIX socket transport module.
[    0.163592] RPC: Registered udp transport module.
[    0.163596] RPC: Registered tcp transport module.
[    0.163600] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.164183] PCI: CLS 0 bytes, default 64
[    0.710077] armv8-pmu pmu: hw perfevents: no interrupt-affinity property, guessing.
[    0.710249] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
[    0.715039] Initialise system trusted keyrings
[    0.715166] workingset: timestamp_bits=46 max_order=20 bucket_order=0
[    0.715891] NFS: Registering the id_resolver key type
[    0.715911] Key type id_resolver registered
[    0.715916] Key type id_legacy registered
[    0.715939] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.715945] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    0.715964] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[    0.748476] NET: Registered PF_ALG protocol family
[    0.748486] Key type asymmetric registered
[    0.748491] Asymmetric key parser 'x509' registered
[    0.748534] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[    0.748613] io scheduler mq-deadline registered
[    0.748620] io scheduler kyber registered
[    0.750088] Error: Driver 'clk-wizard' is already registered, aborting...
[    0.775916] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    0.779097] cacheinfo: Unable to detect cache hierarchy for CPU 0
[    0.783726] brd: module loaded
[    0.787307] loop: module loaded
[    0.787778] mtdoops: mtd device (mtddev=name/number) must be supplied
[    0.790185] tun: Universal TUN/TAP device driver, 1.6
[    0.790788] PPP generic driver version 2.4.2
[    0.790860] SPI driver wl1271_spi has no spi_device_id for ti,wl1271
[    0.790867] SPI driver wl1271_spi has no spi_device_id for ti,wl1273
[    0.790871] SPI driver wl1271_spi has no spi_device_id for ti,wl1281
[    0.790876] SPI driver wl1271_spi has no spi_device_id for ti,wl1283
[    0.790881] SPI driver wl1271_spi has no spi_device_id for ti,wl1285
[    0.790885] SPI driver wl1271_spi has no spi_device_id for ti,wl1801
[    0.790890] SPI driver wl1271_spi has no spi_device_id for ti,wl1805
[    0.790894] SPI driver wl1271_spi has no spi_device_id for ti,wl1807
[    0.790899] SPI driver wl1271_spi has no spi_device_id for ti,wl1831
[    0.790903] SPI driver wl1271_spi has no spi_device_id for ti,wl1835
[    0.790908] SPI driver wl1271_spi has no spi_device_id for ti,wl1837
[    0.791890] usbcore: registered new interface driver uas
[    0.791922] usbcore: registered new interface driver usb-storage
[    0.792694] rtc_zynqmp ffa60000.rtc: registered as rtc0
[    0.792712] rtc_zynqmp ffa60000.rtc: setting system clock to 1970-01-01T00:00:06 UTC (6)
[    0.792771] i2c_dev: i2c /dev entries driver
[    0.794150] usbcore: registered new interface driver uvcvideo
[    0.794844] EDAC MC: ECC not enabled
[    0.794985] EDAC DEVICE0: Giving out device to module zynqmp-ocm-edac controller zynqmp_ocm: DEV ff960000.memory-controller (INTERRUPT)
[    0.795364] failed to register cpuidle driver
[    0.795561] sdhci: Secure Digital Host Controller Interface driver
[    0.795566] sdhci: Copyright(c) Pierre Ossman
[    0.795570] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.795906] ledtrig-cpu: registered to indicate activity on CPUs
[    0.795985] SMCCC: SOC_ID: ARCH_SOC_ID not implemented, skipping ....
[    0.796052] zynqmp_firmware_probe Platform Management API v1.1
[    0.796059] zynqmp_firmware_probe Trustzone version v1.0
[    0.824993] securefw securefw: securefw probed
[    0.825089] zynqmp_aes firmware:zynqmp-firmware:zynqmp-aes: The zynqmp-aes driver shall be deprecated in 2022.2 and removed in 2023.1
[    0.825368] zynqmp_aes firmware:zynqmp-firmware:zynqmp-aes: AES Successfully Registered
[    0.825482] zynqmp-keccak-384 firmware:zynqmp-firmware:sha384: The zynqmp-sha-deprecated driver shall be deprecated in 2022.2 and removed in 2023.1 release
[    0.825892] usbcore: registered new interface driver usbhid
[    0.825899] usbhid: USB HID core driver
[    0.828801] fpga_manager fpga0: Xilinx ZynqMP FPGA Manager registered
[    0.829895] drop_monitor: Initializing network drop monitor service
[    0.830031] Initializing XFRM netlink socket
[    0.830119] NET: Registered PF_INET6 protocol family
[    0.830694] Segment Routing with IPv6
[    0.830721] In-situ OAM (IOAM) with IPv6
[    0.830763] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    0.831101] NET: Registered PF_PACKET protocol family
[    0.831117] NET: Registered PF_KEY protocol family
[    0.831122] can: controller area network core
[    0.831153] NET: Registered PF_CAN protocol family
[    0.831159] can: raw protocol
[    0.831165] can: broadcast manager protocol
[    0.831175] can: netlink gateway - max_hops=1
[    0.831396] 9pnet: Installing 9P2000 support
[    0.831424] Key type dns_resolver registered
[    0.831908] registered taskstats version 1
[    0.831920] Loading compiled-in X.509 certificates
[    0.832142] AppArmor: AppArmor sha1 policy hashing enabled
[    0.841162] ff010000.serial: ttyPS1 at MMIO 0xff010000 (irq = 51, base_baud = 6249999) is a xuartps
[    1.975421] printk: console [ttyPS1] enabled
[    1.980056] of-fpga-region fpga-full: FPGA Region probed
[    1.986110] xilinx-zynqmp-dma fd500000.dma-controller: ZynqMP DMA driver Probe success
[    1.994187] xilinx-zynqmp-dma fd510000.dma-controller: ZynqMP DMA driver Probe success
[    2.002262] xilinx-zynqmp-dma fd520000.dma-controller: ZynqMP DMA driver Probe success
[    2.010333] xilinx-zynqmp-dma fd530000.dma-controller: ZynqMP DMA driver Probe success
[    2.018405] xilinx-zynqmp-dma fd540000.dma-controller: ZynqMP DMA driver Probe success
[    2.026481] xilinx-zynqmp-dma fd550000.dma-controller: ZynqMP DMA driver Probe success
[    2.034555] xilinx-zynqmp-dma fd560000.dma-controller: ZynqMP DMA driver Probe success
[    2.042622] xilinx-zynqmp-dma fd570000.dma-controller: ZynqMP DMA driver Probe success
[    2.050769] xilinx-zynqmp-dma ffa80000.dma-controller: ZynqMP DMA driver Probe success
[    2.058837] xilinx-zynqmp-dma ffa90000.dma-controller: ZynqMP DMA driver Probe success
[    2.066910] xilinx-zynqmp-dma ffaa0000.dma-controller: ZynqMP DMA driver Probe success
[    2.074980] xilinx-zynqmp-dma ffab0000.dma-controller: ZynqMP DMA driver Probe success
[    2.083058] xilinx-zynqmp-dma ffac0000.dma-controller: ZynqMP DMA driver Probe success
[    2.091129] xilinx-zynqmp-dma ffad0000.dma-controller: ZynqMP DMA driver Probe success
[    2.099197] xilinx-zynqmp-dma ffae0000.dma-controller: ZynqMP DMA driver Probe success
[    2.107287] xilinx-zynqmp-dma ffaf0000.dma-controller: ZynqMP DMA driver Probe success
[    2.115693] xilinx-zynqmp-dpdma fd4c0000.dma-controller: Xilinx DPDMA engine is probed
[    2.126967] zynqmp-display fd4a0000.display: vtc bridge property not present
[    2.136924] xilinx-dp-snd-codec fd4a0000.display:zynqmp_dp_snd_codec0: Xilinx DisplayPort Sound Codec probed
[    2.146994] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm0: Xilinx DisplayPort Sound PCM probed
[    2.155049] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm1: Xilinx DisplayPort Sound PCM probed
[    2.163897] xilinx-dp-snd-card fd4a0000.display:zynqmp_dp_snd_card: Xilinx DisplayPort Sound Card probed
[    2.167686] zynqmp_pll_disable() clock disable failed for dpll_int, ret = -13
[    2.173488] OF: graph: no port node found in /axi/display@fd4a0000
[    2.187098] xlnx-drm xlnx-drm.0: bound fd4a0000.display (ops 0xffffffc008eadd10)
[    2.194704] [drm] Initialized xlnx 1.0.0 20130509 for fd4a0000.display on minor 0
[    2.202211] zynqmp-display fd4a0000.display: ZynqMP DisplayPort Subsystem driver probed
[    2.212054] spi-nor spi0.0: mt25qu512a (65536 Kbytes)
[    2.217178] 17 fixed-partitions partitions found on MTD device spi0.0
[    2.223624] Creating 17 MTD partitions on "spi0.0":
[    2.228500] 0x000000000000-0x000000080000 : "Image Selector"
[    2.235027] 0x000000080000-0x000000100000 : "Image Selector Golden"
[    2.241690] tpm_tis_spi spi2.0: 2.0 TPM (device-id 0x1B, rev-id 22)
[    2.242097] 0x000000100000-0x000000120000 : "Persistent Register"
[    2.254825] 0x000000120000-0x000000140000 : "Persistent Register Backup"
[    2.262317] 0x000000140000-0x000000200000 : "Open_1"
[    2.267992] 0x000000200000-0x000000f00000 : "Image A (FSBL, PMU, ATF, U-Boot)"
[    2.275522] tpm tpm0: A TPM error (256) occurred attempting the self test
[    2.276007] 0x000000f00000-0x000000f80000 : "ImgSel Image A Catch"
[    2.282305] tpm tpm0: starting up the TPM manually
[    2.289185] 0x000000f80000-0x000001c80000 : "Image B (FSBL, PMU, ATF, U-Boot)"
[    2.301269] 0x000001c80000-0x000001d00000 : "ImgSel Image B Catch"
[    2.308188] 0x000001d00000-0x000001e00000 : "Open_2"
[    2.313878] 0x000001e00000-0x000002000000 : "Recovery Image"
[    2.320261] 0x000002000000-0x000002200000 : "Recovery Image Backup"
[    2.327337] 0x000002200000-0x000002220000 : "U-Boot storage variables"
[    2.334648] 0x000002220000-0x000002240000 : "U-Boot storage variables backup"
[    2.342521] 0x000002240000-0x000002280000 : "SHA256"
[    2.348222] 0x000002280000-0x0000022a0000 : "Secure OS Storage"
[    2.354876] 0x0000022a0000-0x000004050000 : "User"
[    2.359666] mtd: partition "User" extends beyond the end of device "spi0.0" -- size truncated to 0x1d60000
[    2.370592] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.378097] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.405306] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.428169] xilinx-axipmon ffa00000.perf-monitor: Probed Xilinx APM
[    2.434728] xilinx-axipmon fd0b0000.perf-monitor: Probed Xilinx APM
[    2.441233] xilinx-axipmon fd490000.perf-monitor: Probed Xilinx APM
[    2.447727] xilinx-axipmon ffa10000.perf-monitor: Probed Xilinx APM
[    2.455210] at24 1-0050: supply vcc not found, using dummy regulator
[    2.461903] at24 1-0050: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.468754] at24 1-0051: supply vcc not found, using dummy regulator
[    2.475406] at24 1-0051: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.483502] i2c i2c-1: Added multiplexed i2c bus 3
[    2.488428] i2c i2c-1: Added multiplexed i2c bus 4
[    2.493337] i2c i2c-1: Added multiplexed i2c bus 5
[    2.498253] i2c i2c-1: Added multiplexed i2c bus 6
[    2.503047] pca954x 1-0074: registered 4 multiplexed busses for I2C switch pca9546
[    2.510647] cdns-i2c ff030000.i2c: 400 kHz mmio ff030000 irq 40
[    2.517912] cdns-wdt fd4d0000.watchdog: Xilinx Watchdog Timer with timeout 60s
[    2.525376] cdns-wdt ff150000.watchdog: Xilinx Watchdog Timer with timeout 10s
[    2.533695] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.540605] macb ff0b0000.ethernet: invalid hw address, using random
[    2.547532] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.581136] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.588046] macb ff0c0000.ethernet: invalid hw address, using random
[    2.600611] macb ff0c0000.ethernet eth0: Cadence GEM rev 0x50070106 at 0xff0c0000 irq 38 (32:a9:fe:9b:55:79)
[    2.631931] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[    2.637444] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 1
[    2.645199] xhci-hcd xhci-hcd.1.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x0000000002010890
[    2.654630] xhci-hcd xhci-hcd.1.auto: irq 57, io mem 0xfe200000
[    2.660650] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[    2.666137] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 2
[    2.673792] xhci-hcd xhci-hcd.1.auto: Host supports USB 3.0 SuperSpeed
[    2.680457] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[    2.688728] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.695948] usb usb1: Product: xHCI Host Controller
[    2.700824] usb usb1: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    2.708132] usb usb1: SerialNumber: xhci-hcd.1.auto
[    2.713331] hub 1-0:1.0: USB hub found
[    2.717109] hub 1-0:1.0: 1 port detected
[    2.721345] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.15
[    2.729610] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.736829] usb usb2: Product: xHCI Host Controller
[    2.741707] usb usb2: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    2.749021] usb usb2: SerialNumber: xhci-hcd.1.auto
[    2.754155] hub 2-0:1.0: USB hub found
[    2.757930] hub 2-0:1.0: 1 port detected
[    2.775382] usb5744 3-002d: Sending boot command failed
[    2.795374] i2c 3-002d: Sending boot command failed
[    2.839013] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[    2.844513] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 3
[    2.852269] xhci-hcd xhci-hcd.2.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x0000000002010890
[    2.861694] xhci-hcd xhci-hcd.2.auto: irq 60, io mem 0xfe300000
[    2.867718] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[    2.873209] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 4
[    2.880871] xhci-hcd xhci-hcd.2.auto: Host supports USB 3.0 SuperSpeed
[    2.887704] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[    2.895983] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.903202] usb usb3: Product: xHCI Host Controller
[    2.908080] usb usb3: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    2.915387] usb usb3: SerialNumber: xhci-hcd.2.auto
[    2.920577] hub 3-0:1.0: USB hub found
[    2.924353] hub 3-0:1.0: 1 port detected
[    2.928631] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.15
[    2.936899] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.944131] usb usb4: Product: xHCI Host Controller
[    2.949006] usb usb4: Manufacturer: Linux 5.15.108-zynqmp-fpga-generic xhci-hcd
[    2.956319] usb usb4: SerialNumber: xhci-hcd.2.auto
[    2.961502] hub 4-0:1.0: USB hub found
[    2.965265] hub 4-0:1.0: 1 port detected
[    2.983381] usb5744 4-002d: Sending boot command failed
[    3.003375] i2c 4-002d: Sending boot command failed
[    3.008692] macb ff0b0000.ethernet: Not enabling partial store and forward
[    3.015603] macb ff0b0000.ethernet: invalid hw address, using random
[    3.022754] usb 1-1: new high-speed USB device number 2 using xhci-hcd
[    3.037805] macb ff0b0000.ethernet eth1: Cadence GEM rev 0x50070106 at 0xff0b0000 irq 37 (76:aa:b7:cb:85:b2)
[    3.050544] input: gpio-keys as /devices/platform/gpio-keys/input/input0
[    3.057565] of_cfs_init
[    3.060025] of_cfs_init: OK
[    3.062975] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    3.071985] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    3.079569] ALSA device list:
[    3.082522]   #0: DisplayPort monitor
[    3.086464] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    3.095079] cfg80211: failed to load regulatory.db
[    3.100040] Waiting for root device /dev/sda2...
[    3.179879] usb 1-1: New USB device found, idVendor=0424, idProduct=2744, bcdDevice= 2.21
[    3.188070] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.195202] usb 1-1: Product: USB2744
[    3.198859] usb 1-1: Manufacturer: Microchip Tech
[    3.203668] usb 3-1: new high-speed USB device number 2 using xhci-hcd
[    3.256474] hub 1-1:1.0: USB hub found
[    3.260252] hub 1-1:1.0: 4 ports detected
[    3.320351] usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd
[    3.343622] usb 2-1: New USB device found, idVendor=0424, idProduct=5744, bcdDevice= 2.21
[    3.351797] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=0
[    3.358931] usb 2-1: Product: USB5744
[    3.362593] usb 2-1: Manufacturer: Microchip Tech
[    3.367960] usb 3-1: New USB device found, idVendor=0424, idProduct=2744, bcdDevice= 2.21
[    3.376150] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.383285] usb 3-1: Product: USB2744
[    3.386933] usb 3-1: Manufacturer: Microchip Tech
[    3.431555] hub 3-1:1.0: USB hub found
[    3.435430] hub 3-1:1.0: 3 ports detected
[    3.439503] hub 2-1:1.0: USB hub found
[    3.443372] hub 2-1:1.0: 3 ports detected
[    3.495470] usb 4-1: new SuperSpeed USB device number 2 using xhci-hcd
[    3.519624] usb 4-1: New USB device found, idVendor=0424, idProduct=5744, bcdDevice= 2.21
[    3.527803] usb 4-1: New USB device strings: Mfr=2, Product=3, SerialNumber=0
[    3.534934] usb 4-1: Product: USB5744
[    3.538589] usb 4-1: Manufacturer: Microchip Tech
[    3.607528] hub 4-1:1.0: USB hub found
[    3.611430] hub 4-1:1.0: 2 ports detected
[    3.623257] usb 1-1.1: new high-speed USB device number 3 using xhci-hcd
[    3.733540] usb 1-1.1: New USB device found, idVendor=0424, idProduct=2240, bcdDevice= 1.98
[    3.741887] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.749198] usb 1-1.1: Product: Ultra Fast Media 
[    3.753900] usb 1-1.1: Manufacturer: Generic
[    3.758159] usb 1-1.1: SerialNumber: 000000225001
[    3.763395] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[    3.769933] scsi host0: usb-storage 1-1.1:1.0
[    3.787258] usb 3-1.3: new high-speed USB device number 3 using xhci-hcd
[    3.851269] usb 1-1.4: new high-speed USB device number 4 using xhci-hcd
[    3.891934] usb 3-1.3: New USB device found, idVendor=0424, idProduct=2740, bcdDevice= 2.00
[    3.900281] usb 3-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.907589] usb 3-1.3: Product: Hub Controller
[    3.912023] usb 3-1.3: Manufacturer: Microchip Tech
[    3.955925] usb 1-1.4: New USB device found, idVendor=0424, idProduct=2740, bcdDevice= 2.00
[    3.964271] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    3.971578] usb 1-1.4: Product: Hub Controller
[    3.976013] usb 1-1.4: Manufacturer: Microchip Tech
[    4.800007] scsi 0:0:0:0: Direct-Access     Generic  Ultra HS-COMBO   1.98 PQ: 0 ANSI: 0
[    4.809328] sd 0:0:0:0: [sda] 62410752 512-byte logical blocks: (32.0 GB/29.8 GiB)
[    4.817459] sd 0:0:0:0: [sda] Write Protect is off
[    4.822835] sd 0:0:0:0: [sda] No Caching mode page found
[    4.828141] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    4.838339]  sda: sda1 sda2
[    4.842928] sd 0:0:0:0: [sda] Attached SCSI removable disk
[    4.860557] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
[    4.869894] VFS: Mounted root (ext4 filesystem) on device 8:2.
[    4.877736] devtmpfs: mounted
[    4.881402] Freeing unused kernel memory: 3136K
[    4.885999] Run /sbin/init as init process
[    5.671088] systemd[1]: System time before build time, advancing clock.
[    5.796860] systemd[1]: systemd 247.3-7+deb11u1 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +ZSTD +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=unified)
[    5.820185] systemd[1]: Detected architecture arm64.

Welcome to Debian GNU/Linux 11 (bullseye)!

[    5.848123] systemd[1]: Set hostname to <debian-fpga>.
[    6.359008] systemd[1]: Queued start job for default target Multi-User System.
[    6.367726] random: systemd: uninitialized urandom read (16 bytes read)
[    6.376048] systemd[1]: Created slice system-getty.slice.
[  OK  ] Created slice system-getty.slice.
[    6.399341] random: systemd: uninitialized urandom read (16 bytes read)
[    6.406702] systemd[1]: Created slice system-modprobe.slice.
[  OK  ] Created slice system-modprobe.slice.
[    6.427329] random: systemd: uninitialized urandom read (16 bytes read)
[    6.434720] systemd[1]: Created slice system-serial\x2dgetty.slice.
[  OK  ] Created slice system-serial\x2dgetty.slice.
[    6.455906] systemd[1]: Created slice User and Session Slice.
[  OK  ] Created slice User and Session Slice.
[    6.479504] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Dispatch Password …ts to Console Directory Watch.
[    6.503445] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[  OK  ] Started Forward Password R…uests to Wall Directory Watch.
[    6.527422] systemd[1]: Condition check resulted in Arbitrary Executable File Formats File System Automount Point being skipped.
[    6.539123] systemd[1]: Reached target Local Encrypted Volumes.
[  OK  ] Reached target Local Encrypted Volumes.
[    6.559445] systemd[1]: Reached target Paths.
[  OK  ] Reached target Paths.
[    6.575352] systemd[1]: Reached target Remote File Systems.
[  OK  ] Reached target Remote File Systems.
[    6.595335] systemd[1]: Reached target Slices.
[  OK  ] Reached target Slices.
[    6.611358] systemd[1]: Reached target Swap.
[  OK  ] Reached target Swap.
[    6.628695] systemd[1]: Listening on Syslog Socket.
[  OK  ] Listening on Syslog Socket.
[    6.643517] systemd[1]: Listening on initctl Compatibility Named Pipe.
[  OK  ] Listening on initctl Compatibility Named Pipe.
[    6.667790] systemd[1]: Listening on Journal Audit Socket.
[  OK  ] Listening on Journal Audit Socket.
[    6.687547] systemd[1]: Listening on Journal Socket (/dev/log).
[  OK  ] Listening on Journal Socket (/dev/log).
[    6.707613] systemd[1]: Listening on Journal Socket.
[  OK  ] Listening on Journal Socket.
[    6.723671] systemd[1]: Listening on udev Control Socket.
[  OK  ] Listening on udev Control Socket.
[    6.743543] systemd[1]: Listening on udev Kernel Socket.
[  OK  ] Listening on udev Kernel Socket.
[    6.765598] systemd[1]: Mounting Huge Pages File System...
         Mounting Huge Pages File System...
[    6.785761] systemd[1]: Mounting POSIX Message Queue File System...
         Mounting POSIX Message Queue File System...
[    6.809757] systemd[1]: Mounting Kernel Debug File System...
         Mounting Kernel Debug File System...
[    6.829804] systemd[1]: Mounting Kernel Trace File System...
         Mounting Kernel Trace File System...
[    6.850287] systemd[1]: Starting Create list of static device nodes for the current kernel...
         Starting Create list of st…odes for the current kernel...
[    6.877902] systemd[1]: Starting Load Kernel Module configfs...
         Starting Load Kernel Module configfs...
[    6.897921] systemd[1]: Starting Load Kernel Module drm...
         Starting Load Kernel Module drm...
[    6.917829] systemd[1]: Starting Load Kernel Module fuse...
         Starting Load Kernel Module fuse...
[    6.937685] systemd[1]: Started Nameserver information manager.
[    6.943920] fuse: init (API version 7.34)
[  OK  ] Started Nameserver information manager.
[    6.963811] systemd[1]: Reached target Network (Pre).
[  OK  ] Reached target Network (Pre).
[    6.990457] systemd[1]: Condition check resulted in Set Up Additional Binary Formats being skipped.
[    7.003766] systemd[1]: Starting Journal Service...
         Starting Journal Service...
[    7.031691] systemd[1]: Starting Load Kernel Modules...
         Starting Load Kernel Modules...
[    7.050102] systemd[1]: Starting Remount Root and Kernel File Systems...
         Starting Remount Root and Kernel File Systems...
[    7.073860] systemd[1]: Starting Coldplug All udev Devices...
         Starting Coldplug All udev Devices...
[    7.096709] systemd[1]: Mounted Huge Pages File System.
[  OK  ] Mounted Huge Pages File System.
[    7.119755] systemd[1]: Mounted POSIX Message Queue File System.
[  OK  ] Mounted POSIX Message Queue File System.
[    7.143772] systemd[1]: Mounted Kernel Debug File System.
[  OK  ] Mounted Kernel Debug File System.
[    7.163745] systemd[1]: Mounted Kernel Trace File System.
[  OK  ] Mounted Kernel Trace File System.
[    7.184559] systemd[1]: Finished Create list of static device nodes for the current kernel.
[  OK  ] Finished Create list of st… nodes for the current kernel.
[    7.208325] systemd[1]: modprobe@configfs.service: Succeeded.
[    7.215049] systemd[1]: Finished Load Kernel Module configfs.
[  OK  ] Finished Load Kernel Module configfs.
[    7.235791] systemd[1]: Started Journal Service.
[  OK  ] Started Journal Service.
[  OK  ] Finished Load Kernel Module drm.
[  OK  ] Finished Load Kernel Module fuse.
[  OK  ] Finished Load Kernel Modules.
[  OK  ] Finished Remount Root and Kernel File Systems.
         Mounting FUSE Control File System...
         Mounting Kernel Configuration File System...
         Starting Flush Journal to Persistent Storage...
[    7.371753] random: systemd: uninitialized urandom read (16 bytes read)
[    7.378850] systemd-journald[234]: Received client request to flush runtime journal.
         Starting Load/Save Random Seed...
[    7.395467] random: systemd: uninitialized urandom read (16 bytes read)
         Starting Apply Kernel Variables...
[    7.415615] random: systemd: uninitialized urandom read (16 bytes read)
[    7.421226] systemd-journald[234]: File /var/log/journal/7cfb0797af654a1e8acd298db8399a1e/system.journal corrupted or uncleanly shut down, renaming and replacing.
         Starting Create System Users...
[  OK  ] Mounted FUSE Control File System.
[  OK  ] Mounted Kernel Configuration File System.
[  OK  ] Finished Apply Kernel Variables.
[  OK  ] Finished Create System Users.
         Starting Create Static Device Nodes in /dev...
[  OK  ] Finished Coldplug All udev Devices.
         Starting Helper to synchronize boot up for ifupdown...
[  OK  ] Finished Create Static Device Nodes in /dev.
[  OK  ] Reached target Local File Systems (Pre).
         Mounting /config...
         Starting Rule-based Manage…for Device Events and Files...
[  OK  ] Finished Helper to synchronize boot up for ifupdown.
[  OK  ] Mounted /config.
[  OK  ] Finished Flush Journal to Persistent Storage.
[  OK  ] Started Rule-based Manager for Device Events and Files.
[  OK  ] Found device /dev/ttyPS1.
[    8.159282] random: crng init done
[    8.162692] random: 67 urandom warning(s) missed due to ratelimiting
[  OK  ] Finished Load/Save Random Seed.
[  OK  ] Found device Ultra_HS-COMBO boot.
[  OK  ] Reached target Sound Card.
[  OK  ] Listening on Load/Save RF …itch Status /dev/rfkill Watch.
         Mounting /mnt/boot...
[  OK  ] Mounted /mnt/boot.
[  OK  ] Reached target Local File Systems.
[  OK  ] Started ifup for eth0.
         Starting Raise network interfaces...
         Starting Create Volatile Files and Directories...
[  OK  ] Finished Create Volatile Files and Directories.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
         Starting Update UTMP about System Boot/Shutdown...
[  OK  ] Finished Update UTMP about System Boot/Shutdown.
[  OK  ] Reached target System Initialization.
[  OK  ] Started Daily apt download activities.
[  OK  ] Started Daily apt upgrade and clean activities.
[  OK  ] Started Periodic ext4 Onli…ata Check for All Filesystems.
[  OK  ] Started Discard unused blocks once a week.
[  OK  ] Started Daily rotation of log files.
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Reached target Timers.
[  OK  ] Listening on Avahi mDNS/DNS-SD Stack Activation Socket.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Reached target Sockets.
[  OK  ] Reached target Basic System.
[   10.108527] macb ff0c0000.ethernet eth0: PHY [ff0c0000.ethernet-ffffffff:08] driver [TI DP83867] (irq=POLL)
[   10.119106] macb ff0c0000.ethernet eth0: configuring for phy/rgmii-id link mode
[   10.127138] pps pps0: new PPS source ptp0
[   10.131661] macb ff0c0000.ethernet: gem-ptp-timer ptp clock registered.
         Starting Avahi mDNS/DNS-SD Stack...
[  OK  ] Started Regular background program processing daemon.
[  OK  ] Started D-Bus System Message Bus.
         Starting System Logging Service...
         Starting User Login Management...
         Starting WPA supplicant...
[  OK  ] Finished Raise network interfaces.
[  OK  ] Started System Logging Service.
[  OK  ] Started User Login Management.
[  OK  ] Started Avahi mDNS/DNS-SD Stack.
[  OK  ] Started WPA supplicant.
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.
         Starting Samba NMB Daemon...
         Starting Network Time Service...
         Starting OpenBSD Secure Shell server...
         Starting Permit User Sessions...
[  OK  ] Finished Permit User Sessions.
[  OK  ] Started Getty on tty1.
[  OK  ] Started Serial Getty on ttyPS1.
[  OK  ] Reached target Login Prompts.
[  OK  ] Started Network Time Service.
[  OK  ] Started OpenBSD Secure Shell server.

Debian GNU/Linux 11 debian-fpga ttyPS1

debian-fpga login:  

  1. 2023年04月30日 09:10 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみる2

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみる”の続き。

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみようということで、前回、MicroSD カードに Debian11 を書いて、起動してみたが、ブート途中で止まってしまった。今回、ikwzm さんに修正していただいた Debian11 を起動してみた。前回よりは長く動いたが、やはり途中で止まってしまった。

v0.1.0.tar.gz と ZynqMP-FPGA-Debian11-0.1.0 を一旦削除した。

再度 v0.1.0.tar.gz を wget して展開した。
wget https://github.com/ikwzm/ZynqMP-FPGA-Debian11/archive/refs/tags/v0.1.0.tar.gz
tar xfz v0.1.0.tar.gz
cd ZynqMP-FPGA-Debian11-0.1.0


MicroSD カードの boot パーティションのファイルを全部消去した。
rm /media/masaaki/boot/*

MicroSD カードの boot パーティションにファイルをコピーした。
cp target/Kr260/boot/* /media/masaaki/boot
gzip -d -c files/vmlinuz-5.15.108-zynqmp-fpga-generic-2 > /media/masaaki/boot/image-5.15.108-zynqmp-fpga-generic


MicroSD カードの boot, root パーティションをアンマウントして、KR260 に挿入して、電源ON でブートしたところ、前回よりは長く起動したが、途中で止まってしまった。

起動ログを貼っておく。

Xilinx Zynq MP First Stage Boot Loader 
Release 2022.1   Sep 16 2022  -  04:56:15
MultiBootOffset: 0x1F0
Reset Mode  :   System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode 
FlashID=0x20 0xBB 0x20
Pr�NOTICE:  BL31: v2.6(release):0897efd
NOTICE:  BL31: Built : 04:58:29, Sep 16 2022


U-Boot 2022.01-g91ad7924-dirty (Sep 15 2022 - 23:00:49 -0600), Build: jenkins-BUILDS-2022.1-som_qspi_generation-131

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-rev1-sck-kr-g-rev1
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1CYY0C2I3
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: 1
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1V0BJCWOF
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: 1
EL Level:   EL2
Chip ID:    xck26
NAND:  0 MiB
MMC:   
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT 
Net:   
ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii
eth0: ethernet@ff0b0000
ZYNQ GEM: ff0c0000, mdio bus ff0c0000, phyaddr 8, interface rgmii-id
, eth1: ethernet@ff0c0000
starting USB...
Bus usb@fe200000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
Bus usb@fe300000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus usb@fe200000 for devices... 5 USB Device(s) found
scanning bus usb@fe300000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
Hit any key to stop autoboot:  0 
model=SMK-K26-XCL2G

Device 0: Vendor: Generic  Rev: 1.98 Prod: Ultra HS-COMBO
            Type: Removable Hard Disk
            Capacity: 30474.0 MB = 29.7 GB (62410752 x 512)
... is now current device
Scanning usb 0:1...
Found U-Boot script /boot.scr
2661 bytes read in 2 ms (1.3 MiB/s)
## Executing script at 20000000
Trying to load boot images from usb0
2280 bytes read in 1 ms (2.2 MiB/s)
Importing environment(uEnv.txt) from usb0...
Running uenvcmd ...
23863808 bytes read in 1561 ms (14.6 MiB/s)
44332 bytes read in 4 ms (10.6 MiB/s)
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Device Tree to 000000000fff2000, end 000000000ffffd2b ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.15.108-zynqmp-fpga-generic (ichiro@Jabberwock) (aarch64-linux-gnu-gcc (Ubuntu/Linaro 7.5.0-3ubuntu1~18.04) 7.5.0, GNU ld (GNU Binutils for Ubuntu) 2.30) #2 SMP Fri Apr 28 09:35:46 JST 2023
[    0.000000] Machine model: ZynqMP SMK-K26 Rev1/B/A
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000000000000-0x00000000ffffffff]
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000087fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000007fffffff]
[    0.000000]   node   0: [mem 0x0000000800000000-0x000000087fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000087fffffff]
[    0.000000] cma: Reserved 1000 MiB at 0x0000000041800000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 27 pages/cpu s73496 r8192 d28904 u110592
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: ARM erratum 845719
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1032192
[    0.000000] Kernel command line: console=ttyPS1,115200 root=/dev/sda2 rw rootwait systemd.unit=multi-user.target cpuidle.off=1 cma=1000M uio_pdrv_genirq.of_id=generic-uio
[    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] software IO TLB: mapped [mem 0x000000003d800000-0x0000000041800000] (64MB)
[    0.000000] Memory: 2999472K/4194304K available (14272K kernel code, 1928K rwdata, 3880K rodata, 3136K init, 591K bss, 170832K reserved, 1024000K cma-reserved)
[    0.000000] trace event string verifier disabled
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000]  Tracing variant of Tasks RCU enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GIC: Adjusting CPU interface base to 0x00000000f902f000
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] arch_timer: cp15 timer(s) running at 99.99MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171015c90f, max_idle_ns: 440795203080 ns
[    0.000000] sched_clock: 56 bits at 99MHz, resolution 10ns, wraps every 4398046511101ns
[    0.000392] Console: colour dummy device 80x25
[    0.000424] Calibrating delay loop (skipped), value calculated using timer frequency.. 199.99 BogoMIPS (lpj=399996)
[    0.000435] pid_max: default: 32768 minimum: 301
[    0.000607] LSM: Security Framework initializing
[    0.000699] AppArmor: AppArmor initialized
[    0.000786] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.000805] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.002004] rcu: Hierarchical SRCU implementation.
[    0.002292] EFI services will not be available.
[    0.002467] smp: Bringing up secondary CPUs ...
[    0.002909] Detected VIPT I-cache on CPU1
[    0.002950] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[    0.003425] Detected VIPT I-cache on CPU2
[    0.003448] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[    0.003884] Detected VIPT I-cache on CPU3
[    0.003906] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[    0.003987] smp: Brought up 1 node, 4 CPUs
[    0.004002] SMP: Total of 4 processors activated.
[    0.004008] CPU features: detected: 32-bit EL0 Support
[    0.004012] CPU features: detected: CRC32 instructions
[    0.004055] CPU: All CPU(s) started at EL2
[    0.004072] alternatives: patching kernel code
[    0.005101] devtmpfs: initialized
[    0.011103] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.011122] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.033351] pinctrl core: initialized pinctrl subsystem
[    0.034301] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.035431] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[    0.035521] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.035552] audit: initializing netlink subsys (disabled)
[    0.035645] audit: type=2000 audit(0.032:1): state=initialized audit_enabled=0 res=1
[    0.036092] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.036157] ASID allocator initialised with 65536 entries
[    0.053801] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.053817] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[    0.053823] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.053829] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[    0.055213] cryptd: max_cpu_qlen set to 1000
[    0.056906] iommu: Default domain type: Translated 
[    0.056915] iommu: DMA domain TLB invalidation policy: strict mode 
[    0.057048] vgaarb: loaded
[    0.057266] SCSI subsystem initialized
[    0.057410] usbcore: registered new interface driver usbfs
[    0.057438] usbcore: registered new interface driver hub
[    0.057461] usbcore: registered new device driver usb
[    0.057523] mc: Linux media interface: v0.10
[    0.057543] videodev: Linux video capture interface: v2.00
[    0.057578] pps_core: LinuxPPS API ver. 1 registered
[    0.057584] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    0.057596] PTP clock support registered
[    0.057625] EDAC MC: Ver: 3.0.0
[    0.057972] zynqmp-ipi-mbox mailbox@ff990400: Registered ZynqMP IPI mbox with TX/RX channels.
[    0.058148] FPGA manager framework
[    0.058271] Advanced Linux Sound Architecture Driver Initialized.
[    0.058605] NetLabel: Initializing
[    0.058610] NetLabel:  domain hash size = 128
[    0.058615] NetLabel:  protocols = UNLABELED CIPSOv4 CALIPSO
[    0.058665] NetLabel:  unlabeled traffic allowed by default
[    0.059033] clocksource: Switched to clocksource arch_sys_counter
[    0.086164] VFS: Disk quotas dquot_6.6.0
[    0.086221] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    0.086580] AppArmor: AppArmor Filesystem Enabled
[    0.159068] NET: Registered PF_INET protocol family
[    0.159224] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    0.160723] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[    0.160764] Table-perturb hash table entries: 65536 (order: 6, 262144 bytes, linear)
[    0.160776] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    0.160963] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)
[    0.161326] TCP: Hash tables configured (established 32768 bind 32768)
[    0.161404] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.161474] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    0.161615] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    0.162097] RPC: Registered named UNIX socket transport module.
[    0.162104] RPC: Registered udp transport module.
[    0.162108] RPC: Registered tcp transport module.
[    0.162112] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    0.162703] PCI: CLS 0 bytes, default 64
[    0.709608] armv8-pmu pmu: hw perfevents: no interrupt-affinity property, guessing.
[    0.709780] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
[    0.714145] Initialise system trusted keyrings
[    0.714242] workingset: timestamp_bits=46 max_order=20 bucket_order=0
[    0.714971] NFS: Registering the id_resolver key type
[    0.714999] Key type id_resolver registered
[    0.715004] Key type id_legacy registered
[    0.715042] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    0.715050] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    0.715070] jffs2: version 2.2. (NAND) © 2001-2006 Red Hat, Inc.
[    0.747807] NET: Registered PF_ALG protocol family
[    0.747817] Key type asymmetric registered
[    0.747823] Asymmetric key parser 'x509' registered
[    0.747867] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 246)
[    0.747943] io scheduler mq-deadline registered
[    0.747950] io scheduler kyber registered
[    0.749413] Error: Driver 'clk-wizard' is already registered, aborting...
[    0.775207] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    0.778395] cacheinfo: Unable to detect cache hierarchy for CPU 0
[    0.783015] brd: module loaded
[    0.786597] loop: module loaded
[    0.787071] mtdoops: mtd device (mtddev=name/number) must be supplied
[    0.789479] tun: Universal TUN/TAP device driver, 1.6
[    0.790085] PPP generic driver version 2.4.2
[    0.790160] SPI driver wl1271_spi has no spi_device_id for ti,wl1271
[    0.790167] SPI driver wl1271_spi has no spi_device_id for ti,wl1273
[    0.790172] SPI driver wl1271_spi has no spi_device_id for ti,wl1281
[    0.790177] SPI driver wl1271_spi has no spi_device_id for ti,wl1283
[    0.790181] SPI driver wl1271_spi has no spi_device_id for ti,wl1285
[    0.790186] SPI driver wl1271_spi has no spi_device_id for ti,wl1801
[    0.790190] SPI driver wl1271_spi has no spi_device_id for ti,wl1805
[    0.790195] SPI driver wl1271_spi has no spi_device_id for ti,wl1807
[    0.790199] SPI driver wl1271_spi has no spi_device_id for ti,wl1831
[    0.790204] SPI driver wl1271_spi has no spi_device_id for ti,wl1835
[    0.790208] SPI driver wl1271_spi has no spi_device_id for ti,wl1837
[    0.791191] usbcore: registered new interface driver uas
[    0.791226] usbcore: registered new interface driver usb-storage
[    0.791996] rtc_zynqmp ffa60000.rtc: registered as rtc0
[    0.792014] rtc_zynqmp ffa60000.rtc: setting system clock to 1970-01-01T00:00:06 UTC (6)
[    0.792070] i2c_dev: i2c /dev entries driver
[    0.793436] usbcore: registered new interface driver uvcvideo
[    0.794137] EDAC MC: ECC not enabled
[    0.794275] EDAC DEVICE0: Giving out device to module zynqmp-ocm-edac controller zynqmp_ocm: DEV ff960000.memory-controller (INTERRUPT)
[    0.794635] failed to register cpuidle driver
[    0.794833] sdhci: Secure Digital Host Controller Interface driver
[    0.794838] sdhci: Copyright(c) Pierre Ossman
[    0.794842] sdhci-pltfm: SDHCI platform and OF driver helper
[    0.795191] ledtrig-cpu: registered to indicate activity on CPUs
[    0.795268] SMCCC: SOC_ID: ARCH_SOC_ID not implemented, skipping ....
[    0.795337] zynqmp_firmware_probe Platform Management API v1.1
[    0.795345] zynqmp_firmware_probe Trustzone version v1.0
[    0.824318] securefw securefw: securefw probed
[    0.824413] zynqmp_aes firmware:zynqmp-firmware:zynqmp-aes: The zynqmp-aes driver shall be deprecated in 2022.2 and removed in 2023.1
[    0.824601] zynqmp_aes firmware:zynqmp-firmware:zynqmp-aes: AES Successfully Registered
[    0.824714] zynqmp-keccak-384 firmware:zynqmp-firmware:sha384: The zynqmp-sha-deprecated driver shall be deprecated in 2022.2 and removed in 2023.1 release
[    0.825128] usbcore: registered new interface driver usbhid
[    0.825135] usbhid: USB HID core driver
[    0.828044] fpga_manager fpga0: Xilinx ZynqMP FPGA Manager registered
[    0.829128] drop_monitor: Initializing network drop monitor service
[    0.829263] Initializing XFRM netlink socket
[    0.829356] NET: Registered PF_INET6 protocol family
[    0.829909] Segment Routing with IPv6
[    0.829937] In-situ OAM (IOAM) with IPv6
[    0.829978] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    0.830307] NET: Registered PF_PACKET protocol family
[    0.830322] NET: Registered PF_KEY protocol family
[    0.830328] can: controller area network core
[    0.830359] NET: Registered PF_CAN protocol family
[    0.830364] can: raw protocol
[    0.830371] can: broadcast manager protocol
[    0.830380] can: netlink gateway - max_hops=1
[    0.830561] 9pnet: Installing 9P2000 support
[    0.830591] Key type dns_resolver registered
[    0.831096] registered taskstats version 1
[    0.831109] Loading compiled-in X.509 certificates
[    0.831328] AppArmor: AppArmor sha1 policy hashing enabled
[    0.840347] ff010000.serial: ttyPS1 at MMIO 0xff010000 (irq = 51, base_baud = 6249999) is a xuartps
[    1.974449] printk: console [ttyPS1] enabled
[    1.979104] of-fpga-region fpga-full: FPGA Region probed
[    1.985138] xilinx-zynqmp-dma fd500000.dma-controller: ZynqMP DMA driver Probe success
[    1.993214] xilinx-zynqmp-dma fd510000.dma-controller: ZynqMP DMA driver Probe success
[    2.001296] xilinx-zynqmp-dma fd520000.dma-controller: ZynqMP DMA driver Probe success
[    2.009372] xilinx-zynqmp-dma fd530000.dma-controller: ZynqMP DMA driver Probe success
[    2.017449] xilinx-zynqmp-dma fd540000.dma-controller: ZynqMP DMA driver Probe success
[    2.025523] xilinx-zynqmp-dma fd550000.dma-controller: ZynqMP DMA driver Probe success
[    2.033600] xilinx-zynqmp-dma fd560000.dma-controller: ZynqMP DMA driver Probe success
[    2.041664] xilinx-zynqmp-dma fd570000.dma-controller: ZynqMP DMA driver Probe success
[    2.049804] xilinx-zynqmp-dma ffa80000.dma-controller: ZynqMP DMA driver Probe success
[    2.057878] xilinx-zynqmp-dma ffa90000.dma-controller: ZynqMP DMA driver Probe success
[    2.065949] xilinx-zynqmp-dma ffaa0000.dma-controller: ZynqMP DMA driver Probe success
[    2.074018] xilinx-zynqmp-dma ffab0000.dma-controller: ZynqMP DMA driver Probe success
[    2.082093] xilinx-zynqmp-dma ffac0000.dma-controller: ZynqMP DMA driver Probe success
[    2.090180] xilinx-zynqmp-dma ffad0000.dma-controller: ZynqMP DMA driver Probe success
[    2.098256] xilinx-zynqmp-dma ffae0000.dma-controller: ZynqMP DMA driver Probe success
[    2.106335] xilinx-zynqmp-dma ffaf0000.dma-controller: ZynqMP DMA driver Probe success
[    2.114733] xilinx-zynqmp-dpdma fd4c0000.dma-controller: Xilinx DPDMA engine is probed
[    2.126019] zynqmp-display fd4a0000.display: vtc bridge property not present
[    2.135969] xilinx-dp-snd-codec fd4a0000.display:zynqmp_dp_snd_codec0: Xilinx DisplayPort Sound Codec probed
[    2.146039] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm0: Xilinx DisplayPort Sound PCM probed
[    2.154092] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm1: Xilinx DisplayPort Sound PCM probed
[    2.162927] xilinx-dp-snd-card fd4a0000.display:zynqmp_dp_snd_card: Xilinx DisplayPort Sound Card probed
[    2.166729] zynqmp_pll_disable() clock disable failed for dpll_int, ret = -13
[    2.172514] OF: graph: no port node found in /axi/display@fd4a0000
[    2.186103] xlnx-drm xlnx-drm.0: bound fd4a0000.display (ops 0xffffffc008eadb40)
[    2.193709] [drm] Initialized xlnx 1.0.0 20130509 for fd4a0000.display on minor 0
[    2.201215] zynqmp-display fd4a0000.display: ZynqMP DisplayPort Subsystem driver probed
[    2.211052] spi-nor spi0.0: mt25qu512a (65536 Kbytes)
[    2.216168] 17 fixed-partitions partitions found on MTD device spi0.0
[    2.222609] Creating 17 MTD partitions on "spi0.0":
[    2.227483] 0x000000000000-0x000000080000 : "Image Selector"
[    2.234000] 0x000000080000-0x000000100000 : "Image Selector Golden"
[    2.240677] tpm_tis_spi spi2.0: 2.0 TPM (device-id 0x1B, rev-id 22)
[    2.247437] 0x000000100000-0x000000120000 : "Persistent Register"
[    2.254293] 0x000000120000-0x000000140000 : "Persistent Register Backup"
[    2.261281] tpm tpm0: A TPM error (256) occurred attempting the self test
[    2.261793] 0x000000140000-0x000000200000 : "Open_1"
[    2.268071] tpm tpm0: starting up the TPM manually
[    2.273731] 0x000000200000-0x000000f00000 : "Image A (FSBL, PMU, ATF, U-Boot)"
[    2.285793] 0x000000f00000-0x000000f80000 : "ImgSel Image A Catch"
[    2.292714] 0x000000f80000-0x000001c80000 : "Image B (FSBL, PMU, ATF, U-Boot)"
[    2.300668] 0x000001c80000-0x000001d00000 : "ImgSel Image B Catch"
[    2.307640] 0x000001d00000-0x000001e00000 : "Open_2"
[    2.313366] 0x000001e00000-0x000002000000 : "Recovery Image"
[    2.319794] 0x000002000000-0x000002200000 : "Recovery Image Backup"
[    2.326794] 0x000002200000-0x000002220000 : "U-Boot storage variables"
[    2.334036] 0x000002220000-0x000002240000 : "U-Boot storage variables backup"
[    2.341902] 0x000002240000-0x000002280000 : "SHA256"
[    2.347608] 0x000002280000-0x0000022a0000 : "Secure OS Storage"
[    2.354258] 0x0000022a0000-0x000004050000 : "User"
[    2.359050] mtd: partition "User" extends beyond the end of device "spi0.0" -- size truncated to 0x1d60000
[    2.369989] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.377497] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.409088] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.439913] xilinx-axipmon ffa00000.perf-monitor: Probed Xilinx APM
[    2.446468] xilinx-axipmon fd0b0000.perf-monitor: Probed Xilinx APM
[    2.452960] xilinx-axipmon fd490000.perf-monitor: Probed Xilinx APM
[    2.459469] xilinx-axipmon ffa10000.perf-monitor: Probed Xilinx APM
[    2.466948] at24 1-0050: supply vcc not found, using dummy regulator
[    2.473640] at24 1-0050: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.480483] at24 1-0051: supply vcc not found, using dummy regulator
[    2.487128] at24 1-0051: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    2.495058] i2c i2c-1: Added multiplexed i2c bus 3
[    2.499980] i2c i2c-1: Added multiplexed i2c bus 4
[    2.504892] i2c i2c-1: Added multiplexed i2c bus 5
[    2.509811] i2c i2c-1: Added multiplexed i2c bus 6
[    2.514609] pca954x 1-0074: registered 4 multiplexed busses for I2C switch pca9546
[    2.522209] cdns-i2c ff030000.i2c: 400 kHz mmio ff030000 irq 40
[    2.529460] cdns-wdt fd4d0000.watchdog: Xilinx Watchdog Timer with timeout 60s
[    2.536925] cdns-wdt ff150000.watchdog: Xilinx Watchdog Timer with timeout 10s
[    2.545254] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.552167] macb ff0b0000.ethernet: invalid hw address, using random
[    2.559081] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.584896] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.591801] macb ff0c0000.ethernet: invalid hw address, using random
[    2.624140] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.631064] macb ff0b0000.ethernet: invalid hw address, using random
[    2.637880] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.668859] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.675766] macb ff0c0000.ethernet: invalid hw address, using random
[    2.710546] input: gpio-keys as /devices/platform/gpio-keys/input/input0
[    2.717587] of_cfs_init
[    2.717865] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.720056] of_cfs_init: OK
[    2.726949] macb ff0b0000.ethernet: invalid hw address, using random
[    2.729838] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    2.736579] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.745104] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    2.760708] ALSA device list:
[    2.763666]   #0: DisplayPort monitor
[    2.768052] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    2.776665] cfg80211: failed to load regulatory.db
[    2.801110] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.808028] macb ff0c0000.ethernet: invalid hw address, using random
[    2.893669] Waiting for root device /dev/sda2...
[    2.893858] macb ff0b0000.ethernet: Not enabling partial store and forward
[    2.905186] macb ff0b0000.ethernet: invalid hw address, using random
[    2.912012] macb ff0b0000.ethernet eth0: Defer probe as mdio producer ff0c0000.ethernet is not probed
[    2.936890] macb ff0c0000.ethernet: Not enabling partial store and forward
[    2.943789] macb ff0c0000.ethernet: invalid hw address, using random

  1. 2023年04月29日 05:11 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみる

KR260 で ikwzm さんの ZynqMP-FPGA-Debian11-0.1.0 を動作させてみよう。

ZynqMP-FPGA-Debian11/doc/install/kr260.md に従って作業をする。

wget https://github.com/ikwzm/ZynqMP-FPGA-Debian11/archive/refs/tags/v0.1.0.tar.gz
kr260_Debian11_1_230427.png

tar xfz v0.1.0.tar.gz
cd ZynqMP-FPGA-Debian11-0.1.0

kr260_Debian11_2_230427.png

ZynqMP-FPGA-Debian11-0.1.0/target/Kr260/boot ディレクトリを示す。
kr260_Debian11_3_230427.png

MicroSD カードをフォーマットする。
私のマシンでは、lsblk を実行すると /dev/sdf1 にマウントされていた。
sudo umount /dev/sdf1
sudo fdisk /dev/sdf

kr260_Debian11_4_230427.png

p コマンドでディスクの状態を表示した。

d コマンドでパーティションを削除した。
p コマンドでディスクの状態を表示した

n コマンドで新しいパーティションを作製した。
p で primary を指定した。
バーティション番号を 1 とした。
First sector の指定で Enter キーを押した。
Last sector で +100M を入力した。第1パーティションに 100MB の領域を確保した。

n コマンドで新しいパーティションを作製した。
p で primary を指定した。
バーティション番号を 2 とした。
First sector の指定で Enter キーを押した。
Last sector で Enter キーを押して、MicroSD カードの残りの領域を確保した(7.3GB)。

第 1 パーティションをFAT32 にして、 bootable に設定する。
t コマンドを入力する。
パーティション番号に 1 を指定する。
Partition type に b を指定した。

a コマンドを入力する。
パーティション番号に 1 を入力した。

w コマンドで partition table の変更を保存して終了した。

sudo mkfs.msdos -n boot /dev/sdf1
sdf1 を mkfs.msdos で FAT32 でフォーマットした。
sudo mkfs.ext4 -L root /dev/sdf2
sdf2 を ext4 でフォーマットした。
kr260_Debian11_5_230427.png

フォーマットした microSD カードの boot と root をファイルマネージャー上でクリックして、マウントした。

boot パーティションにファイルを転送する。
cp target/Kr260/boot/* /media/masaaki/boot
gzip -d -c files/vmlinuz-5.15.108-zynqmp-fpga-generic-1 > /media/masaaki/boot/image-5.15.108-zynqmp-fpga-generic


root パーティションにファイルを転送する。
cat debian11-rootfs-vanilla.tgz.files/* | sudo tar xfz - -C /media/masaaki/root
sudo mkdir /media/masaaki/root/home/fpga/debian
sudo cp debian/* /media/masaaki/root/home/fpga/debian


/etc/fstab に boot パーティションをマウントする設定を書き込む。
sudo su
vi /media/masaaki/root/etc/fstab

vi 上で o コマンドを実行して、下に以下の行を追加した。

/dev/mmcblk1p1  /mnt/boot       auto            defaults        0       0


exit

boot パーティションを示す。
kr260_Debian11_6_230427.png

root パーティションを示す。
kr260_Debian11_7_230427.png

ファイルマネージャー上で boot , root をアンマウントした。

MicroSD カードを KR260 に入れて電源ON した。
ブートが途中で止まった。
kr260_Debian11_8_230427.png

ブートログを示す。

Xilinx Zynq MP First Stage Boot Loader 
Release 2022.1   Sep 16 2022  -  04:56:15
MultiBootOffset: 0x1F0
Reset Mode  :   System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode 
FlashID=0x20 0xBB 0x20
Pr�NOTICE:  BL31: v2.6(release):0897efd
NOTICE:  BL31: Built : 04:58:29, Sep 16 2022


U-Boot 2022.01-g91ad7924-dirty (Sep 15 2022 - 23:00:49 -0600), Build: jenkins-BUILDS-2022.1-som_qspi_generation-131

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-rev1-sck-kr-g-rev1
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1CYY0C2I3
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: 1
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1V0BJCWOF
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: 1
EL Level:   EL2
Chip ID:    xck26
NAND:  0 MiB
MMC:   
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT 
Net:   
ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii
eth0: ethernet@ff0b0000
ZYNQ GEM: ff0c0000, mdio bus ff0c0000, phyaddr 8, interface rgmii-id
, eth1: ethernet@ff0c0000
starting USB...
Bus usb@fe200000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
Bus usb@fe300000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus usb@fe200000 for devices... 5 USB Device(s) found
scanning bus usb@fe300000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
Hit any key to stop autoboot:  0 
model=SMK-K26-XCL2G

Device 0: Vendor: Generic  Rev: 1.98 Prod: Ultra HS-COMBO
            Type: Removable Hard Disk
            Capacity: 30474.0 MB = 29.7 GB (62410752 x 512)
... is now current device
Scanning usb 0:1...
Found U-Boot script /boot.scr
2594 bytes read in 2 ms (1.2 MiB/s)
## Executing script at 20000000
Trying to load boot images from usb0
Trying to load boot images from usb1
Trying to load boot images from usb2
Trying to load boot images from usb3
Trying to load boot images from pxe
Trying to load boot images from dhcp
SCRIPT FAILED: continuing...

Device 1: unknown device

Device 2: unknown device

Device 3: unknown device
BOOTP broadcast 1
BOOTP broadcast 2
DHCP client bound to address 192.168.3.28 (433 ms)
missing environment variable: pxeuuid
Retrieving file: pxelinux.cfg/01-00-0a-35-0f-2b-0e
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A8031C
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A8031
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A803
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A80
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A8
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0A
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C0
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/C
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm-zynqmp-zynqmp
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm-zynqmp
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default-arm
*** ERROR: `serverip' not set
Retrieving file: pxelinux.cfg/default
*** ERROR: `serverip' not set
Config file not found
BOOTP broadcast 1
DHCP client bound to address 192.168.3.28 (185 ms)
## Executing script at 20000000
Trying to load boot images from usb0
Trying to load boot images from usb1
Trying to load boot images from usb2
Trying to load boot images from usb3
Trying to load boot images from pxe
Trying to load boot images from dhcp
BOOTP broadcast 1
DHCP client bound to address 192.168.3.28 (167 ms)
*** ERROR: `serverip' not set
libfdt fdt_check_header(): FDT_ERR_BADMAGIC
Scanning disk usb_mass_storage.lun0...
Found 3 disks
No EFI system partition
tpm_tis_spi_probe: missing reset GPIO
DFU alt info setting: done
SF: Detected mt25qu512a with page size 256 Bytes, erase size 64 KiB, total 64 MiB
No UEFI binary known at 0x18000000
ZynqMP> 


どこかインストール方法を間違えたのかも知れない?
  1. 2023年04月28日 05:35 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する6

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する5”の続き。

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9”で作成した DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホーム上に”Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI Masterバージョン1”のラプラシアン・フィルタを載せてみようということで、前回は、前々回作成した cam_dp_ov5642 実行ファイルを実行してみたところ、DisplayPort に画像は映ったが同期が掛かってない感じで画像が流れていた。BMP ファイルを表示してみたが、正常に表示されたので、カメラやカメラ回路は正常に動作しているようだ。今回は、”カメラ画像をDisplayPortに出力する9(アプリを作成、完成)”の cam_dp_ov5642.cpp は 1 つ GPIO が多かったので、その GPIO の設定を削除した。また、DisplayPort DMA の方から映像の同期信号をもらう回路になっているので、HD 解像度にする必要があった。そこで、HD 解像度に設定してみたが、カメラ画像は正常に映らなかった。

カメラ画像をDisplayPortに出力する9(アプリを作成、完成)”の cam_dp_ov5642.cpp は 1 つ GPIO が多かったので、その GPIO の設定を削除する。
KR260 の Petalinux 2022.1 の ~/examples/kr260_lap/cam_dp/cam_dp_ov5642.cpp を修正した。
kr260_cam_disp_159_230427.png

cmake して make を行い、cam_dp_ov5642 実行ファイルを生成した。
cd ~/examples/kr260_lap/cam_dp/build
cmake ..
make

kr260_cam_disp_160_230427.png

u-dma-buf をロードした。
sudo insmod ../../../u-dma-buf.ko udmabuf4=0x2000000
sudo chmod 666 /dev/udmabuf*

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap
sudo chmod 666 /dev/uio*


AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01

cam_dp_ov5642 を起動した。
./cam_dp_ov5642 -r 2
HD モードで起動した。
kr260_cam_disp_161_230427.png

DisplayPort の画像は正常に映らなかった。
しかし、カメラの前に手をかざすと画面が変化するので、データは出ているようだ。
kr260_cam_disp_163_230427.jpg

cam_dp_ov5642 実行ファイルが動作中に w コマンドで、bmp_file0.bmp を出力させた。
bmp_file0.bmp を示す。
カメラ回路は問題無さそうだ。
kr260_cam_disp_162_230427.jpg

cam_dp_ov5642.cpp を示す。

// cam_dp_ov5642.cpp (for KR260)
// 2018/12/14 by marsee
//
// This software converts the left and right of the camera image to BMP file.
// -b : bmp file name
// -n : Start File Number
// -h : help
//
// 2018/12/20 : completed.
// I am using the SVGA driver register setting of https://github.com/virajkanwade/rk3188_android_kernel/blob/master/drivers/media/video/ov5642.c
// 2018/12/22 : fixed
// 2018/12/30 : ov5642_inf_axis[0] fixed
// 2019/02/06 : for DisplayPort
// 2023/04/23 : kr260_cam_disp vitis platform
// 2023/04/25 : bug fix. axi_gpio_1-uio IP (active_frame input) is removed.

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>

#define PIXEL_NUM_OF_BYTES    4
#define NUMBER_OF_WRITE_FRAMES  3

#define SVGA_HORIZONTAL_PIXELS  800
#define SVGA_VERTICAL_LINES     600
#define SVGA_ALL_DISP_ADDRESS   (SVGA_HORIZONTAL_PIXELS * SVGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define SVGA_3_PICTURES         (SVGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define XGA_HORIZONTAL_PIXELS  1024
#define XGA_VERTICAL_LINES     768
#define XGA_ALL_DISP_ADDRESS   (XGA_HORIZONTAL_PIXELS * XGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define XGA_3_PICTURES         (XGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define HD_HORIZONTAL_PIXELS  1920
#define HD_VERTICAL_LINES     1080
#define HD_ALL_DISP_ADDRESS   (HD_HORIZONTAL_PIXELS * HD_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define HD_3_PICTURES         (HD_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution);

void cam_i2c_init(volatile unsigned *ov5642_axi_iic) {
    ov5642_axi_iic[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
    ov5642_axi_iic[64] = 0x1; // enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
    // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *ov5642_axi_iic, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    ov5642_axi_iic[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    ov5642_axi_iic[66] = (write_addr >> 8) & 0xff;  // address upper byte
    ov5642_axi_iic[66] = write_addr & 0xff;           // address lower byte
    ov5642_axi_iic[66] = 0x200 | (write_data & 0xff);      // data
    cam_i2x_write_sync();
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr);

int main(int argc, char *argv[]){
    int opt;
    int c, help_flag=0;
    char bmp_fn[256] = "bmp_file";
    char  attr[1024];
    unsigned long  phys_addr;
    int file_no = -1;
    int fd1, fd2, fd3, fd4, fd5, fd6, fd10, fd11;
    volatile unsigned int *ov5642_inf_axis, *axi_iic, *disp_dmar_axis, *vflip_dma_write;
    volatile unsigned int *axi_gpio_0, *axi_gpio_1;
    volatile unsigned int *frame_buffer;
    int active_frame;
    int resolution;
    int all_disp_addr;
    
    resolution = 1; // XGA
    while ((opt=getopt(argc, argv, "b:n:h:r:")) != -1){
        switch (opt){
            case 'b':
                strcpy(bmp_fn, optarg);
                break;
            case 'n':
                file_no = atoi(optarg);
                printf("file_no = %d\n", file_no+1);
                break;
            case 'r':
                resolution = atoi(optarg);
                break;
            case 'h':
                help_flag = 1;
                break;
        }
    }
    if(resolution == 0){
        printf("SVGA\n");
    } else if(resolution == 1){
        printf("XGA\n");
    } else {
        printf("HD\n");
    }

    if (help_flag == 1){ // help
        printf("Usage : cam_capture [-b <bmp file name>] [-n <Start File Number>] [-h]\n");
        printf("         -r [0|1|2](0:SVGA, 1:XGA, 2:HD)\n");
        exit(0);
    }
       
    // all_disp_addr
    switch(resolution){
        case 0 :
            all_disp_addr = SVGA_ALL_DISP_ADDRESS;
            break;
        case 1 :
            all_disp_addr = XGA_ALL_DISP_ADDRESS;
            break;
        default : // 2
            all_disp_addr = HD_ALL_DISP_ADDRESS;
            break;
    }
    
    // ov5642_inf_axis-uio IP
    fd1 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio6 (ov5642_inf_axis) open error\n");
        exit(-1);
    }
    ov5642_inf_axis = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!ov5642_inf_axis){
        fprintf(stderr, "ov5642_inf_axis mmap error\n");
        exit(-1);
    }
    
    // axi_iic-uio IP
    fd2 = open("/dev/uio4", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd2 < 1){
        fprintf(stderr, "/dev/uio4 (axi_iic) open error\n");
        exit(-1);
    }
    axi_iic = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
    if (!axi_iic){
        fprintf(stderr, "axi_iic mmap error\n");
        exit(-1);
    }

    // disp_dmar_axis-uio IP
    fd3 = open("/dev/uio9", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd3 < 1){
        fprintf(stderr, "/dev/uio9 (disp_dmar_axis) open error\n");
        exit(-1);
    }
    disp_dmar_axis = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!disp_dmar_axis){
        fprintf(stderr, "disp_dmar_axis mmap error\n");
        exit(-1);
    }

    // vflip_dma_write-uio IP
    fd4 = open("/dev/uio7", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd4 < 1){
        fprintf(stderr, "/dev/uio7 (vflip_dma_write) open error\n");
        exit(-1);
    }
    vflip_dma_write = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd4, 0);
    if (!vflip_dma_write){
        fprintf(stderr, "vflip_dma_write mmap error\n");
        exit(-1);
    }

    // axi_gpio_0-uio IP (init_done output)
    fd5 = open("/dev/uio8", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd5 < 1){
        fprintf(stderr, "/dev/uio8 (axi_gpio_0) open error\n");
        exit(-1);
    }
    axi_gpio_0 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd5, 0);
    if (!axi_gpio_0){
        fprintf(stderr, "axi_gpio_0 mmap error\n");
        exit(-1);
    }

    // axi_gpio_1-uio IP (active_frame input)
    /*fd6 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd6 < 1){
        fprintf(stderr, "/dev/uio6 (axi_gpio_1) open error\n");
        exit(-1);
    }
    axi_gpio_1 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd6, 0);
    if (!axi_gpio_1){
        fprintf(stderr, "axi_gpio_1 mmap error\n");
        exit(-1);
    } */
    
    
    // udmabuf4
    fd10 = open("/dev/udmabuf4", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd10 == -1){
        fprintf(stderr, "/dev/udmabuf4 open error\n");
        exit(-1);
    }
    frame_buffer = (volatile unsigned int *)mmap(NULL, all_disp_addr*NUMBER_OF_WRITE_FRAMES, PROT_READ|PROT_WRITE, MAP_SHARED, fd10, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer4 mmap error\n");
        exit(-1);
    }
    
    // phys_addr of udmabuf4
    fd11 = open("/sys/class/u-dma-buf/udmabuf4/phys_addr", O_RDONLY);
    if (fd11 == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf4/phys_addr open error\n");
        exit(-1);
    }
    read(fd11, attr, 1024);
    sscanf(attr, "%lx", &phys_addr);  
    close(fd11);
    printf("phys_addr = %x\n", (int)phys_addr);
    
    // vflip_dma_write start
    vflip_dma_write[6] = phys_addr; // fb0
    vflip_dma_write[8] = phys_addr+all_disp_addr; // fb1
    vflip_dma_write[10] = phys_addr+2*all_disp_addr; // fb2
    vflip_dma_write[12] = resolution;
    vflip_dma_write[0] = 0x1; // start
    vflip_dma_write[0] = 0x80; // EnableAutoRestart
       
    // CMOS Camera initialize, ov5642
    cam_i2c_init(axi_iic);
    
    cam_reg_set(axi_iic, 0x78); // OV5642 register set

    ov5642_inf_axis[0] = phys_addr; // ov5642 AXI4-Stream Start
    ov5642_inf_axis[1] = 0;
 
     // disp_dmar_axis start
    disp_dmar_axis[4] = phys_addr; // fb0
    disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
    disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
    disp_dmar_axis[10] = resolution;
    axi_gpio_0[0] = 1; // disp_dmar_axis start(init_done = 1)
    
    char bmp_file[256];

    // All 0 set
    int all_disp_frame_index = all_disp_addr/PIXEL_NUM_OF_BYTES*NUMBER_OF_WRITE_FRAMES;
    for (int i=0; i<all_disp_frame_index; i++){
        frame_buffer[i] = 0x0;
    }
    
    // w - writed the left and right eye's bmp files.  q - exit.
    c = getc(stdin);
    while(c != 'q'){
        switch ((char)c) {
            case 'w' : // w - writed a bmp files.
                // writed the frame buffer
                file_no++;
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                //active_frame = (int)(axi_gpio_1[0] & 0x3); // Data signal of active_frame_V
                active_frame = 0;
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'e' : // e - writed a same bmp files.
                // writed the frame buffer
                if (file_no == -1)
                    file_no = 0;
                
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(axi_gpio_1[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution);
                
                printf("file No. = %d\n", file_no);

                break;
        }
        c = getc(stdin);
    }
    
    munmap((void *)ov5642_inf_axis, 0x1000);
    munmap((void *)axi_iic, 0x1000);
    munmap((void *)disp_dmar_axis, 0x10000);
    munmap((void *)vflip_dma_write, 0x10000);
    munmap((void *)axi_gpio_0, 0x1000);
    munmap((void *)axi_gpio_1, 0x1000);
    munmap((void *)frame_buffer, all_disp_addr*3);
    
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);
    close(fd6);
    close(fd10);
    
    return(0);
}

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution){
    int read_frame;
    int img_width, img_height;
    
    if (active_frame == 0)
        read_frame = 2;
    else if (active_frame == 1)
        read_frame = 0;
    else // active_frame == 2
        read_frame = 1;
        
    switch(resolution){
        case 0 :
            img_width = SVGA_HORIZONTAL_PIXELS;
            img_height = SVGA_VERTICAL_LINES;
            break;
        case 1 :
            img_width = XGA_HORIZONTAL_PIXELS;
            img_height = XGA_VERTICAL_LINES;
            break;
        default : // case 2 :
            img_width = HD_HORIZONTAL_PIXELS;
            img_height = HD_VERTICAL_LINES;
            break;
    }
    
    int offset_addr = read_frame * img_width * img_height;
    
    cv::Mat img(img_height, img_width, CV_8UC3);

    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for(int y=0; y<img.rows; y++){
        for(int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            int rgb = frame_buffer[offset_addr+y*img.cols+x];
            pixel[0] = (rgb & 0xff); // blue
            pixel[1] = (rgb & 0xff00) >> 8; // green
            pixel[2] = (rgb & 0xff0000) >> 16; // red
            dst_vec3b(y,x) = pixel;
        }
    }
    
    cv::imwrite(bmp_file, img);
    
    return(0);
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr){
    cam_i2c_write(axi_iic, device_addr, 0x3103, 0x93);
    cam_i2c_write(axi_iic, device_addr, 0x3008, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x3017, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x3018, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc2);
    cam_i2c_write(axi_iic, device_addr, 0x3615, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x5c);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3005, 0xb7);
    cam_i2c_write(axi_iic, device_addr, 0x3006, 0x43);
    cam_i2c_write(axi_iic, device_addr, 0x3007, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3011, 0x08); // 0x08 - 15fps, 0x10 - 30fps
    cam_i2c_write(axi_iic, device_addr, 0x3010, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x460c, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x370c, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3602, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3612, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x3634, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3613, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3622, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3604, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0xa7);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x4000, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x401d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3600, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3606, 0x3f);
    cam_i2c_write(axi_iic, device_addr, 0x3c01, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x5020, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x79);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x0a);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5080, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x300e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x4610, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x471d, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x4708, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x3710, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3632, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3631, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61); // RGB565
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x73);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3824, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0xc1);
    cam_i2c_write(axi_iic, device_addr, 0x3705, 0xdb);
    cam_i2c_write(axi_iic, device_addr, 0x370a, 0x81);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3827, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a1a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a13, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a18, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a19, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x350c, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x350d, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3500, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3030, 0x0b);
    cam_i2c_write(axi_iic, device_addr, 0x3a02, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a03, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a04, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a14, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a15, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a16, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0x98);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x589b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x589a, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x4e);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x538a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538b, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x538c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538d, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538f, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xab);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x65);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x71);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x87);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x91);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x9a);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0xaa);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xcd);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xdd);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xea);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x86);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0x5b);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0x3b);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xed);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0xa5);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x3406, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04); // 0x04
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8); // 0xf8
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0xbd);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x68);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x02); // 0x02
    cam_i2c_write(axi_iic, device_addr, 0x3633, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0xb2);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x370b, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x3c00, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xFF);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5503, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0xE1);
    cam_i2c_write(axi_iic, device_addr, 0x538A, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538B, 0x2B);
    cam_i2c_write(axi_iic, device_addr, 0x538C, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538D, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538E, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538F, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xB3);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xA6);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x49);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x56);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x76);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x88);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0x96);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xcc);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0xee);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0xd8);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xb3);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0x90);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b1, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54b2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b3, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b4, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54b5, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x54b6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b7, 0xdf);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5587, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5588, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x558a, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x5589, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0xcf);
    cam_i2c_write(axi_iic, device_addr, 0x5800, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5801, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x5802, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5803, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5804, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5805, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5806, 0x29);
    cam_i2c_write(axi_iic, device_addr, 0x5807, 0x38);
    cam_i2c_write(axi_iic, device_addr, 0x5808, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x5809, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x580a, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x580b, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580c, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x580d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580e, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x580f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5810, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5811, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5812, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x5813, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5814, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5815, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5816, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5817, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5818, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5819, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x581a, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x581b, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581c, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581d, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x581e, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x581f, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5820, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x5821, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5822, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5823, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5824, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5825, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x5826, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x5827, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5828, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5829, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x582a, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x582b, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582c, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x582d, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582e, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x582f, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5830, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5831, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5832, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5833, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5834, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5835, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5836, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5837, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5838, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x5839, 0x39);
    cam_i2c_write(axi_iic, device_addr, 0x583a, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x583b, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x583c, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x583d, 0x23);
    cam_i2c_write(axi_iic, device_addr, 0x583e, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x583f, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x5840, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5841, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5842, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5843, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5844, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5845, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5846, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5847, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5848, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5849, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584a, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584b, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x584c, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584e, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x584f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5850, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5851, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5852, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5853, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5854, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5855, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5856, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5857, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5858, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5859, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x585a, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585b, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585c, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585d, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x585e, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x585f, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5860, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5861, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5862, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5863, 0x7);
    cam_i2c_write(axi_iic, device_addr, 0x5864, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5865, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5866, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5867, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5868, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5869, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x586a, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x586b, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x586c, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586d, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x586f, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5870, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5871, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5872, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5873, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5874, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x5875, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5876, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5877, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5878, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5879, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x587a, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x587b, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x587c, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587d, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587e, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x587f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5880, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5881, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5882, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5883, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5884, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5885, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5886, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5887, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5180, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0x9c);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x34);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x4c);
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5196, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5198, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5199, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x519a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x519b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x519c, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x519d, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x519e, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3800, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3802, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0x58);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0x81); // No Mirror
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xa7);
    
    cam_i2c_write(axi_iic, device_addr, 0x4740, 0x21);
    
    cam_i2c_write(axi_iic, device_addr, 0x501e, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5002, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61);
    
    return(0);
}

  1. 2023年04月27日 04:47 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 の Petalinux 2022.1 における DispalyPort レジスタの値

現在分かってる KR260 の Petalinux 2022.1 における DispalyPort レジスタの値を調べてみよう。

Ultra96V2 DisplayPort 挑戦中(作業記録)”と”Ultra96V2(ZynqMP)のDebian動作中にPLからDisplayPort出力”を参考にさせていただいている。

まずは、KR260 の Petalinux 2022.1 で DisplayPort DMA 関連のレジスタを見てプロンプトを表示している解像度を見ていく。
DP_MAIN_STREAM_HTOTAL (DISPLAY_PORT) Register
アドレス 0x00FD4A0180
sudo ./memread 0x00FD4A0180
00000820
10進数で 2080

DP_MAIN_STREAM_VTOTAL (DISPLAY_PORT) Register
アドレス 0x00FD4A0184
sudo ./memread 0x00FD4A0184
00000457
10進数で 1111

DP_MAIN_STREAM_POLARITY (DISPLAY_PORT) Register
アドレス 0x00FD4A0188
sudo ./memread 0x00FD4A0188
00000003
VSYNC_POLARITY, HSYNC_POLARITY 共に 1

DP_MAIN_STREAM_HSWIDTH (DISPLAY_PORT) Register
アドレス 0x00FD4A018C
sudo ./memread 0x00FD4A018C
0000002c
10進数で 44

DP_MAIN_STREAM_VSWIDTH (DISPLAY_PORT) Register
アドレス 0x00FD4A0190
sudo ./memread 0x00FD4A0190
00000005
10進数でも 5

DP_MAIN_STREAM_HRES (DISPLAY_PORT) Register
アドレス 0x00FD4A0194
sudo ./memread 0x00FD4A0194
00000780
10進数で 1920

DP_MAIN_STREAM_VRES (DISPLAY_PORT) Register
アドレス 0x00FD4A0198
sudo ./memread 0x00FD4A0198
00000438
10進数で 1080 なので、HD 解像度ということが分かった。

DP_MAIN_STREAM_HSTART (DISPLAY_PORT) Register
アドレス 0x00FD4A019C
sudo ./memread 0x00FD4A019C
00000048
10進数で 72

DP_MAIN_STREAM_VSTART (DISPLAY_PORT) Register
アドレス 0x00FD4A01A0
sudo ./memread 0x00FD4A01A0
0000001b
10進数で 27

live video 関連のレジスタを見ていく。
AV_BUF_AUD_VID_CLK_SOURCE (DISPLAY_PORT) Register
アドレス 0x00FD4AB120
sudo ./memread 0x00FD4AB120
00000007
VID_TIMING_SRC = 1: Internal Timin
AUD_CLK_SRC = 1: Clock from PS
VID_CLK_SRC = 1: Clock from PS(dp_vtc_pixel_clk_in)

AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register
アドレス 0x00FD4AB070
sudo ./memread 0x00FD4AB070
00000057
AUD_STREAM2_SEL = 1: Enable graphics from memory
AUD_STREAM1_SEL = 1: Audio from memory
VID_STREAM2_SEL = 01: Enable graphics from memory
VID_STREAM1_SEL = 3: None (black frames)

V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register
アドレス 0x00FD4AA00C
sudo ./memread 0x00FD4AA00C
000001ff
VALUE (Global Alpha Value) = 0xff
EN (Global Alpha Enable) = 1
  1. 2023年04月26日 05:07 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する5

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する4”の続き。

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9”で作成した DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホーム上に”Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI Masterバージョン1”のラプラシアン・フィルタを載せてみようということで、前回は、”カメラ画像をDisplayPortに出力する9(アプリを作成、完成)”の cam_dp_ov5642.cpp をコピーし、KR260 の kr260_cam_disp プラットホーム用に uio の番号を変更した。その後、cmake を行い、make を行って実行ファイルを生成した。今回は、前回作成した cam_dp_ov5642 実行ファイルを実行してみたところ、DisplayPort に画像は映ったが同期が掛かってない感じで画像が流れていた。BMP ファイルを表示してみたが、正常に表示されたので、カメラやカメラ回路は正常に動作しているようだ。

最初に KR260 の Petalinux 2022.1 を起動した状態で DisplayPort の表示を確認した。
DisplayPort 上にはログイン・プロンプトが表示されている。
kr260_cam_disp_157_230425.jpg

KR260 の Petalinux 2022.1 上で ~/examples/kr260_lap/cam_dp/build ディレクトリに移動した。
cd ~/examples/kr260_lap/cam_dp/build

u-dma-buf をロードした。
sudo insmod ../../../u-dma-buf.ko udmabuf4=0x2000000
sudo chmod 666 /dev/udmabuf*


現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap
sudo chmod 666 /dev/uio*


AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) に書き込んで、live video を表示した。
sudo ../../../mem/memwrite fd4ab070 54
sudo ../../../mem/memwrite fd4aa00c 01

kr260_cam_disp_151_230425.png

cam_dp_ov5642 を起動した。
./cam_dp_ov5642
XGA モードで起動した。
kr260_cam_disp_152_230425.png

DisplayPort の表示を確認したところ、画像が流れている。
kr260_cam_disp_158_230425.jpg

w コマンドを入れて BMP ファイルを作成した。
kr260_cam_disp_155_230425.png

bmp_file0.bmp ファイルが作成された。
kr260_cam_disp_154_230425.png

bmp_file0.bmp ファイルを示す。
正常に映っているので、カメラとカメラ回路は問題ないようだ。
kr260_cam_disp_156_230425.jpg
  1. 2023年04月25日 05:41 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する4

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する3”の続き。

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9”で作成した DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホーム上に”Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI Masterバージョン1”のラプラシアン・フィルタを載せてみようということで、前回は、u-dma-buf の用意と OpenCV の C++ ソフトウェアのコンパイルと実行を行えるように環境を整備した。今回は、”カメラ画像をDisplayPortに出力する9(アプリを作成、完成)”の cam_dp_ov5642.cpp をコピーし、KR260 の kr260_cam_disp プラットホーム用に uio の番号を変更した。その後、cmake を行い、make を行って実行ファイルを生成した。

KR260 の Petalinux 2022.1 で ~/examples/kr260_lap ディレクトリの下に cam_dp ディレクトリを作成した。
cd ~/examples
mkdir cam_dp
cd cam_dp


cam_dp ディレクトリに”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する3”を参考にし、 CMakeLists.txt を作成した。
kr260_cam_disp_146_230424.png

CMakeLists.txt を示す。

# Declare the variable SOURCE_CORDE and enter the value opencv_test.
# Can be overwritten with cmake -D SOURCE_CODE = (source name)

set(SOURCE_CODE cam_dp_ov5642 CACHE NAME "Target object name")

cmake_minimum_required(VERSION 2.8)

project( ${SOURCE_CODE} )

find_package( OpenCV REQUIRED )

include_directories( ${OpenCV_INCLUDE_DIRS} )

add_executable( ${SOURCE_CODE} ${SOURCE_CODE}.cpp )

target_link_libraries( ${SOURCE_CODE} ${OpenCV_LIBS} )


カメラ画像をDisplayPortに出力する9(アプリを作成、完成)”の cam_dp_ov5642.cpp をコピーし、KR260 の kr260_cam_disp プラットホーム用に uio の番号を変更した。
kr260_cam_disp_147_230424.png

cam_dp ディレクトリの下に build ディレクトリを作成した。
mkdir build

現在の ~/kr260_lap/cam_dp ディレクトリの様子を示す。
kr260_cam_disp_145_230424.png

build ディレクトリに行って cmake を実行した。
cd build
cmake ..

kr260_cam_disp_148_230424.png

cmake が成功した。

make を行った。
make
kr260_cam_disp_149_230424.png

make が成功して、cam_dp_ov5642 実行ファイルが生成された。

cam_dp_ov5642.cpp を貼っておく。

// cam_dp_ov5642.cpp (for KR260)
// 2018/12/14 by marsee
//
// This software converts the left and right of the camera image to BMP file.
// -b : bmp file name
// -n : Start File Number
// -h : help
//
// 2018/12/20 : completed.
// I am using the SVGA driver register setting of https://github.com/virajkanwade/rk3188_android_kernel/blob/master/drivers/media/video/ov5642.c
// 2018/12/22 : fixed
// 2018/12/30 : ov5642_inf_axis[0] fixed
// 2019/02/06 : for DisplayPort
// 2023/04/23 : kr260_cam_disp vitis platform

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>

#define PIXEL_NUM_OF_BYTES    4
#define NUMBER_OF_WRITE_FRAMES  3

#define SVGA_HORIZONTAL_PIXELS  800
#define SVGA_VERTICAL_LINES     600
#define SVGA_ALL_DISP_ADDRESS   (SVGA_HORIZONTAL_PIXELS * SVGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define SVGA_3_PICTURES         (SVGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define XGA_HORIZONTAL_PIXELS  1024
#define XGA_VERTICAL_LINES     768
#define XGA_ALL_DISP_ADDRESS   (XGA_HORIZONTAL_PIXELS * XGA_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define XGA_3_PICTURES         (XGA_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

#define HD_HORIZONTAL_PIXELS  1920
#define HD_VERTICAL_LINES     1080
#define HD_ALL_DISP_ADDRESS   (HD_HORIZONTAL_PIXELS * HD_VERTICAL_LINES * PIXEL_NUM_OF_BYTES)
#define HD_3_PICTURES         (HD_ALL_DISP_ADDRESS * NUMBER_OF_WRITE_FRAMES)

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution);

void cam_i2c_init(volatile unsigned *ov5642_axi_iic) {
    ov5642_axi_iic[64] = 0x2; // reset tx fifo ,address is 0x100, i2c_control_reg
    ov5642_axi_iic[64] = 0x1; // enable i2c
}

void cam_i2x_write_sync(void) {
    // unsigned c;

    // c = *cam_i2c_rx_fifo;
    // while ((c & 0x84) != 0x80)
    // c = *cam_i2c_rx_fifo; // No Bus Busy and TX_FIFO_Empty = 1
    usleep(1000);
}

void cam_i2c_write(volatile unsigned *ov5642_axi_iic, unsigned int device_addr, unsigned int write_addr, unsigned int write_data){
    ov5642_axi_iic[66] = 0x100 | (device_addr & 0xfe); // Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    ov5642_axi_iic[66] = (write_addr >> 8) & 0xff;  // address upper byte
    ov5642_axi_iic[66] = write_addr & 0xff;           // address lower byte
    ov5642_axi_iic[66] = 0x200 | (write_data & 0xff);      // data
    cam_i2x_write_sync();
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr);

int main(int argc, char *argv[]){
    int opt;
    int c, help_flag=0;
    char bmp_fn[256] = "bmp_file";
    char  attr[1024];
    unsigned long  phys_addr;
    int file_no = -1;
    int fd1, fd2, fd3, fd4, fd5, fd6, fd10, fd11;
    volatile unsigned int *ov5642_inf_axis, *axi_iic, *disp_dmar_axis, *vflip_dma_write;
    volatile unsigned int *axi_gpio_0, *axi_gpio_1;
    volatile unsigned int *frame_buffer;
    int active_frame;
    int resolution;
    int all_disp_addr;
    
    resolution = 1; // XGA
    while ((opt=getopt(argc, argv, "b:n:h:r:")) != -1){
        switch (opt){
            case 'b':
                strcpy(bmp_fn, optarg);
                break;
            case 'n':
                file_no = atoi(optarg);
                printf("file_no = %d\n", file_no+1);
                break;
            case 'r':
                resolution = atoi(optarg);
                break;
            case 'h':
                help_flag = 1;
                break;
        }
    }
    if(resolution == 0){
        printf("SVGA\n");
    } else if(resolution == 1){
        printf("XGA\n");
    } else {
        printf("HD\n");
    }

    if (help_flag == 1){ // help
        printf("Usage : cam_capture [-b <bmp file name>] [-n <Start File Number>] [-h]\n");
        printf("         -r [0|1|2](0:SVGA, 1:XGA, 2:HD)\n");
        exit(0);
    }
       
    // all_disp_addr
    switch(resolution){
        case 0 :
            all_disp_addr = SVGA_ALL_DISP_ADDRESS;
            break;
        case 1 :
            all_disp_addr = XGA_ALL_DISP_ADDRESS;
            break;
        default : // 2
            all_disp_addr = HD_ALL_DISP_ADDRESS;
            break;
    }
    
    // ov5642_inf_axis-uio IP
    fd1 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd1 < 1){
        fprintf(stderr, "/dev/uio6 (ov5642_inf_axis) open error\n");
        exit(-1);
    }
    ov5642_inf_axis = (volatile unsigned *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd1, 0);
    if (!ov5642_inf_axis){
        fprintf(stderr, "ov5642_inf_axis mmap error\n");
        exit(-1);
    }
    
    // axi_iic-uio IP
    fd2 = open("/dev/uio4", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd2 < 1){
        fprintf(stderr, "/dev/uio4 (axi_iic) open error\n");
        exit(-1);
    }
    axi_iic = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd2, 0);
    if (!axi_iic){
        fprintf(stderr, "axi_iic mmap error\n");
        exit(-1);
    }

    // disp_dmar_axis-uio IP
    fd3 = open("/dev/uio9", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd3 < 1){
        fprintf(stderr, "/dev/uio9 (disp_dmar_axis) open error\n");
        exit(-1);
    }
    disp_dmar_axis = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd3, 0);
    if (!disp_dmar_axis){
        fprintf(stderr, "disp_dmar_axis mmap error\n");
        exit(-1);
    }

    // vflip_dma_write-uio IP
    fd4 = open("/dev/uio7", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd4 < 1){
        fprintf(stderr, "/dev/uio7 (vflip_dma_write) open error\n");
        exit(-1);
    }
    vflip_dma_write = (volatile unsigned int *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd4, 0);
    if (!vflip_dma_write){
        fprintf(stderr, "vflip_dma_write mmap error\n");
        exit(-1);
    }

    // axi_gpio_0-uio IP (init_done output)
    fd5 = open("/dev/uio8", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd5 < 1){
        fprintf(stderr, "/dev/uio8 (axi_gpio_0) open error\n");
        exit(-1);
    }
    axi_gpio_0 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd5, 0);
    if (!axi_gpio_0){
        fprintf(stderr, "axi_gpio_0 mmap error\n");
        exit(-1);
    }

    // axi_gpio_1-uio IP (active_frame input)
    fd6 = open("/dev/uio6", O_RDWR|O_SYNC); // Read/Write, The chache is disable
    if (fd6 < 1){
        fprintf(stderr, "/dev/uio6 (axi_gpio_1) open error\n");
        exit(-1);
    }
    axi_gpio_1 = (volatile unsigned int *)mmap(NULL, 0x1000, PROT_READ|PROT_WRITE, MAP_SHARED, fd6, 0);
    if (!axi_gpio_1){
        fprintf(stderr, "axi_gpio_1 mmap error\n");
        exit(-1);
    }
    
    
    // udmabuf4
    fd10 = open("/dev/udmabuf4", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd10 == -1){
        fprintf(stderr, "/dev/udmabuf4 open error\n");
        exit(-1);
    }
    frame_buffer = (volatile unsigned int *)mmap(NULL, all_disp_addr*NUMBER_OF_WRITE_FRAMES, PROT_READ|PROT_WRITE, MAP_SHARED, fd10, 0);
    if (!frame_buffer){
        fprintf(stderr, "frame_buffer4 mmap error\n");
        exit(-1);
    }
    
    // phys_addr of udmabuf4
    fd11 = open("/sys/class/u-dma-buf/udmabuf4/phys_addr", O_RDONLY);
    if (fd11 == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf4/phys_addr open error\n");
        exit(-1);
    }
    read(fd11, attr, 1024);
    sscanf(attr, "%lx", &phys_addr);  
    close(fd11);
    printf("phys_addr = %x\n", (int)phys_addr);
    
    // vflip_dma_write start
    vflip_dma_write[6] = phys_addr; // fb0
    vflip_dma_write[8] = phys_addr+all_disp_addr; // fb1
    vflip_dma_write[10] = phys_addr+2*all_disp_addr; // fb2
    vflip_dma_write[12] = resolution;
    vflip_dma_write[0] = 0x1; // start
    vflip_dma_write[0] = 0x80; // EnableAutoRestart
       
    // CMOS Camera initialize, ov5642
    cam_i2c_init(axi_iic);
    
    cam_reg_set(axi_iic, 0x78); // OV5642 register set

    ov5642_inf_axis[0] = phys_addr; // ov5642 AXI4-Stream Start
    ov5642_inf_axis[1] = 0;
 
     // disp_dmar_axis start
    disp_dmar_axis[4] = phys_addr; // fb0
    disp_dmar_axis[6] = phys_addr+all_disp_addr; // fb1
    disp_dmar_axis[8] = phys_addr+2*all_disp_addr; // fb2
    disp_dmar_axis[10] = resolution;
    axi_gpio_0[0] = 1; // disp_dmar_axis start(init_done = 1)
    
    char bmp_file[256];

    // All 0 set
    int all_disp_frame_index = all_disp_addr/PIXEL_NUM_OF_BYTES*NUMBER_OF_WRITE_FRAMES;
    for (int i=0; i<all_disp_frame_index; i++){
        frame_buffer[i] = 0x0;
    }
    
    // w - writed the left and right eye's bmp files.  q - exit.
    c = getc(stdin);
    while(c != 'q'){
        switch ((char)c) {
            case 'w' : // w - writed a bmp files.
                // writed the frame buffer
                file_no++;
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(axi_gpio_1[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution);
                
                printf("file No. = %d\n", file_no);

                break;
            case 'e' : // e - writed a same bmp files.
                // writed the frame buffer
                if (file_no == -1)
                    file_no = 0;
                
                sprintf(bmp_file, "%s%d.bmp", bmp_fn, file_no);
                active_frame = (int)(axi_gpio_1[0] & 0x3); // Data signal of active_frame_V
                WriteBMPfile(bmp_file, frame_buffer, active_frame, resolution);
                
                printf("file No. = %d\n", file_no);

                break;
        }
        c = getc(stdin);
    }
    
    munmap((void *)ov5642_inf_axis, 0x1000);
    munmap((void *)axi_iic, 0x1000);
    munmap((void *)disp_dmar_axis, 0x10000);
    munmap((void *)vflip_dma_write, 0x10000);
    munmap((void *)axi_gpio_0, 0x1000);
    munmap((void *)axi_gpio_1, 0x1000);
    munmap((void *)frame_buffer, all_disp_addr*3);
    
    close(fd1);
    close(fd2);
    close(fd3);
    close(fd4);
    close(fd5);
    close(fd6);
    close(fd10);
    
    return(0);
}

int WriteBMPfile(char *bmp_file, volatile unsigned int *frame_buffer, int active_frame, int resolution){
    int read_frame;
    int img_width, img_height;
    
    if (active_frame == 0)
        read_frame = 2;
    else if (active_frame == 1)
        read_frame = 0;
    else // active_frame == 2
        read_frame = 1;
        
    switch(resolution){
        case 0 :
            img_width = SVGA_HORIZONTAL_PIXELS;
            img_height = SVGA_VERTICAL_LINES;
            break;
        case 1 :
            img_width = XGA_HORIZONTAL_PIXELS;
            img_height = XGA_VERTICAL_LINES;
            break;
        default : // case 2 :
            img_width = HD_HORIZONTAL_PIXELS;
            img_height = HD_VERTICAL_LINES;
            break;
    }
    
    int offset_addr = read_frame * img_width * img_height;
    
    cv::Mat img(img_height, img_width, CV_8UC3);

    cv::Mat_<cv::Vec3b> dst_vec3b = cv::Mat_<cv::Vec3b>(img);
    for(int y=0; y<img.rows; y++){
        for(int x=0; x<img.cols; x++){
            cv::Vec3b pixel;
            int rgb = frame_buffer[offset_addr+y*img.cols+x];
            pixel[0] = (rgb & 0xff); // blue
            pixel[1] = (rgb & 0xff00) >> 8; // green
            pixel[2] = (rgb & 0xff0000) >> 16; // red
            dst_vec3b(y,x) = pixel;
        }
    }
    
    cv::imwrite(bmp_file, img);
    
    return(0);
}

int cam_reg_set(volatile unsigned *axi_iic, unsigned int device_addr){
    cam_i2c_write(axi_iic, device_addr, 0x3103, 0x93);
    cam_i2c_write(axi_iic, device_addr, 0x3008, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x3017, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x3018, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc2);
    cam_i2c_write(axi_iic, device_addr, 0x3615, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3000, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x3001, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x3002, 0x5c);
    cam_i2c_write(axi_iic, device_addr, 0x3003, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3005, 0xb7);
    cam_i2c_write(axi_iic, device_addr, 0x3006, 0x43);
    cam_i2c_write(axi_iic, device_addr, 0x3007, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3011, 0x08); // 0x08 - 15fps, 0x10 - 30fps
    cam_i2c_write(axi_iic, device_addr, 0x3010, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x460c, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x370c, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3602, 0xfc);
    cam_i2c_write(axi_iic, device_addr, 0x3612, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x3634, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3613, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3622, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3604, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0xa7);
    cam_i2c_write(axi_iic, device_addr, 0x3603, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x4000, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x401d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3600, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x3605, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3606, 0x3f);
    cam_i2c_write(axi_iic, device_addr, 0x3c01, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x5020, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x79);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x22);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x0a);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5080, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x300e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x4610, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x471d, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x4708, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x3710, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3632, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x37);
    cam_i2c_write(axi_iic, device_addr, 0x3631, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0x4f);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61); // RGB565
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x73);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3824, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0xc1);
    cam_i2c_write(axi_iic, device_addr, 0x3705, 0xdb);
    cam_i2c_write(axi_iic, device_addr, 0x370a, 0x81);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3827, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3810, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a1a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x3a13, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a18, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a19, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3004, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x350c, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x350d, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3500, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3501, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x350b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3030, 0x0b);
    cam_i2c_write(axi_iic, device_addr, 0x3a02, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a03, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a04, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a14, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a15, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x3a16, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3a00, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x3a08, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x3a09, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x3a0a, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3a0b, 0xd0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0d, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x3a0e, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0x98);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x589b, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x589a, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x4e);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x538a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538b, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x538c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538d, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538f, 0x0f);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xab);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x57);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x65);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x71);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x7d);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x87);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x91);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x9a);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0xaa);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xcd);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xdd);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xea);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x86);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0x5b);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0x3b);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xed);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0xc5);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0xa5);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x3406, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04); // 0x04
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8); // 0xf8
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x3d);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0xbd);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x68);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x82);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x02); // 0x02
    cam_i2c_write(axi_iic, device_addr, 0x3633, 0x07);
    cam_i2c_write(axi_iic, device_addr, 0x3702, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3703, 0xb2);
    cam_i2c_write(axi_iic, device_addr, 0x3704, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x370b, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x370d, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3620, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x3c00, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0xFF);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5500, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5502, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5503, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5504, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5505, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5025, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5300, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5301, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5302, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5303, 0x7c);
    cam_i2c_write(axi_iic, device_addr, 0x530c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x530d, 0x0c);
    cam_i2c_write(axi_iic, device_addr, 0x530e, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x530f, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5310, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5311, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5308, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5309, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5304, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5305, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5306, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5307, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5314, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5315, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x5319, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5316, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5317, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5318, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5380, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5381, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5382, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5383, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5384, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5385, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5386, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5387, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5388, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5389, 0xE1);
    cam_i2c_write(axi_iic, device_addr, 0x538A, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538B, 0x2B);
    cam_i2c_write(axi_iic, device_addr, 0x538C, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538D, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538E, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x538F, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5390, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5391, 0xB3);
    cam_i2c_write(axi_iic, device_addr, 0x5392, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5393, 0xA6);
    cam_i2c_write(axi_iic, device_addr, 0x5394, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5480, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5481, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5482, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5483, 0x49);
    cam_i2c_write(axi_iic, device_addr, 0x5484, 0x56);
    cam_i2c_write(axi_iic, device_addr, 0x5485, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x5486, 0x6c);
    cam_i2c_write(axi_iic, device_addr, 0x5487, 0x76);
    cam_i2c_write(axi_iic, device_addr, 0x5488, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x5489, 0x88);
    cam_i2c_write(axi_iic, device_addr, 0x548a, 0x96);
    cam_i2c_write(axi_iic, device_addr, 0x548b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x548c, 0xb8);
    cam_i2c_write(axi_iic, device_addr, 0x548d, 0xcc);
    cam_i2c_write(axi_iic, device_addr, 0x548e, 0xe0);
    cam_i2c_write(axi_iic, device_addr, 0x548f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5490, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5491, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x5492, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5493, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5494, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5495, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x5496, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5497, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5498, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x5499, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x549a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x549b, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x549c, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549d, 0xee);
    cam_i2c_write(axi_iic, device_addr, 0x549e, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x549f, 0xd8);
    cam_i2c_write(axi_iic, device_addr, 0x54a0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a1, 0xc7);
    cam_i2c_write(axi_iic, device_addr, 0x54a2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a3, 0xb3);
    cam_i2c_write(axi_iic, device_addr, 0x54a4, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a5, 0x90);
    cam_i2c_write(axi_iic, device_addr, 0x54a6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a7, 0x62);
    cam_i2c_write(axi_iic, device_addr, 0x54a8, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54a9, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x54aa, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ab, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x54ac, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x54ad, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x54ae, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54af, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b0, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b1, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x54b2, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b3, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x54b4, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x54b5, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x54b6, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x54b7, 0xdf);
    cam_i2c_write(axi_iic, device_addr, 0x5583, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5584, 0x5d);
    cam_i2c_write(axi_iic, device_addr, 0x5580, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x5587, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5588, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x558a, 0x09);
    cam_i2c_write(axi_iic, device_addr, 0x5589, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5000, 0xcf);
    cam_i2c_write(axi_iic, device_addr, 0x5800, 0x48);
    cam_i2c_write(axi_iic, device_addr, 0x5801, 0x31);
    cam_i2c_write(axi_iic, device_addr, 0x5802, 0x21);
    cam_i2c_write(axi_iic, device_addr, 0x5803, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5804, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5805, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5806, 0x29);
    cam_i2c_write(axi_iic, device_addr, 0x5807, 0x38);
    cam_i2c_write(axi_iic, device_addr, 0x5808, 0x26);
    cam_i2c_write(axi_iic, device_addr, 0x5809, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x580a, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x580b, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580c, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x580d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x580e, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x580f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5810, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5811, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5812, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x5813, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5814, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5815, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5816, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5817, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5818, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5819, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x581a, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x581b, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581c, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x581d, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x581e, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x581f, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x5820, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x5821, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5822, 0x4);
    cam_i2c_write(axi_iic, device_addr, 0x5823, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5824, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5825, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x5826, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x5827, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5828, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5829, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x582a, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x582b, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582c, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x582d, 0x6);
    cam_i2c_write(axi_iic, device_addr, 0x582e, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x582f, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5830, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x5831, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5832, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5833, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5834, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5835, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5836, 0x15);
    cam_i2c_write(axi_iic, device_addr, 0x5837, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5838, 0x6e);
    cam_i2c_write(axi_iic, device_addr, 0x5839, 0x39);
    cam_i2c_write(axi_iic, device_addr, 0x583a, 0x27);
    cam_i2c_write(axi_iic, device_addr, 0x583b, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x583c, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x583d, 0x23);
    cam_i2c_write(axi_iic, device_addr, 0x583e, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x583f, 0x41);
    cam_i2c_write(axi_iic, device_addr, 0x5840, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5841, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5842, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5843, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5844, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5845, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5846, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5847, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5848, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5849, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584a, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584b, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x584c, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584d, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x584e, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x584f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5850, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5851, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5852, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5853, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5854, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5855, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5856, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5857, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x5858, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x5859, 0xe);
    cam_i2c_write(axi_iic, device_addr, 0x585a, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585b, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585c, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x585d, 0xa);
    cam_i2c_write(axi_iic, device_addr, 0x585e, 0x9);
    cam_i2c_write(axi_iic, device_addr, 0x585f, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5860, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x5861, 0xb);
    cam_i2c_write(axi_iic, device_addr, 0x5862, 0xd);
    cam_i2c_write(axi_iic, device_addr, 0x5863, 0x7);
    cam_i2c_write(axi_iic, device_addr, 0x5864, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5865, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5866, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5867, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x5868, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5869, 0x12);
    cam_i2c_write(axi_iic, device_addr, 0x586a, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x586b, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x586c, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586d, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x586e, 0x18);
    cam_i2c_write(axi_iic, device_addr, 0x586f, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5870, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5871, 0x16);
    cam_i2c_write(axi_iic, device_addr, 0x5872, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x5873, 0xf);
    cam_i2c_write(axi_iic, device_addr, 0x5874, 0x13);
    cam_i2c_write(axi_iic, device_addr, 0x5875, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x5876, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5877, 0x17);
    cam_i2c_write(axi_iic, device_addr, 0x5878, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5879, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x587a, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x587b, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x587c, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587d, 0x1c);
    cam_i2c_write(axi_iic, device_addr, 0x587e, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x587f, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5880, 0x1b);
    cam_i2c_write(axi_iic, device_addr, 0x5881, 0x1f);
    cam_i2c_write(axi_iic, device_addr, 0x5882, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5883, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5884, 0x1d);
    cam_i2c_write(axi_iic, device_addr, 0x5885, 0x1e);
    cam_i2c_write(axi_iic, device_addr, 0x5886, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x5887, 0x1a);
    cam_i2c_write(axi_iic, device_addr, 0x528a, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x528b, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x528c, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x528d, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x528e, 0x40);
    cam_i2c_write(axi_iic, device_addr, 0x528f, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x5290, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x5292, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5293, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x5294, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5295, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5296, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5297, 0x08);
    cam_i2c_write(axi_iic, device_addr, 0x5298, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5299, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x529a, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529b, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x529c, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529d, 0x28);
    cam_i2c_write(axi_iic, device_addr, 0x529e, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x529f, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x5282, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5180, 0xff);
    cam_i2c_write(axi_iic, device_addr, 0x5181, 0x52);
    cam_i2c_write(axi_iic, device_addr, 0x5182, 0x11);
    cam_i2c_write(axi_iic, device_addr, 0x5183, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5184, 0x25);
    cam_i2c_write(axi_iic, device_addr, 0x5185, 0x24);
    cam_i2c_write(axi_iic, device_addr, 0x5186, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5187, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5188, 0x14);
    cam_i2c_write(axi_iic, device_addr, 0x5189, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x518a, 0x60);
    cam_i2c_write(axi_iic, device_addr, 0x518b, 0xa2);
    cam_i2c_write(axi_iic, device_addr, 0x518c, 0x9c);
    cam_i2c_write(axi_iic, device_addr, 0x518d, 0x36);
    cam_i2c_write(axi_iic, device_addr, 0x518e, 0x34);
    cam_i2c_write(axi_iic, device_addr, 0x518f, 0x54);
    cam_i2c_write(axi_iic, device_addr, 0x5190, 0x4c);
    cam_i2c_write(axi_iic, device_addr, 0x5191, 0xf8);
    cam_i2c_write(axi_iic, device_addr, 0x5192, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x5193, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x5194, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5195, 0xf0);
    cam_i2c_write(axi_iic, device_addr, 0x5196, 0x03);
    cam_i2c_write(axi_iic, device_addr, 0x5197, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x5198, 0x05);
    cam_i2c_write(axi_iic, device_addr, 0x5199, 0x2f);
    cam_i2c_write(axi_iic, device_addr, 0x519a, 0x04);
    cam_i2c_write(axi_iic, device_addr, 0x519b, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x519c, 0x06);
    cam_i2c_write(axi_iic, device_addr, 0x519d, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x519e, 0xa0);
    cam_i2c_write(axi_iic, device_addr, 0x3a0f, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a10, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a1b, 0x3c);
    cam_i2c_write(axi_iic, device_addr, 0x3a1e, 0x30);
    cam_i2c_write(axi_iic, device_addr, 0x3a11, 0x70);
    cam_i2c_write(axi_iic, device_addr, 0x3a1f, 0x10);
    cam_i2c_write(axi_iic, device_addr, 0x3800, 0x1);
    cam_i2c_write(axi_iic, device_addr, 0x3801, 0x50);
    cam_i2c_write(axi_iic, device_addr, 0x3802, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3803, 0x8);
    cam_i2c_write(axi_iic, device_addr, 0x3804, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x3805, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x3806, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3807, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3808, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x3809, 0x20);
    cam_i2c_write(axi_iic, device_addr, 0x380a, 0x2);
    cam_i2c_write(axi_iic, device_addr, 0x380b, 0x58);
    cam_i2c_write(axi_iic, device_addr, 0x380c, 0xc);
    cam_i2c_write(axi_iic, device_addr, 0x380d, 0x80);
    cam_i2c_write(axi_iic, device_addr, 0x380e, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x380f, 0xe8);
    cam_i2c_write(axi_iic, device_addr, 0x5001, 0x7f);
    cam_i2c_write(axi_iic, device_addr, 0x5680, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5681, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5682, 0x5);
    cam_i2c_write(axi_iic, device_addr, 0x5683, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5684, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5685, 0x0);
    cam_i2c_write(axi_iic, device_addr, 0x5686, 0x3);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x5687, 0xc0);
    cam_i2c_write(axi_iic, device_addr, 0x3815, 0x02);
    cam_i2c_write(axi_iic, device_addr, 0x3503, 0x00);
    cam_i2c_write(axi_iic, device_addr, 0x3818, 0x81); // No Mirror
    cam_i2c_write(axi_iic, device_addr, 0x3621, 0xa7);
    
    cam_i2c_write(axi_iic, device_addr, 0x4740, 0x21);
    
    cam_i2c_write(axi_iic, device_addr, 0x501e, 0x2a);
    cam_i2c_write(axi_iic, device_addr, 0x5002, 0x78);
    cam_i2c_write(axi_iic, device_addr, 0x501f, 0x01);
    cam_i2c_write(axi_iic, device_addr, 0x4300, 0x61);
    
    return(0);
}

  1. 2023年04月24日 04:00 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 の Petalinux 2022.1 上で memread と memwrite を生成した

KR260 の Petalinux 2022.1 上で メモリを読み出す memread 実行ファイルとメモリに書き込む memwrite 実行ファイルをソースコードをコンパイルして生成した。

KR260 の Petalinux 2022.1 上で examples ディレクトリの下に mem ディレクトリを新規作成した。
cd examples
mkdir mem
cd mem


mem ディレクトリに C ソースコードを作成した。
kr260_cam_disp_141_230422.png

memread.c を示す。
kr260_cam_disp_142_230422.png

// memread.c
// 2019/07/21 : by marsee
// I referred to http://independence-sys.net/main/?p=2209
//

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

#define BLOCK_SIZE    4096

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    void *memp;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    uint32_t addr, addr2;
    uint32_t write_data;
    
    if (argc != 2){
        fprintf(stderr, "Usage : ./memread <address(hex)>\n");
        exit(-1);
    }
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    sscanf(argv[1], "%x", &addr);
    phy_addr = (uint32_t)addr;
    phy_addr_base = phy_addr & 0xfffff000; // 4k byte boundary
    memp = mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, phy_addr_base );
    if ((int64_t)memp == -1){
        fprintf(stderr,"/dev/mem map error\n");
        exit(-1);
    }
    close(fd);
    
    reg = (uint32_t *)memp;
    int index = (phy_addr & 0xfff)/sizeof(uint32_t);
    printf("%0.8x\n", reg[index]);
    
    munmap((void *)memp, BLOCK_SIZE);

    return(0);
}


memwrite.c を示す。
kr260_cam_disp_143_230422.png

// memwrite.c
// 2018/01/07 : by marsee
// I referred to http://independence-sys.net/main/?p=2209
//

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>

#define BLOCK_SIZE    4096

volatile uint32_t *reg;

int main(int argc, char **argv){
    int fd;
    void *memp;
    uint32_t phy_addr;
    uint32_t phy_addr_base;
    int addr, wd;
    uint32_t write_data;
    
    if (argc != 3){
        fprintf(stderr, "Usage : ./memwrite <address(hex)> <write data(hex)>\n");
        exit(-1);
    }
    
    fd = open("/dev/mem", O_RDWR | O_SYNC);
    if (fd == -1){
        fprintf(stderr, "/dev/mem open error\n");
        exit(-1);
    }
    
    sscanf(argv[1], "%x", &addr);
    phy_addr = (uint32_t)addr;
    phy_addr_base = phy_addr & 0xfffff000; // 4k byte boundary
    memp = mmap(NULL, BLOCK_SIZE,
                    PROT_READ | PROT_WRITE, MAP_SHARED,
                    fd, phy_addr_base );
    if ((int64_t)memp == -1){
        fprintf(stderr,"/dev/mem map error\n");
        exit(-1);
    }
    close(fd);
    
    reg = (uint32_t *)memp;
    int index = (phy_addr & 0xfff)/sizeof(uint32_t);
    
    sscanf(argv[2], "%x", &wd);
    write_data = (uint32_t)wd;
    reg[index] = write_data;
    
    munmap((void *)memp, BLOCK_SIZE);
    return(0);
}


memread.c と memwrite.c を gcc でコンパイルした。
成功した。
gcc -o memread memread.c
gcc -o memwrite memwrite.c

memread と memwrite 実行ファイルが生成された。

Zynq UltraScale MPSoC で AV_BUF_OUTPUT_AUDIO_VIDEO_SELECT (DISPLAY_PORT) Register(アドレス 0xfd4ab070) と V_BLEND_SET_GLOBAL_ALPHA_REG (DISPLAY_PORT) Register(アドレス 0xfd4aa00c) を読み出してみよう。

xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4ab070
00000057
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4aa00c
000001ff



memwrite で書き込んでみた。

xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memwrite fd4ab070 54
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memwrite fd4aa00c ff
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4ab070
00000054
xilinx-kr260-starterkit-20221:~/examples/mem$ sudo ./memread fd4aa00c
000000ff


kr260_cam_disp_144_230422.png

memread も memwrite も動作に問題はないようだ。
  1. 2023年04月22日 04:51 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する3

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する2”の続き。

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9”で作成した DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホーム上に”Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI Masterバージョン1”のラプラシアン・フィルタを載せてみようということで、前回は、KR260 の Petalinux 2022.1 に必要なファイルを転送し、kr260_lap アクセラレーション・アプリケーションをロードして、laplacian_filter1 を実行したところ、"Success HW and SW results match”が表示され、temp_lap.bmp が生成された。今回は、u-dma-buf の用意と OpenCV の C++ ソフトウェアのコンパイルと実行を行えるように環境を整備した。

まずは、u-dma-buf.ko を用意した。
u-dma-buf を KR260 用の Petalinux 2022.1 でビルドする”で作成した u-dma-buf.ko が使えるはずだ。

u-dma-buf.ko を KR260 の Petalinux 2022.1 に転送した。
u-dma-buf.ko を KR260 の Petalinux 2022.1 上で insmod した。udmabuf0 インスタンスを作成する。
sudo insmod u-dma-buf.ko udmabuf0=0x10000
kr260_cam_disp_131_230420.png

/sys/class/u-dma-buf/udmabuf0 ディレクトリが生成された。
kr260_cam_disp_130_230420.png

/sys/class/u-dma-buf/udmabuf0 ディレクトリの phys_addr ファイルを見ると物理アドレスが表示された。
kr260_cam_disp_132_230420.png

u-dma-buf.ko のロードは成功した。

次に、OpenCV を使用した C++ アプリケーション・ソフトウェアを cmake でコンパイルしてみよう。
”KV260 の Petalinux 2022.1 にインストールした OpenCV 4.5.2 を使った C++ アプリケーション・ソフトウェアを cmake でコンパイルする”を参照した。

KR260 の Petalinux 2022.1 上で作業を行う。

~/examples/open_test ディレクトリを作成した。
cd examples
mkdir opencv_test
cd opencv_test


”KV260 の Petalinux 2022.1 にインストールした OpenCV 4.5.2 を使った C++ アプリケーション・ソフトウェアを cmake でコンパイルする”の opencv_test.cpp と CMakeLists.txt を作成した。
OpenCVを使ったC++コードをコンパイルする(CMake, GCC, pkg-config)”の CMakeLists.txt を引用した。ただし、KV260 上の Petalinux では日本語が表示できないので、コメントを Google 翻訳で英語に翻訳してある。途中のコメントは削除した。
kr260_cam_disp_134_230420.png

kr260_cam_disp_133_230420.png

build ディレクトリを作成し、build ディレクトリに入った。
mkdir build
cd build


cmake を実行したが、エラーになった。
g++ ソフトウェアが無いのが原因のようだった。
dnf search g++ を実行した。
g++.cortexa72_cortexa53 と g++-symlinks.cortexa72_cortexa53, libconfig++11.cortexa72_cortexa53 が見つかった。

========================== Name Exactly Matched: g++ ===========================
g++.cortexa72_cortexa53 : GNU cc and gcc C compilers

============================== Name Matched: g++ ===============================
g++-symlinks.cortexa72_cortexa53 : GNU cc and gcc C compilers
libconfig++11.cortexa72_cortexa53 : C/C++ Configuration File Library


g++.cortexa72_cortexa53 と g++-symlinks.cortexa72_cortexa53 をインストールする。
sudo dnf install g++.cortexa72_cortexa53
kr260_cam_disp_135_230420.png

sudo dnf install g++-symlinks.cortexa72_cortexa53
kr260_cam_disp_136_230420.png

g++ --version を実行した。
g++ のバージョンは g++ (GCC) 11.2.0 だった。
kr260_cam_disp_137_230420.png

cmake を行った。現在のディレクトリは ~/examples/opencv_test/build/
export CXX=g++
cmake ..

cmake が成功した。
kr260_cam_disp_138_230420.png

make する。
make
make も成功し、opencv_test 実行ファイルが生成された。
kr260_cam_disp_139_230420.png

opencv_test を実行したら、成功した。
./opencv_test IMG_20191030_051740.jpg test.jpg
test.jpg が生成された。ファイルを開いても jPEG ファイルとして開くことができた。
kr260_cam_disp_140_230420.png
  1. 2023年04月21日 05:12 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する2

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する1”の続き。

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9”で作成した DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホーム上に”Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI Masterバージョン1”のラプラシアン・フィルタを載せてみようということで、前回は、Vitis 2022.1 で laplacian_filter1 アクセラレーション・アプリケーション・プロジェクトを作成し、ソースコードを用意して、ビルドを行って成功した。今回は、KR260 の Petalinux 2022.1 に必要なファイルを転送し、kr260_lap アクセラレーション・アプリケーションをロードして、laplacian_filter1 を実行したところ、"Success HW and SW results match”が表示され、temp_lap.bmp が生成された。

ファイルを KR260 に転送する
必要なファイルを集める。
KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/file_transfer/lap_file_transfer ディレクトリを作成する。
ファイルマネージャーを使用して、KR260/kr260_cam_disp_platform/kr260_cam_disp_platform ディレクトリで lap_file_transfer ディレクトリを作成した。

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/dtg_output/dtg_output/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp/pl.dtbo を lap_file_transfer ディレクトリにコピーした。

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1_system/Hardware/binary_container_1.xclbin を lap_file_transfer ディレクトリにコピーした。
kr260_cam_disp_120_230420.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/laplacian_filter1/Hardware/laplacian_filter1 を lap_file_transfer ディレクトリにコピーした。
kr260_cam_disp_121_230420.png

shell.json はすでに作成済みなので、vadd_filer_transfer ディレクトリからコピーした。

temp.bmp を lap_file_transfer にコピーした。

現在の lap_file_transfer ディレクトリを示す。
kr260_cam_disp_129_230420.png

KR260 で”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する7”の Petalinux 2022.1 を起動した。
ホーム・ディレクトリに examples/kr260_lap ディレクトリを作成した。
cd
cd examples
mkdir kr260_lap
cd kr260_lap


FileZilla を起動して、KR260 の Petalinux 2022.1 へ SFTP で lap_file_transfer ディレクトリのファイルを転送した。
kr260_cam_disp_123_230420.png

/lib/firmware/xilinx/kr260_lap ディレクトリを作成した。
sudo mkdir /lib/firmware/xilinx/kr260_lap

binary_container_1.xclbin の名前を binary_container_1.bin に変更する。こうしないと、XRT は FPGA ビットストリームを抽出して Kria のプログラマブル ロジックをコンフィグレーションすることができないそうだ。
mv binary_container_1.xclbin binary_container_1.bin

pl.dtbo binary_container_1.bin shell.json ファイルを /lib/firmware/xilinx/kr260_lap ディレクトリにコピーした。
sudo cp pl.dtbo binary_container_1.bin shell.json /lib/firmware/xilinx/kr260_lap
kr260_cam_disp_124_230420.png

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_lap をロードする。
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp kr260_lap

kr260_cam_disp_125_230420.png

laplacian_filer1 を実行した。
./laplacian_filter1 binary_container_1.bin
"Success HW and SW results match”が表示され、temp_lap.bmp が生成された。
kr260_cam_disp_126_230420.png

kr260_cam_disp_127_230420.png

temp_lap.bmp を示す。
kr260_cam_disp_128_230420.png

エッジが表示されている。
  1. 2023年04月20日 05:11 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームにラプラシアン・フィルタを実装する1

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9”で作成した DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホーム上に”Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI Masterバージョン1”のラプラシアン・フィルタを載せてみよう。

Vitis 2022.1 でアプリケーション・プロジェクトを作成する。
Vitis 2022.1 で File メニューから New -> Application Project... を選択してアプリケーション・プロジェクトを新規作成する。
New Application Project ダイアログの Create a New Application Project 画面が開く。
Next > ボタンをクリックする。

Platform 画面
kr260_cam_disp プラットフォームを選択する。
Next > ボタンをクリックする。
kr260_cam_disp_107_230418.png

Application Project Details 画面
Application project name: に laplacian_filter1 と入力する。
Next > ボタンをクリックする。
kr260_cam_disp_108_230418.png

Domain 画面
Application settings を入力する。
Sysroot paht: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/sysroots/cortexa72-cortexa53-xilinx-linux を入力する。
Root FS: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/linux_os/images/linux/rootfs.ext4 を入力する。
Kernel Image: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/linux_os/images/linux/Image を入力する。
Next > ボタンをクリックする。
kr260_cam_disp_109_230418.png

Template 画面
Empty Application を選択する。
Finish ボタンをクリックする。
kr260_cam_disp_110_230418.png

laplacian_filter1_system が生成された。
Vitis 2019.2 アプリケーション・プロジェクト ラプラシアン・フィルタAXI Masterバージョン1”のラプラシアン・フィルタのソースコードをコピーしたが、多少の修正が必要だった。

laplacian_filter1_system -> laplacian_filter1_kernels -> src ディレクトリにはハードウェアになる laplacian_filter1.cpp を入れた。

laplacian_filter1_system -> laplacian_filter1 -> src ディレクトリには、bmp_header.h と laplacian_filter1_host.cpp を入れた。
kr260_cam_disp_111_230418.png

Explorer で laplacian_filter1_system -> laplacian_filter1 -> laplacian_filter1.prj を選択し、Active build configuration: で Hardware を選択した。
kr260_cam_disp_112_230418.png

laplacian_filter1_system -> laplacian_filter1_kernels -> laplacian_filter1_kernels.prj を選択して、ハードウェア化する関数を選択する。
Hardware Functions の Add Hardware Function... ボタンをクリックする。
kr260_cam_disp_113_230418.png

Add Hardware Functions ダイアログが開く。
lap_filter_axim 関数を選択して、OK ボタンをクリックする。
kr260_cam_disp_114_230418.png

Hardware Functions に lap_filter_axim 関数が表示された。
kr260_cam_disp_115_230418.png

Explorer で laplacian_filter1_system を選択し、トンカチ・ボタンをクリックしてビルドを行った。
ビルドが成功した。
kr260_cam_disp_116_230418.png

変更した laplacian_filter1.cpp を貼っておく。

// laplacian_filter1.cpp
// 2019/12/16 by marsee

int laplacian_fil(int x0y0, int x1y0, int x2y0, int x0y1, int x1y1, int x2y1, int x0y2, int x1y2, int x2y2);
int conv_rgb2y(int rgb);

extern "C" {
void lap_filter_axim(int *cam_fb, int *lap_fb, int x_size, int y_size)
{
#pragma HLS INTERFACE m_axi depth=3072 port=cam_fb offset=slave bundle=gmem
#pragma HLS INTERFACE m_axi depth=3072 port=lap_fb offset=slave bundle=gmem
#pragma HLS INTERFACE s_axilite port = cam_fb bundle = control
#pragma HLS INTERFACE s_axilite port = lap_fb bundle = control
#pragma HLS INTERFACE s_axilite port = x_size bundle = control
#pragma HLS INTERFACE s_axilite port = y_size bundle = control
#pragma HLS INTERFACE s_axilite port=return bundle=control

    int line_buf[3][1920]; // supported HD resolution
    int x, y;
    int lap_fil_val;
    int a, b;
    int fl, sl, tl;

    // RGB値をY(輝度成分)のみに変換し、ラプラシアンフィルタを掛けた。
    Loop0: for (y=0; y<y_size; y++){
#pragma HLS LOOP_TRIPCOUNT min=48 max=600
        Loop1: for (x=0; x<x_size; x++){
#pragma HLS LOOP_TRIPCOUNT min=64 max=800
            if (y==0 || y==y_size-1){ // 縦の境界の時の値は0とする
                lap_fil_val = 0;
            }else if (x==0 || x==x_size-1){ // 横の境界の時も値は0とする
                lap_fil_val = 0;
            }else{
                if (y == 1 && x == 1){ // 最初のラインの最初のピクセルでは2ライン分の画素を読み出す
                    Loop3: for (a=0; a<2; a++){ // 2ライン分
                        Loop4: for (b=0; b<x_size; b++){ // ライン
#pragma HLS LOOP_TRIPCOUNT min=64 max=800
                            line_buf[a][b] = cam_fb[(a*x_size)+b];
                            line_buf[a][b] = conv_rgb2y(line_buf[a][b]);
                        }
                    }
                }
                if (x == 1) {    // ラインの最初なので、2つのピクセルを読み込む
                    Loop5: for (b=0; b<2; b++){ // ライン
                        line_buf[(y+1)%3][b] = cam_fb[((y+1)*x_size)+b];
                        // (y+1)%3 は、使用済みのラインがに読み込む、y=2 の時 line[0], y=3の時 line[1], y=4の時 line[2]
                        line_buf[(y+1)%3][b] = conv_rgb2y(line_buf[(y+1)%3][b]);
                    }
                }

                // 1つのピクセルを読み込みながらラプラシアン・フィルタを実行する
                line_buf[(y+1)%3][x+1] = cam_fb[((y+1)*x_size)+(x+1)];
                // (y+1)%3 は、使用済みのラインがに読み込む、y=2 の時 line[0], y=3の時 line[1], y=4の時 line[2]
                line_buf[(y+1)%3][x+1] = conv_rgb2y(line_buf[(y+1)%3][x+1]);

                fl = (y-1)%3;    // 最初のライン, y=1 012, y=2 120, y=3 201, y=4 012
                sl = y%3;        // 2番めのライン
                tl = (y+1)%3;    // 3番目のライン
                lap_fil_val = laplacian_fil(line_buf[fl][x-1], line_buf[fl][x], line_buf[fl][x+1], line_buf[sl][x-1], line_buf[sl][x], line_buf[sl][x+1], line_buf[tl][x-1], line_buf[tl][x], line_buf[tl][x+1]);
            }
            // ラプラシアンフィルタ・データの書き込み
            lap_fb[(y*x_size)+x] = (lap_fil_val<<16)+(lap_fil_val<<8)+lap_fil_val ;
            // printf("x = %d  y = %d", x, y);
        }
     }
}
}

// RGBからYへの変換
// RGBのフォーマットは、{8'd0, R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
int conv_rgb2y(int rgb){
    int r, g, b, y_f;
    int y;

    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

// ラプラシアンフィルタ
// x0y0 x1y0 x2y0 -1 -1 -1
// x0y1 x1y1 x2y1 -1  8 -1
// x0y2 x1y2 x2y2 -1 -1 -1
int laplacian_fil(int x0y0, int x1y0, int x2y0, int x0y1, int x1y1, int x2y1, int x0y2, int x1y2, int x2y2)
{
    int y;

    y = -x0y0 -x1y0 -x2y0 -x0y1 +8*x1y1 -x2y1 -x0y2 -x1y2 -x2y2;
    if (y<0)
        y = -y;
    else if (y>255)
        y = 255;
    return(y);
}


変更した laplacian_filter1_host.cpp を貼っておく。

// laplacian_filter1_host.cpp
// 2019/12/09 by marsee
//

// Vitis-Tutorials/docs/mixing-c-rtl-kernels/reference-files/src/host/host_step1.cpp のコードを引用します
// https://github.com/Xilinx/Vitis-Tutorials/blob/master/docs/mixing-c-rtl-kernels/reference-files/src/host/host_step1.cpp
#define CL_HPP_CL_1_2_DEFAULT_BUILD
#define CL_HPP_TARGET_OPENCL_VERSION 120
#define CL_HPP_MINIMUM_OPENCL_VERSION 120
#define CL_HPP_ENABLE_PROGRAM_CONSTRUCTION_FROM_ARRAY_COMPATIBILITY 1
#define CL_USE_DEPRECATED_OPENCL_1_2_APIS

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>
#include <CL/cl2.hpp>
#include <iostream>
#include <fstream>
#include <CL/cl_ext_xilinx.h>
#include <unistd.h>
#include <limits.h>
#include <sys/stat.h>

#include "bmp_header.h"

int laplacian_fil_soft(int x0y0, int x1y0, int x2y0, int x0y1, int x1y1, int x2y1, int x0y2, int x1y2, int x2y2);
int conv_rgb2y_soft(int rgb);
int lap_filter_axim(volatile int *cam_fb, volatile int *lap_fb);    // hardware
void laplacian_filter_soft(int *cam_fb, int *lap_fb, long width, long height); // software

static const std::string error_message =
    "Error: Result mismatch:\n"
    "i = %d CPU result = %d Device result = %d\n";

//Some Library functions to be used.
template <typename T>
struct aligned_allocator
{
  using value_type = T;
  T* allocate(std::size_t num)
  {
    void* ptr = nullptr;
    if (posix_memalign(&ptr,4096,num*sizeof(T)))
      throw std::bad_alloc();
    return reinterpret_cast<T*>(ptr);
  }
  void deallocate(T* p, std::size_t num)
  {
    free(p);
  }
};


#define OCL_CHECK(error,call)                                       \
    call;                                                           \
    if (error != CL_SUCCESS) {                                      \
      printf("%s:%d Error calling " #call ", error code is: %d\n",  \
              __FILE__,__LINE__, error);                            \
      exit(EXIT_FAILURE);                                           \
    }

namespace xcl {
std::vector<cl::Device> get_devices(const std::string& vendor_name) {

    size_t i;
    cl_int err;
    std::vector<cl::Platform> platforms;
    OCL_CHECK(err, err = cl::Platform::get(&platforms));
    cl::Platform platform;
    for (i  = 0 ; i < platforms.size(); i++){
        platform = platforms[i];
        OCL_CHECK(err, std::string platformName = platform.getInfo<CL_PLATFORM_NAME>(&err));
        if (platformName == vendor_name){
            std::cout << "Found Platform" << std::endl;
            std::cout << "Platform Name: " << platformName.c_str() << std::endl;
            break;
        }
    }
    if (i == platforms.size()) {
        std::cout << "Error: Failed to find Xilinx platform" << std::endl;
        exit(EXIT_FAILURE);
    }

    //Getting ACCELERATOR Devices and selecting 1st such device
    std::vector<cl::Device> devices;
    OCL_CHECK(err, err = platform.getDevices(CL_DEVICE_TYPE_ACCELERATOR, &devices));
    return devices;
}

std::vector<cl::Device> get_xil_devices() {
    return get_devices("Xilinx");
}

char* read_binary_file(const std::string &xclbin_file_name, unsigned &nb)
{
    std::cout << "INFO: Reading " << xclbin_file_name << std::endl;

    if(access(xclbin_file_name.c_str(), R_OK) != 0) {
        printf("ERROR: %s xclbin not available please build\n", xclbin_file_name.c_str());
        exit(EXIT_FAILURE);
    }
    //Loading XCL Bin into char buffer
    std::cout << "Loading: '" << xclbin_file_name.c_str() << "'\n";
    std::ifstream bin_file(xclbin_file_name.c_str(), std::ifstream::binary);
    bin_file.seekg (0, bin_file.end);
    nb = bin_file.tellg();
    bin_file.seekg (0, bin_file.beg);
    char *buf = new char [nb];
    bin_file.read(buf, nb);
    return buf;
}
};

int main(int argc, char* argv[])
{
    long x, y;
    BITMAPFILEHEADER bmpfhr; // BMPファイルのファイルヘッダ(for Read)
    BITMAPINFOHEADER bmpihr; // BMPファイルのINFOヘッダ(for Read)
    FILE *fbmpr, *fbmpw;
    int blue, green, red;
    const char* xclbinFilename;

    if (argc==2) {
        xclbinFilename = argv[1];
        std::cout <<"Using FPGA binary file specfied through the command line: " << xclbinFilename << std::endl;
    }
    else {
        xclbinFilename = "../lap_filter_axim.xclbin";
        std::cout << "No FPGA binary file specified through the command line, using:" << xclbinFilename <<std::endl;
    }

    if ((fbmpr = fopen("test.bmp", "rb")) == NULL){ // test.bmp をオープン
        fprintf(stderr, "Can't open test.bmp by binary read mode\n");
        exit(1);
    }
    // bmpヘッダの読み出し
    fread(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpr);
    fread(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpr);
    fread(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpr);

    // ピクセルを入れるメモリをアロケートする
    std::vector<int,aligned_allocator<int>> rd_bmp(bmpihr.biWidth * bmpihr.biHeight);
    std::vector<int,aligned_allocator<int>> hw_lapd(bmpihr.biWidth * bmpihr.biHeight);
    std::vector<int,aligned_allocator<int>> sw_lapd(bmpihr.biWidth * bmpihr.biHeight);
    size_t size_in_bytes = (bmpihr.biWidth * bmpihr.biHeight) * sizeof(int);

    // rd_bmp にBMPのピクセルを代入。その際に、行を逆転する必要がある
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            blue = fgetc(fbmpr);
            green = fgetc(fbmpr);
            red = fgetc(fbmpr);
            rd_bmp[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] = (blue & 0xff) | ((green & 0xff)<<8) | ((red & 0xff)<<16);
        }
    }
    fclose(fbmpr);

    std::vector<cl::Device> devices = xcl::get_xil_devices();
    cl::Device device = devices[0];
    devices.resize(1);


    // Creating Context and Command Queue for selected device
    cl::Context context(device);
    cl::CommandQueue q(context, device, CL_QUEUE_PROFILING_ENABLE);

    // Load xclbin
    std::cout << "Loading: '" << xclbinFilename << "'\n";
    std::ifstream bin_file(xclbinFilename, std::ifstream::binary);
    bin_file.seekg (0, bin_file.end);
    unsigned nb = bin_file.tellg();
    bin_file.seekg (0, bin_file.beg);
    char *buf = new char [nb];
    bin_file.read(buf, nb);

    // Creating Program from Binary File
    cl::Program::Binaries bins;
    bins.push_back({buf,nb});
    cl::Program program(context, devices, bins);

    // This call will get the kernel object from program. A kernel is an
    // OpenCL function that is executed on the FPGA.
    cl::Kernel krnl_lap_filter(program,"lap_filter_axim");

    // These commands will allocate memory on the Device. The cl::Buffer objects can
    // be used to reference the memory locations on the device.
    cl::Buffer rd_bmp_buf(context, CL_MEM_USE_HOST_PTR | CL_MEM_READ_ONLY,
            size_in_bytes, rd_bmp.data());
    cl::Buffer hw_lapd_buf(context, CL_MEM_USE_HOST_PTR | CL_MEM_READ_WRITE,
            size_in_bytes, hw_lapd.data());

    // Data will be transferred from system memory over PCIe to the FPGA on-board
    // DDR memory.
    q.enqueueMigrateMemObjects({rd_bmp_buf},0/* 0 means from host*/);

    //set the kernel Arguments
    krnl_lap_filter.setArg(0,rd_bmp_buf);
    krnl_lap_filter.setArg(1,hw_lapd_buf);
    krnl_lap_filter.setArg(2,bmpihr.biWidth);
    krnl_lap_filter.setArg(3,bmpihr.biHeight);

    //Launch the Kernel
    q.enqueueTask(krnl_lap_filter);

    // The result of the previous kernel execution will need to be retrieved in
    // order to view the results. This call will transfer the data from FPGA to
    // source_results vector

    q.enqueueMigrateMemObjects({hw_lapd_buf},CL_MIGRATE_MEM_OBJECT_HOST);

    q.finish();

    laplacian_filter_soft(rd_bmp.data(), sw_lapd.data(), bmpihr.biWidth, bmpihr.biHeight);  // ソフトウェアのラプラシアン・フィルタ

    // ハードウェアとソフトウェアのラプラシアン・フィルタの値のチェック
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            if (hw_lapd[y*bmpihr.biWidth+x] != sw_lapd[y*bmpihr.biWidth+x]){
                printf("ERROR HW and SW results mismatch x = %ld, y = %ld, HW = %d, SW = %d\n", x, y, hw_lapd[y*bmpihr.biWidth+x], sw_lapd[y*bmpihr.biWidth+x]);
                //return(1);
            }
        }
    }
    printf("Success HW and SW results match\n");

    // ハードウェアのラプラシアンフィルタの結果を temp_lap.bmp へ出力する
    if ((fbmpw=fopen("temp_lap.bmp", "wb")) == NULL){
        fprintf(stderr, "Can't open temp_lap.bmp by binary write mode\n");
        exit(1);
    }
    // BMPファイルヘッダの書き込み
    fwrite(&bmpfhr.bfType, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfSize, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved1, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfReserved2, sizeof(uint16_t), 1, fbmpw);
    fwrite(&bmpfhr.bfOffBits, sizeof(uint32_t), 1, fbmpw);
    fwrite(&bmpihr, sizeof(BITMAPINFOHEADER), 1, fbmpw);

    // RGB データの書き込み、逆順にする
    for (y=0; y<bmpihr.biHeight; y++){
        for (x=0; x<bmpihr.biWidth; x++){
            blue = hw_lapd[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] & 0xff;
            green = (hw_lapd[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x] >> 8) & 0xff;
            red = (hw_lapd[((bmpihr.biHeight-1)-y)*bmpihr.biWidth+x]>>16) & 0xff;

            fputc(blue, fbmpw);
            fputc(green, fbmpw);
            fputc(red, fbmpw);
        }
    }
    fclose(fbmpw);

    return(0);
}

void laplacian_filter_soft(int *cam_fb, int *lap_fb, long width, long height)
{
    int **line_buf;
    int *lap_buf;
    int x, y, i;
    int lap_fil_val;
    int a, b;
    int fl, sl, tl;

    // line_buf の1次元目の配列をアロケートする
    if ((line_buf =(int **)malloc(sizeof(int *) * 3)) == NULL){
        fprintf(stderr, "Can't allocate line_buf[3][]\n");
        exit(1);
    }

    // メモリをアロケートする
    for (i=0; i<3; i++){
        if ((line_buf[i]=(int *)malloc(sizeof(int) * width)) == NULL){
            fprintf(stderr, "Can't allocate line_buf[%d]\n", i);
            exit(1);
        }
    }

    if ((lap_buf=(int *)malloc(sizeof(int) * (width))) == NULL){
        fprintf(stderr, "Can't allocate lap_buf memory\n");
        exit(1);
    }

    // RGB値をY(輝度成分)のみに変換し、ラプラシアンフィルタを掛けた。
    for (y=0; y<height; y++){
        for (x=0; x<width; x++){
            if (y==0 || y==height-1){ // 縦の境界の時の値は0とする
                lap_fil_val = 0;
            }else if (x==0 || x==width-1){ // 横の境界の時も値は0とする
                lap_fil_val = 0;
            }else{
                if (y == 1 && x == 1){ // 最初のラインの最初のピクセルでは2ライン分の画素を読み出す
                    for (a=0; a<2; a++){ // 2ライン分
                        for (b=0; b<width; b++){ // ライン
                            line_buf[a][b] = cam_fb[(a*width)+b];
                            line_buf[a][b] = conv_rgb2y_soft(line_buf[a][b]);
                        }
                    }
                }
                if (x == 1) {    // ラインの最初なので、2つのピクセルを読み込む
                    for (b=0; b<2; b++){ // ライン
                        line_buf[(y+1)%3][b] = cam_fb[((y+1)*width)+b];
                        // (y+1)%3 は、使用済みのラインがに読み込む、y=2 の時 line[0], y=3の時 line[1], y=4の時 line[2]
                        line_buf[(y+1)%3][b] = conv_rgb2y_soft(line_buf[(y+1)%3][b]);
                    }
                }

                // 1つのピクセルを読み込みながらラプラシアン・フィルタを実行する
                line_buf[(y+1)%3][x+1] = cam_fb[((y+1)*width)+(x+1)];
                // (y+1)%3 は、使用済みのラインがに読み込む、y=2 の時 line[0], y=3の時 line[1], y=4の時 line[2]
                line_buf[(y+1)%3][x+1] = conv_rgb2y_soft(line_buf[(y+1)%3][x+1]);

                fl = (y-1)%3;    // 最初のライン, y=1 012, y=2 120, y=3 201, y=4 012
                sl = y%3;        // 2番めのライン
                tl = (y+1)%3;    // 3番目のライン
                lap_fil_val = laplacian_fil_soft(line_buf[fl][x-1], line_buf[fl][x], line_buf[fl][x+1], line_buf[sl][x-1], line_buf[sl][x], line_buf[sl][x+1], line_buf[tl][x-1], line_buf[tl][x], line_buf[tl][x+1]);
            }
            // ラプラシアンフィルタ・データの書き込み
            lap_fb[(y*width)+x] = (lap_fil_val<<16)+(lap_fil_val<<8)+lap_fil_val ;
        }
    }
    free(lap_buf);
    for (i=0; i<3; i++)
        free(line_buf[i]);
    free(line_buf);
}

// RGBからYへの変換
// RGBのフォーマットは、{8'd0, R(8bits), G(8bits), B(8bits)}, 1pixel = 32bits
// 輝度信号Yのみに変換する。変換式は、Y =  0.299R + 0.587G + 0.114B
// "YUVフォーマット及び YUV<->RGB変換"を参考にした。http://vision.kuee.kyoto-u.ac.jp/~hiroaki/firewire/yuv.html
// 2013/09/27 : float を止めて、すべてint にした
int conv_rgb2y_soft(int rgb){
    int r, g, b, y_f;
    int y;

    b = rgb & 0xff;
    g = (rgb>>8) & 0xff;
    r = (rgb>>16) & 0xff;

    y_f = 77*r + 150*g + 29*b; //y_f = 0.299*r + 0.587*g + 0.114*b;の係数に256倍した
    y = y_f >> 8; // 256で割る

    return(y);
}

// ラプラシアンフィルタ
// x0y0 x1y0 x2y0 -1 -1 -1
// x0y1 x1y1 x2y1 -1  8 -1
// x0y2 x1y2 x2y2 -1 -1 -1
int laplacian_fil_soft(int x0y0, int x1y0, int x2y0, int x0y1, int x1y1, int x2y1, int x0y2, int x1y2, int x2y2)
{
    int y;

    y = -x0y0 -x1y0 -x2y0 -x0y1 +8*x1y1 -x2y1 -x0y2 -x1y2 -x2y2;
    if (y<0)
        y = -y;
    else if (y>255)
        y = 255;
    return(y);
}

  1. 2023年04月19日 04:15 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する11

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する10”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、KR260 にファイルを転送して kr260_vadd を実行したところ成功した。今回は、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_vadd をロードした時の、uio の状態を観察した。kr260_vadd をロードしたら、uio4 〜 uio9 が増えた。

まずは、kr260_vadd をロードする前の /sys/class/uio ディレクトリの状況を確認する。
uio0 〜 uio3 があった。
kr260_cam_disp_103_230417.png

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する10”で、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_vadd をロードした。
sudo xmutil unloadapp
sudo xmutil loadapp kr260_vadd

kr260_cam_disp_104_230417.png

kr260_vadd をロードした後の /sys/class/uio ディレクトリの状況を確認する。
uio4 〜 uio9 までが増えている。
kr260_cam_disp_105_230417.png

uio4 ディレクトリに入って、name ファイルを見ると、i2c と書いてあった。
kr260_cam_disp_106_230417.png

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する8”の pl.dtsi を見ると axi_intc_0: interrupt-controller@80000000 の方が先にあるのだが、次の camera_axi_iic_0: i2c@80010000 の方が先に uio になったようだ。つまり、pl.dtsi の順番は当てにならないということのようだ。

uio4 〜 uio9 の name ファイルの内容を示す。

uio4 - i2c
uio5 - interrupt-controller
uio6 - mt9d111_inf_axis
uio7 - vflip_dma_write2
uio8 - gpio
uio9 - disp_dmar_axis

  1. 2023年04月18日 04:17 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する10

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、Vitis 2022.1 を立ち上げて kr260_cam_disp プラットフォームを作成し、kr260_vadd アプリケーション・プロジェクトを作成し、ビルドを行って成功した。Vivado のプロジェクトの kr260_bd ブロック・デザインを確認した。今回は、、KR260 にファイルを転送して kr260_vadd を実行したところ成功した。

ファイルを KR260 に転送する
必要なファイルを集める。
KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/file_transfer/vadd_file_transfer ディレクトリを作成する。
ファイルマネージャーを使用して、KR260/kr260_cam_disp_platform/kr260_cam_disp_platform ディレクトリで vadd_file_transfer ディレクトリを作成した。

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/dtg_output/dtg_output/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp/pl.dtbo を vadd_file_transfer ディレクトリにコピーした。
kr260_cam_disp_94_230417.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/kr260_vadd_system/Hardware/binary_container_1.xclbin を vadd_file_transfer ディレクトリにコピーした。
kr260_cam_disp_95_230417.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/kr260_vadd/Hardware/kr260_vadd を vadd_file_transfer ディレクトリにコピーした。
kr260_cam_disp_96_230417.png

shell.json を作成して、vadd_file_transfer ディレクトリにセーブした。
kr260_cam_disp_97_230417.png

Accelerated Design Development on Kria KR260 in Vitis 2022.1”から shell.json の内容を引用する。

{
  "shell_type" : "XRT_FLAT",
  "num_slots": "1"
}



現在の vadd_file_transfer ディレクトリの様子を示す。
kr260_cam_disp_98_230417.png

KR260 で”KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する7”の Petalinux 2022.1 を起動した。
ホーム・ディレクトリに examples/kr260_vadd ディレクトリを作成した。
cd
mkdir examples
cd examples
mkdir kr260_vadd
cd kr260_vadd


FileZilla を起動して、KR260 の Petalinux 2022.1 へ SFTP で vadd_file_transfer ディレクトリのファイルを転送した。
kr260_cam_disp_99_230417.png

/lib/firmware/xilinx/kr260_vadd ディレクトリを作成した。
sudo mkdir /lib/firmware/xilinx/kr260_vadd

binary_container_1.xclbin の名前を binary_container_1.bin に変更する。こうしないと、XRT は FPGA ビットストリームを抽出して Kria のプログラマブル ロジックをコンフィグレーションすることができないそうだ。
mv binary_container_1.xclbin binary_container_1.bin

pl.dtbo binary_container_1.bin shell.json ファイルを /lib/firmware/xilinx/kr260_vadd ディレクトリにコピーした。
sudo cp pl.dtbo binary_container_1.bin shell.json /lib/firmware/xilinx/kr260_vadd
kr260_cam_disp_100_230417.png

現在、ロードされているアクセラレーション・アプリケーションをアンロードして、kr260_vadd をロードする。
sudo xmutil listapps
sudo xmutil unloadapp
sudo xmutil loadapp kr260_vadd

kr260_cam_disp_101_230417.png

kr260_vadd を実行したところ、”TEST PASSED”が表示されて、成功した。
./kr260_vadd binary_container_1.bin
kr260_cam_disp_102_230417.png
  1. 2023年04月17日 04:33 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する9

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する8”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、Vitis ディレクトリ構造を作成して、xsct を使用したデバイスツリー・オーバレイを作成し、pl.dtsi 上の動作させる IP の compatible を generic-uio に変更して、コンパイルして pl.dtbo を生成した。今回は、Vitis 2022.1 を立ち上げて kr260_cam_disp プラットフォームを作成し、kr260_vadd アプリケーション・プロジェクトを作成し、ビルドを行って成功した。Vivado のプロジェクトの kr260_bd ブロック・デザインを確認した。

KR260 で Vitis アクセラレーション・プラットフォームを作成する7”と”KR260 で Vitis アクセラレーション・プラットフォームを作成する8”を参照した。

すでに source /media/masaaki/Ubuntu_Disk/tools/Xilinx/Vitis/2022.1/settings64.sh は実行済みだ。

vitis &
で Vitis 2022.1 を起動した。

Vitis IDE Launcher ダイアログが表示された。
Workspace に KR260/kr260_cam_disp_platform/kr260_cam_disp_platform を指定した。
Launch ボタンをクリックした。

Vitis 2022.1 が立ち上がった。
Create Platform Project をクリックして、プラットフォーム・プロジェクトを作成する。

New Platform Project ダイアログの Create new platform project 画面が開く。
Platform project name に kr260_cam_disp と入力した。
Next > ボタンをクリックする。
kr260_cam_disp_79_230415.png

Platform 画面
Hardware Specification の XSA File に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/kr260_cam_disp/kr260_cam_disp.xsa を指定した。
Software Specification の Operating system には linux を、Processor には psu_cortexa53 を指定した。
Finish ボタンをクリックする。
kr260_cam_disp_80_230415.png

kr260_cam_disp プラットフォーム・プロジェクトが作成された。
platform.spr で、kr260_cam_disp -> psu_cortexa53 -> linux on psu_cortexa53 をクリックして選択する。
Bif File: の Browse... の右端の下向き三角をクリックし、Generate Bif を選択する。

Boot Components Directory: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/pfm/boot を指定した。
FAT32 Partition Directory: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/pfm/sd_dir を指定した。
トンカチ・ボタンをクリックして、ビルドを行った。
kr260_cam_disp_81_230415.png

Explorer の export -> kr260_cam_disp プラットフォームが生成された
その下に hw と sw ディレクトリが生成されている。
kr260_cam_disp_82_230415.png

kr260_cam_disp_83_230415.png

Vitis 2022.1 でアプリケーション・プロジェクトを作成する。
Vitis 2022.1 で File メニューから New -> Application Project... を選択してアプリケーション・プロジェクトを新規作成する。
New Application Project ダイアログの Create a New Application Project 画面が開く。
Next > ボタンをクリックする。

Platform 画面
kr260_cam_disp プラットフォームを選択する。
Next > ボタンをクリックする。
kr260_cam_disp_84_230415.png

Application Project Details 画面
Application project name: に kr260_vadd と入力する。
Next > ボタンをクリックする。
kr260_cam_disp_85_230415.png

Domain 画面
Application settings を入力する。
Sysroot paht: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/sysroots/cortexa72-cortexa53-xilinx-linux を入力する。
Root FS: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/linux_os/images/linux/rootfs.ext4 を入力する。
Kernel Image: に /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/linux_os/images/linux/Image を入力する。
Next > ボタンをクリックする。
kr260_cam_disp_86_230415.png

Template 画面
Simple Vector Addition を選択する。
Finish ボタンをクリックする。
kr260_cam_disp_87_230415.png

Explorer で kr260_vadd_system を選択し、Active build configuration: で Hardware を選択して、トンカチ・ボタンをクリックしてビルドを行った。
kr260_cam_disp_88_230415.png

ビルドに成功した。
kr260_cam_disp_89_230415.png

ビルド後の Vivado プロジェクトを見てみよう。
Vivado プロジェクトは KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/kr260_vadd_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj に作成されていた。
kr260_cam_disp_90_230415.png

Vivado 2022.1 を起動して、プロジェクトを読み込んだ。
ブロック・デザインを示す。
camera、display 階層モジュールもブロック・デザイン内に実装されている。
kr260_cam_disp_91_230415.png

中心部を拡大した。
kr260_cam_disp_93_230415.png

Address Editor 画面を示す。
kr260_cam_disp_92_230415.png
  1. 2023年04月16日 04:25 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する8

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する7”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、KR260 に MicroSD カードを挿入して Petalinux 2022.1 を起動した。Petalinux に必要なモジュールをインストールして、環境を整えた。今回は、Vitis ディレクトリ構造を作成して、xsct を使用したデバイスツリー・オーバレイを作成し、pl.dtsi 上の動作させる IP の compatible を generic-uio に変更して、コンパイルして pl.dtbo を生成した。

今回は、”KR260 で Vitis アクセラレーション・プラットフォームを作成する6”と”Vitis アクセラレーション・プラットホームを使用してハードウェアを作り、それを自作アプリケーション・ソフトウェアで動作させる2”を参照している。

KR260/kr260_cam_disp_platform ディレクトリで kr260_cam_disp_platform ディレクトリを作成した。
KR260/kr260_cam_disp_platform/kr260_cam_disp_platform ディレクトリの下に pfm ディレクトリを作成した。
KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/pfm ディレクトリの下に boot, sd_dir ディレクトリを作成した。
mkdir -p kr260_cam_disp_platform
cd kr260_cam_disp_platform
mkdir -p pfm
cd pfm
mkdir -p boot
mkdir -p sd_dir

kr260_cam_disp_68_230414.png

KR260/kr260_cam_disp_platform/linux_os/images/linux ディレクトリの bl31.elf, pmufw.elf, system-zynqmp-sck-kr-g-revB.dtb, u-boot.elf, zynqmp_fsbl.elf のファイルを
kr260_cam_disp_69_230414.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/pfm/boot ディレクトリにコピーした。
kr260_cam_disp_70_230414.png

ただし、system-zynqmp-sck-kr-g-revB.dtb は system.dtb に名前を変更した。

KR260/kr260_cam_disp_platform/linux_os/images/linux ディレクトリで sysroots ディレクトリを KR260/kr260_cam_disp_platform/kr260_cam_disp_platform ディレクトリに展開した。
cd ../../linux_os/images/linux/
./sdk.sh -d ../../../kr260_cam_disp_platform/

kr260_cam_disp_71_230414.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/sysroots ディレクトリが生成され、その下に cortexa72-cortexa53-xilinx-linux, x86_64-petalinux-linux ディレクトリが生成された。
kr260_cam_disp_72_230414.png

xsct コマンドを使用してデバイスツリー・オーバレイの pl.dtsi と pl.dtbo を作成する

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform ディレクトリで xsct コマンドを実行した。
cd ../../../kr260_cam_disp_platform/
xsct
hsi::open_hw_design ../kr260_cam_disp/kr260_cam_disp.xsa
createdts -hw ../kr260_cam_disp/kr260_cam_disp.xsa -zocl -platform-name kr260_cam_disp -git-branch xlnx_rel_v2022.1 -overlay -compile -out ./dtg_output
exit

kr260_cam_disp_73_230414.png

KR260/kr260_cam_disp_platform/kr260_cam_disp_platform/dtg_output/dtg_output/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp ディレクトリに pl.dtsi が生成された。
kr260_cam_disp_74_230414.png

kr260_cam_disp_75_230414.png

pl.dtsi で動作させる可能性のある IP の compatible を generic-uio に変更した。
kr260_cam_disp_76_230414.png

pl.dtsi を示す。

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version: XSCT 2022.1
 * Today is: Fri Apr 14 04:56:06 2023
 */


/dts-v1/;
/plugin/;
/ {
    fragment@0 {
        target = <&fpga_full>;
        overlay0: __overlay__ {
            #address-cells = <2>;
            #size-cells = <2>;
            firmware-name = "kr260_cam_disp.bit.bin";
            resets = <&zynqmp_reset 116>, <&zynqmp_reset 117>, <&zynqmp_reset 118>, <&zynqmp_reset 119>;
        };
    };
    fragment@1 {
        target = <&amba>;
        overlay1: __overlay__ {
            afi0: afi0 {
                compatible = "xlnx,afi-fpga";
                config-afi = < 0 0>, <1 0>, <2 0>, <3 0>, <4 0>, <5 0>, <6 0>, <7 0>, <8 0>, <9 0>, <10 0>, <11 0>, <12 0>, <13 0>, <14 0xa00>, <15 0x000>;
            };
            clocking0: clocking0 {
                #clock-cells = <0>;
                assigned-clock-rates = <99999001>;
                assigned-clocks = <&zynqmp_clk 71>;
                clock-output-names = "fabric_clk";
                clocks = <&zynqmp_clk 71>;
                compatible = "xlnx,fclk";
            };
            clocking1: clocking1 {
                #clock-cells = <0>;
                assigned-clock-rates = <23809286>;
                assigned-clocks = <&zynqmp_clk 72>;
                clock-output-names = "fabric_clk";
                clocks = <&zynqmp_clk 72>;
                compatible = "xlnx,fclk";
            };
        };
    };
    fragment@2 {
        target = <&amba>;
        overlay2: __overlay__ {
            #address-cells = <2>;
            #size-cells = <2>;
            axi_intc_0: interrupt-controller@80000000 {
                #interrupt-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                interrupt-controller ;
                interrupt-names = "irq";
                interrupt-parent = <&gic>;
                interrupts = <0 89 4>;
                reg = <0x0 0x80000000 0x0 0x10000>;
                xlnx,kind-of-intr = <0x1>;
                xlnx,num-intr-inputs = <0x20>;
            };
            misc_clk_0: misc_clk_0 {
                #clock-cells = <0>;
                clock-frequency = <199998000>;
                compatible = "fixed-clock";
            };
            camera_axi_iic_0: i2c@80010000 {
                #address-cells = <1>;
                #size-cells = <0>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80010000 0x0 0x10000>;
            };
            camera_mt9d111_inf_axis_0: mt9d111_inf_axis@80020000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "s_axi_lite_aclk", "m_axis_aclk";
                clocks = <&misc_clk_0>, <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80020000 0x0 0x10000>;
            };
            camera_vflip_dma_write2_0: vflip_dma_write2@80030000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "ap_clk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                reg = <0x0 0x80030000 0x0 0x10000>;
                xlnx,s-axi-axilites-addr-width = <0x6>;
                xlnx,s-axi-axilites-data-width = <0x20>;
            };
            display_axi_gpio_0: gpio@80040000 {
                #gpio-cells = <2>;
                clock-names = "s_axi_aclk";
                clocks = <&misc_clk_0>;
                compatible = "generic-uio";
                gpio-controller ;
                reg = <0x0 0x80040000 0x0 0x10000>;
                xlnx,all-inputs = <0x0>;
                xlnx,all-inputs-2 = <0x0>;
                xlnx,all-outputs = <0x1>;
                xlnx,all-outputs-2 = <0x0>;
                xlnx,dout-default = <0x00000000>;
                xlnx,dout-default-2 = <0x00000000>;
                xlnx,gpio-width = <0x1>;
                xlnx,gpio2-width = <0x20>;
                xlnx,interrupt-present = <0x0>;
                xlnx,is-dual = <0x0>;
                xlnx,tri-default = <0xFFFFFFFF>;
                xlnx,tri-default-2 = <0xFFFFFFFF>;
            };
            display_disp_dmar_axis_0: disp_dmar_axis@80050000 {
                /* This is a place holder node for a custom IP, user may need to update the entries */
                clock-names = "ap_clk";
                clocks = <&zynqmp_clk 71>;
                compatible = "generic-uio";
                reg = <0x0 0x80050000 0x0 0x10000>;
                xlnx,s-axi-axilites-addr-width = <0x6>;
                xlnx,s-axi-axilites-data-width = <0x20>;
            };
            zyxclmm_drm {
                compatible = "xlnx,zocl";
                interrupts-extended = <&axi_intc_0 0 4>, <&axi_intc_0 1 4>, <&axi_intc_0 2 4>, <&axi_intc_0 3 4>, <&axi_intc_0 4 4>, <&axi_intc_0 5 4>, <&axi_intc_0 6 4>, <&axi_intc_0 7 4>, <&axi_intc_0 8 4>, <&axi_intc_0 9 4>,
<&axi_intc_0 10 4>, <&axi_intc_0 11 4>, <&axi_intc_0 12 4>, <&axi_intc_0 13 4>, <&axi_intc_0 14 4>,
<&axi_intc_0 15 4>, <&axi_intc_0 16 4>, <&axi_intc_0 17 4>, <&axi_intc_0 18 4>, <&axi_intc_0 19 4>,
<&axi_intc_0 20 4>, <&axi_intc_0 21 4>, <&axi_intc_0 22 4>, <&axi_intc_0 23 4>, <&axi_intc_0 24 4>,
<&axi_intc_0 25 4>, <&axi_intc_0 26 4>, <&axi_intc_0 27 4>, <&axi_intc_0 28 4>, <&axi_intc_0 29 4>,
<&axi_intc_0 30 4>, <&axi_intc_0 31 4 >;
            };
        };
    };
};


変更した pl.dtsi をコンパイルして pl.dtbo を生成する。
cd dtg_output/dtg_output/kr260_cam_disp/psu_cortexa53_0/device_tree_domain/bsp
dtc -@ -O dtb -o pl.dtbo pl.dtsi
cd ../../../../../..

kr260_cam_disp_77_230414.png

pl.dtbo が生成された。
kr260_cam_disp_78_230414.png
  1. 2023年04月15日 05:22 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する7

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する6”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、sdk.sh を作成し、BOOT.BIN を作成した。最後に MicroSD カードのイメージを作成し、MicroSD カードに書き込んだ。今回は、。KR260 に MicroSD カードを挿入して Petalinux 2022.1 を起動した。Petalinux に必要なモジュールをインストールして、環境を整えた。

MicroSD カードを KV260 に挿入して電源 ON したところ、Petalinux 2022.1 が起動した。
kr260_cam_disp_65_230413.png

ifconifg コマンドを実行すると、振られている IP が分かった。
kr260_cam_disp_66_230413.png

ssh でログインすることができた。
ssh 192.168.3.28 -X -l petalinux
パスワードは自分で決めたパスワードだ。

Petalinux に必要なモジュールをインストールして、環境を整える。

ファイル・マネージャーから。pcmafm をインストールする。
sudo dnf install pcmanfm.cortexa72_cortexa53

packagegroup-petalinux-opencv-dbg をインストールした。
sudo dnf install packagegroup-petalinux-opencv-dbg

openssh-sftp-server をインストールした。
sudo dnf install openssh-sftp-server.cortexa72_cortexa53

テキスト・エディタの l3afpad をインストールした。
sudo dnf install l3afpad.cortexa72_cortexa53

gtk-play をインストールする。
gst-examples をインストールした。
sudo dnf install gst-examples.cortexa72_cortexa53

pcmanfm から gtk-play を起動できるようにした。
IMG_20191030_051740.jpg ファイルをダブルクリックで開くと、Choose Application ダイアログが開く。
Custom Command Line タブをクリックして、Command line to execute: に gtk-play %f と入力し、”Set selected application as default action for this file type”のチェックボックスにチェックを入れた。また、Application name に gtk-play と書いた。

gcc をインストールしよう。
sudo dnf install gcc.cortexa72_cortexa53
sudo dnf install gcc-symlinks.cortexa72_cortexa53


pcmanfm の表示を示す。
kr260_cam_disp_67_230413.png

ls コマンドで色付けするために .bashrc に”alias ls='ls --color=auto'”を追加した。
kr260_cam_disp_68_230413.png

最後に Petalinux の起動ログを貼っておく。

�Xilinx Zynq MP First Stage Boot Loader 
Release 2022.1   Sep 16 2022  -  04:56:15
MultiBootOffset: 0x1F0
Reset Mode  :   System Reset
Platform: Silicon (4.0), Running on A53-0 (64-bit) Processor, Device Name: XCZUUNKNEG
QSPI 32 bit Boot Mode 
FlashID=0x20 0xBB 0x20
Pr�NOTICE:  BL31: v2.6(release):0897efd
NOTICE:  BL31: Built : 04:58:29, Sep 16 2022


U-Boot 2022.01-g91ad7924-dirty (Sep 15 2022 - 23:00:49 -0600), Build: jenkins-BUILDS-2022.1-som_qspi_generation-131

CPU:   ZynqMP
Silicon: v3
Detected name: zynqmp-smk-k26-xcl2g-rev1-sck-kr-g-rev1
Model: ZynqMP SMK-K26 Rev1/B/A
Board: Xilinx ZynqMP
DRAM:  4 GiB
PMUFW:  v1.1
Xilinx I2C FRU format at nvmem0:
 Manufacturer Name: XILINX
 Product Name: SMK-K26-XCL2G
 Serial No: XFL1CYY0C2I3
 Part Number: 5057-04
 File ID: 0x0
 Revision Number: 1
Xilinx I2C FRU format at nvmem1:
 Manufacturer Name: XILINX
 Product Name: SCK-KR-G
 Serial No: XFL1V0BJCWOF
 Part Number: 5100-01
 File ID: 0x0
 Revision Number: 1
EL Level:   EL2
Chip ID:    xck26
NAND:  0 MiB
MMC:   
Loading Environment from nowhere... OK
In:    serial
Out:   serial
Err:   serial
Bootmode: QSPI_MODE
Reset reason:   SOFT 
Net:   
ZYNQ GEM: ff0b0000, mdio bus ff0c0000, phyaddr 4, interface sgmii
eth0: ethernet@ff0b0000
ZYNQ GEM: ff0c0000, mdio bus ff0c0000, phyaddr 8, interface rgmii-id
, eth1: ethernet@ff0c0000
starting USB...
Bus usb@fe200000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
Bus usb@fe300000: Register 2000440 NbrPorts 2
Starting the controller
USB XHCI 1.00
scanning bus usb@fe200000 for devices... 5 USB Device(s) found
scanning bus usb@fe300000 for devices... 4 USB Device(s) found
       scanning usb for storage devices... 1 Storage Device(s) found
Hit any key to stop autoboot:  0 
model=SMK-K26-XCL2G

Device 0: Vendor: Generic  Rev: 1.98 Prod: Ultra HS-COMBO
            Type: Removable Hard Disk
            Capacity: 29554.0 MB = 28.8 GB (60526592 x 512)
... is now current device
Scanning usb 0:1...
Found U-Boot script /boot.scr
2777 bytes read in 1 ms (2.6 MiB/s)
## Executing script at 20000000
Trying to load boot images from usb0
22401536 bytes read in 1489 ms (14.3 MiB/s)
46961 bytes read in 6 ms (7.5 MiB/s)
23217328 bytes read in 1542 ms (14.4 MiB/s)
## Loading init Ramdisk from Legacy Image at 04000000 ...
   Image Name:   petalinux-initramfs-image-xilinx
   Created:      2011-04-05  23:00:00 UTC
   Image Type:   AArch64 Linux RAMDisk Image (uncompressed)
   Data Size:    23217264 Bytes = 22.1 MiB
   Load Address: 00000000
   Entry Point:  00000000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 00100000
   Booting using the fdt blob at 0x100000
   Loading Ramdisk to 779db000, end 78fff470 ... OK
   Loading Device Tree to 000000000fff1000, end 000000000ffff770 ... OK

Starting kernel ...

[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]
[    0.000000] Linux version 5.15.19-xilinx-v2022.1 (oe-user@oe-host) (aarch64-xilinx-linux-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP Thu May 12 09:05:30 UTC 2022
[    0.000000] Machine model: ZynqMP SMK-K26 Rev1/B/A
[    0.000000] earlycon: cdns0 at MMIO 0x00000000ff010000 (options '115200n8')
[    0.000000] printk: bootconsole [cdns0] enabled
[    0.000000] efi: UEFI not found.
[    0.000000] Zone ranges:
[    0.000000]   DMA32    [mem 0x0000000000000000-0x00000000ffffffff]
[    0.000000]   Normal   [mem 0x0000000100000000-0x000000087fffffff]
[    0.000000] Movable zone start for each node
[    0.000000] Early memory node ranges
[    0.000000]   node   0: [mem 0x0000000000000000-0x000000003ecfffff]
[    0.000000]   node   0: [mem 0x000000003ed00000-0x000000003ee47fff]
[    0.000000]   node   0: [mem 0x000000003ee48000-0x000000007fefffff]
[    0.000000]   node   0: [mem 0x0000000800000000-0x000000087fffffff]
[    0.000000] Initmem setup node 0 [mem 0x0000000000000000-0x000000087fffffff]
[    0.000000] On node 0, zone Normal: 256 pages in unavailable ranges
[    0.000000] cma: Reserved 900 MiB at 0x000000003f400000
[    0.000000] psci: probing for conduit method from DT.
[    0.000000] psci: PSCIv1.1 detected in firmware.
[    0.000000] psci: Using standard PSCI v0.2 function IDs
[    0.000000] psci: MIGRATE_INFO_TYPE not supported.
[    0.000000] psci: SMC Calling Convention v1.2
[    0.000000] percpu: Embedded 18 pages/cpu s34776 r8192 d30760 u73728
[    0.000000] Detected VIPT I-cache on CPU0
[    0.000000] CPU features: detected: ARM erratum 845719
[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 1031940
[    0.000000] Kernel command line: earlycon console=ttyPS1,115200 clk_ignore_unused xilinx_tsn_ep.st_pcp=4 init_fatal_sh=1 cma=900M uio_pdrv_genirq.of_id=generic-uio
[    0.000000] Unknown kernel command line parameters "init_fatal_sh=1", will be passed to user space.
[    0.000000] Dentry cache hash table entries: 524288 (order: 10, 4194304 bytes, linear)
[    0.000000] Inode-cache hash table entries: 262144 (order: 9, 2097152 bytes, linear)
[    0.000000] mem auto-init: stack:off, heap alloc:off, heap free:off
[    0.000000] software IO TLB: mapped [mem 0x000000007bf00000-0x000000007ff00000] (64MB)
[    0.000000] Memory: 3078456K/4193280K available (14528K kernel code, 1012K rwdata, 4056K rodata, 2176K init, 571K bss, 193224K reserved, 921600K cma-reserved)
[    0.000000] rcu: Hierarchical RCU implementation.
[    0.000000] rcu:     RCU event tracing is enabled.
[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.
[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0
[    0.000000] GIC: Adjusting CPU interface base to 0x00000000f902f000
[    0.000000] Root IRQ handler: gic_handle_irq
[    0.000000] GIC: Using split EOI/Deactivate mode
[    0.000000] random: get_random_bytes called from start_kernel+0x474/0x6d4 with crng_init=0
[    0.000000] arch_timer: cp15 timer(s) running at 99.99MHz (phys).
[    0.000000] clocksource: arch_sys_counter: mask: 0xffffffffffffff max_cycles: 0x171015c90f, max_idle_ns: 440795203080 ns
[    0.000000] sched_clock: 56 bits at 99MHz, resolution 10ns, wraps every 4398046511101ns
[    0.008304] Console: colour dummy device 80x25
[    0.012396] Calibrating delay loop (skipped), value calculated using timer frequency.. 199.99 BogoMIPS (lpj=399996)
[    0.022752] pid_max: default: 32768 minimum: 301
[    0.027505] Mount-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.034699] Mountpoint-cache hash table entries: 8192 (order: 4, 65536 bytes, linear)
[    0.043429] rcu: Hierarchical SRCU implementation.
[    0.047500] EFI services will not be available.
[    0.051861] smp: Bringing up secondary CPUs ...
[    0.056573] Detected VIPT I-cache on CPU1
[    0.056612] CPU1: Booted secondary processor 0x0000000001 [0x410fd034]
[    0.056981] Detected VIPT I-cache on CPU2
[    0.057003] CPU2: Booted secondary processor 0x0000000002 [0x410fd034]
[    0.057342] Detected VIPT I-cache on CPU3
[    0.057362] CPU3: Booted secondary processor 0x0000000003 [0x410fd034]
[    0.057402] smp: Brought up 1 node, 4 CPUs
[    0.091692] SMP: Total of 4 processors activated.
[    0.096364] CPU features: detected: 32-bit EL0 Support
[    0.101468] CPU features: detected: CRC32 instructions
[    0.106605] CPU: All CPU(s) started at EL2
[    0.110648] alternatives: patching kernel code
[    0.116060] devtmpfs: initialized
[    0.123893] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns
[    0.128034] futex hash table entries: 1024 (order: 4, 65536 bytes, linear)
[    0.160402] pinctrl core: initialized pinctrl subsystem
[    0.160874] DMI not present or invalid.
[    0.164037] NET: Registered PF_NETLINK/PF_ROUTE protocol family
[    0.170646] DMA: preallocated 512 KiB GFP_KERNEL pool for atomic allocations
[    0.176770] DMA: preallocated 512 KiB GFP_KERNEL|GFP_DMA32 pool for atomic allocations
[    0.184595] audit: initializing netlink subsys (disabled)
[    0.189999] audit: type=2000 audit(0.132:1): state=initialized audit_enabled=0 res=1
[    0.190355] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.
[    0.204418] ASID allocator initialised with 65536 entries
[    0.209825] Serial: AMBA PL011 UART driver
[    0.231798] HugeTLB registered 1.00 GiB page size, pre-allocated 0 pages
[    0.232860] HugeTLB registered 32.0 MiB page size, pre-allocated 0 pages
[    0.239531] HugeTLB registered 2.00 MiB page size, pre-allocated 0 pages
[    0.246188] HugeTLB registered 64.0 KiB page size, pre-allocated 0 pages
[    1.215419] cryptd: max_cpu_qlen set to 1000
[    1.237834] DRBG: Continuing without Jitter RNG
[    1.337533] raid6: neonx8   gen()  2373 MB/s
[    1.405581] raid6: neonx8   xor()  1763 MB/s
[    1.473646] raid6: neonx4   gen()  2422 MB/s
[    1.541694] raid6: neonx4   xor()  1718 MB/s
[    1.609750] raid6: neonx2   gen()  2292 MB/s
[    1.677799] raid6: neonx2   xor()  1578 MB/s
[    1.745867] raid6: neonx1   gen()  1955 MB/s
[    1.813919] raid6: neonx1   xor()  1348 MB/s
[    1.881968] raid6: int64x8  gen()  1518 MB/s
[    1.950021] raid6: int64x8  xor()   859 MB/s
[    2.018081] raid6: int64x4  gen()  1775 MB/s
[    2.086139] raid6: int64x4  xor()   946 MB/s
[    2.154202] raid6: int64x2  gen()  1552 MB/s
[    2.222256] raid6: int64x2  xor()   834 MB/s
[    2.290324] raid6: int64x1  gen()  1148 MB/s
[    2.358379] raid6: int64x1  xor()   575 MB/s
[    2.358417] raid6: using algorithm neonx4 gen() 2422 MB/s
[    2.362374] raid6: .... xor() 1718 MB/s, rmw enabled
[    2.367305] raid6: using neon recovery algorithm
[    2.372353] iommu: Default domain type: Translated 
[    2.376738] iommu: DMA domain TLB invalidation policy: strict mode 
[    2.383160] SCSI subsystem initialized
[    2.386809] usbcore: registered new interface driver usbfs
[    2.392156] usbcore: registered new interface driver hub
[    2.397429] usbcore: registered new device driver usb
[    2.402475] mc: Linux media interface: v0.10
[    2.406678] videodev: Linux video capture interface: v2.00
[    2.412142] pps_core: LinuxPPS API ver. 1 registered
[    2.417044] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
[    2.426134] PTP clock support registered
[    2.430035] EDAC MC: Ver: 3.0.0
[    2.433401] zynqmp-ipi-mbox mailbox@ff990400: Registered ZynqMP IPI mbox with TX/RX channels.
[    2.441799] zynqmp-ipi-mbox mailbox@ff990600: Registered ZynqMP IPI mbox with TX/RX channels.
[    2.450194] FPGA manager framework
[    2.453548] Advanced Linux Sound Architecture Driver Initialized.
[    2.459808] Bluetooth: Core ver 2.22
[    2.463072] NET: Registered PF_BLUETOOTH protocol family
[    2.468340] Bluetooth: HCI device and connection manager initialized
[    2.474656] Bluetooth: HCI socket layer initialized
[    2.479500] Bluetooth: L2CAP socket layer initialized
[    2.484520] Bluetooth: SCO socket layer initialized
[    2.489688] clocksource: Switched to clocksource arch_sys_counter
[    2.495524] VFS: Disk quotas dquot_6.6.0
[    2.499340] VFS: Dquot-cache hash table entries: 512 (order 0, 4096 bytes)
[    2.510151] NET: Registered PF_INET protocol family
[    2.511103] IP idents hash table entries: 65536 (order: 7, 524288 bytes, linear)
[    2.519756] tcp_listen_portaddr_hash hash table entries: 2048 (order: 3, 32768 bytes, linear)
[    2.526851] TCP established hash table entries: 32768 (order: 6, 262144 bytes, linear)
[    2.534866] TCP bind hash table entries: 32768 (order: 7, 524288 bytes, linear)
[    2.542304] TCP: Hash tables configured (established 32768 bind 32768)
[    2.548504] UDP hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    2.555164] UDP-Lite hash table entries: 2048 (order: 4, 65536 bytes, linear)
[    2.562317] NET: Registered PF_UNIX/PF_LOCAL protocol family
[    2.568109] RPC: Registered named UNIX socket transport module.
[    2.573707] RPC: Registered udp transport module.
[    2.578371] RPC: Registered tcp transport module.
[    2.583039] RPC: Registered tcp NFSv4.1 backchannel transport module.
[    2.589994] PCI: CLS 0 bytes, default 64
[    2.593464] Trying to unpack rootfs image as initramfs...
[    2.599376] armv8-pmu pmu: hw perfevents: no interrupt-affinity property, guessing.
[    2.606759] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 counters available
[    3.593774] Freeing initrd memory: 22672K
[    3.624603] Initialise system trusted keyrings
[    3.624726] workingset: timestamp_bits=46 max_order=20 bucket_order=0
[    3.630509] NFS: Registering the id_resolver key type
[    3.634901] Key type id_resolver registered
[    3.638990] Key type id_legacy registered
[    3.642983] nfs4filelayout_init: NFSv4 File Layout Driver Registering...
[    3.649630] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...
[    3.656993] jffs2: version 2.2. (NAND) (SUMMARY)  © 2001-2006 Red Hat, Inc.
[    3.697026] NET: Registered PF_ALG protocol family
[    3.697075] xor: measuring software checksum speed
[    3.704684]    8regs           :  2626 MB/sec
[    3.708426]    32regs          :  3109 MB/sec
[    3.713423]    arm64_neon      :  2563 MB/sec
[    3.713908] xor: using function: 32regs (3109 MB/sec)
[    3.718927] Key type asymmetric registered
[    3.722992] Asymmetric key parser 'x509' registered
[    3.727867] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 244)
[    3.735188] io scheduler mq-deadline registered
[    3.739687] io scheduler kyber registered
[    3.768738] Serial: 8250/16550 driver, 4 ports, IRQ sharing disabled
[    3.770480] Serial: AMBA driver
[    3.773333] cacheinfo: Unable to detect cache hierarchy for CPU 0
[    3.782574] brd: module loaded
[    3.785772] loop: module loaded
[    3.786620] mtdoops: mtd device (mtddev=name/number) must be supplied
[    3.793761] tun: Universal TUN/TAP device driver, 1.6
[    3.796266] CAN device driver interface
[    3.800592] SPI driver wl1271_spi has no spi_device_id for ti,wl1271
[    3.806310] SPI driver wl1271_spi has no spi_device_id for ti,wl1273
[    3.812626] SPI driver wl1271_spi has no spi_device_id for ti,wl1281
[    3.818937] SPI driver wl1271_spi has no spi_device_id for ti,wl1283
[    3.825251] SPI driver wl1271_spi has no spi_device_id for ti,wl1285
[    3.831565] SPI driver wl1271_spi has no spi_device_id for ti,wl1801
[    3.837880] SPI driver wl1271_spi has no spi_device_id for ti,wl1805
[    3.844195] SPI driver wl1271_spi has no spi_device_id for ti,wl1807
[    3.850509] SPI driver wl1271_spi has no spi_device_id for ti,wl1831
[    3.856824] SPI driver wl1271_spi has no spi_device_id for ti,wl1835
[    3.863138] SPI driver wl1271_spi has no spi_device_id for ti,wl1837
[    3.869541] usbcore: registered new interface driver asix
[    3.874856] usbcore: registered new interface driver ax88179_178a
[    3.880889] usbcore: registered new interface driver cdc_ether
[    3.886684] usbcore: registered new interface driver net1080
[    3.892307] usbcore: registered new interface driver cdc_subset
[    3.898191] usbcore: registered new interface driver zaurus
[    3.903735] usbcore: registered new interface driver cdc_ncm
[    3.910035] usbcore: registered new interface driver uas
[    3.914642] usbcore: registered new interface driver usb-storage
[    3.921173] rtc_zynqmp ffa60000.rtc: registered as rtc0
[    3.925779] rtc_zynqmp ffa60000.rtc: setting system clock to 1970-01-01T00:00:09 UTC (9)
[    3.933858] i2c_dev: i2c /dev entries driver
[    3.939541] usbcore: registered new interface driver uvcvideo
[    3.944483] Bluetooth: HCI UART driver ver 2.3
[    3.948174] Bluetooth: HCI UART protocol H4 registered
[    3.953274] Bluetooth: HCI UART protocol BCSP registered
[    3.958563] Bluetooth: HCI UART protocol LL registered
[    3.963660] Bluetooth: HCI UART protocol ATH3K registered
[    3.969030] Bluetooth: HCI UART protocol Three-wire (H5) registered
[    3.975280] Bluetooth: HCI UART protocol Intel registered
[    3.980621] Bluetooth: HCI UART protocol QCA registered
[    3.985820] usbcore: registered new interface driver bcm203x
[    3.991443] usbcore: registered new interface driver bpa10x
[    3.996977] usbcore: registered new interface driver bfusb
[    4.002431] usbcore: registered new interface driver btusb
[    4.007891] usbcore: registered new interface driver ath3k
[    4.013380] EDAC MC: ECC not enabled
[    4.016988] EDAC DEVICE0: Giving out device to module edac controller cache_err: DEV edac (POLLED)
[    4.025915] EDAC DEVICE1: Giving out device to module zynqmp-ocm-edac controller zynqmp_ocm: DEV ff960000.memory-controller (INTERRUPT)
[    4.038247] sdhci: Secure Digital Host Controller Interface driver
[    4.044019] sdhci: Copyright(c) Pierre Ossman
[    4.048339] sdhci-pltfm: SDHCI platform and OF driver helper
[    4.054291] ledtrig-cpu: registered to indicate activity on CPUs
[    4.060028] SMCCC: SOC_ID: ARCH_SOC_ID not implemented, skipping ....
[    4.066396] zynqmp_firmware_probe Platform Management API v1.1
[    4.072129] zynqmp_firmware_probe Trustzone version v1.0
[    4.105693] securefw securefw: securefw probed
[    4.105964] alg: No test for xilinx-zynqmp-aes (zynqmp-aes)
[    4.110154] zynqmp_aes firmware:zynqmp-firmware:zynqmp-aes: AES Successfully Registered
[    4.118251] alg: No test for xilinx-keccak-384 (zynqmp-keccak-384)
[    4.124392] alg: No test for xilinx-zynqmp-rsa (zynqmp-rsa)
[    4.129906] usbcore: registered new interface driver usbhid
[    4.135300] usbhid: USB HID core driver
[    4.141897] ARM CCI_400_r1 PMU driver probed
[    4.142486] fpga_manager fpga0: Xilinx ZynqMP FPGA Manager registered
[    4.150118] usbcore: registered new interface driver snd-usb-audio
[    4.156631] pktgen: Packet Generator for packet performance testing. Version: 2.75
[    4.164113] Initializing XFRM netlink socket
[    4.167718] NET: Registered PF_INET6 protocol family
[    4.172999] Segment Routing with IPv6
[    4.176231] In-situ OAM (IOAM) with IPv6
[    4.180171] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
[    4.186294] NET: Registered PF_PACKET protocol family
[    4.191013] NET: Registered PF_KEY protocol family
[    4.195774] can: controller area network core
[    4.200117] NET: Registered PF_CAN protocol family
[    4.204845] can: raw protocol
[    4.207787] can: broadcast manager protocol
[    4.211940] can: netlink gateway - max_hops=1
[    4.216327] Bluetooth: RFCOMM TTY layer initialized
[    4.221113] Bluetooth: RFCOMM socket layer initialized
[    4.226219] Bluetooth: RFCOMM ver 1.11
[    4.229935] Bluetooth: BNEP (Ethernet Emulation) ver 1.3
[    4.235205] Bluetooth: BNEP filters: protocol multicast
[    4.240398] Bluetooth: BNEP socket layer initialized
[    4.245325] Bluetooth: HIDP (Human Interface Emulation) ver 1.2
[    4.251209] Bluetooth: HIDP socket layer initialized
[    4.256162] 8021q: 802.1Q VLAN Support v1.8
[    4.260387] 9pnet: Installing 9P2000 support
[    4.264548] Key type dns_resolver registered
[    4.268905] registered taskstats version 1
[    4.272836] Loading compiled-in X.509 certificates
[    4.278602] Btrfs loaded, crc32c=crc32c-generic, zoned=no, fsverity=no
[    4.292642] ff010000.serial: ttyPS1 at MMIO 0xff010000 (irq = 48, base_baud = 6249999) is a xuartps
[    4.301669] printk: console [ttyPS1] enabled
[    4.301669] printk: console [ttyPS1] enabled
[    4.305962] printk: bootconsole [cdns0] disabled
[    4.305962] printk: bootconsole [cdns0] disabled
[    4.315214] of-fpga-region fpga-full: FPGA Region probed
[    4.325383] xilinx-zynqmp-dma fd500000.dma-controller: ZynqMP DMA driver Probe success
[    4.333452] xilinx-zynqmp-dma fd510000.dma-controller: ZynqMP DMA driver Probe success
[    4.341524] xilinx-zynqmp-dma fd520000.dma-controller: ZynqMP DMA driver Probe success
[    4.349591] xilinx-zynqmp-dma fd530000.dma-controller: ZynqMP DMA driver Probe success
[    4.357662] xilinx-zynqmp-dma fd540000.dma-controller: ZynqMP DMA driver Probe success
[    4.365730] xilinx-zynqmp-dma fd550000.dma-controller: ZynqMP DMA driver Probe success
[    4.373818] xilinx-zynqmp-dma fd560000.dma-controller: ZynqMP DMA driver Probe success
[    4.381878] xilinx-zynqmp-dma fd570000.dma-controller: ZynqMP DMA driver Probe success
[    4.390013] xilinx-zynqmp-dma ffa80000.dma-controller: ZynqMP DMA driver Probe success
[    4.398079] xilinx-zynqmp-dma ffa90000.dma-controller: ZynqMP DMA driver Probe success
[    4.406140] xilinx-zynqmp-dma ffaa0000.dma-controller: ZynqMP DMA driver Probe success
[    4.414205] xilinx-zynqmp-dma ffab0000.dma-controller: ZynqMP DMA driver Probe success
[    4.422273] xilinx-zynqmp-dma ffac0000.dma-controller: ZynqMP DMA driver Probe success
[    4.430343] xilinx-zynqmp-dma ffad0000.dma-controller: ZynqMP DMA driver Probe success
[    4.438407] xilinx-zynqmp-dma ffae0000.dma-controller: ZynqMP DMA driver Probe success
[    4.446469] xilinx-zynqmp-dma ffaf0000.dma-controller: ZynqMP DMA driver Probe success
[    4.454844] xilinx-zynqmp-dpdma fd4c0000.dma-controller: Xilinx DPDMA engine is probed
[    4.465909] zynqmp-display fd4a0000.display: vtc bridge property not present
[    4.475804] xilinx-dp-snd-codec fd4a0000.display:zynqmp_dp_snd_codec0: Xilinx DisplayPort Sound Codec probed
[    4.485866] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm0: Xilinx DisplayPort Sound PCM probed
[    4.490796] zynqmp_pll_disable() clock disable failed for dpll_int, ret = -13
[    4.493902] xilinx-dp-snd-pcm zynqmp_dp_snd_pcm1: Xilinx DisplayPort Sound PCM probed
[    4.509608] xilinx-dp-snd-card fd4a0000.display:zynqmp_dp_snd_card: Xilinx DisplayPort Sound Card probed
[    4.519167] OF: graph: no port node found in /axi/display@fd4a0000
[    4.525669] xlnx-drm xlnx-drm.0: bound fd4a0000.display (ops 0xffff800008f030e0)
[    4.696993] Console: switching to colour frame buffer device 240x67
[    4.719921] zynqmp-display fd4a0000.display: [drm] fb0: xlnxdrmfb frame buffer device
[    4.727945] [drm] Initialized xlnx 1.0.0 20130509 for fd4a0000.display on minor 0
[    4.735446] zynqmp-display fd4a0000.display: ZynqMP DisplayPort Subsystem driver probed
[    4.745145] spi-nor spi0.0: mt25qu512a (65536 Kbytes)
[    4.746860] tpm_tis_spi spi2.0: 2.0 TPM (device-id 0x1B, rev-id 22)
[    4.750254] 16 fixed-partitions partitions found on MTD device spi0.0
[    4.758864] tpm tpm0: A TPM error (256) occurred attempting the self test
[    4.762884] Creating 16 MTD partitions on "spi0.0":
[    4.769663] tpm tpm0: starting up the TPM manually
[    4.772679] random: fast init done
[    4.774537] 0x000000000000-0x000000080000 : "Image Selector"
[    4.789147] 0x000000080000-0x000000100000 : "Image Selector Golden"
[    4.796066] 0x000000100000-0x000000120000 : "Persistent Register"
[    4.802809] 0x000000120000-0x000000140000 : "Persistent Register Backup"
[    4.810148] 0x000000140000-0x000000200000 : "Open_1"
[    4.815782] 0x000000200000-0x000000f00000 : "Image A (FSBL, PMU, ATF, U-Boot)"
[    4.823640] 0x000000f00000-0x000000f80000 : "ImgSel Image A Catch"
[    4.830463] 0x000000f80000-0x000001c80000 : "Image B (FSBL, PMU, ATF, U-Boot)"
[    4.838319] 0x000001c80000-0x000001d00000 : "ImgSel Image B Catch"
[    4.845144] 0x000001d00000-0x000001e00000 : "Open_2"
[    4.850754] 0x000001e00000-0x000002000000 : "Recovery Image"
[    4.857048] 0x000002000000-0x000002200000 : "Recovery Image Backup"
[    4.863955] 0x000002200000-0x000002220000 : "U-Boot storage variables"
[    4.871129] 0x000002220000-0x000002240000 : "U-Boot storage variables backup"
[    4.878914] 0x000002240000-0x000002250000 : "SHA256"
[    4.884515] 0x000002250000-0x000004000000 : "User"
[    4.890484] macb ff0b0000.ethernet: Not enabling partial store and forward
[    4.923258] macb ff0b0000.ethernet eth0: Cadence GEM rev 0x50070106 at 0xff0b0000 irq 38 (00:0a:35:0f:2b:0e)
[    4.934804] macb ff0c0000.ethernet: Not enabling partial store and forward
[    4.978651] xilinx-axipmon ffa00000.perf-monitor: Probed Xilinx APM
[    4.985185] xilinx-axipmon fd0b0000.perf-monitor: Probed Xilinx APM
[    4.991657] xilinx-axipmon fd490000.perf-monitor: Probed Xilinx APM
[    4.998119] xilinx-axipmon ffa10000.perf-monitor: Probed Xilinx APM
[    5.005762] i2c i2c-1: Added multiplexed i2c bus 3
[    5.010658] i2c i2c-1: Added multiplexed i2c bus 4
[    5.015543] i2c i2c-1: Added multiplexed i2c bus 5
[    5.020438] i2c i2c-1: Added multiplexed i2c bus 6
[    5.025225] pca954x 1-0074: registered 4 multiplexed busses for I2C switch pca9546
[    5.033772] at24 1-0050: supply vcc not found, using dummy regulator
[    5.040419] at24 1-0050: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    5.047253] at24 1-0051: supply vcc not found, using dummy regulator
[    5.053888] at24 1-0051: 8192 byte 24c64 EEPROM, writable, 1 bytes/write
[    5.060782] cdns-i2c ff030000.i2c: 400 kHz mmio ff030000 irq 41
[    5.068208] cdns-wdt fd4d0000.watchdog: Xilinx Watchdog Timer with timeout 60s
[    5.075637] cdns-wdt ff150000.watchdog: Xilinx Watchdog Timer with timeout 10s
[    5.085040] macb ff0c0000.ethernet: Not enabling partial store and forward
[    5.091949] macb ff0c0000.ethernet: invalid hw address, using random
[    5.105726] macb ff0c0000.ethernet eth1: Cadence GEM rev 0x50070106 at 0xff0c0000 irq 39 (62:df:cb:04:f0:35)
[    5.139584] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[    5.145083] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 1
[    5.152830] xhci-hcd xhci-hcd.1.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x0000000002010810
[    5.162260] xhci-hcd xhci-hcd.1.auto: irq 55, io mem 0xfe200000
[    5.168380] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[    5.176642] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    5.183864] usb usb1: Product: xHCI Host Controller
[    5.188742] usb usb1: Manufacturer: Linux 5.15.19-xilinx-v2022.1 xhci-hcd
[    5.195525] usb usb1: SerialNumber: xhci-hcd.1.auto
[    5.201842] hub 1-0:1.0: USB hub found
[    5.205599] hub 1-0:1.0: 1 port detected
[    5.209726] xhci-hcd xhci-hcd.1.auto: xHCI Host Controller
[    5.215212] xhci-hcd xhci-hcd.1.auto: new USB bus registered, assigned bus number 2
[    5.222867] xhci-hcd xhci-hcd.1.auto: Host supports USB 3.0 SuperSpeed
[    5.229489] usb usb2: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.15
[    5.237751] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    5.244968] usb usb2: Product: xHCI Host Controller
[    5.249838] usb usb2: Manufacturer: Linux 5.15.19-xilinx-v2022.1 xhci-hcd
[    5.256615] usb usb2: SerialNumber: xhci-hcd.1.auto
[    5.261738] hub 2-0:1.0: USB hub found
[    5.265489] hub 2-0:1.0: 1 port detected
[    5.293395] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[    5.298890] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 3
[    5.306625] xhci-hcd xhci-hcd.2.auto: hcc params 0x0238f625 hci version 0x100 quirks 0x0000000002010810
[    5.316045] xhci-hcd xhci-hcd.2.auto: irq 58, io mem 0xfe300000
[    5.322139] usb usb3: New USB device found, idVendor=1d6b, idProduct=0002, bcdDevice= 5.15
[    5.330397] usb usb3: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    5.337609] usb usb3: Product: xHCI Host Controller
[    5.342478] usb usb3: Manufacturer: Linux 5.15.19-xilinx-v2022.1 xhci-hcd
[    5.349257] usb usb3: SerialNumber: xhci-hcd.2.auto
[    5.354371] hub 3-0:1.0: USB hub found
[    5.358131] hub 3-0:1.0: 1 port detected
[    5.362417] xhci-hcd xhci-hcd.2.auto: xHCI Host Controller
[    5.367902] xhci-hcd xhci-hcd.2.auto: new USB bus registered, assigned bus number 4
[    5.375559] xhci-hcd xhci-hcd.2.auto: Host supports USB 3.0 SuperSpeed
[    5.382201] usb usb4: New USB device found, idVendor=1d6b, idProduct=0003, bcdDevice= 5.15
[    5.390470] usb usb4: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    5.397687] usb usb4: Product: xHCI Host Controller
[    5.402560] usb usb4: Manufacturer: Linux 5.15.19-xilinx-v2022.1 xhci-hcd
[    5.409342] usb usb4: SerialNumber: xhci-hcd.2.auto
[    5.414439] hub 4-0:1.0: USB hub found
[    5.418200] hub 4-0:1.0: 1 port detected
[    5.425195] gpio-keys gpio-keys: Button without keycode
[    5.430425] gpio-keys: probe of gpio-keys failed with error -22
[    5.436425] of_cfs_init
[    5.438886] of_cfs_init: OK
[    5.441818] cfg80211: Loading compiled-in X.509 certificates for regulatory database
[    5.489734] usb 1-1: new high-speed USB device number 2 using xhci-hcd
[    5.567482] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
[    5.574011] clk: Not disabling unused clocks
[    5.578538] ALSA device list:
[    5.581489]   #0: DisplayPort monitor
[    5.585412] platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
[    5.594029] cfg80211: failed to load regulatory.db
[    5.599315] Freeing unused kernel memory: 2176K
[    5.617734] Run /init as init process
[    5.646382] usb 1-1: New USB device found, idVendor=0424, idProduct=2744, bcdDevice= 2.21
[    5.654586] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    5.661760] usb 1-1: Product: USB2744
[    5.665417] usb 1-1: Manufacturer: Microchip Tech
[    5.670242] usb 3-1: new high-speed USB device number 2 using xhci-hcd
[    5.690406] random: python3: uninitialized urandom read (24 bytes read)
[    5.709648] hub 1-1:1.0: USB hub found
[    5.713489] hub 1-1:1.0: 4 ports detected
[    5.773841] usb 2-1: new SuperSpeed USB device number 2 using xhci-hcd
[    5.798119] usb 2-1: New USB device found, idVendor=0424, idProduct=5744, bcdDevice= 2.21
[    5.806315] usb 2-1: New USB device strings: Mfr=2, Product=3, SerialNumber=0
[    5.813462] usb 2-1: Product: USB5744
[    5.817136] usb 2-1: Manufacturer: Microchip Tech
[    5.842360] usb 3-1: New USB device found, idVendor=0424, idProduct=2744, bcdDevice= 2.21
[    5.850549] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    5.857686] usb 3-1: Product: USB2744
[    5.861335] usb 3-1: Manufacturer: Microchip Tech
[    5.885518] hub 2-1:1.0: USB hub found
[    5.889415] hub 2-1:1.0: 3 ports detected
[    5.926323] hub 3-1:1.0: USB hub found
[    5.930150] hub 3-1:1.0: 3 ports detected
[    5.990117] usb 4-1: new SuperSpeed USB device number 2 using xhci-hcd
[    6.014105] usb 4-1: New USB device found, idVendor=0424, idProduct=5744, bcdDevice= 2.21
[    6.022299] usb 4-1: New USB device strings: Mfr=2, Product=3, SerialNumber=0
[    6.029436] usb 4-1: Product: USB5744
[    6.033096] usb 4-1: Manufacturer: Microchip Tech
[    6.065746] usb 1-1.1: new high-speed USB device number 3 using xhci-hcd
[    6.102259] hub 4-1:1.0: USB hub found
[    6.106133] hub 4-1:1.0: 2 ports detected
[    6.175996] usb 1-1.1: New USB device found, idVendor=0424, idProduct=2240, bcdDevice= 1.98
[    6.184347] usb 1-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    6.191655] usb 1-1.1: Product: Ultra Fast Media 
[    6.196347] usb 1-1.1: Manufacturer: Generic
[    6.200609] usb 1-1.1: SerialNumber: 000000225001
[    6.205979] usb-storage 1-1.1:1.0: USB Mass Storage device detected
[    6.212495] scsi host0: usb-storage 1-1.1:1.0
[    6.285694] usb 3-1.3: new high-speed USB device number 3 using xhci-hcd
[    6.293691] usb 1-1.4: new high-speed USB device number 4 using xhci-hcd
[    6.344751] macb ff0c0000.ethernet eth1: PHY [ff0c0000.ethernet-ffffffff:08] driver [TI DP83867] (irq=POLL)
[    6.354507] macb ff0c0000.ethernet eth1: configuring for phy/rgmii-id link mode
[    6.362383] pps pps0: new PPS source ptp0
[    6.366471] macb ff0c0000.ethernet: gem-ptp-timer ptp clock registered.
MAC address for eth1 is updated to 00:0a:35:0f:40:0f
[    6.381114] random: python3: uninitialized urandom read (24 bytes read)
[    6.394442] usb 3-1.3: New USB device found, idVendor=0424, idProduct=2740, bcdDevice= 2.00
[    6.402831] usb 3-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    6.410177] usb 3-1.3: Product: Hub Controller
[    6.414623] usb 3-1.3: Manufacturer: Microchip Tech
[    6.420771] usb 1-1.4: New USB device found, idVendor=0424, idProduct=2740, bcdDevice= 2.00
[    6.429153] usb 1-1.4: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[    6.436473] usb 1-1.4: Product: Hub Controller
[    6.440925] usb 1-1.4: Manufacturer: Microchip Tech
[    6.986246] macb ff0b0000.ethernet eth0: PHY [ff0c0000.ethernet-ffffffff:04] driver [TI DP83867] (irq=POLL)
[    6.996003] macb ff0b0000.ethernet eth0: configuring for phy/sgmii link mode
[    7.003632] pps pps1: new PPS source ptp1
[    7.007717] macb ff0b0000.ethernet: gem-ptp-timer ptp clock registered.
MAC address for eth0 is updated to 00:0a:35:0f:2b:0e
[    7.226496] scsi 0:0:0:0: Direct-Access     Generic  Ultra HS-COMBO   1.98 PQ: 0 ANSI: 0
[    7.235944] sd 0:0:0:0: [sda] 60526592 512-byte logical blocks: (31.0 GB/28.9 GiB)
[    7.244029] sd 0:0:0:0: [sda] Write Protect is off
[    7.249394] sd 0:0:0:0: [sda] No Caching mode page found
[    7.254706] sd 0:0:0:0: [sda] Assuming drive cache: write through
[    7.264511]  sda: sda1 sda2
[    7.269033] sd 0:0:0:0: [sda] Attached SCSI removable disk
root: clean, 70495/524288 files, 420085/1048576 blocks
[    8.660622] EXT4-fs (sda2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: none.
[    9.365845] systemd[1]: System time before build time, advancing clock.
[    9.415775] systemd[1]: systemd 249.7+ running in system mode (+PAM -AUDIT -SELINUX -APPARMOR +IMA -SMACK +SECCOMP -GCRYPT -GNUTLS -OPENSSL +ACL +BLKID -CURL -ELFUTILS -FIDO2 -IDN2 -IDN -IPTC +KMOD -LIBCRYPTSETUP +LIBFDISK -PCRE2 -PWQUALITY -P11KIT -QRENCODE -BZIP2 -LZ4 -XZ -ZLIB +ZSTD +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=hybrid)
[    9.446276] systemd[1]: Detected architecture arm64.

Welcome to PetaLinux 2022.1_update1_05131710 (honister)!

[    9.494722] systemd[1]: Hostname set to <xilinx-kr260-starterkit-20221>.
[    9.516075] random: systemd: uninitialized urandom read (16 bytes read)
[    9.522708] systemd[1]: Initializing machine ID from random generator.
[    9.653879] systemd-sysv-generator[521]: SysV service '/etc/init.d/save-rtc.sh' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.688215] systemd-sysv-generator[521]: SysV service '/etc/init.d/inetd.busybox' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.712920] systemd-sysv-generator[521]: SysV service '/etc/init.d/umountfs' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.737804] systemd-sysv-generator[521]: SysV service '/etc/init.d/dropbear' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.761834] systemd-sysv-generator[521]: SysV service '/etc/init.d/reboot' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.785608] systemd-sysv-generator[521]: SysV service '/etc/init.d/watchdog-init' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.812075] systemd-sysv-generator[521]: SysV service '/etc/init.d/halt' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.835824] systemd-sysv-generator[521]: SysV service '/etc/init.d/umountnfs.sh' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.862834] systemd-sysv-generator[521]: SysV service '/etc/init.d/single' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.886590] systemd-sysv-generator[521]: SysV service '/etc/init.d/urandom' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[    9.912931] systemd-sysv-generator[521]: SysV service '/etc/init.d/sendsigs' lacks a native systemd unit file. Automatically generating a unit file for compatibility. Please update package to include a native systemd unit file, in order to make it more safe and robust.
[   10.073989] macb ff0b0000.ethernet eth0: unable to generate target frequency: 125000000 Hz
[   10.083372] macb ff0b0000.ethernet eth0: Link is Up - 1Gbps/Full - flow control off
[   10.091065] IPv6: ADDRCONF(NETDEV_CHANGE): eth0: link becomes ready
[   10.294702] systemd[1]: Queued start job for default target Graphical Interface.
[   10.303027] random: systemd: uninitialized urandom read (16 bytes read)
[   10.337614] systemd[1]: Created slice Slice /system/getty.
[  OK  ] Created slice Slice /system/getty.
[   10.357870] random: systemd: uninitialized urandom read (16 bytes read)
[   10.365745] systemd[1]: Created slice Slice /system/modprobe.
[  OK  ] Created slice Slice /system/modprobe.
[   10.386945] systemd[1]: Created slice Slice /system/serial-getty.
[  OK  ] Created slice Slice /system/serial-getty.
[   10.410720] systemd[1]: Created slice User and Session Slice.
[  OK  ] Created slice User and Session Slice.
[   10.433949] systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Dispatch Password …ts to Console Directory Watch.
[   10.457878] systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[  OK  ] Started Forward Password R…uests to Wall Directory Watch.
[   10.482012] systemd[1]: Reached target Path Units.
[  OK  ] Reached target Path Units.
[   10.497796] systemd[1]: Reached target Remote File Systems.
[  OK  ] Reached target Remote File Systems.
[   10.517784] systemd[1]: Reached target Slice Units.
[  OK  ] Reached target Slice Units.
[   10.533796] systemd[1]: Reached target Swaps.
[  OK  ] Reached target Swaps.
[   10.551213] systemd[1]: Listening on RPCbind Server Activation Socket.
[  OK  ] Listening on RPCbind Server Activation Socket.
[   10.573781] systemd[1]: Reached target RPC Port Mapper.
[  OK  ] Reached target RPC Port Mapper.
[   10.594007] systemd[1]: Listening on Syslog Socket.
[  OK  ] Listening on Syslog Socket.
[   10.609899] systemd[1]: Listening on initctl Compatibility Named Pipe.
[  OK  ] Listening on initctl Compatibility Named Pipe.
[   10.634213] systemd[1]: Listening on Journal Audit Socket.
[  OK  ] Listening on Journal Audit Socket.
[   10.653957] systemd[1]: Listening on Journal Socket (/dev/log).
[  OK  ] Listening on Journal Socket (/dev/log).
[   10.674044] systemd[1]: Listening on Journal Socket.
[  OK  ] Listening on Journal Socket.
[   10.690189] systemd[1]: Listening on Network Service Netlink Socket.
[  OK  ] Listening on Network Service Netlink Socket.
[   10.714940] systemd[1]: Listening on udev Control Socket.
[  OK  ] Listening on udev Control Socket.
[   10.737987] systemd[1]: Listening on udev Kernel Socket.
[  OK  ] Listening on udev Kernel Socket.
[   10.757981] systemd[1]: Listening on User Database Manager Socket.
[  OK  ] Listening on User Database Manager Socket.
[   10.784181] systemd[1]: Mounting Huge Pages File System...
         Mounting Huge Pages File System...
[   10.804251] systemd[1]: Mounting POSIX Message Queue File System...
         Mounting POSIX Message Queue File System...
[   10.828313] systemd[1]: Mounting Kernel Debug File System...
         Mounting Kernel Debug File System...
[   10.846086] systemd[1]: Condition check resulted in Kernel Trace File System being skipped.
[   10.858140] systemd[1]: Mounting Temporary Directory /tmp...
         Mounting Temporary Directory /tmp...
[   10.875471] systemd[1]: Condition check resulted in Create List of Static Device Nodes being skipped.
[   10.887616] systemd[1]: Starting Load Kernel Module configfs...
         Starting Load Kernel Module configfs...
[   10.908855] systemd[1]: Starting Load Kernel Module drm...
         Starting Load Kernel Module drm...
[   10.928619] systemd[1]: Starting Load Kernel Module fuse...
         Starting Load Kernel Module fuse...
[   10.948648] systemd[1]: Starting RPC Bind...
         Starting RPC Bind...
[   10.961951] systemd[1]: Condition check resulted in File System Check on Root Device being skipped.
[   10.989649] systemd[1]: Starting Load Kernel Modules...
         Starting Load Kernel Modules...
[   11.008549] systemd[1]: Starting Remount Root and Kernel File Systems...
         Starting Remount Root and Kernel File Systems...
[   11.029655] EXT4-fs (sda2): re-mounted. Opts: (null). Quota mode: none.
[   11.038909] dmaproxy: loading out-of-tree module taints kernel.
[   11.048613] systemd[1]: Starting Coldplug All udev Devices...
         Starting Coldplug All udev Devices...
[   11.075737] systemd[1]: Mounted Huge Pages File System.
[  OK  ] Mounted Huge Pages File System.
[   11.098218] systemd[1]: Started RPC Bind.
[  OK  ] Started RPC Bind.
[   11.114255] systemd[1]: Mounted POSIX Message Queue File System.
[  OK  ] Mounted POSIX Message Queue File System.
[   11.138113] systemd[1]: Mounted Kernel Debug File System.
[  OK  ] Mounted Kernel Debug File System.
[   11.158128] systemd[1]: Mounted Temporary Directory /tmp.
[  OK  ] Mounted Temporary Directory /tmp[   11.168793] random: crng init done
[   11.173114] random: 5 urandom warning(s) missed due to ratelimiting
.
[   11.194773] systemd[1]: modprobe@configfs.service: Deactivated successfully.
[   11.203042] systemd[1]: Finished Load Kernel Module configfs.
[  OK  ] Finished Load Kernel Module configfs.
[   11.226703] systemd[1]: modprobe@drm.service: Deactivated successfully.
[   11.234546] systemd[1]: Finished Load Kernel Module drm.
[  OK  ] Finished Load Kernel Module drm.
[   11.258640] systemd[1]: modprobe@fuse.service: Deactivated successfully.
[   11.266745] systemd[1]: Finished Load Kernel Module fuse.
[  OK  ] Finished Load Kernel Module fuse.
[   11.291500] systemd[1]: Finished Load Kernel Modules.
[  OK  ] Finished Load Kernel Modules.
[   11.307091] systemd[1]: Finished Remount Root and Kernel File Systems.
[  OK  ] Finished Remount Root and Kernel File Systems.
[   11.334310] systemd[1]: Mounting NFSD configuration filesystem...
         Mounting NFSD configuration filesystem...
[   11.354188] systemd[1]: Condition check resulted in FUSE Control File System being skipped.
[   11.365202] systemd[1]: Mounting Kernel Configuration File System...
         Mounting Kernel Configuration File System...
[   11.387986] systemd[1]: Condition check resulted in Rebuild Hardware Database being skipped.
[   11.396750] systemd[1]: Condition check resulted in Platform Persistent Storage Archival being skipped.
[   11.409060] systemd[1]: Starting Apply Kernel Variables...
         Starting Apply Kernel Variables...
         Starting Create System Users...
[   11.451507] systemd[1]: Failed to mount NFSD configuration filesystem.
[FAILED] Failed to mount NFSD configuration filesystem.
See 'systemctl status proc-fs-nfsd.mount' for details.
[DEPEND] Dependency failed for NFS server and services.
[DEPEND] Dependency failed for NFS Mount Daemon.
[  OK  ] Mounted Kernel Configuration File System.
[  OK  ] Finished Apply Kernel Variables.
[  OK  ] Finished Create System Users.
         Starting Create Static Device Nodes in /dev...
[  OK  ] Finished Create Static Device Nodes in /dev.
[  OK  ] Reached target Preparation for Local File Systems.
         Mounting /var/volatile...
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
         Starting Journal Service...
         Starting Rule-based Manage…for Device Events and Files...
[  OK  ] Mounted /var/volatile.
[  OK  ] Finished Coldplug All udev Devices.
         Starting Load/Save Random Seed...
[  OK  ] Finished Load/Save Random Seed.
[  OK  ] Started Journal Service.
         Starting Flush Journal to Persistent Storage...
[  OK  ] Started Rule-based Manager for Device Events and Files.
[  OK  ] Finished Flush Journal to Persistent Storage.
[  OK  ] Reached target Sound Card.
[  OK  ] Found device Ultra_HS-COMBO boot.
[  OK  ] Listening on Load/Save RF …itch Status /dev/rfkill Watch.
         Mounting /boot...
[  OK  ] Mounted /boot.
[  OK  ] Reached target Local File Systems.
         Starting Rebuild Dynamic Linker Cache...
         Starting Create Volatile Files and Directories...
[  OK  ] Finished Create Volatile Files and Directories.
         Starting Run pending postinsts...
         Starting Rebuild Journal Catalog...
         Starting Network Time Synchronization...
         Starting Record System Boot/Shutdown in UTMP...
[  OK  ] Finished Record System Boot/Shutdown in UTMP.
[  OK  ] Finished Rebuild Journal Catalog.
[  OK  ] Started Network Time Synchronization.
[  OK  ] Reached target System Time Set.
[  OK  ] Finished Rebuild Dynamic Linker Cache.
         Starting Update is Completed...
[  OK  ] Finished Update is Completed.
[  OK  ] Finished Run pending postinsts.
[  OK  ] Reached target System Initialization.
[  OK  ] Started Daily rotation of log files.
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Reached target Timer Units.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Listening on dropbear.socket.
[  OK  ] Reached target Socket Units.
[  OK  ] Reached target Basic System.
[  OK  ] Started archconfig.
[  OK  ] Started Job spooling tools.
[  OK  ] Started Periodic Command Scheduler.
[  OK  ] Started D-Bus System Message Bus.
[  OK  ] Started dfx-mgrd Dynamic Function eXchange.
[  OK  ] Started Start fan control, if configured.
         Starting inetd.busybox.service...
         Starting IPv6 Packet Filtering Framework...
         Starting IPv4 Packet Filtering Framework...
[  OK  ] Started System Logging Service.
         Starting User Login Management...
[  OK  ] Started Xserver startup without a display manager.
[  OK  ] Finished IPv6 Packet Filtering Framework.
[  OK  ] Finished IPv4 Packet Filtering Framework.
[  OK  ] Reached target Preparation for Network.
Nov 19 09:19:17 xilinx-kr260-starterkit-20221 kernel: GIC: Adjusting CPU interface base to 0x00000000f902f000
         Starting Network Configuration...
Nov 19 09:19:19 xilinx-kr260-starterkit-20221 kernel: armv8-pmu pmu: hw perfevents: no interrupt-affinity property, guessing.
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: cacheinfo: Unable to detect cache hierarchy for CPU 0
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: mtdoops: mtd device (mtddev=name/number) must be supplied
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1271
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1273
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1281
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1283
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1285
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1801
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1805
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1807
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1831
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1835
Nov 19 09:19:20 xilinx-kr260-starterkit-20221 kernel: SPI driver wl1271_spi has no spi_device_id for ti,wl1837
Nov 19 09:19:21 xilinx-kr260-starterkit-20221 kernel: zynqmp_pll_disable() clock disable failed for dpll_int, ret = -13
Nov 19 09:19:21 xilinx-kr260-starterkit-20221 kernel: OF: graph: no port node found in /axi/display@fd4a0000
Nov 19 09:19:21 xilinx-kr260-starterkit-20221 kernel: tpm tpm0: A TPM error (256) occurred attempting the self test
Nov 19 09:19:22 xilinx-kr260-starterkit-20221 kernel: at24 1-0050: supply vcc not found, using dummy regulator
Nov 19 09:19:22 xilinx-kr260-starterkit-20221 kernel: at24 1-0051: supply vcc not found, using dummy regulator
Nov 19 09:19:22 xilinx-kr260-starterkit-20221 kernel: gpio-keys gpio-keys: Button without keycode
Nov 19 09:19:22 xilinx-kr260-starterkit-20221 kernel: gpio-keys: probe of gpio-keys failed with error -22
Nov 19 09:19:22 xilinx-kr260-starterkit-20221 kernel: clk: Not disabling unused clocks
Nov 19 09:19:22 xilinx-kr260-starterkit-20221 kernel: platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
Nov 19 09:19:24 xilinx-kr260-starterkit-20221 kernel: sd 0:0:0:0: [sda] No Caching mode page found
Nov 19 09:19:24 xilinx-kr260-starterkit-20221 kernel: sd 0:0:0:0: [sda] Assuming drive cache: write through
Nov 19 09:19:27 xilinx-kr260-starterkit-20221 kernel: macb ff0b0000.ethernet eth0: unable to generate target frequency: 125000000 Hz
Nov 19 09:19:28 xilinx-kr260-starterkit-20221 kernel: dmaproxy: loading out-of-tree module taints kernel.
[  OK  ] Started inetd.busybox.service.
[  OK  ] Started User Login Management.
[  OK  ] Started Network Configuration.
         Starting Wait for Network to be Configured...
         Starting Network Name Resolution...
[  OK  ] Finished Wait for Network to be Configured.
Nov 19 09:19:37 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/firmware-name
Nov 19 09:19:37 xilinx-kr260-starterkit-20221 kernel: OF: overlay: WARNING: memory leak will occur if overlay removed, property: /fpga-full/resets
[  OK  ] Started Network Name Resolution.
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.
[  OK  ] Reached target Host and Network Name Lookups.
         Starting DNS forwarder and DHCP server...
[  OK  ] Started NFS status monitor for NFSv2/3 locking..
[  OK  ] Started Respond to IPv6 Node Information Queries.
         Starting Network Time Service...
[  OK  ] Started Network Router Discovery Daemon.
[  OK  ] Started som-dashboard-init.
         Starting Permit User Sessions...
         Starting Target Communication Framework agent...
[  OK  ] Finished Permit User Sessions.
[  OK  ] Started Getty on tty1.
[  OK  ] Started Serial Getty on ttyPS1.
[  OK  ] Reached target Login Prompts.
[  OK  ] Started DNS forwarder and DHCP server.
[  OK  ] Started Target Communication Framework agent.
[  OK  ] Started Network Time Service.
[  OK  ] Reached target Multi-User System.
[  OK  ] Reached target Graphical Interface.
         Starting Record Runlevel Change in UTMP...
[  OK  ] Finished Record Runlevel Change in U[   20.952411] som-dashboard.sh[1261]: SOM Dashboard will be running at http://192.168.3.28:5006/som-dashboard

PetaLinux 2022.1_update1_05131710 xilinx-kr260-starterkit-20221 ttyPS1

xilinx-kr260-starterkit-20221 login: [   30.112846] som-dashboard.sh[1292]: 2021-11-19 09:19:48,877 Starting Bokeh server version 2.4.2 (running on Tornado 6.1)
[   30.120355] som-dashboard.sh[1292]: 2021-11-19 09:19:48,885 User authentication hooks NOT provided (default user enabled)
[   30.144658] som-dashboard.sh[1292]: 2021-11-19 09:19:48,910 Bokeh app running at: http://localhost:5006/som-dashboard
[   30.144998] som-dashboard.sh[1292]: 2021-11-19 09:19:48,910 Starting Bokeh server with process id: 1292

  1. 2023年04月14日 04:33 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する6

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する5”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、Petalinux 2022.1 を使用して、petalinux-create で、Petalinux 2022.1 プロジェクトを作成し、petalinux-config を行い、petalinux-build でビルドしたところ成功した。今回は、sdk.sh を作成し、BOOT.BIN を作成した。最後に MicroSD カードのイメージを作成し、MicroSD カードに書き込んだ。

KR260 で Vitis アクセラレーション・プラットフォームを作成する5”を参照している。

Sysroot(SDK)をビルドする。
petalinux-build --sdk
kr260_cam_disp_56_230412.png

sdk.sh が生成された。
kr260_cam_disp_57_230412.png

BOOT.BIN を生成する。
petalinux-package --boot --u-boot --force
kr260_cam_disp_58_230412.png

BOOT.BIN が生成された。
kr260_cam_disp_59_230412.png

MicroSD カード用の WIC イメージを生成する。
petalinux-package --wic --images-dir images/linux/ --bootfiles "ramdisk.cpio.gz.u-boot,boot.scr,Image,system.dtb,system-zynqmp-sck-kr-g-revB.dtb" --disk-name "sda"
kr260_cam_disp_60_230412.png

petalinux-sdimage.wic が生成された。
kr260_cam_disp_61_230412.png

balenaEtcher を使用して MicroSD カードに作成したイメージを書き込む。
kr260_cam_disp_62_230412.png

petalinux-sdimage.wic を MicroSD カードに書き込んだ。

書き込み後に MicroSD カードに boot パーティションと root パーティションが生成された。
kr260_cam_disp_63_230412.png

kr260_cam_disp_64_230412.png
  1. 2023年04月13日 03:49 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する5

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する4”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、前々回のエラーはカメラ・インターフェース信号を制約していかなかったことが原因なので、その制約を追加して、Generate Bitstream したところ、place_desin_ERROR になってしまった。pclk のクロック制約を追加して、やっと、論理合成、インプリメンテーション、ビットストリームの生成が成功した。その後、プラットホームをエクスポートした。今回は、Petalinux 2022.1 を使用して、petalinux-create で、Petalinux 2022.1 プロジェクトを作成し、petalinux-config を行い、petalinux-build でビルドしたところ成功した。

今回のブログは、”KR260 で Vitis アクセラレーション・プラットフォームを作成する4”と”KR260 の kr260_custom アクセラレーション・プラットホームにいろいろな IP を追加する6”を参照している。

PetaLinux eSDK のアップグレードは適用済みだ。
アップグレードをしていない場合は、次のコマンドを実行する。
petalinux-upgrade -u http://petalinux.xilinx.com/sswreleases/rel-v2022/sdkupdate/2022.1_update1/ -p "aarch64" --wget-args "--wait 1 -nH --cut-dirs=4"

KR260 BSP 2022.1 版はダウンロード済みだ。
xilinx-kr260-starterkit-v2022.1-05140151.bsp がKR260 ディレクトリ上にある。

Petalinux 2022.1 の linux_os プロジェクトを作成する。
現在のディレクトリ階層は KR260/kr260_cam_disp_platlform だ。
cd /media/masaaki/Ubuntu_Disk/KR260/kr260_cam_disp_platform/
petalinux-create --type project -s ../xilinx-kr260-starterkit-v2022.1-05140151.bsp --name linux_os
cd linux_os

kr260_cam_disp_45_230411.png

Vivado からエクスポートした XSA ファイルをインポートする。
petalinux-config --get-hw-description ../kr260_cam_disp

FPGA Manager -> Fpga Manager に * を付けた。
kr260_cam_disp_46_230411.png

ルート ファイルシステム タイプ(Image Packaging Configuration -> Root Filesystem Type -> INITRD)は INITRD に設定されていた。
Image Packaging Configuration -> INITRAMFS/INITRD Image name -> petalinux-initramfs-image はすでに設定されていた。
Image Packaging Configuration -> Copy final images to tftpboot の * を外した。
kr260_cam_disp_47_230411.png

kr260_cam_disp_48_230411.png

Linux からの回路制御(PetaLinux版)”を参考にして、Linux カーネルに UIO ドライバをロードする。
petalinux-config -c kernel
Device Drivers -> Usespace I/O drivers を選んでクリックし、スペース・キーを押して、Userspace I/O platform driver with generic IRQ hangling を M から * にした。
Device Drivers -> Usespace I/O drivers を選んでクリックし、スペース・キーを押して、Userspace platform driver with generic irq and dynamic memory を M から * にした。
kr260_cam_disp_49_230411.png

kr260_cam_disp_50_230411.png

KR260/kr260_cam_disp_platform/linux_os/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi を編集して、

uio_pdrv_genirq.of_id=generic-uio

を追加した。
kr260_cam_disp_51_230411.png

kr260_cam_disp_52_230411.png

ROOT FS の設定
petalinux-config -c rootfs

最初に、Filesystem Packages -> console -> utils -> git -> git を有効にした。
以下のパッケージとパッケージ・グループを有効にした。

Filesystem Packages -> base -> dnf -> dnf
Filesystem Packages -> x11 -> base -> libdrm -> libdrm
Filesystem Packages -> x11 -> base -> libdrm -> libdrm-tests
Filesystem Packages -> x11 -> base -> libdrm -> libdrm-kms
Filesystem Packages -> libs -> xrt -> xrt
Filesystem Packages -> libs -> xrt -> xrt-dev
Filesystem Packages -> libs -> zocl -> zocl
Filesystem Packages -> libs -> opencl-headers -> opencl-headers
Filesystem Packages -> libs -> opencl-clhpp -> opencl-clhpp-dev
Petaliunx Package Groups -> packagegroup-petalinux -> packagegroup-petalinux
Petaliunx Package Groups -> packagegroup-petalinux-gstreamer -> packagegroup-petalinux-gstreamer
Petaliunx Package Groups -> packagegroup-petalinux-x11 -> packagegroup-petalinux-x11
Petaliunx Package Groups -> packagegroup-petalinux-opencv -> packagegroup-petalinux-opencv
Petaliunx Package Groups -> packagegroup-petalinux-opencv -> packagegroup-petalinux-opencv-dev
Petaliunx Package Groups -> packagegroup-petalinux-v4lutils -> packagegroup-petalinux-v4lutils


kr260_cam_disp_53_230411.png

ビルドを行って成功した。
petalinux-build
kr260_cam_disp_54_230411.png

linux_os/images/linux ディレクトリの様子を示す。
kr260_cam_disp_55_230411.png
  1. 2023年04月12日 04:21 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する4

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する3”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、Platform ウインドウを設定し、kr260_bd の HDL Wrapper file を作成して、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、論理合成でエラーになった。mt9d111_inf_axis IP と axis2video_out IP 内の pixel_fifo を作り直して、論理合成してもエラーになってしまった。mt9d111_inf_axis IP の pixel_fifo を削除して、cam_pixel_fifo に名前を変更したら論理合成が通った。しかし、write_bitstream でエラーになってしまった。今回は、前回のエラーはカメラ・インターフェース信号を制約していかなかったことが原因なので、その制約を追加して、Generate Bitstream したところ、place_desin_ERROR になってしまった。pclk のクロック制約を追加して、やっと、論理合成、インプリメンテーション、ビットストリームの生成が成功した。その後、プラットホームをエクスポートした。

秋月電子カメラモジュールOV5642を使う1”と”KR260 の PMOD ピン番号表”を元に、OV5642 と KR260 のPMOD ビン番号対応表を作成した。
kr260_cam_disp_44_230410.png

Vivado 2022.1 の kr260_cam_disp プロジェクトで Flow Navigator の Open Synthesized Design をクリックした。
Synthesized Design が開いた。
kr260_cam_disp_45_230410.png

Window メニューから I/O Ports を選択した。
I/O Ports ウインドウが開いた。
OV5642 と KR260 のPMOD ビン番号対応表を元に制約を追加した。
kr260_cam_disp_46_230410.png

制約を制約ファイルの kr260_cam_disp.xdc に追加で書き込んだ。
Synthesized Design を閉じた。
kr260_cam_disp.xdc を示す。
kr260_cam_disp_47_230410.png

論理合成、インプリメンテーション、ビットストリームの生成を行ったが、place_desin_ERROR になってしまった。
pclk は OV5642 からのデータのクロックだが、これをクロック専用ピンに割り当てていないというエラーだった。その場合には、CLOCK_DEDICATED_ROUTE FALSE 制約を追加する必要がある。
kr260_cam_disp_48_230410.png

[Place 30-675] Sub-optimal placement for a global clock-capable IO pin and BUFG pair.If this sub optimal condition is acceptable for this design, you may use the CLOCK_DEDICATED_ROUTE constraint in the .xdc file to demote this message to a WARNING. However, the use of this override is highly discouraged. These examples can be used directly in the .xdc file to override this clock rule.
    < set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF_inst/O] >

    pclk_IBUF_inst/IBUFCTRL_INST (IBUFCTRL.O) is locked to IOB_X0Y7
     pclk_IBUF_BUFG_inst (BUFGCE.I) is provisionally placed by clockplacer on BUFGCE_X0Y1

    The above error could possibly be related to other connected instances. Following is a list of 
    all the related clock rules and their respective instances.

    Clock Rule: rule_bufgce_bufg_conflict
    Status: PASS 
    Rule Description: Only one of the 2 available sites (BUFGCE or BUFGCE_DIV/BUFGCTRL) in a pair can be
    used at the same time
     and pclk_IBUF_BUFG_inst (BUFGCE.O) is provisionally placed by clockplacer on BUFGCE_X0Y1


kr260_cam_disp.xdc の最後に

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF_inst/O] 

を追加した。
kr260_cam_disp_49_230410.png
kr260_cam_disp.xdc を示す。

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]

#Fan Speed Enable
set_property PACKAGE_PIN A12 [get_ports {fan_enb_b[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {fan_enb_b[0]}]
set_property SLEW SLOW [get_ports {fan_enb_b[0]}]
set_property DRIVE 4 [get_ports {fan_enb_b[0]}]

set_property IOSTANDARD LVCMOS33 [get_ports pclk]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {cam_data[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports href]
set_property IOSTANDARD LVCMOS33 [get_ports iic_rtl_scl_io]
set_property IOSTANDARD LVCMOS33 [get_ports iic_rtl_sda_io]
set_property IOSTANDARD LVCMOS33 [get_ports standby]
set_property IOSTANDARD LVCMOS33 [get_ports vsync]
set_property IOSTANDARD LVCMOS33 [get_ports xck]
set_property PACKAGE_PIN AF10 [get_ports pclk]
set_property PACKAGE_PIN AE12 [get_ports {cam_data[7]}]
set_property PACKAGE_PIN AF11 [get_ports {cam_data[6]}]
set_property PACKAGE_PIN AF12 [get_ports {cam_data[5]}]
set_property PACKAGE_PIN AG11 [get_ports {cam_data[4]}]
set_property PACKAGE_PIN AG10 [get_ports {cam_data[3]}]
set_property PACKAGE_PIN AH12 [get_ports {cam_data[2]}]
set_property PACKAGE_PIN AH10 [get_ports {cam_data[1]}]
set_property PACKAGE_PIN AH11 [get_ports {cam_data[0]}]
set_property PACKAGE_PIN AD10 [get_ports href]
set_property PACKAGE_PIN AC12 [get_ports iic_rtl_scl_io]
set_property PACKAGE_PIN AD11 [get_ports iic_rtl_sda_io]
set_property PACKAGE_PIN AE10 [get_ports standby]
set_property PACKAGE_PIN AD12 [get_ports vsync]
set_property PACKAGE_PIN AA10 [get_ports xck]

set_property CLOCK_DEDICATED_ROUTE FALSE [get_nets pclk_IBUF_inst/O]


これで論理合成、インプリメンテーション、ビットストリームの生成を行ったところ、やっと成功した。嬉しい。。。
Project Summary を示す。
kr260_cam_disp_50_230410.png

ハードウェアをエクスポートして、XSA ファイルを生成する。
File メニューから Export -> Export Platform... を選択する。
Export Hardware Platform ダイアログが開く。
Next > ボタンをクリックする。

Platform Type 画面では、Hardware ラジオボタン(デフォルト設定)をクリックする。
Next > ボタンをクリックする。
kr260_cam_disp_51_230410.png

Platform State 画面では、Include bitstream のチェック・ボックスにチェックを入れた。
Next > ボタンをクリックする。
kr260_cam_disp_52_230410.png

Platform Properties 画面では、Name に kr260_cam_disp_platform と入力した。
Next > ボタンをクリックする。
kr260_cam_disp_53_230410.png

Output File 画面では、XSA file name に kr260_cam_dispと入力した。
Next > ボタンをクリックする。
kr260_cam_disp_54_230410.png

サーマリ画面が表示された。
Finish ボタンをクリックした。
kr260_cam_disp_55_230410.png

kr260_cam_disp.xsa ファイルが生成された。
kr260_cam_disp_56_230410.png
  1. 2023年04月11日 04:25 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する3

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する2”の続き。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、kr260_bd ブロック・デザインの Diagram を完成させた。今回は、Platform ウインドウを設定し、kr260_bd の HDL Wrapper file を作成して、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、論理合成でエラーになった。mt9d111_inf_axis IP と axis2video_out IP 内の pixel_fifo を作り直して、論理合成してもエラーになってしまった。mt9d111_inf_axis IP の pixel_fifo を削除して、cam_pixel_fifo に名前を変更したら論理合成が通った。しかし、write_bitstream でエラーになってしまった。

KR260 で Vitis アクセラレーション・プラットフォームを作成する3”を参照して進めていく。

Platform Setup ウインドウが開いて無ければ、Window メニューから Platform Setup を選択して開く。
Settings から AXI Port をクリックする。
zynq_ultra_ps_e_0 の M_AXI_HPM0_FPD と M_AXI_HPM1_FPD をイネーブルする。
Memport は M_AXI_GP で、 SP Tag は空とする。デフォルトのままとする。

zynq_ultra_ps_e_0 の以下の AXI インターフェースをイネーブルする。
S_AXI_HPC1_FPD, S_AXI_HP0_FPD, S_AXI_HP1_FPD, S_AXI_HP2_FPD, S_AXI_HP3_FPD

S_AXI_HPC0_FPD の Memport を S_AXI_HP に変更する。
SP Tag に HPC1, HP0, HP1, HP2, HP3 を入力する。
kr260_cam_disp_25_230409.png

Settings から Clock をクリックする。
clk_out1, clk_out2, clk_out3 の Enable チェックボックスをクリックする。

IDを
clk_out1 を 0 に
clk_out2 を 1 に
clk_out3 を 2 に設定する。

clk_ou2 の Is Default ラジオボタンをクリックして選択する。
kr260_cam_disp_26_230409.png

Settings から Interrupt をクリックする。
axi_intc_0 の intr のチェックボックスにチェックを入れた。
kr260_cam_disp_27_230409.png

インクリメンタル合成を無効にする
Tools メニューから Settings... を選択する。
Settings ダイアログが開く。
Project Settings から Synthesis をクリックして、選択する。
Settings の Incremental synthesis の ... ボタンをクリックする。
KR260_46_230121.png

Disable incremental synthesis ラジオボタンをクリックする。
KR260_47_230121.png

Settings ダイアログの Incremental synthesis に Not set が表示された。
OK ボタンをクリックする。
KR260_48_230121.png

ブロック・デザインの生成を行う。
Vivado の Project Navigator の Generate Block Design をクリックする。
Generate Output Products ダイアログが表示された。
Synthesis Options の Global ラジオボタンをクリックする。
Generate ボタンをクリックする。
KR260_52_230121.png

HDL ラッパーを生成する。
Source ウインドウをクリックして、ブロック・デザインの kr260_bd_i を右クリックし、Create HDL Wrapper... を選択して、HDL ラッパー・ファイルの kr260_bd_wrapper.v を生成した。
kr260_cam_disp_28_230409.png

Vivado の Project Navigator の Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、論理合成でエラーになった。
kr260_cam_disp_29_230409.png

mt9d111_inf_axis_0 の pixel_fifo の IP でエラーになっている。
pixel_fifo を見てみる。
kr260_cam_disp_30_230409.png

pixel_fifo は Xilinx 社の FIFO Generator で作成されているので、Vivado 2019.1 で作られているので、作り直してみよう。
camera 階層モジュールを開いて、mt9d111_inf_axis_0 を右クリックし、右クリックメニューから Edit in IP Packeger を選択して、IP を編集する。
kr260_cam_disp_31_230409.png

Edit in IP Packeger ダイアログが開く。
OK ボタンをクリックした。
kr260_cam_disp_32_230409.png

pfifo : pixel_fifo を削除して、”パラレル入出力カメラ用 AXI4-Stream 出力 IP の作成”の pixel_fifo 作成手順従って、FIFO Generator で pixel_fifo を生成した。
kr260_cam_disp_33_230409.png

Package IP タブをクリックして移動した。チェックの付いていない項目はその項目をクリックして、対処した後で、Re-Package IP ボタンをクリックし、IP を再生した。
kr260_cam_disp_34_230409.png

これで mt9d111_inf_axis IP が再生された。
kr260_cam_disp プロジェクトに戻ると IP Status ウインドウの /camera/mt9d111_inf_axis_0 が変更されているという表示なっているので、Upgrade Selected ボタンをクリックして、/camera/mt9d111_inf_axis_0 を更新した。
kr260_cam_disp_35_230409.png

Upgrade IP ダイアログが表示された。
kr260_cam_disp_36_230409.png

Generate Output Products ダイアログが表示された。
Generate ボタンをクリックした。
kr260_cam_disp_37_230409.png

現在の kr260_cam_disp プロジェクトを示す。
kr260_cam_disp_38_230409.png

もう一度、Vivado の Project Navigator の Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、論理合成でエラーになった。
よく見てみると display 階層モジュールの axis2video_out_0 の中にも pixel_fifo があるようだ。

display 階層モジュールを開いて、axis2video_out_0 を右クリックし、右クリックメニューから Edit in IP Packeger を選択して、IP を編集する。

Edit in IP Packeger ダイアログが開く。
OK ボタンをクリックした。

pfifo : pixel_fifo を削除して、”Ultra96のDisplayPortを使用するためのIPを作成する4(pixel_fifo の作成)”の pixel_fifo 作成手順従って、FIFO Generator で pixel_fifo を生成した。
kr260_cam_disp_39_230409.png

Package IP タブをクリックして移動した。チェックの付いていない項目はその項目をクリックして、対処した後で、Re-Package IP ボタンをクリックし、IP を再生した。
kr260_cam_disp_40_230409.png

これで axis2video_out IP が再生された。
kr260_cam_disp プロジェクトに戻ると IP Status ウインドウの /display/axis2video_out_0 が変更されているという表示なっているので、Upgrade Selected ボタンをクリックして、/display/axis2video_out_0 を更新した。
kr260_cam_disp_41_230409.png

Upgrade IP ダイアログが表示された。

Generate Output Products ダイアログが表示された。
Generate ボタンをクリックした。

Vivado の Project Navigator の Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行ったが、同様に論理合成でエラーになった。
もしかしたら、mt9d111_inf_axis IP と axis2video_out IP で同じ pixel_fifo を使っているのがダメなんじゃないだろうか?
ただし、Vivado 2019.2 では論理合成できているので、Vivado 2020.1 から Vivado 2022.1 に間で、同じ名前のファイルを許容しなくなったのだろうか?

ということで、もう一度、camera 階層モジュールを開いて、mt9d111_inf_axis_0 を右クリックし、右クリックメニューから Edit in IP Packeger を選択して、IP を編集する。

pfifo : pixel_fifo を削除して、”パラレル入出力カメラ用 AXI4-Stream 出力 IP の作成”の pixel_fifo 作成手順従って、FIFO Generator で cam_pixel_fifo を生成した。
kr260_cam_disp_42_230409.png

mt9d111_cam_cont.v も pixel_fifo から cam_pixel_fifo を使用するように Verilog コードを書き換えた。つまり、インスタンスする IP の名前を書き換えた。

Package IP タブをクリックして移動した。チェックの付いていない項目はその項目をクリックして、対処した後で、Re-Package IP ボタンをクリックし、IP を再生した。

これで mt9d111_inf_axis IP が再生された。
kr260_cam_disp プロジェクトに戻ると IP Status ウインドウの /camera/mt9d111_inf_axis_0 が変更されているという表示なっているので、Upgrade Selected ボタンをクリックして、/camera/mt9d111_inf_axis_0 を更新した。

Upgrade IP ダイアログが表示された。

Generate Output Products ダイアログが表示された。
Generate ボタンをクリックした。

Vivado の Project Navigator の Generate Bitstream をクリックして、論理合成、インプリメンテーション、ビットストリームの生成を行った。
今度は、論理合成が成功したので、やはり、IP が違っていても中に同じ名前の IP があるとダメなのかも知れない?
しかし、今度は、write_bitstream でエラーになった。
kr260_cam_disp_43_230409.png

今回は、外部入出力ピンの制約が無いのがエラーの原因だ。
  1. 2023年04月10日 05:11 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する2

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する1”の続き。。

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しようということで、前回は、Vivado 2022.1 の kr260_cam_disp プロジェクトと kr260_bd ブロック・デザインを作成し、Zynq UltraScale+ MPSoC IP の設定を行った。今回は、kr260_bd ブロック・デザインの Diagram を完成させた。

今回の作業は”KR260 で Vitis アクセラレーション・プラットフォームを作成する2”を参考にして、行った。

最初に clocking wizard を Add IP した。
clk_wiz_0 の名前でインスタンスされた。ダブルクリックして設定を行った。
clk_out1 を 100 MHz、clk_out2 を 200 MHz、clk_out3 を 400 MHz に設定した。
Reset Type を Active Low に設定した。
KR260_38_230121.png

ブロック・デザインを示す。
kr260_cam_disp_9_230409.png

Processing System Reset を 3 個 Add IP して、配線した。
kr260_cam_disp_10_230409.png

AXI Interrupt Controller を Add IP した。
Interrupt Output Connection を Single に変更した。
KR260_41_230121.png

ブロック・デザインを示す。
kr260_cam_disp_11_230409.png

Run Connection Automation をクリックして、配線を行う。
Run Connection Automation ダイアログが表示された。
axi_intc_0 の s_axi だけをチェックして、OK ボタンをクリックした。
kr260_cam_disp_12_230409.png

エラーが発生した。
Live Video を 1 にしているのがまずいのだろうか?
kr260_cam_disp_13_230409.png

Zynq UltraScale+ MPSoC IP をダブルクリックして、設定を行った。
Page Navigator の PS-PL Configuration をクリックしてGeneral -> Ohters を開き、Live Video を 1 から 0 に変更した。
kr260_cam_disp_14_230409.png

現在のブロック・デザインを示す。
kr260_cam_disp_15_230409.png

もう一度、Run Connection Automation をクリックして、配線を行う。
Run Connection Automation ダイアログが表示された。
axi_intc_0 の s_axi だけをチェックして、OK ボタンをクリックした。200 MHz に接続する必要があるのを忘れていたので、今回は、クロックを clk_wiz_0/clk_out2 に接続する。
kr260_cam_disp_16_230409.png

正常に配線された。
kr260_cam_disp_17_230409.png

axi_intc_0 の irq から zynq_ultra_ps_e_0 の pl_ps_irq[0:0] へ配線を行った。
kr260_cam_disp_18_230409.png

ファン・コントロールを追加
Slice IP をブロック・デザインに Add IP した。
Slice を下の図の用に設定した。
KR260_62_230121.png

Slice の入力 Din[2:0] を zynq_ultra_ps_e_0 の emio_ttc0_wave_o[2:0] に配線した。
Slice の出力 Dout[0:0] を右クリックし右クリックメニューから Make External を選択して外部ピンに接続した。
外部ピンの名前を fan_enb_b[0:0] に設定した。
全体のブロック・デザインを示す。
kr260_cam_disp_19_230409.png

Source ウインドウから Add Source... を選択し、ダイアログで Add or Create Constrains のラジオボタンをクリックして、kr260_cam_disp.xdc を生成した。

kr260_cam_disp.xdc の記述は”Add Peripheral Support to Kria KR260 Vivado 2022.1 Project”から引用したが、外部ピンの名前を fan_en_b から fan_enb_b に変更したので、その部分を変更してある。
kr260_cam_disp_20_230409.png

set_property BITSTREAM.GENERAL.COMPRESS TRUE [current_design]

#Fan Speed Enable
set_property PACKAGE_PIN A12 [get_ports {fan_enb_b}]
set_property IOSTANDARD LVCMOS33 [get_ports {fan_enb_b}]
set_property SLEW SLOW [get_ports {fan_enb_b}]
set_property DRIVE 4 [get_ports {fan_enb_b}]


カメラ画像をDisplayPortに出力する7(ブロックデザインの変更)”を参考にして、kr260_bd ブロック・デザインを完成させた。
AXI IIC、mt9d111_inf_axis IP, vfilp_dma_write2 IP, disp_dmar_axis IP, axis2video_out IP, AXI GPIO を追加して、camera 階層モジュールと display 階層モジュールに分割し、配線を行った。
Zynq UltraScale+ MPSoC IP をダブルクリックして、設定を行って、Page Navigator の PS-PL Configuration をクリックしてGeneral -> Ohters を開き、Live Video を 0 から 1 に変更して、配線を行った。
kr260_cam_disp_21_230409.png

camera 階層モジュールを示す。
AXI IIC はデフォルト設定のままとした。
kr260_cam_disp_22_230409.png

display 階層モジュールを示す。
kr260_cam_disp_23_230409.png

axi_gpio_0 の設定を示す。
kr260_cam_disp_24_230409.png

Validate Design ボタンをクリックして、デザインをチェックした。
Critical Messages ダイアログが表示された。
axi_intc_0/intr 入力に接続がないというワーニングだったが、これは問題ないようだ。
KR260_45_230121.png

kr260_bd ブロック・デザインをセーブした。
  1. 2023年04月09日 07:19 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

KR260 で DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成する1

今までやってきた KR260 の Vitis アクセラレーション・プラットホーム作成を踏まえて、DisplayPort にカメラ画像を出力する Vitis アクセラレーション・プラットホームを作成しよう。

ベースとなる KR260 Vitis アクセラレーション・プラットホームに Ultra96 で使用した”カメラ画像をDisplayPortに出力する7(ブロックデザインの変更)”の回路を追加する。
使用しているカスタム IP はアップデートすることにして、Vivado 2019.1 用だが、そのまま使用することにする。

KR260 で Vitis アクセラレーション・プラットフォームを作成する1”をベースに、”Ultra96のDisplayPortを使用するためのテスト1(Vivado プロジェクトを作成した)”の DisplayPort の Live Video を有効にする。

KR260 ディレクトリの下に kr260_cam_disp_platform ディレクトリを作成した。
kr260_cam_disp_platform ディレクトリの下に Vivado 2022.1 で KR260 用の kr260_cam_disp プロジェクトを作成した。
なお、Project Type 画面で、Project is an extensible Vitis platform にチェックを入れてある。
kr260_cam_disp_1_230408.png

cam_disp_191 ディレクトリの axis2video_out_IP, disp_dmar_axis_IP, mt9d111_inf_axis_IP, vfilp_dma_write_IP を kr260_cam_disp プロジェクトのディレクトリにコピーした。
kr260_cam_disp_2_230408.png

axis2video_out_IP, disp_dmar_axis_IP, mt9d111_inf_axis_IP, vfilp_dma_write_IP を IP Catalog に登録した。
kr260_cam_disp_3_230408.png

Flow Navigator から Create Block Design をクリックして、kr260_bd ブロック・デザインを作成した。
Zynq UltraScale+ MPSoC IP を Add IP した。
Run Block Automation をクリックすると、Run Block Automation ダイアログが表示された。
Apply Board Preset にチェックが入っていることを確認して、OK ボタンをクリックした。

Zynq UltraScale+ MPSoC IP をダブルクリックして、設定を行った。
設定は、”Add Peripheral Support to Kria KR260 Vivado 2022.1 Project”を参照してやっていく。

Zynq UltraScale+ MPSoC IP の設定画面で、I/O Configuration をクリックし、 Low Speed > I/O Peripherals と展開して、I2C 1 にチェックを入れて、MIO 24 .. 25 を指定した。
KR260_26_230119.png

SPI 1 にチェックを入れて、MIO 6 .. 11 を指定した。
KR260_37_230119.png

UART 1 にチェックを入れて、 MIO 36 .. 37 指定した。
KR260_27_230119.png

TTC 0 の Waveout にチェックを入れて、EMIO を指定した。
KR260_28_230119.png

High Speed を展開して、GEM 0 と GEM 1 を有効にしたのだが、GEM 0 はリファレンス・クロックの指定がないと怒られたので、GEM 1 だけとした。GEM 1 は MIO 38 .. 49 を指定した。
KR260_29_230119.png

USB 0 、USB 3.0 にチェックを入れた。
USB 3.0 は GT Lane 2 で USB 0 は MIO 52 .. 63 を指定した。
KR260_30_230119.png

USB 1 、USB 3.0 にチェックを入れた。
USB 3.0 は GT Lane 3 で USB 1 は MIO 64 .. 75 を指定した。
KR260_31_230119.png

USB Reset の設定
Reset Polarity を Active Low に指定した。
USB 0 は MIO 76 を USB 1 は MIO 77 を指定した。
KR260_32_230119.png

Display Port はチェックが入っていたので、Lane Selection を Single Lower に指定した。
KR260_33_230119.png

Page Navigator から PS-PL Configuration をクリックした。
General > Fabric Reset Enable にはチェックが入っていたので、Number of Fabric Resets を 4 に指定した。
KR260_34_230119.png


PS-PL Interfaces の AXI HPM0 FPD と AXI HPM1 FPD のチェックを外して、AXI HPM0 LPD にチェックを入れた。
AXI HPC0 FPD にチェックを入れた。
kr260_cam_disp_4_230408.png

Clock Configuration では、Input Clocks のGT Lane Reference frequency のDisplayPort はRef Clk1 を使用して 27 MHz と設定されていた。
kr260_cam_disp_5_230408.png

Page Navigator の PS-PL Configuration をクリックしてGeneral -> Ohters を開き、Live Video を 0 から 1 に変更する。
kr260_cam_disp_6_230408.png

Page Navigator の Clock Configuration をクリックして、Output Clocks タブをクリックし Low Power Domain Clocks -> PL Fabric Clocks -> PL1 の Requested Freq (MHz) を 24 に設定した。
kr260_cam_disp_8_230408.png

これで、Zynq UltraScale+ MPSoC IP の設定は終了したので、OK ボタンをクリックした。
kr260_cam_disp_7_230408.png
  1. 2023年04月08日 16:35 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

”L3GD20H使用3軸ジャイロセンサーモジュールキット”を使用する2(ジャイロセンサーを動作させる)

”L3GD20H使用3軸ジャイロセンサーモジュールキット”を使用する1(ジャイロセンサーの仕様を検討)”の続き。

秋月電子の”L3GD20H使用3軸ジャイロセンサーモジュールキット”を ZYBO Z7-20 に接続して使用したいということで、前回は、”L3GD20H PDFデータシート”をざっと読んで仕様をまとめてみた。今回は、I2C IP の i2cm_axi4ls IP を使用して、”L3GD20H使用3軸ジャイロセンサーモジュールキット”を動作させることができた。

最初に Vivado 2022.2 で ZYBO Z7-20 用の gyro_test プロジェクトを作成した。
gyro_sensor_5_230407.png

i2cm_axi4ls IP を使用して gyro_bd ブロック・デザインを作成した。
gyro_sensor_6_230407.png

processing_system7_0 の FCLK_CLK0 は 100 MHz に設定した。
gyro_sensor_9_230407.png

Address Editor 画面を示す。
gyro_sensor_7_230407.png

論理合成、インプリメンテーション、ビットストリームの生成を行った。
Project Summary を示す。
gyro_sensor_8_230407.png

ハードウェアをエクスポートして、gyro_bd_wrapper.xsa ファイルを生成した。

Vitis 2022.2 を起動して、gyro_test アプリケーション・プロジェクトを作成した。
gyro_test.c を作成して、ビルドを行った。
gyro_sensor_10_230407.png

gyro_test.c を示す。

// gyro_test.c
// 2023/04/05 by marsee
//

#include <stdio.h>
#include <stdint.h>
#include "xil_io.h"
#include "xparameters.h"
#include <unistd.h>
#include "xtime_l.h"

#define I2CM_PRER_LO    XPAR_I2CM_AXI4LS_0_BASEADDR
#define I2CM_PRER_HI    (XPAR_I2CM_AXI4LS_0_BASEADDR+0x4)
#define I2CM_CTR        (XPAR_I2CM_AXI4LS_0_BASEADDR+0x8)
#define I2CM_RXR        (XPAR_I2CM_AXI4LS_0_BASEADDR+0xc)
#define I2CM_TXR        (XPAR_I2CM_AXI4LS_0_BASEADDR+0xc)
#define I2CM_CR         (XPAR_I2CM_AXI4LS_0_BASEADDR+0x10)
#define I2CM_SR         (XPAR_I2CM_AXI4LS_0_BASEADDR+0x10)

#define CR_STA      0x80    // generate (repeated) start condition
#define CR_STO      0x40    // generate stop condition
#define CR_RD       0x20    // read from slave
#define CR_WR       0x10    // write from slave
#define CR_NACK     0x08    //  when a receiver, sent ACK (ACK = ‘0’) or NACK (ACK = ‘1’)
#define CR_IACK     0x01    // Interrupt acknowledge. When set, clears a pending interrupt.

#define SR_RxACK    0x80    // Received acknowledge from slave.This flag represents acknowledge from  the addressed slave.
                            // ‘1’ = No acknowledge received , ‘0’ = Acknowledge received
#define SR_Busy     0x40    // I2C bus busy
                            // ‘1’ after START signal detected , ‘0’ after STOP signal detected
#define SR_AL       0x20    // Arbitration lost. This bit is set when the core lost arbitration. Arbitration is lost when:
                            // * a STOP signal is detected, but non requested , * The master drives SDA high, but SDA is low.
#define SR_TIP      0x02    // Transfer in progress.
                            // ‘1’ when transferring data , ‘0’ when transfer complete
#define SR_IF       0x01    //  Interrupt Flag. This bit is set when an interrupt is pending, which
                            //  will cause a processor interrupt request if the IEN bit is set.
                            //  The Interrupt Flag is set when:
                            // *  one byte transfer has been completed , *  arbitration is lost

//#define DEBUG

void idle_check(){
    while(Xil_In32(I2CM_SR) & SR_TIP); // TIP bit is clear
}
void acc_sensor_write(uint8_t dev_addr, uint8_t waddr, uint8_t wdata){
    dev_addr &= 0xfe;
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)dev_addr);
    Xil_Out32(I2CM_CR, (u32)(CR_STA|CR_WR));
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)waddr);
    Xil_Out32(I2CM_CR, (u32)CR_WR);
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)wdata);
    Xil_Out32(I2CM_CR, (u32)(CR_STO|CR_WR));
    idle_check();
}
uint8_t acc_sensor_read1(uint8_t dev_addr, uint8_t raddr){
    const uint8_t devw_addr = dev_addr & 0xfe;

    dev_addr |= 0x01;
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)devw_addr);
    Xil_Out32(I2CM_CR, (u32)(CR_STA|CR_WR));
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)raddr);
    Xil_Out32(I2CM_CR, (u32)CR_WR);
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)dev_addr);
    Xil_Out32(I2CM_CR, (u32)(CR_STA|CR_WR));
    idle_check();

    Xil_Out32(I2CM_CR, (u32)(CR_STO|CR_RD|CR_NACK));
    idle_check();

    uint8_t rdata8 = (uint8_t)(Xil_In32(I2CM_RXR) & 0xff);
    return(rdata8);
}
void acc_sensor_read2(uint8_t dev_addr, uint8_t raddr, int32_t *rdata){
    uint8_t rdata8a[2];
    const uint8_t devw_addr = dev_addr & 0xfe;

    dev_addr |= 0x01;
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)devw_addr);
    Xil_Out32(I2CM_CR, (u32)(CR_STA|CR_WR));
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)raddr);
    Xil_Out32(I2CM_CR, (u32)CR_WR);
    idle_check();

    Xil_Out32(I2CM_TXR, (u32)dev_addr);
    Xil_Out32(I2CM_CR, (u32)(CR_STA|CR_WR));
    idle_check();

    Xil_Out32(I2CM_CR, (u32)CR_RD);
    idle_check();
    rdata8a[0] = (uint8_t)(Xil_In32(I2CM_RXR) & 0xff);

    Xil_Out32(I2CM_CR, (u32)(CR_STO|CR_RD|CR_NACK));
    idle_check();
    rdata8a[1] = (uint8_t)(Xil_In32(I2CM_RXR) & 0xff);

    *rdata = (int32_t)rdata8a[0] + (((int32_t)rdata8a[1])<<8);
    /*if(*rdata & 0x8000) // Is the 16th bit 1?
        *rdata |= 0xffff0000; // sign extension */
}

void initialize_code(){
    // I2C I2C operating frequency setting 396KHz/100MHz: I2CM_PRER_LO=0x2c
    Xil_Out32(I2CM_PRER_LO, (u32)0x2c);
    Xil_Out32(I2CM_PRER_HI, (u32)0x0);

    Xil_Out32(I2CM_CTR, 0x80); // enable core

    acc_sensor_write(0xd4, 0x20, 0xef);
    // CTRL1(20h) : PD = 8:Normal Mode, Zen = 4 : Z axis enable,
    // Yen = 2 : Y axis enable, Xen = 1 : X axis enable
    // DR = 0xC0 : 11 - 800 Hz, BW = 10 - LPF1 Cut off 211 Hz, LPF2 Cut off -

    acc_sensor_write(0xd4, 0x23, 0x00); // CTRL4(23h) 245 dps
    //acc_sensor_write(0xd4, 0x23, 0x20); // CTRL4(23h) 2000 dps
    //acc_sensor_write(0xd4, 0x39, 0x00); // LOW_ODR(39h) Low_ODR = 0
}

int main(){
    int32_t dataX, dataY, dataZ;
    int32_t dataXL, dataYL, dataZL;
    int32_t dataXH, dataYH, dataZH;
    uint8_t read_data, read_rdy;
    XTime time;
    double time0, timeb;
    double past_time;

    initialize_code();

    XTime_GetTime(&time);
    timeb = (double)((long long int)time)/333333.3435; // ms

    for(int i=0; i<10000; i++){
        do {
            read_data = acc_sensor_read1(0xd5, 0x27); // STATUS(27h) read
            read_rdy = read_data & 0x08; // XYXDA(X, Y, Z -axis new data available) enable?
        }while(read_rdy != 0x08);

        dataXL = acc_sensor_read1(0xd5, 0x28);
        dataXH = acc_sensor_read1(0xd5, 0x29);
        dataX = (dataXH<<8)+dataXL;

        dataYL = acc_sensor_read1(0xd5, 0x2a);
        dataYH = acc_sensor_read1(0xd5, 0x2b);
        dataY = (dataYH<<8)+dataYL;

        dataZL = acc_sensor_read1(0xd5, 0x2c);
        dataZH = acc_sensor_read1(0xd5, 0x2d);
        dataZ = (dataZH<<8)+dataZL;

        XTime_GetTime(&time);
        time0 = (double)((long long int)time)/333333.3435; // ms
        past_time = time0 - timeb;
        timeb = time0;

        printf("X = %x, Y = %x, Z = %x, %lf\n", (int)dataX, (int)dataY, (int)dataZ, past_time);
        usleep(2623);
        //usleep(100000);
    }
    return(0);
}


まずは、”L3GD20H PDFデータシート”の I2C インターフェースの最大動作周波数が 400 KHz だったので、I2C のクロックを 431 KHz から 396 KHz に落とした。

サブルーチンは基本的に加速度センサー用を使用した。

I2C は連続アドレスを連続的に読んでくることができる。gyro_test.c で言うと acc_sensor_read2() 関数がそれにあたるが、これを L3GD20H に使用すると、最初のアドレスのデータを 2 回読んでしまうというバグ?(仕様なのかも?)があった。よって、acc_sensor_read1() 関数を使用して、2 回データを読んでいる。

gyro_test.elf を動作させた結果を示す。

X = 11e, Y = fe13, Z = 219, 3.338460
X = e1, Y = fe70, Z = 241, 3.338502
X = ee, Y = fe20, Z = 213, 3.339000
X = df, Y = fe8d, Z = 245, 3.339000
X = c1, Y = fe62, Z = 11a, 3.338499
X = be, Y = fe7e, Z = 237, 3.339591
X = f3, Y = fe92, Z = 1d8, 3.338910
X = 15, Y = fe55, Z = 248, 3.339000
X = f5, Y = fe5c, Z = 1e9, 3.338598
X = d1, Y = fe72, Z = 248, 3.338502
X = e0, Y = fe7f, Z = 246, 3.338460
X = da, Y = fe40, Z = 268, 3.338100
X = fa, Y = fe5a, Z = 1f1, 3.338550
X = e7, Y = fe72, Z = 237, 3.339000
X = ea, Y = fe6a, Z = 213, 3.338508
X = ce, Y = fe4a, Z = 291, 3.338901
X = e2, Y = fe59, Z = 1dc, 3.338511
X = bd, Y = fea9, Z = 222, 3.340089
X = bd, Y = fe2b, Z = 1e8, 3.338901
X = d0, Y = fe81, Z = 245, 3.338010
X = f5, Y = fe68, Z = 250, 3.339048
X = c8, Y = fe31, Z = 24b, 3.339000
X = d5, Y = fe8b, Z = 21c, 3.338502

  1. 2023年04月07日 04:30 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0

”L3GD20H使用3軸ジャイロセンサーモジュールキット”を使用する1(ジャイロセンサーの仕様を検討)

秋月電子の”L3GD20H使用3軸ジャイロセンサーモジュールキット”を ZYBO Z7-20 に接続して使用したいということで、今回は、”L3GD20H PDFデータシート”をざっと読んでみた。

まずは、ジャイロセンサーの原理を知らなかったので、”いまさら聞けないジャイロセンサー入門"でお勉強した。ふ〜ん、コリオリの力を利用しているんだね。

L3GD20H の使用方法については、”3軸ジャイロセンサーL3GD20Hの使い方(I2C通信/SPI通信)”を参考にさせていただいた。

L3GD20H は I2C と SPI インターフェースに対応した 3 軸ジャイロセンサーで、精度は、±245/±500/±2000 dps を切り替えて使用することができる。

機能を並べて書く。
・ I2C と SPI インターフェースに対応した 3 軸ジャイロセンサー(インターフェースは I2C を使用する)
・ 出力データは 16 ビット長
・ 精度は、±245/±500/±2000 dps
・ 電源電圧は 2.2 V 〜 3.6V (3.3V で使える)
・ データ用FIFO があるけど、バイパスもできる(Bypass mode)
・ ODR(Digital output data rate) を 12.5, 25, 50, 100, 200, 400, 800 Hz に設定可能

ブロック図を示す。
L3GD20H PDFデータシート”から 18 ページの”Figure 6. Block diagram”を引用する。
gyro_sensor_1_230406.png

2 つの LPF と 1 個の HPF がある。
HPF はスルーする予定だ。

まずは、使用する精度は ±245 dps とする。ビット長が 16 ビットなので、1 digit の精度を計算する。
245 ÷ 2 の 15 乗 = 0.007476807 dps/digit

AE-L3GD20H取扱説明書”によると I2C のアドレス 7 ビットは SA0 ピンに電源電圧を入れた時に 0x6B, GND を入れた時は 0x6A だそうだ。8 ビットアドレスに直すと 0xD6 と 0xD4 になる。その内の SA0 ピンに GND を入れた時の 0xD4 アドレスを使用することにする。

I2C インターフェースで読み書きできる設定用やデータのレジスタ・マップを示す。
L3GD20H PDFデータシート”から 34 ページの”Table 17. Register address map”を引用する。
gyro_sensor_2_230406.png

設定の検討を行う。
まずは、CTRL1 (20h) の設定をする。
DR と BW の設定だが、300 Hz 毎にデータを取得したいので、ODR = 400 Hz に設定してみる。その時の Cut-Off 周波数(LPF のカットオフ周波数だと思っている)を一番高い 110 Hz とした。
(2023/04/07 :追記)ODR =800 Hz 、Cut-off 周波数 ー に変更した。DR = 11, BW = 10 に設定した。(BW = 10 - LPF1 Cut off 211 Hz, LPF2 Cut off - )

L3GD20H PDFデータシート”から 37 ページの”Table 21. DR and BW configuration setting”を引用する。
gyro_sensor_3_230406.png

DR = 10, BW = 11 とする。
PD = 1, Zen = 1, Xen = 1, Yen = 1 にすると CTRL1 (20h) の設定値は 0xbf となった。

CTRL4 (23h) は、FS1 〜 FS0 で精度を設定できるが 245 dps の値は 00 でデフォルト値なので設定は必要ない。

LOW_ODR (39h) は”Table 21. DR and BW configuration setting”から Low_ODR = 0 なので、0x00 を設定するのだが、デフォルト値なので、設定する必要はない。(修正済み)

次にデータの取り出し方だ。
ODR で動作周波数を設定できるということは、測定完了のレディ信号を見てからデータを取るのじゃないだろうか?
レディ信号を探すと ZYXDA(X, Y, Z -axis new data available) が STATUS (27h) にある。これが 1 になるのを確認すれば良いのではないだろうか?
L3GD20H PDFデータシート”から 42 ページの”7.9 STATUS (27h)”を引用する。
gyro_sensor_4_230406.png

たぶん 27h を Read して、0x08 でマスクして 0 で無いのを確認すれば良いのではないだろうか?

その後、OUT_X_L (28h), OUT_X_H (29h)、OUT_Y_L (2Ah), OUT_Y_H (2Bh)、OUT_Z_L (2Ch), OUT_Z_H (2Dh)を Read して、OUT_?_L に 8 ビット左シフトした OUT_?_H を加えればデータを取得することができるはず。。。

ST の”L3GD20H 3-axis gyroscope, I2C/SPI digital output, low-power 3-axis angular rate sensor”のページ。
  1. 2023年04月06日 05:05 |
  2. FPGAを使用したシステム
  3. | トラックバック:0
  4. | コメント:0

KR260 を使用した次の課題

KR260 には 4 個の PMOD があるので、これに秋月電子の OV5642 を付けてみたい。
秋月電子の OV5642 は Ultra96 でも使っているので、そのプロジェクトが参考になるはず。
そして、DisplayPort にも出力してみたい。DisplayPort も Ultra96 や KV260 で使用している。

自分のブログを見返しているがブログの量が多すぎで全体像をつかむのが大変だ。まとめて書いておくほうが良いのかも知れない?
その時は覚えていても、もう60歳台真ん中なので、忘れてしまうのだよね。
  1. 2023年04月05日 04:44 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

Vitis アクセラレーション・プラットホームを使用して作ったハードウェアを KR260 の Ubuntu 22.04 で動作させる5

Vitis アクセラレーション・プラットホームを使用して作ったハードウェアを KR260 の Ubuntu 22.04 で動作させる4”の続き。

Vitis アクセラレーション・プラットホームを使用してハードウェアを作り、それを自作アプリケーション・ソフトウェアで動作させる7”で動作させたハードウェアとソフトウェアを KR260 の Ubuntu 22.04 で動作させてみたいということで、前回は、uio のリストが変わってしまったので、アプリケーション・ソフトウェアの kr260_ip_vadd2.c を変更して、コンパイルした。環境を整えて kr260_ip_vadd2 を起動したところ、multi_axi4ls と DMA_pow2 は動作したが、krnl_vadd が終了しなかった。今回は、Vivado の prj プロジェクトの kr260_bd_wrapper.bin ファイル(KR260/kr260_custom_platform/kr260_custom_platform/kr260_vadd2_system_hw_link/Hardware/binary_container_1.build/link/vivado/vpl/prj/prj.runs/impl_1/kr260_bd_wrapper.bin を binary_container_1.bin の代わりに使用して、自作アプリケーションを実行したが、krnl_vadd の出力は 0 だった。

Vitis アクセラレーション・プラットホームを使用してハードウェアを作り、それを自作アプリケーション・ソフトウェアで動作させる1”で生成された kr260_bd_wrapper.bin を binary_container_1.bin の代わりに KR260 の Ubuntu 22.04 の /lib/firmware/xilinx/kr260_ip_vadd2 ディレクトリに入れて、自作アプリケーションを実行する。
ls /lib/firmware/xilinx/kr260_ip_vadd2/
sudo rm /lib/firmware/xilinx/kr260_ip_vadd2/binary_container_1.bin
sudo cp kr260_bd_wrapper.bin /lib/firmware/xilinx/kr260_ip_vadd2/
ls /lib/firmware/xilinx/kr260_ip_vadd2/

sudo xmutil unloadapp
sudo xmutil loadapp kr260_ip_vadd2

sudo chmod 666 /dev/uio*
sudo chmod 666 /dev/udmabuf0
./kr260_ip_vadd2

KR260_440_230403.png

KR260_441_230403.png

krnl_vadd IP を使用するコードは実行できたが、値が 0 になってしまった。

もう一度、KR260 で Petalinux 2022.1 を起動して、同様に kr260_ip_vadd アプリケーション・ソフトウェアを起動してみたが、正常に動作している。
KR260_442_230404.png
KR260_443_230404.png

KR260 の Ubuntu 22.04 では、アクセラレーション用に作成された IP はうまく動かないのだろうか?
  1. 2023年04月04日 04:32 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:2

Vitis アクセラレーション・プラットホームを使用して作ったハードウェアを KR260 の Ubuntu 22.04 で動作させる4

Vitis アクセラレーション・プラットホームを使用して作ったハードウェアを KR260 の Ubuntu 22.04 で動作させる3”の続き。

Vitis アクセラレーション・プラットホームを使用してハードウェアを作り、それを自作アプリケーション・ソフトウェアで動作させる7”で動作させたハードウェアとソフトウェアを KR260 の Ubuntu 22.04 で動作させてみたいということで、前回は、もう一度、pl.dtsi の interrupt-controller@80000000 の項目を減らして、コンパイルして、KR260 の Petalinux 2022.1 に転送して、kr260_ip_vadd2 をロードしたところ、interrupt-controller が uio に追加された。今回は、uio のリストが変わってしまったので、アプリケーション・ソフトウェアの kr260_ip_vadd2.c を変更して、コンパイルした。環境を整えて kr260_ip_vadd2 を起動したところ、multi_axi4ls と DMA_pow2 は動作したが、krnl_vadd が終了しなかった。

前回からの続きではなく、KR260 の Ubuntu 22.04 が起動した時点から進めていく。

examples/kr260_ip_vadd2 ディレクトリに移動した。
cd examples/kr260_ip_vadd2

kr260_ip_vadd2.c を”Vitis アクセラレーション・プラットホームを使用して作ったハードウェアを KR260 の Ubuntu 22.04 で動作させる3”の uio 構成に書き直した。
KR260_437_230330.png

kr260_ip_vadd2.c を示す。

// kr260_ip_vadd2.c
// 2023/03/26 by marsee
// 2023/04/03 : Modified to work on Ubuntu 22.04.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/mman.h>

int32_t multi_calc(int32_t *multi_axi4ls, int32_t a, int32_t b){
    while((multi_axi4ls[0] &4) == 0) ; // wait ap_idle
    multi_axi4ls[6] = a; // reg a, 0x18
    multi_axi4ls[8] = b; // reg b, 0x20
    multi_axi4ls[0] = 1; // ap_start = 1
    while((multi_axi4ls[11] & 1) == 0) ; // wait c_ap_vld
    return(multi_axi4ls[10]);
}

void main(){
    int uio10_fd;
    int32_t *multi_axi4ls;
    int32_t a, b, c;
    int uio5_fd;
    volatile int32_t *dma_pow2;
    volatile int32_t *data;
    int fd_udmabuf0;
    u_int32_t fd_paddr;
    unsigned long  phys_addr;
    int uio9_fd;
    int32_t *krnl_vadd;
    unsigned char  attr[1024];

    // uio10, multi_axi4ls IP
    if((uio10_fd = open("/dev/uio10", O_RDWR)) == -1) {
        printf("Can not open /dev/uio10\n");
        exit(1);
    }
    multi_axi4ls = (uint32_t*)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, uio10_fd, 0);
    
    printf("multi_axi4ls\n");
    for(a = 0, b = 1; a < 10; a++, b++){
        c = multi_calc(multi_axi4ls, a, b);
        printf("a = %d, b = %d, c = %d\n", a, b, c);
    }

    // uio5, DMP_pow2 IP
    if((uio5_fd = open("/dev/uio5", O_RDWR)) == -1) {
        printf("Can not open /dev/uio5\n");
        exit(1);
    }
    dma_pow2 = (volatile int32_t*)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, uio5_fd, 0);
    
    // udmabuf0
    fd_udmabuf0 = open("/dev/udmabuf0", O_RDWR | O_SYNC); // frame_buffer, The chache is disabled. 
    if (fd_udmabuf0 == -1){
        fprintf(stderr, "/dev/udmabuf0 open errorn");
        exit(-1);
    }

    // phys_addr of udmabuf0
    fd_paddr = open("/sys/class/u-dma-buf/udmabuf0/phys_addr", O_RDONLY);
    if (fd_paddr == -1){
        fprintf(stderr, "/sys/class/u-dma-buf/udmabuf0/phys_addr open errorn");
        exit(-1);
    }
    read(fd_paddr, (void *)attr, 1024);
    sscanf((const char *)attr, "%lx", &phys_addr);  
    close(fd_paddr);
    printf("phys_addr = %x\n", (unsigned int)phys_addr);
  
    data = (volatile int32_t *)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, fd_udmabuf0, 0);
    if (data == MAP_FAILED){
        fprintf(stderr, "data mmap error\n");
        exit(-1);
    }

    // data Initialization
    for(int i=0; i<10; i++){
        data[i] = i;
    }
    
    // DMA_pow2 start
    while((dma_pow2[0] & 4) == 0) ; // wait ap_idle
    dma_pow2[6] = phys_addr; // in_r
    dma_pow2[8] = phys_addr + 10 * sizeof(int32_t);
    dma_pow2[0] = 1; // ap_start
    while((dma_pow2[0] & 2) == 0) ; // wait ap_done
    
    printf("\n DMA_pow2\n");
    for(int i=0; i<10; i++){
        printf("in = %d, out = %d\n", data[i], data[i+10]);
    }

    // uio9, krnl_vadd IP
    if((uio9_fd = open("/dev/uio9", O_RDWR)) == -1) {
        printf("Can not open /dev/uio9\n");
        exit(1);
    }
    krnl_vadd = (uint32_t*)mmap(NULL, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, uio9_fd, 0);

    for(int i=0; i<10; i++){
        data[i+20] = i;
        data[i+30] = i+1;
    }

    // krnl_vadd start
    while((krnl_vadd[0] & 4) == 0) ; // wait ap_idle
    krnl_vadd[4] = (uint32_t)((phys_addr + 20 * sizeof(int32_t))&0xffffffff); // in1
    krnl_vadd[5] = (uint32_t)(((phys_addr + 20 * sizeof(int32_t))&0xffffffff00000000)>>32); // in1
    krnl_vadd[7] = (uint32_t)((phys_addr + 30 * sizeof(int32_t))&0xffffffff); // in2
    krnl_vadd[8] = (uint32_t)(((phys_addr + 30 * sizeof(int32_t))&0xffffffff00000000)>>32); // in2
    krnl_vadd[10] = (uint32_t)((phys_addr + 40 * sizeof(int32_t))&0xffffffff); // out_r
    krnl_vadd[11] = (uint32_t)(((phys_addr + 40 * sizeof(int32_t))&0xffffffff00000000)>>32); // out_r
    krnl_vadd[13] = 10; // size
    krnl_vadd[0] = 1; // ap_start
    while((krnl_vadd[0] & 2) == 0) ; // wait ap_done
   
    printf("\nkrnl_vadd\n");
    for(int i=0; i<10; i++){
       printf("in1 = %d, in2 = %d, out_r = %d\n", data[i+20], data[i+30], data[i+40]);
    }
}


kr260_ip_vadd2.c を gcc でコンパイルした。
gcc -o kr260_ip_vadd2 kr260_ip_vadd2.c
KR260_438_230330.png

kr260_ip_vadd を実行するためにコマンドを実行していく。
sudo insmod ~/udmabuf/u-dma-buf.ko udmabuf0=0x10000
sudo xmutil unloadapp
sudo xmutil loadapp kr260_ip_vadd2

sudo chmod 666 /dev/uio*
sudo chmod 666 /dev/udmabuf0
./kr260_ip_vadd2

kr260_ip_vadd2 を実行したところ、multi_axi4ls と DMA_pow2 は動作したが、krnl_vadd が終了しなかった。
いつまで経っても終了しないので、CTRL-C キーを押して強制終了した。
KR260_439_230403.png
  1. 2023年04月03日 04:49 |
  2. KR260
  3. | トラックバック:0
  4. | コメント:0

ZUBoard 1CG が来ました

金曜日に、ZUBoard 1CG が来ました。
使ってみるのが楽しみです。

ZUBoard 1CG が入っている箱です。
ZUBoard_1_230402.jpg

箱を開けると入ってました。
ZUBoard_2_230402.jpg

ZUBoard 1CG 基板の表面です。
ZUBoard_3_230402.jpg

ZUBoard 1CG 基板の裏面です。
ZUBoard_4_230402.jpg

Hackster.io に Whitney Knitter さんの記事が乗っています。いつもながら Whitney Knitter さんに感謝します。
Getting Started with Avnet's ZUBoard-1CG
ZUBoard 1CG Development Kit: New Low-Cost Zynq UltraScale+ MPSoC with SYZYGY

ZUBoard の記事です。
ZUBoard - Building the foundational designs
ZUBoard - Combining designs into a single platform
Introducing ZUBoard for Accelerated Edge AI
Accelerated Edge AI with Vitis-AI

ZUBoard 1CG #1 – Defining a Product in Today’s Market

"MicroZed Chronicles: The Avnet ZUBoard 1CG"

"Announcing: PYNQ v3.0.1 for Avnet ZUBoard-1CG"
  1. 2023年04月02日 05:53 |
  2. ZUBoard
  3. | トラックバック:0
  4. | コメント:0

物置のドアを作りました

今日は物置の引き戸が壊れたので、ドアを自作して取り付けました。
door_1_230401.jpg

2 X 2 材を買ってきて、ドアの枠組みを作りました。それにプラスチック・ダンボールを貼ってます。
裏から見た様子です。
door_2_230401.jpg

蝶番はステンレスのを買ってきました。
door_3_230401.jpg

取手も金属です。
プラスチック・ダンボールはカリクギを使っています。接着する時に仮止めする釘なんですが、プラスチック・ダンボールを止めるのに使用しました。
door_4_230401.jpg

ドアを止めるのはネオジウム磁石です。
door_5_230401.jpg

磁石は 3 箇所取り付けてありますが、吸い付ける鉄はコーススレッドの頭を使っています。こうすると高さが自由に設定できるので、ドアや元々の建具が曲がっていても対処可能です。
door_6_230401.jpg
  1. 2023年04月01日 21:56 |
  2. 木工
  3. | トラックバック:0
  4. | コメント:0