From 18644a171122404dcda4029bd7caec34778991f0 Mon Sep 17 00:00:00 2001 From: Viktor <35473052+viktorxda@users.noreply.github.com> Date: Wed, 26 Jul 2023 21:24:55 +0200 Subject: [PATCH] [no ci] Sigmastar: add sensor autodetection --- .../files/script/load_sigmastar | 69 +++++++----------- .../files/sensor/kmod/sensor_rx_mipi.ko | Bin 0 -> 10272 bytes .../files/script/load_sigmastar | 44 ++++++++--- .../files/sensor/kmod/sensor_rx_mipi.ko | Bin 0 -> 9824 bytes 4 files changed, 61 insertions(+), 52 deletions(-) create mode 100644 general/package/sigmastar-osdrv-infinity6b0/files/sensor/kmod/sensor_rx_mipi.ko create mode 100644 general/package/sigmastar-osdrv-infinity6e/files/sensor/kmod/sensor_rx_mipi.ko diff --git a/general/package/sigmastar-osdrv-infinity6b0/files/script/load_sigmastar b/general/package/sigmastar-osdrv-infinity6b0/files/script/load_sigmastar index 81088bfc..490efb27 100755 --- a/general/package/sigmastar-osdrv-infinity6b0/files/script/load_sigmastar +++ b/general/package/sigmastar-osdrv-infinity6b0/files/script/load_sigmastar @@ -5,47 +5,30 @@ PATH_MODULE=/lib/modules/4.9.84/sigmastar PATH_FIRMWARE=/etc/sensors/venc_fw/chagall.bin - -# Sensor SENSOR=$(fw_printenv -n sensor) +detect_sensor() { + insmod ${PATH_MODULE}/sensor_rx_mipi.ko chmap=1 + SENSOR=$(majestic | awk '/Autodetect/ {print $NF}') + rmmod drv_ms_cus_RX_MIPI + fw_setenv sensor ${SENSOR} +} + set_sensor() { + $(lsmod | grep -q ${SENSOR}) && rmmod drv_ms_cus_${SENSOR}_MIPI + case $SENSOR in - gc2053) - # Untested | The information is obtained from the Gospell firmware - insmod ${PATH_MODULE}/sensor_gc2053_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 + gc4653|imx335|sc2239|sc3335) + insmod ${PATH_MODULE}/sensor_${SENSOR}_mipi.ko chmap=1 ;; - gc4653) - # Untested | The information is obtained from the Anjoy firmware - insmod ${PATH_MODULE}/sensor_gc4653_mipi.ko chmap=1 + gc2053|sc2335) + insmod ${PATH_MODULE}/sensor_${SENSOR}_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 ;; imx307) - # Untested | The information is obtained from the Anjoy and Brovotech (mclk=37.125M) firmware - insmod ${PATH_MODULE}/sensor_imx307_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 mclk=37.125M - ;; - imx335) - # Untested | The information is obtained from the Anjoy firmware - insmod ${PATH_MODULE}/sensor_imx335_mipi.ko chmap=1 - ;; - sc2239) - # Untested | The information is obtained from the IMOU firmware - insmod ${PATH_MODULE}/sensor_sc2239_mipi.ko chmap=1 - ;; - sc2335) - # Untested | The information is obtained from the Tiandy firmware - insmod ${PATH_MODULE}/sensor_sc2335_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 - ;; - sc3335) - # Untested | The information is obtained from the Uniview firmware - insmod ${PATH_MODULE}/sensor_sc3335_mipi.ko chmap=1 - ;; - auto) - insmod ${PATH_MODULE}/sensor_imx307_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 mclk=37.125M - insmod ${PATH_MODULE}/sensor_gc2053_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 - insmod ${PATH_MODULE}/sensor_sc2335_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 + insmod ${PATH_MODULE}/sensor_${SENSOR}_mipi.ko chmap=1 lane_num=2 hdr_lane_num=2 mclk=37.125M ;; *) - echo -e "\n\e[1;31mAn UNSUPPORTED sensor type is specified - ${SENSOR}\e[0m\n" | logger -s -t OpenIPC + echo -e "\n\e[1;31mUNSUPPORTED sensor found - ${SENSOR}\e[0m\n" | logger -s -t OpenIPC ;; esac } @@ -63,7 +46,6 @@ insert_ko() { insmod ${PATH_MODULE}/mi_vif.ko insmod ${PATH_MODULE}/mi_vpe.ko insmod ${PATH_MODULE}/mi_venc.ko fw_path=${PATH_FIRMWARE} - set_sensor major=$(awk '$2=="mi_poll" {print $1}' /proc/devices) mknod /dev/mi_poll c $major 0 @@ -72,16 +54,21 @@ insert_ko() { mdev -s } -if [ -z ${SENSOR} ]; then - echo -e "\n\e[1;31mThe sensor parameter is MISSING\e[0m\n" | logger -s -t OpenIPC - echo -e "\n\e[1;33mUsage: fw_setenv sensor [SENSOR]\e[0m\n" | logger -s -t OpenIPC - exit 1 -else - echo -e "\n\e[1;32mThe sensor is assigned - ${SENSOR}\e[0m\n" | logger -s -t OpenIPC -fi - if [ ! -e /dev/mi_poll ]; then insert_ko fi +if [ -z ${SENSOR} ]; then + echo -e "\n\e[1;33mAutodetect sensor\e[0m\n" | logger -s -t OpenIPC + detect_sensor +fi + +if [ -z ${SENSOR} ]; then + echo -e "\n\e[1;31mSensor parameter is MISSING\e[0m\n" | logger -s -t OpenIPC + exit 1 +else + echo -e "\n\e[1;32mSensor is assigned - ${SENSOR}\e[0m\n" | logger -s -t OpenIPC + set_sensor +fi + exit 0 diff --git a/general/package/sigmastar-osdrv-infinity6b0/files/sensor/kmod/sensor_rx_mipi.ko b/general/package/sigmastar-osdrv-infinity6b0/files/sensor/kmod/sensor_rx_mipi.ko new file mode 100644 index 0000000000000000000000000000000000000000..11e63e3ebccc3e96f0ce2d63cf6d7c53507ff26b GIT binary patch literal 10272 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 literal 0 HcmV?d00001 diff --git a/general/package/sigmastar-osdrv-infinity6e/files/script/load_sigmastar b/general/package/sigmastar-osdrv-infinity6e/files/script/load_sigmastar index bb405be5..24b38e3b 100755 --- a/general/package/sigmastar-osdrv-infinity6e/files/script/load_sigmastar +++ b/general/package/sigmastar-osdrv-infinity6e/files/script/load_sigmastar @@ -5,10 +5,28 @@ PATH_MODULE=/lib/modules/4.9.84/sigmastar PATH_FIRMWARE=/etc/sensors/venc_fw/chagall.bin - -# Sensor SENSOR=$(fw_printenv -n sensor) +detect_sensor() { + insmod ${PATH_MODULE}/sensor_rx_mipi.ko chmap=1 + SENSOR=$(majestic | awk '/Autodetect/ {print $NF}') + rmmod drv_ms_cus_RX_MIPI + fw_setenv sensor ${SENSOR} +} + +set_sensor() { + $(lsmod | grep -q ${SENSOR}) && rmmod drv_ms_cus_${SENSOR}_MIPI + + case $SENSOR in + imx274|imx335|imx347|imx415|sc8235) + insmod ${PATH_MODULE}/sensor_${SENSOR}_mipi.ko chmap=1 + ;; + *) + echo -e "\n\e[1;31mUNSUPPORTED sensor found - ${SENSOR}\e[0m\n" | logger -s -t OpenIPC + ;; + esac +} + insert_ko() { insmod ${PATH_MODULE}/mhal.ko insmod ${PATH_MODULE}/mi_common.ko @@ -24,7 +42,6 @@ insert_ko() { insmod ${PATH_MODULE}/mi_vif.ko insmod ${PATH_MODULE}/mi_vpe.ko insmod ${PATH_MODULE}/mi_venc.ko fw_path=${PATH_FIRMWARE} - insmod ${PATH_MODULE}/sensor_${SENSOR}_mipi.ko chmap=1 major=$(awk '$2=="mi_poll" {print $1}' /proc/devices) mknod /dev/mi_poll c $major 0 @@ -33,16 +50,21 @@ insert_ko() { mdev -s } -if [ -z ${SENSOR} ]; then - echo -e "\n\e[1;31mThe sensor parameter is MISSING\e[0m\n" | logger -s -t OpenIPC - echo -e "\n\e[1;33mUsage: fw_setenv sensor [SENSOR]\e[0m\n" | logger -s -t OpenIPC - exit 1 -else - echo -e "\n\e[1;32mThe sensor is assigned - ${SENSOR}\e[0m\n" | logger -s -t OpenIPC -fi - if [ ! -e /dev/mi_poll ]; then insert_ko fi +if [ -z ${SENSOR} ]; then + echo -e "\n\e[1;33mAutodetect sensor\e[0m\n" | logger -s -t OpenIPC + detect_sensor +fi + +if [ -z ${SENSOR} ]; then + echo -e "\n\e[1;31mSensor parameter is MISSING\e[0m\n" | logger -s -t OpenIPC + exit 1 +else + echo -e "\n\e[1;32mSensor is assigned - ${SENSOR}\e[0m\n" | logger -s -t OpenIPC + set_sensor +fi + exit 0 diff --git a/general/package/sigmastar-osdrv-infinity6e/files/sensor/kmod/sensor_rx_mipi.ko b/general/package/sigmastar-osdrv-infinity6e/files/sensor/kmod/sensor_rx_mipi.ko new file mode 100644 index 0000000000000000000000000000000000000000..1217b3495a6f1b0a65b1b5207aa7c6be6aadd924 GIT binary patch literal 9824 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 WuR8?NAFe