15AH, San Francisco

California, United States.

Send Your Mail At:

tianyingkejishe@sina.cn

Working Hours

Mon-Sat: 9.30am To 7.00pm

分类标题

Autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et dolore feugait.

分类归档 Linux

【DPDK】编译流程

$ cd /usr/src/
$ wget https://fast.dpdk.org/rel/dpdk-21.11.tar.xz
$ tar xf dpdk-21.11.tar.xz
$ export DPDK_DIR=/usr/src/dpdk-21.11
$ cd $DPDK_DIR
$ export DPDK_BUILD=$DPDK_DIR/build
$ meson setup build-arm64

$ ninja -C build
$ sudo ninja -C build install
$ sudo ldconfig
$ pkg-config --modversion libdpdk

【DPDK]交叉编译

一、环境准备

sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
sudo apt install meson ninja pkg-config gcc-multilib

二、创建交叉编译配置文件

[binaries]
# 交叉编译器路径(绝对路径/系统PATH中的别名)
c = 'aarch64-linux-gnu-gcc'
cpp = 'aarch64-linux-gnu-g++'
ar = 'aarch64-linux-gnu-ar'
strip = 'aarch64-linux-gnu-strip'
pkgconfig = 'pkg-config'  # 若目标机有 pkg-config,可指定目标机路径
ninja = '/usr/bin/ninja'

[host_machine]
# 目标架构:根据实际修改(aarch64/armv7l/mips64等)
system = 'linux'
cpu_family = 'aarch64'
cpu = 'cortex-a72'  # 目标CPU型号(可选,如 cortex-a53、x86_64)
endian = 'little'

[properties]
# 目标机内核头文件路径(关键!必须匹配目标机内核版本)
c_args = ['-I/path/to/target/linux-headers-5.15.0-101-arm64/include']
c_link_args = ['-L/path/to/target/lib64', '-lpthread', '-ldl']
# 禁用宿主机依赖检测,强制使用交叉编译环境
pkg_config_libdir = ['/path/to/target/usr/lib/aarch64-linux-gnu/pkgconfig']
# DPDK 特有配置:禁用不支持的驱动/功能
dpdk_cross = true
dpdk_disable_drivers = 'net/e1000,net/ixgbe'  # 禁用目标机无的网卡驱动
dpdk_enable_kmods = false  # 交叉编译时不编译内核模块(目标机单独编译)
  • 确保配置文件无中文、特殊符号(如「・」「¥」),仅用 ASCII 字符;
  • 验证文件编码:
file -i dpdk_cross_arm64.txt
# 输出:charset=utf-8 → 正常;若为 gbk/iso-8859-1,需转换
iconv -f GBK -t UTF-8 dpdk_cross_arm64.txt -o dpdk_cross_arm64_utf8.txt

三、DPDK 交叉编译实操

1. 源码准备

# 下载 DPDK 源码(以 22.11 为例)
wget https://fast.dpdk.org/rel/dpdk-22.11.tar.xz
tar -xf dpdk-22.11.tar.xz
cd dpdk-22.11

2. 初始化 Meson 构建目录

通过 --cross-file 指定交叉配置文件,同时设置关键参数:

# 创建构建目录
meson setup build-arm64 \
  --cross-file=/path/to/dpdk_cross_arm64.txt \
  --prefix=/opt/dpdk-arm64  # 编译后安装路径

3. 编译与安装

# 编译(-j 后跟核心数,加速编译)
ninja -C build-arm64 -j$(nproc)

# 安装到指定路径
ninja -C build-arm64 install

【Linux】error: macro “__TIME__” might prevent reproducible builds [-Werror=date-time]

解决方法有如下几种,可根据需求进行选择

第一种解决方法 在makefile中添加如下选项

EXTRA_CFLAGS += -Wno-error=date-time
EXTRA_CFLAGS +=-Wno-date-time

 注意:在第二段定位中已经说到只有在4.9以及之后的gcc版本中才有这两个选项,如果你在gcc版本小于4.9的系统上编译,比如在centos7.2系统中,centos中默认的gcc版本是4.8.5,编译时就会报"cc1: 错误:-Werror=date-time:没有选项 -Wdate-time"错误,所以这种解决方法如果只是使用4.9以上的gcc版本是没有问题的;


 第二种解决方法
修改/lib/modules/'uname -r'/build/Makefile文件,我的是/lib/modules/4.4.0-116-generic/build/Makefile
将KBUILD_CFLAGS   += $(call cc-option,-Werror=date-time)这一行注释掉



注意:这种方法虽然解决了这个问题,但是修改了系统本身的属性,不太推荐

第三种解决方法

这一种方法也是我比较推荐的方法,修改内核模块的makefile文件,添加一行

ccflags-y+=$(shell if [ $(call cc-version) -ge 0490 ] ; then echo "-Wno-error=date-time -Wno-date-time"; fi ;)

在linux内核的最顶层目录也就是根目录下面的Makefile文件中,有一个变量"KBUILD_CFLAGS",这个$(KBUILD_CFLAGS)中存放的是传递给gcc编译器的编译选项,如果被编译的文件在被gcc编译时,没有特殊的要求的话就会使用$(KBUILD_CFLAGS)中的编译选项。



 但是如果被gcc编译的文件有特殊的编译选项要求的话,使用如下的方式来指定编译选项:

 ccflags-y,是指定给$(CC)的编译选项;

 asflags-y,是指定给$(AS)的编译选项;

 ldflags-y,是指定给$(LD)的编译选项;

【Linux】linux5.10内核do_gettimeofday函数报错问题

linux5.10内核do_gettimeofday函数提示不存在。

解决办法使用ktime_get_real_ts64代替。

具体实例:

修改之前代码:

    struct  timeval   time_now;
	struct rtc_time tm; 
    do_gettimeofday(&time_now);
	rtc_time_to_tm(time_now.tv_sec, &tm); 

修改之后代码:

	struct timespec64 ts64;
	struct rtc_time tm; 
    ktime_get_real_ts64(&ts64);
	tm = rtc_ktime_to_tm(ts64.tv_sec); 

【Linux】内核log打印级别设置

1. 日志级别控制

  • 查看当前日志级别cat /proc/sys/kernel/printk # 输出:4 4 1 7 → 当前控制台阈值为4
  • 启用 pr_info 输出(需级别 ≤6):echo 7 > /proc/sys/kernel/printk # 将阈值设为7(允许INFO及以上日志输出)
  • 持久化配置:在 /etc/sysctl.conf 添加 kernel.printk = 7 4 1 77

2. 查看输出日志

  • 实时监控dmesg -w # 动态显示内核日志
  • 筛选特定日志dmesg --level=info # 仅显示INFO级别日志

common.mk:79: *** Kernel header files not in any of the expected locations. common.mk:80: *** Install the appropriate kernel development package, e.g. common.mk:81: *** kernel-devel, for building kernel modules and try again. Stop.

根据错误信息和搜索结果,该报错是由于编译内核模块时系统缺少与当前运行内核完全匹配的内核开发包(kernel-develkernel-headers)导致的。以下是完整解决方案:


🔧 一、安装匹配的内核开发包

  1. 确认当前内核版本
    终端执行:uname -r # 示例输出:3.10.0-1160.81.1.el7.x86_64
  2. 安装对应版本的内核开发包sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
    • 若yum仓库无匹配版本(常见于自定义内核或旧系统):
      • 手动下载rpm包:访问 pkgs.org 搜索内核版本对应的包(参考11
      • 强制安装:sudo rpm -ivh --force kernel-devel-*.rpm kernel-headers-*.rpm

📂 二、检查内核头文件路径

  1. 验证文件是否存在
    检查以下目录是否包含当前内核版本的文件夹:ls /usr/src/kernels/$(uname -r)
  2. 修复软链接问题(关键步骤)
    /usr/src/linux指向错误路径或无链接,需重建:sudo rm -f /usr/src/linux sudo ln -s /usr/src/kernels/$(uname -r) /usr/src/linux 注:此操作解决编译脚本查找头文件的路径问题(参考185

⚠️ 三、其他可能原因

  1. 未安装编译工具链
    确保已安装基础开发工具:sudo yum groupinstall "Development Tools" sudo yum install elfutils-libelf-devel # 缺少libelf时报错(引用[10]())
  2. 硬件兼容性问题
    • NVIDIA显卡驱动安装时需先禁用nouveau驱动(参考5):echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u
    • 虚拟机环境(如VMware)需检查内核模块签名(引用13

📝 四、完整操作流程示例

bash

复制

# 步骤1:安装开发包 sudo yum install -y gcc make kernel-devel-$(uname -r) kernel-headers-$(uname -r) # 步骤2:修复软链接 sudo ln -sfn /usr/src/kernels/$(uname -r) /usr/src/linux # 步骤3:重新编译驱动 cd /path/to/driver/src make clean && make sudo make install

💡 重要提示
若仍报错,请检查:

  1. 内核版本是否完全一致(包含次版本号,如3.10.0-1160.xx.x )
  2. 系统是否更新后未重启(需重启使新内核生效)
  3. Secure Boot是否禁用(部分驱动需关闭安全启动)

此问题90%由内核开发包版本不匹配软链接路径错误导致(综合12718)。如遇特殊情况,可查看具体驱动的common.mk 脚本中定义的路径规则。

【Luckfox Pico Ultra BW】RV1106G3 解决录音问题

分析原理图,实际开发板C58那里焊接的是0R电阻,所以这里接的是单端输入信号,不是差分!

我们再来看看野火开发板(LubanCat_RV06) 的麦克风接法

野火开发板使用了左右两个声道,都是差分输入。

查看当前设置 amixer controls

# amixer controls
numid=4,iface=MIXER,name='ADC ALC Left Volume'
numid=5,iface=MIXER,name='ADC ALC Right Volume'
numid=6,iface=MIXER,name='ADC Digital Left Volume'
numid=7,iface=MIXER,name='ADC Digital Right Volume'
numid=8,iface=MIXER,name='ADC HPF Cut-off'
numid=2,iface=MIXER,name='ADC MIC Left Gain'
numid=22,iface=MIXER,name='ADC MIC Left Switch'
numid=3,iface=MIXER,name='ADC MIC Right Gain'
numid=23,iface=MIXER,name='ADC MIC Right Switch'
numid=20,iface=MIXER,name='ADC MICBIAS Voltage'
numid=21,iface=MIXER,name='ADC Main MICBIAS'
numid=19,iface=MIXER,name='ADC Mode'
numid=1,iface=MIXER,name='I2STDM Digital Loopback Mode'
numid=17,iface=MIXER,name='AGC Left Approximate Sample Rate'
numid=18,iface=MIXER,name='AGC Right Approximate Sample Rate'
numid=11,iface=MIXER,name='ALC AGC Left Max Volume'
numid=13,iface=MIXER,name='ALC AGC Left Min Volume'
numid=15,iface=MIXER,name='ALC AGC Left Switch'
numid=9,iface=MIXER,name='ALC AGC Left Volume'
numid=12,iface=MIXER,name='ALC AGC Right Max Volume'
numid=14,iface=MIXER,name='ALC AGC Right Min Volume'
numid=16,iface=MIXER,name='ALC AGC Right Switch'
numid=10,iface=MIXER,name='ALC AGC Right Volume'
numid=26,iface=MIXER,name='DAC Control Manually'
numid=25,iface=MIXER,name='DAC HPMIX Volume'
numid=24,iface=MIXER,name='DAC LINEOUT Volume'

注意ADC Mode:numid=19,iface=MIXER,name=’ADC Mode’,查看当前ADC Mode设置

# amixer cget numid=19
numid=19,iface=MIXER,name='ADC Mode'
  ; type=ENUMERATED,access=rw------,values=1,items=6
  ; Item #0 'DiffadcL'
  ; Item #1 'SingadcL'
  ; Item #2 'DiffadcR'
  ; Item #3 'SingadcR'
  ; Item #4 'SingadcLR'
  ; Item #5 'DiffadcLR'
  : values=0

values=0:设置的左声道差分输入!这个和我们的硬件不匹配,修改成SingadcL

amixer cset numid=19 1

numid=19,iface=MIXER,name=’ADC Mode’
; type=ENUMERATED,access=rw——,values=1,items=6
; Item #0 ‘DiffadcL’
; Item #1 ‘SingadcL’
; Item #2 ‘DiffadcR’
; Item #3 ‘SingadcR’
; Item #4 ‘SingadcLR’
; Item #5 ‘DiffadcLR’
: values=1

再次测试录音和播放

# arecord -D plughw:0,0 -f cd -t wav -d 10 test.wav
Recording WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo
# aplay test.wav 
Playing WAVE 'test.wav' : Signed 16 bit Little Endian, Rate 44100 Hz, Stereo

终于正常了,拷贝到电脑上,只有左耳机有声音。声音清晰!纠结了几天的问题终于解决了。

最后非常感谢野火提供资料。看了这么多资料,感觉野火的资料最实在,干货最多。

【Linux】编译适用于NOR Flash的Linux文件系统

在嵌入式系统中,使用NOR Flash作为存储介质时,通常需要选择合适的文件系统并进行相关配置和编译。以下是实现这一目标的步骤。

1. 准备工作

  • 获取工具链:安装交叉编译工具,如 gcc-linaro 和设备树编译器 dtc
  • 下载源码: U-Boot 源码:Lichee-Pi U-Boot。 Linux 内核源码:Lichee-Pi Linux。

2. 配置和编译U-Boot

  • 配置支持NOR Flash
make ARCH=arm menuconfig
  • 设置默认启动参数: 修改 include/configs/sun8i.h 文件,添加如下内容:
#define CONFIG_BOOTCOMMAND "sf probe 0; sf read 0x41800000 0x100000 0x10000; sf read 0x41000000 0x110000 0x400000; bootz 0x41000000 - 0x41800000"
#define CONFIG_BOOTARGS "console=ttyS0,115200 root=/dev/mtdblock3 rootfstype=jffs2 rw"
  • 编译U-Boot
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4

3. 配置和编译Linux内核

  • 配置内核选项: make ARCH=arm menuconfig 启用 Device Drivers -> Memory Technology Device (MTD) support。 启用 File systems -> Miscellaneous filesystems -> JFFS2 support。
  • 修改设备树文件: 在设备树文件(如 sun8i-v3s-licheepi-zero.dts)中添加SPI Flash节点:
&spi0 {
   status = "okay";
   flash@0 {
       compatible = "jedec,spi-nor";
       reg = <0x0>;
       spi-max-frequency = <50000000>;
   };
};
  • 编译内核和设备树
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs

4. 制作JFFS2文件系统镜像

  • 安装工具:
sudo apt-get install mtd-utils
  • 制作镜像:
mkfs.jffs2 -s 0x100 -e 0x10000 -p 0xAF0000 -d rootfs/ -o jffs2.img

5. 打包镜像

  • 将U-Boot、内核、设备树和文件系统打包为一个镜像:

dd if=/dev/zero of=flashimg.bin bs=1M count=16
dd if=u-boot-sunxi-with-spl.bin of=flashimg.bin bs=1K conv=notrunc
dd if=sun8i-v3s-licheepi-zero.dtb of=flashimg.bin bs=1K seek=1024 conv=notrunc
dd if=zImage of=flashimg.bin bs=1K seek=1088 conv=notrunc
dd if=jffs2.img of=flashimg.bin bs=1K seek=5184 conv=notrunc

6. 烧录镜像到NOR Flash

  • 使用 sunxi-fel 工具烧录镜像:
sudo sunxi-fel -p spiflash-write 0 flashimg.bin

【BLUE】蓝牙模块连接蓝牙耳机

一、测试环境

硬件:A7核 平台:ubuntu22.04

1、安装相应的依赖库文件

ntpd -d #确保能访问外网后执行 同步时间
sudo apt update 
sudo apt install bluez
sudo apt install pulseaudio-module-bluetooth
sudo apt-get install bluez bluez-firmware

2、停止蓝牙服务:在终端输入以下命令停止蓝牙服务。

sudo systemctl stop bluetooth

启动蓝牙服务:在终端输入以下命令启动蓝牙服务。

sudo systemctl start bluetooth

3、启动 pulseaudio 服务,重启开发板后要重新启动服务

insmod /oem/usr/ko/aic8800_btlpm.ko

hciattach -s 1500000 /dev/ttyS1 any 1500000 flow nosleep& #最新SDK

# 先配置好 alsa 再启动

pulseaudio –start

二、连接蓝牙耳机设备

1、配对蓝牙声卡

发现蓝牙设备:在终端输入以下命令发现蓝牙设备。

sudo bluetoothctl

power on  # 使能控制器
pairable on # 设置控制器可配对

扫描设备:在蓝牙控制台中输入以下命令扫描设备。

scan on
scan off

选择设备:当蓝牙声卡出现在设备列表中时,输入以下命令选择设备。

pair [设备地址]

输入PIN码:当系统提示输入PIN码时,出现pin码时输入yes,输入默认的PIN码“0000”。

连接设备:在蓝牙控制台中输入以下命令连接设备。

connect [设备地址]

2、设置默认音频设备

查看当前音频设备:在终端输入以下命令查看当前音频设备。

pacmd list-sinks

设置默认音频设备:找到蓝牙声卡对应的设备索引,然后在终端输入以下命令设置默认音频设备。

pacmd set-default-sink [设备索引]

3、检查音量设置

查看音量设置:在终端输入以下命令查看音量设置。

amixer

调整音量:如果音量设置过低,请调整音量。

amixer set Master [音量值]

设置绝对音量,0%-100%,1表示声卡号或者名字。

pactl set-sink-volume 1 90%

设置相对音量,增大10%

pactl set-sink-volume 1 +10%

设置相对音量,减小10%

pactl set-sink-volume 1 -10%