Categories
python

香橙派ble蓝牙 python

安装依赖包

sudo apt-get update
sudo apt-get install bluetooth bluez libbluetooth-dev libusb-dev libdbus-1-dev

确保蓝牙开启

sudo systemctl enable bluetooth
sudo systemctl start bluetooth

bluetoothctl 是一个点对点蓝牙控制工具

gatttool 是一个ble蓝牙控制工具

sudo apt-get install bluez-tools
gatttool -b <设备地址> --interactive

python 代码:

sudo apt-get install python3-pip
pip3 install bluepy
from bluepy.btle import Scanner, DefaultDelegate
import time

class ScanDelegate(DefaultDelegate):
    def handleDiscovery(self, dev, isNewDev, isNewData):
        if isNewDev:
            print("Discovered device")
            print("  Device %s (%s), RSSI=%d dB" % (dev.addr, dev.addrType, dev.rssi))
        elif isNewData:
            print("  Updated data: %s" % dev.scanData)
            print("  Manufacturer data: %s" % dev.manufacturerData)        # Optional: manufacturer data if available. 0x0000FFFF is the default for BLE devices. 0xFFFF is the default for Beacons. 0x004C is the default for iBeacons. 0x0215 is the default for AltBeacons. 0x0242 is the default for Estimote beacons. 0x0015 is the default for Eddystone beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung beacons. 0x02AA is the default for Apple beacons. 0x0118 is the default for Samsung

相关链接

https://blog.csdn.net/weixin_30598047/article/details/156319564

Categories
cmd

香橙派设置wifi热点

  • hostapd:用于创建 WiFi 热点
  • dnsmasq:提供 DNS 和 DHCP 服务
  • git:用于下载 create_ap 工具
sudo apt update &&
sudo apt upgrade -y
sudo apt install -y hostapd dnsmasq git

若已经有 create_ap 命令 可跳过

# 克隆仓库
git clone https://github.com/oblique/create_ap.git
cd create_ap
# 安装工具
sudo make install

查看系统中的无线网卡(通常为 wlan0 或 wlx 开头):

找到类似 wlan0 的无线接口名称(确保你的 Orange Pi 5 Max 已安装 WiFi 驱动,能识别无线网卡)。

ip link show


确认有线网卡名称(用于共享网络,通常为 eth0或lo):

ip -br addr show

基本命令格式(替换为你的信息):

sudo create_ap [无线网卡] [有线网卡] [热点名称] [热点密码]
示例(假设无线网卡为 wlan0,有线网卡为 eth0):
sudo create_ap wlan0 eth0 OrangePi_Hotspot 12345678

热点名称:OrangePi_Hotspot(可自定义)
密码:12345678(至少 8 位,可自定义)

先停止当前运行的热点(按 Ctrl+C)。

创建系统服务实现自启:

创建服务文件

sudo nano /etc/systemd/system/orangepi-hotspot.service

粘贴以下内容(根据你的网卡和热点信息修改):

[Unit]
Description=Orange Pi WiFi Hotspot
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/create_ap wlan0 eth0 OrangePi_Hotspot 12345678
Restart=always
[Install]
WantedBy=multi-user.target


启用并启动服务:

sudo systemctl enable orangepi-hotspot
sudo systemctl start orangepi-hotspot

热点启动失败:

检查无线网卡是否被占用(如已连接其他 WiFi),先断开:

sudo nmcli device disconnect wlan0

确认 hostapd 服务未冲突:

sudo systemctl stop hostapd

设备无法连接:

密码长度是否至少 8 位
尝试更换信道:

sudo create_ap wlan0 eth0 OrangePi_Hotspot 12345678 --channel 6

无网络访问:

确认有线网卡 eth0 已连接互联网
检查 IP 转发是否开启:

sudo sysctl -w net.ipv4.ip_forward=1
Categories
linux

emmc烧写后 文件系统扩容

lsblk                         # 查看磁盘和分区信息
df -h                         # 查看文件系统使用情况

输出

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0   64G  0 disk
├─mmcblk0p1 179:1    0  256M  0 part /boot
└─mmcblk0p2 179:2    0    8G  0 part /         # 仅用了 8G,剩余空间未分配

/ 代表的就是跟文件系统分区 要扩容就是这个分区扩容

sudo resize2fs /dev/mmcblk0p2  # 扩展 ext4 文件系统
Categories
linux

rootfs.img 修改root账号密码 并设置允许ssh访问

sudo mount -o loop rootfs.img ~/mount_dir

挂载镜像到某个目录

修改root账号密码

sudo vim /etc/shadow

修改密码文件

root:!:19475:0:99999:7:::

!或*代表该账号无法登录

数据段说明

用户名:加密密码:最后修改时间:最小密码年龄:最大密码年龄:警告期:不活动期:过期时间:保留字段
mkpasswd -m sha-512

执行该命令然后输入密码 替换上面的加密密码段

修改ssh配置允许root访问

/etc/ssh/sshd_config

修改配置文件

PermitRootLogin yes  # 修改后重启 SSH 服务:sudo systemctl restart sshd

设置允许root 密码登录

Categories
linux

uboot kernel rootfs 关系

在嵌入式Linux系统中,U-Boot、Kernel(内核)和Rootfs(根文件系统) 是三个核心组件,它们分工协作,共同完成系统启动和运行。以下是它们的相互关系和作用:


1. U-Boot(Bootloader)

  • 作用:硬件初始化、引导加载内核。
  • 功能
    • 初始化CPU、内存、时钟等硬件。
    • 提供交互式命令行(可选),用于调试或配置启动参数。
    • 从存储设备(如eMMC、SD卡、Flash)加载内核镜像(zImageuImage)和设备树(dtb)到内存。
    • 传递启动参数(如根文件系统位置、控制台设备等)给内核。
  • 输出:将控制权移交内核。

2. Kernel(Linux内核)

  • 作用:管理系统硬件资源、提供核心服务。
  • 功能
    • 进一步初始化硬件(如驱动加载、中断管理)。
    • 挂载根文件系统(Rootfs)到 / 目录。
    • 启动用户空间的第一个进程(通常是 init 或 systemd,PID=1)。
  • 依赖:需要U-Boot正确加载内核镜像,并传递正确的启动参数(如root= 指定Rootfs位置)。

3. Rootfs(根文件系统)

  • 作用:提供用户空间环境和应用程序运行基础。
  • 内容
    • 系统工具(如/bin/sbin)。
    • 配置文件(如/etc)。
    • 库文件(如/lib)。
    • 用户程序(如/usr)。
  • 挂载时机:由内核根据启动参数(如root=/dev/mmcblk0p2)挂载。
  • 关键文件/sbin/init 或 /lib/systemd/systemd(第一个用户进程)。

三者的协作流程

  1. 硬件上电 → U-Boot执行,初始化硬件。
  2. U-Boot 加载内核镜像和设备树到内存,传递参数(如console=ttyS0 root=/dev/nfs)。
  3. 内核 启动,解压自身并初始化子系统(进程调度、驱动等)。
  4. 内核 挂载Rootfs(从Flash、NFS、RAM等设备)。
  5. 内核 启动Rootfs中的init进程,进入用户空间,完成系统启动。

关键依赖关系

  • U-Boot依赖:需适配硬件(如DDR初始化代码、存储驱动)。
  • 内核依赖:需匹配硬件架构(如ARM/X86)和U-Boot传递的参数。
  • Rootfs依赖:需包含内核驱动的对应模块(如文件系统驱动、设备节点)。

常见问题

  • 启动失败:若U-Boot未正确加载内核,系统无法启动。
  • 内核恐慌(Kernel Panic):通常因找不到或无法挂载Rootfs。
  • Rootfs损坏:系统可能启动但无法进入用户空间(如/bin/sh缺失)。

类比理解

  • U-Boot:像电脑的BIOS,负责“唤醒”硬件。
  • Kernel:像操作系统内核,管理硬件和资源。
  • Rootfs:像C盘的Windows系统文件,提供运行环境。

通过三者协同,嵌入式系统从硬件上电到完整启动,最终运行应用程序。

Categories
linux

设置静态IP

一般通过命令nmtui设置

Categories
linux

香橙派 OPI.GPIO

一般GPIO初始化是执行

GPIO.setmode(mode) #来进行引脚定义初始化

GPIO.BOARD = 10
GPIO.BCM = 11
GPIO.SUNXI = 12 
GPIO.CUSTOM = 13  

其实只是一你骄傲的映射关系 没有真正执行任何代码

但是OPI.GPIO 对不同的香橙派版本 引脚定义不充分

CM4为例子

GPIO.setmode(GPIO.BOARD) #会少了很多引脚的映射

C:\Users\15699\AppData\Local\Programs\Python\Python312\Lib\site-packages\OPi\pin_mappings.py

 BOARD: {
        3: 12,
        5: 11,
        7: 6,
        8: 198,
        10: 199,
        11: 1,
        12: 7,
        13: 0,
        15: 3,
        16: 19,
        18: 18,
        19: 15,
        21: 16,
        22: 2,
        23: 14,
        24: 13,
        26: 10
    },

这时候要不更改这个库文件 按照GPIO.readall 补充所有引脚映射

要不执行 自定义引脚映射初始化

GPIO.setmode({
        3: 140,
        5: 141,
        7: 147,
        8: 25,
        10: 24,
        11: 118,
        12: 119,
        13: 128,
        15: 130,
        16: 131,
        18: 129,
        19: 138,
        21: 136,
        22: 132,
        23: 139,
        24: 134,
        26: 135,
        27: 32,
        28: 33,
        29: 133,
        31: 124,
        32: 144,
        33: 127,
        35: 120,
        36: 125,
        37: 123,
        38: 122,
        40: 121
    })

GPIO.getmode 
# 返回CUSTOM 自定义引脚映射
Categories
android

aosp 设置系统自启动脚本

安卓系统启动后会执行

/vendor/etc/init/hw/init.rk3588.rc

这个文件来源于

device/rockchip/rk3588/init.rk3588.rc

在on boot后添加执行脚本

on boot
    chmod 0666 /dev/mem
    chown root system /dev/mem

    chmod 0666 /dev/i2c-5
    chown root system /dev/i2c-5

以上是启动后 增加几个文件的读写权限

这几个文件跟GPIO控制有关系

Categories
android

orangepi5 android system compile log

第一需要使用ubuntu系统18以上 (最好18)x86 架构 不能是arm架构哈

准备好500G的系统硬盘 16g内存

文件系统确认是区分大小写的 (case sensitive 创建同名大小写差异的文件做测试)

文件系统可以构建硬链接 (ln 命令测试)

当缺少文件 都是因为解压时大小写冲突导致丢失文件和文件为硬链接当前文件系统不支持丢失文件

没有 mkbootfs 需要安装安卓打包工具 build-tools

google address

git clone https://android.googlesource.com/kernel/prebuilts/build-tools

gitee address

 git clone https://gitee.com/mirrors_android_googlesource/build-tools.git

然后path 添加上里面的bin目录

没有python2 添加上prebuild 路径下的python2 可执行目录

export PATH=/mnt/d/Android_12/prebuilts/python/linux-x86/2.7.5/bin:/mnt/d/build-tools/linux-x86/bin:$PATH

安装镜像工具

apt install mkbootimg 

安装其他依赖包

  apt install libssl-dev
  apt install openssl
  apt insatll libc++1
  apt install libelf-dev

kernal vdso 编译错误时

kernel-5.10\arch\arm64\kernel\vdso\gen_vdso_offsets.sh

LC_ALL=C
sed -n -e 's/^00*/0/' -e \
's/^\([0-9a-fA-F]*\) . VDSO_\([a-zA-Z0-9_]*\)$/\#define vdso_offset_\2\t0x\1/p'

更改为

LC_ALL=C
sed -n -e 's/^00*/0/' -e \
's/^\([0-9a-fA-F]*\) . VDSO_\([a-zA-Z0-9_]*\)$/\#define vdso_offset_\2 0x\1/p'

并且修改该文件为可执行的 删除目录下的编译产物vdso.so

提示找不到libcrypto-host.so

cp prebuilts/build-tools/linux-x86/lib64/*.so  /usr/lib

libncurses.so.5 not found (因为官方已经把libncurses-dev 取代 libncurses5-dev 所以需要重新安装一次)

sudo apt install libncurses5

官方要求安装依赖包

sudo apt-get update
sudo apt-get install -y git gnupg flex bison gperf build-essential 
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
sudo apt-get install -y u-boot-tools

关闭安卓首页google 查询框

//关闭安卓首页google 搜索栏
packages/apps/Launcher3/res/layout/search_container_workspace.xml

packages/apps/Launcher3/src/com/android/launcher3/config/FeatureFlags.java.java

public static final boolean QSB_ON_FIRST_SCREEN = false;

//更改kernel 开机画面
\kernel-5.10\drivers\video\logo

更改该目录下的ppm文件 ppm文件可由bmp转换而来

//更改kernel 开机画面
\kernel-5.10\drivers\video\logo

更改该目录下的ppm文件 ppm文件可由bmp转换而来

//安卓开机动画会读取以后几个文件 frameworks\base\cmds\bootanimation\BootAnimation.cpp


static const char OEM_BOOTANIMATION_FILE[] = "/odm/media/bootanimation.zip";
static const char PRODUCT_BOOTANIMATION_DARK_FILE[] = "/product/media/bootanimation-dark.zip";
static const char PRODUCT_BOOTANIMATION_FILE[] = "/product/media/bootanimation.zip";
static const char SYSTEM_BOOTANIMATION_FILE[] = "/system/media/bootanimation.zip";
static const char APEX_BOOTANIMATION_FILE[] = "/apex/com.android.bootanimation/etc/bootanimation.zip";
static const char PRODUCT_ENCRYPTED_BOOTANIMATION_FILE[] = "/product/media/bootanimation-encrypted.zip";
static const char SYSTEM_ENCRYPTED_BOOTANIMATION_FILE[] = "/system/media/bootanimation-encrypted.zip";
static const char OEM_SHUTDOWNANIMATION_FILE[] = "/odm/media/shutdownanimation.zip";
static const char PRODUCT_SHUTDOWNANIMATION_FILE[] = "/product/media/shutdownanimation.zip";
static const char SYSTEM_SHUTDOWNANIMATION_FILE[] = "/system/media/shutdownanimation.zip";

static constexpr const char* PRODUCT_USERSPACE_REBOOT_ANIMATION_FILE = "/product/media/userspace-reboot.zip";
static constexpr const char* OEM_USERSPACE_REBOOT_ANIMATION_FILE = "/oem/media/userspace-reboot.zip";
static constexpr const char* SYSTEM_USERSPACE_REBOOT_ANIMATION_FILE = "/system/media/userspace-reboot.zip";

适配orangepi 5寸触摸屏

替换kernel-5.10/drivers/gpu/drm/panel/panel-innolux-afj101-ba2131.c

替换那个Android LOGO,直接替换frameworks/base/core/res/assets/images下面的图片
将开机的动画复制到device/rockchip/common/bootshutdown/bootanimation.zip。
这个MK其实是文件复制命令 把该文件复制到安卓系统目录供安卓调用

更新 香橙派5 用的是 bootanimation.ts

替换源码中的ts文件

路径

device/rockchip/common/bootvideo/bootvideo.mk

device/rockchip/common/bootvideo/bootanimation.ts

ffmpeg转TS文件

ffmpeg -i input.mp4 -c:v copy -c:a copy -bsf:v h264_mp4toannexb output.ts
ffmpeg -framerate 1 - start_number 0 -i %d.png -c:v libx264 -pix_fmt yuv420p output.mp4

替换默认壁纸
device\rockchip\rk3588\overlay\frameworks\base\core\res\res\drawable-nodpi\

device\rockchip\rk3588\overlay\frameworks\base\core\res\res\drawable-sw600dp-nodpi\

device\rockchip\rk3588\overlay\frameworks\base\core\res\res\drawable-sw720dp-nodpi\

用ROP主页图片当开机画面

切换默认中文输入法

mkdir device/rockchip/rk3588/rk3588s_s/preinstall_del

//该文件夹 存放预装单可手动删除的APK
//复制sogouInput.apk 到该目录


创建两个默认配置
修改
frameworks/base/packages/SettingsProvider/res/values/defaults.xml

 <string name="def_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME</string>

    <string name="enabled_input_method" translatable="false">com.sohu.inputmethod.sogou/.SogouIME:com.android.inputmethod.latin/.LatinIME</string>


修改
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java

增加读取两个setting

            loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,
                        R.string.def_input_method);

            loadStringSetting(stmt, Settings.Secure.ENABLED_INPUT_METHODS,
                        R.string.enabled_input_method);


设置locale列表第一位
修改
build/target/product/languages_default.mk

//把zh_CN 放在第一位
PRODUCT_LOCALES := \
        zh_CN \

添加android properties 修改时区默认语言
修改device/rockchip/rk3588/device.mk
PRODUCT_PROPERTY_OVERRIDES += \
                persist.sys.timezone=Asia/Shanghai \
                persist.sys.language=zh \
                persist.sys.country=CN \
                ro.product.locale=zh-CN \
                ro.product.locale.language=zh \
                ro.product.locale.region=CN \
                ro.allow.mock.location=1

防止每次编译安卓都清除历史

./build.sh
214 注释 make installclean

编译前准备

export BOARD=orangepi5
export DUAL_LCD=true
export IMAGE_TYPE=cn
source build/envsetup.sh
lunch rk3588s_s-userdebug

lunch rk3588s_s-user

PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=12
TARGET_PRODUCT=rk3588s_s
TARGET_BUILD_VARIANT=user
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.15.0-94-generic-x86_64-Ubuntu-20.04.6-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=SQ3A.220705.003.A1
OUT_DIR=out

默认输出目录为out

全量编译

-A表示Android

-U表示uboot

-K表示Kernel

-u表示update.img

./build.sh -AUKu