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:
luckfox-eng29
2024-08-21 10:05:47 +08:00
parent e79fd21975
commit 8f34c2760d
20902 changed files with 6567362 additions and 11248383 deletions

View 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

View File

@@ -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 "****************************************************"

View File

@@ -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;
}