#!/bin/bash export LUCKFOX_CHIP_MODEL export LUCKFOX_CHIP_MEDIA export LUCKFOX_CHIP_MEDIA_CLASS 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 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 LUCKFOX_CFG_FILE=/etc/luckfox.cfg # return LF_OK=0 LF_ERR=1 LF_NONE=2 LF_GUI_ENABLE=0 function luckfox_config_init() { # check command if ! command -v dialog &>/dev/null; then echo "The dialog is not installed " exit fi if ! command -v dtc &>/dev/null; then echo "The dtc is not installed" exit fi if ! command -v iomux &>/dev/null; then echo "The iomux is not installed" exit fi # get chip model LUCKFOX_CHIP_MODEL="$(cat /proc/device-tree/model)" >/dev/null 2>&1 # cteate cfg file if [ ! -f $LUCKFOX_CFG_FILE ]; then touch $LUCKFOX_CFG_FILE fi # get media class if [ ! -f $LUCKFOX_PIN_DIAGRAM_FILE ]; then if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_pico_plus_pin_diagram_file elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_pico_pro_max_pin_diagram_file elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then luckfox_pico_pin_diagram_file elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Mini A" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Mini B" ]; then 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 fi fi # get media class dev if [[ -e /dev/mmcblk0p4 ]]; then LUCKFOX_CHIP_MEDIA_CLASS="emmc" LUCKFOX_CHIP_MEDIA=/dev/mmcblk0p4 elif [[ -e /dev/mmcblk1p4 ]]; then LUCKFOX_CHIP_MEDIA_CLASS="sdmmc" LUCKFOX_CHIP_MEDIA=/dev/mmcblk1p4 luckfox_set_pin_parameter "SDMMC" 1 elif [[ -e /dev/mtdblock3 ]]; then LUCKFOX_CHIP_MEDIA_CLASS="spi_nand" LUCKFOX_CHIP_MEDIA=/dev/mtdblock3 else LUCKFOX_CHIP_MEDIA_CLASS="unknown" echo "Do not know the storage medium of Luckfox!" exit fi # init luckfox_update_fdt >/dev/null 2>&1 # Save Change if [ -f $LUCKFOX_CHANGE_TXT ]; then rm $LUCKFOX_CHANGE_TXT fi touch $LUCKFOX_CHANGE_TXT } function luckfox_load_cfg() { local group right_group local multi_pins_group=() local pin value pattern local status 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 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" # RGB value=$(luckfox_get_pin_cfg "RGB_ENABLE") if [ "$value" == 1 ] || [ -z "$value" ]; then if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then # set pins mark luckfox_set_pin_mark "GPIO1_D0" 1 luckfox_set_pin_mark "GPIO1_D1" 1 luckfox_set_pin_mark "GPIO1_C2" 1 luckfox_set_pin_mark "GPIO1_C3" 1 luckfox_set_pin_mark "GPIO1_C1" 1 luckfox_set_pin_mark "GPIO1_C6" 1 luckfox_set_pin_mark "GPIO2_A7" 1 luckfox_set_pin_mark "GPIO2_A6" 1 luckfox_set_pin_mark "GPIO1_D3" 1 luckfox_set_pin_mark "GPIO1_C0" 1 luckfox_set_pin_mark "GPIO1_D2" 1 luckfox_set_pin_mark "GPIO1_C7" 1 luckfox_set_pin_mark "GPIO2_B0" 1 luckfox_set_pin_mark "GPIO2_B1" 1 luckfox_set_pin_mark "GPIO1_C4" 1 luckfox_set_pin_mark "GPIO1_C5" 1 luckfox_set_pin_mark "GPIO2_A1" 1 luckfox_set_pin_mark "GPIO2_A0" 1 luckfox_set_pin_mark "GPIO2_A5" 1 luckfox_set_pin_mark "GPIO2_A4" 1 luckfox_set_pin_mark "GPIO2_A2" 1 luckfox_set_pin_mark "GPIO2_A3" 1 else echo "Only Luckfox Pico Ultra /Luckfox Pico Ultra W support RGB" fi fi # CSI ( Priority is lower than RGB ) value=$(luckfox_get_pin_cfg "CSI_ENABLE") if [ -z "$value" ]; then if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then luckfox_set_pin_mark "I2C4_M1_SCL" 1 luckfox_set_pin_mark "I2C4_M1_SDA" 1 luckfox_set_pin_mark "I2C4_M0_SCL" 1 luckfox_set_pin_mark "I2C4_M0_SDA" 1 fi fi # FBTFT value=$(luckfox_get_pin_cfg "FBTFT_ENABLE") if [ "$value" == 1 ]; then echo "FBTFT enable" if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then luckfox_set_pin_mark "GPIO1_A2" "$value" luckfox_set_pin_mark "GPIO1_C0" "$value" luckfox_set_pin_mark "GPIO1_C1" "$value" luckfox_set_pin_mark "GPIO1_C2" "$value" luckfox_set_pin_mark "GPIO1_C3" "$value" luckfox_set_pin_mark "GPIO0_A4" "$value" luckfox_fbtft_app 1 "sitronix,st7789v" elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_set_pin_mark "GPIO2_B1" "$value" luckfox_set_pin_mark "GPIO1_C0" "$value" luckfox_set_pin_mark "GPIO1_C1" "$value" luckfox_set_pin_mark "GPIO1_C2" "$value" luckfox_set_pin_mark "GPIO1_C3" "$value" luckfox_set_pin_mark "GPIO2_B0" "$value" luckfox_fbtft_app 1 "sitronix,st7789v" else echo "FBTFT Not supported in this Luckfox-Pico Model!" fi elif [ "$value" == 0 ]; then if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then echo "Reset fbtft pins" #luckfox_fbtft_app 0 fi fi # SDMMC value=$(luckfox_get_pin_cfg "SDMMC_ENABLE") if [ -z "$value" ] && [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ] && [ "$LUCKFOX_CHIP_MEDIA" == "Luckfox Pico Plus" ]; then luckfox_set_pin_mark "GPIO3_A1" 1 luckfox_set_pin_mark "GPIO3_A3" 1 luckfox_set_pin_mark "GPIO3_A2" 1 luckfox_set_pin_mark "GPIO3_A4" 1 luckfox_set_pin_mark "GPIO3_A5" 1 luckfox_set_pin_mark "GPIO3_A7" 1 luckfox_set_pin_mark "GPIO3_A6" 1 elif [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "sdmmc" ] && [ "$LUCKFOX_CHIP_MEDIA" == "Luckfox Pico Plus" ]; then luckfox_set_pin_mark "GPIO3_A1" 1 luckfox_set_pin_mark "GPIO3_A3" 1 luckfox_set_pin_mark "GPIO3_A2" 1 luckfox_set_pin_mark "GPIO3_A4" 1 luckfox_set_pin_mark "GPIO3_A5" 1 luckfox_set_pin_mark "GPIO3_A7" 1 luckfox_set_pin_mark "GPIO3_A6" 1 else if [ -n "$value" ]; then luckfox_sdmmc_app "$value" fi fi # Create global variables by comparing cfg files for pin in "${multi_pins_group[@]}"; do # delete * if [[ "$pin" == "*"* ]]; then pin=$(echo "$pin" | sed 's/^.//') fi value=$(grep "${pin}_STATUS=" $LUCKFOX_CFG_FILE | cut -d '=' -f 2) # PWM if [[ "$pin" == *"PWM"* ]]; then pattern=".*PWM([0-9]+)_M([0-9]+).*" if [[ $pin =~ $pattern ]]; then pwm_main="${BASH_REMATCH[1]}" pwm_sub="${BASH_REMATCH[2]}" fi if [ -n "$value" ]; then luckfox_pwm_app "$value" "$pwm_main" "$pwm_sub" fi fi # UART if [[ "$pin" == *"UART"* ]]; then pattern=".*UART([0-9]+)_M([0-9]+).*" if [[ $pin =~ $pattern ]]; then uart_main="${BASH_REMATCH[1]}" uart_sub="${BASH_REMATCH[2]}" fi if [ -n "$value" ]; then luckfox_uart_app "$value" "$uart_main" "$uart_sub" fi fi # I2C if [[ "$pin" == *"I2C"* ]]; then pattern=".*I2C([0-9]+)_M([0-9]+).*" if [[ $pin =~ $pattern ]]; then i2c_main="${BASH_REMATCH[1]}" i2c_sub="${BASH_REMATCH[2]}" fi i2c_speed=$(grep "${pin}_SPEED=" "$LUCKFOX_CFG_FILE" | cut -d '=' -f 2) if [ -n "$value" ]; then luckfox_i2c_app "$value" "$i2c_main" "$i2c_sub" "$i2c_speed" fi fi # SPI if [[ "$pin" == *"SPI"* ]] && [[ "$(luckfox_get_pin_cfg "FBTFT_ENABLE")" != 1 ]]; then pattern=".*SPI([0-9]+)_M([0-9]+).*" if [[ $pin =~ $pattern ]]; then spi_main="${BASH_REMATCH[1]}" spi_sub="${BASH_REMATCH[2]}" fi spi_speed=$(luckfox_get_pin_cfg "${pin}_SPEED") spi_miso_enable=$(luckfox_get_pin_cfg "${pin}_MISO_ENABLE") spi_cs_enable=$(luckfox_get_pin_cfg "${pin}_CS_ENABLE") if [ -z "$spi_cs_enable" ]; then spi_cs_enable=1 luckfox_set_pin_cfg "${pin}_CS_ENABLE" 1 fi if [ -z "$spi_miso_enable" ]; then spi_miso_enable=1 luckfox_set_pin_cfg "${pin}_MODE" 1 fi if [ -n "$value" ]; then luckfox_spi_app "$value" "$spi_main" "$spi_sub" "$spi_cs_enable" "$spi_miso_enable" "$spi_speed" fi fi done } # ------------------- 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_PIN_DIAGRAM_FILE" fi } 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 } function luckfox_set_pin_mark() { local pin="$1" local action="$2" #if grep -o -q "*$pin" "$LUCKFOX_PIN_DIAGRAM_FILE" ; then # return #fi if [ "$action" == 1 ]; then pin=$(echo "$pin" | tr -d ' ') sed -i "s/ \($pin\)/\*\1/" $LUCKFOX_PIN_DIAGRAM_FILE elif [ "$action" == 0 ]; then if [[ "$pin" == \** ]]; then pin="${pin:1}" fi sed -i "s/\*\($pin\)/ \1/" $LUCKFOX_PIN_DIAGRAM_FILE fi } function luckfox_get_pin_cfg() { local setting="$1" value=$(grep "${setting}=" $LUCKFOX_CFG_FILE | cut -d '=' -f 2) echo "$value" } # ---------------------- APP ------------------------- # -- General -- function luckfox_sha256_convert() { local sha256_hash=$1 local formatted_hash="" for ((i = 0; i < ${#sha256_hash}; i += 8)); do formatted_hash+="0x${sha256_hash:$i:8} " done echo "$formatted_hash" } function luckfox_get_device_name() { local device_node="$1" local device_node_name device_node_name=$(grep "$device_node =" $LUCKFOX_FDT_DUMP_TXT | awk '{print $3}' | sed 's/["";]//g') echo "$device_node_name" } function luckfox_get_pinctrl_addr() { local pinctrl_node="$1" local search_num="$2" local phandle_value if [ -z "$search_num" ]; then search_num=3 fi phandle_value=$(grep -A "$search_num" "$pinctrl_node {" $LUCKFOX_FDT_DUMP_TXT | grep 'phandle' | awk '{print $3}' | sed 's/[<>;]//g') echo "$phandle_value" } function luckfox_get_pin_mode() { local input="$1" local reset_action="$2" local flag IFS=' ' read -r -a phandle_values <<<"$input" for phandle_value in "${phandle_values[@]}"; do pins_value=$(grep -B1 "phandle = <$phandle_value>" "$LUCKFOX_FDT_DUMP_TXT" | grep "rockchip,pins" | sed -e 's/^.*<\(.*\)>.*$/\1/') if [ -n "$pins_value" ]; then IFS=' ' read -r -a pins_array <<<"$pins_value" for ((i = 0; i < ${#pins_array[@]}; i += 4)); do gpio_bank_hex=${pins_array[i]} gpio_num_hex=${pins_array[i + 1]} gpio_mode_hex=${pins_array[i + 2]} gpio_bank=$((gpio_bank_hex)) gpio_num=$((gpio_num_hex)) gpio_mode=$((gpio_mode_hex)) current_gpio_mode_raw="$(iomux "$gpio_bank" "$gpio_num")" current_gpio_mode=$(echo "$current_gpio_mode_raw" | sed 's/.*= \([0-9]*\)/\1/') if [ "$gpio_mode" == "$current_gpio_mode" ]; then flag=1 fi done echo "$flag" return fi done } function luckfox_set_pin_mode() { #region local input="$1" local reset_action="$2" IFS=' ' read -r -a phandle_values <<<"$input" for phandle_value in "${phandle_values[@]}"; do pins_value=$(grep -B1 "phandle = <$phandle_value>" "$LUCKFOX_FDT_DUMP_TXT" | grep "rockchip,pins" | sed -e 's/^.*<\(.*\)>.*$/\1/') if [ -n "$pins_value" ]; then IFS=' ' read -r -a pins_array <<<"$pins_value" for ((i = 0; i < ${#pins_array[@]}; i += 4)); do gpio_bank_hex=${pins_array[i]} gpio_num_hex=${pins_array[i + 1]} gpio_mode_hex=${pins_array[i + 2]} gpio_bank=$((gpio_bank_hex)) gpio_num=$((gpio_num_hex)) gpio_mode=$((gpio_mode_hex)) if [ "$reset_action" == 1 ]; then iomux "$gpio_bank" "$gpio_num" 0 else iomux "$gpio_bank" "$gpio_num" "$gpio_mode" fi done else luckfox_result_handle $LF_NONE "phandle" fi done #endregion } # -- Dynamic Overlay -- function luckfox_dtbo_overlay() { local overlay_node="$1" local overlay_content="$2" if [ -z "$overlay_content" ]; then "overlay_content" fi echo "$overlay_content" >$LUCKFOX_DYNAMIC_DTS dtc -I dts -O dtb $LUCKFOX_DYNAMIC_DTS -o $LUCKFOX_DYNAMIC_DTBO if [ -d /sys/kernel/config/device-tree/overlays/"$overlay_node" ]; then echo 0 >/sys/kernel/config/device-tree/overlays/"$overlay_node"/status else mkdir -p /sys/kernel/config/device-tree/overlays/"$overlay_node" fi cat $LUCKFOX_DYNAMIC_DTBO >/sys/kernel/config/device-tree/overlays/"$overlay_node"/dtbo echo 1 >/sys/kernel/config/device-tree/overlays/"$overlay_node"/status # delete temp files #rm $LUCKFOX_DYNAMIC_DTS #rm $LUCKFOX_DYNAMIC_DTBO } # -- Static Overlay -- function luckfox_update_fdt() { # get fdt_header local origin_fdt_size_hex origin_fdt_size dd if=$LUCKFOX_CHIP_MEDIA of=$LUCKFOX_FDT_HDR_DTB bs=1 skip=0 count=2048 >/dev/null 2>&1 # get size if [ ! -f $LUCKFOX_FDT_HDR_DTB ]; then luckfox_result_handle $LF_NONE $LUCKFOX_FDT_HDR_DTB return fi origin_fdt_size_hex=$(fdtdump $LUCKFOX_FDT_HDR_DTB | grep -A 5 "fdt {" | grep "data-size" | awk '{print $3}' | tr -d ';<>') origin_fdt_size=$(printf "%d\n" "$origin_fdt_size_hex") # get fdt dtb dd if=$LUCKFOX_CHIP_MEDIA of=$LUCKFOX_FDT_DTB bs=1 skip=2048 count="$origin_fdt_size" >/dev/null 2>&1 # create fdt dump if [ ! -f $LUCKFOX_FDT_DTB ]; then luckfox_result_handle $LF_NONE $LUCKFOX_FDT_DTB return fi fdtdump $LUCKFOX_FDT_DTB >$LUCKFOX_FDT_DUMP_TXT } function luckfox_fdt_overlay() { #region local fdt_content="$1" local fdt_dtb_size fdt_size fdt_size_hex fdt_hash_data if [ -z "$fdt_content" ]; then luckfox_result_handle $LF_NONE "fdt_content" return fi echo "$fdt_content" >$LUCKFOX_FDT_OVERLAY_DTS # fdt overlay dtc -I dts -O dtb $LUCKFOX_FDT_OVERLAY_DTS -o $LUCKFOX_FDT_OVERLAY_DTBO if [ ! -f $LUCKFOX_FDT_OVERLAY_DTBO ]; then luckfox_result_handle $LF_NONE $LUCKFOX_FDT_OVERLAY_DTBO return fi fdtoverlay -i $LUCKFOX_FDT_DTB -o $LUCKFOX_FDT_DTB $LUCKFOX_FDT_OVERLAY_DTBO >/dev/null 2>&1 fdt_dtb_size=$(ls -la $LUCKFOX_FDT_DTB | awk '{print $5}') kernel_offset=$(fdtdump $LUCKFOX_FDT_HDR_DTB | grep -A 2 "kernel {" | grep "data-position" | sed -n 's/.*<\(0x[0-9a-fA-F]*\)>.*/\1/p') fdt_offset=$(fdtdump $LUCKFOX_FDT_HDR_DTB | grep -A 2 "fdt {" | grep "data-position" | sed -n 's/.*<\(0x[0-9a-fA-F]*\)>.*/\1/p') kernel_offset_dec=$((kernel_offset)) fdt_offset_dec=$((fdt_offset)) result_dec=$((kernel_offset_dec - fdt_offset_dec)) if [ $result_dec -lt "$fdt_dtb_size" ]; then luckfox_result_handle $LF_ERR "Kernel will be affected !" fi dd if=$LUCKFOX_FDT_DTB of=$LUCKFOX_CHIP_MEDIA bs=1 seek=2048 count="$fdt_dtb_size" >/dev/null 2>&1 # fdt header if [ ! -f $LUCKFOX_FDT_DTB ]; then luckfox_result_handle $LF_NONE $LUCKFOX_FDT_DTB return fi fdt_size=$(ls -la $LUCKFOX_FDT_DTB | awk '{print $5}') fdt_size_hex=$(printf "%x\n" "$fdt_size") fdt_hash_data=$(luckfox_sha256_convert "$(sha256sum $LUCKFOX_FDT_DTB | awk '{print $1}')") fdt_header_content=" /dts-v1/; /plugin/; &{/images/fdt}{ data-size=<0x$fdt_size_hex>; hash{ value=<$fdt_hash_data>; }; }; " echo "$fdt_header_content" >$LUCKFOX_FDT_HDR_OVERLAY_DTS dtc -I dts -O dtb $LUCKFOX_FDT_HDR_OVERLAY_DTS -o $LUCKFOX_FDT_HDR_OVERLAY_DTBO if [ ! -f $LUCKFOX_FDT_HDR_OVERLAY_DTBO ]; then luckfox_result_handle $LF_NONE $LUCKFOX_FDT_HDR_OVERLAY_DTBO return fi fdtoverlay -i $LUCKFOX_FDT_HDR_DTB -o $LUCKFOX_FDT_HDR_DTB $LUCKFOX_FDT_HDR_OVERLAY_DTBO >/dev/null 2>&1 dd if=$LUCKFOX_FDT_HDR_DTB of=$LUCKFOX_CHIP_MEDIA bs=1 seek=0 count=2048 >/dev/null 2>&1 #endregion } function luckfox_fdt_clear() { # delete temp file local files=( "$LUCKFOX_FDT_DUMP_TXT" "$LUCKFOX_FDT_DTB" "$LUCKFOX_FDT_OVERLAY_DTS" "$LUCKFOX_FDT_OVERLAY_DTBO" "$LUCKFOX_FDT_HDR_DTB" "$LUCKFOX_FDT_HDR_OVERLAY_DTS" "$LUCKFOX_FDT_HDR_OVERLAY_DTBO" ) for file in "${files[@]}"; do if [ -e "$file" ]; then rm "$file" fi done } # -- Time Setting -- function luckfox_timezone_settings() { dialog --msgbox "Developing" 10 30 } function luckfox_time_synchronization() { dialog --msgbox "Developing" 10 30 } # -- Compatible Devices -- function luckfox_compatible_Pico_LCD() { #region local action="$1" local spi_device_name spi_pinctrl_addr spi_action if [ "$action" == 1 ]; then luckfox_pwm_app 0 11 1 luckfox_pwm_app 0 10 1 luckfox_pwm_app 0 0 0 luckfox_pwm_app 0 2 2 luckfox_pwm_app 0 4 2 luckfox_pwm_app 0 5 2 luckfox_pwm_app 0 6 2 luckfox_pwm_app 0 1 0 luckfox_pwm_app 0 10 2 luckfox_uart_app 0 3 1 if [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "sdmmc" ] && [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_result_handle $LF_ERR "The sdmmc system cannot drive the LCD" elif [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ] && [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_sdmmc_app 0 luckfox_pwm_app 0 9 0 luckfox_pwm_app 0 11 0 luckfox_uart_app 0 5 0 luckfox_spi_app 1 0 0 1 0 luckfox_gpio_app 1 c 6 up luckfox_gpio_app 1 c 7 up luckfox_gpio_app 1 d 1 up luckfox_gpio_app 3 a 6 up luckfox_gpio_app 3 a 7 up luckfox_gpio_app 3 a 5 up luckfox_gpio_app 3 a 2 up elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_uart_app 0 1 1 luckfox_i2c_app 0 4 0 luckfox_spi_app 1 0 0 1 0 luckfox_gpio_app 1 c 6 up luckfox_gpio_app 1 c 7 up luckfox_gpio_app 1 d 1 up luckfox_gpio_app 2 a 4 up luckfox_gpio_app 2 a 5 up luckfox_gpio_app 2 a 0 up luckfox_gpio_app 2 a 2 up elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then luckfox_spi_app 1 0 0 1 0 luckfox_gpio_app 1 c 6 up luckfox_gpio_app 1 c 7 up luckfox_gpio_app 1 d 1 up luckfox_gpio_app 4 b 1 up luckfox_gpio_app 4 b 0 up luckfox_gpio_app 4 a 6 up luckfox_gpio_app 4 a 3 up else luckfox_result_handle $LF_ERR "The "$LUCKFOX_CHIP_MODEL" does not support this compatible device" fi fi #endregion } function luckfox_compatible_Pico_ePaper() { #region local action="$1" local spi_device_name spi_pinctrl_addr spi_action if [ "$action" == 1 ]; then luckfox_pwm_app 0 0 0 luckfox_pwm_app 0 2 2 luckfox_pwm_app 0 4 2 luckfox_pwm_app 0 5 2 luckfox_pwm_app 0 6 2 luckfox_pwm_app 0 1 0 luckfox_spi_app 1 0 0 1 0 fi #endregion } function luckfox_compatible_Pico-UPS-B() { #region local action="$1" if [ "$action" == 1 ]; then luckfox_pwm_app 0 0 1 luckfox_pwm_app 0 11 2 luckfox_i2c_app 1 3 1 1000000 fi #endregion } function luckfox_compatible_Pico_ResTouch_LCD() { local action="$1" local spi_device_name spi_pinctrl_addr spi_action if [ "$action" == 1 ]; then luckfox_pwm_app 0 8 1 luckfox_pwm_app 0 0 0 luckfox_pwm_app 0 2 2 luckfox_pwm_app 0 1 0 luckfox_pwm_app 0 10 2 luckfox_uart_app 0 3 1 luckfox_uart_app 0 4 1 luckfox_spi_app 1 0 0 0 1 if [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "sdmmc" ] && [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_result_handle $LF_ERR "The sdmmc system cannot drive the use of SD cards and touch functions!" elif [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ] && [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_sdmmc_app 0 luckfox_uart_app 0 5 0 luckfox_i2c_app 0 0 2 luckfox_result_handle $LF_OK elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_uart_app 0 1 1 luckfox_i2c_app 0 4 0 luckfox_i2c_app 0 3 0 luckfox_result_handle $LF_OK else luckfox_result_handle $LF_ERR "The "$LUCKFOX_CHIP_MODEL" does not support this compatible device" fi fi } function luckfox_compatible_OLED_Module() { local action="$1" if [ "$action" == 1 ]; then luckfox_pwm_app 0 11 1 luckfox_pwm_app 0 10 1 luckfox_pwm_app 0 8 1 luckfox_pwm_app 0 0 1 luckfox_pwm_app 0 11 2 luckfox_pwm_app 0 4 2 luckfox_pwm_app 0 5 2 luckfox_uart_app 0 4 1 luckfox_spi_app 1 0 0 0 0 luckfox_i2c_app 1 3 1 fi } function luckfox_compatible_Pico_OLED() { local action="$1" if [ "$action" == 1 ]; then luckfox_uart_app 0 3 1 luckfox_pwm_app 0 0 0 luckfox_pwm_app 0 0 1 luckfox_pwm_app 0 11 2 luckfox_spi_app 1 0 0 0 0 luckfox_i2c_app 1 3 1 if [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "sdmmc" ] && [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_result_handle $LF_ERR "The sdmmc system cannot drive the key1 " elif [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ] && [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_sdmmc_app 0 luckfox_uart_app 0 5 0 luckfox_gpio_app 1 d 1 up luckfox_gpio_app 3 a 7 up elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_uart_app 0 1 1 luckfox_gpio_app 1 d 1 up luckfox_gpio_app 2 a 5 up elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then luckfox_gpio_app 1 d 1 up luckfox_gpio_app 4 b 0 up else luckfox_result_handle $LF_ERR "The "$LUCKFOX_CHIP_MODEL" does not support this compatible device" fi fi } function luckfox_compatible_DHT11() { #region local action="$1" local dht11_action if [ "$action" == 1 ]; then # disable pwm luckfox_pwm_app 0 11 1 dht11_action=okay else dht11_action=disabled fi local dtbo_content=" /dts-v1/; /plugin/; &{/dht11_sensor}{ status=\"$dht11_action\"; }; " luckfox_dtbo_overlay "dht11" "$dtbo_content" #endregion } function luckfox_compatible_app() { local compatible_device="$1" local action="$2" local device local compatible_group=() # Set up an inventory of adaptable hardware if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then compatible_group=(Pico_LCD Pico_ePaper Pico_UPS_B OLED_Module Pico_OLED DHT11) elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] && [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "sdmmc" ]; then compatible_group=(Pico_ePaper Pico_UPS_B OLED_Module DHT11) elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] && [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ]; then compatible_group=(Pico_LCD Pico_ePaper Pico_UPS_B Pico_ResTouch_LCD OLED_Module Pico_OLED DHT11) elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then compatible_group=(Pico_LCD Pico_ePaper Pico_UPS_B Pico_ResTouch_LCD OLED_Module Pico_OLED DHT11) fi for device in "${compatible_group[@]}"; do if [ "$device" == "$compatible_device" ]; then luckfox_compatible_"${compatible_device}" "$action" return fi done luckfox_result_handle "$LF_ERR" "This compatible device $compatible_device is not supported!" } # -- Advanced Options -- function hex_add() { local hex1=$1 local hex2=$2 local dec1=$(printf "%d" 0x"$hex1") local dec2=$(printf "%d" 0x"$hex2") local sum_hex=$(printf "%X" $((dec1 + dec2))) echo "$sum_hex" } 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 } function luckfox_gpio_app() { local gpio_bank="$1" local gpio_group="$2" local gpio_number="$3" local gpio_pull_mode="$4" local reg_addr_base reg_addr data PULL_MODE_DATE_NORMAL=30000 PULL_MODE_DATE_UP=30001 PULL_MODE_DATE_DOWN=30002 # GPIO Bank RV1106_GPIO0=ff388038 RV1106_GPIO1=ff5381C0 RV1106_GPIO2=ff5481D0 RV1106_GPIO3=ff5581E0 RV1106_GPIO4=ff568070 #Group A_OFFSET=0 B_OFFSET=4 C_OFFSET=8 D_OFFSET=c case $gpio_bank in 0) reg_addr_base="$RV1106_GPIO0" ;; 1) reg_addr_base="$RV1106_GPIO1" ;; 2) reg_addr_base="$RV1106_GPIO2" ;; 3) reg_addr_base="$RV1106_GPIO3" ;; 4) reg_addr_base="$RV1106_GPIO4" ;; *) echo "input error!" exit ;; esac case $gpio_group in a) reg_addr=0x$(hex_add $reg_addr_base $A_OFFSET) ;; b) reg_addr=0x$(hex_add $reg_addr_base $B_OFFSET) ;; c) reg_addr=0x$(hex_add $reg_addr_base $C_OFFSET) ;; d) reg_addr=0x$(hex_add $reg_addr_base $D_OFFSET) ;; *) echo "input error!" exit ;; esac case $gpio_pull_mode in normal) data=0x$(hex_shift $PULL_MODE_DATE_NORMAL "$gpio_number") ;; up) data=0x$(hex_shift $PULL_MODE_DATE_UP "$gpio_number") ;; down) data=0x$(hex_shift $PULL_MODE_DATE_DOWN "$gpio_number") ;; *) echo "input error!" exit ;; esac io -4 "$reg_addr" "$data" } function luckfox_pwm_app() { #region local action="$1" local pwm_main="$2" local pwm_sub="$3" local pwm_device_name pwm_pinctrl_addr pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "pwm${pwm_main}m${pwm_sub}-pins")") # status if [ "$action" == 1 ]; then local pwm_action=okay luckfox_check_pin_diagram "PWM${pwm_main}_M${pwm_sub}" pwm_pinctrl_addr=$(luckfox_get_pinctrl_addr "pwm${pwm_main}m${pwm_sub}-pins") else local pwm_action=disabled pwm_pinctrl_addr="" fi luckfox_set_pin_mark "PWM${pwm_main}_M${pwm_sub}" "$action" # device addr pwm_device_name=$(luckfox_get_device_name "pwm${pwm_main}") local dtbo_content=" /dts-v1/; /plugin/; &{$pwm_device_name}{ pinctrl-0=<$pwm_pinctrl_addr>; status=\"$pwm_action\"; }; " # dtb overlay luckfox_dtbo_overlay "pwm${pwm_main}m${pwm_sub}" "$dtbo_content" if [ "$action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "pwm${pwm_main}m${pwm_sub}-pins")" 0 elif [ "$action" == 0 ] && [ "$pre_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "pwm${pwm_main}m${pwm_sub}-pins")" 1 fi # update cfg luckfox_set_pin_cfg "PWM${pwm_main}_M${pwm_sub}_STATUS" "$action" #endregion } function luckfox_check_uart() { #region local uart_mode="$1" local uart_main="$2" # Set UART1 in Luckfox Pico Ultra W if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then if [ "$uart_mode" == 0 ] && [ "$uart_main" == 1 ]; then luckfox_result_handle "$LF_ERR" "BlueTooth is enable,Can't enable UART1" fi fi #endregion } function luckfox_uart_app() { #region local action="$1" local uart_main="$2" local uart_sub="$3" local uart_device_name uart_pinctrl_addr local pre_action pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "uart${uart_main}m${uart_sub}-xfer")") # status if [ "$action" == 1 ]; then local uart_action=okay luckfox_check_pin_diagram "UART${uart_main}_M${uart_sub}_TX" "UART${uart_main}_M${uart_sub}_RX" luckfox_check_uart 0 "$uart_main" uart_pinctrl_addr=$(luckfox_get_pinctrl_addr "uart${uart_main}m${uart_sub}-xfer") else local uart_action=disabled uart_pinctrl_addr="" fi luckfox_set_pin_mark "UART${uart_main}_M${uart_sub}_TX" "$action" luckfox_set_pin_mark "UART${uart_main}_M${uart_sub}_RX" "$action" # device addr uart_device_name=$(luckfox_get_device_name "serial${uart_main}") local dtbo_content=" /dts-v1/; /plugin/; &{$uart_device_name}{ pinctrl-0=<$uart_pinctrl_addr>; status=\"$uart_action\"; }; " # dtb overlay luckfox_dtbo_overlay "uart${uart_main}m${uart_sub}" "$dtbo_content" if [ "$action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "uart${uart_main}m${uart_sub}-xfer")" 0 elif [ "$action" == 0 ] && [ "$pre_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "uart${uart_main}m${uart_sub}-xfer")" 1 fi if [ -f "/dev/ttyS${uart_main}" ]; then rm /dev/ttyS"${uart_main}" fi # update cfg luckfox_set_pin_cfg "UART${uart_main}_M${uart_sub}_STATUS" "$action" #endregion } function luckfox_check_i2c() { #region local i2c_mode="$1" local i2c_main="$2" local ts_status # Set GPIO if [ "$i2c_mode" == 0 ]; then #check TP status if [ "$i2c_main" == 3 ]; then if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then ts_status=$(luckfox_get_pin_cfg "TS_ENABLE") if [ "$ts_status" == 1 ]; then luckfox_result_handle "$LF_ERR" "TouchScreen is enable,Can't config I2C3" else local dtbo_content=" /dts-v1/; /plugin/; &{/i2c@ff460000/touchscreen}{ status=\"disabled\"; }; " luckfox_dtbo_overlay "TouchScreen_I2C" "$dtbo_content" fi fi fi #check CSI status if [ "$i2c_main" == 4 ]; then csi_status=$(luckfox_get_pin_cfg "CSI_ENABLE") if [ "$csi_status" == 1 ]; then luckfox_result_handle "$LF_ERR" "CSI is enable,Can't config I2C4" fi fi # Set CSI or TS elif [ "$i2c_mode" == 1 ]; then # Enable TS if [ "$i2c_main" == 3 ]; then if [ "$(luckfox_get_pin_cfg "I2C3_M0_STATUS")" == 1 ] || [ "$(luckfox_get_pin_cfg "I2C3_M1_STATUS")" == 1 ] || [ "$(luckfox_get_pin_cfg "I2C3_M2_STATUS")" == 1 ]; then luckfox_result_handle "$LF_ERR" "I2C3 is enable,Can't config TouchScreen" fi fi # Enable CSI if [ "$i2c_main" == 4 ]; then if [ "$(luckfox_get_pin_cfg "I2C4_M0_STATUS")" == 1 ] || [ "$(luckfox_get_pin_cfg "I2C4_M1_STATUS")" == 1 ] || [ "$(luckfox_get_pin_cfg "I2C4_M2_STATUS")" == 1 ]; then luckfox_result_handle "$LF_ERR" "I2C4 is enable,Can't config CSI" fi fi fi #endregion } function luckfox_i2c_app() { #region local action="$1" local i2c_main="$2" local i2c_sub="$3" local i2c_speed #check luckfox_check_i2c 0 "$i2c_main" if [ -z "$4" ]; then i2c_speed=5000000 else i2c_speed="$4" fi local i2c_device_name i2c_pinctrl_addr local pre_action pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "i2c${i2c_main}m${i2c_sub}-xfer")") # status if [ "$action" == 1 ]; then luckfox_check_pin_diagram "I2C${i2c_main}_M${i2c_sub}_SDA" "I2C${i2c_main}_M${i2c_sub}_SCL" i2c_pinctrl_addr=$(luckfox_get_pinctrl_addr "i2c${i2c_main}m${i2c_sub}-xfer") local i2c_action=okay else i2c_pinctrl_addr="" local i2c_action=disabled fi # device addr i2c_device_name=$(luckfox_get_device_name "i2c${i2c_main}") local dtbo_content=" /dts-v1/; /plugin/; &{$i2c_device_name}{ status=\"$i2c_action\"; clock-frequency = <$i2c_speed>; pinctrl-0 = <$i2c_pinctrl_addr>; }; " # dtb overlay luckfox_dtbo_overlay "i2c${i2c_main}m${i2c_sub}" "$dtbo_content" if [ "$action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "i2c${i2c_main}m${i2c_sub}-xfer")" 0 elif [ "$action" == 0 ] && [ "$pre_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "i2c${i2c_main}m${i2c_sub}-xfer")" 1 fi # update cfg luckfox_set_pin_cfg "I2C${i2c_main}_M${i2c_sub}_STATUS" "$action" luckfox_set_pin_cfg "I2C${i2c_main}_M${i2c_sub}_SPEED" "$i2c_speed" luckfox_set_pin_parameter "I2C${i2c_main}_M${i2c_sub}_SPEED" "$i2c_speed" # mark luckfox_set_pin_mark "I2C${i2c_main}_M${i2c_sub}_SDA" "$action" luckfox_set_pin_mark "I2C${i2c_main}_M${i2c_sub}_SCL" "$action" #endregion } function luckfox_check_spi() { #region local spi_mode="$1" local spi_main="$2" # Set GPIO if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then fbtft_status=$(luckfox_get_pin_cfg "FBTFT_ENABLE") spi0m0_status=$(luckfox_get_pin_cfg "SPI0_M0_STATUS") if [ "$spi_mode" == 0 ] && [ "$spi_main" == 0 ]; then if [ "$fbtft_status" == 1 ]; then luckfox_result_handle "$LF_ERR" "FBTFT is enable,Can't config SPI0" else local dtbo_content=" /dts-v1/; /plugin/; &{/spi@ff500000/fbtft@0}{ status=\"disabled\"; }; " luckfox_dtbo_overlay "FBTFT_SPI" "$dtbo_content" fi # Set FBTFT elif [ "$spi_mode" == 1 ] && [ "$spi_main" == 0 ]; then if [ "$spi0m0_status" == 1 ]; then luckfox_result_handle "$LF_ERR" "SPI0M0 is enable,Can't config FBTFT" fi fi fi #endregion } function luckfox_spi_app() { #region local action="$1" local spi_main="$2" local spi_sub="$3" local cs_action="$4" local miso_action="$5" local spi_speed if [ -z "$6" ]; then spi_speed=50000000 else spi_speed="$6" fi luckfox_check_spi 0 "$spi_main" local spi_device_name local spi_pinctrl_addr="" # Prevent being repeatedly disabled local pre_action pre_miso_action pre_cs_action pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk")") pre_miso_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")") pre_cs_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0")") # set cfg if [ "$action" == 1 ]; then # check if [ "$cs_action" == 1 ]; then luckfox_check_pin_diagram "SPI${spi_main}_M${spi_sub}_CS0" fi if [ "$miso_action" == 1 ]; then luckfox_check_pin_diagram "SPI${spi_main}_M${spi_sub}_MISO" fi luckfox_check_pin_diagram "SPI${spi_main}_M${spi_sub}_MOSI" luckfox_check_pin_diagram "SPI${spi_main}_M${spi_sub}_CLK" # phandle spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk") spi_pinctrl_addr+=" " spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-mosi") if [ "$cs_action" == 1 ]; then spi_pinctrl_addr+=" " spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0") fi if [ "$miso_action" == 1 ]; then spi_pinctrl_addr+=" " spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso") fi # status local spi_action=okay elif [ "$action" == 0 ]; then # status local spi_action=disabled fi # create dtc spi_device_name=$(luckfox_get_device_name "spi${spi_main}") if [ "$action" == 1 ]; then dtbo_content=" /dts-v1/; /plugin/; &{$spi_device_name}{ status=\"$spi_action\"; pinctrl-0 = <$spi_pinctrl_addr>; }; &{$spi_device_name/spidev@0}{ status=\"$spi_action\"; spi-max-frequency = <$spi_speed>; }; " elif [ "$action" == 0 ]; then dtbo_content=" /dts-v1/; /plugin/; &{$spi_device_name}{ status=\"$spi_action\"; }; &{$spi_device_name/spidev@0}{ status=\"$spi_action\"; }; " fi # dtb overlay luckfox_dtbo_overlay spi"${spi_main}"m"${spi_sub}" "$dtbo_content" # update pin fun if [ "$action" == 1 ]; then if [ "$pre_miso_action" == 1 ] && [ "$miso_action" == 0 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")" 1 elif [ "$miso_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")" 0 fi if [ "$pre_cs_action" == 1 ] && [ "$cs_action" == 0 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0")" 1 elif [ "$cs_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0")" 0 fi luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk")" 0 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-mosi")" 0 elif [ "$action" == 0 ]; then if [ "$pre_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk")" 1 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-mosi")" 1 fi if [ "$pre_miso_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")" 1 fi if [ "$pre_cs_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0")" 1 fi fi # update cfg show cfg in " luckfox-config show " luckfox_set_pin_cfg "SPI${spi_main}_M${spi_sub}_STATUS" "$action" luckfox_set_pin_cfg "SPI${spi_main}_M${spi_sub}_CS_ENABLE" "$cs_action" luckfox_set_pin_cfg "SPI${spi_main}_M${spi_sub}_MISO_ENABLE" "$miso_action" luckfox_set_pin_cfg "SPI${spi_main}_M${spi_sub}_SPEED" "$spi_speed" luckfox_set_pin_parameter "SPI${spi_main}_M${spi_sub}_SPEED" "$spi_speed" # mark if [ "$cs_action" == 1 ] && [ "$action" == 1 ]; then luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_CS0" "$action" else luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_CS0" 0 fi if [ "$miso_action" == 1 ] && [ "$action" == 1 ]; then luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_MISO" "$action" else luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_MISO" 0 fi luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_CLK" "$action" luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_MOSI" "$action" #endregion } function luckfox_usb_app() { #region local usb_mode="$1" # update fdt luckfox_update_fdt # fdt overlay content local fdt_content=" /dts-v1/; /plugin/; &{/usbdrd/usb@ffb00000}{ dr_mode =\"${usb_mode}\"; }; " # fdt overlay luckfox_fdt_overlay "$fdt_content" # update cfg luckfox_set_pin_cfg "USB_MODE" "$usb_mode" #endregion } function luckfox_csi_app() { #region local action="$1" # update fdt luckfox_update_fdt local i2c_pinctrl_addr # create fdt overlay content if [ "$action" == 1 ]; then luckfox_check_i2c 1 4 i2c_pinctrl_addr=$(luckfox_get_pinctrl_addr "i2c4m2-xfer") local csi_action=okay else local csi_action=disbaled fi if [ "$action" == 1 ]; then local i2c_content=" /dts-v1/; /plugin/; &{/i2c@ff470000}{ status=\"$csi_action\"; pinctrl-0 = <$i2c_pinctrl_addr>; }; " else local i2c_content=" /dts-v1/; /plugin/; &{/i2c@ff470000}{ status=\"$csi_action\"; }; " fi # fdt overlay luckfox_fdt_overlay "$i2c_content" # update cfg luckfox_set_pin_cfg "CSI_ENABLE" "$action" luckfox_set_pin_parameter "CSI_ENABLE" "$action" luckfox_set_pin_mark "I2C4_M0_SCL" 0 luckfox_set_pin_mark "I2C4_M0_SDA" 0 luckfox_set_pin_mark "I2C4_M1_SCL" 0 luckfox_set_pin_mark "I2C4_M1_SDA" 0 #endregion } function luckfox_rgb_check_params() { local params=("$@") for param in "${params[@]}"; do if [[ -z "$param" ]]; then echo "Error: Parameter is empty." return 1 fi if ! [[ "$param" =~ ^[0-9]+$ ]]; then echo "Error: Parameter '$param' is not a number." return 1 fi done } function luckfox_rgb_app() { #region local action="$1" local rgb_mode="$2" local rgb_clk="$3" local rgb_h="$4" local rgb_v="$5" local rgb_hb="$6" local rgb_hf="$7" local rgb_vb="$8" local rgb_vf="$9" local rgb_h_len="${10}" local rgb_v_len="${11}" local rgb_h_active="${12}" local rgb_v_active="${13}" local rgb_de_active="${14}" local rgb_pclk_active="${15}" local gpio0_phandle reset_gpio_action enable_gpio_action local pre_action pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "lcd-pins")") # create fdt overlay content if [ "$action" == 1 ]; then if [ "$rgb_mode" == "reset" ]; then reset_gpio_action=okay enable_gpio_action=disabled elif [ "$rgb_mode" == "enable" ]; then reset_gpio_action=disabled enable_gpio_action=okay else luckfox_result_handle $LF_ERR "Wrong rgb_mode!" return 1 fi luckfox_rgb_check_params "$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" if [[ $? -ne 0 ]]; then luckfox_result_handle $LF_ERR "Wrong rgb_params!" return 1 else # decimal to hex rgb_clk_hex=$(printf '0x%x\n' "$rgb_clk") rgb_h_hex=$(printf '0x%x\n' "$rgb_h") rgb_v_hex=$(printf '0x%x\n' "$rgb_v") rgb_hb_hex=$(printf '0x%x\n' "$rgb_hb") rgb_hf_hex=$(printf '0x%x\n' "$rgb_hf") rgb_vb_hex=$(printf '0x%x\n' "$rgb_vb") rgb_vf_hex=$(printf '0x%x\n' "$rgb_vf") rgb_h_len_hex=$(printf '0x%x\n' "$rgb_h_len") rgb_v_len_hex=$(printf '0x%x\n' "$rgb_v_len") rgb_h_active_hex=$(printf '0x%x\n' "$rgb_h_active") rgb_v_active_hex=$(printf '0x%x\n' "$rgb_v_active") rgb_de_active_hex=$(printf '0x%x\n' "$rgb_de_active") rgb_pclk_active_hex=$(printf '0x%x\n' "$rgb_pclk_active") fi luckfox_check_pin_diagram "GPIO1_D0" "GPIO1_D1" "GPIO1_C2" "GPIO1_C3" "GPIO1_C1" \ "GPIO1_C6" "GPIO2_A7" "GPIO2_A6" "GPIO1_D3" "GPIO1_C0" "GPIO1_D2" \ "GPIO1_C7" "GPIO2_B0" "GPIO2_B1" \ "GPIO1_C4" "GPIO1_C5" "GPIO2_A1" "GPIO2_A0" "GPIO2_A5" "GPIO2_A4" "GPIO2_A2" "GPIO2_A3" if [ "$rgb_h" -gt 640 ] || [ "$rgb_h" -gt 640 ]; then local cma_action=okay else local cma_action=disabled fi local rgb_action=okay else local rgb_action=disabled local cma_action=disabled fi # create fdt_content local fdt_content=" /dts-v1/; /plugin/; &{/syscon@ff000000/rgb}{ status=\"$rgb_action\"; }; &{/panel}{ status=\"$rgb_action\"; }; &{/reserved-memory/linux,cma}{ status=\"$cma_action\"; }; " # Get GPIO0 phandle #gpio0_phandle=$(luckfox_get_pinctrl_addr "gpio@ff380000" 11) local lcd_time_content=" /dts-v1/; /plugin/; &{/panel/display-timings/timing0}{ clock-frequency = <$rgb_clk_hex>; hactive = <$rgb_h_hex>; vactive = <$rgb_v_hex>; hback-porch = <$rgb_hb_hex>; hfront-porch = <$rgb_hf_hex>; vback-porch = <$rgb_vb_hex>; vfront-porch = <$rgb_vf_hex>; hsync-len = <$rgb_h_len_hex>; vsync-len = <$rgb_v_len_hex>; hsync-active = <$rgb_h_active_hex>; vsync-active = <$rgb_v_active_hex>; de-active = <$rgb_de_active_hex>; pixelclk-active = <$rgb_pclk_active_hex>; }; " # fdt overlay luckfox_fdt_overlay "$fdt_content" if [ "$action" == 1 ]; then luckfox_fdt_overlay "$lcd_time_content" elif [ "$action" == 0 ] && [ "$pre_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "lcd-pins")" 1 fi # update cfg luckfox_set_pin_cfg "RGB_ENABLE" "$action" if [ "$action" == 1 ]; then luckfox_set_pin_cfg "RGB_MODE" "$rgb_mode" luckfox_set_pin_cfg "RGB_CLK" "$rgb_clk" luckfox_set_pin_cfg "RGB_HACTIVE" "$rgb_h" luckfox_set_pin_cfg "RGB_VACTIVE" "$rgb_v" luckfox_set_pin_cfg "RGB_HBACKPORCH" "$rgb_hb" luckfox_set_pin_cfg "RGB_HFRONTPORCH" "$rgb_hf" luckfox_set_pin_cfg "RGB_VBACKPORCH" "$rgb_vb" luckfox_set_pin_cfg "RGB_VFRONTPORCH" "$rgb_vf" luckfox_set_pin_cfg "RGB_HSYNC_LEN" "$rgb_h_len" luckfox_set_pin_cfg "RGB_VSYNC_LEN" "$rgb_v_len" luckfox_set_pin_cfg "RGB_HSYNC_ACTIVE" "$rgb_h_active" luckfox_set_pin_cfg "RGB_VSYNC_ACTIVE" "$rgb_v_active" luckfox_set_pin_cfg "RGB_DE_ACTIVE" "$rgb_de_active" luckfox_set_pin_cfg "RGB_PCLK_ACTIVE" "$rgb_pclk_active" luckfox_set_pin_parameter "RGB_MODE" "$rgb_mode" luckfox_set_pin_parameter "RGB_CLK" "$rgb_clk" luckfox_set_pin_parameter "RGB_HACTIVE" "$rgb_h" luckfox_set_pin_parameter "RGB_VACTIVE" "$rgb_v" luckfox_set_pin_parameter "RGB_HBACKPORCH" "$rgb_hb" luckfox_set_pin_parameter "RGB_HFRONTPORCH" "$rgb_hf" luckfox_set_pin_parameter "RGB_VBACKPORCH" "$rgb_vb" luckfox_set_pin_parameter "RGB_VFRONTPORCH" "$rgb_vf" luckfox_set_pin_parameter "RGB_HSYNC_LEN" "$rgb_h_len" luckfox_set_pin_parameter "RGB_VSYNC_LEN" "$rgb_v_len" luckfox_set_pin_parameter "RGB_HSYNC_ACTIVE" "$rgb_h_active" luckfox_set_pin_parameter "RGB_VSYNC_ACTIVE" "$rgb_v_active" luckfox_set_pin_parameter "RGB_DE_ACTIVE" "$rgb_de_active" luckfox_set_pin_parameter "RGB_PCLK_ACTIVE" "$rgb_pclk_active" fi luckfox_set_pin_parameter "RGB_ENABLE" "$action" # set pins mark luckfox_set_pin_mark "GPIO1_D0" "$action" luckfox_set_pin_mark "GPIO1_D1" "$action" luckfox_set_pin_mark "GPIO1_C2" "$action" luckfox_set_pin_mark "GPIO1_C3" "$action" luckfox_set_pin_mark "GPIO1_C1" "$action" luckfox_set_pin_mark "GPIO1_C6" "$action" luckfox_set_pin_mark "GPIO2_A7" "$action" luckfox_set_pin_mark "GPIO2_A6" "$action" luckfox_set_pin_mark "GPIO1_D3" "$action" luckfox_set_pin_mark "GPIO1_C0" "$action" luckfox_set_pin_mark "GPIO1_D2" "$action" luckfox_set_pin_mark "GPIO1_C7" "$action" luckfox_set_pin_mark "GPIO2_B0" "$action" luckfox_set_pin_mark "GPIO2_B1" "$action" luckfox_set_pin_mark "GPIO1_C4" "$action" luckfox_set_pin_mark "GPIO1_C5" "$action" luckfox_set_pin_mark "GPIO2_A1" "$action" luckfox_set_pin_mark "GPIO2_A0" "$action" luckfox_set_pin_mark "GPIO2_A5" "$action" luckfox_set_pin_mark "GPIO2_A4" "$action" luckfox_set_pin_mark "GPIO2_A2" "$action" luckfox_set_pin_mark "GPIO2_A3" "$action" #endregion } function luckfox_ts_app() { #region local action="$1" local ts_reg_hex="$2" luckfox_check_i2c 1 3 # update fdt luckfox_update_fdt #ts_reg_hex=$(printf '0x%x\n' "$ts_reg") local i2c_pinctrl_addr tp_action tp_rst_pinctrl_addr tp_irq_pinctrl_addr # create fdt overlay content if [ "$action" == 1 ]; then i2c_pinctrl_addr=$(luckfox_get_pinctrl_addr "i2c3m2-xfer") tp_rst_pinctrl_addr=$(luckfox_get_pinctrl_addr "tp-rst") tp_irq_pinctrl_addr=$(luckfox_get_pinctrl_addr "tp-irq") local ts_action=okay else local ts_action=disbaled fi # TouchScreen device tree overlay # Just support GT911 now # I2C device tree overlay if [ "$action" == 1 ]; then local fdt_content=" /dts-v1/; /plugin/; &{/i2c@ff460000}{ status=\"$ts_action\"; pinctrl-0 = <$i2c_pinctrl_addr $tp_irq_pinctrl_addr $tp_rst_pinctrl_addr>; }; &{/i2c@ff460000/touchscreen}{ status=\"$ts_action\"; reg=<$ts_reg_hex>; }; " elif [ "$action" == 0 ]; then local fdt_content=" /dts-v1/; /plugin/; &{/i2c@ff460000}{ status=\"$ts_action\"; }; &{/i2c@ff460000/touchscreen}{ status=\"$ts_action\"; }; " fi # fdt overlay luckfox_fdt_overlay "$fdt_content" # update cfg luckfox_set_pin_cfg "TS_ENABLE" "$action" luckfox_set_pin_parameter "TS_ENABLE" "$action" #endregion } function luckfox_fbtft_app() { #region local action="$1" local fbtft_compatible="$2" local spi_device_name local spi_main=0 local spi_sub=0 local pre_action pre_cs_action pre_miso_action # check luckfox_check_spi 1 0 pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk")") pre_miso_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")") pre_cs_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0")") #ts_reg_hex=$(printf '0x%x\n' "$ts_reg") if [ "$action" == 1 ]; then if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then luckfox_check_pin_diagram "GPIO1_A2" "GPIO1_C0" "GPIO1_C1" "GPIO1_C2" "GPIO1_C3" "GPIO0_A4" elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_check_pin_diagram "GPIO2_B1" "GPIO1_C0" "GPIO1_C1" "GPIO1_C2" "GPIO1_C3" "GPIO2_B0" else luckfox_result_handle "$LF_ERR" "This Luckfox-Pico Model does not support FBTFT setting!" return fi spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi0m0-clk") spi_pinctrl_addr+=" " spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi0m0-mosi") spi_pinctrl_addr+=" " spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi0m0-cs0") local fbtft_action=okay elif [ "$action" == 0 ]; then local fbtft_action=disabled fi spi_device_name=$(luckfox_get_device_name "spi0") if [ "$action" == 1 ]; then local fdt_content=" /dts-v1/; /plugin/; &{$spi_device_name}{ status=\"$fbtft_action\"; pinctrl-0 = <$spi_pinctrl_addr>; }; &{$spi_device_name/fbtft@0}{ status=\"$fbtft_action\"; compatible=\"$fbtft_compatible\"; }; &{$spi_device_name/spidev@0}{ status=\"disabled\"; }; " elif [ "$action" == 0 ]; then local fdt_content=" /dts-v1/; /plugin/; &{$spi_device_name}{ status=\"$fbtft_action\"; }; &{$spi_device_name/fbtft@0}{ status=\"$fbtft_action\"; }; " fi # fdt overlay # luckfox_fdt_overlay "$fdt_content luckfox_dtbo_overlay "FBTFT" "$fdt_content" # update pin fun fbtft: miso_action = 0 cs_action = 1 if [ "$action" == 1 ]; then if [ "$pre_miso_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")" 1 fi luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0")" 0 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk")" 0 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-mosi")" 0 elif [ "$action" == 0 ]; then if [ "$pre_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk")" 1 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-mosi")" 1 fi if [ "$pre_miso_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")" 1 fi if [ "$pre_cs_action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0")" 1 fi fi # update cfg if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then luckfox_set_pin_mark "GPIO1_A2" "$action" luckfox_set_pin_mark "GPIO1_C0" "$action" luckfox_set_pin_mark "GPIO1_C1" "$action" luckfox_set_pin_mark "GPIO1_C2" "$action" luckfox_set_pin_mark "GPIO1_C3" "$action" luckfox_set_pin_mark "GPIO0_A4" "$action" elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_set_pin_mark "GPIO2_B1" "$action" luckfox_set_pin_mark "GPIO1_C0" "$action" luckfox_set_pin_mark "GPIO1_C1" "$action" luckfox_set_pin_mark "GPIO1_C2" "$action" luckfox_set_pin_mark "GPIO1_C3" "$action" luckfox_set_pin_mark "GPIO2_B0" "$action" fi luckfox_set_pin_cfg "FBTFT_ENABLE" "$action" luckfox_set_pin_parameter "FBTFT_ENABLE" "$action" #endregion } function luckfox_sdmmc_app() { #region local action="$1" local emmc_device_name local pre_action pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-clk")") if [ "$action" == 1 ]; then if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] && [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ]; then luckfox_check_pin_diagram "GPIO3_A6" "GPIO3_A7" "GPIO3_A5" "GPIO3_A4" "GPIO3_A2" "GPIO3_A3" "GPIO3_A1" fi local emmc_action=okay elif [ "$action" == 0 ]; then local emmc_action=disabled fi # device addr emmc_device_name=$(luckfox_get_device_name "mmc1") local dtbo_content=" /dts-v1/; /plugin/; &{$emmc_device_name}{ status=\"$emmc_action\"; }; " # dtb overlay luckfox_dtbo_overlay "sdmmc" "$dtbo_content" if [ "$action" == 1 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-clk")" 0 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-cmd")" 0 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-bus4")" 0 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-det")" 0 #elif [ "$action" == 0 ] && [ "$pre_action" == 1 ]; then elif [ "$action" == 0 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-clk")" 1 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-cmd")" 1 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-bus4")" 1 luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "sdmmc0-det")" 1 fi # update cfg luckfox_set_pin_cfg "SDMMC_ENABLE" "$action" luckfox_set_pin_parameter "SDMMC_ENABLE" "$action" #mark if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] && [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ]; then luckfox_set_pin_mark "GPIO3_A6" "$action" luckfox_set_pin_mark "GPIO3_A7" "$action" luckfox_set_pin_mark "GPIO3_A5" "$action" luckfox_set_pin_mark "GPIO3_A4" "$action" luckfox_set_pin_mark "GPIO3_A2" "$action" luckfox_set_pin_mark "GPIO3_A3" "$action" luckfox_set_pin_mark "GPIO3_A1" "$action" fi #endregion } # ---------------------- GUI Handler ---------------------- function luckfox_result_handle() { local status="$1" local log="$2" if [ "$status" == $LF_OK ]; then return elif [ "$status" == $LF_ERR ]; then if [ -n "$log" ]; then if [ "$LF_GUI_ENABLE" == 1 ]; then dialog --msgbox "$log" 10 30 else echo "[luckfox-config] error:${log}" fi else if [ "$LF_GUI_ENABLE" == 1 ]; then dialog --msgbox "error" 10 30 else echo "[luckfox-config] error" fi fi exit elif [ "$status" == $LF_NONE ]; then if [ -n "$log" ]; then if [ "$LF_GUI_ENABLE" == 1 ]; then dialog --msgbox "Could not find $log" 10 30 else echo "[luckfox-config] error:Could not find ${log}" fi fi exit 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" } 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 else luckfox_result_handle "$LF_NONE" "$LUCKFOX_PIN_DIAGRAM_FILE" fi } # ---------------------- Main GUI ------------------------- function luckfox_show_menu() { # Only support Luckfox Pico Ultra /Luckfox Pico Ultra W if [ "$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 \ 1 "Advanced Options" \ 2 "About Luckfox" \ 2>&1 >/dev/tty) case $option in 1) luckfox_advanced_options ;; 2) luckfox_about ;; *) luckfox_exit ;; esac done else while true; do option=$(dialog --title "$LUCKFOX_CHIP_MODEL Config" \ --menu "Choose an option" 80 50 6 \ 1 "Compatible Devices" \ 2 "Advanced Options" \ 3 "About Luckfox" \ 2>&1 >/dev/tty) case $option in 1) luckfox_compatible_devices ;; 2) luckfox_advanced_options ;; 3) luckfox_about ;; *) luckfox_exit ;; esac done fi } function luckfox_compatible_devices() { local action option=$(dialog --title "Compatible Devices" \ --menu "Choose an option" 80 50 6 \ 1 "Pico_LCD" \ 2 "Pico_ePaper" \ 3 "Pico_UPS_B" \ 4 "Pico_ResTouch_LCD" \ 5 "OLED_Module" \ 6 "Pico_OLED" \ 7 "DHT11" \ 2>&1 >/dev/tty) case $option in 1) device="Pico_LCD" ;; 2) device="Pico_ePaper" ;; 3) device="Pico_UPS_B" ;; 4) device="Pico_ResTouch_LCD" ;; 5) device="OLED_Module" ;; 6) device="Pico_OLED" ;; 7) device="DHT11" ;; *) luckfox_show_menu ;; esac action=$(dialog --menu "$device Startup Confirmation" 10 40 2 1 "Yes" \ 0 "No" \ 2>&1 >/dev/tty) if [ -z "$action" ] || [ "$action" == 0 ]; then luckfox_compatible_devices fi luckfox_compatible_app "$device" "$action" echo "Change the compatible status of $device to $action." >>"$LUCKFOX_CHANGE_TXT" } function luckfox_advanced_options() { if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then while true; do option=$(dialog --title "Compatible Devices" \ --menu "Choose an option" 80 50 6 \ 1 "PWM" \ 2 "UART" \ 3 "I2C" \ 4 "SPI" \ 5 "USB" \ 6 "CSI" \ 7 "RGB" \ 8 "TouchScreen" \ 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 ;; 7) luckfox_RGB ;; 8) luckfox_TS ;; *) luckfox_show_menu ;; esac done else while true; do option=$(dialog --title "Compatible Devices" \ --menu "Choose an option" 80 50 6 1 "PWM" \ 2 "UART" \ 3 "I2C" \ 4 "SPI" \ 5 "USB" \ 6 "CSI" \ 7 "FBTFT" \ 8 "SDMMC" \ 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 ;; 7) luckfox_FBTFT ;; 8) luckfox_SDMMC ;; *) luckfox_show_menu ;; esac done fi } function luckfox_about() { luckfox_pico_show_pin_diagram } function luckfox_exit() { luckfox_fdt_clear # echo Setting change clear exit } # ---------------------- Sub GUI ------------------------- # Advanced Options function luckfox_PWM() { local pwm_enable pwm_main pwm_sub local option pattern local pwm_option_str pwm_option_str=$(luckfox_get_option_str "PWM") if [ -z "$pwm_option_str" ]; then dialog --msgbox "No PWM Pins" 10 30 fi option=$(dialog --title "PWM Config" \ --menu "Choose an option" 100 30 10 $pwm_option_str 2>&1 >/dev/tty) if [ -z "$option" ]; then luckfox_advanced_options fi pattern=".*PWM([0-9]+)_M([0-9]+).*" if [[ $option =~ $pattern ]]; then pwm_main="${BASH_REMATCH[1]}" pwm_sub="${BASH_REMATCH[2]}" fi pwm_enable=$(dialog --menu "PWM${pwm_main}_M${pwm_sub} Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$pwm_enable" ]; then luckfox_advanced_options else luckfox_pwm_app "$pwm_enable" "$pwm_main" "$pwm_sub" echo "Set PWM${pwm_main}_M${pwm_sub} enable status : $pwm_enable." >>"$LUCKFOX_CHANGE_TXT" fi luckfox_advanced_options } function luckfox_UART() { local uart_enable uart_main uart_sub local option pattern local uart_option_str uart_option_str=$(luckfox_get_option_str "UART") if [ -z "$uart_option_str" ]; then dialog --msgbox "No UART Pins" 10 30 fi option=$(dialog --title "UART Config" \ --menu "Choose an option" 10 30 4 $uart_option_str 2>&1 >/dev/tty) if [ -z "$option" ]; then luckfox_advanced_options fi pattern=".*UART([0-9]+)_M([0-9]+).*" if [[ $option =~ $pattern ]]; then uart_main="${BASH_REMATCH[1]}" uart_sub="${BASH_REMATCH[2]}" fi uart_enable=$(dialog --menu "UART${uart_main}_M${uart_sub} Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$uart_enable" ]; then luckfox_advanced_options else luckfox_uart_app "$uart_enable" "$uart_main" "$uart_sub" echo "Set UART${uart_main}_M${uart_sub} enable status : $uart_enable." >>"$LUCKFOX_CHANGE_TXT" fi luckfox_advanced_options } function luckfox_I2C() { local i2c_enable i2c_speed i2c_main i2c_sub local option pattern local i2c_option_str i2c_option_str=$(luckfox_get_option_str "I2C") if [ -z "$i2c_option_str" ]; then dialog --msgbox "No I2C Pins" 10 30 fi option=$(dialog --title "I2C Config" \ --menu "Choose an option" 10 30 4 $i2c_option_str 2>&1 >/dev/tty) if [ -z "$option" ]; then luckfox_advanced_options fi pattern=".*I2C([0-9]+)_M([0-9]+).*" if [[ $option =~ $pattern ]]; then i2c_main="${BASH_REMATCH[1]}" i2c_sub="${BASH_REMATCH[2]}" fi i2c_enable=$(dialog --menu "I2C${i2c_main}_M${i2c_sub} Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$i2c_enable" ]; then luckfox_advanced_options fi if [ "$i2c_enable" == 1 ]; then i2c_speed=$(dialog --inputbox "I2C${i2c_main}_M${i2c_sub} Speed:" 10 30 2>&1 >/dev/tty) if [ -z "$i2c_speed" ]; then luckfox_advanced_options fi elif [ "$i2c_enable" == 0 ]; then i2c_speed=0 # default fi luckfox_i2c_app "$i2c_enable" "$i2c_main" "$i2c_sub" "$i2c_speed" echo "Set I2C${i2c_main}_M${i2c_sub} enable status : $i2c_enable." >>"$LUCKFOX_CHANGE_TXT" echo "Set I2C${i2c_main}_M${i2c_sub} speed : $i2c_speed." >>"$LUCKFOX_CHANGE_TXT" luckfox_advanced_options } function luckfox_SPI() { local spi_enable spi_speed spi_main spi_sub spi_cs_enable spi_miso_enable local option local spi_option_str spi_option_str=$(luckfox_get_option_str "SPI") if [ -z "$spi_option_str" ]; then dialog --msgbox "No SPI Pins" 10 30 luckfox_advanced_options fi option=$(dialog --title "SPI Config" \ --menu "Choose an option" 10 30 4 $spi_option_str 2>&1 >/dev/tty) if [ -z "$option" ]; then luckfox_advanced_options fi pattern=".*SPI([0-9]+)_M([0-9]+).*" if [[ $option =~ $pattern ]]; then spi_main="${BASH_REMATCH[1]}" spi_sub="${BASH_REMATCH[2]}" fi spi_enable=$(dialog --menu "SPI${spi_main}_M${spi_sub} Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$spi_enable" ]; then luckfox_advanced_options fi if [ "$spi_enable" == 1 ]; then spi_speed=$(dialog --inputbox "SPI${spi_main}_M${spi_sub} Speed:" 10 30 2>&1 >/dev/tty) if [ -z "$spi_speed" ]; then luckfox_advanced_options fi spi_cs_enable=$(dialog --menu "SPI${spi_main}_M${spi_sub} CS0 Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$spi_cs_enable" ]; then luckfox_advanced_options fi spi_miso_enable=$(dialog --menu "SPI${spi_main}_M${spi_sub} MISO Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$spi_miso_enable" ]; then luckfox_advanced_options fi elif [ "$spi_enable" == 0 ]; then spi_speed=10000000 spi_cs_enable=1 spi_miso_enable=1 fi luckfox_spi_app "$spi_enable" "$spi_main" "$spi_sub" "$spi_cs_enable" "$spi_miso_enable" "$spi_speed" echo "Set SPI${spi_main}_M${spi_sub} enable status : $spi_enable." >>"$LUCKFOX_CHANGE_TXT" echo "Set SPI${spi_main}_M${spi_sub} cs-pin enable status : $spi_cs_enable." >>"$LUCKFOX_CHANGE_TXT" echo "Set SPI${spi_main}_M${spi_sub} miso-pin enable status : $spi_miso_enable." >>"$LUCKFOX_CHANGE_TXT" echo "Set SPI${spi_main}_M${spi_sub} speed : $spi_speed." >>"$LUCKFOX_CHANGE_TXT" luckfox_advanced_options } function luckfox_USB() { while true; do option=$(dialog --title "USB Mode Config" \ --menu "Choose an option" 10 30 3 \ 1 "peripheral" \ 2 "host" \ 2>&1 >/dev/tty) case $option in 1) luckfox_usb_app peripheral echo "Set USB Mode : peripheral." >>"$LUCKFOX_CHANGE_TXT" dialog --msgbox "USB Effective after restart" 10 30 luckfox_advanced_options ;; 2) luckfox_usb_app host echo "Set USB Mode: host." >>"$LUCKFOX_CHANGE_TXT" dialog --msgbox "USB Effective after restart" 10 30 luckfox_advanced_options ;; *) luckfox_advanced_options ;; esac done luckfox_advanced_options } function luckfox_CSI() { local csi_enable csi_enable=$(dialog --menu "CSI Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$csi_enable" ]; then luckfox_advanced_options fi luckfox_csi_app "$csi_enable" dialog --msgbox "CSI Effective after restart" 10 30 echo "Set CSI enable status : $csi_enable." >>"$LUCKFOX_CHANGE_TXT" luckfox_advanced_options } function luckfox_RGB() { local rgb_enable rgb_mode_str rgb_enable=$(dialog --menu "RGB Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$rgb_enable" ]; then luckfox_advanced_options fi if [ "$rgb_enable" == 1 ]; then rgb_mode_str="reset" if [ -f "$LUCKFOX_RGB_PARAMS" ]; then touch "$LUCKFOX_RGB_PARAMS" fi # init params init_rgb_clk=$(luckfox_get_pin_cfg "RGB_CLK") init_rgb_h=$(luckfox_get_pin_cfg "RGB_HACTIVE") init_rgb_v=$(luckfox_get_pin_cfg "RGB_VACTIVE") init_rgb_hb=$(luckfox_get_pin_cfg "RGB_HBACKPORCH") init_rgb_hf=$(luckfox_get_pin_cfg "RGB_HFRONTPORCH") init_rgb_vb=$(luckfox_get_pin_cfg "RGB_VBACKPORCH") init_rgb_vf=$(luckfox_get_pin_cfg "RGB_VFRONTPORCH") init_rgb_h_len=$(luckfox_get_pin_cfg "RGB_HSYNC_LEN") init_rgb_v_len=$(luckfox_get_pin_cfg "RGB_VSYNC_LEN") init_rgb_h_active=$(luckfox_get_pin_cfg "RGB_HSYNC_ACTIVE") init_rgb_v_active=$(luckfox_get_pin_cfg "RGB_VSYNC_ACTIVE") init_rgb_de_active=$(luckfox_get_pin_cfg "RGB_DE_ACTIVE") init_rgb_pclk_active=$(luckfox_get_pin_cfg "RGB_PCLK_ACTIVE") LUCKFOX_RGB_PARAMS=$(mktemp) dialog --no-cancel --form "Enter RGB Parameters" 15 50 0 \ "Clock :" 1 1 "$init_rgb_clk" 1 15 10 0 \ "Hsync-Active:" 2 1 "$init_rgb_h_active" 2 15 10 0 \ "Vsync-Active:" 3 1 "$init_rgb_v_active" 3 15 10 0 \ "DE-Active :" 4 1 "$init_rgb_de_active" 4 15 10 0 \ "PCLK-Active :" 5 1 "$init_rgb_pclk_active" 5 15 10 0 \ 2>"$LUCKFOX_RGB_PARAMS" IFS=$'\n' read -d '' -r rgb_clk rgb_h_active rgb_v_active rgb_de_active rgb_pclk_active <"$LUCKFOX_RGB_PARAMS" rm -f "$LUCKFOX_RGB_PARAMS" LUCKFOX_RGB_PARAMS=$(mktemp) dialog --no-cancel --form "Enter RGB Parameters" 15 50 0 \ "Hactive :" 1 1 "$init_rgb_h" 1 15 10 0 \ "Vactive :" 2 1 "$init_rgb_v" 2 15 10 0 \ "HBack-Porch :" 3 1 "$init_rgb_hb" 3 15 10 0 \ "HFont-Porch :" 4 1 "$init_rgb_hf" 4 15 10 0 \ "VBack-Porch :" 5 1 "$init_rgb_vb" 5 15 10 0 \ "VFont-Porch :" 6 1 "$init_rgb_vf" 6 15 10 0 \ "Hsync-Len :" 7 1 "$init_rgb_h_len" 7 15 10 0 \ "Vsync-Len :" 8 1 "$init_rgb_v_len" 8 15 10 0 \ 2>"$LUCKFOX_RGB_PARAMS" IFS=$'\n' read -d '' -r rgb_h rgb_v rgb_hb rgb_hf rgb_vb rgb_vf rgb_h_len rgb_v_len <"$LUCKFOX_RGB_PARAMS" rm -f "$LUCKFOX_RGB_PARAMS" dialog --msgbox "All parameters are valid." 15 50 luckfox_rgb_app 1 "$rgb_mode_str" "$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" echo "Set RGB enable status : $rgb_enable." >>"$LUCKFOX_CHANGE_TXT" else luckfox_rgb_app 0 echo "Set RGB enable status : $rgb_enable." >>"$LUCKFOX_CHANGE_TXT" fi dialog --msgbox "RGB Effective after restart" 10 30 luckfox_advanced_options } function luckfox_TS() { local ts_enable ts_mode ts_reg_hex ts_enable=$(dialog --menu "TouchScreen Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$ts_enable" ]; then luckfox_advanced_options fi if [ "$ts_enable" == 1 ]; then ts_mode=$(dialog --menu "Touch GT911 Enable Config" 10 40 2 \ 0 "i2c_addr: 0x14" \ 1 "i2c_addr: 0x5d" \ 2>&1 >/dev/tty) if [ -z "$ts_mode" ]; then luckfox_advanced_options elif [ "$ts_mode" == 0 ]; then ts_reg_hex="0x14" elif [ "$ts_mode" == 1 ]; then ts_reg_hex="0x5d" fi fi luckfox_ts_app "$ts_enable" "$ts_reg_hex" echo "Set TouchScreen enable status : $ts_enable." >>"$LUCKFOX_CHANGE_TXT" echo "Set TouchScreen Reg : $ts_reg_hex." >>"$LUCKFOX_CHANGE_TXT" luckfox_advanced_options } function luckfox_FBTFT() { local fbtft_enable fbtft_enable=$(dialog --menu "FBTFT Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$fbtft_enable" ]; then luckfox_advanced_options fi if [ "$fbtft_enable" == 1 ]; then fbtft_mode=$(dialog --menu "FBTFT MODE Config" 10 40 2 \ 0 "st7789v/st7789vm" \ 2>&1 >/dev/tty) if [ -z "$fbtft_mode" ]; then luckfox_advanced_options elif [ "$fbtft_mode" == 0 ]; then fbtft_compatible="sitronix,st7789v" fi fi luckfox_fbtft_app "$fbtft_enable" "$fbtft_compatible" dialog --msgbox "FBTFT Effective after restart" 10 30 echo "Set FBTFT enable status : $fbtft_enable." >>"$LUCKFOX_CHANGE_TXT" echo "Set FBTFT compatible : $fbtft_compatible." >>"$LUCKFOX_CHANGE_TXT" luckfox_advanced_options } function luckfox_SDMMC() { local sdmmc_enable if [ "$LUCKFOX_CHIP_MEDIA_CLASS" != "spi_nand" ]; then dialog --title "SDMMC Config" --msgbox "Only spi_nand storage media support SDMMC Config" 10 30 luckfox_advanced_options fi sdmmc_enable=$(dialog --menu "SDMMC Enable Config" 10 40 2 \ 0 "disable" \ 1 "enable" \ 2>&1 >/dev/tty) if [ -z "$sdmmc_enable" ]; then luckfox_advanced_options fi luckfox_sdmmc_app "$sdmmc_enable" echo "Set SDMMC enable status : $sdmmc_enable." >>"$LUCKFOX_CHANGE_TXT" luckfox_advanced_options } # ---------------------- RUN ------------------------- if [ "$1" == "load" ]; then LF_GUI_ENABLE=0 rm $LUCKFOX_PIN_DIAGRAM_FILE luckfox_config_init luckfox_load_cfg echo "Complete configuration loading" elif [ "$1" == "show" ]; then luckfox_config_init cat $LUCKFOX_PIN_DIAGRAM_FILE elif [ "$1" == "rgb_switch" ]; then luckfox_config_init LF_GUI_ENABLE=0 if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then if [ "$(luckfox_get_pin_cfg "RGB_HACTIVE")" == "480" ]; then # 480 -> 720 echo "****************************************************" echo "***Switch the RGB screen resolution to 720 x 720.***" echo "****************************************************" luckfox_csi_app 1 luckfox_rgb_app 1 "reset" "30000000" \ "720" "720" \ "44" "46" \ "18" "16" \ "2" "2" \ "0" "0" \ "0" "0" elif [ "$(luckfox_get_pin_cfg "RGB_HACTIVE")" == "720" ]; then # 720 -> 480 echo "****************************************************" echo "***Switch the RGB screen resolution to 480 x 480.***" echo "****************************************************" luckfox_csi_app 1 luckfox_rgb_app 1 "reset" "16500000" \ "480" "480" \ "10" "50" \ "8" "8" \ "4" "10" \ "0" "0" \ "0" "1" elif [ -z "$(luckfox_get_pin_cfg "RGB_HACTIVE")" ]; then echo "****************************************************" echo "***Switch the RGB screen resolution to 480 x 480.***" echo "****************************************************" luckfox_csi_app 1 luckfox_rgb_app 1 "reset" "16500000" \ "480" "480" \ "10" "50" \ "8" "8" \ "4" "10" \ "0" "0" \ "0" "1" fi else luckfox_result_handle "$RK_ERR" "This Luckchip Pico Model does not support RGB switch." fi elif [ -z "$1" ]; then LF_GUI_ENABLE=1 luckfox_config_init luckfox_show_menu fi