FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

カテゴリ: PYNQ

今日、”実践的!FPGA開発セミナー vol.27”が開催されて、そこで、お話させていただきます。

事前に発表用スライドの”PYNQ上で画像用自作ハードウェアを動作させる”を公開します。

スライドには該当するFPGAの部屋のブログ記事へのリンクが張ってあるので、リンクをクリックしてより詳しい説明をご覧ください。

本日はよろしくお願いいたします。

(追記) ishiwatari さんの質問のお返事
共有物理メモリは、CMA 領域に取られるメモリ領域のようです。(”Pynq & maximum allocatable memory (CMA)”参照)

なお、allocate() の説明は、”Allocate”や”pynq.buffer Module”にあります。

今週の水曜日(2023/10/25)に”実践的!FPGA開発セミナー vol.27”で発表します。
タイトルは”PYNQ上で画像用自作ハードウェアを動作させる”です。
ZYNQ ボードで動作する PYNQ で画像用の自作ハードウェアを動作させる方法です。私のハマった 2 つのハマるポイントについて説明し、解決方法を解説します。

水曜日(2023/10/25)の朝に発表用 PPT の PDF 版を公開する予定です。

PYNQ v3.0 (Belfast) がリリースされた。
fd69cd5c.jpg


PYNQ v3.0 (Belfast) Release”のページによると、(引用する)

1. ZCU208 RFSoC プラットフォームと Kria KR260 の公式サポートを追加
2. pynqutilsの分離 PYNQ から独立したオーバーレイの Python パッケージング用
3. pynqmetadataの分離 6Vivado デザインのビルド時のイントロスペクション用
4. RFSoC-PYNQ が利用可能


Finally, software packages and tools have been upgraded - we are deploying with Python 3.10, JupyterLab 3.4.4 and PYNQ-Linux with Ubuntu-based 22.04 packaging. Vivado and Petalinux tools are upgraded to 2022.1.


だそうだ。

PYNQ-Z1 に PYNQ v3.0 を書いた MicroSD カードを挿入して、起動してみた。
73e538ea.png


Ubuntu 22.04 が起動した。
ツール・バージョンも 2022.1 になっている。
起動ログを貼っておく。

Booting Linux on physical CPU 0x0
Linux version 5.15.19-xilinx-v2022.1 (oe-user@oe-host) (arm-xilinx-linux-gnueabi-gcc (GCC) 11.2.0, GNU ld (GNU Binutils) 2.37.20210721) #1 SMP PREEMPT Mon Apr 11 17:52:14 UTC 2022
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
OF: fdt: Machine model: xlnx,zynq-7000
Memory policy: Data cache writealloc
cma: Reserved 128 MiB at 0x16800000
Zone ranges:
  Normal   [mem 0x0000000000000000-0x000000001fffffff]
  HighMem  empty
Movable zone start for each node
Early memory node ranges
  node   0: [mem 0x0000000000000000-0x000000001fffffff]
Initmem setup node 0 [mem 0x0000000000000000-0x000000001fffffff]
percpu: Embedded 12 pages/cpu s18828 r8192 d22132 u49152
Built 1 zonelists, mobility grouping on.  Total pages: 129920
Kernel command line: root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1 uio_pdrv_genirq.of_id="generic-uio" clk_ignore_unused
Unknown kernel command line parameters "earlyprintk", will be passed to user space.
Dentry cache hash table entries: 65536 (order: 6, 262144 bytes, linear)
Inode-cache hash table entries: 32768 (order: 5, 131072 bytes, linear)
mem auto-init: stack:off, heap alloc:off, heap free:off
Memory: 373332K/524288K available (9216K kernel code, 324K rwdata, 2512K rodata, 1024K init, 296K bss, 19884K reserved, 131072K cma-reserved, 0K highmem)
rcu: Preemptible hierarchical RCU implementation.
rcu:    RCU event tracing is enabled.
rcu:    RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
        Trampoline variant of Tasks RCU enabled.
        Tracing variant of Tasks RCU enabled.
rcu: RCU calculated value of scheduler-enlistment delay is 10 jiffies.
rcu: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
NR_IRQS: 16, nr_irqs: 16, preallocated irqs: 16
efuse mapped to (ptrval)
slcr mapped to (ptrval)
GIC physical location is 0xf8f01000
L2C: platform modifies aux control register: 0x72360000 -> 0x72760000
L2C: DT/platform modifies aux control register: 0x72360000 -> 0x72760000
L2C-310 erratum 769419 enabled
L2C-310 enabling early BRESP for Cortex-A9
L2C-310 full line of zeros enabled for Cortex-A9
L2C-310 ID prefetch enabled, offset 1 lines
L2C-310 dynamic clock gating enabled, standby mode enabled
L2C-310 cache controller enabled, 8 ways, 512 kB
L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x76760001
random: get_random_bytes called from start_kernel+0x364/0x5f8 with crng_init=0
zynq_clock_init: clkc starts at (ptrval)
Zynq clock init
sched_clock: 64 bits at 162MHz, resolution 6ns, wraps every 4398046511101ns
clocksource: arm_global_timer: mask: 0xffffffffffffffff max_cycles: 0x257a3bfb55, max_idle_ns: 440795207830 ns
Switching to timer-based delay loop, resolution 6ns
Console: colour dummy device 80x30
printk: console [tty0] enabled
Calibrating delay loop (skipped), value calculated using timer frequency.. 325.00 BogoMIPS (lpj=1625000)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes, linear)
CPU: Testing write buffer coherency: ok
CPU0: Spectre v2: using BPIALL workaround
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x100000 - 0x100060
rcu: Hierarchical SRCU implementation.
smp: Bringing up secondary CPUs ...
CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
CPU1: Spectre v2: using BPIALL workaround
smp: Brought up 1 node, 2 CPUs
SMP: Total of 2 processors activated (650.00 BogoMIPS).
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
futex hash table entries: 512 (order: 3, 32768 bytes, linear)
pinctrl core: initialized pinctrl subsystem
NET: Registered PF_NETLINK/PF_ROUTE protocol family
DMA: preallocated 256 KiB pool for atomic coherent allocations
thermal_sys: Registered thermal governor 'step_wise'
cpuidle: using governor menu
amba f8801000.etb: Fixing up cyclic dependency with replicator
amba f8803000.tpiu: Fixing up cyclic dependency with replicator
amba f8804000.funnel: Fixing up cyclic dependency with replicator
amba f889c000.ptm: Fixing up cyclic dependency with f8804000.funnel
amba f889d000.ptm: Fixing up cyclic dependency with f8804000.funnel
hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
hw-breakpoint: maximum watchpoint size is 4 bytes.
zynq-ocm f800c000.ocmc: ZYNQ OCM pool: 256 KiB @ 0x(ptrval)
e0000000.serial: ttyPS0 at MMIO 0xe0000000 (irq = 32, base_baud = 6250000) is a xuartps
printk: console [ttyPS0] enabled
raid6: int32x8  gen()   117 MB/s
raid6: int32x8  xor()    78 MB/s
raid6: int32x4  gen()   124 MB/s
raid6: int32x4  xor()    88 MB/s
raid6: int32x2  gen()   200 MB/s
raid6: int32x2  xor()   121 MB/s
raid6: int32x1  gen()   180 MB/s
raid6: int32x1  xor()   100 MB/s
raid6: using algorithm int32x2 gen() 200 MB/s
raid6: .... xor() 121 MB/s, rmw enabled
raid6: using intx1 recovery algorithm
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
mc: Linux media interface: v0.10
videodev: Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
FPGA manager framework
Advanced Linux Sound Architecture Driver Initialized.
clocksource: Switched to clocksource arm_global_timer
NET: Registered PF_INET protocol family
IP idents hash table entries: 8192 (order: 4, 65536 bytes, linear)
tcp_listen_portaddr_hash hash table entries: 512 (order: 0, 6144 bytes, linear)
TCP established hash table entries: 4096 (order: 2, 16384 bytes, linear)
TCP bind hash table entries: 4096 (order: 3, 32768 bytes, linear)
TCP: Hash tables configured (established 4096 bind 4096)
UDP hash table entries: 256 (order: 1, 8192 bytes, linear)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes, linear)
NET: Registered PF_UNIX/PF_LOCAL protocol family
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
PCI: CLS 0 bytes, default 64
armv7-pmu f8891000.pmu: hw perfevents: no interrupt-affinity property, guessing.
hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available
Initialise system trusted keyrings
workingset: timestamp_bits=14 max_order=17 bucket_order=3
squashfs: version 4.0 (2009/01/31) Phillip Lougher
jffs2: version 2.2. (NAND) (SUMMARY)  c 2001-2006 Red Hat, Inc.
xor: measuring software checksum speed
   arm4regs        :  1045 MB/sec
   8regs           :   805 MB/sec
   32regs          :   836 MB/sec
xor: using function: arm4regs (1045 MB/sec)
Key type asymmetric registered
Asymmetric key parser 'x509' registered
io scheduler mq-deadline registered
io scheduler kyber registered
zynq-pinctrl 700.pinctrl: zynq pinctrl initialized
dma-pl330 f8003000.dmac: Loaded driver for PL330 DMAC-241330
dma-pl330 f8003000.dmac:        DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
brd: module loaded
loop: module loaded
random: fast init done
spi-nor spi0.0: s25fl128s1 (16384 Kbytes)
spi0.0: error parsing ofpart partition /axi/spi@e000d000/flash@0/partition@0 (/axi/spi@e000d000/flash@0)
tun: Universal TUN/TAP device driver, 1.6
CAN device driver interface
macb e000b000.ethernet eth0: Cadence GEM rev 0x00020118 at 0xe000b000 irq 34 (00:18:3e:02:49:56)
e1000e: Intel(R) PRO/1000 Network Driver
e1000e: Copyright(c) 1999 - 2015 Intel Corporation.
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-pci: EHCI PCI platform driver
usbcore: registered new interface driver cdc_acm
cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters
usbcore: registered new interface driver cdc_wdm
usbcore: registered new interface driver usb-storage
usbcore: registered new interface driver usbserial_generic
usbserial: USB Serial support registered for generic
usbcore: registered new interface driver usb_serial_simple
usbserial: USB Serial support registered for carelink
usbserial: USB Serial support registered for zio
usbserial: USB Serial support registered for funsoft
usbserial: USB Serial support registered for flashloader
usbserial: USB Serial support registered for google
usbserial: USB Serial support registered for libtransistor
usbserial: USB Serial support registered for vivopay
usbserial: USB Serial support registered for moto_modem
usbserial: USB Serial support registered for motorola_tetra
usbserial: USB Serial support registered for novatel_gps
usbserial: USB Serial support registered for hp4x
usbserial: USB Serial support registered for suunto
usbserial: USB Serial support registered for siemens_mpi
ULPI transceiver vendor/product ID 0x0451/0x1507
Found TI TUSB1210 ULPI transceiver.
ULPI integrity check: passed.
ci_hdrc ci_hdrc.0: EHCI Host Controller
ci_hdrc ci_hdrc.0: new USB bus registered, assigned bus number 1
ci_hdrc ci_hdrc.0: USB 2.0 started, EHCI 1.00
hub 1-0:1.0: USB hub found
hub 1-0:1.0: 1 port detected
i2c_dev: i2c /dev entries driver
cdns-wdt f8005000.watchdog: Xilinx Watchdog Timer with timeout 10s
device-mapper: ioctl: 4.45.0-ioctl (2021-03-22) initialised: dm-devel@redhat.com
EDAC MC: ECC not enabled
Xilinx Zynq CpuIdle Driver started
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
ledtrig-cpu: registered to indicate activity on CPUs
clocksource: ttc_clocksource: mask: 0xffff max_cycles: 0xffff, max_idle_ns: 551318127 ns
timer #0 at (ptrval), irq=47
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
xlnk xlnk: Major 243
xlnk xlnk: xlnk driver loaded
xlnk xlnk: xlnk_pdev is not null
mmc0: SDHCI controller on e0100000.mmc [e0100000.mmc] using ADMA
fpga_manager fpga0: Xilinx Zynq FPGA Manager registered
IPVS: Registered protocols (TCP, UDP)
IPVS: Connection hash table configured (size=4096, memory=32Kbytes)
IPVS: ipvs loaded.
IPVS: [rr] scheduler registered.
Initializing XFRM netlink socket
NET: Registered PF_INET6 protocol family
Segment Routing with IPv6
mmc0: new high speed SDHC card at address 59b4
In-situ OAM (IOAM) with IPv6
mmcblk0: mmc0:59b4 USD   7.51 GiB
sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
 mmcblk0: p1 p2
NET: Registered PF_PACKET protocol family
can: controller area network core
NET: Registered PF_CAN protocol family
can: raw protocol
can: broadcast manager protocol
can: netlink gateway - max_hops=1
Registering SWP/SWPB emulation handler
Loading compiled-in X.509 certificates
Btrfs loaded, crc32c=crc32c-generic, zoned=no, fsverity=no
of-fpga-region fpga-full: FPGA Region probed
of_cfs_init
of_cfs_init: OK
cfg80211: Loading compiled-in X.509 certificates for regulatory database
cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7'
platform regulatory.0: Direct firmware load for regulatory.db failed with error -2
cfg80211: failed to load regulatory.db
clk: Not disabling unused clocks
ALSA device list:
  No soundcards found.
EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null). Quota mode: disabled.
VFS: Mounted root (ext4 filesystem) on device 179:2.
devtmpfs: mounted
Freeing unused kernel image (initmem) memory: 1024K
Run /sbin/init as init process
usb 1-1: new high-speed USB device number 2 using ci_hdrc
systemd[1]: System time before build time, advancing clock.
systemd[1]: Failed to find module 'autofs4'
systemd[1]: systemd 249.11-0ubuntu3 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=unified)
systemd[1]: Detected architecture arm.

Welcome to PynqLinux, based on Ubuntu 22.04!

systemd[1]: Hostname set to <pynq>.
systemd[1]: Queued start job for default target Multi-User System.
random: systemd: uninitialized urandom read (16 bytes read)
systemd[1]: Created slice Slice /system/modprobe.
[  OK  ] Created slice Slice /system/modprobe.
random: systemd: uninitialized urandom read (16 bytes read)
systemd[1]: Created slice Slice /system/serial-getty.
[  OK  ] Created slice Slice /system/serial-getty.
random: systemd: uninitialized urandom read (16 bytes read)
systemd[1]: Created slice User and Session Slice.
[  OK  ] Created slice User and Session Slice.
systemd[1]: Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Started Dispatch Password …ts to Console Directory Watch.
systemd[1]: Started Forward Password Requests to Wall Directory Watch.
[  OK  ] Started Forward Password R…uests to Wall Directory Watch.
systemd[1]: Condition check resulted in Arbitrary Executable File Formats File System Automount Point being skipped.
systemd[1]: Reached target Local Encrypted Volumes.
[  OK  ] Reached target Local Encrypted Volumes.
systemd[1]: Reached target Remote File Systems.
[  OK  ] Reached target Remote File Systems.
systemd[1]: Reached target Slice Units.
[  OK  ] Reached target Slice Units.
systemd[1]: Reached target Local Verity Protected Volumes.
[  OK  ] Reached target Local Verity Protected Volumes.
systemd[1]: Listening on Syslog Socket.
[  OK  ] Listening on Syslog Socket.
systemd[1]: Listening on initctl Compatibility Named Pipe.
[  OK  ] Listening on initctl Compatibility Named Pipe.
systemd[1]: Condition check resulted in Journal Audit Socket being skipped.
systemd[1]: Listening on Journal Socket (/dev/log).
[  OK  ] Listening on Journal Socket (/dev/log).
systemd[1]: Listening on Journal Socket.
[  OK  ] Listening on Journal Socket.
systemd[1]: Listening on udev Control Socket.
[  OK  ] Listening on udev Control Socket.
systemd[1]: Listening on udev Kernel Socket.
[  OK  ] Listening on udev Kernel Socket.
systemd[1]: Condition check resulted in Huge Pages File System being skipped.
systemd[1]: Mounting POSIX Message Queue File System...
         Mounting POSIX Message Queue File System...
systemd[1]: Mounting Kernel Debug File System...
         Mounting Kernel Debug File System...
systemd[1]: Condition check resulted in Kernel Trace File System being skipped.
systemd[1]: Starting Journal Service...
         Starting Journal Service...
systemd[1]: Starting Restore / save the current clock...
         Starting Restore / save the current clock...
systemd[1]: Starting Set the console keyboard layout...
         Starting Set the console keyboard layout...
systemd[1]: Condition check resulted in Create List of Static Device Nodes being skipped.
systemd[1]: Starting Load Kernel Module configfs...
         Starting Load Kernel Module configfs...
systemd[1]: Starting Load Kernel Module drm...
         Starting Load Kernel Module drm...
systemd[1]: Starting Load Kernel Module fuse...
         Starting Load Kernel Module fuse...
systemd[1]: Started Nameserver information manager.
[  OK  ] Started Nameserver information manager.
systemd[1]: Reached target Preparation for Network.
[  OK  ] Reached target Preparation for Network.
systemd[1]: Starting Load Kernel Modules...
         Starting Load Kernel Modules...
systemd[1]: Starting Remount Root and Kernel File Systems...
         Starting Remount Root and Kernel File Systems...
systemd[1]: Starting Coldplug All udev Devices...
         Starting Coldplug All udev Devices...
systemd[1]: Started Journal Service.
[  OK  ] Started Journal Service.
[  OK  ] Mounted POSIX Message Queue File System.
[  OK  ] Mounted Kernel Debug File System.
[  OK  ] Finished Restore / save the current clock.
[  OK  ] Finished Load Kernel Module configfs.
[  OK  ] Finished Load Kernel Module drm.
[  OK  ] Finished Load Kernel Module fuse.
[  OK  ] Finished Set the console keyboard layout.
[  OK  ] Finished Load Kernel Modules.
[  OK  ] Finished Remount Root and Kernel File Systems.
         Activating swap /var/swap...
         Mounting Kernel Configuration File System...
         Starting Flush Journal to Persistent Storage...
         Starting Load/Save Random Seed...
systemd-journald[111]: Received client request to flush runtime journal.
Adding 524284k swap on /var/swap.  Priority:-2 extents:1 across:524284k SS
         Starting Apply Kernel Variables...
systemd-journald[111]: File /var/log/journal/5a5ef3f8a3034b4c8b00d42b6daec8fb/system.journal corrupted or uncleanly shut down, renaming and replacing.
         Starting Create System Users...
[  OK  ] Activated swap /var/swap.
[  OK  ] Mounted Kernel Configuration File System.
[  OK  ] Reached target Swaps.
[  OK  ] Finished Coldplug All udev Devices.
         Starting Helper to synchronize boot up for ifupdown...
[  OK  ] Finished Apply Kernel Variables.
[  OK  ] Finished Create System Users.
         Starting Create Static Device Nodes in /dev...
[  OK  ] Finished Flush Journal to Persistent Storage.
[  OK  ] Finished Create Static Device Nodes in /dev.
[  OK  ] Reached target Preparation for Local File Systems.
[  OK  ] Reached target Local File Systems.
         Starting Enable support fo…l executable binary formats...
         Starting Set console font and keymap...
         Starting Create Volatile Files and Directories...
         Starting Rule-based Manage…for Device Events and Files...
[  OK  ] Finished Load/Save Random Seed.
[  OK  ] Finished Enable support fo…nal executable binary formats.
[  OK  ] Finished Set console font and keymap.
[  OK  ] Finished Create Volatile Files and Directories.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
         Starting Network Name Resolution...
         Starting Network Time Synchronization...
         Starting Record System Boot/Shutdown in UTMP...
[  OK  ] Started Rule-based Manager for Device Events and Files.
[  OK  ] Finished Record System Boot/Shutdown in UTMP.
zocl-drm axi:zyxclmm_drm: IRQ index 0 not found
[  OK  ] Found device /dev/ttyPS0.
[  OK  ] Reached target Hardware activated USB gadget.
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Finished Helper to synchronize boot up for ifupdown.
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started ifup for eth0.
         Starting Raise network interfaces...
[  OK  ] Started Network Time Synchronization.
[  OK  ] Reached target System Initialization.
[  OK  ] Started resolvconf-pull-resolved.path.
[  OK  ] Started Trigger to poll fo…y enabled on GCP LTS non-pro).
[  OK  ] Started Daily Cleanup of Temporary Directories.
[  OK  ] Started Ubuntu Advantage Timer for running repeated jobs.
[  OK  ] Reached target Path Units.
[  OK  ] Reached target System Time Set.
[  OK  ] Started Daily apt download activities.
[  OK  ] Started Daily apt upgrade and clean activities.
[  OK  ] Started Daily dpkg database backup timer.
[  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 man-db regeneration.
[  OK  ] Started Message of the Day.
[  OK  ] Reached target Timer Units.
[  OK  ] Listening on D-Bus System Message Bus Socket.
[  OK  ] Listening on UUID daemon activation socket.
[  OK  ] Reached target Socket Units.
[  OK  ] Reached target Basic System.
         Starting LSB: automatic crash report generation...
         Starting Executing boot.py from the boot partition...
[  OK  ] Started Regular background program processing daemon.
[  OK  ] Started D-Bus System Message Bus.
[  OK  ] Started Save initial kernel messages after boot.
         Starting Remove Stale Onli…t4 Metadata Check Snapshots...
         Starting Jupyter Notebook Server...
         Starting LSB: Load kernel …d to enable cpufreq scaling...
         Starting Dispatcher daemon for systemd-networkd...
         Starting Resize Filesystem on SD card...
         Starting System Logging Service...
         Starting User Login Management...
[  OK  ] Started Network Name Resolution.
[  OK  ] Finished Resize Filesystem on SD card.
[  OK  ] Started System Logging Service.
[  OK  ] Started LSB: automatic crash report generation.
[  OK  ] Finished Remove Stale Onli…ext4 Metadata Check Snapshots.
[  OK  ] Started LSB: Load kernel m…ded to enable cpufreq scaling.
[  OK  ] Started User Login Management.
[  OK  ] Reached target Host and Network Name Lookups.
         Starting LSB: set CPUFreq kernel parameters...
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
         Starting resolvconf-pull-resolved.service...
[  OK  ] Started LSB: set CPUFreq kernel parameters.
[  OK  ] Finished resolvconf-pull-resolved.service.
[  OK  ] Started Dispatcher daemon for systemd-networkd.
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Stopped Entropy Daemon based on the HAVEGE algorithm.
[  OK  ] Started Entropy Daemon based on the HAVEGE algorithm.
         Starting resolvconf-pull-resolved.service...
[  OK  ] Finished Raise network interfaces.
[  OK  ] Reached target Network.
[  OK  ] Reached target Network is Online.
[  OK  ] Started ISC DHCP IPv4 server.
[  OK  ] Started ISC DHCP IPv6 server.
         Starting Samba NMB Daemon...
         Starting OpenBSD Secure Shell server...
         Starting Permit User Sessions...
[  OK  ] Started Unattended Upgrades Shutdown.
[  OK  ] Finished resolvconf-pull-resolved.service.
[  OK  ] Finished Permit User Sessions.
[  OK  ] Started Serial Getty on ttyPS0.
         Starting Set console scheme...
[  OK  ] Finished Set console scheme.

PYNQ Linux, based on Ubuntu 22.04 pynq ttyPS0

pynq login: xilinx (automatic login)

Welcome to PYNQ Linux, based on Ubuntu 22.04 (GNU/Linux 5.15.19-xilinx-v2022.1 armv7l)

Last login: Thu Oct 13 07:37:59 UTC 2022 on ttyPS0
xilinx@pynq:~$


”MicroZed Chronicles: PYNQ Interrupts”をやってみる1”の続き。

PYNQ での割り込みを学習するために、Adam Taylor さんの”MicroZed Chronicles: Memory Scrubbing”を ZYBO Z7-20 の PYNQ でやってみることにしたということで、前回は、Vivado 2022.1 で pynq_int プロジェクトを作成してブロック・デザインを作成し、論理合成、インプリメンテーション、ビットストリームの生成を行った。今回は、ZYBO Z7-20 上の PYNQ Linux にビットストリームと hwh ファイルをアップロードし、pynq_int.ipynb ファイルを生成して、割り込み動作を確認した。

ZYBO Z7-20 の Jupyter Notebook の my_project の下に pinq_int ディレクトリを生成した。

Vivado 2022.1 で作った pynq_int プロジェクトの pynq_int/pynq_int.runs/impl_1 から pynq_int_wrapper.bit を pynq_int ディレクトリにアップロードし、名前を pynq_int.bit に変更した。

Vivado 2022.1 で作った pynq_int プロジェクトの pynq_int/pynq_int.gen/sources_1/bd/pynq_int/hw_handoff から pynq_int.hwh ファイルを pynq_int ディレクトリにアップロードした。

pynq_int.ipynb ファイルを新規作成した。
MicroZed Chronicles: Memory Scrubbing”のコードを引用した。変数名を多少いじってあるが、ほとんどコードを引用してある。
edde5ecd.png


ZYBO Z7-20 の PYNQ Linux にログインして、cat /proc/interrupts を行った。
a6989c17.png


たぶん fabric が PL からの割り込みを表すと思う。
現在、CPU0 のカウントは 0 になっている。

pynq_int.ipynb ファイルを全部実行した。
最後の

asyncio.get_event_loop().run_until_complete(handler_task)

で実行待ちになっている。
7ce12f82.png


ZYBO Z7-20 の押ボタン・スイッチのどれかを押すと、最後の行を実行できた。
LED が全て点灯した。
05c58440.png


handle() 関数を割り込みで実行できているようだ。

cat /proc/interrupts を行うと fabric の CPU0 のカウントが +1 されていた。
d4b7eecc.png


MicroZed Chronicles: Memory Scrubbing”を引用した Python コードを貼っておく。

#!/usr/bin/env python
# coding: utf-8

# ## PYNQ Interrupt

# In[1]:

from pynq import Overlay, Interrupt, GPIO
import asyncio

# In[2]:

# Download bitstream
pi = Overlay("./pynq_int.bit")

# In[3]:

pi.interrupt_pins

# In[4]:

intc = pi.axi_intc_0
intr_inst = Interrupt('axi_gpio_0/ip2intc_irpt')

# In[5]:

from pynq.lib import AxiGPIO

# In[6]:

gpio0 = pi.ip_dict['axi_gpio_0']
gpio1 = pi.ip_dict['axi_gpio_1']

# In[7]:

leds = AxiGPIO(gpio1).channel1
sw = AxiGPIO(gpio0).channel1

# In[8]:

async def handle():
    await sw.wait_for_interrupt_async()
    leds[0:4].toggle()

# In[9]:

handler_task = asyncio.ensure_future(handle())

# In[10]:

asyncio.get_event_loop().run_until_complete(handler_task)


ZYBO Z7-20 の PYNQ 2.7 上で Jupyter Notebook に画像を表示する9”の続き。

Jupyter Notebook にカメラ画像を表示しようということで、前回は、色の違いを修正するために、Red と Blue を入れ替えたところ、正常な色になった。今回は、1 つやるのを忘れていたことがあった。それは、カメラ画像をファイルにすることだ。結論を言うとカメラ画像を JPEG ファイルにすることができた。

まずは、NumPy配列ndarrayを画像ファイルとして保存するために、”Python, NumPyで画像処理(読み込み、演算、保存)”の”NumPy配列ndarrayを画像ファイルとして保存する方法”を参考にさせていただいた。
Python, NumPyで画像処理(読み込み、演算、保存)”によると、

cam_image = Image.fromarray(buffer3)

の cam_image の save メソッドを呼び出せば良いようだ。

cam_image.save('temp.jpg')


実行した。
a3ba60a0.png


test.jpg が生成された。
020f39eb.png


test.jpg を確認したが、正常だった。
bff17445.png


これで画像をファイルにする方法が分かった。

現在の Jupyter Notebook の Python コードを貼っておく。

# cam_disp.py
# 2022/08/05 by marsee
# 2022/08/14 : Added Sobel filter.

from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from pynq import allocate, Overlay
import time

# Download bitstream
cam_disp = Overlay("./cam_disp.bit")

# Generate an instance for each IP
vflip_dmaw = cam_disp.vflip_dma_write_0
paracam_inf = cam_disp.paracam_inf_axis_0
bmpd_cont = cam_disp.bitmap_disp_cont_axis_0
cam_iic = cam_disp.axi_iic_0
sobel0 = cam_disp.sobel_axis_RGB24_0
sobel1 = cam_disp.sobel_axis_RGB24_1
dma2axis30 = cam_disp.DMA2axis_3buf_0
dma2axis31 = cam_disp.DMA2axis_3buf_1
axis2dma = cam_disp.axis2DMA_0

def cam_i2c_init(cam_iic):
    cam_iic.write(0x100, 0x2)   # reset tx fifo ,address is 0x100, i2c_control_reg
    cam_iic.write(0x100, 0x1)   # enable i2c

def cam_i2x_write_sync():
    time.sleep(0.001) # 1ms wait

def cam_i2c_write(cam_iic, device_addr, write_addr, write_data):
    cam_iic.write(0x108, bin(0x100 | (device_addr & 0xfe)))   # Slave IIC Write Address, address is 0x108, i2c_tx_fifo
    cam_iic.write(0x108, bin((write_addr >> 8) & 0xff))      # address upper byte
    cam_iic.write(0x108, bin(write_addr & 0xff)) # address lower byte
    cam_iic.write(0x108, bin(0x200 | (write_data & 0xff)))   # data
    cam_i2x_write_sync()

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

    cam_i2c_write(cam_iic, device_addr, 0x4740, 0x21)

    cam_i2c_write(cam_iic, device_addr, 0x501e, 0x2a)
    cam_i2c_write(cam_iic, device_addr, 0x5002, 0x78)
    cam_i2c_write(cam_iic, device_addr, 0x501f, 0x01)
    cam_i2c_write(cam_iic, device_addr, 0x4300, 0x61)

# frame buffer alocate
height = 600
width = 800
buffer0 = allocate(shape=(height, width, 1), dtype=np.uint32, cacheable=1)
buffer1 = allocate(shape=(height, width, 1), dtype=np.uint32, cacheable=1)
buffer2 = allocate(shape=(height, width, 1), dtype=np.uint32, cacheable=1)
buffer3 = allocate(shape=(height, width, 3), dtype=np.uint8, cacheable=1)

# frame buffer resister set
vflip_dmaw.register_map.fb0_1 = buffer0.physical_address
vflip_dmaw.register_map.fb0_2 = 0
vflip_dmaw.register_map.fb1_1 = buffer1.physical_address
vflip_dmaw.register_map.fb1_2 = 0
vflip_dmaw.register_map.fb2_1 = buffer2.physical_address
vflip_dmaw.register_map.fb2_2 = 0

dma2axis30.register_map.fb0 = buffer0.physical_address
dma2axis30.register_map.fb1 = buffer1.physical_address
dma2axis30.register_map.fb2 = buffer2.physical_address
dma2axis30.register_map.mode = 0 # DMA_WRITE_MODE

dma2axis31.register_map.fb0 = buffer0.physical_address
dma2axis31.register_map.fb1 = buffer1.physical_address
dma2axis31.register_map.fb2 = buffer2.physical_address
dma2axis31.register_map.mode = 0 # DMA_WRITE_MODE

sobel0.register_map.row_size = height
sobel0.register_map.col_size = width
sobel0.register_map.function_r = 0 # ORG_IMGwAxiVdma

sobel1.register_map.row_size = height
sobel1.register_map.col_size = width
sobel1.register_map.function_r = 0 # ORG_IMGwAxiVdma

axis2dma.register_map.out_r = buffer3.physical_address
axis2dma.register_map.row_size = height
axis2dma.register_map.col_size = width

# vflip_dma_write start and auto repeat
vflip_dmaw.register_map.CTRL = 0x81

# Camera Initialization
cam_i2c_init(cam_iic)
cam_reg_set(cam_iic, 0x78)

# paracam_inf_axi start
paracam_inf.write(0x0, 0x0)
paracam_inf.write(0x4, 0x0)

# bitmap_disp_cont start
bmpd_cont.write(0x0, 0x0)

# sobel_axis_RGB24 start
sobel0.register_map.CTRL = 0x81

# dma2axis_3buf start and auto repeat
dma2axis30.register_map.CTRL = 0x81

# image capture
axis2dma.register_map.CTRL = 0x1

print(axis2dma.register_map.CTRL)

sobel1.register_map.CTRL = 0x1

print(sobel1.register_map.CTRL)

dma2axis31.register_map.CTRL = 0x1

print(dma2axis31.register_map.CTRL)

print(axis2dma.register_map.CTRL)
print(sobel1.register_map.CTRL)
print(dma2axis31.register_map.CTRL)

cam_image = Image.fromarray(buffer3)
print("Image size: {}x{} pixels.".format(width, height))
plt.figure(figsize=(12, 10));
_ = plt.imshow(cam_image)

cam_image.save('temp.jpg')

#sobel filter on for camera image
sobel0.register_map.function_r = 1 # SOBELwAxiVdma

# sobel filter off for camera image
sobel0.register_map.function_r = 0 # ORG_IMGwAxiVdma

#sobel fliter on for image capture
sobel1.register_map.function_r = 1 # SOBELwAxiVdma
#axis2dma.register_map.CTRL = 0x1
#sobel1.register_map.CTRL = 0x1
#dma2axis31.register_map.CTRL = 0x1

#sobel fliter off for image capture
sobel1.register_map.function_r = 0 # ORG_IMGwAxiVdma
#axis2dma.register_map.CTRL = 0x1
#sobel1.register_map.CTRL = 0x1
#dma2axis31.register_map.CTRL = 0x1


↑このページのトップヘ