diff --git a/.gitignore b/.gitignore index cf9b429..ee6cd35 100644 --- a/.gitignore +++ b/.gitignore @@ -16,4 +16,9 @@ web/web .idea .vscode -NanoKVM-Server \ No newline at end of file +NanoKVM-Server + +support/sg2002/kvm_system/build +support/sg2002/kvm_system/dist +support/sg2002/kvm_system/CMakeLists.txt + diff --git a/README.md b/README.md index 45802c2..89c6aa2 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,31 @@ English | [中文](./README_ZH.md) | [日本語](./README_JA.md) ## Opensource & Contribution +### 2025.03.04 Update Content ++ Updated directory structure + +``` shell +├── kvmapp # APP update package +│ ├── jpg_stream # Compatible for direct updates from very old versions +│ ├── kvm_new_app # Triggers necessary components for kvm_system update +│ ├── kvm_system # kvm_system application +│ ├── server # NanoKVM front-end and back-end applications +│ └── system # Necessary system components +├── server # NanoKVM back-end +├── support # Auxiliary functions (image subsystem, system status, system updates, screen, keys, etc.) +│ ├── sg2002 # NanoKVM-Lite/Full/PCIe +│ └── h618 # NanoKVM-Pro +├── web # NanoKVM front-end +├── LICENSE +├── README_JA.md +├── README.md +├── README_ZH.md +└── CHANGELOG.md +``` + ++ Add NanoKVM app installation package `kvmapp` ++ Add compilation scripts and compilation instructions + ### Update 2025.02.19 All components of NanoKVM were open-sourced, including the [front-end](https://github.com/sipeed/NanoKVM/tree/main/web), [back-end](https://github.com/sipeed/NanoKVM/tree/main/server), [kvm_vision](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm), [kvm_mmf](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm_mmf), [kvm_system](https://github.com/sipeed/NanoKVM/tree/main/support), the [kvmapp update package](https://github.com/sipeed/NanoKVM-System/tree/main/kvmapp), [system sdk](https://github.com/sipeed/LicheeRV-Nano-Build/tree/NanoKVM), and [packaging methods](https://github.com/sipeed/LicheeRV-Nano-Build/blob/NanoKVM/kvm/NanoKVM_img.sh). diff --git a/README_JA.md b/README_JA.md index 1bdb4a4..d3512e1 100644 --- a/README_JA.md +++ b/README_JA.md @@ -1,11 +1,13 @@ -# NanoKVM +NanoKVM +======
![](https://wiki.sipeed.com/hardware/assets/NanoKVM/introduce/NanoKVM_3.png)

- クイックスタート | + クイックスタート + | ハードウェア

@@ -13,18 +15,29 @@
-> Your NanoKVM Power by RISC-V ! +> NanoKVM は [RISC-V](https://en.wikipedia.org/wiki/RISC-V) を搭載しています! > 使用中に問題や提案がある場合は、ここで issue を提出するか、[MaixHub Discussion](https://maixhub.com/discussion/nanokvm) でお知らせください。 -## オープンソース & 貢献 & 出荷 +## オープンソース & コントリビューション -スターが2Kに近づいています!10月中旬にバックエンドのソースコードを整理してオープンソース化します!(また、10.1前のすべての予約注文が出荷される時期でもあります) +### 2025.02.19 更新 -### 10.18 更新 +NanoKVM のすべてのコンポーネントはオープンソース化されており、[front-end](https://github.com/sipeed/NanoKVM/tree/main/web)、[back-end](https://github.com/sipeed/NanoKVM/tree/main/server)、[kvm_vision](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm)、[kvm_mmf](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm_mmf)、[kvm_system](https://github.com/sipeed/NanoKVM/tree/main/support)、[kvmapp update package](https://github.com/sipeed/NanoKVM-System/tree/main/kvmapp)、[system sdk](https://github.com/sipeed/LicheeRV-Nano-Build/tree/NanoKVM)、[packaging methods](https://github.com/sipeed/LicheeRV-Nano-Build/blob/NanoKVM/kvm/NanoKVM_img.sh)が含まれます。 -10.8にバックエンドコードをオープンソース化しました。すぐにPRを提出してくれたCivilに感謝します。最新のNanoKVM-PCIeを報酬として提供します! -10月中旬のバッチはテストとパッケージングを開始しており、10.1前のほとんどの注文は次週と次々週に出荷されます。 -10.1以降、アリエクスプレスの出荷日は12月に変更されました。これは保守的な納期です。10月の注文は11.15〜12.15の間に発送される予定です。 +### 2025.02.14 更新 + +最新のアプリケーションバージョン v2.1.6 には、多くのセキュリティ強化とバグ修正が追加されているため、一般のユーザーはこのバージョン以降へのアップグレードをお勧めします。 + +### 2025.02.05 更新 + +セキュリティを懸念しているユーザーは、この issue をお読みください: 、セキュリティに関するすべての懸念事項について説明されています。 +GitHub は、オープンで透明性のあるプラットフォームとして、いわゆる「バックドア」の懸念事項を議論する場を提供しています。オープンソースであることにより、製品のセキュリティがさらに強化されます! + +### 2024.10.18 更新 + +10/08にバックエンドコードをオープンソース化しました。すぐにPRを提出してくれたCivilに感謝します。最新のNanoKVM-PCIeを報酬として提供します! +10月中旬のバッチはテストとパッケージングを開始しており、10/01以前のほとんどの注文は次週と次々週に出荷されます。 +10/01以降、アリエクスプレスの出荷日は12月に変更されました。これは保守的な納期です。10月の注文は11/15〜12/15の間に発送される予定です。 ## 紹介 @@ -33,35 +46,35 @@ Lichee NanoKVMは2つのバージョンがあります: NanoKVM Liteは基本構成で、一定のDIY能力を持つ個人ユーザーや大量のニーズを持つ企業ユーザーに適しています。 NanoKVM Fullは完全版で、洗練されたケースと完全なアクセサリーを備え、起動時にすぐに使用できるシステムミラーカードが内蔵されており、個人ユーザーに推奨されます。 -![](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_1.jpg) +![NanoKVM 分解画像](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_1.jpg) ## 技術仕様 -| 製品 | NanoKVM (Lite) | NanoKVM (Full) | PiKVM V4 | -| --- | --- | --- | --- | -| 計算ユニット | LicheeRV Nano(RISCV) | LicheeRV Nano(RISCV) | CM4 (ARM) | -| 解像度 | 1080P @ 60fps | 1080P @ 60fps | 1080P @ 60fps | -| ビデオエンコーディング | MJPEG, H264 | MJPEG, H264 | MJPEG, H264 | -| ビデオ遅延 | 90~230ms | 90~230ms | 100~230ms | -| UEFI/BIOS | ✓ | ✓ | ✓ | -| 仮想HID | ✓ | ✓ | ✓ | -| 仮想CD-ROM | ✓ | ✓ | ✓ | -| IPMI | ✓ | ✓ | ✓ | -| Wake-on-LAN | ✓ | ✓ | ✓ | -| ETH | 100M/10M | 100M/10M | 1000M/100M/10M | -| ATX電源制御 | なし、ユーザーが自分で接続 | USBインターフェースIO制御ボード | RJ-45インターフェースIO制御ボード | -| OLED | なし、ユーザーが自分で接続 | 128x64 0.96" 白 | 128x32 0.91" 白 | -| UART | 2 | 2 | 1 | -| TFカード | なし | ✓ | ✓ | -| 拡張 | なし | PoE | WiFi/LTE | -| 消費電力 | 0.2A@5V | 0.2A@5V | ピーク2.6A@5V | -| 電源入力 | PC USBで給電可能 | PC USBまたは補助電源 | DC 5V 3A電源が必要 | -| 冷却 | 静音ファンレス | 静音ファンレス | ファン冷却 | -| サイズ | 23x37x15mm
~1/30 PiKVM V4サイズ | 40x36x36mm
~1/7 PiKVM V4サイズ | 120x68x44mm | +| 製品 | NanoKVM (Lite) | NanoKVM (Full) | PiKVM V4 | +|----------------------- |-------------------------------------- |---------------------------------- |----------------------------------- | +| 計算ユニット | LicheeRV Nano(RISCV) | LicheeRV Nano(RISCV) | CM4 (ARM) | +| 解像度 | 1080P @ 60fps | 1080P @ 60fps | 1080P @ 60fps | +| ビデオエンコーディング | MJPEG, H264 | MJPEG, H264 | MJPEG, H264 | +| ビデオ遅延 | 90~230ms | 90~230ms | 100~230ms | +| UEFI/BIOS | ✓ | ✓ | ✓ | +| 仮想HID | ✓ | ✓ | ✓ | +| 仮想CD-ROM | ✓ | ✓ | ✓ | +| IPMI | ✓ | ✓ | ✓ | +| Wake-on-LAN | ✓ | ✓ | ✓ | +| ETH | 100M/10M | 100M/10M | 1000M/100M/10M | +| ATX電源制御 | なし、ユーザーが自分で接続 | USBインターフェースIO制御ボード | RJ-45インターフェースIO制御ボード | +| OLED | なし、ユーザーが自分で接続 | 128x64 0.96" 白 | 128x32 0.91" 白 | +| UART | 2 | 2 | 1 | +| TFカード | なし | ✓ | ✓ | +| 拡張 | なし | PoE | WiFi/LTE | +| 消費電力 | 0.2A@5V | 0.2A@5V | ピーク時 2.6A@5V | +| 電源入力 | PC USBで給電可能 | PC USBまたは補助電源 | DC 5V 3A電源が必要 | +| 冷却 | 静音ファンレス | 静音ファンレス | ファン冷却 | +| サイズ | 23x37x15mm ~1/30 PiKVM V4サイズ | 40x36x36mm ~1/7 PiKVM V4サイズ | 120x68x44mm | -![](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_2.jpg) +![NanoKVM PCB ピン配置](https://wiki.sipeed.com/hardware/zh/kvm/assets/NanoKVM/1_intro/NanoKVM_2.jpg) -## ハードウェアプラットフォーム NanoKVM +## NanoKVM ハードウェアプラットフォーム NanoKVMはSipeed [LicheeRV Nano](https://wiki.sipeed.com/hardware/zh/lichee/RV_Nano/1_intro.html)に基づいており、仕様、回路図、寸法図は[こちら](http://cn.dl.sipeed.com/shareURL/LICHEE/LicheeRV_Nano)で確認できます。 @@ -69,12 +82,41 @@ NanoKVM LiteはLicheeRV NanoとHDMItoCSIボードで構成され、NanoKVM FULL NanoKVMイメージはLicheeRV Nano SDKおよびMaixCDKに基づいて構築されており、LicheeRV Nanoを使用する資料と互換性があります。逆に、KVMソフトウェアはLicheeRV Nanoや他のSG2002製品では使用できません。LicheeRV NanoやMaixCamでHDMI入力アプリケーションを構築したい場合は、技術サポートを受けるためにお問い合わせください。 -注:SG2002の256MBメモリのうち、現在105MBがマルチメディアサブシステムに割り当てられており、NanoKVMはビデオ画像の取得と処理にこのメモリを使用します。 +注:SG2002の256MBメモリのうち、現在158MBがマルチメディアサブシステムに割り当てられており、NanoKVMはビデオ画像の取得と処理にこのメモリを使用します。 + [NanoKVM-A 回路図](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_RV_Nano_KVM_A_30111.pdf) + [NanoKVM-B 回路図](https://cn.dl.sipeed.com/fileList/KVM/nanoKVM/HDK/02_Schematic/SCH_HDMI_MIPI_31011.pdf) + [NanoKVM イメージダウンロード](https://github.com/sipeed/NanoKVM/releases/tag/NanoKVM) +## ロードマップ + +### Q1 2025 + +**改善:** + +- [x] HDMI モジュールをリファクタリングし、libmaixcam_lib.so の依存関係を削除 +- [x] SSH をデフォルトで無効にし、Web UI に有効/無効の切り替えを追加 +- [x] Tailscale をデフォルトで無効にし、Web UI に有効/無効の切り替えを追加 +- [x] 設定ファイルに JWT 設定オプションを追加 +- [x] bcrypt を利用したパスワードストレージのセキュリティ保護 + +**配布:** + +- [x] GitHub 経由でのアプリケーション配布 +- [x] オンラインでの更新の際に整合性チェックを実施 +- [ ] オフラインでの更新をサポート + +**バグ修正:** + +- [x] DNS の問題を修正 +- [x] CSRF の脆弱性を修正 + +**機能** + +- [ ] [79](https://github.com/sipeed/NanoKVM/issues/79) Zerotier をサポート +- [ ] [99](https://github.com/sipeed/NanoKVM/issues/99) WireGuard をサポート +- [ ] [249](https://github.com/sipeed/NanoKVM/issues/249) Mouse Jiggler を追加 + ## 購入方法 * [Aliexpress(グローバル、米国とロシアを除く)](https://www.aliexpress.com/item/1005007369816019.html) diff --git a/README_ZH.md b/README_ZH.md index a4f0730..502d2b1 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -6,8 +6,9 @@ NanoKVM ![](https://wiki.sipeed.com/hardware/assets/NanoKVM/introduce/NanoKVM_3.png)

- 快速开始 | - 硬件资料 + Quick Start + | + Hardware

[English](./README.md) | 中文 | [日本語](./README_JA.md) @@ -17,6 +18,47 @@ NanoKVM > Your NanoKVM Power by RISC-V ! > 如果您在使用过程中有任何问题或建议,请在这里提交 issue, 或在 [MaixHub Discussion](https://maixhub.com/discussion/nanokvm)告诉我们. +## 开源与贡献 + +### 2025.03.04 更新内容 ++ 更新目录结构 + +``` shell +├── kvmapp # APP更新包 +│ ├── jpg_stream # 兼容从非常老的版本中直接更新 +│ ├── kvm_new_app # 触发 kvm_system 更新必要组件 +│ ├── kvm_system # kvm_system 应用 +│ ├── server # NanoKVM 前后端应用 +│ └── system # 必要系统组件 +├── server # NanoKVM 后端 +├── support # 辅助功能(图像子系统、系统状态、系统更新、屏幕、按键……) +│ ├── sg2002 # NanoKVM-Lite/Full/PCIe +│ └── h618 # NanoKVM-Pro +├── web # NanoKVM 前端 +├── LICENSE +├── README_JA.md +├── README.md +├── README_ZH.md +└── CHANGELOG.md +``` + ++ 添加 NanoKVM app安装包`kvmapp` ++ 添加编译脚本和编译说明 + +### 2025.02.19 更新内容 +所有 NanoKVM 组件已开源,包括 +[前端](https://github.com/sipeed/NanoKVM/tree/main/web)、[后端](https://github.com/sipeed/NanoKVM/tree/main/server)、[kvm_vision](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm)、[kvm_mmf](https://github.com/sipeed/NanoKVM/tree/main/vision/components/kvm_mmf)、[kvm_system](https://github.com/sipeed/NanoKVM/tree/main/support)、[kvmapp 更新包](https://github.com/sipeed/NanoKVM-System/tree/main/kvmapp)、[系统 SDK](https://github.com/sipeed/LicheeRV-Nano-Build/tree/NanoKVM) 和 [固件打包方法](https://github.com/sipeed/LicheeRV-Nano-Build/blob/NanoKVM/kvm/NanoKVM_img.sh)。 + +### 2025.02.14 更新内容 +最新的 APP v2.1.6 添加了大多数安全增强和 bug 修复,建议普通用户升级到此版本或更新版本。 + +### 2025.02.05 更新内容 +对于关注安全的用户,可以阅读此问题:https://github.com/sipeed/NanoKVM/issues/301,您会找到有关所有安全问题的解释。GitHub 作为一个开放和透明的平台,为讨论所谓的“后门”担忧提供了空间。开源使产品更加安全! + +### 2024.10.18 更新内容 +我们在 10.8 中开源了后端代码,感谢您立即提交的文明 PR,我们将赠送您最新的 NanoKVM-PCIe 作为奖励! +十月中旬的批次正在开始测试和打包,大多数在 10.1 之前的订单将在下周和下下周发货。 +自 10.1 起,AliExpress 的发货日期已更改为 12 月,这是一个保守的交货时间。十月的订单应在 11.15~12.15 期间发出。 ## 简介 diff --git a/kvmapp/jpg_stream/S95nanokvm b/kvmapp/jpg_stream/S95nanokvm new file mode 100755 index 0000000..056508f --- /dev/null +++ b/kvmapp/jpg_stream/S95nanokvm @@ -0,0 +1,91 @@ +#!/bin/sh +# nanokvm Rev2.1 + +case "$1" in + start) + echo -n kvm > /boot/hostname.prefix + cp /mnt/data/sensor_cfg.ini.LT /mnt/data/sensor_cfg.ini + + str_value=$(cat /sys/class/cvi-base/base_uid | awk '{print $2}') + first_uint=$(echo $str_value | cut -d'_' -f1) + second_uint=$(echo $str_value | cut -d'_' -f2) + result="$first_uint$second_uint" + echo $result > /device_key + + # if [ ! -e /etc/kvm/hw ] + # then + + # fi + + # echo 504 > /sys/class/gpio/export # pwr led + # echo 505 > /sys/class/gpio/export # hdd led + # echo 503 > /sys/class/gpio/export # pwr key + # echo 507 > /sys/class/gpio/export # rst key + + # echo in > /sys/class/gpio/gpio504/direction # pwr led + # echo in > /sys/class/gpio/gpio505/direction # hdd led + # echo out > /sys/class/gpio/gpio503/direction # pwr key + # echo out > /sys/class/gpio/gpio507/direction # rst key + + iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT + iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT + iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT + iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT + iptables -A OUTPUT -o eth0 -p tcp --sport 8000 -m state --state ESTABLISHED -j DROP + + cp -r /kvmapp/kvm_system /tmp/ + /tmp/kvm_system/kvm_system & + + # if [ -e /kvmapp/kvm_stream ] + # then + # cp -r /kvmapp/kvm_stream /tmp/ + # /tmp/kvm_stream/kvm_stream & + # fi + + cp -r /kvmapp/server /tmp/ + /tmp/server/NanoKVM-Server & + ;; + stop) + killall kvm_system + # killall kvm_stream + killall NanoKVM-Server + rm -r /tmp/kvm_system + # rm -r /tmp/kvm_stream + rm -r /tmp/server + echo "OK" + ;; + # restart_stream) + # killall kvm_stream + # rm -r /tmp/kvm_stream + # if [ -e /kvmapp/kvm_stream ] + # then + # cp -r /kvmapp/kvm_stream /tmp/ + # /tmp/kvm_stream/kvm_stream & + # echo "OK" + # fi + # ;; + restart) + killall kvm_system + # killall kvm_stream + killall NanoKVM-Server + rm -r /tmp/kvm_system + # rm -r /tmp/kvm_stream + rm -r /tmp/server + + cp -r /kvmapp/kvm_system /tmp/ + /tmp/kvm_system/kvm_system & + + # if [ -e /kvmapp/kvm_stream ] + # then + # cp -r /kvmapp/kvm_stream /tmp/ + # /tmp/kvm_stream/kvm_stream & + # fi + + cp -r /kvmapp/server /tmp/ + /tmp/server/NanoKVM-Server & + + sync + + echo "OK" + ;; +esac \ No newline at end of file diff --git a/kvmapp/jpg_stream/jpg_stream b/kvmapp/jpg_stream/jpg_stream new file mode 100755 index 0000000..1a0030f --- /dev/null +++ b/kvmapp/jpg_stream/jpg_stream @@ -0,0 +1,5 @@ +rm /etc/init.d/S95webkvm +cp /kvmapp/jpg_stream/S95nanokvm /etc/init.d/ +cp /kvmapp/jpg_stream/dl_lib/libmaixcam_lib.so /kvmapp/kvm_system/dl_lib +rm -r /kvmapp/jpg_stream +/etc/init.d/S95nanokvm restart diff --git a/support/kvm_system/README.md b/kvmapp/kvm_new_app similarity index 100% rename from support/kvm_system/README.md rename to kvmapp/kvm_new_app diff --git a/support/kvm_system/main/Kconfig b/kvmapp/kvm_system/kvm_stream old mode 100644 new mode 100755 similarity index 100% rename from support/kvm_system/main/Kconfig rename to kvmapp/kvm_system/kvm_stream diff --git a/kvmapp/system/init.d/S01fs b/kvmapp/system/init.d/S01fs new file mode 100755 index 0000000..3391d66 --- /dev/null +++ b/kvmapp/system/init.d/S01fs @@ -0,0 +1,42 @@ +#!/bin/sh + +if [ "$1" = "start" ] +then + # use all sdcard free space for data + parted -s /dev/mmcblk0 "resizepart 2 -0" + echo "yes + 8192MB + " | parted ---pretend-input-tty /dev/mmcblk0 "resizepart 2 8192MB" + # resize data filesystem + (resize2fs /dev/mmcblk0p2) & + + + . /etc/profile + printf "mounting filesystem : " + mkdir -p /boot + mount -t vfat /dev/mmcblk0p1 /boot + mount -t configfs configfs /sys/kernel/config + mount -t debugfs debugfs /sys/kernel/debug + + if [ -e /boot/usb.disk0 ] + then + if [ ! -e /etc/kvm.disk0 ] + then + touch /etc/kvm.disk0 + # use all sdcard free space for data + parted -s /dev/mmcblk0 "mkpart primary 8193MB 100%" + sleep 1 + # resize data filesystem + (mkfs.exfat /dev/mmcblk0p3) & + sleep 1 + fi + fi + + if [ -e /dev/mmcblk0p3 ] + then + mkdir -p /data + mount /dev/mmcblk0p3 /data + fi + + echo "OK" +fi diff --git a/kvmapp/system/init.d/S03usbdev b/kvmapp/system/init.d/S03usbdev new file mode 100755 index 0000000..f38cbd6 --- /dev/null +++ b/kvmapp/system/init.d/S03usbdev @@ -0,0 +1,139 @@ +#!/bin/sh +# kvmhwd Rev2.0 + +start_usb_dev(){ + . /etc/profile + echo "usb mode: device" + cd /sys/kernel/config/usb_gadget + + mkdir g0 + cd g0 + + echo 0x3346 > idVendor + echo 0x1009 > idProduct + mkdir strings/0x409 + echo '0123456789ABCDEF' > strings/0x409/serialnumber + echo 'sipeed' > strings/0x409/manufacturer + echo 'NanoKVM' > strings/0x409/product + + mkdir configs/c.1 + echo 0xE0 > configs/c.1/bmAttributes + echo 120 > configs/c.1/MaxPower + mkdir configs/c.1/strings/0x409 + echo "NanoKVM" > configs/c.1/strings/0x409/configuration + + if [ -e /boot/usb.ncm ] + then + mkdir functions/ncm.usb0 + ln -s functions/ncm.usb0 configs/c.1/ + else + if [ -e /boot/usb.rndis0 ] + then + mkdir functions/rndis.usb0 + ln -s functions/rndis.usb0 configs/c.1/ + fi + fi + + if [ ! -e /boot/disable_hid ] + then + # keyboard + mkdir functions/hid.GS0 + if [ -e /boot/BIOS ] + then + echo 1 > functions/hid.GS0/subclass + fi + if [ ! -e /boot/usb.notwakeup ] + then + echo 1 > functions/hid.GS0/wakeup_on_write + fi + echo 1 > functions/hid.GS0/protocol + echo 6 > functions/hid.GS0/report_length + echo -ne \\x05\\x01\\x09\\x06\\xa1\\x01\\x05\\x07\\x19\\xe0\\x29\\xe7\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x08\\x81\\x02\\x95\\x01\\x75\\x08\\x81\\x03\\x95\\x05\\x75\\x01\\x05\\x08\\x19\\x01\\x29\\x05\\x91\\x02\\x95\\x01\\x75\\x03\\x91\\x03\\x95\\x06\\x75\\x08\\x15\\x00\\x25\\x65\\x05\\x07\\x19\\x00\\x29\\x65\\x81\\x00\\xc0 > functions/hid.GS0/report_desc + ln -s functions/hid.GS0 configs/c.1 + + # mouse + mkdir functions/hid.GS1 + if [ -e /boot/BIOS ] + then + echo 1 > functions/hid.GS1/subclass + fi + if [ ! -e /boot/usb.notwakeup ] + then + echo 1 > functions/hid.GS1/wakeup_on_write + fi + echo 2 > functions/hid.GS1/protocol + echo -ne \\x34 > functions/hid.GS1/report_length + echo -ne \\x5\\x1\\x9\\x2\\xa1\\x1\\x9\\x1\\xa1\\x0\\x5\\x9\\x19\\x1\\x29\\x3\\x15\\x0\\x25\\x1\\x95\\x3\\x75\\x1\\x81\\x2\\x95\\x1\\x75\\x5\\x81\\x3\\x5\\x1\\x9\\x30\\x9\\x31\\x9\\x38\\x15\\x81\\x25\\x7f\\x75\\x8\\x95\\x3\\x81\\x6\\xc0\\xc0 > functions/hid.GS1/report_desc + ln -s functions/hid.GS1 configs/c.1 + + # touchpad + mkdir functions/hid.GS2 + if [ -e /boot/BIOS ] + then + echo 1 > functions/hid.GS2/subclass + fi + if [ ! -e /boot/usb.notwakeup ] + then + echo 1 > functions/hid.GS2/wakeup_on_write + fi + echo 2 > functions/hid.GS2/protocol + echo 6 > functions/hid.GS2/report_length + echo -ne \\x05\\x01\\x09\\x02\\xa1\\x01\\x09\\x01\\xa1\\x00\\x05\\x09\\x19\\x01\\x29\\x03\\x15\\x00\\x25\\x01\\x95\\x03\\x75\\x01\\x81\\x02\\x95\\x01\\x75\\x05\\x81\\x01\\x05\\x01\\x09\\x30\\x09\\x31\\x15\\x00\\x26\\xff\\x7f\\x35\\x00\\x46\\xff\\x7f\\x75\\x10\\x95\\x02\\x81\\x02\\x05\\x01\\x09\\x38\\x15\\x81\\x25\\x7f\\x35\\x00\\x45\\x00\\x75\\x08\\x95\\x01\\x81\\x06\\xc0\\xc0 > functions/hid.GS2/report_desc + ln -s functions/hid.GS2 configs/c.1 + fi + + if [ -e /boot/usb.disk0 ] + then + mkdir functions/mass_storage.disk0 + ln -s functions/mass_storage.disk0 configs/c.1/ + echo 1 > functions/mass_storage.disk0/lun.0/removable + if [ -e /boot/usb.disk0.ro ] + then + echo 1 > functions/mass_storage.disk0/lun.0/ro + echo 0 > functions/mass_storage.disk0/lun.0/cdrom + fi + disk=$(cat /boot/usb.disk0) + if [ -z "${disk}" ] + then + # if [ ! -e /mnt/usbdisk.img ] + # then + # fallocate -l 8G /mnt/usbdisk.img + # mkfs.vfat /mnt/usbdisk.img + # fi + echo /dev/mmcblk0p3 > functions/mass_storage.disk0/lun.0/file + else + cat /boot/usb.disk0 > functions/mass_storage.disk0/lun.0/file + fi + fi + + ls /sys/class/udc/ | cat > UDC + echo device > /proc/cviusb/otg_role +} + +start_usb_host(){ + echo '' > /sys/kernel/config/usb_gadget/g0/UDC + echo host > /proc/cviusb/otg_role +} + +restart_usb_dev(){ + echo > /sys/kernel/config/usb_gadget/g0/UDC + sleep 1 + ls /sys/class/udc/ | cat > /sys/kernel/config/usb_gadget/g0/UDC + echo "USB Restart OK!" +} + +case "$1" in + start) + start_usb_dev + ;; + restart) + restart_usb_dev + ;; + stop) + start_usb_host + ;; + stop_start) + start_usb_host + start_usb_dev + ;; +esac diff --git a/kvmapp/system/init.d/S15kvmhwd b/kvmapp/system/init.d/S15kvmhwd new file mode 100755 index 0000000..0b414e6 --- /dev/null +++ b/kvmapp/system/init.d/S15kvmhwd @@ -0,0 +1,209 @@ +#!/bin/sh +# kvmhwd Rev2.3 + +Alpha_OLED_RST_Pin=371 +Beta_OLED_RST_Pin=502 +Beta_OLED_SCL=595 +Beta_OLED_SDA=507 +WiFi_EN_Pin=506 +Alpha_PWR_LED_Pin=504 +Alpha_HDD_LED_Pin=505 +Alpha_PWR_KEY_Pin=503 +Alpha_RST_KEY_Pin=507 +Beta_PWR_LED_Pin=504 +Beta_PWR_KEY_Pin=503 +Beta_RST_KEY_Pin=505 +PCIe_HDMI_RST_Pin=451 + +init_alpha_hw(){ + devmem 0x030010D0 32 0x2 # I2C1_SCL + devmem 0x030010DC 32 0x2 # I2C1_SDA + devmem 0x030010D4 32 0x3 # OLED_RST + devmem 0x0300103C 32 0x3 # GPIOA15 + devmem 0x03001050 32 0x3 # GPIOA22 + devmem 0x0300105C 32 0x3 # GPIOA23 + devmem 0x03001060 32 0x3 # GPIOA24 + devmem 0x03001054 32 0x3 # GPIOA25 + devmem 0x03001058 32 0x3 # GPIOA27 + + devmem 0x03001068 32 0x6 # GPIOA 18 UART1 RX + devmem 0x03001064 32 0x6 # GPIOA 19 UART1 TX + devmem 0x03001070 32 0x2 # GPIOA 28 UART2 TX + devmem 0x03001074 32 0x2 # GPIOA 29 UART2 RX + + echo ${Alpha_OLED_RST_Pin} > /sys/class/gpio/export # OLED_RST + echo out > /sys/class/gpio/gpio${Alpha_OLED_RST_Pin}/direction + echo 1 > /sys/class/gpio/gpio${Alpha_OLED_RST_Pin}/value + + echo ${Alpha_PWR_LED_Pin} > /sys/class/gpio/export # pwr led + echo ${Alpha_HDD_LED_Pin} > /sys/class/gpio/export # hdd led + echo ${Alpha_PWR_KEY_Pin} > /sys/class/gpio/export # pwr key + echo ${Alpha_RST_KEY_Pin} > /sys/class/gpio/export # rst key + + echo in > /sys/class/gpio/gpio${Alpha_PWR_LED_Pin}/direction # pwr led + echo in > /sys/class/gpio/gpio${Alpha_HDD_LED_Pin}/direction # hdd led + echo out > /sys/class/gpio/gpio${Alpha_PWR_KEY_Pin}/direction # pwr key + echo out > /sys/class/gpio/gpio${Alpha_RST_KEY_Pin}/direction # rst key + + rmmod /mnt/system/ko/i2c-gpio.ko + rmmod /mnt/system/ko/i2c-algo-bit.ko + + # rm /etc/init.d/S25wifimod + # rm /etc/init.d/S30wifi +} + +init_beta_pcie_hw(){ + devmem 0x0300103C 32 0x3 # GPIOA15 + devmem 0x03001050 32 0x3 # GPIOA22 + devmem 0x0300105C 32 0x3 # GPIOA23 + devmem 0x03001060 32 0x3 # GPIOA24 + devmem 0x03001054 32 0x3 # GPIOA25 + devmem 0x03001058 32 0x3 # GPIOA27 + + devmem 0x030010E4 32 0x0 # SDIO CLK + devmem 0x030010E0 32 0x0 # SDIO CMD + devmem 0x030010DC 32 0x0 # SDIO D0 + devmem 0x030010D8 32 0x0 # SDIO D1 + devmem 0x030010D4 32 0x0 # SDIO D2 + devmem 0x030010D0 32 0x0 # SDIO D3 + + devmem 0x03001068 32 0x6 # GPIOA 18 UART1 RX + devmem 0x03001064 32 0x6 # GPIOA 19 UART1 TX + devmem 0x03001070 32 0x2 # GPIOA 28 UART2 TX + devmem 0x03001074 32 0x2 # GPIOA 29 UART2 RX + + echo ${Beta_OLED_RST_Pin} > /sys/class/gpio/export # Beta OLED_RST + echo out > /sys/class/gpio/gpio${Beta_OLED_RST_Pin}/direction + echo 1 > /sys/class/gpio/gpio${Beta_OLED_RST_Pin}/value + + echo ${Beta_PWR_LED_Pin} > /sys/class/gpio/export # pwr led + echo ${Beta_PWR_KEY_Pin} > /sys/class/gpio/export # pwr key + echo ${Beta_RST_KEY_Pin} > /sys/class/gpio/export # rst key + echo ${PCIe_HDMI_RST_Pin} > /sys/class/gpio/export # hdmi rst key + + echo in > /sys/class/gpio/gpio${Beta_PWR_LED_Pin}/direction # pwr led + echo out > /sys/class/gpio/gpio${Beta_PWR_KEY_Pin}/direction # pwr key + echo out > /sys/class/gpio/gpio${Beta_RST_KEY_Pin}/direction # rst key + echo out > /sys/class/gpio/gpio${PCIe_HDMI_RST_Pin}/direction # rst key + + echo 1 > /sys/class/gpio/gpio${PCIe_HDMI_RST_Pin}/value # rst key + + rmmod /mnt/system/ko/i2c-gpio.ko + rmmod /mnt/system/ko/i2c-algo-bit.ko + insmod /mnt/system/ko/i2c-algo-bit.ko + insmod /mnt/system/ko/i2c-gpio.ko +} + +kvm_hw_detect(){ + if [ ! -e /etc/kvm/hdmi_version ] + then + rm /etc/kvm/hw + fi + if [ -e /etc/kvm/hw ] + then + echo "/etc/kvm/hw exist" + else + echo "/etc/kvm/hw not exist" + if [ -d "/etc/kvm/" ] + then + echo "/etc/kvm/ exist" + else + mkdir /etc/kvm/ + fi + devmem 0x0300104C 32 0x3 # GPIOA26 / WiFi_EN + echo ${WiFi_EN_Pin} > /sys/class/gpio/export # WiFi_EN + echo out > /sys/class/gpio/gpio${WiFi_EN_Pin}/direction + echo 0 > /sys/class/gpio/gpio${WiFi_EN_Pin}/value + + devmem 0x0300103C 32 0x3 # GPIOA15 + devmem 0x03001050 32 0x3 # GPIOA22 + devmem 0x0300105C 32 0x3 # GPIOA23 + devmem 0x03001060 32 0x3 # GPIOA24 + devmem 0x03001054 32 0x3 # GPIOA25 + devmem 0x03001058 32 0x3 # GPIOA27 + + devmem 0x030010D0 32 0x2 # I2C1_SCL + devmem 0x030010DC 32 0x2 # I2C1_SDA + devmem 0x030010D4 32 0x3 # OLED_RST + echo ${Alpha_OLED_RST_Pin} > /sys/class/gpio/export # OLED_RST + echo out > /sys/class/gpio/gpio${Alpha_OLED_RST_Pin}/direction + echo 1 > /sys/class/gpio/gpio${Alpha_OLED_RST_Pin}/value + + kvm_tmp=$(i2cdetect -ry 1 0x3d 0x3d | grep 3d) + if [ -n "$kvm_tmp" ] + then + # alpha hw + echo "alpha" > /etc/kvm/hw + else + # beta/pcie hw + echo ${Alpha_OLED_RST_Pin} > /sys/class/gpio/unexport # OLED_RST + echo ${Beta_OLED_RST_Pin} > /sys/class/gpio/export # Beta_OLED_RST_Pin + echo out > /sys/class/gpio/gpio${Beta_OLED_RST_Pin}/direction + echo 1 > /sys/class/gpio/gpio${Beta_OLED_RST_Pin}/value + + rmmod /mnt/system/ko/i2c-gpio.ko + rmmod /mnt/system/ko/i2c-algo-bit.ko + insmod /mnt/system/ko/i2c-algo-bit.ko + insmod /mnt/system/ko/i2c-gpio.ko + + kvm_tmp=$(i2cdetect -ry 4 0x2c 0x2c | grep 2c) + if [ -n "$kvm_tmp" ] + then + echo "c" > /etc/kvm/hdmi_version + else + echo "u" > /etc/kvm/hdmi_version + fi + + kvm_tmp=$(i2cdetect -ry 5 0x3c 0x3c | grep 3c) + if [ -n "$kvm_tmp" ] + then + echo "pcie" > /etc/kvm/hw + sync + reboot + else + echo "beta" > /etc/kvm/hw + # rm /etc/init.d/S25wifimod + # rm /etc/init.d/S30wifi + sync + fi + + echo 1 > /sys/class/gpio/gpio${WiFi_EN_Pin}/value + echo ${WiFi_EN_Pin} > /sys/class/gpio/unexport # WiFi_EN + fi + fi + sync +} + +kvm_hw_init(){ + FIND_FILE="/etc/kvm/hw" + if [ `grep -c "alpha" $FIND_FILE` -ne '0' ] + then + echo "hw = alpha!" + init_alpha_hw + fi + if [ `grep -c "beta" $FIND_FILE` -ne '0' ] + then + echo "hw = beta!" + init_beta_pcie_hw + fi + if [ `grep -c "pcie" $FIND_FILE` -ne '0' ] + then + echo "hw = pcie!" + init_beta_pcie_hw + fi +} + +case "$1" in + start) + kvm_hw_detect + kvm_hw_init + ;; + re-detect) + rm /etc/kvm/hw + kvm_hw_detect + kvm_hw_init + ;; + re-init) + kvm_hw_init + ;; +esac diff --git a/kvmapp/system/init.d/S30eth b/kvmapp/system/init.d/S30eth new file mode 100755 index 0000000..92928e4 --- /dev/null +++ b/kvmapp/system/init.d/S30eth @@ -0,0 +1,115 @@ +#!/bin/sh + +. /etc/profile + +# /boot/eth.nodhcp for example +# ipaddr/net gw[optional] +# 192.168.0.101/24 192.168.0.1 +# 192.168.3.116/22 + +RESERVE_INET="192.168.0.1/24" + +start() { + printf "start ethernet: " + if [ -e /boot/eth.nodhcp ] + then + [ -e /boot/eth.nodhcp ] && + cat /boot/eth.nodhcp | while read inet gw + do + addr=${inet%/*} + netid=${inet#*/} + [ -z $gw ] && + gw=$( echo $addr| ( IFS='.' read a b c d; echo $(( + (((((($a<<8)+$b)<<8)+$c)<<8)+$d) + & (((1<<$netid)-1)<<(32-$netid)) + )) + )) && + gw=$(($gw>>24&0xff)).$(($gw>>16&0xff)).$(($gw>>8&0xff)).$((1+( $gw>>0&0xff ))) + + arping -Dqc2 -Ieth0 $addr || continue + ip a add $inet brd + dev eth0 + ip r add default via $gw dev eth0 + cat > /etc/resolve.conf << EOF +nameserver $gw +nameserver 8.8.8.8 +nameserver 114.114.114.114 +EOF + break + done && + ip a show dev eth0|grep inet || ( + udhcpc -i eth0 -t 3 -T 1 -A 5 -b -p /run/udhcpc.eth0.pid &>/dev/null + ip a show dev eth0|grep inet + ) || ( + # failed to apply dynamic addr, need a available static addr to visit the LAN + inet=$RESERVE_INET + addr=${inet%/*} + ip a add $inet brd + dev eth0 + ) || exit 1 + else + (udhcpc -i eth0 -t 10 -T 1 -A 5 -b -p /run/udhcpc.eth0.pid) & + fi + + echo "OK" +} +stop() { + [[ ! -e "/run/udhcpc.eth0.pid" ]] && echo "udhcpc is not running..." && exit 1 + kill `cat /run/udhcpc.eth0.pid` + rm /run/udhcpc.eth0.pid +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + $0 stop + $0 start + ;; + doc) + cat < /etc/wpa_supplicant.conf + wpa_passphrase "$ssid" "$pass" >> /etc/wpa_supplicant.conf + wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf + if [ ! -e /boot/wifi.nodhcp ] + then + (udhcpc -i wlan0 -t 10 -T 1 -A 5 -b -p /run/udhcpc.wlan0.pid) & + fi +} + +ap_start() { + echo "wifi mode: ap" + id2=$(printf "%d" 0x$(sha512sum /sys/class/cvi-base/base_uid | head -c 2)) + id3=$(printf "%d" 0x$(sha512sum /sys/class/cvi-base/base_uid | head -c 4 | tail -c 2)) + if [ "$id2" = "$id3" ] + then + id2=$((id2 + 1)) + fi + if [ "$id2" -ge 255 ] + then + id2=253 + fi + if [ "$id3" -ge 255 ] + then + id3=254 + fi + ssid="" + pass="" + if [ -e /kvmapp/kvm/ap.ssid ] + then + ssid=`cat /kvmapp/kvm/ap.ssid` + fi + if [ -e /kvmapp/kvm/ap.pass ] + then + pass=`cat /kvmapp/kvm/ap.pass` + fi + gen_hostapd_conf "$ssid" "$pass" > /etc/hostapd.conf + ipv4_prefix=10.$id3.$id2 + if [ ! -e /etc/udhcpd.wlan0.conf ] + then + gen_udhcpd_conf wlan0 "${ipv4_prefix}" > /etc/udhcpd.wlan0.conf + fi + # gen_dnsmasq_conf "${ipv4_prefix}" > /etc/dnsmasq.conf + + # iptables --policy INPUT ACCEPT + # iptables --policy FORWARD ACCEPT + # iptables --policy OUTPUT ACCEPT + # iptables -F + # iptables -t nat -F + # iptables -t nat -A PREROUTING -i wlan0 -p udp --dport 53 -j DNAT --to ${ipv4_prefix}.1 + + ifconfig wlan0 up + ip route del default || true + ip add flush dev wlan0 + ip addr add $ipv4_prefix.1/24 dev wlan0 + # dnsmasq --pid-file=/tmp/dnsmasq.run -C /etc/dnsmasq.conf + hostapd -B -i wlan0 /etc/hostapd.conf + udhcpd -S /etc/udhcpd.wlan0.conf +} + +stop() { + ps -ef|grep hostapd|grep -v grep|awk '{print $1}'|xargs kill -2 || true + ps -ef|grep "udhcpd -S /etc/udhcpd.wlan0.conf" |grep -v grep|awk '{print $1}'|xargs kill -2 || true + killall wpa_supplicant || true + if [ -e /run/udhcpc.wlan0.pid ] + then + kill `cat /run/udhcpc.wlan0.pid` || true + rm -f /run/udhcpc.wlan0.pid + fi + if [ -e /var/run/udhcpd.wlan0.pid ] + then + kill `cat /var/run/udhcpd.wlan0.pid` || true + rm -f /var/run/udhcpd.wlan0.pid + fi + if [ -e /tmp/dnsmasq.run ] + then + kill `cat /tmp/dnsmasq.run` || true + rm -f /tmp/dnsmasq.run + fi + # if [ -e /etc/wpa_supplicant.conf] + # then + # echo > /etc/wpa_supplicant.conf + # fi + airmon-ng stop wlan0mon || true +} + +restart() { + stop + start +} + +if [ "${1}" = "start" ] +then + start +elif [ "${1}" = "stop" ] +then + stop +elif [ "${1}" = "ap" ] +then + stop + ap_start +elif [ "${1}" = "restart" ] +then + restart +fi diff --git a/kvmapp/system/init.d/S50ssdpd b/kvmapp/system/init.d/S50ssdpd new file mode 100755 index 0000000..480769b --- /dev/null +++ b/kvmapp/system/init.d/S50ssdpd @@ -0,0 +1,49 @@ +#!/bin/sh + +DAEMON=ssdpd +PIDFILE=/var/run/$DAEMON.pid +CFGFILE=/etc/default/$DAEMON + +DAEMON_ARGS="" + +# Read configuration variable file if it is present +# shellcheck source=/dev/null +[ -r "$CFGFILE" ] && . "$CFGFILE" + +# shellcheck disable=SC2086 +start() { + printf 'Starting %s: ' "$DAEMON" + if start-stop-daemon -S -q -p "$PIDFILE" -x "$DAEMON" -- $DAEMON_ARGS; then + echo "OK" + else + echo "FAIL" + fi +} + +stop() { + printf 'Stopping %s: ' "$DAEMON" + if start-stop-daemon -K -q -p "$PIDFILE" -x "$DAEMON"; then + echo "OK" + else + echo "FAIL" + fi +} + +restart() { + stop + start +} + +case "$1" in + start|stop|restart) + "$1" + ;; + reload) + restart + ;; + *) + echo "Usage: $0 {start|stop|restart|reload}" + exit 1 +esac + +exit $? \ No newline at end of file diff --git a/kvmapp/system/init.d/S50sshd b/kvmapp/system/init.d/S50sshd new file mode 100755 index 0000000..b2981e9 --- /dev/null +++ b/kvmapp/system/init.d/S50sshd @@ -0,0 +1,69 @@ +#!/bin/sh +# +# sshd Starts sshd. +# + +# Make sure the ssh-keygen progam exists +[ -f /usr/bin/ssh-keygen ] || exit 0 + +umask 077 + +startssh() { + /usr/bin/ssh-keygen -A + + printf "Starting sshd: " + /usr/sbin/sshd + touch /var/lock/sshd + echo "OK" +} +start() { + # Create any missing keys + if [ -e /etc/kvm/ssh_stop ] + then + if [ -e /boot/start_ssh_once ] + then + rm /boot/start_ssh_once + startssh + else + echo "SSH does not start" + fi + else + startssh + fi +} +stop() { + printf "Stopping sshd: " + killall sshd + rm -f /var/lock/sshd + echo "OK" +} +restart() { + stop + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + restart + ;; + permanent_on) + rm /etc/kvm/ssh_stop + start + ;; + permanent_off) + touch /etc/kvm/ssh_stop + stop + ;; + *) + echo "Usage: $0 {start|stop|restart|permanent_on|permanent_off}" + exit 1 +esac + +exit $? + diff --git a/kvmapp/system/init.d/S95nanokvm b/kvmapp/system/init.d/S95nanokvm new file mode 100755 index 0000000..b480a52 --- /dev/null +++ b/kvmapp/system/init.d/S95nanokvm @@ -0,0 +1,50 @@ +#!/bin/sh +# nanokvm Rev3.0 + +case "$1" in + start) + echo -n kvm > /boot/hostname.prefix + cp /mnt/data/sensor_cfg.ini.LT /mnt/data/sensor_cfg.ini + + str_value=$(cat /sys/class/cvi-base/base_uid | awk '{print $2}') + first_uint=$(echo $str_value | cut -d'_' -f1) + second_uint=$(echo $str_value | cut -d'_' -f2) + result="$first_uint$second_uint" + echo $result > /device_key + + iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT + iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT + iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT + iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT + iptables -A OUTPUT -o eth0 -p tcp --sport 8000 -m state --state ESTABLISHED -j DROP + + cp -r /kvmapp/kvm_system /tmp/ + /tmp/kvm_system/kvm_system & + + cp -r /kvmapp/server /tmp/ + /tmp/server/NanoKVM-Server & + ;; + stop) + killall kvm_system + killall NanoKVM-Server + rm -r /tmp/kvm_system + rm -r /tmp/server + echo "OK" + ;; + restart) + killall kvm_system + killall NanoKVM-Server + rm -r /tmp/kvm_system + rm -r /tmp/server + + cp -r /kvmapp/kvm_system /tmp/ + /tmp/kvm_system/kvm_system & + + cp -r /kvmapp/server /tmp/ + /tmp/server/NanoKVM-Server & + + sync + + echo "OK" + ;; +esac \ No newline at end of file diff --git a/kvmapp/system/init.d/S98tailscaled b/kvmapp/system/init.d/S98tailscaled new file mode 100755 index 0000000..0ec3631 --- /dev/null +++ b/kvmapp/system/init.d/S98tailscaled @@ -0,0 +1,114 @@ +#!/bin/sh + +DAEMON="tailscaled" +PIDFILE="/var/run/$DAEMON.pid" + +# Set the port to listen on for incoming VPN packets. +# Remote nodes will automatically be informed about the new port number, +# but you might want to configure this in order to set external firewall +# settings. +PORT="41641" + +# Extra flags you might want to pass to tailscaled. +FLAGS="" + +# You need tailscaled at /usr/sbin to server, and tailscale at /usr/bin to operate +# STATIC version needed. Download page at https://pkgs.tailscale.com/stable/#static +PKG_URL_LATEST="https://pkgs.tailscale.com/stable/tailscale_latest_riscv64.tgz" +[ ! -x /usr/sbin/$DAEMON ] && + echo "/usr/sbin/$DAEMON not found, please download it from $PKG_URL_LATEST" && + echo "Then unpack it, copy $DAEMON to /usr/sbin and copy tailscale to /usr/bin" && + exit 1 +VERSION=$(/usr/sbin/$DAEMON --version|sed -n '1p'|xargs echo -n) + +[ -x /usr/bin/tailscale ] || echo "/usr/bin/tailscale not found, your installation of tailscale may be broken" + +# just for those need forwarding +[ ! -f /etc/sysctl.d/99-tailscale.conf ] && + mkdir -p /etc/sysctl.d/ && + echo "missing /etc/sysctl.d/99-tailscale.conf, try make it below:" && + (tee /etc/sysctl.d/99-tailscale.conf </dev/null + [ $? = 0 ] && echo "OK" || echo "FAIL" + ;; + restart|reload) + $0 stop + $0 start + ;; + doc) + cat < ファイルのアップロードには SSH が必要です。Web 設定で有効にしてください: `設定 > SSH` + +1. [GitHub](https://github.com/sipeed/NanoKVM/releases) から最新のアプリケーションをダウンロードします。 +2. ダウンロードしたファイルを解凍し、解凍したフォルダーの名前を `kvmapp` に変更します。 +3. NanoKVM 上の既存の `/kvmapp` ディレクトリをバックアップし、新しい `kvmapp` フォルダーに置き換えます。 +4. NanoKVM で `/etc/init.d/S95nanokvm restart` を実行してサービスを再起動します。 diff --git a/support/README.md b/support/README.md index 03b8c96..2ec9912 100644 --- a/support/README.md +++ b/support/README.md @@ -1,8 +1,5 @@ -## If you want to compile kvm_system yourself, please follow the steps below: +# NanoKVM Support Instructions -1. Clone the MaixCDK repository: `git clone https://github.com/sipeed/MaixCDK.git` -2. Improve the Compilation Environment, refer to [here](https://github.com/sipeed/MaixCDK/tree/main/docs/doc_zh#%E5%BF%AB%E9%80%9F%E5%BC%80%E5%A7%8B) -3. Copy `./kvm_system` to `~/MaixCDK` and open it in terminal -4. Execute `maixcdk build` and Select `maixcam` to complete the compilation -5. Replace `/kvmapp/kvm_system/kvm_system` in the NanoKVM system with `dist/kvm_system_release/kvm_system` -6. Execute: `/etc/init.d/S95nanokvm restart` on NanoKVM +`/support` contains auxiliary functions for NanoKVM, such as image subsystem, system status monitoring, system updates, screen key drivers, and a few system functions. + +Currently, NanoKVM is divided into two versions based on the main control chip: SG2002 (which includes NanoKVM-Lite/Full/PCIe) and H618 (including NanoKVM-Pro). Different chips have significantly different projects and compilation environments. To distinguish between them, they are stored separately in `/support/sg2002` and `/support/h618`. diff --git a/support/README_ZH.md b/support/README_ZH.md new file mode 100644 index 0000000..93faaee --- /dev/null +++ b/support/README_ZH.md @@ -0,0 +1,5 @@ +# NanoKVM support 说明 + +`/support`包含NanoKVM辅助性的功能,如图像子系统、系统状态监控、系统更新、屏幕按键驱动和少部分的系统功能 + +当前 NanoKVM 根据主控芯片的不同分为两个版本:SG2002(包含NanoKVM-Lite/Full/PCIe)和H618(包括NanoKVM-Pro),不同的芯片有差异较大的工程和编译环境,为做区分,将它们分别存放在`/support/sg2002`和`/support/h618` diff --git a/support/sg2002/README.md b/support/sg2002/README.md new file mode 100644 index 0000000..2950be9 --- /dev/null +++ b/support/sg2002/README.md @@ -0,0 +1,26 @@ +# NanoKVM Support Instructions + +## Environment Preparation +1. NanoKVM-Lite/Full/PCIe is based on the SG2002 as the main control chip. The projects in the support section are compiled under the [MaixCDK](https://github.com/sipeed/MaixCDK) framework. Before compiling, please ensure that the `MaixCDK` environment is correctly configured. For configuration instructions, click [here](https://github.com/sipeed/MaixCDK/blob/main/docs/doc_zh/README.md). + +## kvm_system Compilation Instructions + +> The `kvm_system` is responsible for monitoring the NanoKVM system status, system updates, screen key drivers, and a few system functions, compiled with MaixCDK. + +1. Before compiling, please ensure that the above-mentioned `MaixCDK` environment is correctly configured. +2. Modify the paths of `MAIXCDK_PATH` and `NanoKVM_PATH` in `./build`. +3. Execute `./build kvm_system` to compile `kvm_system`. +4. Use `scp ./kvm_system/dist/kvm_system_release/kvm_system root@192.168.x.x:/kvmapp/kvm_system` to copy it to NanoKVM for testing. +5. Use `./build add_to_kvmapp` to place the executable file into the `/kvmapp` installation package. +6. Use `./build kvm_system clean` to clean the compilation of `kvm_system`. + +## kvm_vision Compilation Instructions + +> `kvm_vision` refers to the image acquisition and encoding subsystem of NanoKVM, compiled with MaixCDK to produce dynamic libraries for Go calls. Use `kvm_vision_test` to compile and test the dynamic library. + +1. Before compiling, please ensure that the above-mentioned `MaixCDK` environment is correctly configured. +2. Modify the paths of `MAIXCDK_PATH` and `NanoKVM_PATH` in `./build`. +3. Execute `./build kvm_vision` to compile `kvm_vision_test`. +4. You can test the dynamic libraries in `kvm_vision_test/dist/kvm_vision_test_release/dl_lib/`. +5. Use `./build add_to_kvmapp` to place the dynamic libraries into the `/kvmapp` installation package. +6. Use `./build kvm_vision clean` to clean the compilation of `kvm_vision`. \ No newline at end of file diff --git a/support/sg2002/README_ZH.md b/support/sg2002/README_ZH.md new file mode 100644 index 0000000..bf5c75d --- /dev/null +++ b/support/sg2002/README_ZH.md @@ -0,0 +1,26 @@ +# NanoKVM support 说明 + +## 环境准备 +1. NanoKVM-Lite/Full/PCIe 以SG2002为主控芯片,support 部分的工程在[MaixCDK](https://github.com/sipeed/MaixCDK) 框架下编译。编译前,请保证`MaixCDK`环境已正确配置,配置教程点击[这里](https://github.com/sipeed/MaixCDK/blob/main/docs/doc_zh/README.md) + +## kvm_system 编译说明 + +> `kvm_system` 负责 NanoKVM 系统状态监控、系统更新、屏幕按键驱动和少部分的系统功能,借助 MaixCDK 编译 + +1. 编译前,请保证上述 1.`MaixCDK`环境已正确配置 +2. 修改 `./build` 中 `MAIXCDK_PATH` 和 `NanoKVM_PATH`的路径 +3. 执行 `./build kvm_system` 编译 kvm_system +4. 使用 `scp ./kvm_system/dist/kvm_system_release/kvm_system root@192.168.x.x:/kvmapp/kvm_system` 拷贝入 NanoKVM 测试 +5. 使用 `./build add_to_kvmapp` 可以将可执行文件放入 `/kvmapp` 安装包内 +6. 使用 `./build kvm_system clean` 可以清除 kvm_system 的编译 + +## kvm_vision 编译说明 + +> `kvm_vision` 是 NanoKVM 图像获取编码子系统的统称,使用MaixCDK编译出动态库供Go调用,使用 `kvm_vision_test` 编译和测试动态库 + +1. 编译前,请保证上述 1.`MaixCDK`环境已正确配置 +2. 修改 `./build` 中 `MAIXCDK_PATH` 和 `NanoKVM_PATH`的路径 +3. 执行 `./build kvm_vision` 编译 kvm_vision_test +4. 可使用 `kvm_vision_test/dist/kvm_vision_test_release/dl_lib/` 中的动态库测试 +5. 使用 `./build add_to_kvmapp` 可以将动态库放入 `/kvmapp` 安装包内 +6. 使用 `./build kvm_vision clean` 可以清除 kvm_system 的编译 diff --git a/vision/components/kvm/CMakeLists.txt b/support/sg2002/additional/kvm/CMakeLists.txt similarity index 100% rename from vision/components/kvm/CMakeLists.txt rename to support/sg2002/additional/kvm/CMakeLists.txt diff --git a/vision/components/kvm/Kconfig b/support/sg2002/additional/kvm/Kconfig similarity index 100% rename from vision/components/kvm/Kconfig rename to support/sg2002/additional/kvm/Kconfig diff --git a/vision/components/kvm/include/kvm_vision.h b/support/sg2002/additional/kvm/include/kvm_vision.h similarity index 100% rename from vision/components/kvm/include/kvm_vision.h rename to support/sg2002/additional/kvm/include/kvm_vision.h diff --git a/vision/components/kvm/src/kvm_vision.cpp b/support/sg2002/additional/kvm/src/kvm_vision.cpp similarity index 100% rename from vision/components/kvm/src/kvm_vision.cpp rename to support/sg2002/additional/kvm/src/kvm_vision.cpp diff --git a/support/sg2002/additional/kvm_mmf/CMakeLists.txt b/support/sg2002/additional/kvm_mmf/CMakeLists.txt new file mode 100644 index 0000000..f98387c --- /dev/null +++ b/support/sg2002/additional/kvm_mmf/CMakeLists.txt @@ -0,0 +1,66 @@ + +list(APPEND ADD_REQUIREMENTS basic ini) +list(APPEND ADD_INCLUDE "include") + +# sophgo-middleware +set(middleware_src_path "${CMAKE_CURRENT_SOURCE_DIR}/../3rd_party/sophgo-middleware/sophgo-middleware") + + +set(source_dir "src") +append_srcs_dir(ADD_SRCS "${source_dir}") + +# middleware +set(middleware_include_dir . + ${middleware_src_path}/v2/component/panel/${CONFIG_SOPHGO_MIDDLEWARE_CHIP} + ${middleware_src_path}/v2/include + ${middleware_src_path}/v2/include/isp/${CONFIG_SOPHGO_MIDDLEWARE_CHIP} + ${middleware_src_path}/v2/sample/common + ${middleware_src_path}/v2/uapi + ${middleware_src_path}/v2/3rdparty/inih + ${middleware_src_path}/v2/modules/ive/include/ +) +list(APPEND ADD_INCLUDE ${middleware_include_dir}) +set_property(SOURCE ${middleware_include_dir} PROPERTY GENERATED 1) + +append_srcs_dir(middleware_src_dir ${middleware_src_path}/v2/sample/common + ${middleware_src_path}/v2/component/isp/sensor/sg200x/lontium_lt6911 + ) +list(APPEND ADD_SRCS ${middleware_src_dir} + "${source_dir}/kvm_mmf.cpp") +set_property(SOURCE ${middleware_src_dir} PROPERTY GENERATED 1) + +set(middleware_static_lib_file "") + list(APPEND ADD_STATIC_LIB ${middleware_static_lib_file}) +set_property(SOURCE ${middleware_static_lib_file} PROPERTY GENERATED 1) + +set(mmf_lib_dir ${middleware_src_path}/v2/lib) + +if(CONFIG_SOPHGO_MIDDLEWARE_C_LIBRARY STREQUAL "musl") + set(middleware_dynamic_lib_file ${mmf_lib_dir}/libcvi_bin.so + ${mmf_lib_dir}/libae.so + ${mmf_lib_dir}/libaf.so + ${mmf_lib_dir}/libawb.so + ${mmf_lib_dir}/libcvi_bin_isp.so + ${mmf_lib_dir}/libisp_algo.so + ${mmf_lib_dir}/libisp.so + ${mmf_lib_dir}/libsys.so + ${mmf_lib_dir}/libvdec.so + ${mmf_lib_dir}/libvenc.so + ${mmf_lib_dir}/libvpu.so + ${mmf_lib_dir}/3rd/libini.so) +elseif(CONFIG_SOPHGO_MIDDLEWARE_C_LIBRARY STREQUAL "glibc") + set(middleware_dynamic_lib_file ${mmf_lib_dir}/libcvi_vb.so + ${mmf_lib_dir}/libcvi_sys.so + ${mmf_lib_dir}/libcvi_debug.so + ) +else() + message(FATAL_ERROR "No sophgo middleware c library support, please check menuoconfig to select c library") +endif() +list(APPEND ADD_DYNAMIC_LIB ${middleware_dynamic_lib_file}) +set_property(SOURCE ${middleware_dynamic_lib_file} PROPERTY GENERATED 1) + +list(APPEND ADD_DEFINITIONS_PRIVATE -DSENSOR_LONTIUM_LT6911 + -DSENSOR2_TYPE=LONTIUM_LT6911_2M_60FPS_8BIT) + + +register_component(DYNAMIC) diff --git a/vision/components/kvm_mmf/Kconfig b/support/sg2002/additional/kvm_mmf/Kconfig similarity index 100% rename from vision/components/kvm_mmf/Kconfig rename to support/sg2002/additional/kvm_mmf/Kconfig diff --git a/vision/components/kvm_mmf/include/kvm_mmf.hpp b/support/sg2002/additional/kvm_mmf/include/kvm_mmf.hpp similarity index 100% rename from vision/components/kvm_mmf/include/kvm_mmf.hpp rename to support/sg2002/additional/kvm_mmf/include/kvm_mmf.hpp diff --git a/vision/components/kvm_mmf/src/kvm_mmf.cpp b/support/sg2002/additional/kvm_mmf/src/kvm_mmf.cpp similarity index 100% rename from vision/components/kvm_mmf/src/kvm_mmf.cpp rename to support/sg2002/additional/kvm_mmf/src/kvm_mmf.cpp diff --git a/support/sg2002/additional/peripheral/port/maixcam/maix_i2c.cpp b/support/sg2002/additional/peripheral/port/maixcam/maix_i2c.cpp new file mode 100644 index 0000000..8737746 --- /dev/null +++ b/support/sg2002/additional/peripheral/port/maixcam/maix_i2c.cpp @@ -0,0 +1,322 @@ +/** + * @author neucrack@sipeed, lxowalle@sipeed + * @copyright Sipeed Ltd 2023- + * @license Apache 2.0 + * @update 2023.9.8: Add framework, create this file. + */ + + +#include "maix_i2c.hpp" +#include "maix_basic.hpp" +#include "cstdio" +#include +#include +#include +#include +#include + +#define DEV_PATH "/dev/i2c-%d" + +namespace maix::peripheral::i2c +{ + + std::vector list_devices() + { + std::vector data; + // list all files in /dev, find i2c-* + std::vector *files = fs::listdir("/dev"); + for (auto &file : *files) + { + if (file.find("i2c-") != std::string::npos) + { + try + { + data.push_back(std::stoi(file.substr(4))); + } + catch (const std::exception &e) + { + log::error("i2c bus id %s format error", file.c_str()); + } + } + } + delete files; + return data; + } + + I2C::I2C(int id, i2c::Mode mode, int freq, i2c::AddrSize addr_size) + { + char buf[32]; + + snprintf(buf, sizeof(buf), DEV_PATH, id); + if(access(buf, F_OK) == 0){ + if (mode == i2c::SLAVE) + { + throw err::Exception(err::Err::ERR_NOT_IMPL, "i2c::SLAVE mode not implemented"); + } + if (addr_size != i2c::SEVEN_BIT) + { + throw err::Exception(err::Err::ERR_NOT_IMPL, "addr_size " + std::to_string(addr_size) + " not support"); + } + + int fd = ::open(buf, O_RDWR); + if (fd < 0) + { + throw err::Exception(err::Err::ERR_IO, "open " + std::string(buf) + " failed"); + } + _fd = fd; + _freq = freq; + _mode = mode; + _addr_size = addr_size; + } else { + printf("not exit i2c\r\n"); + } + } + + I2C::~I2C() + { + if (_fd > 0) + { + ::close(_fd); + } + } + + std::vector I2C::scan(int addr) + { + std::vector data; + int addr_start = 0x08; + int addr_end = 0x77; + if(addr > 0) + { + addr_start = addr; + addr_end = addr; + } + + if (_mode != i2c::Mode::MASTER) + { + log::error("Only for master mode"); + return data; + } + + switch (_addr_size) + { + case i2c::AddrSize::SEVEN_BIT: + for (int address = addr_start; address <= addr_end; ++address) + { + if (::ioctl(_fd, I2C_SLAVE, address) < 0) + { + continue; + } + + unsigned char buffer[1]; + if (::read(_fd, buffer, sizeof(buffer)) >= 0) + { + data.push_back(address); + } + } + break; + default: + log::error("bit %d not support", _addr_size); + return data; + } + + return data; + } + + int I2C::writeto(int addr, const uint8_t *data, int len) + { + if (_mode != i2c::Mode::MASTER) + { + log::error("Only for master mode"); + return (int)-err::Err::ERR_NOT_PERMIT; + } + + if (0 != ioctl(_fd, I2C_SLAVE, addr)) + { + // log::error("set slave address failed"); + return (int)-err::Err::ERR_IO; + } + + if (len != ::write(_fd, data, len)) + { + log::error("write failed"); + return (int)-err::Err::ERR_IO; + } + + return len; + } + + int I2C::writeto(int addr, const std::vector data) + { + return writeto(addr, data.data(), (int)data.size()); + } + + int I2C::writeto(int addr, const Bytes &data) + { + return writeto(addr, data.data, (int)data.size()); + } + + Bytes* I2C::readfrom(int addr, int len) + { + Bytes *data = new Bytes(nullptr, len); + + if (_mode != i2c::Mode::MASTER) + { + log::error("Only for master mode"); + return nullptr; + } + + if (0 != ioctl(_fd, I2C_SLAVE, addr)) + { + // log::error("set slave address failed"); + return nullptr; + } + + if (len != ::read(_fd, data->data, len)) + { + log::error("read failed"); + delete data; + return nullptr; + } + return data; + } + + int I2C::writeto_mem(int addr, int mem_addr, const uint8_t *data, int len, int mem_addr_size, bool mem_addr_le) + { + if (_mode != i2c::Mode::MASTER) + { + log::error("Only for master mode"); + return (int)-err::Err::ERR_NOT_PERMIT; + } + if(mem_addr_size % 8 != 0) + { + log::error("mem_addr_size must be multiple of 8"); + return (int)-err::Err::ERR_IO; + } + + if (0 != ioctl(_fd, I2C_SLAVE, addr)) + { + // log::error("set slave address failed"); + return (int)-err::Err::ERR_IO; + } + + std::vector data_final; + + if(mem_addr_size == 8) + { + data_final.push_back((unsigned char)mem_addr); + } + else + { + if(mem_addr_le) + { + for(int i = 0; i < mem_addr_size / 8; i++) + { + data_final.push_back((unsigned char)(mem_addr & 0xff)); + mem_addr >>= 8; + } + } + else + { + for(int i = 0; i < mem_addr_size / 8; i++) + { + data_final.push_back((unsigned char)(mem_addr >> (8 * (mem_addr_size / 8 - i - 1)))); + } + } + } + for(int i = 0; i < len; i++) + { + data_final.push_back(data[i]); + } + int write_len = ::write(_fd, data_final.data(), data_final.size()); + if (data_final.size() != (size_t)write_len) + { + log::error("write failed, write_len: %d", write_len); + return (int)-err::Err::ERR_IO; + } + + return len; + } + + int I2C::writeto_mem(int addr, int mem_addr, const std::vector data, int mem_addr_size, bool mem_addr_le) + { + return writeto_mem(addr, mem_addr, data.data(), (int)data.size(), mem_addr_size, mem_addr_le); + } + + int I2C::writeto_mem(int addr, int mem_addr, const Bytes &data, int mem_addr_size, bool mem_addr_le) + { + return writeto_mem(addr, mem_addr, data.data, (int)data.size(), mem_addr_size, mem_addr_le); + } + + Bytes* I2C::readfrom_mem(int addr, int mem_addr, int len, int mem_addr_size, bool mem_addr_le) + { + // write mem_addr and restart to read + if (_mode != i2c::Mode::MASTER) + { + log::error("Only for master mode"); + return nullptr; + } + if(mem_addr_size % 8 != 0) + { + log::error("mem_addr_size must be multiple of 8"); + return nullptr; + } + + // write mem_addr first and restart to read + if (0 != ioctl(_fd, I2C_SLAVE, addr)) + { + // log::error("set slave address failed"); + return nullptr; + } + + std::vector data_final; + if(mem_addr_size == 8) + { + data_final.push_back((unsigned char)mem_addr); + } + else + { + if(mem_addr_le) + { + for(int i = 0; i < mem_addr_size / 8; i++) + { + data_final.push_back((unsigned char)(mem_addr & 0xff)); + mem_addr >>= 8; + } + } + else + { + + for(int i = 0; i < mem_addr_size / 8; i++) + { + data_final.push_back((unsigned char)(mem_addr >> (8 * (mem_addr_size / 8 - i - 1)))); + } + } + } + // write read with I2C_RDWR + struct i2c_msg msgs[2]; + msgs[0].addr = addr; + msgs[0].flags = 0; + msgs[0].len = data_final.size(); + msgs[0].buf = data_final.data(); + + Bytes *data = new Bytes(nullptr, len); + msgs[1].addr = addr; + msgs[1].flags = I2C_M_RD; + msgs[1].len = len; + msgs[1].buf = data->data; + + struct i2c_rdwr_ioctl_data msgset; + msgset.msgs = msgs; + msgset.nmsgs = 2; + + int read_len = ioctl(_fd, I2C_RDWR, &msgset); + if (read_len != 2) + { + log::error("read failed"); + delete data; + return nullptr; + } + + return data; + } +} diff --git a/support/sg2002/additional/sophgo-middleware/v2/sample/common/sample_common_sensor.c b/support/sg2002/additional/sophgo-middleware/v2/sample/common/sample_common_sensor.c new file mode 100644 index 0000000..0044ad2 --- /dev/null +++ b/support/sg2002/additional/sophgo-middleware/v2/sample/common/sample_common_sensor.c @@ -0,0 +1,2228 @@ +/* + * Copyright (C) Cvitek Co., Ltd. 2019-2020. All rights reserved. + * + * File Name: sample/common/sample_common_sensor.c + * Description: + * Common sample code for sensor configure. + */ + +#include +#include +#include +#include +#include "cvi_mipi.h" +#include "cvi_sns_ctrl.h" +#include +#include +#include "cvi_comm_isp.h" +#include "sample_comm.h" +#include "ini.h" + +#define INI_FILE_PATH "/mnt/data/sensor_cfg.ini" +#define INI_DEF_PATH "/mnt/system/usr/bin/sensor_cfg.ini" +#define SNSCFGPATH_SIZE 100 + +static CVI_CHAR g_snsCfgPath[SNSCFGPATH_SIZE]; + +ISP_PUB_ATTR_S ISP_PUB_ATTR_SAMPLE = { { 0, 0, 1920, 1080 }, { 1920, 1080 }, 30, BAYER_RGGB, WDR_MODE_NONE, 0}; + +static SAMPLE_INI_CFG_S stDefIniCfg = { + .enSource = VI_PIPE_FRAME_SOURCE_DEV, + .devNum = 1, + .enSnsType[0] = SONY_IMX327_MIPI_2M_30FPS_12BIT, + .enWDRMode[0] = WDR_MODE_NONE, + .s32BusId[0] = 3, + .s32SnsI2cAddr[0] = -1, + .s32SnsI2cAddr[1] = -1, + .MipiDev[0] = 0xFF, + .MipiDev[1] = 0xFF, + .MipiDev[2] = 0xFF, + .u8UseMultiSns = 0, +}; + +// default is MIPI-CSI Bayer format sensor +VI_DEV_ATTR_S DEV_ATTR_SENSOR_BASE = { + VI_MODE_MIPI, + VI_WORK_MODE_1Multiplex, + VI_SCAN_PROGRESSIVE, + {-1, -1, -1, -1}, + VI_DATA_SEQ_YUYV, + + { + /*port_vsync port_vsync_neg port_hsync port_hsync_neg */ + VI_VSYNC_PULSE, VI_VSYNC_NEG_LOW, VI_HSYNC_VALID_SINGNAL, VI_HSYNC_NEG_HIGH, + VI_VSYNC_VALID_SIGNAL, VI_VSYNC_VALID_NEG_HIGH, + + /*hsync_hfb hsync_act hsync_hhb*/ + {0, 1920, 0, + /*vsync0_vhb vsync0_act vsync0_hhb*/ + 0, 1080, 0, + /*vsync1_vhb vsync1_act vsync1_hhb*/ + 0, 0, 0} + }, + VI_DATA_TYPE_RGB, + {1920, 1080}, + { + WDR_MODE_NONE, + 1080, + 0 + }, + .enBayerFormat = BAYER_FORMAT_BG, +}; + +/****************************************************************************** + * If add new sensor , Modify the method as follows if need + *1-----*snsr_type_name + *2-----SAMPLE_COMM_SNS_GetSize + *3-----SAMPLE_COMM_SNS_GetDevAttr + *4-----SAMPLE_COMM_SNS_GetYuvBypassSts + *5-----SAMPLE_COMM_SNS_GetIspAttrBySns + *6-----SAMPLE_COMM_SNS_GetSnsObj + ******************************************************************************/ +/****************************************************************************** + * Structure : Configure sensor mode + ******************************************************************************/ +static const char *snsr_type_name[SAMPLE_SNS_TYPE_BUTT] = { + /* ------ LINEAR BEGIN ------*/ + "BRIGATES_BG0808_MIPI_2M_30FPS_10BIT", + "BYD_BF2253L_MIPI_1200P_30FPS_10BIT", + "CVSENS_CV4001_MIPI_4M_1440P_25FPS_12BIT", + "GCORE_GC02M1_MIPI_2M_30FPS_10BIT", + "GCORE_GC0312_MIPI_480P_20FPS_8BIT", + "GCORE_GC0329_MIPI_480P_10FPS_8BIT", + "GCORE_GC1054_MIPI_1M_30FPS_10BIT", + "GCORE_GC1084_MIPI_1M_30FPS_10BIT", + "GCORE_GC1084_SLAVE_MIPI_1M_30FPS_10BIT", + "GCORE_GC2053_MIPI_2M_30FPS_10BIT", + "GCORE_GC2053_SLAVE_MIPI_2M_30FPS_10BIT", + "GCORE_GC2053_1L_MIPI_2M_30FPS_10BIT", + "GCORE_GC2083_MIPI_2M_30FPS_10BIT", + "GCORE_GC2093_MIPI_2M_30FPS_10BIT", + "GCORE_GC2093_MIPI_2M_60FPS_10BIT", + "GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT", + "GCORE_GC2145_MIPI_2M_12FPS_8BIT", + "GCORE_GC4023_MIPI_4M_30FPS_10BIT", + "GCORE_GC4653_MIPI_4M_30FPS_10BIT", + "GCORE_GC4653_SLAVE_MIPI_4M_30FPS_10BIT", + "IMGDS_MIS2008_MIPI_2M_1080P_30FPS_12BIT", + "NEXTCHIP_N5_1M_2CH_25FPS_8BIT", + "NEXTCHIP_N5_2M_25FPS_8BIT", + "NEXTCHIP_N6_2M_4CH_25FPS_8BIT", + "OV_OS02D10_MIPI_2M_30FPS_10BIT", + "OV_OS02D10_SLAVE_MIPI_2M_30FPS_10BIT", + "OV_OS02K10_SLAVE_MIPI_2M_30FPS_12BIT", + "OV_OS04A10_MIPI_4M_1440P_30FPS_12BIT", + "OV_OS04C10_MIPI_4M_30FPS_12BIT", + "OV_OS04C10_MIPI_4M_1440P_30FPS_12BIT", + "OV_OS04C10_SLAVE_MIPI_4M_30FPS_12BIT", + "OV_OS08A20_MIPI_4M_30FPS_10BIT", + "OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT", + "OV_OS08A20_MIPI_5M_30FPS_10BIT", + "OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT", + "OV_OS08A20_MIPI_8M_30FPS_10BIT", + "OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT", + "OV_OV4689_MIPI_4M_30FPS_10BIT", + "OV_OV5647_MIPI_2M_30FPS_10BIT", + "OV_OV6211_MIPI_400P_120FPS_10BIT", + "OV_OV7251_MIPI_480P_120FPS_10BIT", + "PICO384_THERMAL_384X288", + "PICO640_THERMAL_479P", + "PIXELPLUS_PR2020_1M_25FPS_8BIT", + "PIXELPLUS_PR2020_1M_30FPS_8BIT", + "PIXELPLUS_PR2020_2M_25FPS_8BIT", + "PIXELPLUS_PR2020_2M_30FPS_8BIT", + "PIXELPLUS_PR2100_2M_25FPS_8BIT", + "PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT", + "PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT", + "SMS_SC035GS_MIPI_480P_120FPS_12BIT", + "SMS_SC035GS_1L_MIPI_480P_120FPS_10BIT", + "SMS_SC035HGS_MIPI_480P_120FPS_12BIT", + "SMS_SC035HGS_1L_MIPI_480P_120FPS_10BIT", + "SMS_SC1336_1L_MIPI_1M_30FPS_10BIT", + "SMS_SC1336_1L_MIPI_1M_60FPS_10BIT", + "SMS_SC1346_1L_MIPI_1M_30FPS_10BIT", + "SMS_SC1346_1L_MIPI_1M_60FPS_10BIT", + "SMS_SC1346_1L_SLAVE_MIPI_1M_30FPS_10BIT", + "SMS_SC1346_1L_SLAVE_MIPI_1M_60FPS_10BIT", + "SMS_SC200AI_MIPI_2M_30FPS_10BIT", + "SMS_SC301IOT_MIPI_3M_30FPS_10BIT", + "SMS_SC401AI_MIPI_3M_30FPS_10BIT", + "SMS_SC401AI_MIPI_4M_30FPS_10BIT", + "SMS_SC500AI_MIPI_4M_30FPS_10BIT", + "SMS_SC500AI_MIPI_5M_30FPS_10BIT", + "SMS_SC501AI_2L_MIPI_5M_30FPS_10BIT", + "SMS_SC531AI_2L_MIPI_5M_30FPS_10BIT", + "SMS_SC850SL_MIPI_8M_30FPS_12BIT", + "SMS_SC3332_MIPI_3M_30FPS_10BIT", + "SMS_SC3335_MIPI_3M_30FPS_10BIT", + "SMS_SC3335_SLAVE_MIPI_3M_30FPS_10BIT", + "SMS_SC3336_MIPI_3M_30FPS_10BIT", + "SMS_SC3336P_MIPI_3M_30FPS_10BIT", + "SMS_SC2331_1L_MIPI_2M_30FPS_10BIT", + "SMS_SC2331_1L_SLAVE_MIPI_2M_30FPS_10BIT", + "SMS_SC2331_1L_SLAVE1_MIPI_2M_30FPS_10BIT", + "SMS_SC2335_MIPI_2M_30FPS_10BIT", + "SMS_SC2336_MIPI_2M_30FPS_10BIT", + "SMS_SC2336_SLAVE_MIPI_2M_30FPS_10BIT", + "SMS_SC2336_SLAVE1_MIPI_2M_30FPS_10BIT", + "SMS_SC2336_1L_MIPI_2M_30FPS_10BIT", + "SMS_SC2336P_MIPI_2M_30FPS_10BIT", + "SMS_SC2336P_1L_MIPI_2M_30FPS_10BIT", + "SMS_SC223A_1L_MIPI_2M_30FPS_10BIT", + "SMS_SC4210_MIPI_4M_30FPS_12BIT", + "SMS_SC4336_MIPI_4M_30FPS_10BIT", + "SMS_SC4336P_MIPI_4M_30FPS_10BIT", + "SMS_SC5336_2L_MIPI_5M_30FPS_10BIT", + "SMS_SC8238_MIPI_8M_30FPS_10BIT", + "SOI_F23_MIPI_2M_30FPS_10BIT", + "SOI_F35_MIPI_2M_30FPS_10BIT", + "SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT", + "SOI_F37P_MIPI_2M_30FPS_10BIT", + "SOI_H65_MIPI_1M_30FPS_10BIT", + "SOI_K06_MIPI_4M_25FPS_10BIT", + "SOI_Q03_MIPI_3M_30FPS_10BIT", + "SOI_Q03P_MIPI_3M_30FPS_10BIT", + "SONY_IMX290_MIPI_1M_30FPS_12BIT", + "SONY_IMX290_MIPI_2M_60FPS_12BIT", + "SONY_IMX307_MIPI_2M_30FPS_12BIT", + "SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT", + "SONY_IMX307_2L_MIPI_2M_30FPS_12BIT", + "SONY_IMX307_SUBLVDS_2M_30FPS_12BIT", + "SONY_IMX307_MIPI_2M_60FPS_12BIT", + "SONY_IMX307_SUBLVDS_2M_60FPS_12BIT", +#ifdef FPGA_PORTING + "SONY_IMX327_MIPI_1M_30FPS_10BIT", +#endif + "SONY_IMX327_MIPI_2M_30FPS_12BIT", + "SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT", + "SONY_IMX327_2L_MIPI_2M_30FPS_12BIT", + "SONY_IMX327_SUBLVDS_2M_30FPS_12BIT", + "SONY_IMX327_MIPI_2M_60FPS_12BIT", + "SONY_IMX334_MIPI_8M_30FPS_12BIT", + "SONY_IMX335_MIPI_4M_30FPS_12BIT", + "SONY_IMX335_MIPI_4M_1600P_30FPS_12BIT", + "SONY_IMX335_2L_MIPI_4M_30FPS_10BIT", + "SONY_IMX335_MIPI_5M_30FPS_12BIT", + "SONY_IMX335_MIPI_2M_60FPS_10BIT", + "SONY_IMX335_MIPI_4M_60FPS_10BIT", + "SONY_IMX335_MIPI_5M_60FPS_10BIT", + "SONY_IMX347_MIPI_4M_60FPS_12BIT", + "SONY_IMX385_MIPI_2M_30FPS_12BIT", + "TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT", + "TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT", + "TECHPOINT_TP2825_MIPI_2M_30FPS_8BIT", + "TECHPOINT_TP2863_MIPI_1M_25FPS_8BIT", + "TECHPOINT_TP2863_MIPI_2M_25FPS_8BIT", + "TECHPOINT_TP2863_MIPI_1M_30FPS_8BIT", + "TECHPOINT_TP2863_MIPI_2M_30FPS_8BIT", + "VIVO_MCS369_2M_30FPS_12BIT", + "VIVO_MCS369Q_4M_30FPS_12BIT", + "VIVO_MM308M2_2M_25FPS_8BIT", + "LONTIUM_LT6911_2M_60FPS_8BIT", + /* ------ LINEAR END ------*/ + + /* ------ WDR 2TO1 BEGIN ------*/ + "BRIGATES_BG0808_MIPI_2M_30FPS_10BIT_WDR2TO1", + "CVSENS_CV4001_MIPI_4M_1440P_15FPS_WDR2TO1", + "GCORE_GC2093_MIPI_2M_30FPS_10BIT_WDR2TO1", + "GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1", + "OV_OS04A10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1", + "OV_OS04C10_MIPI_4M_30FPS_10BIT_WDR2TO1", + "OV_OS04C10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1", + "OV_OS04C10_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1", + "OV_OS08A20_MIPI_4M_30FPS_10BIT_WDR2TO1", + "OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1", + "OV_OS08A20_MIPI_5M_30FPS_10BIT_WDR2TO1", + "OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT_WDR2TO1", + "OV_OS08A20_MIPI_8M_30FPS_10BIT_WDR2TO1", + "OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT_WDR2TO1", + "SMS_SC1336_1L_MIPI_1M_30FPS_10BIT_WDR2TO1", + "SMS_SC1336_1L_MIPI_1M_60FPS_10BIT_WDR2TO1", + "SMS_SC1346_1L_MIPI_1M_30FPS_10BIT_WDR2TO1", + "SMS_SC1346_1L_MIPI_1M_60FPS_10BIT_WDR2TO1", + "SMS_SC200AI_MIPI_2M_30FPS_10BIT_WDR2TO1", + "SMS_SC500AI_MIPI_4M_30FPS_10BIT_WDR2TO1", + "SMS_SC500AI_MIPI_5M_30FPS_10BIT_WDR2TO1", + "SMS_SC850SL_MIPI_8M_30FPS_10BIT_WDR2TO1", + "SMS_SC4210_MIPI_4M_30FPS_10BIT_WDR2TO1", + "SMS_SC8238_MIPI_8M_15FPS_10BIT_WDR2TO1", + "SOI_F35_MIPI_2M_30FPS_10BIT_WDR2TO1", + "SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1", + "SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1", + "SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1", + "SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1", + "SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1", +#ifdef FPGA_PORTING + "SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1", +#endif + "SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1", + "SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1", + "SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1", + "SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1", + "SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1", + "SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1", + "SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1", + "SONY_IMX335_MIPI_4M_1600P_30FPS_10BIT_WDR2TO1", + "SONY_IMX335_MIPI_5M_30FPS_10BIT_WDR2TO1", + /* ------ WDR 2TO1 END ------*/ +}; + +CVI_CHAR *SAMPLE_COMM_SNS_GetSnsrTypeName(void) +{ + return (CVI_CHAR *)snsr_type_name; +} +/****************************************************************************** + * funciton : Get enSize by diffrent sensor + * PIC_CIF: 352 * 288 + * PIC_D1_PAL: 720 * 576 + * PIC_D1_NTSC: 720 * 480 + * PIC_720P: 1280 * 720 + * PIC_1600x1200: + * PIC_1080P: 1920 * 1080 + * PIC_1088: 1920 * 1088 + * PIC_1440P: 2560 * 1440 + * PIC_2304x1296: + * PIC_2048x1536: + * PIC_2592x1520: + * PIC_2560x1600: + * PIC_2592x1944: + * PIC_2592x1536: + * PIC_2688x1520: + * PIC_2716x1524: + * PIC_2880x1620: + * PIC_3844x1124: + * PIC_3840x2160: + * PIC_3000x3000: + * PIC_4000x3000: + * PIC_4096x2160: + * PIC_3840x8640: + * PIC_7688x1124: + * PIC_640x480: + * PIC_479P: 632 * 479 + * PIC_400x400: + * PIC_288P: 384 * 288 + ******************************************************************************/ +CVI_S32 SAMPLE_COMM_SNS_GetSize(SAMPLE_SNS_TYPE_E enMode, PIC_SIZE_E *penSize) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + + if (!penSize) + return CVI_FAILURE; + + switch (enMode) { + case GCORE_GC1054_MIPI_1M_30FPS_10BIT: + case GCORE_GC1084_MIPI_1M_30FPS_10BIT: + case GCORE_GC1084_SLAVE_MIPI_1M_30FPS_10BIT: + case NEXTCHIP_N5_1M_2CH_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_30FPS_8BIT: + case SMS_SC1336_1L_MIPI_1M_30FPS_10BIT: + case SMS_SC1336_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1336_1L_MIPI_1M_60FPS_10BIT: + case SMS_SC1336_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_MIPI_1M_30FPS_10BIT: + case SMS_SC1346_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_MIPI_1M_60FPS_10BIT: + case SMS_SC1346_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_SLAVE_MIPI_1M_30FPS_10BIT: + case SMS_SC1346_1L_SLAVE_MIPI_1M_60FPS_10BIT: + case SOI_H65_MIPI_1M_30FPS_10BIT: + case SONY_IMX290_MIPI_1M_30FPS_12BIT: + case TECHPOINT_TP2863_MIPI_1M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_1M_30FPS_8BIT: +#ifdef FPGA_PORTING + case SONY_IMX327_MIPI_1M_30FPS_10BIT: + case SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1: +#endif + *penSize = PIC_720P; + break; + case GCORE_GC02M1_MIPI_2M_30FPS_10BIT: + case GCORE_GC2145_MIPI_2M_12FPS_8BIT: + case BYD_BF2253L_MIPI_1200P_30FPS_10BIT: + *penSize = PIC_1600x1200; + break; + case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT: + case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT_WDR2TO1: + case GCORE_GC2053_MIPI_2M_30FPS_10BIT: + case GCORE_GC2053_SLAVE_MIPI_2M_30FPS_10BIT: + case GCORE_GC2053_1L_MIPI_2M_30FPS_10BIT: + case GCORE_GC2083_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_MIPI_2M_60FPS_10BIT: + case GCORE_GC2093_MIPI_2M_30FPS_10BIT_WDR2TO1: + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: + case NEXTCHIP_N5_2M_25FPS_8BIT: + case NEXTCHIP_N6_2M_4CH_25FPS_8BIT: + case OV_OS02D10_MIPI_2M_30FPS_10BIT: + case OV_OS02D10_SLAVE_MIPI_2M_30FPS_10BIT: + case OV_OS02K10_SLAVE_MIPI_2M_30FPS_12BIT: + case OV_OV5647_MIPI_2M_30FPS_10BIT: + case PIXELPLUS_PR2020_2M_25FPS_8BIT: + case PIXELPLUS_PR2020_2M_30FPS_8BIT: + case PIXELPLUS_PR2100_2M_25FPS_8BIT: + case SMS_SC2331_1L_MIPI_2M_30FPS_10BIT: + case SMS_SC2331_1L_SLAVE_MIPI_2M_30FPS_10BIT: + case SMS_SC2331_1L_SLAVE1_MIPI_2M_30FPS_10BIT: + case SMS_SC2335_MIPI_2M_30FPS_10BIT: + case SMS_SC2336_MIPI_2M_30FPS_10BIT: + case SMS_SC2336_SLAVE_MIPI_2M_30FPS_10BIT: + case SMS_SC2336_SLAVE1_MIPI_2M_30FPS_10BIT: + case SMS_SC2336_1L_MIPI_2M_30FPS_10BIT: + case SMS_SC2336P_MIPI_2M_30FPS_10BIT: + case SMS_SC2336P_1L_MIPI_2M_30FPS_10BIT: + case SMS_SC223A_1L_MIPI_2M_30FPS_10BIT: + case SMS_SC200AI_MIPI_2M_30FPS_10BIT: + case SMS_SC200AI_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SOI_F23_MIPI_2M_30FPS_10BIT: + case SOI_F35_MIPI_2M_30FPS_10BIT: + case SOI_F35_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT: + case SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SOI_F37P_MIPI_2M_30FPS_10BIT: + case SONY_IMX290_MIPI_2M_60FPS_12BIT: + case SONY_IMX307_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_MIPI_2M_60FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: + case SONY_IMX327_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_MIPI_2M_60FPS_12BIT: + case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_2M_60FPS_10BIT: + case SONY_IMX385_MIPI_2M_30FPS_12BIT: + case SONY_IMX385_MIPI_2M_30FPS_12BIT_WDR2TO1: + case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2825_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_30FPS_8BIT: + case VIVO_MCS369_2M_30FPS_12BIT: + case VIVO_MM308M2_2M_25FPS_8BIT: + case IMGDS_MIS2008_MIPI_2M_1080P_30FPS_12BIT: + *penSize = PIC_1080P; + break; + case LONTIUM_LT6911_2M_60FPS_8BIT: + *penSize = PIC_CUSTOMIZE; + break; + case GCORE_GC4023_MIPI_4M_30FPS_10BIT: + case GCORE_GC4653_MIPI_4M_30FPS_10BIT: + case GCORE_GC4653_SLAVE_MIPI_4M_30FPS_10BIT: + case OV_OS04A10_MIPI_4M_1440P_30FPS_12BIT: + case OV_OS04A10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1: + case OV_OS04C10_MIPI_4M_1440P_30FPS_12BIT: + case OV_OS04C10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_MIPI_4M_30FPS_10BIT: + case OV_OS08A20_MIPI_4M_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT: + case OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1: + case SMS_SC401AI_MIPI_4M_30FPS_10BIT: + case SMS_SC500AI_MIPI_4M_30FPS_10BIT: + case SMS_SC500AI_MIPI_4M_30FPS_10BIT_WDR2TO1: + case SMS_SC4210_MIPI_4M_30FPS_12BIT: + case SMS_SC4210_MIPI_4M_30FPS_10BIT_WDR2TO1: + case SMS_SC4336_MIPI_4M_30FPS_10BIT: + case SMS_SC4336P_MIPI_4M_30FPS_10BIT: + case SOI_K06_MIPI_4M_25FPS_10BIT: + case SONY_IMX335_MIPI_4M_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_2L_MIPI_4M_30FPS_10BIT: + case SONY_IMX335_MIPI_4M_60FPS_10BIT: + case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: + case VIVO_MCS369Q_4M_30FPS_12BIT: + case CVSENS_CV4001_MIPI_4M_1440P_25FPS_12BIT: + case CVSENS_CV4001_MIPI_4M_1440P_15FPS_WDR2TO1: + *penSize = PIC_1440P; + break; + case SMS_SC401AI_MIPI_3M_30FPS_10BIT: + case SMS_SC3332_MIPI_3M_30FPS_10BIT: + case SMS_SC3335_MIPI_3M_30FPS_10BIT: + case SMS_SC3335_SLAVE_MIPI_3M_30FPS_10BIT: + case SMS_SC3336_MIPI_3M_30FPS_10BIT: + case SMS_SC3336P_MIPI_3M_30FPS_10BIT: + case SOI_Q03_MIPI_3M_30FPS_10BIT: + case SOI_Q03P_MIPI_3M_30FPS_10BIT: + *penSize = PIC_2304x1296; + break; + case SMS_SC301IOT_MIPI_3M_30FPS_10BIT: + *penSize = PIC_2048x1536; + break; + case SONY_IMX335_MIPI_4M_1600P_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_1600P_30FPS_10BIT_WDR2TO1: + *penSize = PIC_2560x1600; + break; + case OV_OS08A20_MIPI_5M_30FPS_10BIT: + case OV_OS08A20_MIPI_5M_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT: + case OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_5M_30FPS_12BIT: + case SONY_IMX335_MIPI_5M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_5M_60FPS_10BIT: + *penSize = PIC_2592x1944; + break; + case OV_OS04C10_MIPI_4M_30FPS_12BIT: + case OV_OS04C10_MIPI_4M_30FPS_10BIT_WDR2TO1: + case OV_OS04C10_SLAVE_MIPI_4M_30FPS_12BIT: + case OV_OS04C10_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1: + case OV_OV4689_MIPI_4M_30FPS_10BIT: + case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: + case SONY_IMX347_MIPI_4M_60FPS_12BIT: + *penSize = PIC_2688x1520; + break; + case SMS_SC500AI_MIPI_5M_30FPS_10BIT: + case SMS_SC500AI_MIPI_5M_30FPS_10BIT_WDR2TO1: + case SMS_SC501AI_2L_MIPI_5M_30FPS_10BIT: + case SMS_SC531AI_2L_MIPI_5M_30FPS_10BIT: + *penSize = PIC_2880x1620; + break; + case SMS_SC5336_2L_MIPI_5M_30FPS_10BIT: + // *penSize = PIC_2880x1618; + *penSize = PIC_2880x1620; + break; + case OV_OS08A20_MIPI_8M_30FPS_10BIT: + case OV_OS08A20_MIPI_8M_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT: + case OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT_WDR2TO1: + case SMS_SC850SL_MIPI_8M_30FPS_12BIT: + case SMS_SC850SL_MIPI_8M_30FPS_10BIT_WDR2TO1: + case SMS_SC8238_MIPI_8M_30FPS_10BIT: + case SMS_SC8238_MIPI_8M_15FPS_10BIT_WDR2TO1: + case SONY_IMX334_MIPI_8M_30FPS_12BIT: + case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1: + *penSize = PIC_3840x2160; + break; + case OV_OV7251_MIPI_480P_120FPS_10BIT: + case SMS_SC035GS_MIPI_480P_120FPS_12BIT: + case SMS_SC035GS_1L_MIPI_480P_120FPS_10BIT: + case SMS_SC035HGS_MIPI_480P_120FPS_12BIT: + case SMS_SC035HGS_1L_MIPI_480P_120FPS_10BIT: + case GCORE_GC0312_MIPI_480P_20FPS_8BIT: + case GCORE_GC0329_MIPI_480P_10FPS_8BIT: + *penSize = PIC_640x480; + break; + case PICO640_THERMAL_479P: + *penSize = PIC_479P; + break; + case OV_OV6211_MIPI_400P_120FPS_10BIT: + *penSize = PIC_400x400; + break; + case PICO384_THERMAL_384X288: + *penSize = PIC_288P; + break; +#ifdef ARCH_CV183X + case PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT: + *penSize = PIC_3844x1124; + break; + case PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT: + *penSize = PIC_7688x1124; + break; +#else + case PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT: + case PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT: + *penSize = PIC_1080P; + break; +#endif + default: + s32Ret = CVI_FAILURE; + break; + } + return s32Ret; +} +/* + * Brief: get picture size(w*h), according enPicSize + */ +CVI_S32 SAMPLE_COMM_SNS_GetPicSize(PIC_SIZE_E enPicSize, SIZE_S *pstSize) +{ + switch (enPicSize) { + case PIC_CIF: /* 352 * 288 */ + pstSize->u32Width = 352; + pstSize->u32Height = 288; + break; + + case PIC_D1_PAL: /* 720 * 576 */ + pstSize->u32Width = 720; + pstSize->u32Height = 576; + break; + + case PIC_D1_NTSC: /* 720 * 480 */ + pstSize->u32Width = 720; + pstSize->u32Height = 480; + break; + + case PIC_720P: /* 1280 * 720 */ + pstSize->u32Width = 1280; + pstSize->u32Height = 720; + break; + + case PIC_1600x1200: + pstSize->u32Width = 1600; + pstSize->u32Height = 1200; + break; + + case PIC_1080P: /* 1920 * 1080 */ + pstSize->u32Width = 1920; + pstSize->u32Height = 1080; + break; + + case PIC_1088: /* 1920 * 1088*/ + pstSize->u32Width = 1920; + pstSize->u32Height = 1088; + break; + + case PIC_1440P: /* 2560 * 1440 */ + pstSize->u32Width = 2560; + pstSize->u32Height = 1440; + break; + + case PIC_2304x1296: /* 2304 * 1296 */ + pstSize->u32Width = 2304; + pstSize->u32Height = 1296; + break; + + case PIC_2048x1536: + pstSize->u32Width = 2048; + pstSize->u32Height = 1536; + break; + + case PIC_2592x1520: + pstSize->u32Width = 2592; + pstSize->u32Height = 1520; + break; + + case PIC_2560x1600: + pstSize->u32Width = 2560; + pstSize->u32Height = 1600; + break; + + case PIC_2592x1944: + pstSize->u32Width = 2592; + pstSize->u32Height = 1944; + break; + + case PIC_2592x1536: + pstSize->u32Width = 2592; + pstSize->u32Height = 1536; + break; + + case PIC_2688x1520: + pstSize->u32Width = 2688; + pstSize->u32Height = 1520; + break; + + case PIC_2716x1524: + pstSize->u32Width = 2716; + pstSize->u32Height = 1524; + break; + + case PIC_2880x1620: + pstSize->u32Width = 2880; + pstSize->u32Height = 1620; + break; + case PIC_2880x1618: + pstSize->u32Width = 2880; + pstSize->u32Height = 1618; + break; + case PIC_3844x1124: + pstSize->u32Width = 3844; + pstSize->u32Height = 1124; + break; + + case PIC_3840x2160: + pstSize->u32Width = 3840; + pstSize->u32Height = 2160; + break; + + case PIC_3000x3000: + pstSize->u32Width = 3000; + pstSize->u32Height = 3000; + break; + + case PIC_4000x3000: + pstSize->u32Width = 4000; + pstSize->u32Height = 3000; + break; + + case PIC_4096x2160: + pstSize->u32Width = 4096; + pstSize->u32Height = 2160; + break; + + case PIC_3840x8640: + pstSize->u32Width = 3840; + pstSize->u32Height = 8640; + break; + + case PIC_7688x1124: + pstSize->u32Width = 7688; + pstSize->u32Height = 1124; + break; + + case PIC_640x480: + pstSize->u32Width = 640; + pstSize->u32Height = 480; + break; + case PIC_479P: /* 632 * 479 */ + pstSize->u32Width = 632; + pstSize->u32Height = 479; + break; + case PIC_400x400: + pstSize->u32Width = 400; + pstSize->u32Height = 400; + break; + case PIC_288P: /* 384 * 288 */ + pstSize->u32Width = 384; + pstSize->u32Height = 288; + break; + case PIC_CUSTOMIZE: /* env * env */ + { + uint8_t RW_Data[35]; + FILE *fp; + int file_size; + if(access("/kvmapp/kvm/width", F_OK) == 0){ + fp = fopen("/kvmapp/kvm/width", "r"); + fseek(fp, 0, SEEK_END); + file_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + fread(RW_Data, sizeof(char), file_size, fp); + fclose(fp); + RW_Data[file_size] = 0; + pstSize->u32Width = atoi((char*)RW_Data); + } else { + pstSize->u32Width = 1920; + } + if(access("/kvmapp/kvm/height", F_OK) == 0){ + fp = fopen("/kvmapp/kvm/height", "r"); + fseek(fp, 0, SEEK_END); + file_size = ftell(fp); + fseek(fp, 0, SEEK_SET); + fread(RW_Data, sizeof(char), file_size, fp); + fclose(fp); + RW_Data[file_size] = 0; + pstSize->u32Height = atoi((char*)RW_Data); + } else { + pstSize->u32Height = 1080; + } + + // if(getenv("KVM_CSI_HEIGHT") == NULL || getenv("KVM_CSI_WIDTH") == NULL){ + // pstSize->u32Width = 1920; + // pstSize->u32Height = 1080; + // printf("KVM_CSI_H/W = NULL%d\n"); + // } else { + // pstSize->u32Width = atoi(getenv("KVM_CSI_HEIGHT")); + // pstSize->u32Height = atoi(getenv("KVM_CSI_WIDTH")); + // } + + printf("pstSize->u32Width = %d\n", pstSize->u32Width); + printf("pstSize->u32Height = %d\n", pstSize->u32Height); + break; + } + + default: + return CVI_FAILURE; + } + + return CVI_SUCCESS; +} + +/****************************************************************************** + * funciton : Get VI attr info by diffrent sensor + ******************************************************************************/ +CVI_S32 SAMPLE_COMM_SNS_GetDevAttr(SAMPLE_SNS_TYPE_E enSnsType, VI_DEV_ATTR_S *pstViDevAttr) +{ + PIC_SIZE_E enPicSize; + SIZE_S stSize; + + memcpy(pstViDevAttr, &DEV_ATTR_SENSOR_BASE, sizeof(VI_DEV_ATTR_S)); + + SAMPLE_COMM_SNS_GetSize(enSnsType, &enPicSize); + SAMPLE_COMM_SNS_GetPicSize(enPicSize, &stSize); + + pstViDevAttr->stSize.u32Width = stSize.u32Width; + pstViDevAttr->stSize.u32Height = stSize.u32Height; + pstViDevAttr->stWDRAttr.u32CacheLine = stSize.u32Height; + + // WDR mode + if (enSnsType >= SAMPLE_SNS_TYPE_LINEAR_BUTT) + pstViDevAttr->stWDRAttr.enWDRMode = WDR_MODE_2To1_LINE; + + // set synthetic wdr mode + switch (enSnsType) { + case SMS_SC1336_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1336_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + pstViDevAttr->stWDRAttr.bSyntheticWDR = 1; + break; + default: + pstViDevAttr->stWDRAttr.bSyntheticWDR = 0; + break; + } + + // YUV Sensor + switch (enSnsType) { + case NEXTCHIP_N5_1M_2CH_25FPS_8BIT: + case NEXTCHIP_N5_2M_25FPS_8BIT: + case NEXTCHIP_N6_2M_4CH_25FPS_8BIT: + case PICO384_THERMAL_384X288: + case PICO640_THERMAL_479P: + case PIXELPLUS_PR2020_1M_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_30FPS_8BIT: + case PIXELPLUS_PR2020_2M_25FPS_8BIT: + case PIXELPLUS_PR2020_2M_30FPS_8BIT: + case PIXELPLUS_PR2100_2M_25FPS_8BIT: + case PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT: + case PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT: + case VIVO_MCS369_2M_30FPS_12BIT: + case VIVO_MCS369Q_4M_30FPS_12BIT: + case VIVO_MM308M2_2M_25FPS_8BIT: + pstViDevAttr->enDataSeq = VI_DATA_SEQ_YUYV; + pstViDevAttr->enInputDataType = VI_DATA_TYPE_YUV; + pstViDevAttr->enIntfMode = VI_MODE_MIPI_YUV422; + break; + case GCORE_GC2145_MIPI_2M_12FPS_8BIT: + case GCORE_GC0312_MIPI_480P_20FPS_8BIT: + case GCORE_GC0329_MIPI_480P_10FPS_8BIT: + pstViDevAttr->enDataSeq = VI_DATA_SEQ_YUYV; + pstViDevAttr->enInputDataType = VI_DATA_TYPE_YUV; + pstViDevAttr->enIntfMode = VI_MODE_BT601; + break; + case TECHPOINT_TP2863_MIPI_1M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_1M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_30FPS_8BIT: + pstViDevAttr->enDataSeq = VI_DATA_SEQ_UYVY; + pstViDevAttr->enInputDataType = VI_DATA_TYPE_YUV; + pstViDevAttr->enIntfMode = VI_MODE_MIPI_YUV422; + break; + default: + break; + }; + + // BT601 + switch (enSnsType) { + case GCORE_GC2145_MIPI_2M_12FPS_8BIT: + case GCORE_GC0312_MIPI_480P_20FPS_8BIT: + case GCORE_GC0329_MIPI_480P_10FPS_8BIT: + pstViDevAttr->enIntfMode = VI_MODE_BT601; + break; + default: + break; + }; + + // BT656 + switch (enSnsType) { + case NEXTCHIP_N5_1M_2CH_25FPS_8BIT: + case NEXTCHIP_N5_2M_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_30FPS_8BIT: + case PIXELPLUS_PR2020_2M_25FPS_8BIT: + case PIXELPLUS_PR2020_2M_30FPS_8BIT: + pstViDevAttr->enIntfMode = VI_MODE_BT656; + break; + default: + break; + }; + + // BT1120 + switch (enSnsType) { + case VIVO_MCS369_2M_30FPS_12BIT: + case VIVO_MCS369Q_4M_30FPS_12BIT: + case VIVO_MM308M2_2M_25FPS_8BIT: + case TECHPOINT_TP2825_MIPI_2M_30FPS_8BIT: + pstViDevAttr->enDataSeq = VI_DATA_SEQ_YUYV; + pstViDevAttr->enInputDataType = VI_DATA_TYPE_YUV; + pstViDevAttr->enIntfMode = VI_MODE_BT1120_STANDARD; + break; + default: + break; + }; + + // subLVDS + switch (enSnsType) { + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + pstViDevAttr->enIntfMode = VI_MODE_LVDS; + break; + default: + break; + }; + + switch (enSnsType) { + // Sony + case SONY_IMX307_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_MIPI_2M_60FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: +#ifdef FPGA_PORTING + case SONY_IMX327_MIPI_1M_30FPS_10BIT: + case SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1: +#endif + case SONY_IMX327_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_MIPI_2M_60FPS_12BIT: + case SONY_IMX334_MIPI_8M_30FPS_12BIT: + case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1: + case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_4M_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_2L_MIPI_4M_30FPS_10BIT: + case SONY_IMX335_MIPI_4M_1600P_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_1600P_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_5M_30FPS_12BIT: + case SONY_IMX335_MIPI_5M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_2M_60FPS_10BIT: + case SONY_IMX335_MIPI_4M_60FPS_10BIT: + case SONY_IMX335_MIPI_5M_60FPS_10BIT: + case SONY_IMX347_MIPI_4M_60FPS_12BIT: + case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: + case SONY_IMX385_MIPI_2M_30FPS_12BIT: + case SONY_IMX385_MIPI_2M_30FPS_12BIT_WDR2TO1: + // GalaxyCore + case GCORE_GC02M1_MIPI_2M_30FPS_10BIT: + case GCORE_GC1054_MIPI_1M_30FPS_10BIT: + case GCORE_GC2053_MIPI_2M_30FPS_10BIT: + case GCORE_GC2053_SLAVE_MIPI_2M_30FPS_10BIT: + case GCORE_GC2053_1L_MIPI_2M_30FPS_10BIT: + case GCORE_GC2083_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_MIPI_2M_60FPS_10BIT: + case GCORE_GC2093_MIPI_2M_30FPS_10BIT_WDR2TO1: + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: + case GCORE_GC4023_MIPI_4M_30FPS_10BIT: + // cvsens + case CVSENS_CV4001_MIPI_4M_1440P_25FPS_12BIT: + case CVSENS_CV4001_MIPI_4M_1440P_15FPS_WDR2TO1: + pstViDevAttr->enBayerFormat = BAYER_FORMAT_RG; + break; + // brigates + case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT: + case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SMS_SC4336_MIPI_4M_30FPS_10BIT: + case SMS_SC4336P_MIPI_4M_30FPS_10BIT: + pstViDevAttr->enBayerFormat = BAYER_FORMAT_BG; + break; + case GCORE_GC1084_MIPI_1M_30FPS_10BIT: + case GCORE_GC1084_SLAVE_MIPI_1M_30FPS_10BIT: + case GCORE_GC4653_MIPI_4M_30FPS_10BIT: + case GCORE_GC4653_SLAVE_MIPI_4M_30FPS_10BIT: + case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: + pstViDevAttr->enBayerFormat = BAYER_FORMAT_GR; + break; + case SOI_K06_MIPI_4M_25FPS_10BIT: + pstViDevAttr->enBayerFormat = BAYER_FORMAT_GB; + break; + case LONTIUM_LT6911_2M_60FPS_8BIT: + pstViDevAttr->enDataSeq = VI_DATA_SEQ_UYVY; + pstViDevAttr->enInputDataType = VI_DATA_TYPE_YUV; + pstViDevAttr->enIntfMode = VI_MODE_MIPI_YUV422; + pstViDevAttr->enBayerFormat = BAYER_FORMAT_BG; + break; + default: + pstViDevAttr->enBayerFormat = BAYER_FORMAT_BG; + break; + }; + + // virtual channel for multi-ch +#ifndef ARCH_CV183X + switch (enSnsType) { + case PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT: + pstViDevAttr->enWorkMode = VI_WORK_MODE_2Multiplex; + break; + case PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT: + pstViDevAttr->enWorkMode = VI_WORK_MODE_4Multiplex; + break; + default: + pstViDevAttr->enWorkMode = VI_WORK_MODE_1Multiplex; + break; + } +#endif + + return CVI_SUCCESS; +} + +CVI_S32 SAMPLE_COMM_SNS_GetYuvBypassSts(SAMPLE_SNS_TYPE_E enSnsType) +{ + CVI_S32 s32Ret = 0; + //Set YUV sensor need bypass isp + switch (enSnsType) { + case GCORE_GC0312_MIPI_480P_20FPS_8BIT: + case GCORE_GC0329_MIPI_480P_10FPS_8BIT: + case GCORE_GC2145_MIPI_2M_12FPS_8BIT: + case PICO640_THERMAL_479P: + case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: + case TECHPOINT_TP2825_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_1M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_1M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_30FPS_8BIT: + case VIVO_MCS369Q_4M_30FPS_12BIT: + case VIVO_MCS369_2M_30FPS_12BIT: + case VIVO_MM308M2_2M_25FPS_8BIT: + case NEXTCHIP_N5_2M_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_30FPS_8BIT: + case PIXELPLUS_PR2020_2M_25FPS_8BIT: + case PIXELPLUS_PR2020_2M_30FPS_8BIT: + case PIXELPLUS_PR2100_2M_25FPS_8BIT: + case PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT: + case PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT: + s32Ret = 1; + break; + default: + break; + } + return s32Ret; +} +/****************************************************************************** + * funciton : Get ISP attr info by diffrent sensor + ******************************************************************************/ +CVI_S32 SAMPLE_COMM_SNS_GetIspAttrBySns(SAMPLE_SNS_TYPE_E enSnsType, ISP_PUB_ATTR_S *pstPubAttr) +{ + CVI_S32 s32Ret = CVI_SUCCESS; + PIC_SIZE_E enPicSize; + SIZE_S stSize; + + memcpy(pstPubAttr, &ISP_PUB_ATTR_SAMPLE, sizeof(ISP_PUB_ATTR_S)); + + SAMPLE_COMM_SNS_GetSize(enSnsType, &enPicSize); + SAMPLE_COMM_SNS_GetPicSize(enPicSize, &stSize); + + pstPubAttr->stSnsSize.u32Width = stSize.u32Width; + pstPubAttr->stSnsSize.u32Height = stSize.u32Height; + pstPubAttr->stWndRect.u32Width = stSize.u32Width; + pstPubAttr->stWndRect.u32Height = stSize.u32Height; + + // WDR mode + if (enSnsType >= SAMPLE_SNS_TYPE_LINEAR_BUTT) + pstPubAttr->enWDRMode = WDR_MODE_2To1_LINE; + + // FPS + switch (enSnsType) { + case CVSENS_CV4001_MIPI_4M_1440P_15FPS_WDR2TO1: + pstPubAttr->f32FrameRate = 15; + break; + case SMS_SC035GS_MIPI_480P_120FPS_12BIT: + case SMS_SC035GS_1L_MIPI_480P_120FPS_10BIT: + case SMS_SC035HGS_MIPI_480P_120FPS_12BIT: + case SMS_SC035HGS_1L_MIPI_480P_120FPS_10BIT: + case OV_OV6211_MIPI_400P_120FPS_10BIT: + case OV_OV7251_MIPI_480P_120FPS_10BIT: + pstPubAttr->f32FrameRate = 120; + break; + case SMS_SC1336_1L_MIPI_1M_60FPS_10BIT: + case SMS_SC1336_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_MIPI_1M_60FPS_10BIT: + case SMS_SC1346_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_SLAVE_MIPI_1M_60FPS_10BIT: + case SONY_IMX307_MIPI_2M_60FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: + case SONY_IMX327_MIPI_2M_60FPS_12BIT: + case SONY_IMX335_MIPI_2M_60FPS_10BIT: + case SONY_IMX335_MIPI_4M_60FPS_10BIT: + case SONY_IMX335_MIPI_5M_60FPS_10BIT: + case SONY_IMX347_MIPI_4M_60FPS_12BIT: + case GCORE_GC2093_MIPI_2M_60FPS_10BIT: + pstPubAttr->f32FrameRate = 60; + break; + case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_1M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_30FPS_8BIT: + case SMS_SC1336_1L_MIPI_1M_30FPS_10BIT: + case SMS_SC1336_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_MIPI_1M_30FPS_10BIT: + case SMS_SC1346_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_SLAVE_MIPI_1M_30FPS_10BIT: + case SMS_SC223A_1L_MIPI_2M_30FPS_10BIT: + case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: + case OV_OV5647_MIPI_2M_30FPS_10BIT: + case GCORE_GC1084_MIPI_1M_30FPS_10BIT: + case GCORE_GC1084_SLAVE_MIPI_1M_30FPS_10BIT: + case GCORE_GC2083_MIPI_2M_30FPS_10BIT: + case BYD_BF2253L_MIPI_1200P_30FPS_10BIT: + pstPubAttr->f32FrameRate = 30; + break; + case GCORE_GC2145_MIPI_2M_12FPS_8BIT: + pstPubAttr->f32FrameRate = 12; + break; + case GCORE_GC0312_MIPI_480P_20FPS_8BIT: + pstPubAttr->f32FrameRate = 20; + break; + case GCORE_GC0329_MIPI_480P_10FPS_8BIT: + pstPubAttr->f32FrameRate = 10; + break; +#ifdef FPGA_PORTING + case SONY_IMX327_MIPI_1M_30FPS_10BIT: + case SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1: + pstPubAttr->f32FrameRate = 10; + break; +#endif + case CVSENS_CV4001_MIPI_4M_1440P_25FPS_12BIT: + case TECHPOINT_TP2863_MIPI_1M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_25FPS_8BIT: + pstPubAttr->f32FrameRate = 25; + break; + default: + pstPubAttr->f32FrameRate = 25; + break; + } + + switch (enSnsType) { + case SOI_K06_MIPI_4M_25FPS_10BIT: + pstPubAttr->enBayer = BAYER_GBRG; + break; + case LONTIUM_LT6911_2M_60FPS_8BIT: + pstPubAttr->enBayer = BAYER_BGGR; + pstPubAttr->f32FrameRate = 60; + break; + // Sony + case SONY_IMX307_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX307_MIPI_2M_60FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: +#ifdef FPGA_PORTING + case SONY_IMX327_MIPI_1M_30FPS_10BIT: + case SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1: +#endif + case SONY_IMX327_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + case SONY_IMX327_MIPI_2M_60FPS_12BIT: + case SONY_IMX334_MIPI_8M_30FPS_12BIT: + case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1: + case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_4M_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_2L_MIPI_4M_30FPS_10BIT: + case SONY_IMX335_MIPI_4M_1600P_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_1600P_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_5M_30FPS_12BIT: + case SONY_IMX335_MIPI_5M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_2M_60FPS_10BIT: + case SONY_IMX335_MIPI_4M_60FPS_10BIT: + case SONY_IMX335_MIPI_5M_60FPS_10BIT: + case SONY_IMX347_MIPI_4M_60FPS_12BIT: + case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: + case SONY_IMX385_MIPI_2M_30FPS_12BIT: + case SONY_IMX385_MIPI_2M_30FPS_12BIT_WDR2TO1: + // GalaxyCore + case GCORE_GC02M1_MIPI_2M_30FPS_10BIT: + case GCORE_GC1054_MIPI_1M_30FPS_10BIT: + case GCORE_GC2053_MIPI_2M_30FPS_10BIT: + case GCORE_GC2053_SLAVE_MIPI_2M_30FPS_10BIT: + case GCORE_GC2053_1L_MIPI_2M_30FPS_10BIT: + case GCORE_GC2083_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_MIPI_2M_60FPS_10BIT: + case GCORE_GC2093_MIPI_2M_30FPS_10BIT_WDR2TO1: + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: + case GCORE_GC4023_MIPI_4M_30FPS_10BIT: + case IMGDS_MIS2008_MIPI_2M_1080P_30FPS_12BIT: + case CVSENS_CV4001_MIPI_4M_1440P_25FPS_12BIT: + case CVSENS_CV4001_MIPI_4M_1440P_15FPS_WDR2TO1: + pstPubAttr->enBayer = BAYER_RGGB; + break; + case GCORE_GC1084_MIPI_1M_30FPS_10BIT: + case GCORE_GC1084_SLAVE_MIPI_1M_30FPS_10BIT: + case GCORE_GC4653_MIPI_4M_30FPS_10BIT: + case GCORE_GC4653_SLAVE_MIPI_4M_30FPS_10BIT: + case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: + // on licheervnano + pstPubAttr->enBayer = BAYER_RGGB; + //pstPubAttr->enBayer = BAYER_GRBG; + break; +#ifdef ARCH_CV182X + case SOI_F23_MIPI_2M_30FPS_10BIT: + pstPubAttr->enBayer = BAYER_BGRGI; + break; +#endif + default: + pstPubAttr->enBayer = BAYER_BGGR; + break; + }; + + return s32Ret; +} + +/****************************************************************************** + * funciton : Get sns_obj callback + ******************************************************************************/ +CVI_VOID *SAMPLE_COMM_SNS_GetSnsObj(SAMPLE_SNS_TYPE_E enSnsType) +{ + CVI_VOID *pSnsObj; + + switch (enSnsType) { +#if defined(SENSOR_BRIGATES_BG0808) + case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT: + case BRIGATES_BG0808_MIPI_2M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsBG0808_Obj; + break; +#endif +#if defined(SENSOR_BYD_BF2253L) + case BYD_BF2253L_MIPI_1200P_30FPS_10BIT: + pSnsObj = &stSnsBF2253L_Obj; + break; +#endif +#if defined(SENSOR_CVSENS_CV4001) + case CVSENS_CV4001_MIPI_4M_1440P_25FPS_12BIT: + case CVSENS_CV4001_MIPI_4M_1440P_15FPS_WDR2TO1: + return &stSnsCV4001_Obj; +#endif +#if defined(SENSOR_GCORE_GC02M1) + case GCORE_GC02M1_MIPI_2M_30FPS_10BIT: + return &stSnsGc02m1_Obj; +#endif +#if defined(SENSOR_GCORE_GC0312) + case GCORE_GC0312_MIPI_480P_20FPS_8BIT: + return &stSnsGc0312_Obj; +#endif +#if defined(SENSOR_GCORE_GC0329) + case GCORE_GC0329_MIPI_480P_10FPS_8BIT: + return &stSnsGc0329_Obj; +#endif +#if defined(SENSOR_GCORE_GC1054) + case GCORE_GC1054_MIPI_1M_30FPS_10BIT: + return &stSnsGc1054_Obj; +#endif +#if defined(SENSOR_GCORE_GC1084) + case GCORE_GC1084_MIPI_1M_30FPS_10BIT: + return &stSnsGc1084_Obj; +#endif +#if defined(SENSOR_GCORE_GC1084_SLAVE) + case GCORE_GC1084_SLAVE_MIPI_1M_30FPS_10BIT: + return &stSnsGc1084_Slave_Obj; +#endif +#if defined(SENSOR_GCORE_GC2053) + case GCORE_GC2053_MIPI_2M_30FPS_10BIT: + return &stSnsGc2053_Obj; +#endif +#if defined(SENSOR_GCORE_GC2053_SLAVE) + case GCORE_GC2053_SLAVE_MIPI_2M_30FPS_10BIT: + return &stSnsGc2053_Slave_Obj; +#endif +#if defined(SENSOR_GCORE_GC2053_1L) + case GCORE_GC2053_1L_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsGc2053_1l_Obj; + break; +#endif +#if defined(SENSOR_GCORE_GC2083) + case GCORE_GC2083_MIPI_2M_30FPS_10BIT: + return &stSnsGc2083_Obj; +#endif +#if defined(SENSOR_GCORE_GC2093) + case GCORE_GC2093_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_MIPI_2M_60FPS_10BIT: + case GCORE_GC2093_MIPI_2M_30FPS_10BIT_WDR2TO1: + return &stSnsGc2093_Obj; +#endif +#if defined(SENSOR_GCORE_GC2093_SLAVE) + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT: + case GCORE_GC2093_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: + return &stSnsGc2093_Slave_Obj; +#endif +#if defined(SENSOR_GCORE_GC2145) + case GCORE_GC2145_MIPI_2M_12FPS_8BIT: + return &stSnsGc2145_Obj; +#endif +#if defined(SENSOR_GCORE_GC4023) + case GCORE_GC4023_MIPI_4M_30FPS_10BIT: + return &stSnsGc4023_Obj; +#endif +#if defined(SENSOR_GCORE_GC4653) + case GCORE_GC4653_MIPI_4M_30FPS_10BIT: + return &stSnsGc4653_Obj; +#endif +#if defined(SENSOR_GCORE_GC4653_SLAVE) + case GCORE_GC4653_SLAVE_MIPI_4M_30FPS_10BIT: + return &stSnsGc4653_Slave_Obj; +#endif +#if defined(SENSOR_ID_MIS2008) + case IMGDS_MIS2008_MIPI_2M_1080P_30FPS_12BIT: + pSnsObj = &stSnsMIS2008_Obj; + break; +#endif +#if defined(SENSOR_NEXTCHIP_N5) + case NEXTCHIP_N5_2M_25FPS_8BIT: + case NEXTCHIP_N5_1M_2CH_25FPS_8BIT: + pSnsObj = &stSnsN5_Obj; + break; +#endif +#if defined(SENSOR_NEXTCHIP_N6) + case NEXTCHIP_N6_2M_4CH_25FPS_8BIT: + pSnsObj = &stSnsN6_Obj; + break; +#endif +#if defined(SENSOR_OV_OS02D10) + case OV_OS02D10_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsOs02d10_Obj; + break; +#endif +#if defined(SENSOR_OV_OS02D10_SLAVE) + case OV_OS02D10_SLAVE_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsOs02d10_Slave_Obj; + break; +#endif +#if defined(SENSOR_OV_OS02K10_SLAVE) + case OV_OS02K10_SLAVE_MIPI_2M_30FPS_12BIT: + pSnsObj = &stSnsOs02k10_Slave_Obj; + break; +#endif +#if defined(SENSOR_OV_OS04A10) + case OV_OS04A10_MIPI_4M_1440P_30FPS_12BIT: + case OV_OS04A10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsOs04a10_Obj; + break; +#endif +#if defined(SENSOR_OV_OS04C10) + case OV_OS04C10_MIPI_4M_30FPS_12BIT: + case OV_OS04C10_MIPI_4M_1440P_30FPS_12BIT: + case OV_OS04C10_MIPI_4M_30FPS_10BIT_WDR2TO1: + case OV_OS04C10_MIPI_4M_1440P_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsOs04c10_Obj; + break; +#endif +#if defined(SENSOR_OV_OS04C10_SLAVE) + case OV_OS04C10_SLAVE_MIPI_4M_30FPS_12BIT: + case OV_OS04C10_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsOs04c10_Slave_Obj; + break; +#endif +#if defined(SENSOR_OV_OS08A20) + case OV_OS08A20_MIPI_4M_30FPS_10BIT: + case OV_OS08A20_MIPI_4M_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_MIPI_5M_30FPS_10BIT: + case OV_OS08A20_MIPI_5M_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_MIPI_8M_30FPS_10BIT: + case OV_OS08A20_MIPI_8M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsOs08a20_Obj; + break; +#endif +#if defined(SENSOR_OV_OS08A20_SLAVE) + case OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT: + case OV_OS08A20_SLAVE_MIPI_4M_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT: + case OV_OS08A20_SLAVE_MIPI_5M_30FPS_10BIT_WDR2TO1: + case OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT: + case OV_OS08A20_SLAVE_MIPI_8M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsOs08a20_Slave_Obj; + break; +#endif +#if defined(SENSOR_OV_OV4689) + case OV_OV4689_MIPI_4M_30FPS_10BIT: + pSnsObj = &stSnsOv4689_Obj; + break; +#endif +#if defined(SENSOR_OV_OV5647) + case OV_OV5647_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsOv5647_Obj; + break; +#endif +#if defined(SENSOR_OV_OV6211) + case OV_OV6211_MIPI_400P_120FPS_10BIT: + pSnsObj = &stSnsOv6211_Obj; + break; +#endif +#if defined(SENSOR_OV_OV7251) + case OV_OV7251_MIPI_480P_120FPS_10BIT: + pSnsObj = &stSnsOv7251_Obj; + break; +#endif +#if defined(SENSOR_PICO_384) + case PICO384_THERMAL_384X288: + pSnsObj = &stSnsPICO384_Obj; + break; +#endif +#if defined(SENSOR_PICO_640) + case PICO640_THERMAL_479P: + pSnsObj = &stSnsPICO640_Obj; + break; +#endif +#if defined(SENSOR_PIXELPLUS_PR2020) + case PIXELPLUS_PR2020_1M_25FPS_8BIT: + case PIXELPLUS_PR2020_1M_30FPS_8BIT: + case PIXELPLUS_PR2020_2M_25FPS_8BIT: + case PIXELPLUS_PR2020_2M_30FPS_8BIT: + pSnsObj = &stSnsPR2020_Obj; + break; +#endif +#if defined(SENSOR_PIXELPLUS_PR2100) + case PIXELPLUS_PR2100_2M_25FPS_8BIT: + case PIXELPLUS_PR2100_2M_2CH_25FPS_8BIT: + case PIXELPLUS_PR2100_2M_4CH_25FPS_8BIT: + pSnsObj = &stSnsPR2100_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC035GS) + case SMS_SC035GS_MIPI_480P_120FPS_12BIT: + pSnsObj = &stSnsSC035GS_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC035GS_1L) + case SMS_SC035GS_1L_MIPI_480P_120FPS_10BIT: + pSnsObj = &stSnsSC035GS_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC035HGS) + case SMS_SC035HGS_MIPI_480P_120FPS_12BIT: + pSnsObj = &stSnsSC035HGS_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC035HGS_1L) + case SMS_SC035HGS_1L_MIPI_480P_120FPS_10BIT: + pSnsObj = &stSnsSC035HGS_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC1336_1L) + case SMS_SC1336_1L_MIPI_1M_30FPS_10BIT: + case SMS_SC1336_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1336_1L_MIPI_1M_60FPS_10BIT: + case SMS_SC1336_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsSC1336_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC1346_1L) + case SMS_SC1346_1L_MIPI_1M_30FPS_10BIT: + case SMS_SC1346_1L_MIPI_1M_30FPS_10BIT_WDR2TO1: + case SMS_SC1346_1L_MIPI_1M_60FPS_10BIT: + case SMS_SC1346_1L_MIPI_1M_60FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsSC1346_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC1346_1L_SLAVE) + case SMS_SC1346_1L_SLAVE_MIPI_1M_30FPS_10BIT: + case SMS_SC1346_1L_SLAVE_MIPI_1M_60FPS_10BIT: + pSnsObj = &stSnsSC1346_1L_Slave_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC200AI) + case SMS_SC200AI_MIPI_2M_30FPS_10BIT: + case SMS_SC200AI_MIPI_2M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsSC200AI_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC301IOT) + case SMS_SC301IOT_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsSC301IOT_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC401AI) + case SMS_SC401AI_MIPI_4M_30FPS_10BIT: + case SMS_SC401AI_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsSC401AI_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC500AI) + case SMS_SC500AI_MIPI_5M_30FPS_10BIT: + case SMS_SC500AI_MIPI_5M_30FPS_10BIT_WDR2TO1: + case SMS_SC500AI_MIPI_4M_30FPS_10BIT: + case SMS_SC500AI_MIPI_4M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsSC500AI_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC501AI_2L) + case SMS_SC501AI_2L_MIPI_5M_30FPS_10BIT: + pSnsObj = &stSnsSC501AI_2L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC531AI_2L) + case SMS_SC531AI_2L_MIPI_5M_30FPS_10BIT: + pSnsObj = &stSnsSC531AI_2L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC850SL) + case SMS_SC850SL_MIPI_8M_30FPS_12BIT: + case SMS_SC850SL_MIPI_8M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsSC850SL_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC3332) + case SMS_SC3332_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsSC3332_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC3335) + case SMS_SC3335_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsSC3335_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC3335_SLAVE) + case SMS_SC3335_SLAVE_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsSC3335_Slave_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC3336) + case SMS_SC3336_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsSC3336_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC3336P) + case SMS_SC3336P_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsSC3336P_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2331_1L) + case SMS_SC2331_1L_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2331_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2331_1L_SLAVE) + case SMS_SC2331_1L_SLAVE_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2331_1L_Slave_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2331_1L_SLAVE1) + case SMS_SC2331_1L_SLAVE1_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2331_1L_Slave1_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2335) + case SMS_SC2335_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2335_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2336) + case SMS_SC2336_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2336_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2336_SLAVE) + case SMS_SC2336_SLAVE_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2336_Slave_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2336_SLAVE1) + case SMS_SC2336_SLAVE1_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2336_Slave1_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2336_1L) + case SMS_SC2336_1L_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2336_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2336P) + case SMS_SC2336P_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2336P_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC2336P_1L) + case SMS_SC2336P_1L_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC2336P_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC223A_1L) + case SMS_SC223A_1L_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsSC223A_1L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC4210) + case SMS_SC4210_MIPI_4M_30FPS_12BIT: + case SMS_SC4210_MIPI_4M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsSC4210_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC4336) + case SMS_SC4336_MIPI_4M_30FPS_10BIT: + pSnsObj = &stSnsSC4336_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC4336P) + case SMS_SC4336P_MIPI_4M_30FPS_10BIT: + pSnsObj = &stSnsSC4336P_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC5336_2L) + case SMS_SC5336_2L_MIPI_5M_30FPS_10BIT: + pSnsObj = &stSnsSC5336_2L_Obj; + break; +#endif +#if defined(SENSOR_SMS_SC8238) + case SMS_SC8238_MIPI_8M_30FPS_10BIT: + case SMS_SC8238_MIPI_8M_15FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsSC8238_Obj; + break; +#endif +#if defined(SENSOR_SOI_F23) + case SOI_F23_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsF23_Obj; + break; +#endif +#if defined(SENSOR_SOI_F35) + case SOI_F35_MIPI_2M_30FPS_10BIT: + case SOI_F35_MIPI_2M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsF35_Obj; + break; +#endif +#if defined(SENSOR_SOI_F35_SLAVE) + case SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT: + case SOI_F35_SLAVE_MIPI_2M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsF35_Slave_Obj; + break; +#endif +#if defined(SENSOR_SOI_F37P) + case SOI_F37P_MIPI_2M_30FPS_10BIT: + pSnsObj = &stSnsF37P_Obj; + break; +#endif +#if defined(SENSOR_SOI_H65) + case SOI_H65_MIPI_1M_30FPS_10BIT: + pSnsObj = &stSnsH65_Obj; + break; +#endif +#if defined(SENSOR_SOI_K06) + case SOI_K06_MIPI_4M_25FPS_10BIT: + return &stSnsK06_Obj; +#endif +#if defined(SENSOR_SOI_Q03) + case SOI_Q03_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsQ03_Obj; + break; +#endif +#if defined(SENSOR_SOI_Q03P) + case SOI_Q03P_MIPI_3M_30FPS_10BIT: + pSnsObj = &stSnsQ03P_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX290_2L) + case SONY_IMX290_MIPI_1M_30FPS_12BIT: + case SONY_IMX290_MIPI_2M_60FPS_12BIT: + pSnsObj = &stSnsImx290_2l_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX307) + case SONY_IMX307_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_MIPI_2M_60FPS_12BIT: + case SONY_IMX307_MIPI_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx307_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX307_SLAVE) + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx307_Slave_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX307_2L) + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX307_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx307_2l_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX307_SUBLVDS) + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_60FPS_12BIT: + case SONY_IMX307_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx307_Sublvds_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX327) + case SONY_IMX327_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_MIPI_2M_60FPS_12BIT: + case SONY_IMX327_MIPI_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx327_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX327_SLAVE) + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_SLAVE_MIPI_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx327_Slave_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX327_2L) + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT: + case SONY_IMX327_2L_MIPI_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx327_2l_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX327_FPGA) && defined(FPGA_PORTING) + case SONY_IMX327_MIPI_1M_30FPS_10BIT: + case SONY_IMX327_MIPI_1M_30FPS_10BIT_WDR2TO1: + pSnsObj = &stSnsImx327_fpga_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX327_SUBLVDS) + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT: + case SONY_IMX327_SUBLVDS_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx327_Sublvds_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX334) + case SONY_IMX334_MIPI_8M_30FPS_12BIT: + case SONY_IMX334_MIPI_8M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx334_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX335) + case SONY_IMX335_MIPI_2M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_4M_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_2L_MIPI_4M_30FPS_10BIT: + case SONY_IMX335_MIPI_4M_1600P_30FPS_12BIT: + case SONY_IMX335_MIPI_4M_1600P_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_5M_30FPS_12BIT: + case SONY_IMX335_MIPI_5M_30FPS_10BIT_WDR2TO1: + case SONY_IMX335_MIPI_2M_60FPS_10BIT: + case SONY_IMX335_MIPI_4M_60FPS_10BIT: + case SONY_IMX335_MIPI_5M_60FPS_10BIT: + pSnsObj = &stSnsImx335_Obj; + break; +#endif +#if defined(SENSOR_SONY_IMX347) + case SONY_IMX347_MIPI_4M_60FPS_12BIT: + case SONY_IMX347_MIPI_4M_30FPS_12BIT_WDR2TO1: + return &stSnsImx347_Obj; +#endif +#if defined(SENSOR_SONY_IMX385) + case SONY_IMX385_MIPI_2M_30FPS_12BIT: + case SONY_IMX385_MIPI_2M_30FPS_12BIT_WDR2TO1: + pSnsObj = &stSnsImx385_Obj; + break; +#endif +#if defined(SENSOR_TECHPOINT_TP2850) + case TECHPOINT_TP2850_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2850_MIPI_4M_30FPS_8BIT: + pSnsObj = &stSnsTP2850_Obj; + break; +#endif +#if defined(SENSOR_TECHPOINT_TP2825) + case TECHPOINT_TP2825_MIPI_2M_30FPS_8BIT: + pSnsObj = &stSnsTP2825_Obj; + break; +#endif +#if defined(SENSOR_TECHPOINT_TP2863) + case TECHPOINT_TP2863_MIPI_1M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_30FPS_8BIT: + case TECHPOINT_TP2863_MIPI_1M_25FPS_8BIT: + case TECHPOINT_TP2863_MIPI_2M_25FPS_8BIT: + pSnsObj = &stSnsTP2863_Obj; + break; +#endif +#if defined(SENSOR_VIVO_MCS369) + case VIVO_MCS369_2M_30FPS_12BIT: + pSnsObj = &stSnsMCS369_Obj; + break; +#endif +#if defined(SENSOR_VIVO_MCS369Q) + case VIVO_MCS369Q_4M_30FPS_12BIT: + pSnsObj = &stSnsMCS369Q_Obj; + break; +#endif +#if defined(SENSOR_VIVO_MM308M2) + case VIVO_MM308M2_2M_25FPS_8BIT: + pSnsObj = &stSnsMM308M2_Obj; + break; +#endif +#if defined(SENSOR_LONTIUM_LT6911) + case LONTIUM_LT6911_2M_60FPS_8BIT: + pSnsObj = &stSnsLT6911_Obj; + break; +#endif + default: + pSnsObj = CVI_NULL; + break; + } + return pSnsObj; +} + +/****************************************************************************** + * funciton : Get sns_cfg from sensor_cfg.ini + ******************************************************************************/ + +/*=== Source section parser handler begin === */ +static void parse_source_type(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + (CVI_VOID) param0; + (CVI_VOID) param1; + (CVI_VOID) param2; + + SAMPLE_PRT("source type = %s\n", value); + if (strcmp(value, "SOURCE_USER_FE") == 0) { + cfg->enSource = VI_PIPE_FRAME_SOURCE_USER_FE; + } +} + +static void parse_source_devnum(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + int devno = atoi(value); + + (CVI_VOID) param0; + (CVI_VOID) param1; + (CVI_VOID) param2; + + SAMPLE_PRT("devNum = %s\n", value); + + if (devno >= 1 && devno <= VI_MAX_DEV_NUM) + cfg->devNum = devno; + else + cfg->devNum = 1; +} +/* === Source section parser handler end === */ + +/* === Sensor section parser handler begin === */ +static int parse_lane_id(CVI_S16 *LaneId, const char *value) +{ + char buf[8]; + int offset = 0, idx = 0, k; + + for (k = 0; k < 30; k++) { + /* find next ',' */ + if (value[k] == ',' || value[k] == '\0') { + if (k == offset) { + SAMPLE_PRT("lane_id parse error, is the format correct?\n"); + return -1; + } + memset(buf, 0, sizeof(buf)); + memcpy(buf, &value[offset], k - offset); + buf[k-offset] = '\0'; + LaneId[idx++] = atoi(buf); + offset = k + 1; + } + + if (value[k] == '\0' || idx == 5) + break; + } + + if (k == 30) { + SAMPLE_PRT("lane_id parse error, is the format correct?\n"); + return -1; + } + + return 0; +} + +static int parse_pn_swap(CVI_S8 *PNSwap, const char *value) +{ + char buf[8]; + int offset = 0, idx = 0, k; + + for (k = 0; k < 30; k++) { + /* find next ',' */ + if (value[k] == ',' || value[k] == '\0') { + if (k == offset) { + SAMPLE_PRT("lane_id parse error, is the format correct?\n"); + return -1; + } + memset(buf, 0, sizeof(buf)); + memcpy(buf, &value[offset], k - offset); + buf[k-offset] = '\0'; + PNSwap[idx++] = atoi(buf); + offset = k + 1; + } + + if (value[k] == '\0' || idx == 5) + break; + } + + if (k == 30) { + SAMPLE_PRT("lane_id parse error, is the format correct?\n"); + return -1; + } + + return 0; +} + +static void parse_sensor_name(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ +#define NAME_SIZE 20 + CVI_U32 index = param0; + CVI_U32 i; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("sensor = %s\n", value); + char sensorNameEnv[NAME_SIZE]; + + snprintf(sensorNameEnv, NAME_SIZE, "SENSORNAME%d", index); + setenv(sensorNameEnv, value, 1); + + for (i = 0; i < SAMPLE_SNS_TYPE_BUTT; i++) { + if (strcmp(value, snsr_type_name[i]) == 0) { + cfg->enSnsType[index] = i; + cfg->enWDRMode[index] = (i < SAMPLE_SNS_TYPE_LINEAR_BUTT) ? + WDR_MODE_NONE : WDR_MODE_2To1_LINE; + break; + } + } + if (i == SAMPLE_SNS_TYPE_BUTT) { + cfg->enSnsType[index] = SAMPLE_SNS_TYPE_BUTT; + cfg->enWDRMode[index] = WDR_MODE_NONE; + cfg->u8UseMultiSns = index; + SAMPLE_PRT("ERROR: can not find sensor ini in /mnt/data/\n"); + } +} + +static void parse_sensor_busid(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("bus_id = %s\n", value); + cfg->s32BusId[index] = atoi(value); +} + +static void parse_sensor_i2caddr(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("sns_i2c_addr = %s\n", value); + cfg->s32SnsI2cAddr[index] = atoi(value); +} + +static void parse_sensor_mipidev(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("mipi_dev = %s\n", value); + cfg->MipiDev[index] = atoi(value); +} + +static void parse_sensor_laneid(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("Lane_id = %s\n", value); + parse_lane_id(cfg->as16LaneId[index], value); +} + +static void parse_sensor_pnswap(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("pn_swap = %s\n", value); + parse_pn_swap(cfg->as8PNSwap[index], value); +} + +static void parse_sensor_hwsync(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("hw_sync = %s\n", value); + cfg->u8HwSync[index] = atoi(value); +} + +static void parse_sensor_mclken(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("mclk_en = %s\n", value); + cfg->stMclkAttr[index].bMclkEn = atoi(value); +} + +static void parse_sensor_mclk(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("mclk = %s\n", value); + cfg->stMclkAttr[index].u8Mclk = atoi(value); +} + +static void parse_sensor_orien(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("orien = %s\n", value); + cfg->u8Orien[index] = atoi(value); +} + +static void parse_sensor_muxdev(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("muxdev = %s\n", value); + cfg->u8MuxDev[index] = atoi(value); +} + +static void parse_sensor_attachdev(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("attach_dev = %s\n", value); + cfg->u8AttachDev[index] = atoi(value); +} + +static void parse_sensor_switchgpio(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("switch_gpio = %s\n", value); + cfg->s16SwitchGpio[index] = atoi(value); +} + +static void parse_sensor_switchpol(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2) +{ + CVI_U32 index = param0; + + (CVI_VOID) param1; + (CVI_VOID) param2; + SAMPLE_PRT("switch_pol = %s\n", value); + cfg->u8SwitchPol[index] = atoi(value); +} + + /* === Sensor section parser handler end === */ +typedef CVI_VOID(*parser)(SAMPLE_INI_CFG_S *cfg, const char *value, + CVI_U32 param0, CVI_U32 param1, CVI_U32 param2); + +typedef struct _INI_HDLR_S { + const char name[16]; + CVI_U32 param0; + CVI_U32 param1; + CVI_U32 param2; + parser pfnJob; +} INI_HDLR_S; + +typedef enum _INI_SOURCE_NAME_E { + INI_SOURCE_TYPE = 0, + INI_SOURCE_DEVNUM, + INI_SOURCE_NUM, +} INI_SOURCE_NAME_E; + +typedef enum _INI_SENSOR_NAME_E { + INI_SENSOR_NAME = 0, + INI_SENSOR_BUSID, + INI_SENSOR_I2CADDR, + INI_SENSOR_MIPIDEV, + INI_SENSOR_LANEID, + INI_SENSOR_PNSWAP, + INI_SENSOR_HWSYNC, + INI_SENSOR_MCLKEN, + INI_SENSOR_MCLK, + INI_SENSOR_ORIEN, + INI_SENSOR_MUXDEV, + INI_SENSOR_ATTACHDEV, + INI_SENSOR_SWITCHGPIO, + INI_SENSOR_SWITCHPOL, + INI_SENSOR_NUM, +} INI_SENSOR_NAME_E; + +const INI_HDLR_S stSectionSource[INI_SOURCE_NUM] = { + [INI_SOURCE_TYPE] = {"type", 0, 0, 0, parse_source_type}, + [INI_SOURCE_DEVNUM] = {"dev_num", 0, 0, 0, parse_source_devnum}, +}; + +const INI_HDLR_S stSectionSensor1[INI_SENSOR_NUM] = { + [INI_SENSOR_NAME] = {"name", 0, 0, 0, parse_sensor_name}, + [INI_SENSOR_BUSID] = {"bus_id", 0, 0, 0, parse_sensor_busid}, + [INI_SENSOR_I2CADDR] = {"sns_i2c_addr", 0, 0, 0, parse_sensor_i2caddr}, + [INI_SENSOR_MIPIDEV] = {"mipi_dev", 0, 0, 0, parse_sensor_mipidev}, + [INI_SENSOR_LANEID] = {"lane_id", 0, 0, 0, parse_sensor_laneid}, + [INI_SENSOR_PNSWAP] = {"pn_swap", 0, 0, 0, parse_sensor_pnswap}, + [INI_SENSOR_HWSYNC] = {"hw_sync", 0, 0, 0, parse_sensor_hwsync}, + [INI_SENSOR_MCLKEN] = {"mclk_en", 0, 0, 0, parse_sensor_mclken}, + [INI_SENSOR_MCLK] = {"mclk", 0, 0, 0, parse_sensor_mclk}, + [INI_SENSOR_ORIEN] = {"orien", 0, 0, 0, parse_sensor_orien}, + [INI_SENSOR_MUXDEV] = {"mux_dev", 0, 0, 0, parse_sensor_muxdev}, + [INI_SENSOR_ATTACHDEV] = {"attach_dev", 0, 0, 0, parse_sensor_attachdev}, + [INI_SENSOR_SWITCHGPIO] = {"switch_gpio", 0, 0, 0, parse_sensor_switchgpio}, + [INI_SENSOR_SWITCHPOL] = {"switch_pol", 0, 0, 0, parse_sensor_switchpol}, +}; + +const INI_HDLR_S stSectionSensor2[INI_SENSOR_NUM] = { + [INI_SENSOR_NAME] = {"name", 1, 0, 0, parse_sensor_name}, + [INI_SENSOR_BUSID] = {"bus_id", 1, 0, 0, parse_sensor_busid}, + [INI_SENSOR_I2CADDR] = {"sns_i2c_addr", 1, 0, 0, parse_sensor_i2caddr}, + [INI_SENSOR_MIPIDEV] = {"mipi_dev", 1, 0, 0, parse_sensor_mipidev}, + [INI_SENSOR_LANEID] = {"lane_id", 1, 0, 0, parse_sensor_laneid}, + [INI_SENSOR_PNSWAP] = {"pn_swap", 1, 0, 0, parse_sensor_pnswap}, + [INI_SENSOR_HWSYNC] = {"hw_sync", 1, 0, 0, parse_sensor_hwsync}, + [INI_SENSOR_MCLKEN] = {"mclk_en", 1, 0, 0, parse_sensor_mclken}, + [INI_SENSOR_MCLK] = {"mclk", 1, 0, 0, parse_sensor_mclk}, + [INI_SENSOR_ORIEN] = {"orien", 1, 0, 0, parse_sensor_orien}, + [INI_SENSOR_MUXDEV] = {"mux_dev", 1, 0, 0, parse_sensor_muxdev}, + [INI_SENSOR_ATTACHDEV] = {"attach_dev", 1, 0, 0, parse_sensor_attachdev}, + [INI_SENSOR_SWITCHGPIO] = {"switch_gpio", 1, 0, 0, parse_sensor_switchgpio}, + [INI_SENSOR_SWITCHPOL] = {"switch_pol", 1, 0, 0, parse_sensor_switchpol}, +}; + +const INI_HDLR_S stSectionSensor3[INI_SENSOR_NUM] = { + [INI_SENSOR_NAME] = {"name", 2, 0, 0, parse_sensor_name}, + [INI_SENSOR_BUSID] = {"bus_id", 2, 0, 0, parse_sensor_busid}, + [INI_SENSOR_I2CADDR] = {"sns_i2c_addr", 2, 0, 0, parse_sensor_i2caddr}, + [INI_SENSOR_MIPIDEV] = {"mipi_dev", 2, 0, 0, parse_sensor_mipidev}, + [INI_SENSOR_LANEID] = {"lane_id", 2, 0, 0, parse_sensor_laneid}, + [INI_SENSOR_PNSWAP] = {"pn_swap", 2, 0, 0, parse_sensor_pnswap}, + [INI_SENSOR_HWSYNC] = {"hw_sync", 2, 0, 0, parse_sensor_hwsync}, + [INI_SENSOR_MCLKEN] = {"mclk_en", 2, 0, 0, parse_sensor_mclken}, + [INI_SENSOR_MCLK] = {"mclk", 2, 0, 0, parse_sensor_mclk}, + [INI_SENSOR_ORIEN] = {"orien", 2, 0, 0, parse_sensor_orien}, + [INI_SENSOR_MUXDEV] = {"mux_dev", 2, 0, 0, parse_sensor_muxdev}, + [INI_SENSOR_ATTACHDEV] = {"attach_dev", 2, 0, 0, parse_sensor_attachdev}, + [INI_SENSOR_SWITCHGPIO] = {"switch_gpio", 2, 0, 0, parse_sensor_switchgpio}, + [INI_SENSOR_SWITCHPOL] = {"switch_pol", 2, 0, 0, parse_sensor_switchpol}, +}; + +CVI_S32 SAMPLE_COMM_SNS_SetIniPath(const CVI_CHAR *iniPath) +{ + int ret; + + if (iniPath == NULL) { + SAMPLE_PRT("%s: null ptr\n", __func__); + ret = CVI_FAILURE; + } else if (strlen(iniPath) >= SNSCFGPATH_SIZE) { + SAMPLE_PRT("%s: SNSCFGPATH_SIZE is too small\n", __func__); + ret = CVI_FAILURE; + } else { + strncpy(g_snsCfgPath, iniPath, SNSCFGPATH_SIZE); + ret = CVI_SUCCESS; + } + + return ret; +} + +static int parse_handler(void *user, const char *section, const char *name, const char *value) +{ + SAMPLE_INI_CFG_S *cfg = (SAMPLE_INI_CFG_S *)user; + const INI_HDLR_S *hdler; + int i, size; + + if (strcmp(section, "source") == 0) { + hdler = stSectionSource; + size = INI_SOURCE_NUM; + } else if (strcmp(section, "sensor") == 0) { + hdler = stSectionSensor1; + size = INI_SENSOR_NUM; + } else if (strcmp(section, "sensor2") == 0) { + hdler = stSectionSensor2; + size = INI_SENSOR_NUM; + } else if (strcmp(section, "sensor3") == 0) { + hdler = stSectionSensor3; + size = INI_SENSOR_NUM; + } else { + /* unknown section/name */ + return 1; + } + for (i = 0; i < size; i++) { + if (strcmp(name, hdler[i].name) == 0) { + hdler[i].pfnJob(cfg, value, hdler[i].param0, + hdler[i].param1, hdler[i].param2); + break; + } + } + + return 1; +} + +CVI_S32 SAMPLE_COMM_SNS_ParseIni(SAMPLE_INI_CFG_S *pstIniCfg) +{ + int ret; + + memcpy(pstIniCfg, &stDefIniCfg, sizeof(*pstIniCfg)); + if (g_snsCfgPath[0] != 0) { + SAMPLE_PRT("Parse %s\n", g_snsCfgPath); + ret = ini_parse(g_snsCfgPath, parse_handler, pstIniCfg); + if (ret >= 0) { + return CVI_SUCCESS; + } + if (ret != -1) { + SAMPLE_PRT("Parse %s incomplete, use default cfg\n", INI_FILE_PATH); + return CVI_FAILURE; + } + + SAMPLE_PRT("%s Not Found\n", g_snsCfgPath); + } + SAMPLE_PRT("Parse %s\n", INI_FILE_PATH); + ret = ini_parse(INI_FILE_PATH, parse_handler, pstIniCfg); + if (ret >= 0) { + return CVI_SUCCESS; + } + if (ret != -1) { + SAMPLE_PRT("Parse %s incomplete, use default cfg\n", INI_FILE_PATH); + return CVI_FAILURE; + } + SAMPLE_PRT("%s Not Found\n", INI_FILE_PATH); + SAMPLE_PRT("Parse %s\n", INI_DEF_PATH); + + ret = ini_parse(INI_DEF_PATH, parse_handler, pstIniCfg); + if (ret < 0) { + if (ret == -1) { + SAMPLE_PRT("%s not exist, use default cfg\n", INI_DEF_PATH); + } else { + SAMPLE_PRT("Parse %s incomplete, use default cfg\n", INI_DEF_PATH); + } + + return CVI_FAILURE; + } + + return CVI_SUCCESS; +} diff --git a/vision/components/vision/CMakeLists.txt b/support/sg2002/additional/vision/CMakeLists.txt similarity index 100% rename from vision/components/vision/CMakeLists.txt rename to support/sg2002/additional/vision/CMakeLists.txt diff --git a/vision/components/vision/Kconfig b/support/sg2002/additional/vision/Kconfig similarity index 100% rename from vision/components/vision/Kconfig rename to support/sg2002/additional/vision/Kconfig diff --git a/vision/components/vision/include/base/maix_camera_base.hpp b/support/sg2002/additional/vision/include/base/maix_camera_base.hpp similarity index 100% rename from vision/components/vision/include/base/maix_camera_base.hpp rename to support/sg2002/additional/vision/include/base/maix_camera_base.hpp diff --git a/vision/components/vision/include/maix_camera.hpp b/support/sg2002/additional/vision/include/maix_camera.hpp similarity index 100% rename from vision/components/vision/include/maix_camera.hpp rename to support/sg2002/additional/vision/include/maix_camera.hpp diff --git a/vision/components/vision/include/maix_image.hpp b/support/sg2002/additional/vision/include/maix_image.hpp similarity index 100% rename from vision/components/vision/include/maix_image.hpp rename to support/sg2002/additional/vision/include/maix_image.hpp diff --git a/vision/components/vision/include/maix_image_color.hpp b/support/sg2002/additional/vision/include/maix_image_color.hpp similarity index 100% rename from vision/components/vision/include/maix_image_color.hpp rename to support/sg2002/additional/vision/include/maix_image_color.hpp diff --git a/vision/components/vision/include/maix_image_def.hpp b/support/sg2002/additional/vision/include/maix_image_def.hpp similarity index 66% rename from vision/components/vision/include/maix_image_def.hpp rename to support/sg2002/additional/vision/include/maix_image_def.hpp index aa84e45..26feb9a 100644 --- a/vision/components/vision/include/maix_image_def.hpp +++ b/support/sg2002/additional/vision/include/maix_image_def.hpp @@ -18,7 +18,7 @@ namespace maix::image /** * Image formats - * @attention for developers, update this enum will also need to update the fmt_size in maix_image.cpp + * @attention for MaixPy firmware developers, update this enum will also need to update the fmt_size and fmt_names too !!! * @maixpy maix.image.Format */ enum Format @@ -36,6 +36,22 @@ namespace maix::image FMT_YVU420P, // YYY...VVV...UUU FMT_YUV420P, // YYY...UUU...VVV FMT_GRAYSCALE, + FMT_BGGR6, // 6-bit Bayer format with a BGGR pattern. + FMT_GBRG6, // 6-bit Bayer format with a GBRG pattern. + FMT_GRBG6, // 6-bit Bayer format with a GRBG pattern. + FMT_RGGB6, // 6-bit Bayer format with a RGGB pattern. + FMT_BGGR8, // 8-bit Bayer format with a BGGR pattern. + FMT_GBRG8, // 8-bit Bayer format with a GBRG pattern. + FMT_GRBG8, // 8-bit Bayer format with a GRBG pattern. + FMT_RGGB8, // 8-bit Bayer format with a RGGB pattern. + FMT_BGGR10, // 10-bit Bayer format with a BGGR pattern. + FMT_GBRG10, // 10-bit Bayer format with a GBRG pattern. + FMT_GRBG10, // 10-bit Bayer format with a GRBG pattern. + FMT_RGGB10, // 10-bit Bayer format with a RGGB pattern. + FMT_BGGR12, // 12-bit Bayer format with a BGGR pattern. + FMT_GBRG12, // 12-bit Bayer format with a GBRG pattern. + FMT_GRBG12, // 12-bit Bayer format with a GRBG pattern. + FMT_RGGB12, // 12-bit Bayer format with a RGGB pattern. FMT_UNCOMPRESSED_MAX, // compressed format below, not compressed should define upper @@ -45,32 +61,8 @@ namespace maix::image FMT_COMPRESSED_MAX, FMT_INVALID = 0xFF // format not valid - }; - // enum Format - // { - // FMT_RGB888 = 0, // RGBRGB...RGB, R at the lowest address - // FMT_BGR888 = 1, // BGRBGR...BGR, B at the lowest address - // FMT_RGBA8888 = 2, // RGBARGBA...RGBA, R at the lowest address - // FMT_BGRA8888 = 3, // BGRABGRA...BGRA, B at the lowest address - // FMT_RGB565 = 4, - // FMT_BGR565 = 5, - // FMT_YUV422SP = 6, // YYY...UVUVUV...UVUV - // FMT_YUV422P = 7, // YYY...UUU...VVV - // FMT_YVU420SP = 8, // YYY...VUVUVU...VUVU, NV21 - // FMT_YUV420SP = 9, // YYY...UVUVUV...UVUV, NV12 - // FMT_YVU420P = 10, // YYY...VVV...UUU - // FMT_YUV420P = 11, // YYY...UUU...VVV - // FMT_GRAYSCALE = 12, // YYY... - // FMT_UNCOMPRESSED_MAX, + }; // !!!! update this section please update fmt_size and fmt_names too !!!! - // // compressed format below, not compressed should define upper - // FMT_COMPRESSED_MIN = 200, - // FMT_JPEG = 201, - // FMT_PNG = 202, - // FMT_COMPRESSED_MAX, - - // FMT_INVALID = 0xFF // format not valid - // }; /** * Image format size in bytes * @attention It's a copy of this variable in MaixPy, @@ -91,12 +83,29 @@ namespace maix::image 1.5, 1.5, 1.5, - 1, - 0, - 0, - 0, - 0, - 0 + 1, // grayscale + 0.75, // 6-bit Bayer format + 0.75, // 6-bit Bayer format + 0.75, // 6-bit Bayer format + 0.75, // 6-bit Bayer format + 1, // 8-bit Bayer format + 1, // 8-bit Bayer format + 1, // 8-bit Bayer format + 1, // 8-bit Bayer format + 1.25, // 10-bit Bayer format + 1.25, // 10-bit Bayer format + 1.25, // 10-bit Bayer format + 1.25, // 10-bit Bayer format + 1.5, // 12-bit Bayer format + 1.5, // 12-bit Bayer format + 1.5, // 12-bit Bayer format + 1.5, // 12-bit Bayer format + 0, // uncompereed_max + 0, // compressed_min + 1, // jpeg + 1, // png + 0, // compressed_max + 0 // invalid }; /** @@ -114,10 +123,32 @@ namespace maix::image "YUV422P", "YVU420SP", "YUV420SP", - "YVU420P" + "YVU420P", "YUV420P", "GRAYSCALE", - "MAX"}; + "BGGR6", + "GBRG6", + "GRBG6", + "RG6B6", + "BGGR8", + "GBRG8", + "GRBG8", + "RG6B8", + "BGGR10", + "GBRG10", + "GRBG10", + "RG6B10", + "BGGR12", + "GBRG12", + "GRBG12", + "RG6B12", + "UNCOMPRESSED_MAX", + "COMPRESSED_MIN", + "JPEG", + "PNG", + "COMPRESSED_MAX", + "INVALID" + }; /** * Image size type @@ -171,7 +202,7 @@ namespace maix::image * @param index 0 for width, 1 for height * @return int& width or height * @maixpy maix.image.Size.__getitem__ - * @maixcdk maix.image.Size.[] + * @maixcdk maix.image.Size.operator[] */ int &operator[](int index) { @@ -267,4 +298,16 @@ namespace maix::image EDGE_CANNY, EDGE_SIMPLE, }; + + /** + * FlipDir + * @maixpy maix.image.FlipDir + */ + enum class FlipDir + { + X, + Y, + XY + }; + } diff --git a/vision/components/vision/include/maix_image_obj.hpp b/support/sg2002/additional/vision/include/maix_image_obj.hpp similarity index 100% rename from vision/components/vision/include/maix_image_obj.hpp rename to support/sg2002/additional/vision/include/maix_image_obj.hpp diff --git a/vision/components/vision/include/maix_vision.hpp b/support/sg2002/additional/vision/include/maix_vision.hpp similarity index 100% rename from vision/components/vision/include/maix_vision.hpp rename to support/sg2002/additional/vision/include/maix_vision.hpp diff --git a/vision/components/vision/include_private/maix_image_util.hpp b/support/sg2002/additional/vision/include_private/maix_image_util.hpp similarity index 100% rename from vision/components/vision/include_private/maix_image_util.hpp rename to support/sg2002/additional/vision/include_private/maix_image_util.hpp diff --git a/vision/components/vision/port/maixcam/maix_camera_mmf.hpp b/support/sg2002/additional/vision/port/maixcam/maix_camera_mmf.hpp similarity index 100% rename from vision/components/vision/port/maixcam/maix_camera_mmf.hpp rename to support/sg2002/additional/vision/port/maixcam/maix_camera_mmf.hpp diff --git a/vision/components/vision/src/maix_camera.cpp b/support/sg2002/additional/vision/src/maix_camera.cpp similarity index 100% rename from vision/components/vision/src/maix_camera.cpp rename to support/sg2002/additional/vision/src/maix_camera.cpp diff --git a/vision/components/vision/src/maix_image.cpp b/support/sg2002/additional/vision/src/maix_image.cpp similarity index 100% rename from vision/components/vision/src/maix_image.cpp rename to support/sg2002/additional/vision/src/maix_image.cpp diff --git a/vision/components/vision/src/maix_image_ops.cpp b/support/sg2002/additional/vision/src/maix_image_ops.cpp similarity index 100% rename from vision/components/vision/src/maix_image_ops.cpp rename to support/sg2002/additional/vision/src/maix_image_ops.cpp diff --git a/support/sg2002/build b/support/sg2002/build new file mode 100755 index 0000000..cfc0680 --- /dev/null +++ b/support/sg2002/build @@ -0,0 +1,164 @@ +#!/bin/bash + +export MAIXCDK_PATH=~/MaixCDK +export NanoKVM_PATH=~/NanoKVM + +Project_Name="None" +Project_PATH="None" +Project_Action="None" +KVMAPP_PATH="$NanoKVM_PATH/kvmapp" + +maixcdk_build() { + local input_value="$1" + + DIST_PATH="./dist" + rm -rf $DIST_PATH + + if [ "$input_value" = "from_zero" ] + then + maixcdk build < 開発には SSH が必要です。Web 設定で有効にすることができます: `設定 > SSH` + CORS 制限のため、ローカル開発中は認証を無効にする必要があります。 認証機能を開発するには、プロジェクトをビルドして NanoKVM でテストする必要があります。 @@ -55,4 +57,7 @@ pnpm build 3. `web` を NanoKVM の `/kvmapp/server/` にアップロードします。 4. NanoKVM で `/etc/init.d/S95nanokvm restart` を実行してサービスを再起動します。 -また、ブラウザに古いバージョンのキャッシュが残っている可能性があります。ページが開かない場合は、強制リフレッシュまたはキャッシュのクリアを試してください。 +Tips: + +1. ファイルのアップロードには SSH が必要です。Web 設定で有効にすることができます: `設定 > SSH` +2. ブラウザに古いバージョンのキャッシュが残っている可能性があります。ページが開かない場合は、強制リフレッシュまたはキャッシュのクリアを試してください。 diff --git a/web/src/i18n/locales/en.ts b/web/src/i18n/locales/en.ts index d776aa6..9ef14a7 100644 --- a/web/src/i18n/locales/en.ts +++ b/web/src/i18n/locales/en.ts @@ -47,6 +47,7 @@ const en = { finishBtn: 'Finished' }, screen: { + title: 'Screen', video: 'Video Mode', resolution: 'Resolution', auto: 'Automatic', @@ -65,6 +66,7 @@ const en = { resetHdmi: 'Reset HDMI' }, keyboard: { + title: 'Keyboard', paste: 'Paste', tips: 'Only standard keyboard letters and symbols are supported', placeholder: 'Please input', @@ -73,6 +75,7 @@ const en = { ctrlaltdel: 'Ctrl+Alt+Del' }, mouse: { + title: 'Mouse', default: 'Default cursor', pointer: 'Pointer cursor', cell: 'Cell cursor', @@ -86,13 +89,14 @@ const en = { resetHid: 'Reset HID' }, image: { - title: 'Image', + title: 'Images', loading: 'Loading...', empty: 'Nothing Found', cdrom: 'Mount the image in CD-ROM mode', mountFailed: 'Mount Failed', mountDesc: "In some systems, it's necessary to eject the virtual disk on the remote host before mounting the image.", + refresh: 'Refresh the image list', tips: { title: 'How to upload', usb1: 'Connect the NanoKVM to your computer via USB.', @@ -110,7 +114,7 @@ const en = { } }, script: { - title: 'Script', + title: 'Scripts', upload: 'Upload', run: 'Run', runBackground: 'Run Background', @@ -139,7 +143,7 @@ const en = { ok: 'Ok' }, download: { - title: 'Download Image', + title: 'Image Downloader', input: 'Please enter a remote image URL', ok: 'Ok', disabled: '/data partition is RO, so we cannot download the image' @@ -257,8 +261,15 @@ const en = { } }, error: { - title: "We've ran into an issue", - refresh: 'Refresh' + title: 'We\'ve ran into an issue', + refresh: 'Refresh', + }, + fullscreen: { + toggle: 'Toggle Fullscreen', + }, + menu: { + collapse: 'Collapse Menu', + expand: 'Expand Menu', } } }; diff --git a/web/src/i18n/locales/ko.ts b/web/src/i18n/locales/ko.ts index d4f8805..da558b6 100644 --- a/web/src/i18n/locales/ko.ts +++ b/web/src/i18n/locales/ko.ts @@ -14,8 +14,7 @@ const ko = { placeholderPassword2: '비밀번호를 다시 입력하세요.', noEmptyUsername: '사용자 이름은 비어있을 수 없습니다.', noEmptyPassword: '비밀번호는 비어있을 수 없습니다.', - noAccount: - '사용자 정보를 불러오는 데 실패했습니다. 페이지를 새로고침하거나 비밀번호를 초기화하세요.', + noAccount: '사용자 정보를 불러오는 데 실패했습니다. 페이지를 새로고침하거나 비밀번호를 초기화하세요.', invalidUser: '사용자 이름이나 비밀번호가 틀렸습니다.', error: '알 수 없는 오류', changePassword: '비밀번호 변경', @@ -28,7 +27,8 @@ const ko = { cancel: '취소', loginButtonText: '로그인', tips: { - reset1: '비밀번호를 재설정하려면 NanoKVM의 BOOT 버튼을 10초 동안 누르고 계세요.', + reset1: + '비밀번호를 재설정하려면 NanoKVM의 BOOT 버튼을 10초 동안 누르고 계세요.', reset2: '자세한 절차는 이 문서를 참조하세요:', reset3: '웹 기본 계정:', reset4: 'SSH 기본 계정:', @@ -89,9 +89,11 @@ const ko = { title: '이미지', loading: '불러오는 중...', empty: '아무것도 없습니다.', + cdrom: 'CD-ROM 모드로 이미지 마운트', mountFailed: '이미지 마운트 실패', mountDesc: '일부 시스템에서는 이미지를 마운트하기 전에 원격 호스트에서 가상 디스크를 제거해야 합니다.', + refresh: '이미지 목록 새로고침', tips: { title: '업로드 방법', usb1: 'USB를 통해 NanoKVM을 컴퓨터에 연결하세요.', @@ -99,7 +101,7 @@ const ko = { usb3: '컴퓨터에서 가상 디스크를 열고 이미지 파일을 가상 디스크의 루트 디렉토리로 복사하세요.', scp1: 'NanoKVM과 컴퓨터가 동일한 로컬 네트워크에 있는지 확인하세요.', scp2: '컴퓨터에서 터미널을 열고 SCP 명령을 사용하여 이미지 파일을 NanoKVM의 /data 디렉터리에 업로드하세요.', - scp3: '예: scp [이미지 파일 경로] root@[NanoKVM IP 주소]:/data', + scp3: '예시: scp [이미지 파일 경로] root@[NanoKVM IP 주소]:/data', tfCard: 'TF 카드', tf1: '이 방법은 Linux 시스템에서 지원됩니다', tf2: 'NanoKVM에서 TF 카드를 가져옵니다(전체 버전의 경우 먼저 케이스를 분해하세요).', @@ -116,7 +118,7 @@ const ko = { runFailed: '실행 실패', attention: '주의', delDesc: '이 파일을 정말로 삭제합니까?', - confirm: '예', + confirm: '네', cancel: '아니오', delete: '삭제', close: '닫기' @@ -222,7 +224,8 @@ const ko = { upTailscale: 'tailscale을 NanoKVM 의 다음 경로에 업로드 했습니다. : /usr/bin/', upTailscaled: 'tailscaled을 NanoKVM 의 다음 경로에 업로드 했습니다. : /usr/sbin/', refresh: '현재 페이지 새로고침', - notLogin: '이 기기는 현재 연동 되지 않았습니다. 로그인해서 계정에 이 장치를 연동하세요.', + notLogin: + '이 기기는 현재 연동 되지 않았습니다. 로그인해서 계정에 이 장치를 연동하세요.', urlPeriod: '이 주소는 10분간 유효합니다.', login: '로그인', loginSuccess: '로그인 성공', @@ -233,7 +236,7 @@ const ko = { logout: '로그아웃', logout2: '정말로 로그아웃 합니까?', uninstall: 'Tailscale 제거', - okBtn: '예', + okBtn: '네', cancelBtn: '아니오' }, update: { @@ -253,6 +256,10 @@ const ko = { updateBtn: '업데이트', logoutBtn: '로그아웃' } + }, + error: { + title: '문제가 발생했습니다.', + refresh: '새로고침' } } }; diff --git a/web/src/pages/desktop/menu/download.tsx b/web/src/pages/desktop/menu/download.tsx index 194000b..ec4494b 100644 --- a/web/src/pages/desktop/menu/download.tsx +++ b/web/src/pages/desktop/menu/download.tsx @@ -1,5 +1,5 @@ import { ChangeEvent, useEffect, useRef, useState } from 'react'; -import { Button, Divider, Input, Popover } from 'antd'; +import { Button, Divider, Input, Popover, Tooltip } from 'antd'; import type { InputRef } from 'antd'; import clsx from 'clsx'; import { useSetAtom } from 'jotai'; @@ -21,6 +21,9 @@ export const DownloadImage = () => { const [diskEnabled, setDiskEnabled] = useState(false); const [popoverKey, setPopoverKey] = useState(0); + const tooltip = t('download.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + const inputRef = useRef(null); const intervalId = useRef(undefined); @@ -165,11 +168,16 @@ export const DownloadImage = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={handleOpenChange} + onOpenChange={(visible) => { + handleOpenChange(visible); + setTooltipValue(visible ? '' : tooltip); + }} > -
- -
+ +
+ +
+
); }; diff --git a/web/src/pages/desktop/menu/fullscreen/index.tsx b/web/src/pages/desktop/menu/fullscreen/index.tsx index defd237..da81b34 100644 --- a/web/src/pages/desktop/menu/fullscreen/index.tsx +++ b/web/src/pages/desktop/menu/fullscreen/index.tsx @@ -1,8 +1,12 @@ import { useEffect, useState } from 'react'; import { MaximizeIcon, MinimizeIcon } from 'lucide-react'; +import { useTranslation } from 'react-i18next'; +import { Tooltip } from 'antd'; export const Fullscreen = () => { + const { t } = useTranslation(); const [isFullscreen, setIsFullscreen] = useState(false); + const [tooltipValue, setTooltipValue] = useState(t('fullscreen.toggle')); useEffect(() => { function onFullscreenChange() { @@ -27,11 +31,13 @@ export const Fullscreen = () => { } return ( -
- {isFullscreen ? : } -
+ +
+ {isFullscreen ? : } +
+
); }; diff --git a/web/src/pages/desktop/menu/image/images.tsx b/web/src/pages/desktop/menu/image/images.tsx index c68ff45..29b3db8 100644 --- a/web/src/pages/desktop/menu/image/images.tsx +++ b/web/src/pages/desktop/menu/image/images.tsx @@ -16,9 +16,10 @@ import { client } from '@/lib/websocket.ts'; type ImagesProps = { cdrom: boolean; setIsMounted: (isMounted: boolean) => void; + onRefresh?: (callback: () => void) => void; }; -export const Images = ({ cdrom, setIsMounted }: ImagesProps) => { +export const Images = ({ cdrom, setIsMounted, onRefresh }: ImagesProps) => { const { t } = useTranslation(); const [notify, contextHolder] = notification.useNotification(); @@ -31,6 +32,12 @@ export const Images = ({ cdrom, setIsMounted }: ImagesProps) => { getImages(); }, []); + useEffect(() => { + if (onRefresh) { + onRefresh(getImages); + } + }, [onRefresh]); + function getImages() { if (isLoading) return; setIsLoading(true); diff --git a/web/src/pages/desktop/menu/image/index.tsx b/web/src/pages/desktop/menu/image/index.tsx index d93da94..2e83154 100644 --- a/web/src/pages/desktop/menu/image/index.tsx +++ b/web/src/pages/desktop/menu/image/index.tsx @@ -1,7 +1,7 @@ -import { useEffect, useState } from 'react'; -import { Divider, Popover, Switch, Tooltip } from 'antd'; +import { useEffect, useRef, useState } from 'react'; +import { Button, Divider, Popover, Switch, Tooltip } from 'antd'; import clsx from 'clsx'; -import { DiscIcon } from 'lucide-react'; +import { DiscIcon, RefreshCwIcon } from 'lucide-react'; import { useTranslation } from 'react-i18next'; import { useMediaQuery } from 'react-responsive'; @@ -18,6 +18,13 @@ export const Image = () => { const [isMounted, setIsMounted] = useState(false); const [cdrom, setCdrom] = useState(false); + + const getImagesRef = useRef<() => void>(() => {}); + + const tooltip = t('image.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + + useEffect(() => { getMountedImage().then((rsp) => { if (rsp.code !== 0) return; @@ -30,6 +37,12 @@ export const Image = () => { }); }, []); + const refreshImages = () => { + if (getImagesRef.current) { + getImagesRef.current(); + } + }; + const content = (
@@ -38,18 +51,26 @@ export const Image = () => {
- -
- CD-ROM +
+ +
+ CD-ROM - setCdrom(checked)}> -
-
+ setCdrom(checked)}> +
+ + + +
- {isPopoverOpen && } + {isPopoverOpen && ( + (getImagesRef.current = callback)} /> + )} ); @@ -60,16 +81,21 @@ export const Image = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={setIsPopoverOpen} + onOpenChange={(visible) => { + setIsPopoverOpen(visible); + setTooltipValue(visible ? '' : tooltip); + }} > -
- -
+ +
+ +
+
); }; diff --git a/web/src/pages/desktop/menu/index.tsx b/web/src/pages/desktop/menu/index.tsx index a36126c..534a3fa 100644 --- a/web/src/pages/desktop/menu/index.tsx +++ b/web/src/pages/desktop/menu/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Divider } from 'antd'; +import { Divider, Tooltip } from 'antd'; import clsx from 'clsx'; import { useAtom } from 'jotai'; import { MenuIcon, XIcon } from 'lucide-react'; @@ -19,6 +19,7 @@ import { Script } from './script'; import { Settings } from './settings'; import { Terminal } from './terminal'; import { Wol } from './wol'; +import { t } from 'i18next'; export const Menu = () => { const [menuDisabledItems, setMenuDisabledItems] = useAtom(menuDisabledItemsAtom); @@ -69,6 +70,7 @@ export const Menu = () => { +
setIsMenuOpen((o) => !o)} @@ -78,6 +80,11 @@ export const Menu = () => {
{!isMenuOpen && ( +
+ + + {!isMenuOpen && ( +
setIsMenuOpen((o) => !o)} @@ -86,6 +93,8 @@ export const Menu = () => {
)} +
+ )} ); diff --git a/web/src/pages/desktop/menu/keyboard/index.tsx b/web/src/pages/desktop/menu/keyboard/index.tsx index e96f8d7..f29c2fe 100644 --- a/web/src/pages/desktop/menu/keyboard/index.tsx +++ b/web/src/pages/desktop/menu/keyboard/index.tsx @@ -1,14 +1,19 @@ import { useState } from 'react'; -import { Popover } from 'antd'; +import { Popover, Tooltip } from 'antd'; import { KeyboardIcon } from 'lucide-react'; +import { t } from 'i18next'; import { Paste } from './paste.tsx'; import { VirtualKeyboard } from './virtual-keyboard.tsx'; import { CtrlAltDel } from './ctrl-alt-del.tsx'; + export const Keyboard = () => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const tooltip = t('keyboard.title') + const [tooltipValue, setTooltipValue] = useState(tooltip); + const content = ( <> @@ -24,11 +29,16 @@ export const Keyboard = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={setIsPopoverOpen} + onOpenChange={(visible) => { + setIsPopoverOpen(visible); + setTooltipValue(visible ? "" : tooltip); + }} > -
- -
+ +
+ +
+
); }; diff --git a/web/src/pages/desktop/menu/mouse/index.tsx b/web/src/pages/desktop/menu/mouse/index.tsx index a46397a..ed2e199 100644 --- a/web/src/pages/desktop/menu/mouse/index.tsx +++ b/web/src/pages/desktop/menu/mouse/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Divider, Popover } from 'antd'; +import { Divider, Popover, Tooltip } from 'antd'; import clsx from 'clsx'; import { useAtom } from 'jotai'; import { @@ -27,6 +27,9 @@ export const Mouse = () => { const [isPopoverOpen, setIsPopoverOpen] = useState(false); const [isResetting, setIsResetting] = useState(false); + const tooltip = t('mouse.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + const mouseStyles = [ { name: t('mouse.default'), icon: , value: 'cursor-default' }, { name: t('mouse.grab'), icon: , value: 'cursor-grab' }, @@ -154,11 +157,16 @@ export const Mouse = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={setIsPopoverOpen} + onOpenChange={(visible) => { + setIsPopoverOpen(visible); + setTooltipValue(visible ? "" : tooltip); + }} > -
- -
+ +
+ +
+
); }; diff --git a/web/src/pages/desktop/menu/power/index.tsx b/web/src/pages/desktop/menu/power/index.tsx index 460ba71..b5d42ae 100644 --- a/web/src/pages/desktop/menu/power/index.tsx +++ b/web/src/pages/desktop/menu/power/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Popover, Slider } from 'antd'; +import { Popover, Slider, Tooltip } from 'antd'; import clsx from 'clsx'; import { CirclePowerIcon, LoaderCircleIcon, PowerIcon, RotateCcwIcon } from 'lucide-react'; import { useTranslation } from 'react-i18next'; @@ -13,6 +13,9 @@ export const Power = () => { const [isLoading, setIsLoading] = useState(false); const [powerDuration, setPowerDuration] = useState(8); + const tooltip = t('power.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + useEffect(() => { getLed(); const interval = setInterval(getLed, 5000); @@ -95,19 +98,24 @@ export const Power = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={setIsPopoverOpen} + onOpenChange={(visible) => { + setIsPopoverOpen(visible); + setTooltipValue(visible ? '' : tooltip); + }} > -
-
- {isLoading ? ( - - ) : ( - - )} + +
+
+ {isLoading ? ( + + ) : ( + + )} +
-
+ ); }; diff --git a/web/src/pages/desktop/menu/screen/index.tsx b/web/src/pages/desktop/menu/screen/index.tsx index 12b70e2..9b291bb 100644 --- a/web/src/pages/desktop/menu/screen/index.tsx +++ b/web/src/pages/desktop/menu/screen/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Popover } from 'antd'; +import { Popover, Tooltip } from 'antd'; import { useAtomValue } from 'jotai'; import { MonitorIcon } from 'lucide-react'; @@ -14,6 +14,7 @@ import { Quality } from './quality'; import { Reset } from './reset.tsx'; import { Resolution } from './resolution'; import { VideoMode } from './video-mode.tsx'; +import { t } from 'i18next'; export const Screen = () => { const videoMode = useAtomValue(videoModeAtom); @@ -21,10 +22,12 @@ export const Screen = () => { const [fps, setFps] = useState(30); const [quality, setQuality] = useState(2); + const tooltip = t('screen.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + useEffect(() => { updateScreen('type', videoMode === 'mjpeg' ? 0 : 1); updateScreen('resolution', resolution!.height); - updateQuality(); updateFps(); }, []); @@ -69,10 +72,13 @@ export const Screen = () => { placement="bottomLeft" trigger="click" arrow={false} + onOpenChange={(visible) => setTooltipValue(visible ? '' : tooltip)} > -
- -
+ +
+ +
+
); }; diff --git a/web/src/pages/desktop/menu/script/index.tsx b/web/src/pages/desktop/menu/script/index.tsx index b079a83..00e6a16 100644 --- a/web/src/pages/desktop/menu/script/index.tsx +++ b/web/src/pages/desktop/menu/script/index.tsx @@ -1,6 +1,6 @@ import { ChangeEvent, useRef, useState } from 'react'; import { UploadOutlined } from '@ant-design/icons'; -import { Button, Divider, Popconfirm, Popover } from 'antd'; +import { Button, Divider, Popconfirm, Popover, Tooltip } from 'antd'; import clsx from 'clsx'; import { ChevronRightIcon, FileJsonIcon } from 'lucide-react'; import { useTranslation } from 'react-i18next'; @@ -22,6 +22,9 @@ export const Script = () => { const [isUploading, setIsUploading] = useState(false); const inputRef = useRef(null); + const tooltip = t('script.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + function handleOpenChange(open: boolean) { if (open) { getScripts(); @@ -194,11 +197,16 @@ export const Script = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={handleOpenChange} + onOpenChange={(visible) => { + handleOpenChange(visible); + setTooltipValue(visible ? '' : tooltip); + }} > -
- -
+ +
+ +
+
{isRunning && } diff --git a/web/src/pages/desktop/menu/settings/index.tsx b/web/src/pages/desktop/menu/settings/index.tsx index 9d15bf9..294c83a 100644 --- a/web/src/pages/desktop/menu/settings/index.tsx +++ b/web/src/pages/desktop/menu/settings/index.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { Badge, Modal } from 'antd'; +import { Badge, Modal, Tooltip } from 'antd'; import clsx from 'clsx'; import { BadgeInfoIcon, @@ -32,6 +32,9 @@ export const Settings = () => { const [isUpdateAvailable, setIsUpdateAvailable] = useState(false); + const tooltip = t('settings.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + const tabs = [ { id: 'about', icon: , component: }, { id: 'appearance', icon: , component: }, @@ -92,16 +95,18 @@ export const Settings = () => { return ( <> -
setIsModalOpen(true)} - > - -
- -
-
-
+ +
setIsModalOpen(true)} + > + +
+ +
+
+
+
{ destroyOnClose={true} styles={{ content: { padding: 0 } }} onCancel={closeModal} + afterOpenChange={(visible) => setTooltipValue(visible ? '' : tooltip)} >
diff --git a/web/src/pages/desktop/menu/terminal/index.tsx b/web/src/pages/desktop/menu/terminal/index.tsx index 7f65584..82e525d 100644 --- a/web/src/pages/desktop/menu/terminal/index.tsx +++ b/web/src/pages/desktop/menu/terminal/index.tsx @@ -1,5 +1,5 @@ import { useState } from 'react'; -import { Divider, Popover } from 'antd'; +import { Divider, Popover, Tooltip } from 'antd'; import { SquareTerminalIcon } from 'lucide-react'; import { useTranslation } from 'react-i18next'; @@ -10,6 +10,9 @@ export const Terminal = () => { const { t } = useTranslation(); const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const tooltip = t('terminal.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + const content = (
@@ -30,11 +33,16 @@ export const Terminal = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={setIsPopoverOpen} + onOpenChange={(visible) => { + setIsPopoverOpen(visible); + setTooltipValue(visible ? '' : tooltip); + }} > -
- -
+ +
+ +
+
); }; diff --git a/web/src/pages/desktop/menu/wol/index.tsx b/web/src/pages/desktop/menu/wol/index.tsx index ca58d08..9d0a13d 100644 --- a/web/src/pages/desktop/menu/wol/index.tsx +++ b/web/src/pages/desktop/menu/wol/index.tsx @@ -1,5 +1,5 @@ import { ChangeEvent, useRef, useState } from 'react'; -import { Button, Divider, Input, List, Popover } from 'antd'; +import { Button, Divider, Input, List, Popover, Tooltip } from 'antd'; import type { InputRef } from 'antd'; import clsx from 'clsx'; import { useSetAtom } from 'jotai'; @@ -22,6 +22,9 @@ export const Wol = () => { const [status, setStatus] = useState(''); const [log, setLog] = useState(''); + const tooltip = t('wol.title'); + const [tooltipValue, setTooltipValue] = useState(tooltip); + const [macList, setMacList] = useState([]); const inputRef = useRef(null); @@ -153,11 +156,16 @@ export const Wol = () => { trigger="click" arrow={false} open={isPopoverOpen} - onOpenChange={handleOpenChange} + onOpenChange={(visible) => { + handleOpenChange(visible); + setTooltipValue(visible ? '' : tooltip); + }} > -
- -
+ +
+ +
+
); };