diff --git a/build_openwrt.sh b/build_openwrt.sh new file mode 100755 index 000000000..e189fb8d1 --- /dev/null +++ b/build_openwrt.sh @@ -0,0 +1,750 @@ +#!/usr/bin/env bash + +#==================================================== +# OpenWrt 构建管理脚本 +# 功能:提供交互式菜单,可选择执行特定操作 +# 更新:2025-04-05 +#==================================================== + +#---------------基础配置---------------# +# 日志目录设置 +LOGS_ROOT="openwrt_logs" +SESSION_DIR="${LOGS_ROOT}/$(date +%Y%m%d_%H%M%S)" +LOG_FILE="${SESSION_DIR}/main_build_script.log" # 主脚本日志文件名更改,更清晰 + +#---------------清理配置---------------# +# 需要移除的目录列表 (示例,根据你的需要添加) +declare -a REMOVE_DIRS=( + # "feeds/packages/net/v2ray-geodata" # 示例 +) + +# 需要移除的包列表 (示例,根据你的需要添加) +declare -a REMOVE_PACKAGES=( + # "package/feeds/luci/luci-app-example" # 示例 +) + +#---------------自定义包配置---------------# +# 定义自定义包配置,格式:[包名]=[目标目录]=[仓库URL]=[分支]=[是否使用--depth 1] +declare -A CUSTOM_PACKAGES=( + ["partexp"]="package/luci-app-partexp=https://github.com/sirpdboy/luci-app-partexp=main=false" + ["openclash"]="package/openclash=https://github.com/vernesong/OpenClash=dev=true" + ["zerotier"]="package/luci-app-zerotier=https://github.com/Firsgith/luci-app-zerotier.git=main=false" + ["5gsupport"]="package/5G-Modem-Support=https://nanako.site/gitea/Nanako/openwrt-app-actions.git=main=false" + ["pcat"]="package/pcat-manager=https://github.com/photonicat/rockchip_rk3568_pcat_manager.git=master=true" + ["adguardhome"]="package/adguardhome=https://github.com/xiaoxiao29/luci-app-adguardhome.git=master=false" +) + +#---------------日志系统---------------# +# 保存原始的标准输出和错误输出文件描述符 +exec {STDOUT_ORIG}>&1 +exec {STDERR_ORIG}>&2 + +# 全局变量标记日志是否启用 +LOGGING_ENABLED=false # 初始为 false,由 init_logger 启用 + +# 初始化日志系统 +init_logger() { + # 创建日志目录结构 + mkdir -p "$SESSION_DIR" || { + echo "错误: 无法创建日志目录: $SESSION_DIR" >&2 + exit 1 + } + + LOGGING_ENABLED=true + echo "日志将保存在: $SESSION_DIR" + echo "主脚本日志: $LOG_FILE" + + # 重定向主脚本的 stdout 和 stderr 到 tee,同时输出到控制台和主日志文件 + # 使用 process substitution 和 tee + exec > >(tee -a "$LOG_FILE") + exec 2> >(tee -a "$LOG_FILE" >&2) + + # 记录初始信息到日志 + echo "[$(date "+%Y-%m-%d %H:%M:%S")] [INFO]: 日志系统初始化完成。主日志文件: $LOG_FILE" +} + +# 创建新的特定构建阶段的日志文件 +create_build_log() { + local build_type=$1 + local timestamp=$(date +%Y%m%d_%H%M%S) + # 使用更明确的文件名 + BUILD_LOG_FILE="${SESSION_DIR}/${build_type}_build_${timestamp}.log" + # 确保文件被创建,即使命令没有输出 + touch "$BUILD_LOG_FILE" || { + log "ERROR" "无法创建构建日志文件: $BUILD_LOG_FILE" + return 1 + } + # 返回创建的日志文件名 + echo "$BUILD_LOG_FILE" + return 0 +} + +# 禁用日志重定向 (用于 menuconfig 等交互场景) +disable_logging() { + if [ "$LOGGING_ENABLED" = true ]; then + log "DEBUG" "禁用日志重定向,恢复原始标准输出/错误。" + exec >&$STDOUT_ORIG + exec 2>&$STDERR_ORIG + LOGGING_ENABLED=false # 标记为禁用 + fi +} + +# 启用日志重定向 (恢复) +enable_logging() { + # 仅在之前被禁用的情况下才重新启用 + if [ "$LOGGING_ENABLED" = false ]; then + # 重新应用重定向到主日志 + exec > >(tee -a "$LOG_FILE") + exec 2> >(tee -a "$LOG_FILE" >&2) + LOGGING_ENABLED=true # 标记为启用 + log "DEBUG" "重新启用日志重定向到主日志。" + fi +} + +# 设置终端颜色 +setup_colors() { + if [[ -t 1 ]]; then # 检查标准输出是否连接到终端 + RED='\033[0;31m' + GREEN='\033[0;32m' + YELLOW='\033[1;33m' + BLUE='\033[0;34m' + NC='\033[0m' # No Color + else + RED='' GREEN='' YELLOW='' BLUE='' NC='' + fi +} + +# 记录日志函数 - 使用此函数来明确日志级别 +# 注意:此函数输出会经过 init_logger 设置的全局重定向 +log() { + local level=$1 + local message=$2 + local timestamp + timestamp=$(date "+%Y-%m-%d %H:%M:%S") + local color="" level_str="" + + case $level in + "INFO") color="$GREEN"; level_str="INFO " ;; # 加空格对齐 + "WARN") color="$YELLOW"; level_str="WARN " ;; + "ERROR") color="$RED"; level_str="ERROR" ;; + "DEBUG") color="$BLUE"; level_str="DEBUG" ;; + *) color=""; level_str="LOG " ;; # 默认级别 + esac + + # 使用 printf 保证原子写入,减少并发问题 + printf "[%s] %b[%s]%b: %s\n" "$timestamp" "$color" "$level_str" "$NC" "$message" +} + +# 同时记录消息到主日志和特定的构建日志 +log_to_both() { + local level=$1 + local message=$2 + local build_log_file=$3 # 明确参数名 + + # 1. 输出到主日志(通过全局重定向和 log 函数) + log "$level" "$message" + + # 2. 追加到指定的构建日志文件 + local timestamp + timestamp=$(date "+%Y-%m-%d %H:%M:%S") + # 直接追加,不需要颜色代码 + printf "[%s] [%s]: %s\n" "$timestamp" "$level" "$message" >> "$build_log_file" +} + + +#---------------自定义包管理函数---------------# +# 更新单个自定义包 +update_single_package() { + local pkg_name=$1 + local config=$2 + + # 解析配置 (保持 cut 的方式,假设路径/URL/分支名不含 '=') + # 如果遇到问题,可以切换到 IFS/read + local target_dir repo_url branch use_depth + target_dir=$(echo "$config" | cut -d= -f1) + repo_url=$(echo "$config" | cut -d= -f2) + branch=$(echo "$config" | cut -d= -f3) + use_depth=$(echo "$config" | cut -d= -f4) + + # 基础验证 + if [ -z "$target_dir" ] || [ -z "$repo_url" ]; then + log "ERROR" "包 '$pkg_name' 的配置无效: $config" + return 1 + fi + + log "INFO" "更新自定义包: $pkg_name..." + + # 检查目标目录的父目录是否存在 + local parent_dir + parent_dir=$(dirname "$target_dir") + if [ ! -d "$parent_dir" ]; then + log "INFO" "创建父目录: $parent_dir" + mkdir -p "$parent_dir" || { + log "ERROR" "无法创建父目录: $parent_dir" + return 1 + } + fi + + # 移除现有目录 + if [ -d "$target_dir" ]; then + log "INFO" "移除现有目录: $target_dir" + rm -rf "$target_dir" || { + log "ERROR" "无法删除目录: $target_dir" + return 1 + } + fi + + # 准备 git clone 命令参数数组 (移除 eval) + local git_options=("--progress") # 总是显示进度 + # 处理分支 + if [ -n "$branch" ] && [ "$branch" != "master" ]; then + git_options+=("-b" "$branch") + fi + # 处理 depth + if [ "$use_depth" = "true" ]; then + git_options+=("--depth" "1") + fi + + # 执行克隆 + log "INFO" "执行: git clone ${git_options[*]} $repo_url $target_dir" + if git clone "${git_options[@]}" "$repo_url" "$target_dir"; then + log "INFO" "包 '$pkg_name' 更新成功" + return 0 + else + log "ERROR" "克隆包 '$pkg_name' 失败 (仓库: $repo_url)" + # 尝试给出更具体的错误提示 + log "ERROR" "请检查网络连接、仓库 URL、分支名称以及目标目录权限。" + # 保留可能存在的空目录或部分克隆,让用户检查 + # rm -rf "$target_dir" # 不再自动删除失败的克隆 + return 1 + fi +} + +# 更新所有自定义包的主函数 +update_custom_package() { + local failed_packages=() + local success_count=0 + local total_packages=${#CUSTOM_PACKAGES[@]} + + if [ "$total_packages" -eq 0 ]; then + log "INFO" "没有配置自定义包,跳过更新。" + return 0 + fi + + log "INFO" "开始更新 $total_packages 个自定义包..." + + for pkg_name in "${!CUSTOM_PACKAGES[@]}"; do + # 使用 subshell 执行,避免污染当前环境的变量,但这里影响不大 + if update_single_package "$pkg_name" "${CUSTOM_PACKAGES[$pkg_name]}"; then + ((success_count++)) + else + failed_packages+=("$pkg_name") + fi + done + + # 显示更新结果 + if [ ${#failed_packages[@]} -eq 0 ]; then + log "INFO" "所有自定义包更新成功 ($success_count/$total_packages)" + return 0 + else + log "WARN" "部分自定义包更新失败 (成功: $success_count/$total_packages)" + log "ERROR" "更新失败的包: ${failed_packages[*]}" + return 1 # 返回失败状态码 + fi +} + +# 更新特定自定义包 +update_specific_package() { + local pkg_name=$1 + + if [ -z "$pkg_name" ]; then + log "ERROR" "未指定包名" + return 1 + fi + + if [ -z "${CUSTOM_PACKAGES[$pkg_name]}" ]; then + log "ERROR" "未找到包配置:'$pkg_name'" + log "INFO" "可用的包名: ${!CUSTOM_PACKAGES[*]}" + return 1 + fi + + update_single_package "$pkg_name" "${CUSTOM_PACKAGES[$pkg_name]}" +} + +#---------------基础功能函数---------------# +# 清理工作区 (make clean 的替代方案,更彻底) +clean_workspace() { + log "INFO" "开始彻底清理工作区..." + + # 清理 feeds (可选,如果 feeds 内容经常变动或出问题可以启用) + # log "INFO" "执行 ./scripts/feeds clean ..." + # ./scripts/feeds clean || log "WARN" "./scripts/feeds clean 执行时遇到问题。" + + # 清理编译产物和临时文件 + log "INFO" "执行 rm -rf ./tmp ./logs ./staging_dir ./build_dir ./bin ./dl ..." + # 注意:这里移除了 logs 目录,但我们的脚本日志在 openwrt_logs 下,不会被删 + # 如果 OpenWrt 自身有 logs 目录且需要保留,则从下面移除 ./logs + rm -rf ./tmp ./logs ./staging_dir ./build_dir ./bin ./dl || { + log "ERROR" "删除部分工作区目录失败,请检查权限或文件占用。" + return 1 + } + + log "INFO" "工作区清理完成。" + return 0 +} + +# 清理编译临时文件 (make clean 的快速版) +clean_build_temp() { + log "INFO" "开始清理编译临时文件..." + + log "INFO" "执行 rm -rf ./tmp ./staging_dir ./build_dir ..." + rm -rf ./tmp ./staging_dir ./build_dir || { + log "ERROR" "删除部分编译临时目录失败。" + return 1 + } + + log "INFO" "编译临时文件清理完成。" + return 0 +} + +# 更新源码 +update_source() { + log "INFO" "开始更新 OpenWrt 源码 (git pull)..." + if git pull --rebase; then # 使用 rebase 避免不必要的 merge commit + log "INFO" "源码更新完成" + return 0 + else + log "ERROR" "源码更新失败 (git pull --rebase)" + log "WARN" "请检查本地是否有未提交的修改,或尝试手动解决 Git 冲突。" + return 1 + fi +} + +# 更新并安装 feeds +update_feeds() { + log "INFO" "开始更新 Feeds (update -a)..." + if ./scripts/feeds update -a; then + log "INFO" "Feeds 更新成功,开始安装 (install -a)..." + if ./scripts/feeds install -a; then + log "INFO" "Feeds 安装成功" + return 0 + else + log "ERROR" "Feeds 安装失败 (install -a)" + return 1 + fi + else + log "ERROR" "Feeds 更新失败 (update -a)" + return 1 + fi +} + +# 执行构建相关命令,并将 stdout 重定向到日志,stderr 同时输出到控制台和日志 +run_build_command() { + local cmd=$1 # 要执行的命令字符串 + local log_file=$2 # 目标日志文件 + local description=$3 # 操作描述 + + log_to_both "INFO" "开始执行: $description" "$log_file" + log "DEBUG" "命令详情: $cmd" # 只记录到主日志 + + # 执行命令 + # stdout (>>) 追加到日志文件 + # stderr (2>) 通过管道给 tee + # tee -a "$log_file" 将 stderr 追加到日志文件 + # tee 默认将其标准输入复制到标准输出,这里即脚本的 stderr,因此会显示在控制台 + local start_time end_time duration + start_time=$(date +%s) + if eval "$cmd" >> "$log_file" 2> >(tee -a "$log_file" >&2); then + end_time=$(date +%s) + duration=$((end_time - start_time)) + log_to_both "INFO" "$description 完成 (耗时: ${duration}s)" "$log_file" + return 0 # 成功返回 0 + else + end_time=$(date +%s) + duration=$((end_time - start_time)) + local exit_code=$? # 获取命令的退出码 + # 错误信息已经通过 stderr 的 tee 输出到控制台了 + log_to_both "ERROR" "$description 失败 (退出码: $exit_code, 耗时: ${duration}s)" "$log_file" + log "ERROR" "详细错误请查看控制台输出以及日志文件: $log_file" + return $exit_code # 失败返回命令的退出码 + fi +} + +# 编译固件 +build_firmware() { + # 创建新的固件编译日志文件 + local current_log + current_log=$(create_build_log "firmware") || return 1 # 创建失败则退出 + + log "INFO" "开始编译固件..." + log "INFO" "详细编译日志将保存在: $current_log" + + # 1. 下载依赖包 + local download_cmd="make download -j$(nproc) V=s" + run_build_command "$download_cmd" "$current_log" "下载依赖包" || { + log "ERROR" "依赖包下载失败,编译中止。" + # 即使下载失败,日志文件也已包含错误信息 + return 1 + } + + # 2. 多线程编译 + local cpu_cores + cpu_cores=$(nproc) + log "INFO" "检测到 $cpu_cores 个 CPU 核心,开始多线程编译..." + local build_cmd="make -j${cpu_cores} V=s" + + if run_build_command "$build_cmd" "$current_log" "固件编译 (多线程)"; then + log "INFO" "${GREEN}固件编译成功完成!${NC}" + log "INFO" "固件输出目录: ./bin/targets/" + return 0 # 编译成功 + else + # 多线程编译失败,询问用户是否重试 + log "WARN" "多线程编译失败。" + local retry_choice + # -r: raw input, -p: prompt, -n 1: read only one char (optional but nice), -t 15: timeout (optional) + # Default to No + read -rp "$(echo -e ${YELLOW}"是否尝试使用单线程重新编译? (y/N): "${NC})" -n 1 -t 30 retry_choice + echo # Add a newline after read -n + + if [[ "$retry_choice" =~ ^[Yy]$ ]]; then + log "INFO" "用户选择使用单线程重试编译..." + + # 3. 单线程编译重试 + local build_cmd_single="make -j1 V=s" + if run_build_command "$build_cmd_single" "$current_log" "固件编译 (单线程重试)"; then + log "INFO" "${GREEN}单线程编译成功完成!${NC}" + log "INFO" "固件输出目录: ./bin/targets/" + return 0 # 单线程编译成功 + else + log "ERROR" "${RED}单线程编译也失败了。${NC}" + log "ERROR" "请仔细检查控制台错误输出以及日志文件: $current_log" + return 1 # 最终编译失败 + fi + else + log "INFO" "用户选择不进行单线程重试编译。" + log "ERROR" "${RED}编译失败,未进行单线程重试。${NC}" + log "ERROR" "请仔细检查控制台错误输出以及日志文件: $current_log" + return 1 # 用户取消重试,编译失败 + fi + fi +} + +# 清理配置文件中指定的旧包/目录 +clean_packages() { + log "INFO" "开始清理配置文件中指定的旧包和目录..." + local removed_count=0 + local failed_count=0 + local total_to_remove=$((${#REMOVE_DIRS[@]} + ${#REMOVE_PACKAGES[@]})) + + if [ "$total_to_remove" -eq 0 ]; then + log "INFO" "配置文件中未指定需要移除的包或目录。" + return 0 + fi + + # 清理目录 + for dir in "${REMOVE_DIRS[@]}"; do + if [ -e "$dir" ]; then # 使用 -e 检查文件或目录是否存在 + log "INFO" "正在删除目录: $dir" + if rm -rf "$dir"; then + log "INFO" "已删除: $dir" + ((removed_count++)) + else + log "ERROR" "删除失败: $dir (请检查权限或是否被占用)" + ((failed_count++)) + fi + else + log "WARN" "指定的目录不存在,跳过: $dir" + fi + done + + # 清理包 (通常包也是目录) + for pkg in "${REMOVE_PACKAGES[@]}"; do + if [ -e "$pkg" ]; then + log "INFO" "正在删除包/目录: $pkg" + if rm -rf "$pkg"; then + log "INFO" "已删除: $pkg" + ((removed_count++)) + else + log "ERROR" "删除失败: $pkg (请检查权限或是否被占用)" + ((failed_count++)) + fi + else + log "WARN" "指定的包/目录不存在,跳过: $pkg" + fi + done + + if [ $failed_count -eq 0 ]; then + log "INFO" "旧包/目录清理完成,共处理 $removed_count 个项目。" + return 0 + else + log "WARN" "旧包/目录清理部分完成 (成功: $removed_count, 失败: $failed_count)" + return 1 # 返回失败状态码 + fi +} + +# 更新所有组件 (源码 -> 清理旧包 -> 自定义包 -> feeds) +update_all_components() { + log "INFO" "开始更新所有组件..." + local success=true # 假设成功 + + # 1. 更新源码 + log "INFO" "[1/4] 更新 OpenWrt 源码..." + update_source || success=false + + # 2. 清理旧包 (即使上一步失败也尝试清理) + log "INFO" "[2/4] 清理配置文件指定的旧包/目录..." + clean_packages || log "WARN" "清理旧包/目录时遇到问题,继续执行..." # 清理失败通常不阻止后续 + + # 3. 更新自定义包 (只有在源码更新成功时才执行较好) + if [ "$success" = true ]; then + log "INFO" "[3/4] 更新自定义包..." + update_custom_package || success=false + else + log "WARN" "[3/4] 跳过更新自定义包,因为源码更新失败。" + fi + + # 4. 更新 Feeds (只有在源码和自定义包都成功时执行较好) + if [ "$success" = true ]; then + log "INFO" "[4/4] 更新 Feeds..." + update_feeds || success=false + else + log "WARN" "[4/4] 跳过更新 Feeds,因为之前的步骤失败。" + fi + + # 总结 + if [ "$success" = true ]; then + log "INFO" "所有组件更新完成!" + return 0 + else + log "ERROR" "部分或全部组件更新失败,请检查上面的日志。" + return 1 + fi +} + +# 菜单配置 (make menuconfig) +menuconfig() { + log "INFO" "准备进入菜单配置 (make menuconfig)..." + log "INFO" "注意:日志重定向将暂时禁用以进行交互。" + + # 禁用日志重定向,否则 menuconfig 界面可能显示不正常 + disable_logging + + # 执行 menuconfig + if make menuconfig; then + # 配置成功后重新启用日志 + enable_logging + log "INFO" "菜单配置完成。新配置已保存到 .config" + # 询问是否保存 defconfig (可选) + # read -p "是否将当前配置保存为 defconfig? (y/N): " save_defconfig + # if [[ "$save_defconfig" =~ ^[Yy]$ ]]; then + # ./scripts/diffconfig.sh > my_defconfig + # log "INFO" "当前配置已保存到 my_defconfig" + # fi + return 0 + else + # 配置失败或被取消,也要恢复日志 + enable_logging + log "WARN" "菜单配置未完成或被取消。" + return 1 # 返回失败状态码 + fi +} + +#---------------组合功能函数---------------# +# 完整构建流程 +full_build() { + log "INFO" "启动完整构建流程..." + local step=1 + local total_steps=6 # 预估步骤数 + + # 1. 清理工作区 + log "INFO" "[${step}/${total_steps}] 清理工作区..." + clean_workspace || { log "WARN" "工作区清理可能不完整,尝试继续..."; } # 清理失败通常不致命 + ((step++)) + + # 2. 更新源码 + log "INFO" "[${step}/${total_steps}] 更新源码..." + update_source || { log "ERROR" "源码更新失败,终止构建流程。"; return 1; } + ((step++)) + + # 3. 清理旧包 + log "INFO" "[${step}/${total_steps}] 清理配置文件指定的旧包..." + clean_packages || log "WARN" "清理旧包时遇到问题,继续执行..." + ((step++)) + + # 4. 更新自定义包 + log "INFO" "[${step}/${total_steps}] 更新自定义包..." + update_custom_package || { log "ERROR" "自定义包更新失败,终止构建流程。"; return 1; } + ((step++)) + + # 5. 更新 Feeds + log "INFO" "[${step}/${total_steps}] 更新 Feeds..." + update_feeds || { log "ERROR" "Feeds 更新失败,终止构建流程。"; return 1; } + ((step++)) + + # 6. 菜单配置 + log "INFO" "[${step}/${total_steps}] 进入菜单配置 (make menuconfig)..." + menuconfig || { log "WARN" "菜单配置未完成或取消,但继续尝试编译..."; } # 允许使用现有配置编译 + ((step++)) # 无论成功与否,都算一步 + + # 7. 编译固件 (独立步骤,不计入前面的 total_steps) + log "INFO" "所有准备工作完成,开始编译固件..." + if build_firmware; then + log "INFO" "${GREEN}完整构建流程成功完成!${NC}" + return 0 + else + log "ERROR" "${RED}完整构建流程失败于编译阶段。${NC}" + return 1 + fi +} + +#---------------菜单函数---------------# +# 打印主菜单 +print_menu() { + echo -e "\n${BLUE}======= OpenWrt 构建管理菜单 =======${NC}" + echo -e " ${YELLOW}会话日志目录: ${SESSION_DIR}${NC}" + echo -e "${GREEN} 1.${NC} ${BOLD}完整构建流程${NC} (清理 > 更新源码/包/feeds > 配置 > 编译)" + echo -e "${GREEN} 2.${NC} 清理工作区 (删除 tmp, bin, build_dir 等)" + echo -e "${GREEN} 3.${NC} 更新所有组件 (源码 + 旧包清理 + 自定义包 + feeds)" + echo -e "${GREEN} 4.${NC} 清理配置文件指定的旧包/目录" + echo -e "${GREEN} 5.${NC} ${BOLD}编译固件${NC} (make V=s)" + echo -e "${GREEN} 6.${NC} 调整配置 (make menuconfig)" + echo -e "${GREEN} 7.${NC} 更新所有自定义包" + echo -e "${GREEN} 8.${NC} 更新特定的自定义包" + echo -e "${GREEN} 9.${NC} 更新 OpenWrt 源码 (git pull)" + echo -e "${GREEN}10.${NC} 更新并安装 Feeds" + echo -e "-------------------------------------" + echo -e "${GREEN} 0.${NC} 退出脚本" + echo -e "${BLUE}====================================${NC}" + # 使用 read -p 提供提示 + read -rp "请输入选项 [0-10]: " choice +} + +# 打印并选择特定自定义包进行更新 +select_specific_package() { + local pkg_names=("${!CUSTOM_PACKAGES[@]}") # 获取所有包名 + local num_packages=${#pkg_names[@]} + + if [ "$num_packages" -eq 0 ]; then + log "WARN" "没有配置任何自定义包。" + return 1 + fi + + echo -e "\n${BLUE}--- 选择要更新的自定义包 ---${NC}" + local i=1 + # 使用 sort 命令让包名按字母排序显示 + local sorted_pkg_names=($(printf "%s\n" "${pkg_names[@]}" | sort)) + + for pkg_name in "${sorted_pkg_names[@]}"; do + echo -e " ${GREEN}$i.${NC} $pkg_name" + ((i++)) + done + echo -e " ${GREEN}0.${NC} 返回主菜单" + echo -e "${BLUE}----------------------------${NC}" + + local choice_pkg + read -rp "请输入包的序号 [0-$num_packages]: " choice_pkg + + # 验证选择 + if [[ ! "$choice_pkg" =~ ^[0-9]+$ ]]; then + log "ERROR" "无效输入,请输入数字。" + return 1 + fi + + if [ "$choice_pkg" -eq 0 ]; then + log "INFO" "返回主菜单。" + return 0 # 返回成功,表示正常退出选择 + elif [ "$choice_pkg" -ge 1 ] && [ "$choice_pkg" -le "$num_packages" ]; then + local selected_pkg=${sorted_pkg_names[$((choice_pkg-1))]} + log "INFO" "选择更新包: $selected_pkg" + update_specific_package "$selected_pkg" # 调用更新函数 + return $? # 返回更新函数的执行结果 + else + log "ERROR" "无效的选择序号: $choice_pkg" + return 1 + fi +} + +#---------------主函数---------------# +main() { + # 0. 设置颜色变量 + setup_colors + + # 1. 初始化日志系统 (会进行第一次输出重定向) + init_logger || exit 1 # 初始化失败则退出 + + # 2. 检查运行环境和依赖 + log "INFO" "检查运行环境..." + local dep_missing=false + if [ ! -f "Makefile" ] || [ ! -d "scripts" ] || [ ! -d ".git" ]; then + log "ERROR" "脚本必须在 OpenWrt 源码的根目录下运行 (需要存在 Makefile, scripts, .git)。" + dep_missing=true + fi + for cmd in git make nproc tee cut dirname mkdir rm git date printf sort read; do + if ! command -v "$cmd" &> /dev/null; then + log "ERROR" "缺少必要的系统命令: $cmd" + dep_missing=true + fi + done + if [ "$dep_missing" = true ]; then + log "ERROR" "环境或依赖检查失败,请修正后重试。" + # 恢复原始输出,避免后续可能的错误信息无法显示 + exec >&$STDOUT_ORIG + exec 2>&$STDERR_ORIG + exit 1 + fi + log "INFO" "环境检查通过。" + + # 记录脚本启动信息 + log "INFO" "${BOLD}OpenWrt 构建管理脚本已启动${NC}" + log "INFO" "PID: $$" + log "INFO" "会话日志目录: $SESSION_DIR" + + # 3. 主菜单循环 + local choice # 提前声明 choice + while true; do + print_menu # 显示菜单并获取输入到 choice 变量 + log "DEBUG" "用户选择了: $choice" # 记录用户选择 + + # 根据选择执行操作 + case $choice in + 1) full_build ;; + 2) clean_workspace ;; + 3) update_all_components ;; + 4) clean_packages ;; + 5) build_firmware ;; + 6) menuconfig ;; + 7) update_custom_package ;; + 8) select_specific_package ;; + 9) update_source ;; + 10) update_feeds ;; + 0) + log "INFO" "收到退出命令,正在退出脚本..." + # 恢复原始输出流 (好习惯) + exec >&$STDOUT_ORIG + exec 2>&$STDERR_ORIG + echo -e "${GREEN}脚本已退出。${NC}" + exit 0 + ;; + *) + log "WARN" "无效的选项: '$choice',请输入 0 到 10 之间的数字。" + ;; + esac + + local last_exit_code=$? # 获取上一个命令的退出状态码 + # 操作完成后暂停,给用户查看结果的时间 + if [[ $choice != 0 ]]; then + if [ $last_exit_code -eq 0 ]; then + echo -e "\n${GREEN}操作 '$choice' 执行完成。${NC}" + else + echo -e "\n${RED}操作 '$choice' 执行时遇到错误 (退出码: $last_exit_code)。${NC}" + fi + echo -e "${YELLOW}按 Enter 键返回主菜单...${NC}" + read -r # 等待用户按回车 + fi + done +} + +#---------------脚本入口---------------# +# 将所有主逻辑放入 main 函数,并在最后调用它 +# "$@" 将所有命令行参数传递给 main 函数 (虽然本脚本目前未使用) +main "$@" diff --git a/openwrt_logs/20250408_180935/main_build_script.log b/openwrt_logs/20250408_180935/main_build_script.log new file mode 100644 index 000000000..66c4e5d9d --- /dev/null +++ b/openwrt_logs/20250408_180935/main_build_script.log @@ -0,0 +1,56 @@ +[2025-04-08 18:09:35] [INFO]: 日志系统初始化完成。主日志文件: openwrt_logs/20250408_180935/main_build_script.log +[2025-04-08 18:09:35] [INFO ]: 检查运行环境... +[2025-04-08 18:09:35] [INFO ]: 环境检查通过。 +[2025-04-08 18:09:35] [INFO ]: OpenWrt 构建管理脚本已启动\033[0m +[2025-04-08 18:09:35] [INFO ]: PID: 2874378 +[2025-04-08 18:09:35] [INFO ]: 会话日志目录: openwrt_logs/20250408_180935 + +======= OpenWrt 构建管理菜单 ======= + 会话日志目录: openwrt_logs/20250408_180935 + 1. 完整构建流程 (清理 > 更新源码/包/feeds > 配置 > 编译) + 2. 清理工作区 (删除 tmp, bin, build_dir 等) + 3. 更新所有组件 (源码 + 旧包清理 + 自定义包 + feeds) + 4. 清理配置文件指定的旧包/目录 + 5. 编译固件 (make V=s) + 6. 调整配置 (make menuconfig) + 7. 更新所有自定义包 + 8. 更新特定的自定义包 + 9. 更新 OpenWrt 源码 (git pull) +10. 更新并安装 Feeds +------------------------------------- + 0. 退出脚本 +==================================== +请输入选项 [0-10]: [2025-04-08 18:09:36] [DEBUG]: 用户选择了: 1 +[2025-04-08 18:09:36] [INFO ]: 启动完整构建流程... +[2025-04-08 18:09:36] [INFO ]: [1/6] 清理工作区... +[2025-04-08 18:09:36] [INFO ]: 开始彻底清理工作区... +[2025-04-08 18:09:36] [INFO ]: 执行 rm -rf ./tmp ./logs ./staging_dir ./build_dir ./bin ./dl ... +[2025-04-08 18:09:36] [INFO ]: 工作区清理完成。 +[2025-04-08 18:09:36] [INFO ]: [2/6] 更新源码... +[2025-04-08 18:09:36] [INFO ]: 开始更新 OpenWrt 源码 (git pull)... +error: cannot pull with rebase: You have unstaged changes. +error: Please commit or stash them. +[2025-04-08 18:09:36] [ERROR]: 源码更新失败 (git pull --rebase) +[2025-04-08 18:09:36] [WARN ]: 请检查本地是否有未提交的修改,或尝试手动解决 Git 冲突。 +[2025-04-08 18:09:36] [ERROR]: 源码更新失败,终止构建流程。 + +操作 '1' 执行时遇到错误 (退出码: 1)。 +按 Enter 键返回主菜单... + +======= OpenWrt 构建管理菜单 ======= + 会话日志目录: openwrt_logs/20250408_180935 + 1. 完整构建流程 (清理 > 更新源码/包/feeds > 配置 > 编译) + 2. 清理工作区 (删除 tmp, bin, build_dir 等) + 3. 更新所有组件 (源码 + 旧包清理 + 自定义包 + feeds) + 4. 清理配置文件指定的旧包/目录 + 5. 编译固件 (make V=s) + 6. 调整配置 (make menuconfig) + 7. 更新所有自定义包 + 8. 更新特定的自定义包 + 9. 更新 OpenWrt 源码 (git pull) +10. 更新并安装 Feeds +------------------------------------- + 0. 退出脚本 +==================================== +请输入选项 [0-10]: [2025-04-08 18:09:40] [DEBUG]: 用户选择了: 0 +[2025-04-08 18:09:40] [INFO ]: 收到退出命令,正在退出脚本... diff --git a/package/boot/uboot-rockchip/Makefile b/package/boot/uboot-rockchip/Makefile index 91f885c8f..982467cde 100644 --- a/package/boot/uboot-rockchip/Makefile +++ b/package/boot/uboot-rockchip/Makefile @@ -232,6 +232,13 @@ define U-Boot/lubancat-4-rk3588s embedfire_lubancat-4 endef +define U-Boot/photonicat-rk3568 + $(U-Boot/rk3568/Default) + NAME:=Photonicat + BUILD_DEVICES:= \ + ariaboard_photonicat +endef + UBOOT_TARGETS := \ doornet1-rk3328 \ doornet2-rk3399 \ @@ -255,7 +262,8 @@ UBOOT_TARGETS := \ opc-h68k-rk3568 \ opc-h69k-rk3568 \ zero-3e-rk3566 \ - h88k-rk3588 + h88k-rk3588 \ + photonicat-rk3568 UBOOT_CONFIGURE_VARS += USE_PRIVATE_LIBGCC=yes diff --git a/package/boot/uboot-rockchip/patches/200-add-photonicat-board-watchdog-support.patch b/package/boot/uboot-rockchip/patches/200-add-photonicat-board-watchdog-support.patch new file mode 100644 index 000000000..8016fa105 --- /dev/null +++ b/package/boot/uboot-rockchip/patches/200-add-photonicat-board-watchdog-support.patch @@ -0,0 +1,20 @@ +--- a/drivers/watchdog/Makefile ++++ b/drivers/watchdog/Makefile +@@ -50,3 +50,4 @@ obj-$(CONFIG_WDT_STM32MP) += stm32mp_wdt + obj-$(CONFIG_WDT_SUNXI) += sunxi_wdt.o + obj-$(CONFIG_WDT_TANGIER) += tangier_wdt.o + obj-$(CONFIG_WDT_XILINX) += xilinx_wwdt.o ++obj-$(CONFIG_WDT_PCAT) += pcat_wdt.o +--- a/drivers/watchdog/Kconfig ++++ b/drivers/watchdog/Kconfig +@@ -421,4 +421,10 @@ config WDT_FTWDT010 + help + Faraday Technology ftwdt010 watchdog is an architecture independent + watchdog. It is usually used in SoC chip design. ++ ++config WDT_PCAT ++ bool "photonicat board watchdog support" ++ depends on WDT && SERIAL && DM ++ help ++ Select this to enable watchdog timer on photonicat board. + endmenu diff --git a/package/boot/uboot-rockchip/patches/900-arm-add-dts-files.patch b/package/boot/uboot-rockchip/patches/900-arm-add-dts-files.patch index 7e077fc4e..8b7077ae0 100644 --- a/package/boot/uboot-rockchip/patches/900-arm-add-dts-files.patch +++ b/package/boot/uboot-rockchip/patches/900-arm-add-dts-files.patch @@ -8,3 +8,6 @@ rk3399-orangepi.dtb \ rk3399-pinebook-pro.dtb \ rk3399-pinephone-pro.dtb \ + ++dtb-$(CONFIG_ROCKCHIP_RK3568) += \ ++ rk3568-photonicat.dtb \ No newline at end of file diff --git a/package/boot/uboot-rockchip/src/arch/arm/dts/rk3568-photonicat-u-boot.dtsi b/package/boot/uboot-rockchip/src/arch/arm/dts/rk3568-photonicat-u-boot.dtsi new file mode 100644 index 000000000..2df97d1c5 --- /dev/null +++ b/package/boot/uboot-rockchip/src/arch/arm/dts/rk3568-photonicat-u-boot.dtsi @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: GPL-2.0-or-later OR MIT + +#include "rk356x-u-boot.dtsi" + +/ { + chosen { + stdout-path = &uart2; + }; + + pcat-wdt { + compatible = "linux,wdt-pcat"; + port = <&uart4>; + status = "okay"; + }; +}; + +&gpio0 { + bootph-pre-ram; +}; + +&sdhci { + cap-mmc-highspeed; + mmc-hs200-1_8v; + mmc-hs400-1_8v; + mmc-hs400-enhanced-strobe; + pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd &emmc_datastrobe>; +}; + +&uart2 { + clock-frequency = <24000000>; + bootph-all; + status = "okay"; +}; + +&vcc3v3_sd { + bootph-pre-ram; +}; diff --git a/package/boot/uboot-rockchip/src/arch/arm/dts/rk3568-photonicat.dts b/package/boot/uboot-rockchip/src/arch/arm/dts/rk3568-photonicat.dts new file mode 100644 index 000000000..0e89bc535 --- /dev/null +++ b/package/boot/uboot-rockchip/src/arch/arm/dts/rk3568-photonicat.dts @@ -0,0 +1,567 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/dts-v1/; +#include +#include +#include +#include +#include "rk3568.dtsi" + +/ { + model = "Ariaboard Photonicat"; + compatible = "ariaboard,photonicat", "rockchip,rk3568"; + + aliases { + ethernet1 = &gmac1; + mmc0 = &sdhci; + mmc1 = &sdmmc0; + mmc2 = &sdmmc1; + }; + + chosen: chosen { + stdout-path = "serial2:1500000n8"; + }; + + gpio-poweroff { + compatible = "gpio-poweroff"; + gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; + timeout-ms = <3000>; + }; + + hdmi-con { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_con_in: endpoint { + remote-endpoint = <&hdmi_out_con>; + }; + }; + }; + + modem-rfkill { + compatible = "rfkill-gpio"; + label = "modem-rfkill"; + radio-type = "wwan"; + reset-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_LOW>; + shutdown-gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + clocks = <&pmucru CLK_RTC_32K>; + clock-names = "ext_clock"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable_h &clk32k_out1>; + reset-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>; + }; + + vcc_sysin: vcc-sysin-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc_sysin"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; + + vcc_syson: vcc-syson-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc_syson"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc_sysin>; + }; + + vcc3v3_sys: vcc3v3-sys-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_syson>; + }; + + vcc_1v8: vcc-1v8-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc_1v8"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc3v3_sys>; + }; + + vcc_3v3: vcc-3v3-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc3v3_sys>; + }; + + vcc3v3_ngff: vcc3v3-ngff-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>; + regulator-name = "vcc3v3_ngff"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + }; + + /* pi6c pcie clock generator */ + vcc3v3_pi6c: vcc3v3-pi6c-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&pcie_enable_h>; + regulator-name = "vcc3v3_pi6c"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_syson>; + }; + + /* actually fed by vcc_syson, dependent on pi6c clock generator */ + vcc3v3_pcie: vcc3v3-pcie-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_pcie"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc3v3_pi6c>; + }; + + vcc3v3_sd: vcc3v3-sd-regulator { + compatible = "regulator-fixed"; + gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc_sd_h>; + regulator-boot-on; + regulator-name = "vcc3v3_sd"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_3v3>; + }; + + vcc5v0_boost: vcc5v0-boost-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_boost_en>; + regulator-name = "vcc5v0_boost"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; + + vcc5v0_usb_otg: vcc5v0-usb-otg-regulator { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_usb_otg_en>; + regulator-name = "vcc5v0_usb_otg"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc_sysin>; + }; + + vcca_1v8: vcca-1v8-regulator { + compatible = "regulator-fixed"; + regulator-name = "vcca_1v8"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc3v3_sys>; + }; + + vdda_0v9: vdda-0v9-regulator { + compatible = "regulator-fixed"; + regulator-name = "vdda_0v9"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc3v3_sys>; + }; + + vdd_gpu: vdd-gpu-regulator { + compatible = "pwm-regulator"; + pwms = <&pwm2 0 5000 1>; + regulator-name = "vdd_gpu"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <900000>; + regulator-min-microvolt = <800000>; + regulator-max-microvolt = <1350000>; + regulator-ramp-delay = <6001>; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc_syson>; + }; + + vdd_logic: vdd-logic-regulator { + compatible = "pwm-regulator"; + pwms = <&pwm1 0 5000 1>; + regulator-name = "vdd_logic"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <900000>; + regulator-min-microvolt = <500000>; + regulator-max-microvolt = <1350000>; + regulator-ramp-delay = <6001>; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc_syson>; + }; +}; + +&combphy0 { + status = "okay"; +}; + +&combphy1 { + status = "okay"; +}; + +&combphy2 { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu1 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu2 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu3 { + cpu-supply = <&vdd_cpu>; +}; + +&gmac1 { + assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>; + assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>; + assigned-clock-rates = <0>, <125000000>; + clock_in_out = "output"; + phy-handle = <&rgmii_phy>; + phy-mode = "rgmii"; + phy-supply = <&vcc_3v3>; + pinctrl-names = "default"; + pinctrl-0 = <&gmac1m1_miim + &gmac1m1_tx_bus2 + &gmac1m1_rx_bus2 + &gmac1m1_rgmii_clk + &gmac1m1_rgmii_bus>; + snps,reset-gpio = <&gpio4 RK_PC0 GPIO_ACTIVE_LOW>; + snps,reset-active-low; + snps,reset-delays-us = <0 15000 50000>; + tx_delay = <0x30>; + rx_delay = <0x10>; + status = "okay"; +}; + +&gpu { + mali-supply = <&vdd_gpu>; + status = "okay"; +}; + +&hdmi { + avdd-0v9-supply = <&vdda_0v9>; + avdd-1v8-supply = <&vcca_1v8>; + status = "okay"; +}; + +&hdmi_in { + hdmi_in_vp0: endpoint { + remote-endpoint = <&vp0_out_hdmi>; + }; +}; + +&hdmi_out { + hdmi_out_con: endpoint { + remote-endpoint = <&hdmi_con_in>; + }; +}; + +&hdmi_sound { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + + vdd_cpu: regulator@1c { + compatible = "tcs,tcs4525"; + reg = <0x1c>; + fcs,suspend-voltage-selector = <1>; + regulator-name = "vdd_cpu"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <900000>; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1390000>; + regulator-ramp-delay = <2300>; + vin-supply = <&vcc_syson>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; +}; + +&i2c2 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c2m1_xfer>; + status = "okay"; +}; + +&i2s0_8ch { + status = "okay"; +}; + +&mdio1 { + rgmii_phy: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0>; + }; +}; + +&pcie30phy { + phy-supply = <&vcc3v3_pi6c>; + status = "okay"; +}; + +&pcie3x2 { + reset-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie>; + status = "okay"; +}; + +&pinctrl { + bt { + bt_enable_h: bt-enable-h { + rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + pcie { + pcie_enable_h: pcie-enable-h { + rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + sdio-pwrseq { + wifi_enable_h: wifi-enable-h { + rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + usb { + vcc5v0_boost_en: vcc5v0-boost-en { + rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + vcc5v0_usb_otg_en: vcc5v0-usb-otg-en { + rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + vcc-sd { + vcc_sd_h: vcc-sd-h { + rockchip,pins = <0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&pmu_io_domains { + pmuio1-supply = <&vcc_3v3>; + pmuio2-supply = <&vcc_3v3>; + vccio1-supply = <&vcc_3v3>; + vccio3-supply = <&vcc_3v3>; + vccio4-supply = <&vcc_1v8>; + vccio5-supply = <&vcc_3v3>; + vccio6-supply = <&vcc_3v3>; + vccio7-supply = <&vcc_3v3>; + status = "okay"; +}; + +&pwm1 { + status = "okay"; +}; + +&pwm2 { + status = "okay"; +}; + +&saradc { + vref-supply = <&vcca_1v8>; + status = "okay"; +}; + +&sdhci { + bus-width = <8>; + max-frequency = <200000000>; + non-removable; + pinctrl-names = "default"; + pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&vcc_1v8>; + status = "okay"; +}; + +&sdmmc0 { + bus-width = <4>; + cap-sd-highspeed; + cd-gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_LOW>; + disable-wp; + no-1-8-v; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd>; + vmmc-supply = <&vcc3v3_sd>; + vqmmc-supply = <&vcc_3v3>; + status = "okay"; +}; + +&sdmmc1 { + bus-width = <4>; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + mmc-pwrseq = <&sdio_pwrseq>; + non-removable; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_clk &sdmmc1_cmd>; + sd-uhs-sdr25; + sd-uhs-sdr50; + sd-uhs-sdr104; + vmmc-supply = <&vcc3v3_sys>; + vqmmc-supply = <&vcc_1v8>; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + wifi@1 { + reg = <1>; + interrupt-parent = <&gpio2>; + interrupts = ; + interrupt-names = "host-wake"; + }; +}; + +&tsadc { + rockchip,hw-tshut-mode = <1>; + rockchip,hw-tshut-polarity = <0>; + status = "okay"; +}; + +&uart1 { + pinctrl-names = "default"; + pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn &uart1m0_rtsn>; + status = "okay"; + uart-has-rtscts; + + bluetooth { + compatible = "qcom,qca9377-bt"; + enable-gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; + clocks = <&pmucru CLK_RTC_32K>; + clock-names = "lpo"; + pinctrl-names = "default"; + pinctrl-0 = <&bt_enable_h>; + vddio-supply = <&vcc_1v8>; + }; +}; + +&uart2 { + status = "okay"; +}; + +&uart3 { + status = "okay"; +}; + +&uart4 { + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usb_host0_xhci { + dr_mode = "host"; + extcon = <&usb2phy0>; + status = "okay"; +}; + +&usb_host1_ehci { + status = "okay"; +}; + +&usb_host1_ohci { + status = "okay"; +}; + +&usb_host1_xhci { + status = "okay"; +}; + +&usb2phy0 { + status = "okay"; +}; + +&usb2phy0_host { + phy-supply = <&vcc3v3_ngff>; + status = "okay"; +}; + +&usb2phy0_otg { + phy-supply = <&vcc5v0_usb_otg>; + status = "okay"; +}; + +&usb2phy1 { + status = "okay"; +}; + +&usb2phy1_otg { + phy-supply = <&vcc5v0_usb_otg>; + status = "okay"; +}; + +&vop { + assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; + assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; + status = "okay"; +}; + +&vop_mmu { + status = "okay"; +}; + +&vp0 { + vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { + reg = ; + remote-endpoint = <&hdmi_in_vp0>; + }; +}; + +&xin32k { + pinctrl-names = "default"; + pinctrl-0 = <&clk32k_out1>; +}; diff --git a/package/boot/uboot-rockchip/src/configs/photonicat-rk3568_defconfig b/package/boot/uboot-rockchip/src/configs/photonicat-rk3568_defconfig new file mode 100644 index 000000000..0a29d1057 --- /dev/null +++ b/package/boot/uboot-rockchip/src/configs/photonicat-rk3568_defconfig @@ -0,0 +1,78 @@ +CONFIG_ARM=y +CONFIG_SKIP_LOWLEVEL_INIT=y +CONFIG_COUNTER_FREQUENCY=24000000 +CONFIG_ARCH_ROCKCHIP=y +CONFIG_SPL_GPIO=y +CONFIG_DEFAULT_DEVICE_TREE="rk3568-photonicat" +CONFIG_ROCKCHIP_RK3568=y +CONFIG_SPL_SERIAL=y +CONFIG_DEBUG_UART_BASE=0xFE660000 +CONFIG_DEBUG_UART_CLOCK=24000000 +CONFIG_SYS_LOAD_ADDR=0xc00800 +CONFIG_PCI=y +CONFIG_DEBUG_UART=y +CONFIG_FIT=y +CONFIG_FIT_VERBOSE=y +CONFIG_SPL_FIT_SIGNATURE=y +CONFIG_SPL_LOAD_FIT=y +CONFIG_LEGACY_IMAGE_FORMAT=y +CONFIG_DEFAULT_FDT_FILE="rockchip/rk3568-photonicat.dtb" +# CONFIG_DISPLAY_CPUINFO is not set +CONFIG_DISPLAY_BOARDINFO_LATE=y +CONFIG_SPL_MAX_SIZE=0x40000 +CONFIG_SPL_PAD_TO=0x7f8000 +# CONFIG_SPL_RAW_IMAGE_SUPPORT is not set +CONFIG_SPL_ATF=y +CONFIG_CMD_GPIO=y +CONFIG_CMD_GPT=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MMC=y +CONFIG_CMD_PCI=y +CONFIG_CMD_USB=y +CONFIG_CMD_WDT=y +CONFIG_CMD_REGULATOR=y +# CONFIG_SPL_DOS_PARTITION is not set +CONFIG_SPL_OF_CONTROL=y +# CONFIG_OF_UPSTREAM is not set +CONFIG_OF_LIVE=y +CONFIG_OF_SPL_REMOVE_PROPS="clock-names interrupt-parent assigned-clocks assigned-clock-rates assigned-clock-parents" +CONFIG_SPL_DM_SEQ_ALIAS=y +CONFIG_SPL_REGMAP=y +CONFIG_SPL_SYSCON=y +CONFIG_SPL_CLK=y +CONFIG_ROCKCHIP_GPIO=y +CONFIG_SYS_I2C_ROCKCHIP=y +CONFIG_MISC=y +CONFIG_SUPPORT_EMMC_RPMB=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_ROCKCHIP=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_MMC_SDHCI_ROCKCHIP=y +CONFIG_PHY_MOTORCOMM=y +CONFIG_DWC_ETH_QOS=y +CONFIG_DWC_ETH_QOS_ROCKCHIP=y +CONFIG_NVME_PCI=y +CONFIG_PCIE_DW_ROCKCHIP=y +CONFIG_PHY_ROCKCHIP_INNO_USB2=y +CONFIG_PHY_ROCKCHIP_NANENG_COMBOPHY=y +CONFIG_SPL_PINCTRL=y +CONFIG_PWM_ROCKCHIP=y +CONFIG_SPL_RAM=y +CONFIG_RESET_SCMI=y +CONFIG_BAUDRATE=1500000 +CONFIG_DEBUG_UART_SHIFT=2 +CONFIG_SYS_NS16550_MEM32=y +CONFIG_SYSRESET=y +CONFIG_USB=y +CONFIG_USB_XHCI_HCD=y +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI_GENERIC=y +CONFIG_USB_OHCI_HCD=y +CONFIG_USB_OHCI_GENERIC=y +CONFIG_USB_DWC3=y +CONFIG_USB_DWC3_GENERIC=y +# CONFIG_WATCHDOG_AUTOSTART is not set +CONFIG_WDT=y +CONFIG_WDT_PCAT=y +CONFIG_ERRNO_STR=y diff --git a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network index e82d4656a..8c559e1d4 100755 --- a/target/linux/rockchip/armv8/base-files/etc/board.d/02_network +++ b/target/linux/rockchip/armv8/base-files/etc/board.d/02_network @@ -8,6 +8,7 @@ rockchip_setup_interfaces() local board="$1" case "$board" in + ariaboard,photonicat|\ embedfire,doornet1|\ embedfire,doornet2|\ embedfire,lubancat-1n|\ diff --git a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity index e769458f6..7f110fc1b 100644 --- a/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity +++ b/target/linux/rockchip/armv8/base-files/etc/hotplug.d/net/40-net-smp-affinity @@ -48,6 +48,10 @@ sysctl -w net.netfilter.nf_conntrack_max=629536 sysctl -w net.netfilter.nf_conntrack_buckets=32384 case "$(board_name)" in +ariaboard,photonicat) + set_interface_core 2 "eth0" + set_interface_core 4 "eth1" + ;; embedfire,doornet1|\ friendlyarm,nanopi-r2c|\ friendlyarm,nanopi-r2s) diff --git a/target/linux/rockchip/armv8/base-files/etc/init.d/reload-sdio-wifi b/target/linux/rockchip/armv8/base-files/etc/init.d/reload-sdio-wifi new file mode 100644 index 000000000..73a7919d0 --- /dev/null +++ b/target/linux/rockchip/armv8/base-files/etc/init.d/reload-sdio-wifi @@ -0,0 +1,17 @@ +#!/bin/sh /etc/rc.common + +START=99 + +boot() { + case "$(board_name)" in + ariaboard,photonicat) + ( sleep 15s; wifi; ) & + ;; + armsom,sige3) + ( sleep 50s; wifi; ) & + ;; + armsom,sige7) + ( sleep 100s; wifi; ) & + ;; + esac +} diff --git a/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-photonicat.dts b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-photonicat.dts new file mode 100644 index 000000000..45086f7ab --- /dev/null +++ b/target/linux/rockchip/files/arch/arm64/boot/dts/rockchip/rk3568-photonicat.dts @@ -0,0 +1,613 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) + +/dts-v1/; +#include +#include +#include +#include +#include "rk3568.dtsi" + +/ { + model = "Ariaboard Photonicat"; + compatible = "ariaboard,photonicat", "rockchip,rk3568"; + + aliases { + ethernet0 = &gmac0; + ethernet1 = &gmac1; + mmc0 = &sdhci; + mmc1 = &sdmmc0; + mmc2 = &sdmmc1; + }; + + chosen: chosen { + stdout-path = "serial2:1500000n8"; + }; + + gpio-poweroff { + compatible = "gpio-poweroff"; + gpios = <&gpio1 RK_PB2 GPIO_ACTIVE_LOW>; + timeout-ms = <3000>; + }; + + hdmi-con { + compatible = "hdmi-connector"; + type = "a"; + + port { + hdmi_con_in: endpoint { + remote-endpoint = <&hdmi_out_con>; + }; + }; + }; + + modem-rfkill { + compatible = "rfkill-gpio"; + label = "modem-rfkill"; + radio-type = "wwan"; + reset-gpios = <&gpio0 RK_PB0 GPIO_ACTIVE_LOW>; + shutdown-gpios = <&gpio4 RK_PC4 GPIO_ACTIVE_HIGH>; + }; + + sdio_pwrseq: sdio-pwrseq { + compatible = "mmc-pwrseq-simple"; + clocks = <&pmucru CLK_RTC_32K>; + clock-names = "ext_clock"; + pinctrl-names = "default"; + pinctrl-0 = <&wifi_enable_h &clk32k_out1>; + reset-gpios = <&gpio2 RK_PB1 GPIO_ACTIVE_LOW>; + }; + + vccin_5v: regulator-vccin-5v { + compatible = "regulator-fixed"; + regulator-name = "vccin_5v"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + }; + + vcc_sysin: regulator-vcc-sysin { + compatible = "regulator-fixed"; + regulator-name = "vcc_sysin"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vccin_5v>; + }; + + vcc_syson: regulator-vcc-syson { + compatible = "regulator-fixed"; + regulator-name = "vcc_syson"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc_sysin>; + }; + + vcc3v3_sys: regulator-vcc3v3-sys { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_sys"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_syson>; + }; + + vcc_1v8: regulator-vcc-1v8 { + compatible = "regulator-fixed"; + regulator-name = "vcc_1v8"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc3v3_sys>; + }; + + vcc_3v3: regulator-vcc-3v3 { + compatible = "regulator-fixed"; + regulator-name = "vcc_3v3"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc3v3_sys>; + }; + + vcc3v3_ngff: regulator-vcc3v3-ngff { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio4 RK_PC2 GPIO_ACTIVE_HIGH>; + regulator-name = "vcc3v3_ngff"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vccin_5v>; + }; + + /* pi6c pcie clock generator */ + vcc3v3_pi6c: regulator-vcc3v3-pi6c { + compatible = "regulator-fixed"; + enable-active-high; + gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&pcie_enable_h>; + regulator-name = "vcc3v3_pi6c"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_syson>; + }; + + /* actually fed by vcc_syson, dependent on pi6c clock generator */ + vcc3v3_pcie: regulator-vcc3v3-pcie { + compatible = "regulator-fixed"; + regulator-name = "vcc3v3_pcie"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc3v3_pi6c>; + }; + + vcc3v3_sd: regulator-vcc3v3-sd { + compatible = "regulator-fixed"; + gpio = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc_sd_h>; + regulator-boot-on; + regulator-name = "vcc3v3_sd"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + vin-supply = <&vcc_3v3>; + }; + + /* actually fed by vccin_5v, dependent on vcc5v0_usb_otg */ + vcc5v0_boost: regulator-vcc5v0-boost { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio4 RK_PD2 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_boost_en>; + regulator-name = "vcc5v0_boost"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vcc5v0_usb_otg>; + }; + + vcc5v0_usb_otg: regulator-vcc5v0-usb-otg { + compatible = "regulator-fixed"; + enable-active-high; + gpio = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>; + pinctrl-names = "default"; + pinctrl-0 = <&vcc5v0_usb_otg_en>; + regulator-name = "vcc5v0_usb_otg"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + vin-supply = <&vccin_5v>; + }; + + vcca_1v8: regulator-vcca-1v8 { + compatible = "regulator-fixed"; + regulator-name = "vcca_1v8"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <1800000>; + regulator-max-microvolt = <1800000>; + vin-supply = <&vcc3v3_sys>; + }; + + vdda_0v9: regulator-vdda-0v9 { + compatible = "regulator-fixed"; + regulator-name = "vdda_0v9"; + regulator-always-on; + regulator-boot-on; + regulator-min-microvolt = <900000>; + regulator-max-microvolt = <900000>; + vin-supply = <&vcc3v3_sys>; + }; + + vdd_gpu: regulator-vdd-gpu { + compatible = "pwm-regulator"; + pwms = <&pwm2 0 5000 1>; + regulator-name = "vdd_gpu"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <900000>; + regulator-min-microvolt = <800000>; + regulator-max-microvolt = <1350000>; + regulator-ramp-delay = <6001>; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc_syson>; + }; + + vdd_logic: regulator-vdd-logic { + compatible = "pwm-regulator"; + pwms = <&pwm1 0 5000 1>; + regulator-name = "vdd_logic"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <900000>; + regulator-min-microvolt = <500000>; + regulator-max-microvolt = <1350000>; + regulator-ramp-delay = <6001>; + regulator-settling-time-up-us = <250>; + pwm-supply = <&vcc_syson>; + }; +}; + +&combphy0 { + status = "okay"; +}; + +&combphy1 { + status = "okay"; +}; + +&combphy2 { + status = "okay"; +}; + +&cpu0 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu1 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu2 { + cpu-supply = <&vdd_cpu>; +}; + +&cpu3 { + cpu-supply = <&vdd_cpu>; +}; + +&gmac0 { + assigned-clocks = <&cru SCLK_GMAC0_RX_TX>; + assigned-clock-parents = <&gmac0_xpcsclk>; + power-domains = <&power RK3568_PD_PIPE>; + phys = <&combphy2 PHY_TYPE_SGMII>; + phy-handle = <&sgmii_phy>; + phy-mode = "sgmii"; + phy-supply = <&vcc_3v3>; + pinctrl-names = "default"; + pinctrl-0 = <&gmac0_miim>; + rockchip,xpcs = <&xpcs>; + snps,reset-gpio = <&gpio3 RK_PC6 GPIO_ACTIVE_LOW>; + snps,reset-active-low; + snps,reset-delays-us = <0 15000 50000>; + tx_delay = <0xff>; + rx_delay = <0xff>; + status = "okay"; +}; + +&gmac1 { + assigned-clocks = <&cru SCLK_GMAC1_RX_TX>, <&cru SCLK_GMAC1>; + assigned-clock-parents = <&cru SCLK_GMAC1_RGMII_SPEED>; + assigned-clock-rates = <0>, <125000000>; + clock_in_out = "output"; + phy-handle = <&rgmii_phy>; + phy-mode = "rgmii"; + phy-supply = <&vcc_3v3>; + pinctrl-names = "default"; + pinctrl-0 = <&gmac1m1_miim + &gmac1m1_tx_bus2 + &gmac1m1_rx_bus2 + &gmac1m1_rgmii_clk + &gmac1m1_rgmii_bus>; + snps,reset-gpio = <&gpio4 RK_PC0 GPIO_ACTIVE_LOW>; + snps,reset-active-low; + snps,reset-delays-us = <0 15000 50000>; + tx_delay = <0x30>; + rx_delay = <0x10>; + status = "okay"; +}; + +&gpu { + mali-supply = <&vdd_gpu>; + status = "okay"; +}; + +&hdmi { + avdd-0v9-supply = <&vdda_0v9>; + avdd-1v8-supply = <&vcca_1v8>; + status = "okay"; +}; + +&hdmi_in { + hdmi_in_vp0: endpoint { + remote-endpoint = <&vp0_out_hdmi>; + }; +}; + +&hdmi_out { + hdmi_out_con: endpoint { + remote-endpoint = <&hdmi_con_in>; + }; +}; + +&hdmi_sound { + status = "okay"; +}; + +&i2c0 { + status = "okay"; + + vdd_cpu: regulator@1c { + compatible = "tcs,tcs4525"; + reg = <0x1c>; + fcs,suspend-voltage-selector = <1>; + regulator-name = "vdd_cpu"; + regulator-always-on; + regulator-boot-on; + regulator-init-microvolt = <900000>; + regulator-min-microvolt = <712500>; + regulator-max-microvolt = <1390000>; + regulator-ramp-delay = <2300>; + vin-supply = <&vcc_syson>; + + regulator-state-mem { + regulator-off-in-suspend; + }; + }; +}; + +&i2c2 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c2m1_xfer>; + status = "okay"; +}; + +&i2s0_8ch { + status = "okay"; +}; + +&mdio0 { + sgmii_phy: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0>; + motorcomm,led-data = <0xe004 0x0000 0x2600 0x0070 0x000a>; + }; +}; + +&mdio1 { + rgmii_phy: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0>; + motorcomm,led-data = <0xe004 0x0000 0x2600 0x0070 0x000a>; + }; +}; + +&pcie30phy { + phy-supply = <&vcc3v3_pi6c>; + status = "okay"; +}; + +&pcie3x2 { + reset-gpios = <&gpio0 RK_PC3 GPIO_ACTIVE_HIGH>; + vpcie3v3-supply = <&vcc3v3_pcie>; + status = "okay"; +}; + +&pinctrl { + bt { + bt_enable_h: bt-enable-h { + rockchip,pins = <2 RK_PB7 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + pcie { + pcie_enable_h: pcie-enable-h { + rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + sdio-pwrseq { + wifi_enable_h: wifi-enable-h { + rockchip,pins = <2 RK_PB1 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + usb { + vcc5v0_boost_en: vcc5v0-boost-en { + rockchip,pins = <4 RK_PD2 RK_FUNC_GPIO &pcfg_pull_none>; + }; + + vcc5v0_usb_otg_en: vcc5v0-usb-otg-en { + rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + + vcc-sd { + vcc_sd_h: vcc-sd-h { + rockchip,pins = <0 RK_PB6 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; +}; + +&pmu_io_domains { + pmuio1-supply = <&vcc_3v3>; + pmuio2-supply = <&vcc_3v3>; + vccio1-supply = <&vcc_3v3>; + vccio3-supply = <&vcc_3v3>; + vccio4-supply = <&vcc_1v8>; + vccio5-supply = <&vcc_3v3>; + vccio6-supply = <&vcc_3v3>; + vccio7-supply = <&vcc_3v3>; + status = "okay"; +}; + +&pwm1 { + status = "okay"; +}; + +&pwm2 { + status = "okay"; +}; + +&saradc { + vref-supply = <&vcca_1v8>; + status = "okay"; +}; + +&sdhci { + bus-width = <8>; + max-frequency = <200000000>; + non-removable; + pinctrl-names = "default"; + pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd>; + vmmc-supply = <&vcc_3v3>; + vqmmc-supply = <&vcc_1v8>; + status = "okay"; +}; + +&sdmmc0 { + bus-width = <4>; + cap-sd-highspeed; + cd-gpios = <&gpio0 RK_PB5 GPIO_ACTIVE_LOW>; + disable-wp; + no-1-8-v; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc0_bus4 &sdmmc0_clk &sdmmc0_cmd>; + vmmc-supply = <&vcc3v3_sd>; + vqmmc-supply = <&vcc_3v3>; + status = "okay"; +}; + +&sdmmc1 { + bus-width = <4>; + cap-sd-highspeed; + cap-sdio-irq; + keep-power-in-suspend; + mmc-pwrseq = <&sdio_pwrseq>; + non-removable; + pinctrl-names = "default"; + pinctrl-0 = <&sdmmc1_bus4 &sdmmc1_clk &sdmmc1_cmd>; + sd-uhs-sdr25; + sd-uhs-sdr50; + sd-uhs-sdr104; + vmmc-supply = <&vcc3v3_sys>; + vqmmc-supply = <&vcc_1v8>; + #address-cells = <1>; + #size-cells = <0>; + status = "okay"; + + wifi@1 { + reg = <1>; + interrupt-parent = <&gpio2>; + interrupts = ; + interrupt-names = "host-wake"; + }; +}; + +&tsadc { + rockchip,hw-tshut-mode = <1>; + rockchip,hw-tshut-polarity = <0>; + status = "okay"; +}; + +&uart1 { + pinctrl-names = "default"; + pinctrl-0 = <&uart1m0_xfer &uart1m0_ctsn &uart1m0_rtsn>; + status = "okay"; + uart-has-rtscts; + + bluetooth { + compatible = "qcom,qca9377-bt"; + enable-gpios = <&gpio2 RK_PB7 GPIO_ACTIVE_HIGH>; + clocks = <&pmucru CLK_RTC_32K>; + clock-names = "lpo"; + pinctrl-names = "default"; + pinctrl-0 = <&bt_enable_h>; + vddio-supply = <&vcc_1v8>; + }; +}; + +&uart2 { + status = "okay"; +}; + +&uart3 { + status = "okay"; +}; + +&uart4 { + status = "okay"; +}; + +&usb_host0_ehci { + status = "okay"; +}; + +&usb_host0_ohci { + status = "okay"; +}; + +&usb_host0_xhci { + dr_mode = "host"; + extcon = <&usb2phy0>; + status = "okay"; +}; + +&usb_host1_ehci { + status = "okay"; +}; + +&usb_host1_ohci { + status = "okay"; +}; + +&usb_host1_xhci { + status = "okay"; +}; + +&usb2phy0 { + status = "okay"; +}; + +&usb2phy0_host { + phy-supply = <&vcc3v3_ngff>; + status = "okay"; +}; + +&usb2phy0_otg { + phy-supply = <&vcc5v0_boost>; + status = "okay"; +}; + +&usb2phy1 { + status = "okay"; +}; + +&usb2phy1_otg { + phy-supply = <&vcc5v0_usb_otg>; + status = "okay"; +}; + +&vop { + assigned-clocks = <&cru DCLK_VOP0>, <&cru DCLK_VOP1>; + assigned-clock-parents = <&pmucru PLL_HPLL>, <&cru PLL_VPLL>; + status = "okay"; +}; + +&vop_mmu { + status = "okay"; +}; + +&vp0 { + vp0_out_hdmi: endpoint@ROCKCHIP_VOP2_EP_HDMI0 { + reg = ; + remote-endpoint = <&hdmi_in_vp0>; + }; +}; + +&xin32k { + pinctrl-names = "default"; + pinctrl-0 = <&clk32k_out1>; +}; + +&xpcs { + status = "okay"; +}; diff --git a/target/linux/rockchip/image/armv8.mk b/target/linux/rockchip/image/armv8.mk index 2baf475d8..15d71401a 100644 --- a/target/linux/rockchip/image/armv8.mk +++ b/target/linux/rockchip/image/armv8.mk @@ -5,6 +5,16 @@ # FIT will be loaded at 0x02080000. Leave 16M for that, align it to 2M and load the kernel after it. KERNEL_LOADADDR := 0x03200000 +define Device/ariaboard_photonicat + DEVICE_VENDOR := Ariaboard + DEVICE_MODEL := Photonicat + SOC := rk3568 + BOOT_FLOW := pine64-img + DEVICE_PACKAGES := kmod-ath10k-sdio ath10k-firmware-qca9377-sdio wpad-openssl \ + kmod-usb-net-cdc-mbim kmod-usb-net-qmi-wwan kmod-usb-serial-option uqmi +endef +TARGET_DEVICES += ariaboard_photonicat + define Device/embedfire_doornet1 DEVICE_VENDOR := EmbedFire DEVICE_MODEL := DoorNet1 diff --git a/target/linux/rockchip/patches-6.6/900-arm64-boot-add-dts-files.patch b/target/linux/rockchip/patches-6.6/900-arm64-boot-add-dts-files.patch index 6a8973850..db655aa8a 100644 --- a/target/linux/rockchip/patches-6.6/900-arm64-boot-add-dts-files.patch +++ b/target/linux/rockchip/patches-6.6/900-arm64-boot-add-dts-files.patch @@ -44,6 +44,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5c.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-nanopi-r5s.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-odroid-m1.dtb ++dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-photonicat.dtb @@ -107,9 +115,14 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-ar dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-edgeble-neu6a-io.dtb dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3588-edgeble-neu6b-io.dtb