2四、buildroot支持第三方软件
一、wpa_supplicant软件移植
1.buildroot编译wpa_supplicant 程序到文件系统
buildroot-2023.02$ make menuconfig
搜索
选中
Target packages --->
Networking applications --->
[*] wpa_supplicant --->
[*] Enable nl80211 support
buildroot-2023.02$ make -j12
2.测试wpa_supplicant软件
将buildroot-2023.02/output/images/rootfs.tar.bz2拷贝到imx6ull-iot-smart-car/fs/rootfs-buildroot目
录解压测试。通过NFS形式挂载根文件系统,运行wpa_supplicant程序效果如下:
3.手动连接wifi
(1)拷贝wifi驱动和wpa_supplicant配置文件
是旧的,我们可能没有
我们采用手动创建
创建驱动文件夹
找到之前编译好的驱动
拷贝
创建并打开修改配置文件
需要注意的是我这里使用的 buildroot 版本目前下载的 wpa_supplicant 版本为 wpa_supplicant v2.10 ,
该版本已经没有 ctrl_interface 这个参数了,在配置文件中需要去除,不然后面使用中会报如下错误:
Line 1: unknown global field 'ctrl_interface=/var/run/wpa_supplicant'.
Line 1: Invalid configuration line 'ctrl_interface=/var/run/wpa_supplicant'.
Failed to read or parse configuration '/wpa_supplicant/wpa_supplicant.conf'
修改wpa_supplicant.conf配置文件如下:
ap_scan=1
network={
#链接的wifi名称
ssid="tplink"
#密码
psk="12345678"
priority=1
}
(2)加载驱动
# cd driver/
# ls
8723bu.ko
# insmod 8723bu.ko
加载驱动
RTL871X: module init start
RTL871X: rtl8723bu v4.3.6.11_12942.20141204_BTCOEX20140507-4E40
RTL871X: rtl8723bu BT-Coex version = BTCOEX20140507-4E40
RTL871X: rtw_ndev_init(wlan0)
RTL871X: rtw_ndev_init(wlan1)
usbcore: registered new interface driver rtl8723bu
RTL871X: module init ret=0
(3)运行wpa_supplicant
wpa_supplicant -i wlan0 -c /wpa_supplicant/wpa_supplicant.conf -B
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
RTL871X: RTW_ADAPTIVITY_EN_AUTO, chplan:0x20, Regulation:3,3
RTL871X: RTW_ADAPTIVITY_MODE_NORMAL
IPv6: ADDRCONF(NETDEV_UP): wlan0: link is not ready
RTL871X: rtw_set_802_11_connect(wlan0)
fw_state=0x00000008
RTL871X: start auth
RTL871X: auth success, start assoc
RTL871X: rtw_cfg80211_indicate_connect(wlan0) BSS not found !!
RTL871X: assoc success
IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
RTL871X: send eapol packet
RTL871X: send eapol packet
RTL871X: set pairwise key camid:4, addr:30:fc:68:3a:40:c4, kid:0, type:AES
RTL871X: set group key camid:5, addr:30:fc:68:3a:40:c4, kid:2, type:AES
(4)获取IP地址
udhcpc -iwlan0
udhcpc: started, v1.35.0
udhcpc: broadcasting discover
udhcpc: broadcasting select for 192.168.1.102, server 192.168.1.1
udhcpc: lease of 192.168.1.102 obtained from 192.168.1.1, lease time 7200
deleting routers
adding dns 192.168.1.1
4.系统启动自动连接wifi
(1)介绍
这里使用 buildroot 默认会使用 busybox 来构建根文件系统,它有自己的 init 进程。该进程会在启动后读
取 /etc/inittab 文件内容,并执行其中命令。默认设置下它会在开机时进行一些必要的文件系统及网络操
作,最后执行 /etc/init.d/rcS 脚本。
#!/bin/sh
# Start all init scripts in /etc/init.d
# executing them in numerical order.
#
for i in /etc/init.d/S??* ;do
# Ignore dangling symlinks (if any).
[ ! -f "$i" ] && continue
case "$i" in
*.sh)
# Source shell script for speed.
(
trap - INT QUIT TSTP
set start
. $i
)
;;
*)
# No sh extension, so fork subprocess.
$i start
;;
esac
done
/etc/init.d/rcS 脚本会依据文件名排序依次执行 /etc/init.d/ 目录下文件名为 S??* 的文件中的 start 方法
(比如 S01syslogd 、 S50sshd 等)。
另外在 /etc/inittab 可以看到系统会在关机前执行 /etc/init.d/rcK 脚本。该脚本会执行 S??* 的文件中的
stop 方法。
所以对于我们来说要在开机时执行命令可以在 /etc/init.d/ 目录下新建名为 S??* 格式的文件,然后在其
中编写一个 start 方法,在其中写上我们需要开机执行的命令即可。
(2)编写开机启动脚本
在这里我们在开发板 /etc/init.d/ 目录下新建名为 S99wifi 的脚本,其内容如下:
#!/bin/sh
#
# wifi Starts wifi.
#
umask 077
start() {
printf "Starting wpa_supplicant and udhcpc for wlan0: "
insmod /wpa_supplicant/driver/8723bu.ko
wpa_supplicant -i wlan0 -c /wpa_supplicant/wpa_supplicant.conf -B
udhcpc -i wlan0
echo "OK
}
stop(){
printf “Stopping wpa_supplicant:”
killall wpa_supplicant
echo "OK"
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|reload)
restart
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
esac
exit $?
(3)添加执行权限
rootfs-buildroot/etc/init.d$ chmod 777 S99wifi
二、openssh软件移植
- 介绍
OpenSSH 是 SSH (Secure Shell) 协议的免费开源实现。**SSH协议族可以用来进行远程控制, 或在
计算机之间传送文件。**而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是
极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远
程控制和文件传输过程中的数据,并由此来代替原来的类似服务。
2.buildroot配置及编译
(1)配置
buildroot-2023.02$ make menuconfig
Target packages----->
Networking applications------>
[*] openssh
(2)编译
buildroot-2023.02$ make -j12
3.配置配置sshd运行环境
修改rootfs目录下的/etc/ssh/sshd_config 文件,将 #PermitRootLogin prohibit-password 改为 Permit
RootLogin yes
4.启动sshd服务进程
在开发板上启动sshd进程
$ /usr/sbin/sshd
/var/empty must be owned by root and not group or world-writable.
修改如下:
# chown root:root /var/empty/
5.验证ssh
(1)在主机ubuntu上通过ssh登录开发板
(2)在主机ubuntu上通过ssh传输文件
(3)在windows上ssh登录开发板并传输文件
6.sshd 启动慢解决办法
sshd 在开机自启的时候占用了很长的一段时间,仔细观察打印信息发现,sshd 一定要等待直到
random: nonblocking pool is initialized 初始化结束后才能正常启动。这是因为在sshd服务的启动的时
候** SSH Keys **的产生依赖于随机数导致的。解决方法如下:
修改Linux内核源码的drivers/char/random.c 约 900 行处。void add_interrupt_randomness(int irq, int
irq_flags) 中有一处判断:
if ((fast_pool->count < 64) && !time_after(now, fast_pool->last + HZ))
return;
在此基础上加上 nonblocking_pool.initialized 判断:
if ((fast_pool->count < 64) && !time_after(now, fast_pool->last + HZ) && nonblocking_pool.initialized )
return;
三、alsa软件移植
1.alsa介绍
ALSA全称是Advanced Linux Sound Architecture,中文音译是Linux高级声音体系。ALSA 是Linux内
核2.6后续版本中支持音频系统的标准接口程序,由ALSA库、内核驱动和相关测 试开发工具组成,更好
的管理Linux中音频系统。 ALSA是Linux系统中为声卡提供驱动的内核组件。它提供了专门的库函数来
简化相应应用程序的编写。ALSA系统包括7个子项目:
驱动包alsa-driver
开发包alsa-libs
开发包插件alsa-libplugins
设置管理工具包alsa-utils
OSS(OSS全称Open Sound System是unix平台上一个统一的音频接口)接口兼容模拟层工具alsa
特殊音频固件支持包alsa-firmware
其他声音相关处理小程序包alsa-tools
移植ALSA主要是移植alsa-lib和alsa-utils。
alsa-lib :用户空间函数库, 封装驱动提供的抽象接口, 通过文件libasound.so提供API给应用程序使
用。
alsa-utils:实用工具包,通过调用alsa-lib实现播放音频(aplay)、录音(arecord) 等工具。
ALSA Utils是纯应用层的软件,相当于ALSA设备的测试程序,ALSA-Lib则是支持应用API的中间层程
序,ALSA-Utils中的应用程序中会调用到ALSA-Lib中的接口来操作到我们的音频编解码芯片的寄存器,
而lib中接口就是依赖于最底层驱动代码,因此移植ALSA程序的顺序就是先后移植Driver,Lib,Utils。
2.buildroot配置及编译
(1)使能 alsa-lib
Target packages
----> Libraries
-----> Audio/Sound
------> -*- alsa-lib ---> 此配置项下的文件全部选中
(2)使能 alsa-utils
Target packages----->
---------> Audio and video applications
------> alsa-utils
此目录下的软件全部选中
3.设备树修改
修改Linux内核源码下的arch/arm/boot/dts/imx6ull-14x14-smartcar.dts文件,
修改如下:
4.播放音乐测试
(1)准备wav格式音乐
在线MP3转换wav地址:https://audio.worthsee.com/convert/MP3-to-WAV
(2)使用 amixer 设置声卡
设置耳机左声道和右声道声音大小(0-127)
amixer sset Headphone 100,100
设置扬声器(喇叭)左声道和右声道声音大小(0-127)
amixer sset Speaker 120,120
设置左声道输出打开
amixer sset 'Right Output Mixer PCM' on
设置右声道输出打开
amixer sset 'Left Output Mixer PCM' on
(3)播放音乐
aplay music.wav
5.录音测试
(1)WM8960音频解码硬件原理图及驱动修改
从硬件原理图可以知道我们只接了左声道没有接右声道,也就是说MIC 录出来的只有左声道有声音,那么
我们能不能让只接到左声道的 MIC 录制出来的音频是双声道的呢?如果我们能让左右声道就共同使用一
个 MIC,录出来的音频就 是双声道的,虽然两个声道的数据是一模一样的。
打开WM8960 的数据手册了,我们可以配置 WM8960 的右声道 ADC 直接使用左声道的数据。
我们在Linux内核源码中找到音频驱动:
修改驱动代码如下:
(2)使用 amixer 设置声卡
#!/bin/sh
#.....................
amixer cset name='Capture Volume' 100,100
#PCM
amixer sset 'PCM Playback -6dB' on
amixer sset 'Playback' 255
amixer sset 'Right Output Mixer PCM' on
amixer sset 'Left Output Mixer PCM' on
#ADC PCM
amixer sset 'ADC PCM' 200
#Turn on Headphone
amixer sset 'Headphone Playback ZC' on
#Set the volume of your headphones(98% volume...127 is the MaxVolume)
amixer sset Headphone 125,125
#Turn on the speaker
amixer sset 'Speaker Playback ZC' on
#Set the volume of your Speaker(98% volume...127 is the MaxVolume)
amixer sset Speaker 125,125
#Set the volume of your Speaker AC(80% volume...100 is the MaxVolume)
amixer sset 'Speaker AC' 4
#Set the volume of your Speaker AC(80% volume...5 is the MaxVolume)
amixer sset 'Speaker DC' 4
#音频输入,左声道管理
#Turn on Left Input Mixer Boost
amixer sset 'Left Input Mixer Boost' on
#Turn on Left Boost Mixer LINPUT1
amixer sset 'Left Boost Mixer LINPUT1' on
amixer sset 'Left Input Boost Mixer LINPUT1' 3
#Turn off Left Boost Mixer LINPUT2
amixer sset 'Left Boost Mixer LINPUT2' off
amixer sset 'Left Input Boost Mixer LINPUT2' 0
#Turn on Left Boost Mixer LINPUT3
amixer sset 'Left Boost Mixer LINPUT3' on
amixer sset 'Left Input Boost Mixer LINPUT3' 7
#音频输入,右声道管理,全部关闭
#Turn on Right Input Mixer Boost
amixer sset 'Right Input Mixer Boost' off
amixer sset 'Right Boost Mixer RINPUT1' off
amixer sset 'Right Input Boost Mixer RINPUT2' 0
amixer sset 'Right Boost Mixer RINPUT2' off
amixer sset 'Right Input Boost Mixer RINPUT2' 0
amixer sset 'Right Boost Mixer RINPUT3' off
amixer sset 'Right Input Boost Mixer RINPUT3' 0
(3)录音
arecord -d 10 -f cd -t wav record.wav
-d 是指定录音时间,单位是 s
-f 是设置录音质量,"-f cd"表示录音质量为 cd 级别
-t 指定录制的格式,WAV
这条指令就是录制一段 cd 级别 10s 的 wav 音频,音频名字为 record.wav
5.alsamixer图形化界面配置声卡