小白探讨如何使用V3s在线播放播放音乐。
今天有人找我做一个项目,上面需求是接网线,在线播放音乐。
然而,这样的东西,我居然不敢接,因为没做过,怕周期长,烂尾。
这个东西难吗?答案肯定是否定的。
毕业多年,我一只从事单片机的开发,尽管懂得一些linux开发的皮毛,实际上做任何项目我都避开linux,原因很简单,我内心有恐惧感,我怕项目发展下去,出现不可控的情况发生。
我认为我个人业余时间多做知识储备,总有一天有能力使用linux开发的。我带着这样的心态,一年两年过去了,我的linux水平却没有提升,我回头观望,我关注的是:
"XX芯片性价比高",
"鸿蒙代码薄,比linux容易",
"rtt单片机就能跑,容易上手"
......
我的内心一直在避开使用linux开发,带着对linux的恐惧,进行其他知识的储备,可以说,这几年来,我的linux水平没有提高,甚至还倒退了。
今天,看到这样的一个项目需求,我虽然不敢接,但是我意识到了我知识的浅薄。我在思考,社会人才这么多,要是linux都不懂,不知道什么时候被淘汰涨不动工资。我也是时候,应该做些什么了。
我拿出吃灰的V3s开发板,打算利用业余时间,实现这个"简单"的项目。
最近编辑记录 LinjieGuo (2021-01-05 12:01:13)
离线
运行虚拟机,根据手册上面的教程,安装工具:
需要安装的主要依赖库:
sudo apt-get install git gnupg flex bison gperf build-essential zip curl libc6-dev libncurses5-dev:i386
x11proto-core-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dri:i386 libgl1-mesa-dev g++-multilib
mingw32 tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 dpkg-dev
sudo apt-get install u-boot-tools
sudo apt-get install libswitch-perl
创建工作目录:
mkdir -p /home/sinlinx/SIN-V3s
上传源码到ubuntu,解压源码:
进入工作目中
cd /home/sinlinx/SIN-V3s/
解压
tar zxvf sinlinx-v3s-sdk_20190519.tar.gz
编译
cd sinlinx-v3s-sdk
./build.sh
我们不关心这个过程做了什么,只知道,我们拿到了源码,编译之后,最终可以生成img文件。
最近编辑记录 LinjieGuo (2021-01-05 14:14:33)
离线
LinjieGuo 说:想烧写img文件,折腾了好久,死活识别不到。
https://whycan.com/files/members/1845/sinlinx006.png更换全志官方的驱动,一般就在这个烧写软件那个目录。
我把设备驱动给卸掉,然后重新插入,得到这样的一个未知设备
使用指定目录安装
结果是失败的。
注意,当前环境已经是"禁用强制驱动签名"
最近编辑记录 LinjieGuo (2021-01-07 15:23:26)
离线
浏览这个目录,里面的内容是这样的
我卸掉设备的驱动,然后重新使用这个路径里的驱动文件,进行设备驱动更新。得到这样的结果:
看起来驱动是装好了,但是这个烧写软件丝毫没有动静!
反复拔插,拔插,拔插几下,居然就连接上了。先烧写这一次,然后再查原因。
烧写速度还算可以
重新测试了几下,发现这种情况下才能成功连接:
(1)拔掉电源
(2)按住Dw键
(3)插入usb
(4)上电。
如果我上电后再插usb,只能识别驱动,这个烧写软件并不能成功识别。
最近编辑记录 LinjieGuo (2021-01-07 16:00:37)
离线
哥们 你这个板子的资料能否共享下?
请看这个链接,我就不发了,如果失效了,你问这个楼主吧。
板子其实也不贵,默认顺丰是23元,买的时候让店主改普通快递就好了。
https://whycan.com/t_5349.html
最近编辑记录 LinjieGuo (2021-01-07 17:16:45)
离线
系统已用资源如下:
搜索来的信息,是这样说的:
从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,
因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.
是不是意味着,我的应用程序可以使用31476+14716 ==>大概45MB内存可用呢?
最近编辑记录 LinjieGuo (2021-01-07 17:53:18)
离线
LinjieGuo 说:mysteryli 说:你这个是基于SD卡还是spiflash?
spi nand的。
啥型号的nand,能共享一下镜像么,我最近编译V3S遇到点坑,想整个镜像快速测试下我的板子
好,我上传一下上来。
型号是MXIC品牌的MX36LF1GE4,但是我搜索居然搜索不到。
看到开发板的硬件资料,发现居然是精简的核心板原理图,没有告诉我们Flash型号,也没有电源管理芯片相关电路。
我将其修改为MX35LF1G,在tb上面可以搜索出,MX35LF1GE4AB,这个型号应该是一样的。
以下是我编译出来的镜像:
sinlinx-v3s-linux.zip
镜像第一次启动的时候,8s就可以开机完毕了,第二次启动的时候会多次尝试使用sd卡,要40s左右,不知道是不是有界面选择的原因,我等屏幕到了,然后再做后续介绍。
最近编辑记录 LinjieGuo (2021-01-08 10:48:16)
离线
基于帖子 编译开源播放器madplayer,播放音乐,我准备将播放器madplayer移植过来V3s。但是这周要回家,估计要暂停一下更新了。
最近编辑记录 LinjieGuo (2021-01-08 10:49:12)
离线
LinjieGuo 说:mysteryli 说:啥型号的nand,能共享一下镜像么,我最近编译V3S遇到点坑,想整个镜像快速测试下我的板子
好,我上传一下上来。
型号是MXIC品牌的MX36LF1GE4,但是我搜索居然搜索不到。
看到开发板的硬件资料,发现居然是精简的核心板原理图,没有告诉我们Flash型号,也没有电源管理芯片相关电路。
我将其修改为MX35LF1G,在tb上面可以搜索出,MX35LF1GE4AB,这个型号应该是一样的。以下是我编译出来的镜像:
sinlinx-v3s-linux.zip
镜像第一次启动的时候,8s就可以开机完毕了,第二次启动的时候会多次尝试使用sd卡,要40s左右,不知道是不是有界面选择的原因,我等屏幕到了,然后再做后续介绍。好的,刚好我手头有这个型号的spiflash,我下载进去试试,就是MX35LF1G,估计携程MX36是写错了
再问一下这个镜像默认的屏幕是多大分辨率的?
还有,如果你常用qq咱们可以一起讨论,我情况和你类似也是单片机转linux哈哈
一起交流是可以的,你在晕哥的别墅QQ群里,加我,名字跟论坛ID一样。
我问过客服,他的描述是这样的:
请问驱动5寸屏幕,需要修改提供的源码吗
已读
alexlees 2021-1-5 13:47:41
一样的
也就是说,应该不需要修改源码,但是既然是嵌入式单板,使用LCD控制,没有匹配屏幕分辨率的方案,是需要修改源码的,客服的回复似乎不科学,所以我得收到屏才能明确。
最近编辑记录 LinjieGuo (2021-01-08 13:35:02)
离线
既然我们是买的板子,肯定要有技术支持啊。
尝试与开发板的技术联系,得到以下回应。
他们已经帮我们配好了,将对应的fex文件,cp为sys_config.fex文件就可以了。/笑
我们一条命令搞定:
cp tools/pack/chips/sun8iw8p1/configs/tiger-spinand-standard/sys_config.fex.800x480 tools/pack/chips/sun8iw8p1/configs/tiger-spinand-standard/sys_config.fex
然后重新执行 ./build.sh
编译后得到 img文件,重新烧写进去,启动出来,正常进入界面。
随便触摸一下,发现左右和上下反过来了。
使用最新的2020年8月份的源码,触摸屏正常了。
最近编辑记录 LinjieGuo (2021-01-14 13:58:27)
离线
上面我们已经知道应该使用那个编译器了,这个时候我们便是用这个编译器编译一个程序,放到单板上运行吧。
//hello.c
#include <stdio.h>
int main(void)
{
printf("hello whycan!\r\n");
return 0;
}
编译器路径:/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-linux-gcc
执行编译命令:
/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-linux-gcc -o hello hello.c
离线
得到了hello程序,我们发现,得通过一种方式传数据给单板。
手上又没有TF卡,又不懂怎么用usb传数据,NFS还没研究过,唯有使用调试串口通过命令行终端传输了。
参考我旧的帖子:https://whycan.com/t_4266.html
把lrzsz-0_12_20_tar.gz上传到/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/app目录。
(1)解压
tar -xzvf lrzsz-0_12_20_tar.gz
(2)配置
cd lrzsz-0.12.20/
./configure --cache=arm-linux
(3)编译
make CC=/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-linux-gcc
编译得到lrz,lsz。存放在./src/ 目录之下。
我们将这2个工具打包进img文件里面。
修改build.sh。在copy_file_list项中添加2行内容:
$APP_DIR/lrzsz-0.12.20/src/lsz:$ROOTFS_DIR/root/
$APP_DIR/lrzsz-0.12.20/src/lrz:$ROOTFS_DIR/root/
最终结果如下
copy_file_list=(
$ROOTFS_OVERRIDE_DIR/etc/inittab:$ROOTFS_DIR/etc/inittab
$ROOTFS_OVERRIDE_DIR/etc/profile:$ROOTFS_DIR/etc/profile
$ROOTFS_OVERRIDE_DIR/etc/wpa_supplicant.conf:$ROOTFS_DIR/etc/wpa_supplicant.conf
$ROOTFS_OVERRIDE_DIR/etc/hostapd.conf:$ROOTFS_DIR/etc/hostapd.conf
$ROOTFS_OVERRIDE_DIR/etc/udhcpd.conf:$ROOTFS_DIR/etc/udhcpd.conf
$ROOTFS_OVERRIDE_DIR/etc/mdev.conf:$ROOTFS_DIR/etc/mdev.conf
$ROOTFS_OVERRIDE_DIR/etc/ts.conf:$ROOTFS_DIR/etc/ts.conf
$ROOTFS_OVERRIDE_DIR/etc/init.d/rcS:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/init.d/S50sshd:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/init.d/S90camera:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/init.d/S90wifiap:$ROOTFS_DIR/etc/init.d/_S90wifiap
$ROOTFS_OVERRIDE_DIR/etc/init.d/S90wifista:$ROOTFS_DIR/etc/init.d/_S90wifista
$ROOTFS_OVERRIDE_DIR/etc/init.d/S99appstart:$ROOTFS_DIR/etc/init.d/
$ROOTFS_OVERRIDE_DIR/etc/ssh/sshd_config:$ROOTFS_DIR/etc/ssh/
$ROOTFS_OVERRIDE_DIR/root/*.sh:$ROOTFS_DIR/root/
$ROOTFS_OVERRIDE_DIR/root/demo-h264enc:$ROOTFS_DIR/usr/bin/
$APP_DIR/demo-camera/demo-camera:$ROOTFS_DIR/usr/bin/
$APP_DIR/demo-qt/digitalclock:$ROOTFS_DIR/root/
$APP_DIR/lrzsz-0.12.20/src/lsz:$ROOTFS_DIR/root/
$APP_DIR/lrzsz-0.12.20/src/lrz:$ROOTFS_DIR/root/
$PREBUILT_DIR/libs/*:$ROOTFS_DIR/lib/
)
重头./build.sh,得到新的img文件,烧录进单板。
最近编辑记录 LinjieGuo (2021-01-14 15:06:32)
离线
同理,我们编写一个CPP版本的hellowhycan程序。
//hello.cpp
#include <iostream>
using namespace std;
int main(void)
{
cout<<"hello whycan"<<endl;
return 0;
}
执行编译命令:
/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/host/bin/arm-linux-g++ -o helloCPP hello.cPP
发送到单板,赋予权限,然后执行,结果如下:
离线
我根据参考帖子的方法,交叉编译madplayer,结果是不顺利的,干脆直接在buildroot里面添加madplayer包。
但是sinlinx的源码包编译方法是使用build.sh脚本的,所以我们要这样做。
(1)阅读build.sh文件,得知编译流程
(2)我们手工处理
(3)注释掉手工处理的相关操作,然后./build.sh
说干就干!通过阅读可以得知,有这样一段代码,用于buildroot的编译。
function build_buildroot()
{
echo "Build buildroot"
cd $BUILDROOT_DIR
mkdir -p $BUILDROOT_OUT_DIR
cp configs/sinlinx_defconfig $BUILDROOT_OUT_DIR/.config
make O=$BUILDROOT_OUT_DIR oldconfig
make O=$BUILDROOT_OUT_DIR
rm -rf $ROOTFS_DIR
mkdir -p $ROOTFS_DIR
tar xvf $BUILDROOT_OUT_DIR/images/rootfs.tar.bz2 -C $ROOTFS_DIR
}
把某些变量展开,实际上是这样的。
echo "Build buildroot"
cd /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot
mkdir -p /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out
cp configs/sinlinx_defconfig /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/.config
make O=/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out oldconfig
make O=/home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out
rm -rf /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/rootfs
mkdir -p /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/rootfs
tar xvf /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out/images/rootfs.tar.bz2 -C /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/rootfs
可以看出,这一段脚本,先复制了.config文件过来,然后make编译buildroot。然后创建rootfs文件,用于解压根文件系统。
最近编辑记录 LinjieGuo (2021-01-15 13:06:32)
离线
我们应该怎么做呢?我们进入./buildroot/out目录,这个是工作目录。进入配置界面。
cd /home/sinlinx/SIN-V3s/sinlinx-v3s-sdk/buildroot/out
make menuconfig
进入这个界面,把这个项给勾选上。(按Y)
Target packages --->
Audio and video applications --->
[Y] madplay
保存并退出,然后在这个目录下,执行命令
make
mkdir -p rootfs
sudo tar xvf ./images/rootfs.tar.bz2 -C ./rootfs
离线
通过上面的步骤,已经成功构建根文件系统,我们来做打包操作。
只需要修改build.sh文件就可以了,注释掉相关的编译命令。
function build_buildroot()
{
echo "Build buildroot"
cd $BUILDROOT_DIR
mkdir -p $BUILDROOT_OUT_DIR
# cp configs/sinlinx_defconfig $BUILDROOT_OUT_DIR/.config
# make O=$BUILDROOT_OUT_DIR oldconfig
# make O=$BUILDROOT_OUT_DIR
rm -rf $ROOTFS_DIR
mkdir -p $ROOTFS_DIR
tar xvf $BUILDROOT_OUT_DIR/images/rootfs.tar.bz2 -C $ROOTFS_DIR
}
然后,执行这个脚本:
./build.sh
生成一个img文件,烧写进单板,运行madplayer看看。
madplayer ./0001.mp3
执行成功,输出如下图所示,但是没有声音,不知道为啥。
最近编辑记录 LinjieGuo (2021-01-15 13:17:14)
离线
翻阅sinlinx的手册,执行下面2行命令,打开声音。
amixer cset numid=1,iface=MIXER,name='Master Playback Volume' 63
amixer cset numid=17,iface=MIXER,name='Speaker Function' 0
然后,再次使用madplayer播放mp3文件
madplayer ./0001.mp3
这一次,确实有声音了,也就是说,成功了。
最近编辑记录 LinjieGuo (2021-01-15 13:34:45)
离线
为什么是这样呢?我这个小白肯定是不知道,那么我们百度一下尝试科普。
参考链接:https://jingyan.baidu.com/article/2c8c281ded86ef0008252ab0.html
缺省情况下ALSA静音所有的输出。为了获得声音,必须解除主音量和PCM音量的静音。
amixer -c 0 sset Master,0 100%,100% unmute
amixer -c 0 sset PCM ,0 100% unmute
选项包括mute,unmute,capture,nocapture,rec,norec,数字或left:right。
amixer不带参数运行时,返回声卡上所有通道的设置情况。
为了在每次插入声卡驱动模块时,都打开静音,您可以在/etc/modules.conf加入下列语句:
post-install snd-card-sb16 amixer -c 0 sset Master,0 100%,100% unmute && amixer -c 0 sset PCM ,0 100% unmute
在成功插入了alsa声卡模块之后,系统会出现/proc/asound目录,这个目录描述了声卡的工作情况,以及创建的设备文件。
虽然看不懂,但是我们知道了:
缺省情况下ALSA静音所有的输出。为了获得声音,必须解除主音量和PCM音量的静音。
最近编辑记录 LinjieGuo (2021-01-15 13:45:43)
离线