- 2025-01-24
-
回复了主题帖:
【luckfox】RV1106 Linux驱动测试
-
发表了主题帖:
【luckfox】RV1106 Linux驱动测试
# Linux驱动测试
测试一把最简单helloworld驱动程序,了解一下驱动编程的基本概念。源文件包含两个文件:helloworld.c和Makefile
```bash
➜ helloworld tree
.
├── helloworld.c
├── Makefile
1 directory, 2 files
```
helloworld.c
```c
#include
#include
static int helloworld_init(void)
{
printk("helloworld!\n");
return 0;
}
static void helloworld_exit(void)
{
printk("helloworld bye\n");
}
module_init(helloworld_init);
module_exit(helloworld_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Luckfox");
MODULE_VERSION("V1.0");
```
Makefile
```makefile
obj-m += helloworld.o
KDIR:=/home/bruce/Documents/luckfox-pico/sysdrv/source/kernel
PWD?=$(shell pwd)
MAKE := make
ARCH := arm
CROSS_COMPILE := /home/bruce/Documents/luckfox-pico/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/bin/arm-rockchip830-linux-uclibcgnueabihf-
KBUILD_OUTPUT := $(abspath $(dir $(lastword $(KDIR))))/objs_kernel
all:
echo KBUILD_OUTPUT = $(KBUILD_OUTPUT)
$(MAKE) O=$(KBUILD_OUTPUT) -C $(KDIR) M=$(PWD) modules ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE)
echo $(PWD)
clean:
rm -f *.ko *.o *.mod *.mod.o *.mod.c *.symvers *.order
```
编译,查看生成的文件
上传到板子测试
- 2025-01-23
-
回复了主题帖:
【luckfox fox】RV1106 GPIO测试
markdown源码格式被系统处理了,代码前面的空格都被去掉了。希望论坛管理人员把这个老BUG修复一下。
-
发表了主题帖:
【luckfox fox】RV1106 GPIO测试
# GPIO测试
## 引言
官方文档使用的是传统的GPIO操作方法:
https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-RV1106/Luckfox-Pico-Pro-Max/Luckfox-pinout/Luckfox-Pico-GPIO
通用输入输出(GPIO)接口对于嵌入式系统至关重要,它允许各种硬件组件之间以及与主CPU之间进行通信。过去,在Linux平台上处理GPIO的主要方式是通过`/sys/class/gpio`接口。然而,随着libgpiod库的引入,一种更高效、用户友好的GPIO操作方法出现了。本文将介绍使用libgpiod进行的测试,比较其与传统GPIO使用方法的优缺点。
## 配置
选择 `Target packages -> Libraries -> Hardware handling`,选择`libgpiod`
## 编译
```bash
./build.sh
```
从下面的截图可以看出,下载的是`libgpiod 1.6.3`版本。
## 下载
重新打包下载到设备
```bash
[root@luckfox root]# gpiodetect
gpiochip0 [gpio0] (32 lines)
gpiochip1 [gpio1] (32 lines)
gpiochip2 [gpio2] (32 lines)
gpiochip3 [gpio3] (32 lines)
gpiochip4 [gpio4] (24 lines)
[root@luckfox root]# gpioinfo
gpiochip0 - 32 lines:
line 0: unnamed unused input active-high
line 1: unnamed unused input active-high
line 2: unnamed unused input active-high
line 3: unnamed unused input active-high
line 4: unnamed unused input active-high
line 5: unnamed unused input active-high
line 6: unnamed unused input active-high
line 7: unnamed unused input active-high
line 8: unnamed unused input active-high
```
## 升级libgpiod
`libgpiod`最新的已经是v2了,v2和v1的API不兼容,这里用的Buildroot是`2023.02.6`版本,这个版本没有v2 libgpiod。我们来尝试集成一下最新的v2版本。
从最新的Buildroot源码中拷贝`package/libgpiod2`文件夹,修改`package/Config.in`文件,添加
```makefile
source "package/libgpiod2/Config.in"
```
再次执行`./build.sh buildrootconfig`,搜索`libgpiod`,出现了v2版本。和之前一样,选择`libgpiod2`。注意`libgpiod`和`libgpiod2`只能二选一,不能同时选择两个。
编译`./build.sh`,可以看到开始配置`libpgiod2 2.1.3`版本。
重新升级程序
验证版本信息,搞定!
```bash
[root@luckfox root]# gpiodetect -v
gpiodetect (libgpiod) v2.1.3
Copyright (C) 2017-2023 Bartosz Golaszewski
License: GPL-2.0-or-later
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
```
> 注意:如果执行了`./build.sh clean`,上面的配置会丢失,需要重新配置。
## 编程测试
LUCKFOX rv1106 GPIO定义如下
通过编程测试这个引脚`GPIO1_C7_d `,组内number=2*8+7=23,这个23后面编程要用。
### C++测试
使用cmake写一个简单的demo
封装一个`GPIOCTRL`类,可以基于这个做扩展。
gpio-ctrl.hpp
```c++
#include
#include
#include
class GPIOCTRL
{
public:
GPIOCTRL();
~GPIOCTRL();
void gpioCtrl(bool on);
private:
std::vector request_list;
};
```
gpio-ctrl.cpp
```c++
#include "gpio-ctrl.hpp"
GPIOCTRL::GPIOCTRL()
{
::std::filesystem::path chip_path("/dev/gpiochip0");
::gpiod::line::offset line_offset = 23;
auto request =
::gpiod::chip(chip_path)
.prepare_request()
.set_consumer("toggle-line-value")
.add_line_settings(
line_offset,
::gpiod::line_settings().set_direction(
::gpiod::line::direction::OUTPUT))
.do_request();
request_list.push_back(std::make_shared(std::move(request)));
}
GPIOCTRL::~GPIOCTRL() {}
void GPIOCTRL::gpioCtrl(bool on) {
::gpiod::line::value value = ::gpiod::line::value::ACTIVE;
if (!on) value = ::gpiod::line::value::INACTIVE;
int line_offset = 23;
auto& request = request_list[0];
request->set_value(line_offset, value);
}
```
测试程序 main.cpp
```c++
#include
#include
#include
#include
#include
#include
#include "gpio-ctrl.hpp"
int main()
{
bool ctrl = true;
GPIOCTRL gpio;
gpio.gpioCtrl(ctrl);
for (;;) {
std::this_thread::sleep_for(std::chrono::seconds(1));
::std::cout
- 2025-01-22
-
发表了主题帖:
【luckfox fox】RV1106 交叉编译
# RV1106 交叉编译
为了方便交叉编译,Buildroot提供了一个脚本。
## 配置
首先打开Buildroot的SDK配置脚本,有了这个脚本,我们可以基于Buildroot的环境编译应用程序。
进入Buildroot目录:`luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6`
```bash
cd sysdrv/source/buildroot/buildroot-2023.02.6
make menuconfig
```
选择:`Host utilities -> host environment-setup`,保存编译
进入目录`output/host`查看,发现`environment-setup`已经成功生成。测试一下
```bash
$ source environment-setup
$ echo $CC
arm-rockchip830-linux-uclibcgnueabihf-gcc
```
交叉编译
```bash
➜ test cat hello.c
#include
int main() {
printf("hello world!\n");
return 0;
}
➜ test $CC hello.c
➜ test ls
a.out hello.c
# 查看文件类型
➜ test file a.out
a.out: ELF 32-bit LSB pie executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-uClibc.so.0, not stripped
```
## 测试验证
将a.out上传到开发板,运行成功
-
发表了主题帖:
【RV1106】libPJSIP编译测试
# libPJSIP编译测试
在物联网时代,音视频通讯技术变得愈发重要。RV1106是一款专为边缘设备设计的多媒体处理器,而PJSIP是一个高度模块化的开源音视频通讯框架。本文将探讨RV1106平台上PJSIP库的性能、功能和适用场景。
PJSIP是一个开源的协议栈,支持SIP、SDP、RTP/RTCP等通信协议,广泛应用于VoIP(语音通信)和视频通信领域。其优雅的API设计和跨平台兼容性使其成为开发实时通讯应用的理想选择。PJSIP还提供了多种音视频编解码器,可以灵活地与不同的设备和网络条件适配。
## 配置
默认rootfs中没有集成`libpjsip`库,需要我们手动配置打开。
打开`buildroot`配置菜单:
```bash
./build.sh buildrootconfig
```
配置路径为:`> Target packages > Libraries > Networking`
选择`y`,保存到`.config`中。
编译
```bash
./build.sh
```
由于配置已经变动,默认会自动下载`libpjsip`并进行编译,从log中可以看出这里使用的版本是`2.13.1`
等待一会儿,编译成功,查看buildroot目录`luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6/output/staging/usr/lib`。相关库文件已成功生成。
接下来基于这个库编写应用,敬请期待~
- 2025-01-19
-
发表了主题帖:
【Luckfox Pico】功能初体验
# 功能初体验
上一篇我们已经编译好了镜像,这一篇开始使用编译好的镜像下载到开发板体验一下。
## 准备工作
准备一条USB转串口数据线,按照下图连接好。上电后就会有log输出。
在`work`目录下是测试例程。运行了一下会报错,具体原因暂时未知。等后面再看。
```bash
# cd work/
# ls -alh
total 2M
drwxr-xr-x 6 root root 696 Jun 7 2024 .
drwx------ 3 1002 1002 224 Jan 1 12:17 ..
-rw------- 1 root root 82.4K Jun 6 2024 lenet.rknn
drwx------ 2 root root 304 Jun 6 2024 lib
-rwx--x--x 1 root root 1.8M Jun 6 2024 luckfox_rtsp_opencv
drwx------ 3 root root 304 Jun 7 2024 luckfox_rtsp_opencv_knva
drwx------ 4 root root 368 Jun 6 2024 luckfox_rtsp_retinaface_demo
drwx------ 2 root root 232 Jun 6 2024 model
-rwx------ 1 root root 288.7K May 21 2024 simple_vi_venc_rtsp
# pwd
/root/work
# ./luckfox_rtsp_opencv
rkaiq log level ff0
ID: 0, sensor_name is , iqfiles is /etc/iqfiles
Segmentation fault (core dumped)
# ./simple_vi_venc_rtsp
#CodecName:H264
#Resolution: 1920x1080
#CameraIdx: 0
#Frame Count to save: -1
ISP IQ file path: /etc/iqfiles
rkaiq log level ff0
ID: 0, sensor_name is , iqfiles is /etc/iqfiles
Segmentation fault (core dumped)
```
## 烧录SPI NAND Flash
现在使用`SocToolKit_v1.98_20240705_01_win`下载之前编译好的镜像。
将编译生成的`luckfox-pico/output/image`文件夹拷贝到`Windows`目录下,在软件上面点击按钮`搜索路径`选择`image`文件夹。选中所有文件。
按住BOOT键重新上电,松开BOOT后应该会显示 `MaskRom` 设备
下载中。。。
等待下载完成自动重启。。。
新镜像启动成功
-
发表了主题帖:
【Luckfox Pico】开发环境搭建
# 开发环境搭建
登录官网:https://wiki.luckfox.com/zh/intro/
定位到`Luckfox Pico Pro Max`页面,这里有详细的操作手册。接下来我们跟着文档一起学习。
> 官方推荐的开发环境是`Ubuntu 22.04`,我的是`Ubuntu 24.04`,测试下来正常。
安装相关的包
```bash
sudo apt update
sudo apt-get install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync
```
拉取最新的SDK源代码
```bash
git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git
```
配置
```bash
cd luckfox-pico
./build.sh lunch
# 硬件版本:6 RV1106_Luckfox_Pico_Max
# 启动介质:1 SPI FLASH
# 系统:Buildroot
```
启动编译
```bash
./build.sh
```
编程成功
查看生成产物目录
```bash
ls -alh output/images
total 133M
-rw-rw-r-- 1 bruce bruce 3.1M Jan 19 16:28 boot.img
-rw-rw-r-- 1 bruce bruce 263K Jan 19 16:28 download.bin
-rw-rw-r-- 1 bruce bruce 256K Jan 19 16:30 env.img
-rw-rw-r-- 1 bruce bruce 184K Jan 19 16:28 idblock.img
-rw-rw-r-- 1 bruce bruce 12M Jan 19 16:30 oem.img
-rw-rw-r-- 1 bruce bruce 49M Jan 19 16:30 rootfs.img
-rw-rw-r-- 1 bruce bruce 1.7K Jan 19 16:30 sd_update.txt
-rw-rw-r-- 1 bruce bruce 1.6K Jan 19 16:30 tftp_update.txt
-rw-rw-r-- 1 bruce bruce 256K Jan 19 16:28 uboot.img
-rw-rw-r-- 1 bruce bruce 67M Jan 19 16:30 update.img
-rw-rw-r-- 1 bruce bruce 1.9M Jan 19 16:30 userdata.img
```
-
发表了主题帖:
RV1106开箱
# RV1106 开箱报告
前几天,我终于收到了期待已久的 Luckfox RV1106G3 开发板。由于最近一直忙于 Yocto 开发,因此没能及时进行评测。不过,今天我想先分享一下开箱的初体验。
## 包装及外观
开箱时,RV1106G3 的包装非常结实,外部印刷清晰,给人一种专业的感觉。打开盒子后,映入眼帘的是开发板本身,整齐地放在泡沫保护层中,确保在运输过程中不会受到损坏。
## 配置概览
开发板上配备了一些关键组件,包括:
RV1106 处理器:为图像处理及边缘AI应用提供强大性能。
丰富的接口:包括 USB、GPIO、I2C 等,便于扩展和连接各种外部设备。
此外,开发板还配有相应的传感器接口,支持多种应用场景。
## 附件一览
除了开发板,包装内还包含了:
摄像头:SC3336 300万像素
纽扣电池:RTC供电
## 初步印象
在外观上,RV1106G3 看起来非常精致,元件布局合理,给人一种高质量的感觉。我特别喜欢它的紧凑设计,这样在进行实际开发时,可以更容易地进行集成。
总的来说,Luckfox RV1106G3 开发板给我的第一印象非常不错,我期待利用RV1106做出更有意思的项目!如果大家对这块开发板有任何问题,欢迎交流。
- 2025-01-08
-
回复了主题帖:
【测评入围名单(最后1批)】年终回炉:FPGA、AI、高性能MCU、书籍等65个测品邀你来~
个人信息无误,确认可以完成测评计划
- 2024-11-04
-
发表了主题帖:
《CMake构建实战》CMake 构建目标和属性
# CMake 构建目标和属性
## 二进制构建目标
在构建过程中被构建的可执行文件、库文件或目标文件都可以作为二进制构建目标。
### 可执行文件目标
```cmake
add_executable(
[WIN32] [MACOSX_BUNDLE]
[EXCLUDE_FROM_ALL]
[源文件...])
```
该命令会创建一个可执行文件类型的构建目标,其中第一个参数是必选参数,且应当在项目中唯一。
创建一个小工程实践一下。创建`008`文件夹
创建`CMakeLists.txt`
```cmake
cmake_minimum_required(VERSION 3.20)
project(myProgram)
add_executable(myProgram main.c)
add_executable(myProgramExcludedFromAll
EXCLUDE_FROM_ALL
main.c)
```
创建`main.c`
```c
#include
int main() {
printf("hello world\n");
return 0;
}
```
执行命令
```bash
bruce@ubuntu:~/Documents/study/cmake/008$ touch CMakeLists.txt
bruce@ubuntu:~/Documents/study/cmake/008$ vi CMakeLists.txt
bruce@ubuntu:~/Documents/study/cmake/008$ vi main.c
bruce@ubuntu:~/Documents/study/cmake/008$ mkdir build
bruce@ubuntu:~/Documents/study/cmake/008$ cd build/
bruce@ubuntu:~/Documents/study/cmake/008/build$ cmake ..
-- The C compiler identification is GNU 13.2.0
-- The CXX compiler identification is GNU 13.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.2s)
-- Generating done (0.0s)
-- Build files have been written to: /home/bruce/Documents/study/cmake/008/build
bruce@ubuntu:~/Documents/study/cmake/008/build$ make
[ 50%] Building C object CMakeFiles/myProgram.dir/main.c.o
[100%] Linking C executable myProgram
[100%] Built target myProgram
bruce@ubuntu:~/Documents/study/cmake/008/build$ ./myProgram
hello world
```
### 一般库目标
一般库目标包括静态库目标、动态库目标和模块库目标。
```cmake
add_library(
[EXCLUDED_FROM_ALL]
[...])
```
该命令会创建一个一般库类型的构建目标,其中参数是必选项,且应在项目中唯一。
参数有以下三个取值。
* STATIC
* SHARED
* MODULE
实践,创建`009`文件夹
创建 `CMakeLists.txt`
```cmake
cmake_minimum_required(VERSION 3.20)
project(mylib)
add_library(mylib lib.c)
```
创建`lib.c`
```c
int add(int a, int b) { return a+b; }
```
操作过程如下
```bash
bruce@ubuntu:~/Documents/study/cmake/009$ vi CMakeLists.txt
bruce@ubuntu:~/Documents/study/cmake/009$ ls
CMakeLists.txt
bruce@ubuntu:~/Documents/study/cmake/009$ touch lib.c
bruce@ubuntu:~/Documents/study/cmake/009$ vi lib.c
bruce@ubuntu:~/Documents/study/cmake/009$ ls
CMakeLists.txt lib.c
bruce@ubuntu:~/Documents/study/cmake/009$ mkdir build
bruce@ubuntu:~/Documents/study/cmake/009$ cd build/
bruce@ubuntu:~/Documents/study/cmake/009/build$ cmake ..
-- The C compiler identification is GNU 13.2.0
-- The CXX compiler identification is GNU 13.2.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.2s)
-- Generating done (0.0s)
-- Build files have been written to: /home/bruce/Documents/study/cmake/009/build
bruce@ubuntu:~/Documents/study/cmake/009/build$ make
[ 50%] Building C object CMakeFiles/mylib.dir/lib.c.o
[100%] Linking C static library libmylib.a
[100%] Built target mylib
bruce@ubuntu:~/Documents/study/cmake/009/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake libmylib.a Makefile
bruce@ubuntu:~/Documents/study/cmake/009/build$
```
可以看到最后生成了 `libmylib.a`
可以看到不定义`BUILD_SHARED_LIBS`变量时,默认构建静态库。接下来试验定义`BUILD_SHARED_LIBS`
```bash
bruce@ubuntu:~/Documents/study/cmake/009/build$ cmake -DBUILD_SHARED_LIBS=ON ..
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /home/bruce/Documents/study/cmake/009/build
bruce@ubuntu:~/Documents/study/cmake/009/build$ cmake --build .
[ 50%] Building C object CMakeFiles/mylib.dir/lib.c.o
[100%] Linking C shared library libmylib.so
[100%] Built target mylib
bruce@ubuntu:~/Documents/study/cmake/009/build$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake libmylib.a libmylib.so Makefile
bruce@ubuntu:~/Documents/study/cmake/009/build$
```
定义了`BUILD_SHARED_LIBS`后生成了`libmylib.so`动态库。
-
回复了主题帖:
《CMake构建实战》CMake常用命令
秦天qintian0303 发表于 2024-11-2 23:08
CMake提供了math命令用于计算数学表达式,写法有什么不同吗
我感觉平时使用CMake几乎用不到,可能是方便一些特殊场景吧
- 2024-11-02
-
发表了主题帖:
《CMake构建实战》CMake常用命令
# CMake 常用命令
CMake提供了很多命令,这些命令能够帮助我们在CMake程序中实现各种功能,包括对数值、字符串、列表、文件、路径的操作,生成文件、输出日志、指令命令行程序、引用模块、实现元编程、辅助调试等。
## 数值操作命令:math
CMake提供了math命令用于计算数学表达式。尽管这不如表达式语法那样简单直接,但鉴于构建过程中涉及数值计算的需求少之又少,使用math命令也算是在保持CMake语法单一性的前提下较为简单实用的一种方式了。
创建1.cmake
```cmake
cmake_minimum_required(VERSION 3.20)
math(EXPR a 10*10 OUTPUT_FORMAT DECIMAL)
message("a=${a}")
```
测试
```bash
$ cmake -P 1.cmake
a=100
```
## 字符串操作命令:string
### 搜索和替换
语法
```cmake
string(FIND [REVERSE])
```
新建 `2.cmake`,搜索子字符串`a`
```cmake
string(FIND aba a res)
message("${res}")
```
从aba字符串搜索a,如果找到,返回字符串a所在的位置,上面的例子应该返回0,测试一下
```bash
$ cmake -P 2.cmake
0
```
### 替换字符串
语法
```cmake
string(REPLACE )
```
新建 `3.cmake`
```cmake
string(REPLACE a b res aba)
message("${res}")
```
将aba字符串中的a全部替换为b,上面的例子应该返回`bbb`,测试一下
```bash
$ cmake -P 3.cmake
bbb
```
### 取字符串长度
语法
```cmake
string(LENGTH )
```
新建 `4.cmake`
```cmake
string(LENGTH aba res)
message("${res}")
```
计算字符串`aba`的长度,保存到`res`变量中,测试一下
```bash
$ cmake -P 4.cmake
3
```
## 列表操作指令list
### 列表长度
```cmake
list(LENGTH )
```
新建 `5.cmake`
```cmake
set(x a b c)
list(LENGTH x res )
message("${res}")
```
计算列表`x`的长度,保存到`res`变量中,测试一下
```bash
$ cmake -P 5.cmake
3
```
### 列表元素操作
```cmake
list(APPEND [...])
```
在 `5.cmake` 基础上修改
```cmake
set(x a b c)
list(LENGTH x res )
message("${res}")
list(APPEND x d e f g)
message("${x}")
```
在列表`x`后面追加 `d e f g` 四个元素,测试结果如下
```bash
$ cmake -P 5.cmake
3
a;b;c;d;e;f;g
```
- 2024-10-31
-
回复了主题帖:
【2024 DigiKey创意大赛】基于Linux系统的远程实时语音对讲系统
-
发表了主题帖:
【2024 DigiKey创意大赛】基于Linux系统的远程实时语音对讲系统
# 基于Linux系统的远程实时语音对讲系统
作者:小麦克
## 一、作品简介
本系统基于NXP最新的iMX93芯片和配套的Linux 6.6.23操作系统,旨在实现高效、实时的远程语音对讲功能。系统利用PJSIP协议栈,通过以太网进行语音数据的实时传输,以确保低延迟和高质量的语音通话体验。
在硬件方面,系统主要采用以太网LAN8841芯片负责网络连接,LAN8841具有出色的网络性能和稳定性。同时,语音芯片VK419则承担着语音信号的处理功能,支持高质量的音频编解码,为用户提供清晰、自然的语音交流效果。
尽管NXP IMX93配套的Linux系统并未支持LAN8841和VK419芯片,但我通过手动移植驱动程序并进行调试,实现了对这两种芯片的成功支持。这个过程中让我深入学习了嵌入式驱动开发相关技能,为后面的开发打下了坚实的基础。
该远程语音对讲系统广泛应用于家庭、办公室以及各种远程通信场所,具备良好的扩展性和适应性,满足不同场景下的语音交互需求。
实物图如下:核心板使用的是正点原子的
## 二、系统框图
以上框图画的比较全面,由于时间原因,本次参赛只做了其中语音对讲部分。
本系统的设计思路旨在结合高性能硬件与灵活的软件架构,以实现一个可靠、高效的远程实时语音对讲解决方案。具体设计思路如下:
### 1. 硬件选择与集成
IMX93芯片:选择NXP IMX93芯片作为系统的核心处理器,利用其强大的处理能力和丰富的外设接口,以支持复杂的语音处理和网络通信。
LAN8841以太网芯片:为了实现稳定的网络连接,选择LAN8841以太网芯片。该芯片的高效性和稳定性确保了数据传输的实时性。
VK419语音芯片:使用VK419语音芯片作为音频处理单元,实现语音信号的高质量编解码和处理。
### 2. 软件架构设计
操作系统:基于Linux的开放性和灵活性,使系统能够更好地支持各种网络和音频处理需求。
驱动移植:为了支持LAN8841和VK419芯片,手动移植必要的驱动程序,并针对特定硬件进行调试,确保其在Linux环境下的稳定运行。
通信协议:采用PJSIP作为协议栈,利用其成熟的SIP协议特性实现音频数据的实时传输和管理,从而保证低延迟的语音通话体验。
### 3. 功能模块设计
语音处理模块:负责音频的采集、编码、解码和播放,确保用户之间的语音交流清晰、流畅。
网络通信模块:负责数据包的交换和管理,实现跨网络区域的实时连接。
## 三、各部分功能说明
### 1. 硬件设计
以太网LAN8841原理图设计
音频芯片AK4619原理图设计
iMX93启动配置和调试串口
### 2. 软件设计
u-boot和Linux内核在NXP官方6.6.23基础上进行修改。
文件系统使用Buildroot构建,选择添加了libpjsip2.14等包。
应用层采用C++编写。
源代码都打包上传了,这里就不单独拷贝了。
## 四、作品源码
源码已上传到网站
PCB:https://download.eeworld.com.cn/detail/%E5%B0%8F%E9%BA%A6%E5%85%8B/634854
Linux:https://download.eeworld.com.cn/detail/%E5%B0%8F%E9%BA%A6%E5%85%8B/634853
Buildroot:https://download.eeworld.com.cn/detail/%E5%B0%8F%E9%BA%A6%E5%85%8B/634852
## 五、作品功能演示视频
[localvideo]4e676134f3f1a688cbf0f7fab941ea8e[/localvideo]
## 六、项目总结
本项目旨在开发一套基于NXP IMX93芯片和Linux操作系统的远程实时语音对讲系统。通过系统集成和技术创新,成功实现了语音通信解决方案。
### 1. 项目目标与实现
本项目的核心目标是设计一款能够在网络环境中实现实时语音对讲的系统。项目实施过程中,考虑了以下几个方面:
硬件选择:通过选用IMX93芯片作为核心处理单元,结合LAN8841以太网芯片和VK419语音芯片,实现了系统的性能和功能需求。
驱动移植与调试:由于NXP IMX93的Linux系统原生不支持LAN8841和VK419,我们手动移植了驱动程序,并经过细致调试,使其在Linux环境中的稳定运行成为可能。
软件架构:采用灵活的PJSIP协议栈处理语音数据,以确保低延迟和高质量的通话体验,构建了系统的核心功能模块。
### 2. 未来展望
虽然本项目已成功完成系统设计与实现,但仍有进一步优化与扩展的机会:
功能扩展:未来可以考虑增加更多的功能,如视频对讲、录音回放等,提升用户的使用体验。
性能优化:在今后的版本中,持续关注系统性能,特别是在多用户同时使用的情况下,优化网络负载与语音质量。
## 七、结语
基于Linux系统的远程实时语音对讲系统项目的成功实施,期待后续能在此基础上,继续深化技术应用与创新。
-
上传了资料:
imx93 pcb
-
上传了资料:
imx93-linux-kernel
-
上传了资料:
imx93-audio-buildroot
- 2024-10-25
-
发表了主题帖:
《CMake构建实战》CMake实践-交叉编译APP
## CMake实践-交叉编译APP
之前在这篇[帖子](https://bbs.eeworld.com.cn/thread-1291655-1-1.html)写过使用buildroot生成的sdk开发包开发应用程序。在这个基础上来实践CMake交叉编译。
这里以编译引用`pjsip`库的应用程序为例,通过`buildroot`编译会自动生成 `libpjproject.pc`
测试一下。在工具链目录搜索`libpjproject.pc`,这个文件后面的CMake会用到。
```bash
$ find -name "libpjproject.pc"
./aarch64-buildroot-linux-gnu/sysroot/usr/lib/pkgconfig/libpjproject.pc
```
CMake开发环境
```bash
# 生效buildroot
source ~/Documents/aarch64-buildroot-linux-gnu_sdk-buildroot/environment-setup
```
创建`CMakeLists.txt`
```cmake
cmake_minimum_required(VERSION 3.10)
project(PJSUA2App)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
find_package(PkgConfig REQUIRED)
pkg_check_modules(PJSIP REQUIRED libpjproject)
add_definitions(-DPJ_AUTOCONF=1)
add_executable(pjsua2_app pjsip-call.cpp)
target_link_libraries(pjsua2_app ${PJSIP_LIBRARIES})
```
通过`libpjproject` 找到 `pjsip` 相关的库
### 测试例子
新建如下目录结构
```bash
$ tree
.
├── build
├── CMakeLists.txt
└── pjsip-call.cpp
2 directories, 3 files
```
pjsip-call.cpp文件
```c++
#include
#include
#include
#define THIS_FILE "pjsua2_demo.cpp"
using namespace pj;
class MyEndpoint : public Endpoint
{
public:
MyEndpoint() : Endpoint() {};
virtual pj_status_t onCredAuth(OnCredAuthParam &prm)
{
PJ_UNUSED_ARG(prm);
std::cout
- 2024-10-13
-
回复了主题帖:
《CMake构建实战》CMake 变量
Jacktang 发表于 2024-10-13 08:37
CMake 变量和其他编程语言没有什么特色啊
个人感觉CMake变量比较随意,和其他编程语言还是有较大区别,需要熟悉之后才能应用