智能陪伴玩具-基于RV1106G3的软硬件设计记录(未完成,持续更新)
Tips: 项目未结束,持续进行!!
电路设计参考 : Introduction
电路设计的记录
V1.0.1 勘误
这个版本打出了成品,测试过,失败了!!!
仿真3D模型:


实物照片是:

发现的错误如下:
- LED 的方向都反了,记得对换
- DDR3L的电压用电阻 R2(下侧,接地)= 4.7kΩ,R1(上侧,接 Vout)= 6.04kΩ
- XIN-XOUT之间的电阻R10 在画的时候没改值,使用的是22R,正常是使用1MΩ的电阻,所以晶振不起振,移除R10测试,也不行 ,所以替换800K 可以。按住BOOT可以进入MASKROM模式,被电脑识别
- 共模电感导致下载失败,下载DownloadBin...失败,原因很多 Rockchip 板子:USB OTG 数据线上不推荐加共模电感。原因:MaskROM枚举:速度低:没问题。下载 Loader:数据量大:信号边沿、高频谐波增加,共模电感可能造成:插损相位失真眼图恶 结果就是:枚举成功 下载失败 把电感拆掉后 可以下载进去 ,但是Begin is larger than flash size下载env...失败
- 当前加载的镜像分区表和你的实际eMMC容量不匹配 ,我是用的Luckfox_Pico_Ultra_W_EMMC_250607,同样是eMMC(8GB)
分析Begin is larger than flash size的原因:
读取信息得到:
Flash Info:
Flash Size: 0MB,value=0x0
Block Size: 512KB,value=1024
Page Size: 2KB,value=4
LBA Size: 1
ECC Bits: 0
Capability:
Direct LBA: enabled
Vendor Storage: enabled
First 4m Access: enabled
Read LBA: enabled
Read IDB Config: enabled
重点: Flash Size: 0MB 这个是异常的。设备的主存储(通常是 eMMC 或 SPI NAND)无法被正常识别和访问。
第二段参数是表示设备底层访问能力完整,工具可以较深入地读写存储、读取设备信息、诊断启动问题,适合刷机、备份和救砖。说明RV1106 Loader已经运行,主控是可用状态。
合理怀疑是鸭羹没有和EMMC进行通信啊,不然不可能读不到。有这几个原因:
- 芯片虚焊--我反复用风枪复焊了,不会有这个
- 电源供电错误--有可能
- 芯片是坏的或者被锁--可能性较小
综上:把重点放在电源部分,我要去看看别人的设计,翻翻这款芯片的技术手册!!!!
通过查看EMMC的手册 发现 :
Interface power → VCCQ(1.70V ~ 1.95V)
Memory power → VCC(2.7V ~ 3.6V)
KLM8G1GETF-B041 这个型号明确要求 VCCQ=1.7~1.95V,所以我的这个错了。
废了,我没办法用飞线解决了,因为这部分是直接铺铜连接的,改不动了,然后不知现在芯片是不是还健在,哈哈哈,人在无语的时候,没法子了,啊哈哈哈哈哈哈哈!!!!!!!!!!!!!!!只能重新画了
V2.0.0 记录
项目从此更名为:《智能陪伴玩具机器人-RV1106G3-V2》
- 研判发现原先的6层过于浪费,把电路降为4层板进行设计,并调整布局
- 将LED灯的方向进行了调整
- 原理图降DDR3L的电压的电阻,调整R2(下侧,接地)= 4.7kΩ,R1(上侧,接 Vout)= 6.04kΩ
- XIN-XOUT之间的电阻R10改为0402封装的1MΩ电阻,并在淘宝购买了
- 去除了USB接口间的共模电感
- 增加一个GH1.25接口,用于外接的供电
- 为喇叭,增加了GH1.25接口,方便直接连接
- (重点)**修正EMMC的VCCQ电压为1.8V

- 恢复对网口的使用,以防止WIFI模块不能使用,作为备份,使用的是自带变压器的

- 增加直连板上MCU的串口,后续通过串口实现上位机和下位机的通讯
- EMMC的CLK线长定是21mm,所以EMMC的线设置等长规则是21mm
- 把RGB屏幕和外挂的单片机作为外挂设备,这个板子还是偏向于核心板,对应的元器件不加入PCB,然后复制到另一个地方重建板子,这样的好久就是,布线方便自由,屏幕可以不绑死核心板,外挂的单片机可以独立大功率供电,减少对核心的干扰。增加40Pin的FPC连接座,将RGB屏幕的数据线,电源线和触摸的线都按照芯片的顺序引出,记得要等长处理。AI给的建议,组内误差争取控制在 ±20mil 以内,最差不要超过 ±50mil,所以我计划全部按照30的正负来设计。
软件部分的记录
Ubuntu22.04安装
系统镜像在123云盘,然后用户名wangbeihong,密码wang
软件换源(阿里源)
替换sources.list的文件内容
deb http://mirrors.aliyun.com/ubuntu/ $Codename main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-backports main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-proposed main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-security main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-updates main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-backports main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-proposed main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-security main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-updates main multiverse restricted universe
执行
sudo apt-get update
sudo apt-get upgrade
第一次要更新比较多,后面可以用一键换源脚本https://linuxmirrors.cn/
安装工具:
sudo apt install curl
sudo -i #切换超级用户
bash <(curl -sSL https://linuxmirrors.cn/main.sh)
执行完成就OK了
使用清华源的Docker自动安装
自动化脚本安装
export DOWNLOAD_URL="https://mirrors4.tuna.tsinghua.edu.cn/docker-ce"
# 如您使用 curl
curl -fsSL https://raw.githubusercontent.com/docker/docker-install/master/install.sh | sh
sudo usermod -aG docker $USER #加入用户组
换源配置镜像加速器
https://blog.csdn.net/mliev/article/details/148444140
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://docker.m.daocloud.io",
"https://dockerproxy.com"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
验证配置
- 检查 Docker 服务是否正常运行:
sudo systemctl status docker
- 验证镜像加速器是否生效:
docker info
AI生成的一键下载docker工具
#!/usr/bin/env bash
#
# Docker 一键安装脚本 (Ubuntu 22.04 jammy / amd64)
#
# - 自动提权: 直接以普通用户运行即可, 会提示一次 sudo 密码
# - apt 加速: 使用阿里云 Docker CE 镜像源
# - 镜像加速: 自动写入国内 registry mirror
#
# 用法(一条命令, 无需 sudo 前缀):
# bash ~/install-docker.sh
#
set -euo pipefail
# ---- 自动提权(只提示一次密码) ----
if [ "$(id -u)" -ne 0 ]; then
echo "==> 需要管理员权限, 即将请求 sudo 密码..."
exec sudo -E bash "$0" "$@"
fi
export DEBIAN_FRONTEND=noninteractive
# ---- 可调参数 ----
DOCKER_APT_MIRROR="https://mirrors.aliyun.com/docker-ce/linux/ubuntu"
DOCKER_GPG_URL="https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg"
REGISTRY_MIRRORS='[
"https://docker.m.daocloud.io",
"https://docker.1ms.run",
"https://docker.1panel.live",
"https://hub.rat.dev",
"https://mirror.ccs.tencentyun.com"
]'
echo "==> 1/8 卸载可能冲突的旧版本..."
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
apt-get remove -y "$pkg" 2>/dev/null || true
done
echo "==> 2/8 安装依赖..."
apt-get update -qq
apt-get install -y ca-certificates curl gnupg
echo "==> 3/8 配置 Docker GPG 密钥 (阿里云加速)..."
install -m 0755 -d /etc/apt/keyrings
curl -fsSL "$DOCKER_GPG_URL" -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "==> 4/8 添加 Docker 官方源 (阿里云镜像)..."
. /etc/os-release
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] ${DOCKER_APT_MIRROR} \
${VERSION_CODENAME} stable" > /etc/apt/sources.list.d/docker.list
apt-get update -qq
echo "==> 5/8 安装 Docker / Compose / Buildx..."
apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
echo "==> 6/8 配置镜像加速 (/etc/docker/daemon.json)..."
mkdir -p /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ${REGISTRY_MIRRORS},
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
EOF
echo "==> 7/8 启动并设置开机自启..."
systemctl enable docker
systemctl daemon-reload
systemctl restart docker
systemctl --no-pager --full status docker | head -n 5 || true
echo "==> 8/8 将当前用户加入 docker 组 (免 sudo)..."
TARGET_USER="${SUDO_USER:-$USER}"
if [ -n "$TARGET_USER" ] && [ "$TARGET_USER" != "root" ]; then
usermod -aG docker "$TARGET_USER"
echo "已将用户 '$TARGET_USER' 加入 docker 组。"
fi
echo
echo "==================== 安装完成 ===================="
docker --version
docker compose version
echo
echo "镜像加速已启用:"
docker info 2>/dev/null | grep -A6 "Registry Mirrors" || true
echo
echo "注意: 用户组变更需重新登录(或执行 newgrp docker)后生效。"
echo "验证: docker run --rm hello-world"
echo "================================================="执行完之后,重新连接ssh,或者重启终端,使用Agent进行安装结果验证:
验证结果:
| 检查项 | 结果 |
|---|---|
| Docker 服务 | active + 已设开机自启 enabled |
| 用户组 | docker:x:999:wangbeihong 已包含你 |
| 免 sudo | 通过(新会话已能连接 daemon,不再报 permission denied) |
| Client / Server | 均 29.8.1,API 1.56 |
| container 运行时 | containerd v2.3.5 / runc v1.5.1 |
| 镜像拉取 | hello-world 秒下,加速源生效 |
| 运行容器 | 输出 Hello from Docker!,完全正常 |
在你刚重连的 SSH 终端里直接跑 docker run --rm hello-world 即可,无需 sudo。测试完删除拉取的hello-world镜像。
开启网络共享文件夹
脚本:
#!/usr/bin/env bash
#
# Ubuntu 一键开启 Samba 网络共享 (安全登录版, 供 Windows 互传文件)
#
# - 共享目录: /home/wangbeihong (整个家目录, 可读写) -> \\IP\home
# - 共享目录: /home/wangbeihong/share (专用目录, 可读写) -> \\IP\share
# - 访问方式: 用户名 + 密码验证 (非匿名)
# - 权限 : 新建文件 0777 / 新建目录 0777 (最大读写)
# - 可重复运行: 已存在 Samba 用户时跳过密码设置, 只刷新配置
# - 自动提权: 以普通用户运行即可, 会提示一次 sudo 密码
#
# 用法(一条命令, 无需 sudo 前缀):
# bash ~/scripts/setup-samba.sh
#
set -euo pipefail
# ---- 自动提权(只提示一次密码) ----
if [ "$(id -u)" -ne 0 ]; then
echo "==> 需要管理员权限, 即将请求 sudo 密码..."
exec sudo -E bash "$0" "$@"
fi
export DEBIAN_FRONTEND=noninteractive
# ---- 可调参数 ----
SHARE_USER="wangbeihong" # Samba 登录用户名, 也是共享目录所属用户
HOME_DIR="/home/wangbeihong" # 家目录
HOME_NAME="home" # Windows 里看到的名字 \\IP\home
EXTRA_DIR="/home/wangbeihong/share" # 专用共享目录
EXTRA_NAME="share" # Windows 里看到的名字 \\IP\share
NETBIOS_NAME="UBUNTU-SHARE" # 网上邻居里的计算机名(<=15字符)
echo "==> 1/8 安装 Samba..."
apt-get update -qq
apt-get install -y samba
echo "==> 2/8 检查/创建共享目录..."
if [ ! -d "$HOME_DIR" ]; then
echo "错误: 家目录 $HOME_DIR 不存在" >&2
exit 1
fi
chown "$SHARE_USER:$SHARE_USER" "$HOME_DIR"
mkdir -p "$EXTRA_DIR"
chown "$SHARE_USER:$SHARE_USER" "$EXTRA_DIR"
chmod 0777 "$EXTRA_DIR"
echo "共享目录: $HOME_DIR (属主 $SHARE_USER)"
echo "共享目录: $EXTRA_DIR (属主 $SHARE_USER, 权限 0777)"
echo "==> 3/8 备份原有 Samba 配置..."
if [ -f /etc/samba/smb.conf ] && [ ! -f /etc/samba/smb.conf.orig.bak ]; then
cp -a /etc/samba/smb.conf /etc/samba/smb.conf.orig.bak
echo "原配置已备份到 /etc/samba/smb.conf.orig.bak"
fi
echo "==> 4/8 写入共享配置 (/etc/samba/smb.conf)..."
cat > /etc/samba/smb.conf <<EOF
#
# Samba 配置 - 由 scripts/setup-samba.sh 生成 (安全登录版)
#
[global]
workgroup = WORKGROUP
server string = Ubuntu File Server
netbios name = ${NETBIOS_NAME}
security = user
map to guest = Never
passdb backend = tdbsam
server role = standalone server
log file = /var/log/samba/log.%m
max log size = 1000
logging = file
panic action = /usr/share/samba/panic-action %d
dns proxy = no
load printers = no
printing = bsd
printcap name = /dev/null
disable spoolss = yes
[${HOME_NAME}]
comment = Home Directory Share
path = ${HOME_DIR}
browseable = yes
read only = no
valid users = ${SHARE_USER}
force user = ${SHARE_USER}
force group = ${SHARE_USER}
create mask = 0777
directory mask = 0777
[${EXTRA_NAME}]
comment = Dedicated Shared Folder
path = ${EXTRA_DIR}
browseable = yes
read only = no
valid users = ${SHARE_USER}
force user = ${SHARE_USER}
force group = ${SHARE_USER}
create mask = 0777
directory mask = 0777
EOF
echo "==> 5/8 校验配置..."
testparm -s >/dev/null && echo "配置语法正确。"
echo "==> 6/8 设置 Samba 登录密码..."
if pdbedit -L 2>/dev/null | grep -q "^${SHARE_USER}:"; then
echo "Samba 用户 '${SHARE_USER}' 已存在, 跳过密码设置。"
echo "(如需修改密码: sudo smbpasswd -a ${SHARE_USER})"
else
echo "请为 Samba 用户 '${SHARE_USER}' 设置一个访问密码 (输入时不显示):"
while true; do
read -rsp " 密码: " PW1; echo
read -rsp " 确认: " PW2; echo
if [ -z "$PW1" ]; then
echo " 密码不能为空, 请重试。"
elif [ "$PW1" != "$PW2" ]; then
echo " 两次输入不一致, 请重试。"
else
break
fi
done
printf '%s\n%s\n' "$PW1" "$PW2" | smbpasswd -a -s "$SHARE_USER"
unset PW1 PW2
smbpasswd -e "$SHARE_USER" >/dev/null
echo "Samba 用户 '${SHARE_USER}' 已创建。"
fi
echo "==> 7/8 启动服务并设置开机自启..."
systemctl enable smbd nmbd >/dev/null 2>&1 || true
systemctl restart smbd nmbd
echo "==> 8/8 放行防火墙(如已启用)..."
if command -v ufw >/dev/null 2>&1 && ufw status 2>/dev/null | grep -qi active; then
ufw allow samba >/dev/null 2>&1 || {
ufw allow 137,138/udp >/dev/null 2>&1 || true
ufw allow 139,445/tcp >/dev/null 2>&1 || true
}
echo "ufw 已放行 Samba 端口。"
else
echo "ufw 未启用, 跳过。"
fi
systemctl --no-pager --full status smbd | head -n 4 || true
IP_ADDR="$(hostname -I 2>/dev/null | awk '{print $1}')"
echo
echo "==================== 共享已开启 (安全登录) ===================="
echo "登录用户 : ${SHARE_USER}"
echo "访问地址 :"
echo " \\\\${IP_ADDR}\\${HOME_NAME} -> ${HOME_DIR}"
echo " \\\\${IP_ADDR}\\${EXTRA_NAME} -> ${EXTRA_DIR}"
echo
echo "Windows 若之前连过匿名访问, 先清理旧凭据(CMD/PowerShell):"
echo " net use * /delete /y"
echo "============================================================="在 Windows 上"长期挂载"(开机自动连、不用每次输密码: 映射网络驱动器
- 打开「此电脑」→ 顶部「映射网络驱动器」
- 驱动器选个盘符,比如 Z:
- 文件夹填:\10.0.0.245\home
- 勾选 ☑ 登录时重新连接
- 勾选 ☑ 使用其他凭据连接 → 输入用户名 wangbeihong + 你的 Samba 密码,并勾选"记住我的凭据"
- 完成。之后每次开机 Z: 盘会自动出现。
Docker镜像下载SDK
https://wiki.luckfox.com/zh/Luckfox-Pico-RV1106/SDK/Docker-Image-Build/
Docker 镜像的获取:(推荐国内用户直接下载离线版本镜像)
sudo docker pull luckfoxtech/luckfox_pico:1.0
# 压缩打包
sudo docker load -i ./luckfox_pico_docker.tar
上述操作只是将 Docker 工具安装到系统中,相当于安装了“容器运行平台”。 要运行容器,还需要使用 docker run 或 docker start 等命令显式地启动一个容器。
我打包成了压缩包,存放本地和云盘中,可以之后解压直接使用。现在放在虚拟机的share目录,让Agent执行后续操作。
Agent使用的命令:
使用的命令(完整记录)
# 1. 查看归档文件
ls -lh /home/wangbeihong/share/luckfox_pico_docker.tar
file /home/wangbeihong/share/luckfox_pico_docker.tar
# 2. 导入镜像
docker load -i /home/wangbeihong/share/luckfox_pico_docker.tar
# 3. 查看镜像
docker images
docker inspect luckfoxtech/luckfox_pico:1.0
# 4. 启动测试容器(验证可运行,用完即删)
docker run --rm luckfoxtech/luckfox_pico:1.0 bash -c "cat /etc/os-release | head -2; uname -m; ls /"
docker run --rm luckfoxtech/luckfox_pico:1.0 bash -c "ls -la /home /opt /root"
说明:因为我的 shell 是装 Docker 之前启动的旧进程、没有 docker 组权限,上面每条 docker 命令我实际是用 sg docker -c '...' 包起来跑的。你新开的 SSH 终端不需要 sg,直接 docker ... 即可。
你要用它编译 Luckfox SDK 的话,标准用法是挂载 SDK 目录进去,例如:
docker run -it --rm -v /home/wangbeihong/luckfox-sdk:/home/luckfox luckfoxtech/luckfox_pico:1.0
克隆最新的SDK源码(原始手动操作)
使用gitee的链接下载
git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git
这个也是一起压缩了,保存在本地和云盘中。
启动一个交互式的容器,使用名为 "luckfox",并将本地主机上的 SDK 目录映射到容器内的 /home 目录,最后以 Bash shell 运行。
wangbeihong@wangbeihong:~/rv1106g3_workspace$ pwd
/home/wangbeihong/rv1106g3_workspace
wangbeihong@wangbeihong:~/rv1106g3_workspace$ sudo docker run -it --name luckfox --privileged -v /home/wangbeihong/rv1106g3_workspace/luckfox-pico:/home luckfoxtech/luckfox_pico:1.0 /bin/bash
然后第二次使用
sudo docker start -ai luckfox
显示:
wangbeihong@wangbeihong:~/rv1106g3_workspace$ sudo docker start -ai luckfox
root@0605dae1543a:/#
在开始编译前,请根据实际使用的开发板型号,选择对应的代码分支,以确保编译出的镜像能够正确运行
root@287cb5b61d9d:/# cd home/
root@287cb5b61d9d:/home# ls
README.md README_CN.md UPDATE_LOG.md UPDATE_LOG_CN.md build.sh media project rkflash.sh sysdrv tools
root@287cb5b61d9d:/home# ./build.sh lunch
You're building on Linux
Lunch menu...pick the Luckfox Pico hardware version:
选择 Luckfox Pico 硬件版本:
[0] RV1103_Luckfox_Pico
[1] RV1103_Luckfox_Pico_Mini
[2] RV1103_Luckfox_Pico_Plus
[3] RV1103_Luckfox_Pico_WebBee
[4] RV1106_Luckfox_Pico_Pro_Max
[5] RV1106_Luckfox_Pico_Ultra
[6] RV1106_Luckfox_Pico_Ultra_W
[7] RV1106_Luckfox_Pico_Pi
[8] RV1106_Luckfox_Pico_Pi_W
[9] RV1106_Luckfox_Pico_86Panel
[10] RV1106_Luckfox_Pico_86Panel_W
[11] RV1106_Luckfox_Pico_Zero
[12] custom
Which would you like? [0~12][default:0]: 6
Lunch menu...pick the boot medium:
选择启动媒介:
[0] EMMC
Which would you like? [0][default:0]: 0
Lunch menu...pick the system version:
选择系统版本:
[0] Buildroot
Which would you like? [0][default:0]: 0
[build.sh:info] Lunching for Default BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra_W-IPC.mk boards...
[build.sh:info] switching to board: /home/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra_W-IPC.mk
[build.sh:info] Running build_select_board succeeded.
root@287cb5b61d9d:/home# ./build.sh
可以不做,时间久一点
在编译之前,可以先进去根目录,把Buildroot 的软件源替换,防止后面下载慢,参考Buildroot更换软件源 使用menuconfig配置地址源
Luckfox Pico (RV1106) SDK 开发容器启动脚本
Agent写的脚本:
#!/usr/bin/env bash
#
# Luckfox Pico (RV1106) SDK 开发容器启动脚本
#
# - 镜像: luckfoxtech/luckfox_pico:1.0
# - 挂载: 宿主机 SDK 目录 -> 容器内 /home/luckfox-pico
# - 交互式进入容器 bash, 退出后自动删除容器 (--rm)
#
# 用法:
# bash ~/scripts/run-luckfox.sh [SDK目录]
#
# 不传参数时默认使用 ~/luckfox-pico (不存在会自动创建)。
# 也可用环境变量指定: LUCKFOX_SDK_DIR=/path/to/sdk bash ~/scripts/run-luckfox.sh
#
# 默认以宿主机当前用户(UID/GID)身份运行容器, 编译产物归当前用户所有,
# 不会在宿主机留下 root 属主文件。若某些步骤确实需要 root:
# LUCKFOX_AS_ROOT=1 bash ~/scripts/run-luckfox.sh
#
set -euo pipefail
IMAGE="luckfoxtech/luckfox_pico:1.0"
CONTAINER_NAME="${LUCKFOX_NAME:-luckfox-pico}"
SDK_DIR="${1:-${LUCKFOX_SDK_DIR:-$HOME/luckfox-pico}}"
# ---- 资源限制(防止编译把主机内存吃满崩溃) ----
MEM_LIMIT="${LUCKFOX_MEM:-3g}" # 容器内存上限
MEM_SWAP="${LUCKFOX_MEM_SWAP:-3g}" # 含 swap 的上限, 与内存相同=容器不可用 swap(超出即 OOM)
CPU_LIMIT="${LUCKFOX_CPUS:-8}" # 可用 CPU 核数
PIDS_LIMIT="${LUCKFOX_PIDS:-4096}" # 进程数上限
# ---- 运行身份(默认宿主机当前用户, 避免产物变 root 属主) ----
HOST_UID="$(id -u)"
HOST_GID="$(id -g)"
HOST_USER="$(id -un)"
if [ "${LUCKFOX_AS_ROOT:-0}" = "1" ]; then
RUN_UID="0"; RUN_GID="0"; RUN_USER="root"; RUN_HOME="/root"; AS_ROOT=1
else
RUN_UID="$HOST_UID"; RUN_GID="$HOST_GID"; RUN_USER="$HOST_USER"
RUN_HOME="/tmp/luckfox-home" # 镜像内没有该 UID, 用 tmpfs 给个可写的家目录
AS_ROOT=0
fi
if [ "${1:-}" = "-h" ] || [ "${1:-}" = "--help" ]; then
sed -n '2,16p' "$0"
exit 0
fi
# ---- 检查 Docker 权限 ----
if ! docker info >/dev/null 2>&1; then
if getent group docker 2>/dev/null | grep -qw "$(id -un)"; then
echo "提示: 当前 shell 未加载 docker 组权限。" >&2
echo " 请执行 'newgrp docker' 或重新登录 SSH 后再运行本脚本。" >&2
fi
echo "错误: 无法连接 Docker, 请确认服务在运行且当前用户有权限。" >&2
exit 1
fi
# ---- 检查镜像 ----
if ! docker image inspect "$IMAGE" >/dev/null 2>&1; then
echo "错误: 镜像 $IMAGE 不存在。" >&2
echo " 请先导入: docker load -i <luckfox_pico_docker.tar>" >&2
exit 1
fi
# ---- 准备 SDK 目录 ----
mkdir -p "$SDK_DIR"
SDK_DIR="$(cd "$SDK_DIR" && pwd)"
# ---- 幂等: 清理同名残留容器(正常 exit 会由 --rm 自动删除, 这里兜底异常退出) ----
if docker container inspect "$CONTAINER_NAME" >/dev/null 2>&1; then
echo "发现同名残留容器 '$CONTAINER_NAME', 正在清理..."
docker rm -f "$CONTAINER_NAME" >/dev/null
fi
# ---- 非 root 时: 复制镜像的 passwd/group 并补一条与宿主机一致的账号, 再只读挂载进去 ----
# 这样容器从启动起就是普通用户, docker exec 进去同样是普通用户。
PREP_DIR=""
if [ "$AS_ROOT" = "0" ]; then
PREP_DIR="$(mktemp -d)"
trap 'rm -rf "$PREP_DIR"' EXIT
docker run --rm --entrypoint cat "$IMAGE" /etc/passwd > "$PREP_DIR/passwd"
docker run --rm --entrypoint cat "$IMAGE" /etc/group > "$PREP_DIR/group"
# UID 不存在才追加, 避免覆盖镜像里已有账号
if ! grep -q "^[^:]*:[^:]*:${RUN_UID}:" "$PREP_DIR/passwd"; then
printf '%s:x:%s:%s::%s:/bin/bash\n' "$RUN_USER" "$RUN_UID" "$RUN_GID" "$RUN_HOME" >> "$PREP_DIR/passwd"
fi
if ! grep -q "^[^:]*:[^:]*:${RUN_GID}:" "$PREP_DIR/group"; then
printf '%s:x:%s:\n' "$RUN_USER" "$RUN_GID" >> "$PREP_DIR/group"
fi
fi
# ---- 进入容器后执行的命令 ----
read -r -d '' CONTAINER_CMD <<'EOS' || true
set -u
TC=/home/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf
if [ -f "$TC/env_install_toolchain.sh" ]; then
( cd "$TC" && . ./env_install_toolchain.sh >/dev/null 2>&1 ) || true
fi
export PATH="$TC/bin:$PATH"
cd /home/luckfox-pico
if command -v arm-rockchip830-linux-uclibcgnueabihf-gcc >/dev/null 2>&1; then
echo "[luckfox] 交叉编译工具链已加载: $(command -v arm-rockchip830-linux-uclibcgnueabihf-gcc)"
else
echo "[luckfox] 警告: 工具链未加载, 请手动 source $TC/env_install_toolchain.sh"
fi
echo "[luckfox] 运行身份: $(id -un 2>/dev/null || echo uid=$(id -u)) ($(id -u):$(id -g))"
echo "[luckfox] 当前目录: $(pwd)"
exec bash
EOS
echo "==================================================="
echo " 镜像 : $IMAGE"
echo " 宿主机 : $SDK_DIR"
echo " 容器内 : /home/luckfox-pico"
if [ "$AS_ROOT" = "1" ]; then
echo " 运行身份 : root (0:0)"
else
echo " 运行身份 : $RUN_USER ($RUN_UID:$RUN_GID) — 编译产物不会变 root 属主"
fi
echo " 工具链 : 进入后自动加载 (arm-rockchip830-linux-uclibcgnueabihf)"
echo " 资源限制 : 内存 ${MEM_LIMIT} (swap ${MEM_SWAP}) | CPU ${CPU_LIMIT} 核 | 进程 ${PIDS_LIMIT}"
echo " 说明 : 输入 exit 退出容器, 容器会自动删除"
echo "==================================================="
echo
DOCKER_ARGS=(
-it --rm
--name "$CONTAINER_NAME"
--hostname "$CONTAINER_NAME"
--user "$RUN_UID:$RUN_GID"
--memory="$MEM_LIMIT"
--memory-swap="$MEM_SWAP"
--cpus="$CPU_LIMIT"
--pids-limit="$PIDS_LIMIT"
-e HOME="$RUN_HOME"
-v "$SDK_DIR:/home/luckfox-pico"
-w /home/luckfox-pico
)
if [ "$AS_ROOT" = "0" ]; then
DOCKER_ARGS+=(
--tmpfs "${RUN_HOME}:uid=${RUN_UID},gid=${RUN_GID},mode=0755"
-v "$PREP_DIR/passwd:/etc/passwd:ro"
-v "$PREP_DIR/group:/etc/group:ro"
)
fi
exec docker run "${DOCKER_ARGS[@]}" "$IMAGE" /bin/bash -c "$CONTAINER_CMD"用法:
bash ~/scripts/run-luckfox.sh # 默认用 ~/luckfox-sdk
bash ~/scripts/run-luckfox.sh /path/to/sdk # 指定 SDK 目录
LUCKFOX_SDK_DIR=/path/to/sdk bash ~/scripts/run-luckfox.sh行为:
- 挂载 宿主SDK目录 → 容器 /home/luckfox,并以它为工作目录
- 交互式 bash,exit 退出后容器自动删除(--rm),不留垃圾
- 自动检查:Docker 权限、镜像是否存在、SDK 目录(不存在自动创建)
- 不自动提权(docker 用的是用户组权限,不是 root,故意不用 sudo,避免生成的文件属主变成 root)
冒烟测试已通过:容器内 pwd = /home/luckfox,挂载目录可见,文件属主保持你的用户(uid 1000)。
Agent创建了目录:/home/wangbeihong/luckfox-sdk,把下载的SDK加压存放到/home/wangbeihong/luckfox-sdk
怎么用
运行的结果是:
bash ~/scripts/run-luckfox.sh
进入容器后你会看到 [luckfox] 交叉编译工具链已加载: ...,然后就能按官方流程编译:
wangbeihong@wangbeihong-rv1106:~$ bash ~/scripts/run-luckfox.sh
===================================================
镜像 : luckfoxtech/luckfox_pico:1.0
宿主机 : /home/wangbeihong/luckfox-pico
容器内 : /home/luckfox-pico
工具链 : 进入后自动加载 (arm-rockchip830-linux-uclibcgnueabihf)
资源限制 : 内存 3g (swap 3g) | CPU 8 核 | 进程 4096
说明 : 输入 exit 退出容器, 容器会自动删除
===================================================
[luckfox] 交叉编译工具链已加载: /home/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-gcc
[luckfox] 当前目录: /home/luckfox-pico
root@luckfox-pico:/home/luckfox-pico#
./build.sh lunch # 选板子型号 (RV1106 是 [4]~[10])
root@luckfox-pico:/home/luckfox-pico# ./build.sh lunch
You're building on Linux
Lunch menu...pick the Luckfox Pico hardware version:
选择 Luckfox Pico 硬件版本:
[0] RV1103_Luckfox_Pico
[1] RV1103_Luckfox_Pico_Mini
[2] RV1103_Luckfox_Pico_Plus
[3] RV1103_Luckfox_Pico_WebBee
[4] RV1106_Luckfox_Pico_Pro_Max
[5] RV1106_Luckfox_Pico_Ultra
[6] RV1106_Luckfox_Pico_Ultra_W
[7] RV1106_Luckfox_Pico_Pi
[8] RV1106_Luckfox_Pico_Pi_W
[9] RV1106_Luckfox_Pico_86Panel
[10] RV1106_Luckfox_Pico_86Panel_W
[11] RV1106_Luckfox_Pico_Zero
[12] custom
Which would you like? [0~12][default:0]: 6
Lunch menu...pick the boot medium:
选择启动媒介:
[0] EMMC
Which would you like? [0][default:0]: 0
Lunch menu...pick the system version:
选择系统版本:
[0] Buildroot
Which would you like? [0][default:0]: 0
[build.sh:info] Lunching for Default BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra_W-IPC.mk boards...
[build.sh:info] switching to board: /home/luckfox-pico/project/cfg/BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1106_Luckfox_Pico_Ultra_W-IPC.mk
[build.sh:info] Running build_select_board succeeded.
root@luckfox-pico:/home/luckfox-pico#
./build.sh # 全量编译 或 ./build.sh allsave # 编译并打包固件
操作手册:[[Luckfox开发环境使用指南]] 固件内容:[[Luckfox固件配置说明]]
精简配置只支持SC3336摄像模组,删除其他摄像头
~/share/Luckfox固件配置说明.md 和 .txt(BOM 完好)都更新为 SC3336-only 现状:
- 固件包路径、构建时间改为新固件(_0049 / 2026-09-26 00:49)
- 「摄像头」章节:改为只支持 SC3336(I2C 0x30、模组 CMK-OT2119-PC1、2-lane MIPI),IQ/CAC、驱动列表都只保留 SC3336
- 「IPC 应用」章节:改为实际使用 rkipc-300w.ini(2304×1296 @25fps、H.265、max 2048 kbps、RTSP 开/RTMP 关/NPU 关、音频默认关)
- 注意事项:旧固件已清理、摄像头精简说明;文末更新日期
WIFI模组
幸狐使用的是SKI.WB800DCS.2,但其实,本质还是基于爱科微-AICSEMI AIC8800DC开发的。WIFI模块的购买链接
但是我使用的是亿佰特的单wifi的,E103-RTL8189FTV,E103-RTL8189FTV是一款低成本高性能WiFi模组。符合IEEE 802.11b/g/n标准,最高数据速率可达150Mbps,具有丰富的接口和强大的处理器,可为高吞吐量性能的集成无线LAN设备提供了一种完整的解决方案。亿佰特WIFI模块购买链接
驱动位置
进入luckfox的sdk目录 /home/beihong/luckfox_sdk/luckfox-pico 。
幸狐使用的是爱科微-AICSEMI AIC8800DC模组,这个模组的驱动在 /home/beihong/luckfox_sdk/luckfox-pico/sysdrv/drv_ko/wifi目录下面,幸狐 SDK 专门存放外部编译好的 Wi-Fi 驱动模块(.ko 文件)。这里面有
Makefile aic8800_usb atbm bcmdhd hichannel rtl8188ftv ssv6115
aic8800_netdrv aic8800dc atbm6441 bcmdhd_chipalive insmod_wifi.sh rtl8189fs ssv6x5x
我发现,我新换的是RTL8189FTV,在这里面有包含了,那就不用整了,直接用吧。对了,设备树在 /luckfox_sdk/luckfox-pico/sysdrv/source/kernel/arch/arm/boot/dts 然后是基于 rv1106g-luckfox-pico-pi-w.dts
等待实际测试吧!!!!!!!!!!!!!!希望可以使我想的这样。
参考文献(先收藏着,不管有没有用)
[1]史鑫磊.基于场景文字识别的化工厂智能预警系统[D].内蒙古大学,2025.DOI:10.27224/d.cnki.gnmdu.2025.002622.
[1]温欣彤,梁丞天,朱昭宇,等.基于物联网图像识别和语音交互的陪伴型气味管理与情绪调节香薰机[J].物联网技术,2025,15(20):117-120.DOI:10.16667/j.issn.2095-1302.2025.20.026.
[1]李嘉举.面向老年人的个性化虚拟人陪伴交互系统研究[D].绍兴文理学院,2025.DOI:10.27860/d.cnki.gsxwl.2025.000247.
[1]刘凡杨.基于树莓派的信息采集与AI交互系统的设计与实现[D].沈阳师范大学,2022.DOI:10.27328/d.cnki.gshsc.2022.000946.
[1]高顾民.基于RK3588的变电站环境智能监控系统研发[D].成都理工大学,2024.DOI:10.26986/d.cnki.gcdlc.2024.001671.
[1]廖国超.基于嵌入式Linux的以太网音频流传输系统的实现与研究[D].广东工业大学,2023.DOI:10.27029/d.cnki.ggdgu.2023.001622.
[1]雷宇.基于RV1126的低照度成像处理技术研究[D].电子科技大学,2023.DOI:10.27005/d.cnki.gdzku.2023.004299.
[1]潘俊珂.基于Linux_Qt的人脸识别视频监控系统设计与实现[D].温州大学,2022.DOI:10.27781/d.cnki.gwzdx.2022.000301.
[1]郭柳嶠.创造性认知驱动的创意支持工具设计与应用——以玩具设计为例[D].浙江大学,2025.DOI:10.27461/d.cnki.gzjdx.2025.001267.
[1]贾晓涛.AI玩偶,年轻人的“情绪搭子”[J].现代商业银行,2025,(20):28-32.
[1]李紫妍.基于情感共生理念的宠物犬陪伴机器人设计研究[D].北京化工大学,2024.DOI:10.26939/d.cnki.gbhgu.2024.000439.
[1]徐凤兰.人机之恋:恋爱型聊天机器人与用户的亲密关系建立研究[D].浙江传媒学院,2025.DOI:10.27852/d.cnki.gzjcm.2025.000164.
[1]易梦媛.陪伴型聊天机器人使用对青年群体人际交往的影响研究[D].广东外语外贸大学,2024.DOI:10.27032/d.cnki.ggdwu.2024.000978.
[1]杜泽明.基于瑞芯微RK3566平台和Yolov8n的输液监测系统[J].计算机时代,2025,(4):41-45+51.DOI:10.16644/j.cnki.cn33-1094/tp.2025.04.009.
[1]周子云,杨阳,冯成宇,等.基于深度学习的列车接近预警设备设计[J].电子设计工程,2026,34(3):31-35.DOI:10.14022/j.issn1674-6236.2026.03.007.
[1]Yin J ,Gu W ,Yang F X , et al.Design of QT-4.7 LAN Chat System Based on ARM Linux[J].Advanced Materials Research,2014,3181(926-930):1906-1909.DOI:10.4028/www.scientific.net/AMR.926-930.1906.
[1]Yang W ,Kang B ,Su J .A survey on chatbot systems from rule-based models to system-integrated natural user interfaces[J].Knowledge-Based Systems,2026,351(PA):116651-116651.DOI:10.1016/J.KNOSYS.2026.116651.
[1]Chunxu L ,Xiaoyu C ,Xinglu M , et al.Skill Acquisition and Controller Design of Desktop Robot Manipulator Based on Audio–Visual Information Fusion[J].Machines,2022,10(9):772-772.DOI:10.3390/MACHINES10090772.