mirror of
https://github.com/LuckfoxTECH/luckfox-pico.git
synced 2026-01-19 17:59:18 +01:00
project:build.sh: Added fastboot support; custom modifications to U-Boot and kernel implemented using patches.
project:cfg:BoardConfig_IPC: Added fastboot BoardConfig file and firmware post-scripts, distinguishing between the BoardConfigs for Luckfox Pico Pro and Luckfox Pico Max. project:app: Added fastboot_client and rk_smart_door for quick boot applications; updated rkipc app to adapt to the latest media library. media:samples: Added more usage examples. media:rockit: Fixed bugs; removed support for retrieving data frames from VPSS. media:isp: Updated rkaiq library and related tools to support connection to RKISP_Tuner. sysdrv:Makefile: Added support for compiling drv_ko on Luckfox Pico Ultra W using Ubuntu; added support for custom root filesystem. sysdrv:tools:board: Updated Buildroot optional mirror sources, updated some software versions, and stored device tree files and configuration files that undergo multiple modifications for U-Boot and kernel separately. sysdrv:source:mcu: Used RISC-V MCU SDK with RT-Thread system, mainly for initializing camera AE during quick boot. sysdrv:source:uboot: Added support for fastboot; added high baud rate DDR bin for serial firmware upgrades. sysdrv:source:kernel: Upgraded to version 5.10.160; increased NPU frequency for RV1106G3; added support for fastboot. Signed-off-by: luckfox-eng29 <eng29@luckfox.com>
This commit is contained in:
206
sysdrv/tools/board/luckfox_config/S99luckfoxcustomoverlay
Executable file
206
sysdrv/tools/board/luckfox_config/S99luckfoxcustomoverlay
Executable file
@@ -0,0 +1,206 @@
|
||||
#!/bin/bash
|
||||
LUCKFOX_FDT_DTB=/tmp/.fdt.dtb
|
||||
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
|
||||
LF_CUSTOM_DTS_PATH="/mnt/cfg"
|
||||
SYS_OVERLAYS_PATH="/sys/kernel/config/device-tree/overlays"
|
||||
LUCKFOX_CHIP_MEDIA_CLASS="emmc"
|
||||
LUCKFOX_CHIP_MEDIA="/dev/mmcblk0p4"
|
||||
|
||||
function luckfox_tools_check() {
|
||||
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
|
||||
|
||||
# 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
|
||||
|
||||
}
|
||||
|
||||
# -- Static Overlay --
|
||||
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_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
|
||||
echo "$LUCKFOX_FDT_HDR_DTB can't be found!"
|
||||
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
|
||||
echo "$LUCKFOX_FDT_DTB can't be found!"
|
||||
return
|
||||
fi
|
||||
fdtdump $LUCKFOX_FDT_DTB >$LUCKFOX_FDT_DUMP_TXT
|
||||
}
|
||||
|
||||
function luckfox_fdt_overlay() {
|
||||
#region
|
||||
local fdt_overlay_dtbo="$1"
|
||||
local fdt_dtb_size fdt_size fdt_size_hex fdt_hash_data
|
||||
|
||||
fdtoverlay -i $LUCKFOX_FDT_DTB -o $LUCKFOX_FDT_DTB "$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
|
||||
echo "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
|
||||
echo "$LUCKFOX_FDT_DTB can't be found!"
|
||||
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
|
||||
echo "$LUCKFOX_FDT_HDR_OVERLAY_DTBO can't found!"
|
||||
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
|
||||
}
|
||||
|
||||
# Load the device tree dynamically
|
||||
function luckfox_load_dynamic_dts() {
|
||||
local dtbo_node_name
|
||||
|
||||
if [ ! -d ${LF_CUSTOM_DTS_PATH}/dtbo/ ]; then
|
||||
exit 1
|
||||
#echo "Can't find ${LF_CUSTOM_DTS_PATH}/dtbo dir !"
|
||||
fi
|
||||
|
||||
for dts_file in ${LF_CUSTOM_DTS_PATH}/dtbo/*.dts; do
|
||||
#Get DTBO name
|
||||
dtbo_node_name="$(basename "$dts_file" .dts)"
|
||||
#Check DTBO path
|
||||
if [ -d "${SYS_OVERLAYS_PATH}/${dtbo_node_name}" ]; then
|
||||
echo "Node is exist"
|
||||
continue
|
||||
fi
|
||||
|
||||
#DTS->DTBO
|
||||
dtc -I dts -O dtb ${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dts -o \
|
||||
${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo
|
||||
|
||||
if [ ! -f "${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo" ]; then
|
||||
echo "${dtbo_node_name}.dts to dtbo error!"
|
||||
continue
|
||||
else
|
||||
mkdir -p ${SYS_OVERLAYS_PATH}/${dtbo_node_name}
|
||||
fi
|
||||
#Load and enable DTBO
|
||||
cat ${LF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo > \
|
||||
${SYS_OVERLAYS_PATH}/${dtbo_node_name}/dtbo
|
||||
echo 1 >${SYS_OVERLAYS_PATH}/${dtbo_node_name}/status
|
||||
|
||||
rm ${LLF_CUSTOM_DTS_PATH}/dtbo/${dtbo_node_name}.dtbo
|
||||
done
|
||||
}
|
||||
|
||||
#Overwrite the disk device tree (requires restart)
|
||||
function luckfox_load_static_dts() {
|
||||
local dtbo_node_name
|
||||
if [ ! -d ${LF_CUSTOM_DTS_PATH}/fdt_overlay/ ]; then
|
||||
echo "Can't find ${LF_CUSTOM_DTS_PATH}/fdt_overlay dir!"
|
||||
fi
|
||||
|
||||
for dts_file in ${LF_CUSTOM_DTS_PATH}/fdt_overlay/*.dts; do
|
||||
#Get DTBO name
|
||||
dtbo_node_name="$(basename "$dts_file" .dts)"
|
||||
|
||||
#DTS->DTBO
|
||||
dtc -I dts -O dtb ${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dts -o \
|
||||
${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dtbo
|
||||
|
||||
if [ ! -f "${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dtbo" ]; then
|
||||
echo "${dtbo_node_name}.dts to dtbo error!"
|
||||
continue
|
||||
fi
|
||||
|
||||
# load to disk
|
||||
luckfox_update_fdt
|
||||
luckfox_fdt_overlay ${LF_CUSTOM_DTS_PATH}/fdt_overlay/${dtbo_node_name}.dtbo
|
||||
rm ${LUCKFOX_FDT_OVERLAY_DTBO}
|
||||
|
||||
done
|
||||
}
|
||||
|
||||
case $1 in
|
||||
start)
|
||||
luckfox_load_dynamic_dts
|
||||
;;
|
||||
stop)
|
||||
luckfox_tools_check
|
||||
luckfox_load_static_dts
|
||||
;;
|
||||
*)
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
@@ -58,7 +58,7 @@ function luckfox_config_init() {
|
||||
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
|
||||
elif [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Mini A" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Mini B" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Mini" ]; 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
|
||||
@@ -405,8 +405,8 @@ function luckfox_pico_mini_pin_diagram_file() {
|
||||
- FIQtty_RX - GPIO1_B3 | | GPIO0_A4 - - PWM1_M0
|
||||
PWM2_M2 - SPI0_M0_CS0 - GPIO1_C0 | | GPIO1_C7 - - PWM11_M1
|
||||
PWM4_M2 - SPI0_M0_CLK - GPIO1_C1 | | GPIO1_C6 - - PWM10_M1
|
||||
PWM5_M2 - SPI0_M0_MOSI - GPIO1_C2 | | GPIO1_D3 - - PWM11_M2
|
||||
PWM6_M2 - SPI0_M0_MISO - GPIO1_C3 | | GPIO1_D2 - - PWM0_M1
|
||||
PWM5_M2 - SPI0_M0_MOSI - GPIO1_C2 | | GPIO1_D3 - I2C3_M1_SCL - PWM11_M2
|
||||
PWM6_M2 - SPI0_M0_MISO - GPIO1_C3 | | GPIO1_D2 - I2C3_M1_SDA - PWM0_M1
|
||||
PWM8_M1 - UART4_M1_RX - GPIO1_C4 | | GPIO1_D1 - UART3_M1_RX - PWM10_M2
|
||||
PWM9_M1 - UART4_M1_TX - GPIO1_C5 | | GPIO1_D0 - UART3_M1_TX - PWM3_M2
|
||||
+ - + - +
|
||||
@@ -432,25 +432,24 @@ function luckfox_pico_ultra_pin_diagram_file() {
|
||||
GND | | GPIO1_D2 - UART5_M1_RX - I2C3_M1_SDA- PWM0_M1
|
||||
+ - + - +
|
||||
+ - + - +
|
||||
SYS | | 1V8
|
||||
GND | | GND
|
||||
3V3 | | GPIO4_C0
|
||||
GND | | GPIO4_C1
|
||||
PWM8_M1 - UART4_M1_RX - GPIO1_C4 | | GND
|
||||
PWM9_M1 - UART4_M1_TX - GPIO1_C5 | | MICBIAS
|
||||
- I2C4_M0_SCL - UART1_M1_RTS- GPIO2_A1 | | MIC1P
|
||||
- I2C4_M0_SDA - UART1_M1_CTS- GPIO2_A0 | | MIC1N
|
||||
UART1_M1_RX - GPIO2_A5 | | GND
|
||||
UART1_M1_TX - GPIO2_A4 | | GPIO1_C7 - - - PWM11_M1
|
||||
GPIO2_A2 | | GPIO2_B0 - UART0_M1_RX - I2C1_M1_SCL - PWM5_M1
|
||||
GPIO2_A3 | | GPIO2_B1 - UART0_M1_TX - I2C1_M1_SDA - PWM6_M1
|
||||
GND | | GND
|
||||
- - - SYS | | 1V8 - - -
|
||||
- - - GND | | GND - - -
|
||||
- - - 3V3 | | GPIO4_C0 - - -
|
||||
- - - GND | | GPIO4_C1 - - -
|
||||
PWM8_M1 - - UART4_M1_RX - GPIO1_C4 | | GND - - -
|
||||
PWM9_M1 - - UART4_M1_TX - GPIO1_C5 | | MICBIAS - - -
|
||||
- I2C4_M0_SCL - UART1_M1_RTS- GPIO2_A1 | | MIC1P - - -
|
||||
- I2C4_M0_SDA - UART1_M1_CTS- GPIO2_A0 | | MIC1N - - -
|
||||
- - UART1_M1_RX - GPIO2_A5 | | GND - - -
|
||||
- - UART1_M1_TX - GPIO2_A4 | | GPIO1_C7 - - - PWM11_M1
|
||||
- - - GPIO2_A2 | | GPIO2_B0 - UART0_M1_RX - I2C1_M1_SCL - PWM5_M1
|
||||
- - - GPIO2_A3 | | GPIO2_B1 - UART0_M1_TX - I2C1_M1_SDA - PWM6_M1
|
||||
- - - GND | | GND - - -
|
||||
+ - + - +
|
||||
EOF
|
||||
}
|
||||
|
||||
# ------------------- Pin Diagram Handle ---------------------
|
||||
|
||||
function luckfox_check_pin_diagram() {
|
||||
local device_node
|
||||
local left_group=()
|
||||
@@ -2490,7 +2489,7 @@ function luckfox_USB() {
|
||||
while true; do
|
||||
option=$(dialog --title "USB Mode Config" \
|
||||
--menu "Choose an option" 10 30 3 \
|
||||
1 "peripheral" \
|
||||
1 "device" \
|
||||
2 "host" \
|
||||
2>&1 >/dev/tty)
|
||||
case $option in
|
||||
@@ -2687,14 +2686,19 @@ function luckfox_SDMMC() {
|
||||
# ---------------------- RUN -------------------------
|
||||
if [ "$1" == "load" ]; then
|
||||
LF_GUI_ENABLE=0
|
||||
rm $LUCKFOX_PIN_DIAGRAM_FILE
|
||||
if [ -f $LUCKFOX_PIN_DIAGRAM_FILE ]; then
|
||||
rm $LUCKFOX_PIN_DIAGRAM_FILE
|
||||
fi
|
||||
luckfox_config_init
|
||||
luckfox_load_cfg
|
||||
echo "Complete configuration loading"
|
||||
elif [ "$1" == "show" ]; then
|
||||
luckfox_config_init
|
||||
cat $LUCKFOX_PIN_DIAGRAM_FILE
|
||||
elif [ "$1" == "update" ]; then
|
||||
luckfox_update_fdt
|
||||
elif [ "$1" == "rgb_switch" ]; then
|
||||
# for Luckfox Pico Ultra Boot Key
|
||||
luckfox_config_init
|
||||
LF_GUI_ENABLE=0
|
||||
if [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra" ] || [ "$LUCKFOX_CHIP_MODEL" == "Luckfox Pico Ultra W" ]; then
|
||||
@@ -2710,7 +2714,7 @@ elif [ "$1" == "rgb_switch" ]; then
|
||||
"18" "16" \
|
||||
"2" "2" \
|
||||
"0" "0" \
|
||||
"0" "0"
|
||||
"0" "1"
|
||||
elif [ "$(luckfox_get_pin_cfg "RGB_HACTIVE")" == "720" ]; then
|
||||
# 720 -> 480
|
||||
echo "****************************************************"
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#include <linux/input.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <dirent.h>
|
||||
|
||||
#define INPUT_DIR "/dev/input"
|
||||
#define EVENT_PREFIX "event"
|
||||
|
||||
void check_adc_keys_event(const char *device_path) {
|
||||
int fd;
|
||||
char name[256] = "Unknown";
|
||||
struct input_event ev;
|
||||
|
||||
fd = open(device_path, O_RDONLY);
|
||||
if (fd < 0) {
|
||||
perror("Unable to open device");
|
||||
return;
|
||||
}
|
||||
|
||||
if (ioctl(fd, EVIOCGNAME(sizeof(name)), name) < 0) {
|
||||
perror("Unable to get device name");
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
if (strstr(name, "adc-keys") != NULL) {
|
||||
printf("Found ADC keys device: %s\n", device_path);
|
||||
|
||||
while (read(fd, &ev, sizeof(struct input_event)) > 0) {
|
||||
if (ev.type == EV_KEY) {
|
||||
if (ev.value == 0) {
|
||||
printf("Key released: code %d\n", ev.code);
|
||||
system("luckfox-config rgb_switch");
|
||||
system("reboot");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
close(fd);
|
||||
}
|
||||
|
||||
int main() {
|
||||
struct dirent *entry;
|
||||
DIR *dp;
|
||||
|
||||
|
||||
dp = opendir(INPUT_DIR);
|
||||
if (dp == NULL) {
|
||||
perror("Unable to open /dev/input directory");
|
||||
return EXIT_FAILURE;
|
||||
}
|
||||
|
||||
while ((entry = readdir(dp))) {
|
||||
if (strncmp(entry->d_name, EVENT_PREFIX, strlen(EVENT_PREFIX)) == 0) {
|
||||
char device_path[256];
|
||||
snprintf(device_path, sizeof(device_path), "%s/%s", INPUT_DIR, entry->d_name);
|
||||
check_adc_keys_event(device_path);
|
||||
}
|
||||
}
|
||||
|
||||
closedir(dp);
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user