#!/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_CFG_FILE=/etc/luckfox.cfg # return LF_OK=0 LF_ERR=1 LF_NONE=2 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 } 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_mode 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 ]; 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" "$value" luckfox_set_pin_mark "GPIO1_D1" "$value" luckfox_set_pin_mark "GPIO1_C2" "$value" luckfox_set_pin_mark "GPIO1_C3" "$value" luckfox_set_pin_mark "GPIO1_C1" "$value" luckfox_set_pin_mark "GPIO1_C6" "$value" luckfox_set_pin_mark "GPIO2_A7" "$value" luckfox_set_pin_mark "GPIO2_A6" "$value" luckfox_set_pin_mark "GPIO1_D3" "$value" luckfox_set_pin_mark "GPIO1_C0" "$value" luckfox_set_pin_mark "GPIO1_D2" "$value" luckfox_set_pin_mark "GPIO1_C7" "$value" luckfox_set_pin_mark "GPIO2_B0" "$value" luckfox_set_pin_mark "GPIO2_B1" "$value" luckfox_set_pin_mark "GPIO1_C4" "$value" luckfox_set_pin_mark "GPIO1_C5" "$value" luckfox_set_pin_mark "GPIO2_A1" "$value" luckfox_set_pin_mark "GPIO2_A0" "$value" luckfox_set_pin_mark "GPIO2_A5" "$value" luckfox_set_pin_mark "GPIO2_A4" "$value" luckfox_set_pin_mark "GPIO2_A2" "$value" luckfox_set_pin_mark "GPIO2_A3" "$value" else echo "Only Luckfox Pico Ultra /Luckfox Pico Ultra W is supported" fi else echo "Reset rgb pins" luckfox_rgb_app 0 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"* ]]; 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_mode=$(luckfox_get_pin_cfg "${pin}_MODE") 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_mode" ]; then spi_mode=1 luckfox_set_pin_cfg "${pin}_MODE" 1 fi if [ -n "$value" ]; then luckfox_spi_app "$value" "$spi_cs_enable" "$spi_main" "$spi_sub" "$spi_mode" "$spi_speed" fi fi done # SDMMC value=$(luckfox_get_pin_cfg "SDMMC_ENABLE") if [ -n "$value" ] && [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ]; then luckfox_sdmmc_app "$value" fi } # ------------------- 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}') 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 key1 " 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 1 0 0 0 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 1 0 0 0 elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then luckfox_spi_app 1 1 0 0 0 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 1 0 0 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 echo $LF_ERR "The sdmmc system cannot drive the use of SD cards and touch functions!" return 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 echo $LF_OK return 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 echo $LF_OK return else echo $LF_ERR "The "$LUCKFOX_CHIP_MODEL" does not support this compatible device" return 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 echo $LF_ERR "The sdmmc system cannot drive the key1 " return elif [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ] && [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ]; then luckfox_sdmmc_app 0 luckfox_uart_app 0 5 0 echo $LF_OK return elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Pro" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Max" ]; then luckfox_uart_app 0 1 1 echo $LF_OK return elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico" ]; then echo $LF_OK return else echo $LF_ERR "The "$LUCKFOX_CHIP_MODEL" does not support this compatible device" return 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=() echo LUCKFOX_CHIP_MEDIA_CLASS=$LUCKFOX_CHIP_MEDIA_CLASS 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!" return } # -- Advanced Options -- function luckfox_pwm_app() { #region local action="$1" local pwm_main="$2" local pwm_sub="$3" local pwm_device_name pwm_pinctrl_addr local pre_action 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_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" 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_i2c_app() { #region local action="$1" local i2c_main="$2" local i2c_sub="$3" local i2c_speed 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 luckfox_set_pin_mark "I2C${i2c_main}_M${i2c_sub}_SDA" "$action" luckfox_set_pin_mark "I2C${i2c_main}_M${i2c_sub}_SCL" "$action" # 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" #endregion } function luckfox_spi_app() { #region local action="$1" local cs_action="$2" local spi_main="$3" local spi_sub="$4" local spi_mode="$5" local spi_speed if [ -z "$6" ]; then spi_speed=50000000 else spi_speed="$6" fi local spi_device_name local spi_pinctrl_addr="" local pre_action pre_spi_mode pre_cs_action pre_action=$(luckfox_get_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-clk")") pre_spi_mode=$(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 [ "$spi_mode" == 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 [ "$spi_mode" == 1 ]; then spi_pinctrl_addr+=" " spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso") fi if [ "$cs_action" == 1 ]; then spi_pinctrl_addr+=" " spi_pinctrl_addr+=$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-cs0") fi # status local spi_action=okay # mark if [ "$cs_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 [ "$spi_mode" == 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" elif [ "$action" == 0 ]; then # phandle spi_pinctrl_addr="" # status local spi_action=disabled # mark luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_MISO" "$action" luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_MOSI" "$action" luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_CLK" "$action" luckfox_set_pin_mark "SPI${spi_main}_M${spi_sub}_CS0" "$action" fi # create dtc spi_device_name=$(luckfox_get_device_name "spi${spi_main}") dtbo_content=" /dts-v1/; /plugin/; &{$spi_device_name}{ status=\"$spi_action\"; pinctrl-0 = <$spi_pinctrl_addr>; }; &{$spi_device_name/spidev@0}{ spi-max-frequency = <$spi_speed>; }; " # dtb overlay luckfox_dtbo_overlay spi"${spi_main}"m"${spi_sub}" "$dtbo_content" # update pin fun if [ "$action" == 1 ]; then if [ "$pre_spi_mode" == 1 ] && [ "$spi_mode" == 0 ]; then luckfox_set_pin_mode "$(luckfox_get_pinctrl_addr "spi${spi_main}m${spi_sub}-miso")" 1 elif [ "$spi_mode" == 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_spi_mode" == 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 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}_SPEED" "$spi_speed" luckfox_set_pin_cfg "SPI${spi_main}_M${spi_sub}_MODE" "$spi_mode" luckfox_set_pin_parameter "SPI${spi_main}_M${spi_sub}_SPEED" "$spi_speed" #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 # create fdt overlay content if [ "$action" == 1 ]; then local csi_action=okay else local csi_action=disbaled fi local fdt_content=" /dts-v1/; /plugin/; &{/i2c@ff470000/sc3336@30}{ status=\"$csi_action\"; }; &{/csi2-dphy-hw@ff3e8000}{ status=\"$csi_action\"; }; &{/csi2-dphy0}{ status=\"$csi_action\"; }; &{/mipi-csi2@ffa20000}{ status=\"$csi_action\"; }; &{/rkcif@ffa10000}{ status=\"$csi_action\"; }; &{/rkcif-mipi-lvds-sditf}{ status=\"$csi_action\"; }; &{/rkisp@ffa00000}{ status=\"$csi_action\"; }; &{/rkisp-vir0}{ status=\"$csi_action\"; }; " # fdt overlay luckfox_fdt_overlay "$fdt_content" # update cfg luckfox_set_pin_cfg "CSI_ENABLE" "$action" luckfox_set_pin_parameter "CSI_ENABLE" "$action" #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" == "enable" ]; then reset_gpio_action=okay enable_gpio_action=disabled elif [ "$rgb_mode" == "reset" ]; 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" local rgb_action=okay else local rgb_action=disbaled # 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" fi # create fdt_content local fdt_content=" /dts-v1/; /plugin/; &{/display-subsystem}{ status=\"$rgb_action\"; }; &{/rgb}{ status=\"$rgb_action\"; }; &{/rgb/rgb_in_vop}{ status=\"$rgb_action\"; }; &{/display_subsystem/route/route-rgb}{ status=\"$rgb_action\"; }; &{/vop@ff990000}{ status=\"$rgb_action\"; }; &{/panel}{ status=\"$rgb_action\"; }; " # Get GPIO0 phandle #gpio0_phandle=$(luckfox_get_pinctrl_addr "gpio@ff380000" 11) local lcd_time_content=" /dts-v1/; /plugin/; &{/panel/reset}{ status=\"$reset_gpio_action\"; }; &{/panel/enable}{ status=\"$enable_gpio_action\"; }; &{/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" #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 "sdmmc_clk")") if [ "$action" == 1 ]; then local emmc_action=okay else local emmc_action=disabled fi #Luckfox Pico Plus if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Plus" ] && [ "$LUCKFOX_CHIP_MEDIA_CLASS" == "spi_nand" ]; then if [ "$action" == 1 ]; then luckfox_check_pin_diagram "GPIO3_A6" "GPIO3_A7" "GPIO3_A5" "GPIO3_A4" "GPIO3_A2" "GPIO3_A3" "GPIO3_A1" local emmc_action=okay fi 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 # 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 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" #endregion } # ---------------------- Main GUI ------------------------- function luckfox_show_menu() { 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 } function luckfox_compatible_devices() { local action while true; do 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) action=$(dialog --menu "Pico_LCD 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 "Pico_LCD" "$action" ;; 2) action=$(dialog --menu "Pico_ePaper 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 "Pico_ePaper" "$action" ;; 3) action=$(dialog --menu "Pico_UPS_B 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 "Pico_UPS_B" "$action" ;; 4) action=$(dialog --menu "Pico_ResTouch_LCD 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 "Pico_ResTouch_LCD" "$action" ;; 5) action=$(dialog --menu "OLED_Module 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 "OLED_Module" "$action" ;; 6) action=$(dialog --menu "Pico_OLED 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 "Pico_OLED" "$action" ;; 7) action=$(dialog --menu "DHT11 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 "DHT11" "$action" ;; *) luckfox_show_menu ;; esac done } function luckfox_advanced_options() { if [ "$(luckfox_get_pin_cfg "COMPATIBLE_DEV_ENABLE")" == 1 ]; then dialog --msgbox "Using a compatible device, unable to use Advanced Options" 10 30 luckfox_show_menu fi 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 "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_RGB ;; 8) luckfox_SDMMC ;; *) luckfox_show_menu ;; esac done } function luckfox_about() { luckfox_pico_show_pin_diagram } function luckfox_exit() { luckfox_fdt_clear clear exit } # ---------------------- Sub GUI ------------------------- # Advanced Options 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 dialog --msgbox "$log" 10 30 else dialog --msgbox "error" 10 30 fi exit elif [ "$status" == $LF_NONE ]; then if [ -n "$log" ]; then dialog --msgbox "Could not find $log" 10 30 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 dialog --msgbox "Can't find $LUCKFOX_PIN_DIAGRAM_FILE" 10 30 fi } 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" 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" 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=500000 # default fi luckfox_i2c_app "$i2c_enable" "$i2c_main" "$i2c_sub" "$i2c_speed" luckfox_advanced_options } function luckfox_SPI() { local spi_enable spi_speed spi_main spi_sub spi_cs_enable spi_mode 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 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_mode=$(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_mode" ]; then luckfox_advanced_options fi elif [ "$spi_enable" == 0 ]; then spi_speed=10000000 spi_cs_enable=1 spi_mode=1 fi luckfox_spi_app "$spi_enable" "$spi_cs_enable" "$spi_main" "$spi_sub" "$spi_mode" "$spi_speed" luckfox_advanced_options } function luckfox_USB() { while true; do option=$(dialog --title "USB Mode Config" \ --menu "Choose an option" 10 30 3 1 "otg" \ 2 "peripheral" \ 3 "host" \ 2>&1 >/dev/tty) case $option in 1) luckfox_usb_app otg dialog --msgbox "USB Effective after restart" 10 30 ;; 2) luckfox_usb_app peripheral dialog --msgbox "USB Effective after restart" 10 30 ;; 3) luckfox_usb_app host dialog --msgbox "USB Effective after restart" 10 30 ;; *) luckfox_advanced_options ;; esac done } 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 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 if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then rgb_mode=$(dialog --menu "RGB Enable Config" 10 40 2 \ 0 "reset-gpios" \ 1 "enable-gpios" \ 2>&1 >/dev/tty) if [ -z "$rgb_enable" ]; then luckfox_advanced_options elif [ "$rgb_mode" == 0 ]; then rgb_mode_str="reset" elif [ "$rgb_mode" == 1 ]; then rgb_mode_str="enable" fi 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" dialog --msgbox "RGB Effective after restart" 10 30 else luckfox_result_handle "$RK_ERR" "Only Luckfox Pico Ultra /Luckfox Pico Ultra W is supported" luckfox_advanced_options fi else luckfox_rgb_app 0 fi luckfox_advanced_options } function luckfox_SDMMC() { local sdmmc_enable if [ "$LUCKFOX_CHIP_MEDIA_CLASS" != "spi_nand" ]; then dialog --msgbox "Only spi_nand storage media is supported" 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" luckfox_advanced_options } # ---------------------- RUN ------------------------- if [ "$1" == "load" ]; then 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 [ -z "$1" ]; then luckfox_config_init luckfox_show_menu fi