mysql -u root -p --default-character-set=utf8 xxxxx < xxxx.sql
mysql -u root -p --default-character-set=utf8 xxxxx < xxxx.sql
国产飞腾芯片s5000c-16
国产网讯网卡WX1860AL2
Distributor ID: Ubuntu
Description: Ubuntu Built with Buildroot, based on Ubuntu 22.04 LTS
Release: 22.04
Codename: jammy
直接从官网下载就好,本实现使用的版本:ngbe-1.2.7.zip
不同平台上编译,安装的命令不同:
•Kylin V10/银河麒麟 操作系统:
编译:
make CHNOS=KYLIN
安装:
make CHNOS=KYLIN modules_install
或者
make CHNOS=KYLIN install
•UOS 操作系统:
编译:
make CHNOS=UOS
安装
make CHNOS=UOS modules_install
或者
make CHNOS=UOS install
•Euler 操作系统:
编译:
make CHNOS=EULER
安装:
make CHNOS=EULER modules_install
或者
make CHNOS=EULER install
•其他平台操作系统:
编译:
make
安装:make modules_install
或者
make install
4) 加载驱动:
modprobe txgbe (仅安装完首次需要手动加载,若重启系统,系统会自动加载驱动)。
5)查看驱动是否加载成功:
[root@SW ~]# lsmod | grep txgbe
txgbe 208399 0
表明驱动已经加载上。
1)显示已安装的驱动:
[root@localhost ~]# lsmod | grep txgbe
txgbe 385024 0
2)卸载驱动:rmmod txgbe
[root@localhost ~]# rmmod txgbe
3) 再次查看已安装的驱动,已经没有 txgbe 驱动。
[root@localhost ~]# lsmod | grep txgbe
cat /proc/sys/kernel/printk # 输出:4 4 1 7 → 当前控制台阈值为4pr_info 输出(需级别 ≤6):echo 7 > /proc/sys/kernel/printk # 将阈值设为7(允许INFO及以上日志输出)/etc/sysctl.conf 添加 kernel.printk = 7 4 1 77。dmesg -w # 动态显示内核日志dmesg --level=info # 仅显示INFO级别日志ubuntu15.04是用systemd的,可以这样做:
cp /lib/systemd/system/serial-getty@.service /lib/systemd/system/serial-getty@ttyS2.service
ln -s /lib/systemd/system/serial-getty@ttyS2.service /etc/systemd/system/getty.target.wants/
再修改/lib/systemd/system/serial-getty@ttyS2.service把里面的“%i.device”改为“%i”
1, 首先,为什么会出现修改了kernel重新编译后magic num改变
内核版本是如何生成的:
Linux 内核在进行模块装载时先完成模块的 CRC 值校验,再核对 vermagic 中的字符信息,linux版本在 include/generated/utsrelease.h中定义,文件中的内容如下:
#define UTS_RELEASE "4.9.123"
utsrelease.h是kernel编译后自动生成的,用户更改里面的内容不会有效果。
这个值可以通过修改最顶层的Makefile文件来修改。
VERSION = 4
PATCHLEVEL = 9
SUBLEVEL = 123
EXTRAVERSION =
...
在init/version.c中,定义了kernel启动时的第一条打印信息:
/* FIXED STRINGS! Don't touch! */
const char linux_banner[] =
"Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
const char linux_proc_banner[] =
"%s version %s"
" (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
" (" LINUX_COMPILER ") %s\n";
这里UTS_RELEASE在kernel编译时自动生成
在init/main.c的asmlinkage __visible void __init start_kernel(void)函数中,有kernel启动的第一条打印信息,这条信息是dmesg命令打印出来:
pr_notice("%s", linux_banner);
驱动模块的version magic信息是怎么生成的:
4.x 内核下,在include/linux/vermagic.h中定义有VERMAGIC_STRING,如下:
#include <generated/utsrelease.h>
/* Simply sanity version stamp for modules. */
#ifdef CONFIG_SMP
#define MODULE_VERMAGIC_SMP "SMP "
#else
#define MODULE_VERMAGIC_SMP ""
#endif
#ifdef CONFIG_PREEMPT
#define MODULE_VERMAGIC_PREEMPT "preempt "
#else
#define MODULE_VERMAGIC_PREEMPT ""
#endif
#ifdef CONFIG_MODULE_UNLOAD
#define MODULE_VERMAGIC_MODULE_UNLOAD "mod_unload "
#else
#define MODULE_VERMAGIC_MODULE_UNLOAD ""
#endif
#ifdef CONFIG_MODVERSIONS
#define MODULE_VERMAGIC_MODVERSIONS "modversions "
#else
#define MODULE_VERMAGIC_MODVERSIONS ""
#endif
#ifndef MODULE_ARCH_VERMAGIC
#define MODULE_ARCH_VERMAGIC ""
#endif
#define VERMAGIC_STRING \
UTS_RELEASE " " \
MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT \
MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS \
MODULE_ARCH_VERMAGIC
VERMAGIC_STRING不仅包含内核版本号,还包含有内核使用的SMP与preempt, MODULE_UNLOAD, 架构等配置信息。模块在编译时,我们可以看到屏幕上会显示”MODPOST”。
<~/Documents/Demo/driver/debugfs> make
make -C ~/kernel/ SUBDIRS=~/Documents/Demo/driver/debugfs modules
make[1]: Entering directory '~/kernel'
CC [M] ~/Documents/Demo/driver/debugfs/my_debugfs.o
Building modules, stage 2.
MODPOST 1 modules
CC ~/Documents/Demo/driver/debugfs/my_debugfs.mod.o
LD [M] ~/Documents/Demo/driver/debugfs/my_debugfs.ko
make[1]: Leaving directory '~/kernel'
在此阶段, VERMAGIC_STRING会添加到模块的modinfo段。在内核源码目录下scripts\mod\modpost.c文件中可以看到模块后续处理部分的代码。模块编译生成后,通过modinfo my_debugfs.ko命令可以查看此模块的vermagic等信息。
<~/Documents/Demo/driver/debugfs> modinfo my_debugfs.ko
filename: ~/Documents/Demo/driver/debugfs/my_debugfs.ko
license: GPL
depends:
vermagic: 4.9.123 SMP preempt mod_unload aarch64
4.x 内核下的模块装载器里保存有内核的版本信息,在装载模块时,装载器会比较所保存的内核vermagic与此模块的modinfo段里保存的vermagic信息是否一致,两者一致时,模块才能被装载。
为了使两个版本一致:可以把 依赖源码中的include/linux/vermagic.h中的UTS_RELEASE修改成与目标机器的版本一致,这样,再次编译模块就可以了。
内核模块版本和内核版本不一致的处理方法
2, 发现版本号会追加git的版本号,还有个“+”
向linux内核版本号添加字符/为何有时会自动添加“+”号,根据这篇文章,一步一步试一下
第一步:去掉git的附加信息
先在menuconfig中找到
│ Symbol: LOCALVERSION [=] │
│ Type : string │
│ Prompt: Local version - append to kernel release │
│ Location: │
│ (1) -> General setup │
│ Defined at init/Kconfig:81 │
│ │
│ │
│ Symbol: LOCALVERSION_AUTO [=n] │
│ Type : boolean │
│ Prompt: Automatically append version information to the version string │
│ Location: │
│ (2) -> General setup │
│ Defined at init/Kconfig:91 │
│ Depends on: !COMPILE_TEST [=n] │
│
关掉LOCALVERSION_AUTO并留空LOCALVERSION,发现git版本确实是不见了,但是‘+’还是存在。
在scripts/setlocalversion文件中,找到以下语句:
# CONFIG_LOCALVERSION and LOCALVERSION (if set)
res="${res}${CONFIG_LOCALVERSION}${LOCALVERSION}"
# scm version string if not at a tagged commit
if test "$CONFIG_LOCALVERSION_AUTO" = "y"; then
# full scm version string
res="$res$(scm_version)"
else
# append a plus sign if the repository is not in a clean
# annotated or signed tagged state (as git describe only
# looks at signed or annotated tags - git tag -a/-s) and
# LOCALVERSION= is not specified
if test "${LOCALVERSION+set}" != "set"; then
scm=$(scm_version --short)
# res="$res${scm:++}" //××××××××××××××注释掉这句话××××××××××××
fi
fi
下面是注释前后的对比


问题解决。
MODVERSIONS
注意不要选图中那行
这个大家可以自行尝试一下
根据错误信息和搜索结果,该报错是由于编译内核模块时系统缺少与当前运行内核完全匹配的内核开发包(kernel-devel和kernel-headers)导致的。以下是完整解决方案:
uname -r # 示例输出:3.10.0-1160.81.1.el7.x86_64sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
ls /usr/src/kernels/$(uname -r)/usr/src/linux指向错误路径或无链接,需重建:sudo rm -f /usr/src/linux sudo ln -s /usr/src/kernels/$(uname -r) /usr/src/linux 注:此操作解决编译脚本查找头文件的路径问题(参考185)sudo yum groupinstall "Development Tools" sudo yum install elfutils-libelf-devel # 缺少libelf时报错(引用[10]())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
💡 重要提示
若仍报错,请检查:
- 内核版本是否完全一致(包含次版本号,如
3.10.0-1160.xx.x)- 系统是否更新后未重启(需重启使新内核生效)
- Secure Boot是否禁用(部分驱动需关闭安全启动)
此问题90%由内核开发包版本不匹配或软链接路径错误导致(综合12718)。如遇特殊情况,可查看具体驱动的common.mk 脚本中定义的路径规则。
分析原理图,实际开发板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
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
终于正常了,拷贝到电脑上,只有左耳机有声音。声音清晰!纠结了几天的问题终于解决了。
最后非常感谢野火提供资料。看了这么多资料,感觉野火的资料最实在,干货最多。
在 Nginx 中配置多个网站(虚拟主机)非常简单,通常通过创建多个服务器块(server block)来为不同的域名或子域名提供不同的站点服务。每个 server block 对应一个网站配置。下面是详细的步骤:
首先,你需要为每个网站创建一个目录,并将网站的文件放在其中。例如,假设你有两个网站,分别是 site1.com 和 site2.com。
sudo mkdir -p /var/www/site1.com/public_html
sudo mkdir -p /var/www/site2.com/public_html
然后,可以在每个目录下创建一个 index.html 文件来测试网站是否配置正确:
echo "<h1>Welcome to site1.com</h1>" | sudo tee /var/www/site1.com/html/index.html
echo "<h1>Welcome to site2.com</h1>" | sudo tee /var/www/site2.com/html/index.html
在 Nginx 中,每个网站配置通常放在 /etc/nginx/sites-available/ 目录下,并通过符号链接链接到 /etc/nginx/sites-enabled/ 目录。这样可以更方便地管理多个网站。
首先,进入 Nginx 的配置目录:
cd /etc/nginx/sites-available
然后为每个网站创建一个配置文件。比如,为 site1.com 创建配置文件 site1.com:
sudo nano /etc/nginx/sites-available/site1.com
在该文件中添加以下内容:
server {
listen 80;
server_name site1.com www.site1.com;
root /var/www/site1.com/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
对于 site2.com,创建一个类似的配置文件:
sudo nano /etc/nginx/sites-available/site2.com
在该文件中添加以下内容:
server {
listen 80;
server_name site2.com www.site2.com;
root /var/www/site2.com/html; index index.html;
location / {
try_files $uri $uri/ =404;
}
}
为了启用这两个配置,我们需要创建符号链接,将它们链接到 /etc/nginx/sites-enabled/ 目录。
sudo ln -s /etc/nginx/sites-available/site1.com /etc/nginx/sites-enabled/
sudo ln -s /etc/nginx/sites-available/site2.com /etc/nginx/sites-enabled/
在修改 Nginx 配置后,最好先测试配置是否正确:
sudo nginx -t
如果一切正常,应该会显示 syntax is okay 和 test is successful。
如果配置文件没有问题,重新加载或重启 Nginx 服务使配置生效:
sudo systemctl reload nginx
或者,如果你更改了主要的 Nginx 配置文件,也可以使用:
sudo systemctl restart nginx
现在,你可以在浏览器中访问 http://site1.com 和 http://site2.com,并验证两个站点是否能够正常显示它们各自的内容。如果你配置了本地解析,在本地测试时可以通过 curl 或直接在浏览器中输入地址来测试。
如果你想为这些网站配置 HTTPS(SSL),你需要为每个站点获取 SSL 证书。你可以使用 Let’s Encrypt 免费提供的证书。以下是配置 SSL 的基本步骤:
首先,安装 Certbot 和 Nginx 插件:
sudo apt install certbot python3-certbot-nginx
然后,运行 certbot 来为你的站点自动申请和配置 SSL 证书:
sudo certbot –nginx -d site1.com -d www.site1.com
sudo certbot –nginx -d site2.com -d www.site2.com
Certbot 会自动为你的站点配置 SSL,并更新 Nginx 配置文件。
为了确保 SSL 证书能够自动续期,可以设置一个定时任务(Cron job):
sudo crontab -e
添加以下行:
0 0,12 * * * certbot renew --quiet
这样 certbot 将每天自动检查并更新证书。
搞定!
在嵌入式系统中,使用NOR Flash作为存储介质时,通常需要选择合适的文件系统并进行相关配置和编译。以下是实现这一目标的步骤。
1. 准备工作
2. 配置和编译U-Boot
make ARCH=arm menuconfig
#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"
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4
3. 配置和编译Linux内核
&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. 打包镜像
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
sudo sunxi-fel -p spiflash-write 0 flashimg.bin
硬件: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%