From a984090f0620bf643c990422747d7306f6c82857 Mon Sep 17 00:00:00 2001 From: luckfox-eng29 <158533769+luckfox-eng29@users.noreply.github.com> Date: Wed, 12 Mar 2025 21:51:58 +0800 Subject: [PATCH] Pullrequest for Luckfox Pico Pi (#246) * sysdrv/source/kernel/arch/arm/boot/dts : Add Luckfox Pico Pi device tree files Signed-off-by: luckfox-eng29 * sysdrv/source/kernel/arch/arm/configs : Add Add kernel configuration file support for SIM7600G Signed-off-by: luckfox-eng29 * sysdrv/source/kernel/drivers/usb/serial : Add USB serial driver support for SIM7600G Signed-off-by: luckfox-eng29 * project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-config/usr/bin/luckfox-config : Add support for Luckfox Pico Pi and comments Signed-off-by: luckfox-eng29 * project/cfg/BoardConfig_IPC : Add BoardConfig files and post script for Luckfox Pico Pi Signed-off-by: luckfox-eng29 * project/build.sh : Add the lunch menu item of Luckfox Pico Pi Signed-off-by: luckfox-eng29 * project/cfg/BoardConfig_IPC/overlay : Add SIM7600G overlay files Signed-off-by: luckfox-eng29 * sysdrv/source/kernel/drivers/media/i2c/sc3336.c : Set the SC3336 to use the 30fps mode by default Signed-off-by: luckfox-eng29 --------- Signed-off-by: luckfox-eng29 --- project/build.sh | 12 +- ...MC-Buildroot-RV1106_Luckfox_Pico_Pi-IPC.mk | 124 ++ ...-Buildroot-RV1106_Luckfox_Pico_Pi_W-IPC.mk | 129 ++ ...-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi-IPC.mk | 129 ++ ...MMC-Ubuntu-RV1106_Luckfox_Pico_Pi_W-IPC.mk | 134 ++ .../luckfox-ubuntu-off-modem-post.sh | 36 + .../usr/bin/simcom-cm | Bin 0 -> 67244 bytes .../usr/bin/luckfox-config | 1322 +++++++++++++---- .../etc/ppp/peers/simcom-connect-chat | 13 + .../etc/ppp/peers/simcom-disconnect-chat | 8 + .../etc/ppp/peers/simcom-pppd | 35 + .../usr/bin/killall | Bin 0 -> 18540 bytes .../usr/bin/simcom-cm | Bin 0 -> 55200 bytes .../boot/dts/rv1106-luckfox-pico-pi-ipc.dtsi | 410 +++++ .../boot/dts/rv1106g-luckfox-pico-pi-w.dts | 161 ++ .../arm/boot/dts/rv1106g-luckfox-pico-pi.dts | 102 ++ .../luckfox_rv1106-wwan-ndis-ppp.config | 16 + .../source/kernel/drivers/media/i2c/sc3336.c | 34 +- .../source/kernel/drivers/usb/serial/option.c | 17 + .../kernel/drivers/usb/serial/usb_wwan.c | 7 + 20 files changed, 2417 insertions(+), 272 deletions(-) create mode 100755 project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi-IPC.mk create mode 100755 project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi_W-IPC.mk create mode 100755 project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi-IPC.mk create mode 100755 project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi_W-IPC.mk create mode 100755 project/cfg/BoardConfig_IPC/luckfox-ubuntu-off-modem-post.sh create mode 100755 project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-buildroot-sim7600g/usr/bin/simcom-cm create mode 100644 project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-connect-chat create mode 100644 project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-disconnect-chat create mode 100644 project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-pppd create mode 100755 project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ubuntu-config/usr/bin/killall create mode 100755 project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ubuntu-sim7600g/usr/bin/simcom-cm create mode 100755 sysdrv/source/kernel/arch/arm/boot/dts/rv1106-luckfox-pico-pi-ipc.dtsi create mode 100755 sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi-w.dts create mode 100755 sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi.dts create mode 100755 sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106-wwan-ndis-ppp.config diff --git a/project/build.sh b/project/build.sh index 7685d2457..11233f762 100755 --- a/project/build.sh +++ b/project/build.sh @@ -157,7 +157,9 @@ function choose_target_board() { "RV1106_Luckfox_Pico_Pro" "RV1106_Luckfox_Pico_Max" "RV1106_Luckfox_Pico_Ultra" - "RV1106_Luckfox_Pico_Ultra_W") + "RV1106_Luckfox_Pico_Ultra_W" + "RV1106_Luckfox_Pico_Pi" + "RV1106_Luckfox_Pico_Pi_W") local LF_BOOT_MEDIA=("SD_CARD" "SPI_NAND" "EMMC") local LF_SYSTEM=("Buildroot" "Ubuntu" "Custom") local cnt=0 space8=" " @@ -187,6 +189,10 @@ function choose_target_board() { LUNCH_NUM=$((LUNCH_NUM + 1)) echo "${space8}${space8}[${LUNCH_NUM}] RV1106_Luckfox_Pico_Ultra_W" LUNCH_NUM=$((LUNCH_NUM + 1)) + echo "${space8}${space8}[${LUNCH_NUM}] RV1106_Luckfox_Pico_Pi" + LUNCH_NUM=$((LUNCH_NUM + 1)) + echo "${space8}${space8}[${LUNCH_NUM}] RV1106_Luckfox_Pico_Pi_W" + LUNCH_NUM=$((LUNCH_NUM + 1)) echo "${space8}${space8}[${LUNCH_NUM}] custom" read -p "Which would you like? [0~${LUNCH_NUM}][default:0]: " HW_INDEX @@ -271,7 +277,7 @@ function choose_target_board() { range_sd_card=(0 1) range_sd_card_spi_nand=(2 3 4 5 6) - range_emmc=(7 8) + range_emmc=(7 8 9 10) if __IS_IN_ARRAY "$HW_INDEX" "${range_sd_card[@]}"; then echo "${space8}${space8}[0] SD_CARD" @@ -337,7 +343,7 @@ function choose_target_board() { fi # EMMC - if (("$HW_INDEX" >= range_emmc[0] && "$HW_INDEX" <= range_emmc[${#range_emmc[@]}-1])); then + if (("$HW_INDEX" >= range_emmc[0] && "$HW_INDEX" <= range_emmc[${#range_emmc[@]} - 1])); then BM_INDEX=$BM_INDEX+2 #EMMC fi diff --git a/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi-IPC.mk b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi-IPC.mk new file mode 100755 index 000000000..970305c5d --- /dev/null +++ b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi-IPC.mk @@ -0,0 +1,124 @@ +#!/bin/bash + +################################################# +# Board Config +################################################# +export LF_ORIGIN_BOARD_CONFIG=BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi-IPC.mk +# Target CHIP +export RK_CHIP=rv1106 + +# app config +export RK_APP_TYPE=RKIPC_RV1106 + +# Config CMA size in environment +export RK_BOOTARGS_CMA_SIZE="66M" + +# Kernel dts +export RK_KERNEL_DTS=rv1106g-luckfox-pico-pi.dts + +################################################# +# BOOT_MEDIUM +################################################# + +# Target boot medium +export RK_BOOT_MEDIUM=emmc + +# Uboot defconfig fragment +export RK_UBOOT_DEFCONFIG_FRAGMENT=rk-emmc.config + +# specify post.sh for delete/overlay files +# export RK_PRE_BUILD_OEM_SCRIPT=rv1103-spi_nor-post.sh + +# config partition in environment +# RK_PARTITION_CMD_IN_ENV format: +# [,] +# := [@](part-name) +# Note: +# If the first partition offset is not 0x0, it must be added. Otherwise, it needn't adding. +export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs)" + +# config partition's filesystem type (squashfs is readonly) +# emmc: squashfs/ext4 +# nand: squashfs/ubifs +# spi nor: squashfs/jffs2 +# RK_PARTITION_FS_TYPE_CFG format: +# AAAA:/BBBB/CCCC@ext4 +# AAAA ----------> partition name +# /BBBB/CCCC ----> partition mount point +# ext4 ----------> partition filesystem type +export RK_PARTITION_FS_TYPE_CFG=rootfs@IGNORE@ext4,userdata@/userdata@ext4,oem@/oem@ext4 + +# config filesystem compress (Just for squashfs or ubifs) +# squashfs: lz4/lzo/lzma/xz/gzip, default xz +# ubifs: lzo/zlib, default lzo +# export RK_SQUASHFS_COMP=xz +# export RK_UBIFS_COMP=lzo + +################################################# +# TARGET_ROOTFS +################################################# + +# Target rootfs +export LF_TARGET_ROOTFS=buildroot + +# Buildroot defconfig +export RK_BUILDROOT_DEFCONFIG=luckfox_pico_w_defconfig + +################################################# +# Defconfig +################################################# + +# Target arch +export RK_ARCH=arm + +# Target Toolchain Cross Compile +export RK_TOOLCHAIN_CROSS=arm-rockchip830-linux-uclibcgnueabihf + +#misc image +export RK_MISC=wipe_all-misc.img + +# Uboot defconfig +export RK_UBOOT_DEFCONFIG=luckfox_rv1106_uboot_defconfig + +# Kernel defconfig +export RK_KERNEL_DEFCONFIG=luckfox_rv1106_linux_defconfig + +# Kernel defconfig fragment +export RK_KERNEL_DEFCONFIG_FRAGMENT="rv1106-bt.config luckfox_rv1106-wwan-ndis-ppp.config" + +# Config sensor IQ files +# RK_CAMERA_SENSOR_IQFILES format: +# "iqfile1 iqfile2 iqfile3 ..." +# ./build.sh media and copy /output/out/media_out/isp_iqfiles/$RK_CAMERA_SENSOR_IQFILES +export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json mis5001_CMK-OT2115-PC1_30IRC-F16.json" +#export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json sc530ai_CMK-OT2115-PC1_30IRC-F16.json" + +# Config sensor lens CAC calibrattion bin files +export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16" +#export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16 CAC_sc530ai_CMK-OT2115-PC1_30IRC-F16" + +# build ipc web backend +#export RK_APP_IPCWEB_BACKEND=y + +# enable install app to oem partition +export RK_BUILD_APP_TO_OEM_PARTITION=y + +# enable rockchip test +export RK_ENABLE_ROCKCHIP_TEST=y + +# enable rockchip wifi +#export RK_ENABLE_WIFI=y + +################################################# +# PRE and POST +################################################# + +# specify pre.sh for delete/overlay files +export RK_PRE_BUILD_OEM_SCRIPT=luckfox-buildroot-oem-pre.sh + +# specify post.sh for delete/overlay files +export RK_PRE_BUILD_USERDATA_SCRIPT=luckfox-userdata-pre.sh + +# declare overlay directory +export RK_POST_OVERLAY="overlay-luckfox-config overlay-luckfox-buildroot-init overlay-luckfox-buildroot-shadow\ + overlay-luckfox-ppp overlay-luckfox-buildroot-sim7600g" diff --git a/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi_W-IPC.mk b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi_W-IPC.mk new file mode 100755 index 000000000..a870f54ac --- /dev/null +++ b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi_W-IPC.mk @@ -0,0 +1,129 @@ +#!/bin/bash + +################################################# +# Board Config +################################################# +export LF_ORIGIN_BOARD_CONFIG=BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Pi_W-IPC.mk +# Target CHIP +export RK_CHIP=rv1106 + +# app config +export RK_APP_TYPE=RKIPC_RV1106 + +# Config CMA size in environment +export RK_BOOTARGS_CMA_SIZE="66M" + +# Kernel dts +export RK_KERNEL_DTS=rv1106g-luckfox-pico-pi-w.dts + +################################################# +# BOOT_MEDIUM +################################################# + +# Target boot medium +export RK_BOOT_MEDIUM=emmc + +# Uboot defconfig fragment +export RK_UBOOT_DEFCONFIG_FRAGMENT=rk-emmc.config + +# specify post.sh for delete/overlay files +# export RK_PRE_BUILD_OEM_SCRIPT=rv1103-spi_nor-post.sh + +# config partition in environment +# RK_PARTITION_CMD_IN_ENV format: +# [,] +# := [@](part-name) +# Note: +# If the first partition offset is not 0x0, it must be added. Otherwise, it needn't adding. +export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs)" + +# config partition's filesystem type (squashfs is readonly) +# emmc: squashfs/ext4 +# nand: squashfs/ubifs +# spi nor: squashfs/jffs2 +# RK_PARTITION_FS_TYPE_CFG format: +# AAAA:/BBBB/CCCC@ext4 +# AAAA ----------> partition name +# /BBBB/CCCC ----> partition mount point +# ext4 ----------> partition filesystem type +export RK_PARTITION_FS_TYPE_CFG=rootfs@IGNORE@ext4,userdata@/userdata@ext4,oem@/oem@ext4 + +# config filesystem compress (Just for squashfs or ubifs) +# squashfs: lz4/lzo/lzma/xz/gzip, default xz +# ubifs: lzo/zlib, default lzo +# export RK_SQUASHFS_COMP=xz +# export RK_UBIFS_COMP=lzo + +################################################# +# TARGET_ROOTFS +################################################# + +# Target rootfs +export LF_TARGET_ROOTFS=buildroot + +# Buildroot defconfig +export RK_BUILDROOT_DEFCONFIG=luckfox_pico_w_defconfig + +################################################# +# Defconfig +################################################# + +# Target arch +export RK_ARCH=arm + +# Target Toolchain Cross Compile +export RK_TOOLCHAIN_CROSS=arm-rockchip830-linux-uclibcgnueabihf + +#misc image +export RK_MISC=wipe_all-misc.img + +# Uboot defconfig +export RK_UBOOT_DEFCONFIG=luckfox_rv1106_uboot_defconfig + +# Kernel defconfig +export RK_KERNEL_DEFCONFIG=luckfox_rv1106_linux_defconfig + +# Kernel defconfig fragment +export RK_KERNEL_DEFCONFIG_FRAGMENT="rv1106-bt.config luckfox_rv1106-wwan-ndis-ppp.config" + +# Config sensor IQ files +# RK_CAMERA_SENSOR_IQFILES format: +# "iqfile1 iqfile2 iqfile3 ..." +# ./build.sh media and copy /output/out/media_out/isp_iqfiles/$RK_CAMERA_SENSOR_IQFILES +export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json mis5001_CMK-OT2115-PC1_30IRC-F16.json" +#export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json sc530ai_CMK-OT2115-PC1_30IRC-F16.json" + +# Config sensor lens CAC calibrattion bin files +export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16" +#export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16 CAC_sc530ai_CMK-OT2115-PC1_30IRC-F16" + +# build ipc web backend +#export RK_APP_IPCWEB_BACKEND=y + +# enable install app to oem partition +export RK_BUILD_APP_TO_OEM_PARTITION=y + +# enable rockchip test +export RK_ENABLE_ROCKCHIP_TEST=y + +# enable rockchip wifi +export RK_ENABLE_WIFI=y +export RK_ENABLE_WIFI_CHIP=AIC8800DC + +# config wifi ssid and passwd +export LF_WIFI_SSID="Your wifi ssid" +export LF_WIFI_PSK="Your wifi password" + +################################################# +# PRE and POST +################################################# + +# specify pre.sh for delete/overlay files +export RK_PRE_BUILD_OEM_SCRIPT=luckfox-buildroot-oem-pre.sh + +# specify post.sh for delete/overlay files +export RK_PRE_BUILD_USERDATA_SCRIPT=luckfox-userdata-pre.sh + +# declare overlay directory +export RK_POST_OVERLAY="overlay-luckfox-config overlay-luckfox-buildroot-init overlay-luckfox-buildroot-shadow\ + overlay-luckfox-ppp overlay-luckfox-buildroot-sim7600g" diff --git a/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi-IPC.mk b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi-IPC.mk new file mode 100755 index 000000000..9756ef9ed --- /dev/null +++ b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi-IPC.mk @@ -0,0 +1,129 @@ +#!/bin/bash + +################################################# +# Board Config +################################################# +export LF_ORIGIN_BOARD_CONFIG=BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi-IPC.mk +# Target CHIP +export RK_CHIP=rv1106 + +# app config +# export RK_APP_TYPE=RKIPC_RV1106 + +# Config CMA size in environment +export RK_BOOTARGS_CMA_SIZE="36M" + +# Kernel dts +export RK_KERNEL_DTS=rv1106g-luckfox-pico-pi.dts + +################################################# +# BOOT_MEDIUM +################################################# + +# Target boot medium +export RK_BOOT_MEDIUM=emmc + +# Uboot defconfig fragment +export RK_UBOOT_DEFCONFIG_FRAGMENT=rk-emmc.config + +# specify post.sh for delete/overlay files +# export RK_PRE_BUILD_OEM_SCRIPT=rv1103-spi_nor-post.sh + +# config partition in environment +# RK_PARTITION_CMD_IN_ENV format: +# [,] +# := [@](part-name) +# Note: +# If the first partition offset is not 0x0, it must be added. Otherwise, it needn't adding. +export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs)" + +# config partition's filesystem type (squashfs is readonly) +# emmc: squashfs/ext4 +# nand: squashfs/ubifs +# spi nor: squashfs/jffs2 +# RK_PARTITION_FS_TYPE_CFG format: +# AAAA:/BBBB/CCCC@ext4 +# AAAA ----------> partition name +# /BBBB/CCCC ----> partition mount point +# ext4 ----------> partition filesystem type +export RK_PARTITION_FS_TYPE_CFG=rootfs@IGNORE@ext4,userdata@/userdata@ext4,oem@/oem@ext4 + +# config filesystem compress (Just for squashfs or ubifs) +# squashfs: lz4/lzo/lzma/xz/gzip, default xz +# ubifs: lzo/zlib, default lzo +# export RK_SQUASHFS_COMP=xz +# export RK_UBIFS_COMP=lzo + +################################################# +# TARGET_ROOTFS +################################################# + +# Target rootfs +export LF_TARGET_ROOTFS=ubuntu + +# SUBMODULES : github/gitee +export LF_SUBMODULES_BY=github + +# Buildroot defconfig +export RK_BUILDROOT_DEFCONFIG=luckfox_pico_w_defconfig + +################################################# +# Defconfig +################################################# + +# Target arch +export RK_ARCH=arm + +# Target Toolchain Cross Compile +export RK_TOOLCHAIN_CROSS=arm-rockchip830-linux-uclibcgnueabihf + +#misc image +export RK_MISC=wipe_all-misc.img + +# Uboot defconfig +export RK_UBOOT_DEFCONFIG=luckfox_rv1106_uboot_defconfig + +# Kernel defconfig +export RK_KERNEL_DEFCONFIG=luckfox_rv1106_linux_defconfig + +# Kernel defconfig fragment +export RK_KERNEL_DEFCONFIG_FRAGMENT="rv1106-bt.config luckfox_rv1106-wwan-ndis-ppp.config" + +# Config sensor IQ files +# RK_CAMERA_SENSOR_IQFILES format: +# "iqfile1 iqfile2 iqfile3 ..." +# ./build.sh media and copy /output/out/media_out/isp_iqfiles/$RK_CAMERA_SENSOR_IQFILES +export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json mis5001_CMK-OT2115-PC1_30IRC-F16.json" +#export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json sc530ai_CMK-OT2115-PC1_30IRC-F16.json" + +# Config sensor lens CAC calibrattion bin files +export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16" +#export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16 CAC_sc530ai_CMK-OT2115-PC1_30IRC-F16" + +# build ipc web backend +# export RK_APP_IPCWEB_BACKEND=y + +# enable install app to oem partition +export RK_BUILD_APP_TO_OEM_PARTITION=y + +# enable rockchip test +export RK_ENABLE_ROCKCHIP_TEST=y + +# enable rockchip wifi +#export RK_ENABLE_WIFI=y + +################################################# +# PRE and POST +################################################# + +# specify pre.sh for delete/overlay files +export RK_PRE_BUILD_OEM_SCRIPT=luckfox-buildroot-oem-pre.sh + +export RK_PRE_BUILD_USERDATA_SCRIPT=luckfox-userdata-pre.sh + +# specify post.sh for delete/overlay files +export RK_POST_BUILD_SCRIPT=luckfox-ubuntu-off-modem-post.sh + +# declare overlay directory +export RK_POST_OVERLAY="overlay-luckfox-config overlay-luckfox-ubuntu-config overlay-luckfox-ubuntu-ultra overlay-luckfox-ubuntu-rockchip\ + overlay-luckfox-ppp overlay-luckfox-ubuntu-sim7600g" diff --git a/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi_W-IPC.mk b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi_W-IPC.mk new file mode 100755 index 000000000..608b7003e --- /dev/null +++ b/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi_W-IPC.mk @@ -0,0 +1,134 @@ +#!/bin/bash + +################################################# +# Board Config +################################################# +export LF_ORIGIN_BOARD_CONFIG=BoardConfig-EMMC-Ubuntu-RV1106_Luckfox_Pico_Pi_W-IPC.mk +# Target CHIP +export RK_CHIP=rv1106 + +# app config +# export RK_APP_TYPE=RKIPC_RV1106 + +# Config CMA size in environment +export RK_BOOTARGS_CMA_SIZE="36M" + +# Kernel dts +export RK_KERNEL_DTS=rv1106g-luckfox-pico-pi-w.dts + +################################################# +# BOOT_MEDIUM +################################################# + +# Target boot medium +export RK_BOOT_MEDIUM=emmc + +# Uboot defconfig fragment +export RK_UBOOT_DEFCONFIG_FRAGMENT=rk-emmc.config + +# specify post.sh for delete/overlay files +# export RK_PRE_BUILD_OEM_SCRIPT=rv1103-spi_nor-post.sh + +# config partition in environment +# RK_PARTITION_CMD_IN_ENV format: +# [,] +# := [@](part-name) +# Note: +# If the first partition offset is not 0x0, it must be added. Otherwise, it needn't adding. +export RK_PARTITION_CMD_IN_ENV="32K(env),512K@32K(idblock),256K(uboot),32M(boot),512M(oem),256M(userdata),6G(rootfs)" + +# config partition's filesystem type (squashfs is readonly) +# emmc: squashfs/ext4 +# nand: squashfs/ubifs +# spi nor: squashfs/jffs2 +# RK_PARTITION_FS_TYPE_CFG format: +# AAAA:/BBBB/CCCC@ext4 +# AAAA ----------> partition name +# /BBBB/CCCC ----> partition mount point +# ext4 ----------> partition filesystem type +export RK_PARTITION_FS_TYPE_CFG=rootfs@IGNORE@ext4,userdata@/userdata@ext4,oem@/oem@ext4 + +# config filesystem compress (Just for squashfs or ubifs) +# squashfs: lz4/lzo/lzma/xz/gzip, default xz +# ubifs: lzo/zlib, default lzo +# export RK_SQUASHFS_COMP=xz +# export RK_UBIFS_COMP=lzo + +################################################# +# TARGET_ROOTFS +################################################# + +# Target rootfs +export LF_TARGET_ROOTFS=ubuntu + +# SUBMODULES : github/gitee +export LF_SUBMODULES_BY=github + +# Buildroot defconfig +export RK_BUILDROOT_DEFCONFIG=luckfox_pico_w_defconfig + +################################################# +# Defconfig +################################################# + +# Target arch +export RK_ARCH=arm + +# Target Toolchain Cross Compile +export RK_TOOLCHAIN_CROSS=arm-rockchip830-linux-uclibcgnueabihf + +#misc image +export RK_MISC=wipe_all-misc.img + +# Uboot defconfig +export RK_UBOOT_DEFCONFIG=luckfox_rv1106_uboot_defconfig + +# Kernel defconfig +export RK_KERNEL_DEFCONFIG=luckfox_rv1106_linux_defconfig + +# Kernel defconfig fragment +export RK_KERNEL_DEFCONFIG_FRAGMENT="rv1106-bt.config luckfox_rv1106-wwan-ndis-ppp.config" + +# Config sensor IQ files +# RK_CAMERA_SENSOR_IQFILES format: +# "iqfile1 iqfile2 iqfile3 ..." +# ./build.sh media and copy /output/out/media_out/isp_iqfiles/$RK_CAMERA_SENSOR_IQFILES +export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json mis5001_CMK-OT2115-PC1_30IRC-F16.json" +#export RK_CAMERA_SENSOR_IQFILES="sc4336_OT01_40IRC_F16.json sc3336_CMK-OT2119-PC1_30IRC-F16.json sc530ai_CMK-OT2115-PC1_30IRC-F16.json" + +# Config sensor lens CAC calibrattion bin files +export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16" +#export RK_CAMERA_SENSOR_CAC_BIN="CAC_sc4336_OT01_40IRC_F16 CAC_sc530ai_CMK-OT2115-PC1_30IRC-F16" + +# build ipc web backend +# export RK_APP_IPCWEB_BACKEND=y + +# enable install app to oem partition +export RK_BUILD_APP_TO_OEM_PARTITION=y + +# enable rockchip test +export RK_ENABLE_ROCKCHIP_TEST=y + +# enable rockchip wifi +export RK_ENABLE_WIFI=y +export RK_ENABLE_WIFI_CHIP=AIC8800DC + +# config wifi ssid and passwd +export LF_WIFI_SSID="Your wifi ssid" +export LF_WIFI_PSK="Your wifi password" + +################################################# +# PRE and POST +################################################# + +# specify pre.sh for delete/overlay files +export RK_PRE_BUILD_OEM_SCRIPT=luckfox-buildroot-oem-pre.sh + +export RK_PRE_BUILD_USERDATA_SCRIPT=luckfox-userdata-pre.sh + +# specify post.sh for delete/overlay files +export RK_POST_BUILD_SCRIPT=luckfox-ubuntu-off-modem-post.sh + +# declare overlay directory +export RK_POST_OVERLAY="overlay-luckfox-config overlay-luckfox-ubuntu-config overlay-luckfox-ubuntu-ultra overlay-luckfox-ubuntu-rockchip\ + overlay-luckfox-ppp overlay-luckfox-ubuntu-sim7600g" diff --git a/project/cfg/BoardConfig_IPC/luckfox-ubuntu-off-modem-post.sh b/project/cfg/BoardConfig_IPC/luckfox-ubuntu-off-modem-post.sh new file mode 100755 index 000000000..76b7c666f --- /dev/null +++ b/project/cfg/BoardConfig_IPC/luckfox-ubuntu-off-modem-post.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# remove unused files +function lf_rm() { + for file in "$@"; do + if [ -e "$file" ]; then + echo "Deleting: $file" + rm -rf "$file" + #else + #echo "File not found: $file" + fi + done +} + +# remove unused links +function lf_rm_link() { + for link in "$@"; do + if [ -L "$link" ]; then + echo "Deleting: $link" + rm -rf "$link" + #else + #echo "File not found: $file" + fi + done +} + +# remove ModemManager Service +function remove_modem_service() { + lf_rm_link $RK_PROJECT_PACKAGE_ROOTFS_DIR/etc/systemd/system/dbus-org.freedesktop.ModemManager1.service + lf_rm_link $RK_PROJECT_PACKAGE_ROOTFS_DIR/etc/systemd/system/multi-user.target.wants/ModemManager.service +} + +#========================= +# run +#========================= +remove_modem_service diff --git a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-buildroot-sim7600g/usr/bin/simcom-cm b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-buildroot-sim7600g/usr/bin/simcom-cm new file mode 100755 index 0000000000000000000000000000000000000000..0dcde15b4bf03259aeae56773ab54c2366eaf3da GIT binary patch literal 67244 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 literal 0 HcmV?d00001 diff --git a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-config/usr/bin/luckfox-config b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-config/usr/bin/luckfox-config index 8a793af82..9935987c1 100755 --- a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-config/usr/bin/luckfox-config +++ b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-config/usr/bin/luckfox-config @@ -1,11 +1,20 @@ #!/bin/bash + +################################################################ +# ---------------------- Global Variable ----------------------- +################################################################ export LUCKFOX_CHIP_MODEL export LUCKFOX_CHIP_MEDIA export LUCKFOX_CHIP_MEDIA_CLASS +# Temp +LUCKFOX_FDT_DUMP_TXT=/tmp/.fdt_dump.txt +LUCKFOX_PIN_DIAGRAM_FILE=/tmp/.pin_diagram.txt +LUCKFOX_CHANGE_TXT=/tmp/.change.txt + +# Overlay LUCKFOX_DYNAMIC_DTS=/tmp/.overlay.dts LUCKFOX_DYNAMIC_DTBO=/tmp/.overlay.dtbo - LUCKFOX_FDT_DTB=/tmp/.fdt.dtb LUCKFOX_FDT_OVERLAY_DTS=/tmp/.fdt_overlay.dts LUCKFOX_FDT_OVERLAY_DTBO=/tmp/.fdt_overlay.dtbo @@ -13,18 +22,197 @@ LUCKFOX_FDT_HDR_DTB=/tmp/.fdt_header.dtb LUCKFOX_FDT_HDR_OVERLAY_DTS=/tmp/.fdt_header_overlay.dts LUCKFOX_FDT_HDR_OVERLAY_DTBO=/tmp/.fdt_header_overlay.dtbo -LUCKFOX_FDT_DUMP_TXT=/tmp/.fdt_dump.txt -LUCKFOX_PIN_DIAGRAM_FILE=/tmp/.pin_diagram.txt -LUCKFOX_CHANGE_TXT=/tmp/.change.txt - +# Config LUCKFOX_CFG_FILE=/etc/luckfox.cfg -# return +# GUI and log LF_OK=0 LF_ERR=1 LF_NONE=2 LF_GUI_ENABLE=0 +################################################################ +# ------------------------ Pin Diagram ------------------------- +################################################################ +function luckfox_pico_pin_diagram_file() { + cat >$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE </dev/null; then @@ -62,6 +250,8 @@ function luckfox_config_init() { luckfox_pico_mini_pin_diagram_file elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then luckfox_pico_ultra_pin_diagram_file + elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi W" ]; then + luckfox_pico_pi_pin_diagram_file fi fi @@ -92,6 +282,13 @@ function luckfox_config_init() { touch $LUCKFOX_CHANGE_TXT } +################################################################ +# @fu luckfox_load_cfg +# +# @brief 1. Set up according to the contents of LUCKFOX_CFG_FILE when entering the rootfs. +# +# @return none +################################################################ function luckfox_load_cfg() { local group right_group local multi_pins_group=() @@ -101,34 +298,15 @@ function luckfox_load_cfg() { local i2c_speed spi_cs_enable spi_miso_enable spi_speed local pwm_main pwm_sub uart_main uart_sub i2c_main i2c_sub spi_main spi_sub local compatible_device + local mode_4g apn_4g if [ ! -f $LUCKFOX_CFG_FILE ]; then touch $LUCKFOX_CFG_FILE fi - # To obtain all the reusable GPIO pin functions - while IFS= read -r line; do - if [[ "$line" == *"| |"* ]]; then - group=() - right_group=() - - IFS='-' read -r -a group <<<"$(echo "$line" | cut -d'|' -f1)" - IFS='-' read -r -a right_group <<<"$(echo "$line" | cut -d'|' -f3)" - group+=("${right_group[@]}") - - for pin in "${group[@]}"; do - if [[ "$pin" == *"UART"*"_RX"* ]]; then - multi_pins_group+=("$(echo "$pin" | sed -E 's/(UART[0-9]+_M[0-9]+)_.*$/\1/g' | sed 's/^ //')") - elif [[ "$pin" == *"PWM"* ]]; then - multi_pins_group+=("$(echo "$pin" | sed -E 's/(PWM[0-9]+_M[0-9]+).*$/\1/g' | sed 's/^ //')") - elif [[ "$pin" == *"I2C"*"_SCL"* ]]; then - multi_pins_group+=("$(echo "$pin" | sed -E 's/(I2C[0-9]+_M[0-9]+)_.*$/\1/g' | sed 's/^ //')") - elif [[ "$pin" == *"SPI"*"_CLK"* ]]; then - multi_pins_group+=("$(echo "$pin" | sed -E 's/(SPI[0-9]+_M[0-9]+)_.*$/\1/g' | sed 's/^ //')") - fi - done - fi - done <"$LUCKFOX_PIN_DIAGRAM_FILE" + ########################################### + # Devices configured by modifying the FDT + ########################################### # RGB value=$(luckfox_get_pin_cfg "RGB_ENABLE") if [ "$value" == 1 ] || [ -z "$value" ]; then @@ -223,6 +401,56 @@ function luckfox_load_cfg() { luckfox_sdmmc_app "$value" fi + # 4G_Module + value=$(luckfox_get_pin_cfg "MODULE_4G_ENABLE") + + if [ "$value" == 1 ]; then + if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi W" ]; then + mode_4g=$(luckfox_get_pin_cfg "MODULE_4G_MODE") + if [ -z "$mode_4g" ]; then + mode_4g="ndis" + fi + + apn_4g=$(luckfox_get_pin_cfg "MODULE_4G_APN") + if [ -z "$apn_4g" ] && [ "$mode_4g" == "ppp" ]; then + apn_4g="ctnet" + fi + + if [ "$mode_4g" == "ppp" ]; then + luckfox_4g_app "$value" "$mode_4g" "$apn_4g" 10 & + else + luckfox_4g_app "$value" "$mode_4g" "$apn_4g" 5 & + fi + fi + fi + + #################################### + # Devices configured using dtbo + #################################### + # To obtain all the reusable GPIO pin functions + while IFS= read -r line; do + if [[ "$line" == *"| |"* ]]; then + group=() + right_group=() + + IFS='-' read -r -a group <<<"$(echo "$line" | cut -d'|' -f1)" + IFS='-' read -r -a right_group <<<"$(echo "$line" | cut -d'|' -f3)" + group+=("${right_group[@]}") + + for pin in "${group[@]}"; do + if [[ "$pin" == *"UART"*"_RX"* ]]; then + multi_pins_group+=("$(echo "$pin" | sed -E 's/(UART[0-9]+_M[0-9]+)_.*$/\1/g' | sed 's/^ //')") + elif [[ "$pin" == *"PWM"* ]]; then + multi_pins_group+=("$(echo "$pin" | sed -E 's/(PWM[0-9]+_M[0-9]+).*$/\1/g' | sed 's/^ //')") + elif [[ "$pin" == *"I2C"*"_SCL"* ]]; then + multi_pins_group+=("$(echo "$pin" | sed -E 's/(I2C[0-9]+_M[0-9]+)_.*$/\1/g' | sed 's/^ //')") + elif [[ "$pin" == *"SPI"*"_CLK"* ]]; then + multi_pins_group+=("$(echo "$pin" | sed -E 's/(SPI[0-9]+_M[0-9]+)_.*$/\1/g' | sed 's/^ //')") + fi + done + fi + done <"$LUCKFOX_PIN_DIAGRAM_FILE" + # Create global variables by comparing cfg files for pin in "${multi_pins_group[@]}"; do @@ -302,147 +530,19 @@ function luckfox_load_cfg() { } -# ------------------- Pin Diagram --------------------- -function luckfox_pico_pro_max_pin_diagram_file() { - cat >$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <$LUCKFOX_PIN_DIAGRAM_FILE <>"$LUCKFOX_CFG_FILE" - fi -} - +################################################################ +# @fu luckfox_set_pin_mark +# +# @brief 1. Clear or add the "*" mark in the Pin Diagram. +# +# @param pin - Option name to be set +# action - 1 indicates adding a mark, 0 indicates clearing a mark. +# +# @return none +################################################################ function luckfox_set_pin_mark() { local pin="$1" local action="$2" @@ -539,14 +648,112 @@ function luckfox_set_pin_mark() { fi } +################################################################ +# @fu luckfox_get_option_str +# +# @brief 1. Collect pins of a specific multiplexing type from the Pin Diagram for GUI display. +# +# @param search_param - Specific multiplexing type +# +# @return +################################################################ +function luckfox_get_option_str() { + local search_param="$1" + local group=() + local right_group=() + local option_group=() + local option_str="" + + while IFS= read -r line; do + if [[ "$line" == *"| |"* && "$line" == *"$search_param"* ]]; then + group=() + right_group=() + + IFS='-' read -r -a group <<<"$(echo "$line" | cut -d'|' -f1)" + IFS='-' read -r -a right_group <<<"$(echo "$line" | cut -d'|' -f3)" + group+=("${right_group[@]}") + for pin in "${group[@]}"; do + if [ "$search_param" == "UART" ]; then + if [[ "$pin" == *"$search_param"*"_RX"* ]]; then + option_group+=$(echo "$pin" | sed -E 's/(UART[0-9]+_M[0-9]+)_.*$/\1 x /g') + fi + elif [ "$search_param" == "PWM" ]; then + if [[ "$pin" == *"$search_param"* ]]; then + option_group+=$(echo "$pin" | sed -E 's/(PWM[0-9]+_M[0-9]+).*$/\1 x /g') + fi + elif [ "$search_param" == "I2C" ]; then + if [[ "$pin" == *"$search_param"*"_SCL"* ]]; then + option_group+=$(echo "$pin" | sed -E 's/(I2C[0-9]+_M[0-9]+)_.*$/\1 x /g') + fi + elif [ "$search_param" == "SPI" ]; then + if [[ "$pin" == *"$search_param"*"_CLK"* ]]; then + option_group+=$(echo "$pin" | sed -E 's/(SPI[0-9]+_M[0-9]+)_.*$/\1 x /g') + fi + fi + done + fi + done <"$LUCKFOX_PIN_DIAGRAM_FILE" + + for element in "${option_group[@]}"; do + option_str+="$element" + done + + echo "$option_str" +} + +################################################################ +# ------------------- Luckfox Config File --------------------- +################################################################ + +################################################################ +# @fu luckfox_set_pin_cfg +# +# @brief 1. Set the static parameters of LUCKFOX_CFG_FILE. +# +# @param parameter_name - Option name to be set +# parameter_value - Option value to be set +# +# @return none +################################################################ +function luckfox_set_pin_cfg() { + local parameter_name="$1" + local parameter_value="$2" + + if grep -q "$parameter_name=" "$LUCKFOX_CFG_FILE"; then + sed -i "s/^$parameter_name=.*/$parameter_name=$parameter_value/" "$LUCKFOX_CFG_FILE" + else + echo "$parameter_name=$parameter_value" >>"$LUCKFOX_CFG_FILE" + fi +} + +################################################################ +# @fu luckfox_check_pin_diagram +# +# @brief 1. Get the static parameters of LUCKFOX_CFG_FILE. +# +# @param setting - The name of the static parameters in LUCKFOX_CFG_FILE. +# +# @return The value of the static parameters in LUCKFOX_CFG_FILE +################################################################ function luckfox_get_pin_cfg() { local setting="$1" value=$(grep "${setting}=" $LUCKFOX_CFG_FILE | cut -d '=' -f 2) echo "$value" } -# ---------------------- APP ------------------------- -# -- General -- +################################################################ +# ---------------------- Overlay General ----------------------- +################################################################ + +################################################################ +# @fu luckfox_sha256_convert +# +# @brief 1. Organize the transmitted hash values into the format of the FDT Header specification. +# +# @param sha256_hash - The Transmitted hash values +# +# @return The format of the FDT Header specification +################################################################ function luckfox_sha256_convert() { local sha256_hash=$1 local formatted_hash="" @@ -558,6 +765,15 @@ function luckfox_sha256_convert() { echo "$formatted_hash" } +################################################################ +# @fu luckfox_get_device_name +# +# @brief 1. Get the name of the device node corresponding to the device in the device tree from the input device node. +# +# @param device_node - +# +# @return The name of the device node corresponding to the device in the device tree +################################################################ function luckfox_get_device_name() { local device_node="$1" local device_node_name @@ -566,6 +782,16 @@ function luckfox_get_device_name() { echo "$device_node_name" } +################################################################ +# @fu luckfox_get_pinctrl_addr +# +# @brief 1. Find the corresponding phandle number through the passed pinctrl_node. +# +# @param pinctrl_node - +# search_num - The search range using grep may be too large or too small, which could lead to finding the wrong phandle number. +# +# @return The number of pinctrl phandle +################################################################ function luckfox_get_pinctrl_addr() { local pinctrl_node="$1" local search_num="$2" @@ -579,9 +805,17 @@ function luckfox_get_pinctrl_addr() { echo "$phandle_value" } +################################################################ +# @fu luckfox_get_pin_mode +# +# @brief 1. Get the multiplexing mode of a specific pin in the pinctrl phandle from the DTB and compare it with the currently used multiplexing function. +# +# @param input - The entire pinctrl phandle configuration may contain the configuration information for multiple pins. +# +# @return Returning 1 indicates that the multiplexing configuration of the target pinctrl phandle in the current device tree matches the actual multiplexing configuration. +################################################################ function luckfox_get_pin_mode() { local input="$1" - local reset_action="$2" local flag IFS=' ' read -r -a phandle_values <<<"$input" @@ -613,6 +847,16 @@ function luckfox_get_pin_mode() { } +################################################################ +# @fu luckfox_set_pin_mode +# +# @brief 1. Set the pin multiplexing function. +# +# @param input - The pin group to be set. +# reset_action - When set to 1, the multiplexing function of the pin group will be set to GPIO. +# +# @return none +################################################################ function luckfox_set_pin_mode() { #region local input="$1" @@ -646,7 +890,20 @@ function luckfox_set_pin_mode() { #endregion } -# -- Dynamic Overlay -- +################################################################ +# ---------------------- Dynamic Overlay ----------------------- +################################################################ + +################################################################ +# @fu luckfox_dtbo_overlay +# +# @brief 1. Dynamically load the DTBO, allowing configuration to be completed without a reboot. +# +# @param overlay_node - The name of the overlay node will be used to create a DTBO management directory based on that name. +# overlay_content - The Overlay system loads the content set in the DTB. +# +# @return none +################################################################ function luckfox_dtbo_overlay() { local overlay_node="$1" local overlay_content="$2" @@ -670,7 +927,17 @@ function luckfox_dtbo_overlay() { #rm $LUCKFOX_DYNAMIC_DTBO } -# -- Static Overlay -- +################################################################ +# ---------------------- Static Overlay ------------------------ +################################################################ + +################################################################ +# @fu luckfox_update_fdt +# +# @brief 1. Get dtb from boot partition and decompile it to /tmp +# +# @return none +################################################################ function luckfox_update_fdt() { # get fdt_header local origin_fdt_size_hex origin_fdt_size @@ -695,6 +962,16 @@ function luckfox_update_fdt() { fdtdump $LUCKFOX_FDT_DTB >$LUCKFOX_FDT_DUMP_TXT } +################################################################ +# @fu luckfox_fdt_overlay +# +# @brief 1. After obtaining the fdt_content, overlay it onto the system's decompiled DTS. +# 2. Compile the DTS into a DTB and reload it to the BOOT partition. +# +# @param fdt_content - The content to be overlaid into the DTB. +# +# @return none +################################################################ function luckfox_fdt_overlay() { #region local fdt_content="$1" @@ -758,6 +1035,13 @@ function luckfox_fdt_overlay() { #endregion } +################################################################ +# @fu luckfox_fdt_clear +# +# @brief 1. Clear the temporary files used during the Static Overlay process. +# +# @return none +################################################################ function luckfox_fdt_clear() { # delete temp file local files=( @@ -777,16 +1061,19 @@ function luckfox_fdt_clear() { done } -# -- Time Setting -- -function luckfox_timezone_settings() { - dialog --msgbox "Developing" 10 30 -} +################################################################ +# -------------------- Compatible Devices ---------------------- +################################################################ -function luckfox_time_synchronization() { - dialog --msgbox "Developing" 10 30 -} - -# -- Compatible Devices -- +################################################################ +# @fu luckfox_compatible_Pico_LCD +# +# @brief 1. Adapt to the Waveshare Pico-LCD, only supporting certain models. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_Pico_LCD() { #region local action="$1" @@ -849,6 +1136,15 @@ function luckfox_compatible_Pico_LCD() { #endregion } +################################################################ +# @fu luckfox_compatible_Pico_ePaper +# +# @brief 1. Adapt to the Waveshare Pico-ePaper, only supporting certain models. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_Pico_ePaper() { #region local action="$1" @@ -867,6 +1163,15 @@ function luckfox_compatible_Pico_ePaper() { #endregion } +################################################################ +# @fu luckfox_compatible_Pico_UPS-B +# +# @brief 1. Adapt to the Waveshare Pico-UPS-B, only supporting certain models. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_Pico-UPS-B() { #region local action="$1" @@ -878,6 +1183,15 @@ function luckfox_compatible_Pico-UPS-B() { #endregion } +################################################################ +# @fu luckfox_compatible_Pico_ResTouch_LCD +# +# @brief 1. Adapt to the Waveshare Pico-Touch-LCD-2.8 of Pico-Touch-LCD-3.5, only supporting certain models. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_Pico_ResTouch_LCD() { local action="$1" local spi_device_name spi_pinctrl_addr spi_action @@ -911,6 +1225,15 @@ function luckfox_compatible_Pico_ResTouch_LCD() { fi } +################################################################ +# @fu luckfox_compatible_OLED_Model +# +# @brief 1. Adapt to the Waveshare OLED Model, only supporting certain models. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_OLED_Module() { local action="$1" @@ -929,6 +1252,15 @@ function luckfox_compatible_OLED_Module() { fi } +################################################################ +# @fu luckfox_compatible_Pico_OLED +# +# @brief 1. Adapt to the Waveshare Pico-OLED, only supporting certain models. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_Pico_OLED() { local action="$1" @@ -961,6 +1293,15 @@ function luckfox_compatible_Pico_OLED() { fi } +################################################################ +# @fu luckfox_compatible_Pico_OLED +# +# @brief 1. Adapt to the Waveshare DHT11, only supporting certain models. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_DHT11() { #region local action="$1" @@ -986,6 +1327,16 @@ function luckfox_compatible_DHT11() { #endregion } +################################################################ +# @fu luckfox_compatible_app +# +# @brief 1. Determine and execute compatible device functions according to model grouping as interface of GUI interface +# +# @param compatible_device - +# action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_compatible_app() { local compatible_device="$1" local action="$2" @@ -1012,8 +1363,18 @@ function luckfox_compatible_app() { luckfox_result_handle "$LF_ERR" "This compatible device $compatible_device is not supported!" } -# -- Advanced Options -- +################################################################ +# --------------------- Advanced Options ----------------------- +################################################################ +################################################################ +# @fu hex_add +# +# @param hex1 - +# hex2 - +# +# @return The sum of hex1 and hex2 in hexadecimal number. +################################################################ function hex_add() { local hex1=$1 local hex2=$2 @@ -1025,23 +1386,37 @@ function hex_add() { echo "$sum_hex" } +################################################################ +# @fu hex_shift +# +# @param hex - +# shift_amount - +# +# @return The hexadecimal number after shifting hex by shift_amount. +################################################################ function hex_shift() { local hex=$1 local shift_amount=$2 - # 将十六进制数转换为十进制 local dec=$(printf "%d" 0x$hex) - - # 计算移位数 local shift=$((shift_amount * 2)) - - # 进行移位操作 local shifted=$((dec << shift)) - # 将结果转换回十六进制并输出 printf "%X\n" $shifted } +################################################################ +# @fu luckfox_gpio_app +# +# @brief 1. Set the default pull-up or pull-down state of the GPIO. +# +# @param gpio_bank - +# gpio_group - +# gpio_number - +# gpio_pull_mode - +# +# @return none +################################################################ function luckfox_gpio_app() { local gpio_bank="$1" local gpio_group="$2" @@ -1127,6 +1502,17 @@ function luckfox_gpio_app() { io -4 "$reg_addr" "$data" } +################################################################ +# @fu luckfox_pwm_app +# +# @brief 1. Set the startup and shutdown of the PWM. +# +# @param action - 1 indicates enable, 0 indicates disable. +# pwm_main - +# pwm_sub - +# +# @return none +################################################################ function luckfox_pwm_app() { #region local action="$1" @@ -1173,6 +1559,16 @@ function luckfox_pwm_app() { #endregion } +################################################################ +# @fu luckfox_check_uart +# +# @brief 1. Check if the UART conflicts with Bluetooth. +# +# @param uart_mode - The types that might be occupied by drivers. +# uart_main - The UART to be checked. +# +# @return none +################################################################ function luckfox_check_uart() { #region local uart_mode="$1" @@ -1187,6 +1583,17 @@ function luckfox_check_uart() { #endregion } +################################################################ +# @fu luckfox_uart_app +# +# @brief 1. Set the startup and shutdown of the UART. +# +# @param action - 1 indicates enable, 0 indicates disable. +# uart_main - +# uart_sub - +# +# @return none +################################################################ function luckfox_uart_app() { #region local action="$1" @@ -1237,6 +1644,16 @@ function luckfox_uart_app() { #endregion } +################################################################ +# @fu luckfox_check_i2c +# +# @brief 1. Check if the I2C conflicts with the touch or CSI. +# +# @param i2c_mode - The types that might be occupied by drivers. +# i2c_main - The I2C to be checked. +# +# @return none +################################################################ function luckfox_check_i2c() { #region local i2c_mode="$1" @@ -1303,6 +1720,18 @@ function luckfox_check_i2c() { #endregion } +################################################################ +# @fu luckfox_i2c_app +# +# @brief 1. Set the startup and shutdown of the UART. +# +# @param action - 1 indicates enable, 0 indicates disable. +# i2c_main - +# i2c_sub - +# i2c_speed - +# +# @return none +################################################################ function luckfox_i2c_app() { #region local action="$1" @@ -1365,6 +1794,16 @@ function luckfox_i2c_app() { #endregion } +################################################################ +# @fu luckfox_check_spi +# +# @brief 1. Check if the spi conflicts with the fbtft. +# +# @param spi_mode - The types that might be occupied by drivers. +# spi_main - The SPI to be checked. +# +# @return none +################################################################ function luckfox_check_spi() { #region local spi_mode="$1" @@ -1399,6 +1838,20 @@ function luckfox_check_spi() { #endregion } +################################################################ +# @fu luckfox_spi_app +# +# @brief 1. Set the startup and shutdown of the SPI. +# +# @param action - 1 indicates enable, 0 indicates disable. +# spi_main - +# spi_sub - +# cs_action - 1 indicates enable SPI-CS +# miso_action - 1 indicates enable SPI_MISO +# spi_speed - +# +# @return none +################################################################ function luckfox_spi_app() { #region local action="$1" @@ -1545,6 +1998,15 @@ function luckfox_spi_app() { #endregion } +################################################################ +# @fu luckfox_usb_app +# +# @brief 1. Set the USB mode +# +# @param usb_mode - +# +# @return none +################################################################ function luckfox_usb_app() { #region local usb_mode="$1" @@ -1570,6 +2032,15 @@ function luckfox_usb_app() { #endregion } +################################################################ +# @fu luckfox_csi_app +# +# @brief 1. Set the startup and shutdown of the CSI. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_csi_app() { #region local action="$1" @@ -1620,6 +2091,15 @@ function luckfox_csi_app() { #endregion } +################################################################ +# @fu luckfox_rgb_check_params +# +# @brief 1. Check whether the parameters passed to luckfox_rgb_app are valid. +# +# @param params - +# +# @return none +################################################################ function luckfox_rgb_check_params() { local params=("$@") @@ -1636,6 +2116,30 @@ function luckfox_rgb_check_params() { done } +################################################################ +# @fu luckfox_rgb_app +# +# @brief 1. Set the startup and shutdown of the CSI. +# +# @param action - 1 indicates enable, 0 indicates disable. +# rgb_mode - +# rgb_clk - +# rgb_h - +# rgb_v - +# rgb_hb - +# rgb_hf - +# rgb_vb - +# rgb_vf - +# rgb_h_len - +# rgb_v_len - +# rgb_h_active - +# rgb_v_active - +# rgb_de_active - +# rgb_pclk_active - +# +# +# @return none +################################################################ function luckfox_rgb_app() { #region local action="$1" @@ -1826,6 +2330,16 @@ function luckfox_rgb_app() { #endregion } +################################################################ +# @fu luckfox_ts_app +# +# @brief 1. Set the startup and shutdown of the TouchScreen. +# +# @param action - 1 indicates enable, 0 indicates disable. +# ts_reg_hex - Touch screen I2C address +# +# @return none +################################################################ function luckfox_ts_app() { #region local action="$1" @@ -1891,6 +2405,16 @@ function luckfox_ts_app() { #endregion } +################################################################ +# @fu luckfox_fbtft_app +# +# @brief 1. Set the startup and shutdown of the FBTFT. +# +# @param action - 1 indicates enable, 0 indicates disable. +# fbtft_compatible - The compatible value of the display driver corresponding to the TFT model. +# +# @return none +################################################################ function luckfox_fbtft_app() { #region local action="$1" @@ -2016,6 +2540,15 @@ function luckfox_fbtft_app() { #endregion } +################################################################ +# @fu luckfox_sdmmc_app +# +# @brief 1. Set the startup and shutdown of the SD Card. +# +# @param action - 1 indicates enable, 0 indicates disable. +# +# @return none +################################################################ function luckfox_sdmmc_app() { #region local action="$1" @@ -2076,7 +2609,224 @@ function luckfox_sdmmc_app() { #endregion } -# ---------------------- GUI Handler ---------------------- +################################################################ +# ------------------------- 4G Module -------------------------- +################################################################ + +################################################################ +# @fu luckfox_4g_reset_back +# +# @brief 1. The device restarts and changes the USB PID. +# 2. Run the background initialization program based on the Dial-up mode. +# +# @param cmd - The command to switch the operating mode of a USB network adapter. +# mode - Dial-up Mode of the USB 4G Network Card +# +# @return none +################################################################ +function luckfox_4g_reset_back() { + local cmd="$1" + local mode="$2" + + if [ ! -e "/dev/ttyUSB2" ]; then + luckfox_result_handle $LF_NONE "/dev/ttyUSB2" + fi + + # Close the related background processes. + ifconfig wwan0 down >/dev/null 2>&1 + killall simcom-cm >/dev/null 2>&1 + killall pppd >/dev/null 2>&1 + killall udhcpc >/dev/null 2>&1 + + echo "$cmd" >/dev/ttyUSB2 + + # wwan + if [ "$mode" == "wwan" ]; then + while true; do + if lsusb | grep -q "9001"; then + break + fi + sleep 5 + done + + while true; do + if ifconfig -a | grep -q "wwan0"; then + ifconfig wwan0 up + break + fi + sleep 5 + done + + sleep 5 + simcom-cm >/tmp/.wwan_log 2>&1 & + udhcpc -i wwan0 >/dev/null 2>&1 & + # ppp + elif [ "$mode" == "ppp" ]; then + while true; do + if lsusb | grep -q "9001"; then + break + fi + sleep 5 + done + + while true; do + if ifconfig -a | grep -q "wwan0"; then + ifconfig wwan0 up + break + fi + sleep 5 + done + + sleep 10 + if ! pgrep -f "simcom-pppd" >/dev/null; then + cd /etc/ppp/peers && pppd call simcom-pppd >/tmp/.wwan_log 2>&1 & + fi + #rndis + elif [ "$mode" == "ndis" ]; then + while true; do + if lsusb | grep -q "9011"; then + break + fi + sleep 5 + done + + while true; do + if ifconfig -a | grep -q "usb0"; then + ifconfig usb0 up + break + fi + sleep 5 + done + + udhcpc -i usb0 >/dev/null 2>&1 & + fi + +} + +################################################################ +# @fu luckfox_4g_app +# +# @brief 1. Set the startup and shutdown of the 4G Module. +# 2. Set the Dial-up Mode of the 4G Module. +# +# @param action - 1 indicates enable, 0 indicates disable. +# mode - Dial-up Mode of the USB 4G Network Card +# apn - Types of SIM Cards in PPP mode +# delay - Delay seconds before before running command +# +# @return none +################################################################ +function luckfox_4g_app() { + #region + local action="$1" + local mode="$2" + local apn="$3" + local delay="$4" + + if [ ! -e "/dev/ttyUSB2" ]; then + luckfox_result_handle $LF_NONE "/dev/ttyUSB2" + fi + + # Delay + if [ -z "$delay" ]; then + sleep 0 + else + sleep "$delay" + fi + + if [ "$action" == 1 ]; then + # WWAN + if [ "$mode" == "wwan" ]; then + if lsusb | grep -q "9001"; then + killall pppd >/dev/null 2>&1 + + ifconfig wwan0 up + simcom-cm >/tmp/.wwan_log 2>&1 & + udhcpc -i wwan0 >/dev/null 2>&1 & + else + luckfox_4g_reset_back "AT+CUSBPIDSWITCH=9001,1,1" "$mode" & + fi + + # PPP + elif [ "$mode" == "ppp" ]; then + if [ -f "/etc/ppp/peers/simcom-connect-chat" ]; then + rm /etc/ppp/peers/simcom-connect-chat + fi + cat <"/etc/ppp/peers/simcom-connect-chat" +ABORT "BUSY" +ABORT "NO CARRIER" +ABORT "NO DIALTONE" +ABORT "ERROR" +ABORT "NO ANSWER" +TIMEOUT 30 +"" AT +OK ATE0 +OK ATI;+CSUB;+CSQ;+CPIN?;+COPS?;+CGREG?;&D2 +OK AT+CGDCONT=1,"IP","$apn",,0,0 +OK ATD*99# +CONNECT +EOL + if lsusb | grep -q "9001"; then + killall simcom-cm >/dev/null 2>&1 + ifconfig wwan0 down >/dev/null 2>&1 + + cd /etc/ppp/peers && pppd call simcom-pppd >/tmp/.pppd_log 2>&1 & + else + luckfox_4g_reset_back "AT+CUSBPIDSWITCH=9001,1,1" "$mode" & + fi + + # NDIS + elif [ "$mode" == "ndis" ]; then + if lsusb | grep -q "9011"; then + ifconfig usb0 up + udhcpc -i usb0 >/dev/null 2>&1 & + else + luckfox_4g_reset_back "AT+CUSBPIDSWITCH=9011,1,1" "$mode" & + fi + fi + + luckfox_set_pin_cfg "MODULE_4G_ENABLE" "$action" + luckfox_set_pin_cfg "MODULE_4G_MODE" "$mode" + luckfox_set_pin_cfg "MODULE_4G_APN" "$apn" + + luckfox_set_pin_parameter "MODULE_4G_ENABLE" "$action" + luckfox_set_pin_parameter "MODULE_4G_MODE" "$mode" + luckfox_set_pin_parameter "MODULE_4G_APN" "$apn" + + luckfox_result_handle $LF_OK + else + killall luckfox_4g_reset_back >/dev/null 2>&1 + # wwan + ifconfig wwan0 down + killall simcom-cm >/dev/null 2>&1 + # pppd + killall pppd >/dev/null 2>&1 + + #udhcpc + killall udhcpcp >/dev/null 2>&1 + + luckfox_set_pin_cfg "MODULE_4G_ENABLE" "$action" + luckfox_set_pin_parameter "MODULE_4G_ENABLE" "$action" + + luckfox_result_handle $LF_OK + fi + #endregion +} + +################################################################ +# ------------------------- GUI Handler ------------------------ +################################################################ + +################################################################ +# @fu luckfox_result_handle +# +# @brief 1. Display a message in the GUI. +# +# @param status - Status of messages +# log - Prepare the message to be printed +# +# @return none +################################################################ function luckfox_result_handle() { local status="$1" local log="$2" @@ -2110,50 +2860,16 @@ function luckfox_result_handle() { fi } -function luckfox_get_option_str() { - local search_param="$1" - local group=() - local right_group=() - local option_group=() - local option_str="" - - while IFS= read -r line; do - if [[ "$line" == *"| |"* && "$line" == *"$search_param"* ]]; then - group=() - right_group=() - - IFS='-' read -r -a group <<<"$(echo "$line" | cut -d'|' -f1)" - IFS='-' read -r -a right_group <<<"$(echo "$line" | cut -d'|' -f3)" - group+=("${right_group[@]}") - for pin in "${group[@]}"; do - if [ "$search_param" == "UART" ]; then - if [[ "$pin" == *"$search_param"*"_RX"* ]]; then - option_group+=$(echo "$pin" | sed -E 's/(UART[0-9]+_M[0-9]+)_.*$/\1 x /g') - fi - elif [ "$search_param" == "PWM" ]; then - if [[ "$pin" == *"$search_param"* ]]; then - option_group+=$(echo "$pin" | sed -E 's/(PWM[0-9]+_M[0-9]+).*$/\1 x /g') - fi - elif [ "$search_param" == "I2C" ]; then - if [[ "$pin" == *"$search_param"*"_SCL"* ]]; then - option_group+=$(echo "$pin" | sed -E 's/(I2C[0-9]+_M[0-9]+)_.*$/\1 x /g') - fi - elif [ "$search_param" == "SPI" ]; then - if [[ "$pin" == *"$search_param"*"_CLK"* ]]; then - option_group+=$(echo "$pin" | sed -E 's/(SPI[0-9]+_M[0-9]+)_.*$/\1 x /g') - fi - fi - done - fi - done <"$LUCKFOX_PIN_DIAGRAM_FILE" - - for element in "${option_group[@]}"; do - option_str+="$element" - done - - echo "$option_str" -} - +################################################################ +# @fu luckfox_result_handle +# +# @brief 1. Display a message in the GUI. +# +# @param status - Status of messages +# log - Prepare the message to be printed +# +# @return none +################################################################ function luckfox_pico_show_pin_diagram() { if [ -f $LUCKFOX_PIN_DIAGRAM_FILE ]; then dialog --title "Luckfox Pin Diagram" --no-collapse --textbox $LUCKFOX_PIN_DIAGRAM_FILE 100 100 @@ -2162,10 +2878,29 @@ function luckfox_pico_show_pin_diagram() { fi } -# ---------------------- Main GUI ------------------------- +################################################################ +# -------------------------- Main GUI -------------------------- +################################################################ function luckfox_show_menu() { + # Only support Luckfox Pico Pi /Luckfox Pico Pi W + if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi W" ]; then + while true; do + option=$(dialog --title "$LUCKFOX_CHIP_MODEL Config" \ + --menu "Choose an option" 80 50 6 \ + 1 "Advanced Options" \ + 2 "4G Module" \ + 3 "About Luckfox" \ + 2>&1 >/dev/tty) + + case $option in + 1) luckfox_advanced_options ;; + 2) luckfox_4G ;; + 3) luckfox_about ;; + *) luckfox_exit ;; + esac + done # Only support Luckfox Pico Ultra /Luckfox Pico Ultra W - if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then + elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then while true; do option=$(dialog --title "$LUCKFOX_CHIP_MODEL Config" \ --menu "Choose an option" 80 50 6 \ @@ -2235,7 +2970,29 @@ function luckfox_compatible_devices() { } function luckfox_advanced_options() { - if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then + if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pi W" ]; then + while true; do + option=$(dialog --title "Advanced Options" \ + --menu "Choose an option" 80 50 6 \ + 1 "PWM" \ + 2 "UART" \ + 3 "I2C" \ + 4 "SPI" \ + 5 "USB" \ + 6 "CSI" \ + 2>&1 >/dev/tty) + + case $option in + 1) luckfox_PWM ;; + 2) luckfox_UART ;; + 3) luckfox_I2C ;; + 4) luckfox_SPI ;; + 5) luckfox_USB ;; + 6) luckfox_CSI ;; + *) luckfox_show_menu ;; + esac + done + elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then while true; do option=$(dialog --title "Advanced Options" \ --menu "Choose an option" 80 50 6 \ @@ -2302,8 +3059,9 @@ function luckfox_exit() { exit } -# ---------------------- Sub GUI ------------------------- -# Advanced Options +################################################################ +# ------------------- Advanced Options GUI --------------------- +################################################################ function luckfox_PWM() { local pwm_enable pwm_main pwm_sub local option pattern @@ -2686,7 +3444,67 @@ function luckfox_SDMMC() { luckfox_advanced_options } -# ---------------------- RUN ------------------------- +################################################################ +# ---------------------- 4G Module GUI ------------------------- +################################################################ +function luckfox_4G() { + local module_4g_enable + local module_4g_mode + local mode apn + + if [ "$(cat /proc/device-tree/usbdrd/usb@ffb00000/dr_mode)" == "peripheral" ]; then + luckfox_result_handle "USB device mode can't support 4G Module" + fi + + module_4g_enable=$(dialog --menu "4G Module Config" 10 40 2 \ + 0 "disable" \ + 1 "enable" \ + 2>&1 >/dev/tty) + if [ -z "$module_4g_enable" ]; then + luckfox_show_menu + fi + + if [ "$module_4g_enable" == 1 ]; then + module_4g_mode=$(dialog --title "4G Module Mode Config" \ + --menu "Choose an option" 80 50 6 \ + 1 "WWAN" \ + 2 "PPP" \ + 3 "NDIS" \ + 2>&1 >/dev/tty) + + if [ -z "$module_4g_mode" ]; then + luckfox_show_menu + fi + + case $module_4g_mode in + 1) mode="wwan" ;; + 2) mode="ppp" ;; + 3) mode="ndis" ;; + esac + + if [ "$mode" = "ppp" ]; then + card_type=$(dialog --title "4G Module PPP Mode Card Type Config" \ + --menu "Select Card Type" 80 50 6 \ + 1 "CTCC(ctnet)" \ + 2 "CMCC(cmnet)" \ + 3 "CUCC(3gwap)" \ + 2>&1 >/dev/tty) + + case $card_type in + 1) apn="ctnet" ;; + 2) apn="cmnet" ;; + 3) apn="3gwap" ;; + esac + fi + + fi + + luckfox_4g_app "$module_4g_enable" "$mode" "$apn" +} + +################################################################ +# --------------------------- Run ------------------------------ +################################################################ if [ "$1" == "load" ]; then LF_GUI_ENABLE=0 if [ -f $LUCKFOX_PIN_DIAGRAM_FILE ]; then diff --git a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-connect-chat b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-connect-chat new file mode 100644 index 000000000..1cc8e181c --- /dev/null +++ b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-connect-chat @@ -0,0 +1,13 @@ +ABORT "BUSY" +ABORT "NO CARRIER" +ABORT "NO DIALTONE" +ABORT "ERROR" +ABORT "NO ANSWER" +TIMEOUT 30 +"" AT +OK ATE0 +OK ATI;+CSUB;+CSQ;+CPIN?;+COPS?;+CGREG?;&D2 +# Insert the APN provided by your network operator, default apn is 3gnet +OK AT+CGDCONT=1,"IP","ctnet",,0,0 +OK ATD*99# +CONNECT diff --git a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-disconnect-chat b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-disconnect-chat new file mode 100644 index 000000000..baa268a59 --- /dev/null +++ b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-disconnect-chat @@ -0,0 +1,8 @@ +ABORT "ERROR" +ABORT "NO DIALTONE" +SAY "\nSending break to the modem\n" +"" +++ +"" +++ +"" +++ +SAY "\nGoodbay\n" + diff --git a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-pppd b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-pppd new file mode 100644 index 000000000..cf4810ebe --- /dev/null +++ b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ppp/etc/ppp/peers/simcom-pppd @@ -0,0 +1,35 @@ +/dev/ttyUSB2 115200 +user "test" password "test" +# The chat script, customize your APN in this file +connect 'chat -s -v -f /etc/ppp/peers/simcom-connect-chat' +# The close script +disconnect 'chat -s -v -f /etc/ppp/peers/simcom-disconnect-chat' +# Hide password in debug messages +hide-password +# The phone is not required to authenticate +noauth +# Debug info from pppd +debug +# If you want to use the HSDPA link as your gateway +defaultroute +# pppd must not propose any IP address to the peer +noipdefault +# No ppp compression +novj +novjccomp +noccp +ipcp-accept-local +ipcp-accept-remote +local +# For sanity, keep a lock on the serial line +lock +modem +dump +nodetach +# Hardware flow control +nocrtscts +remotename 3gppp +ipparam 3gppp +ipcp-max-failure 30 +# Ask the peer for up to 2 DNS server addresses +usepeerdns diff --git a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ubuntu-config/usr/bin/killall b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ubuntu-config/usr/bin/killall new file mode 100755 index 0000000000000000000000000000000000000000..ce58cab6aa235c9fd72a7b73ba494faa8e883590 GIT binary patch literal 18540 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 Tq(gNJJnumdS8~Rm0Q-LcnaBS- literal 0 HcmV?d00001 diff --git a/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ubuntu-sim7600g/usr/bin/simcom-cm b/project/cfg/BoardConfig_IPC/overlay/overlay-luckfox-ubuntu-sim7600g/usr/bin/simcom-cm new file mode 100755 index 0000000000000000000000000000000000000000..bd78e7b716212c741e38d88b04c55c7e94671432 GIT binary patch literal 55200 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

p^g^RkJWBNw2U7TYvBRKZNMQ|J(ixC`q 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 +#include + +/ { + chosen { + bootargs = "earlycon=uart8250,mmio32,0xff4c0000 console=ttyFIQ0 root=/dev/mmcblk0p7 rootwait snd_soc_core.prealloc_buffer_size_kbytes=16 coherent_pool=0"; + }; + + reserved_memory: reserved-memory { + status = "okay"; + #address-cells = <1>; + #size-cells = <1>; + ranges; + mmc_ecsd: mmc@3f000 { + reg = <0x3f000 0x00001000>; + }; + }; + + acodec_sound: acodec-sound { + compatible = "simple-audio-card"; + simple-audio-card,name = "rv1106-acodec"; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,cpu { + sound-dai = <&i2s0_8ch>; + }; + simple-audio-card,codec { + sound-dai = <&acodec>; + }; + }; + + dsm_sound: dsm-sound { + status = "disabled"; + compatible = "simple-audio-card"; + simple-audio-card,format = "i2s"; + simple-audio-card,mclk-fs = <256>; + simple-audio-card,name = "rockchip,dsm-sound"; + simple-audio-card,bitclock-master = <&sndcodec>; + simple-audio-card,frame-master = <&sndcodec>; + sndcpu: simple-audio-card,cpu { + sound-dai = <&i2s0_8ch>; + }; + sndcodec: simple-audio-card,codec { + sound-dai = <&dsm>; + }; + }; + + vcc_1v8: vcc-1v8 { + compatible = "regulator-fixed"; + regulator-name = "vcc_1v8"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + }; + + vcc_3v3: vcc-3v3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + vdd_arm: vdd-arm { + compatible = "regulator-fixed"; + regulator-name = "vdd_arm"; + regulator-min-microvolt = <800000>; + regulator-max-microvolt = <1000000>; + regulator-init-microvolt = <900000>; + regulator-always-on; + regulator-boot-on; + }; + + leds: leds { + compatible = "gpio-leds"; + work_led: work{ + gpios = <&gpio3 RK_PC6 GPIO_ACTIVE_HIGH>; + linux,default-trigger = "activity"; + default-state = "on"; + }; + }; +}; + +/***************************** audio ********************************/ +&i2s0_8ch { + #sound-dai-cells = <0>; + status = "okay"; +}; + +&acodec { + #sound-dai-cells = <0>; + status = "okay"; +}; + +/************************* FIQ_DUBUGGER ****************************/ +&fiq_debugger { + rockchip,irq-mode-enable = <1>; + status = "okay"; +}; + +/***************************** USB *********************************/ +&u2phy { + status = "okay"; +}; + +&u2phy_otg { + status = "okay"; +}; + +&usbdrd { + status = "okay"; +}; + +&usbdrd_dwc3 { + extcon = <&u2phy>; + status = "okay"; +}; + +/***************************** DSM *********************************/ +&dsm { + status = "disabled"; +}; + +&cpu0 { + cpu-supply = <&vdd_arm>; +}; + +/*************************** CSI *********************************/ +&csi2_dphy_hw { + status = "okay"; +}; + +&csi2_dphy0 { + status = "okay"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + csi_dphy_input0: endpoint@0 { + reg = <0>; + remote-endpoint = <&sc3336_out>; + data-lanes = <1 2>; + }; + + csi_dphy_input1: endpoint@1 { + reg = <1>; + remote-endpoint = <&mis5001_out>; + data-lanes = <1 2>; + }; + }; + + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + + csi_dphy_output: endpoint@0 { + reg = <0>; + remote-endpoint = <&mipi_csi2_input>; + }; + }; + }; +}; + +&i2c4 { + status = "okay"; + clock-frequency = <400000>; + pinctrl-names = "default"; + //pinctrl-0 = <&i2c4m2_xfer>; + + sc3336: sc3336@30 { + compatible = "smartsens,sc3336"; + status = "okay"; + reg = <0x30>; + clocks = <&cru MCLK_REF_MIPI0>; + clock-names = "xvclk"; + reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&mipi_refclk_out0>; + rockchip,camera-module-index = <0>; + rockchip,camera-module-facing = "back"; + rockchip,camera-module-name = "CMK-OT2119-PC1"; + rockchip,camera-module-lens-name = "30IRC-F16"; + port { + sc3336_out: endpoint { + remote-endpoint = <&csi_dphy_input0>; + data-lanes = <1 2>; + }; + }; + }; + + mis5001: mis5001@31 { + compatible = "imagedesign,mis5001"; + status = "okay"; + reg = <0x31>; + clocks = <&cru MCLK_REF_MIPI0>; + clock-names = "xvclk"; + reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&mipi_refclk_out0>; + rockchip,camera-module-index = <0>; + rockchip,camera-module-facing = "back"; + rockchip,camera-module-name = "CMK-OT2115-PC1"; + rockchip,camera-module-lens-name = "30IRC-F16"; + port { + mis5001_out: endpoint { + remote-endpoint = <&csi_dphy_input1>; + data-lanes = <1 2>; + }; + }; + }; +}; + +&mipi0_csi2 { + status = "okay"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + mipi_csi2_input: endpoint@1 { + reg = <1>; + remote-endpoint = <&csi_dphy_output>; + }; + }; + + port@1 { + reg = <1>; + #address-cells = <1>; + #size-cells = <0>; + + mipi_csi2_output: endpoint@0 { + reg = <0>; + remote-endpoint = <&cif_mipi_in>; + }; + }; + }; +}; + +&rkcif { + status = "okay"; +}; + +&rkcif_mipi_lvds { + status = "okay"; + + pinctrl-names = "default"; + pinctrl-0 = <&mipi_pins>; + port { + /* MIPI CSI-2 endpoint */ + cif_mipi_in: endpoint { + remote-endpoint = <&mipi_csi2_output>; + }; + }; +}; + +&rkcif_mipi_lvds_sditf { + status = "okay"; + + port { + /* MIPI CSI-2 endpoint */ + mipi_lvds_sditf: endpoint { + remote-endpoint = <&isp_in>; + }; + }; +}; + +&rkisp { + status = "okay"; +}; + +&rkisp_vir0 { + status = "okay"; + + port@0 { + isp_in: endpoint { + remote-endpoint = <&mipi_lvds_sditf>; + }; + }; +}; + +/***************************** ADC ********************************/ +&saradc { + status = "okay"; + vref-supply = <&vcc_1v8>; +}; + +&tsadc { + status = "okay"; +}; + +/**************************** PINCTRL ******************************/ +// SPI +&spi0 { + pinctrl-0 = <&spi0m0_clk &spi0m0_miso &spi0m0_mosi &spi0m0_cs0>; + #address-cells = <1>; + #size-cells = <0>; + spidev@0 { + compatible = "rockchip,spidev"; + spi-max-frequency = <50000000>; + reg = <0>; + }; +}; + +// I2C +&i2c1 { + pinctrl-0 = <&i2c1m1_xfer>; +}; +&i2c2 { + pinctrl-0 = <&i2c2m0_xfer>; +}; +&i2c3 { + pinctrl-0 = <&i2c3m0_xfer &i2c3m1_xfer &i2c3m2_xfer>; +}; +&i2c4 { + pinctrl-0 = <&i2c4m0_xfer &i2c4m1_xfer &i2c4m2_xfer>; +}; + +// UART +&uart0 { + pinctrl-0 = <&uart0m0_xfer &uart0m1_xfer>; +}; +&uart1 { + pinctrl-0 = <&uart1m1_xfer>; +}; +&uart3 { + + pinctrl-0 = <&uart3m0_xfer &uart3m1_xfer>; +}; +&uart4 { + pinctrl-0 = <&uart4m0_xfer &uart4m1_xfer>; +}; +&uart5 { + pinctrl-0 = <&uart5m1_xfer>; +}; + +// PWM +&pwm0 { + pinctrl-0 = <&pwm0m1_pins>; +}; +&pwm1 { + pinctrl-0 = <&pwm1m1_pins &pwm1m2_pins>; +}; +&pwm2 { + pinctrl-0 = <&pwm2m0_pins &pwm2m1_pins &pwm2m2_pins>; +}; +&pwm3 { + pinctrl-0 = <&pwm3m1_pins &pwm3m2_pins>; +}; +&pwm4 { + pinctrl-0 = <&pwm4m0_pins &pwm4m1_pins &pwm4m2_pins>; +}; +&pwm5 { + pinctrl-0 = <&pwm5m1_pins &pwm5m2_pins>; +}; +&pwm6 { + pinctrl-0 = <&pwm6m1_pins &pwm6m2_pins>; +}; +&pwm7 { + pinctrl-0 = <&pwm7m0_pins &pwm7m1_pins>; +}; +&pwm8 { + pinctrl-0 = <&pwm8m1_pins>; +}; +&pwm9 { + pinctrl-0 = <&pwm9m1_pins>; +}; +&pwm10 { + pinctrl-0 = <&pwm10m1_pins &pwm10m2_pins>; +}; +&pwm11 { + pinctrl-0 = <&pwm11m1_pins &pwm11m2_pins>; +}; + +&pinctrl { + spi0 { + spi0m0_clk: spi0m0-clk { + rockchip,pins = <1 RK_PC1 4 &pcfg_pull_none>; + }; + spi0m0_mosi: spi0m0-mosi { + rockchip,pins = <1 RK_PC2 6 &pcfg_pull_none>; + }; + spi0m0_miso: spi0m0-miso { + rockchip,pins = <1 RK_PC3 6 &pcfg_pull_none>; + }; + spi0m0_cs0: spi0m0-cs0 { + rockchip,pins = <1 RK_PC0 4 &pcfg_pull_none>; + }; + }; +}; diff --git a/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi-w.dts b/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi-w.dts new file mode 100755 index 000000000..6594ac3df --- /dev/null +++ b/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi-w.dts @@ -0,0 +1,161 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ + +/dts-v1/; +#include "rv1106.dtsi" +#include "rv1106-luckfox-pico-pi-ipc.dtsi" +#include +#include + +/ { + model = "Luckfox Pico Pi W"; + compatible = "rockchip,rv1103g-38x38-ipc-v10", "rockchip,rv1106g3"; + + restart-poweroff { + compatible = "restart-poweroff"; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + pinctrl-names = "default"; + reset-gpios = <&gpio1 RK_PA2 GPIO_ACTIVE_LOW>; + }; + + wireless_bluetooth: wireless-bluetooth { + compatible = "bluetooth-platdata"; + uart_rts_gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_LOW>; + pinctrl-names = "default", "rts_gpio"; + pinctrl-0 = <&uart1m0_rtsn>; + pinctrl-1 = <&uart1_gpios>; + BT,wake_gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>; + BT,wake_host_irq = <&gpio1 RK_PA2 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; +}; + +/**********CRU**********/ +//&cru { +// assigned-clocks = +// <&cru PLL_GPLL>, <&cru PLL_CPLL>, +// <&cru ARMCLK>, +// <&cru ACLK_PERI_ROOT>, <&cru HCLK_PERI_ROOT>, +// <&cru PCLK_PERI_ROOT>, <&cru ACLK_BUS_ROOT>, +// <&cru PCLK_TOP_ROOT>, <&cru PCLK_PMU_ROOT>, +// <&cru HCLK_PMU_ROOT>, <&cru CLK_500M_SRC>; +// assigned-clock-rates = +// <1188000000>, <700000000>, +// <1104000000>, +// <400000000>, <200000000>, +// <100000000>, <300000000>, +// <100000000>, <100000000>, +// <200000000>, <700000000>; +//}; + +/**********NPU**********/ +//&npu { +// assigned-clock-rates = <700000000>; +//}; + +/**********EMMC**********/ +&emmc { + bus-width = <8>; + cap-mmc-highspeed; + non-removable; + // mmc-hs200-1_8v; + rockchip,default-sample-phase = <90>; + no-sdio; + no-sd; + memory-region-ecsd = <&mmc_ecsd>; + post-power-on-delay-ms = <0>; + status = "okay"; +}; + +&fiq_debugger { + rockchip,irq-mode-enable = <1>; + status = "okay"; +}; + +/**********SDIO-WIFI**********/ +&sdmmc { + max-frequency = <50000000>; + bus-width = <4>; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + non-removable; + rockchip,default-sample-phase = <90>; + // no-sd; + // no-mmc; + supports-sdio; + mmc-pwrseq = <&sdio_pwrseq>; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0_clk &sdmmc0_cmd &sdmmc0_bus4 &sdmmc0_det>; + status = "okay"; +}; + +&pinctrl{ + sdmmc0{ + sdmmc0_det: sdmmc0-det { + rockchip,pins = + /* sdmmc0_det */ + <3 RK_PA1 1 &pcfg_pull_down>; + }; + }; +}; + +/**********SD-CARD*********/ +&sdio { + max-frequency = <50000000>; + no-sdio; + no-mmc; + supports-sd; + bus-width = <4>; + cap-mmc-highspeed; + cap-sd-highspeed; + disable-wp; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc1m0_cmd &sdmmc1m0_clk &sdmmc1m0_bus4>; + status = "okay"; +}; + +/**********ETH**********/ +&gmac { + status = "okay"; +}; + +/**********USB**********/ +&usbdrd_dwc3 { + status = "okay"; + dr_mode = "peripheral"; + //dr_mode = "host"; +}; + +/**********RTC**********/ +&rtc { + status = "okay"; +}; + +/**********BT**********/ +&uart1 { + status = "okay"; + pinctrl-names = "default"; + pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn>; +}; + +&pinctrl { + wireless-bluetooth { + uart1_gpios: uart1-gpios { + rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +/**********SPI**********/ +&spi0 { + status = "disabled"; + spidev@0 { + spi-max-frequency = <50000000>; + }; +}; diff --git a/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi.dts b/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi.dts new file mode 100755 index 000000000..9453961e8 --- /dev/null +++ b/sysdrv/source/kernel/arch/arm/boot/dts/rv1106g-luckfox-pico-pi.dts @@ -0,0 +1,102 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2022 Rockchip Electronics Co., Ltd. + */ + +/dts-v1/; +#include "rv1106.dtsi" +#include "rv1106-luckfox-pico-pi-ipc.dtsi" +#include +#include + +/ { + model = "Luckfox Pico Pi"; + compatible = "rockchip,rv1103g-38x38-ipc-v10", "rockchip,rv1106g3"; + + restart-poweroff { + compatible = "restart-poweroff"; + }; + +}; + +/**********CRU**********/ +//&cru { +// assigned-clocks = +// <&cru PLL_GPLL>, <&cru PLL_CPLL>, +// <&cru ARMCLK>, +// <&cru ACLK_PERI_ROOT>, <&cru HCLK_PERI_ROOT>, +// <&cru PCLK_PERI_ROOT>, <&cru ACLK_BUS_ROOT>, +// <&cru PCLK_TOP_ROOT>, <&cru PCLK_PMU_ROOT>, +// <&cru HCLK_PMU_ROOT>, <&cru CLK_500M_SRC>; +// assigned-clock-rates = +// <1188000000>, <700000000>, +// <1104000000>, +// <400000000>, <200000000>, +// <100000000>, <300000000>, +// <100000000>, <100000000>, +// <200000000>, <700000000>; +//}; + +/**********NPU**********/ +//&npu { +// assigned-clock-rates = <700000000>; +//}; + +/**********EMMC**********/ +&emmc { + bus-width = <8>; + cap-mmc-highspeed; + non-removable; + // mmc-hs200-1_8v; + rockchip,default-sample-phase = <90>; + no-sdio; + no-sd; + memory-region-ecsd = <&mmc_ecsd>; + post-power-on-delay-ms = <0>; + status = "okay"; +}; + +&fiq_debugger { + rockchip,irq-mode-enable = <1>; + status = "okay"; +}; + +/**********SD_CARD**********/ +&sdio { + max-frequency = <50000000>; + no-sdio; + no-mmc; + supports-sd; + bus-width = <4>; + cap-mmc-highspeed; + cap-sd-highspeed; + disable-wp; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc1m0_cmd &sdmmc1m0_clk &sdmmc1m0_bus4>; + status = "okay"; +}; + +/**********ETH**********/ +&gmac { + status = "okay"; +}; + +/**********USB**********/ +&usbdrd_dwc3 { + status = "okay"; + dr_mode = "peripheral"; + //dr_mode = "host"; +}; + +/**********RTC**********/ +&rtc { + status = "okay"; +}; + +/**********SPI**********/ +&spi0 { + status = "disabled"; + spidev@0 { + spi-max-frequency = <50000000>; + }; +}; diff --git a/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106-wwan-ndis-ppp.config b/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106-wwan-ndis-ppp.config new file mode 100755 index 000000000..1e30a9f73 --- /dev/null +++ b/sysdrv/source/kernel/arch/arm/configs/luckfox_rv1106-wwan-ndis-ppp.config @@ -0,0 +1,16 @@ +CONFIG_USB_NET_DRIVERS=y +CONFIG_PPP=y +CONFIG_PPP_BSDCOMP=y +CONFIG_PPP_DEFLATE=y +CONFIG_PPP_FILTER=y +CONFIG_PPP_MULTILINK=y +CONFIG_PPP_ASYNC=y +CONFIG_PPP_SYNC_TTY=y +CONFIG_USB_USBNET=y +CONFIG_USB_NET_RNDIS_HOST=y +CONFIG_USB_NET_QMI_WWAN=y +CONFIG_USB_WDM=y +CONFIG_USB_SERIAL=y +CONFIG_USB_SERIALIPW=y +CONFIG_USB_SERIAL_OPTION=y +CONFIG_USB_SERIAL_QUALCOMM=y diff --git a/sysdrv/source/kernel/drivers/media/i2c/sc3336.c b/sysdrv/source/kernel/drivers/media/i2c/sc3336.c index 51fc48cbc..bea465d80 100644 --- a/sysdrv/source/kernel/drivers/media/i2c/sc3336.c +++ b/sysdrv/source/kernel/drivers/media/i2c/sc3336.c @@ -461,23 +461,6 @@ static const struct regval sc3336_linear_10_2304x1296_30fps_regs[] = { }; static const struct sc3336_mode supported_modes[] = { - { - .width = 2304, - .height = 1296, - .max_fps = { - .numerator = 10000, - .denominator = 250000, - }, - .exp_def = 0x0080, - .hts_def = 0x05dc, - .vts_def = 0x0654, - .bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10, - .reg_list = sc3336_linear_10_2304x1296_25fps_regs, - .hdr_mode = NO_HDR, - .xvclk_freq = 27000000, - .link_freq_idx = 0, - .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0, - }, { .width = 2304, .height = 1296, @@ -494,6 +477,23 @@ static const struct sc3336_mode supported_modes[] = { .xvclk_freq = 24000000, .link_freq_idx = 1, .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0, + }, + { + .width = 2304, + .height = 1296, + .max_fps = { + .numerator = 10000, + .denominator = 250000, + }, + .exp_def = 0x0080, + .hts_def = 0x05dc, + .vts_def = 0x0654, + .bus_fmt = MEDIA_BUS_FMT_SBGGR10_1X10, + .reg_list = sc3336_linear_10_2304x1296_25fps_regs, + .hdr_mode = NO_HDR, + .xvclk_freq = 27000000, + .link_freq_idx = 0, + .vc[PAD0] = V4L2_MBUS_CSI2_CHANNEL_0, } }; diff --git a/sysdrv/source/kernel/drivers/usb/serial/option.c b/sysdrv/source/kernel/drivers/usb/serial/option.c index 5636b8f52..39ac03ca7 100644 --- a/sysdrv/source/kernel/drivers/usb/serial/option.c +++ b/sysdrv/source/kernel/drivers/usb/serial/option.c @@ -606,6 +606,10 @@ static void option_instat_callback(struct urb *urb); static const struct usb_device_id option_ids[] = { +#if 1 /* Added by Simcom */ + { USB_DEVICE(0x05c6, 0x90DB) }, + { USB_DEVICE(0x1e0e, 0x9001) }, +#endif { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA_LIGHT) }, @@ -2229,6 +2233,9 @@ static struct usb_serial_driver option_1port_device = { #ifdef CONFIG_PM .suspend = usb_wwan_suspend, .resume = usb_wwan_resume, +#if 1 /* Added by Simcom */ + .reset_resume = usb_wwan_resume, +#endif #endif }; @@ -2253,6 +2260,16 @@ static int option_probe(struct usb_serial *serial, &serial->interface->cur_altsetting->desc; unsigned long device_flags = id->driver_info; +#if 1 /* Added by Simcom */ + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x05C6) && serial->dev->descriptor.idProduct == cpu_to_le16(0x90DB) + && serial->interface->cur_altsetting->desc.bInterfaceNumber >= 2) + return -ENODEV; + + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x1E0E) && serial->dev->descriptor.idProduct == cpu_to_le16(0x9001) + && serial->interface->cur_altsetting->desc.bInterfaceNumber >=5) + return -ENODEV; +#endif + /* Never bind to the CD-Rom emulation interface */ if (iface_desc->bInterfaceClass == USB_CLASS_MASS_STORAGE) return -ENODEV; diff --git a/sysdrv/source/kernel/drivers/usb/serial/usb_wwan.c b/sysdrv/source/kernel/drivers/usb/serial/usb_wwan.c index 628a75d12..d11764681 100644 --- a/sysdrv/source/kernel/drivers/usb/serial/usb_wwan.c +++ b/sysdrv/source/kernel/drivers/usb/serial/usb_wwan.c @@ -481,6 +481,13 @@ static struct urb *usb_wwan_setup_urb(struct usb_serial_port *port, if (intfdata->use_zlp && dir == USB_DIR_OUT) urb->transfer_flags |= URB_ZERO_PACKET; +#if 1 /* Added by Simcom for Zero Packet */ + if (dir == USB_DIR_OUT) { + if (serial->dev->descriptor.idVendor == cpu_to_le16(0x1E0E)) + urb->transfer_flags |= URB_ZERO_PACKET; + } +#endif + return urb; }