XPEnoboot 5.2 驱动编译 & Mplayer 玩法 |
本帖最后由 svdztn 于 2016-10-18 10:14 编辑
首先,感谢XPEnoboot制作组的大神们的工作和分享精神,让我们能在更多的平台上使用DSM。 一直苦于板载声卡不能用,最近,XPEnoboot 5.2-5967.1发布的同时,制作组放出了相应的内核源码,这样就可以编译我们自己的驱动了。 DSM 5.2 使用的内核版本号为3.10.35,理论上此次放出的内核对DSM 5.2版本均可使用。(我只测试了5529和5967,其他版本不保证一定可用,测试过的朋友请告知下) 驱动加载有两种方式:一种是编译进内核,另一种是编译成模块,在内核外加载。 对于这两种方式,经测试均可。 编译进内核的方式,需要重新编译内核,然后替换启动U盘中的zImage内核映像,相比加载模块来说风险更大些,所以我们后面再介绍此种方式。 编译成模块的方式,只需要编译我们需要的驱动,然后放进NAS中加载即可,更方便、安全。 就具体编译方式来说,也有两种:在内核代码下,使用make modules编译;自己下载相应的驱动代码,单独编译。其实这两种方式是一样的,比如我这次编译的声卡驱动,内核代码中本来就有,只需要把menuconfig中相应选项打开,编译一下就可以了,但如果你需要的驱动内核中没有,那就只能自己单独编译了。 下面以编译板载声卡驱动为例,介绍编译驱动的过程,编译其他驱动也与之类似。 1.编译环境搭建 (参考http://xpenology.com/wiki/en/building_xpenology) 我使用的Ubuntu 12.10虚拟机(可以用更新一点的版本,老版本的源不好找) 最好再装上VMware Tools,方便使用。 安装一些工具。(有几个我觉得没啥必要) sudo apt-get install git libc6-i386 build-essential libncurses5-dev 下载群晖官方放出的GCC编译链,我用的是:DSM Beta 5.2 Tool Chains -> Intel x86 Linux 3.10.35 (Bromolow) -> bromolow-gcc473_glibc217_x86_64-GPL http://sourceforge.net/projects/dsgpl/files/ 使用 tar -Jxf 把gcc包解压到自己喜欢的位置,(我放到/usr/local/下) 如果以后使用gcc时不想每次都用绝对路径,可以将 x86_64-pc-linux-gnu/bin 添加进环境变量$PATH中 下载XPEnoboot5.2内核源码,http://xpenology.com/forum/viewtopic.php?f=2&t=5026 使用 tar -Jxf 把源码包解压到自己喜欢的位置,(我放到/usr/src/下) 喜欢的话,可以从装好的XPEnology5.2-5967中,/proc目录下,将config.gz复制出来,这就是XPEnoboot-5967的内核配置文件。(后面我会放到附件里) 解压后重命名为 ".config",放到内核源码目录下 2.编译驱动 在内核源码目录下 编辑配置文件(未编辑环境变量的,使用类似 CROSS_COMPILE=/usr/local/x86_64-pc-linux-gnu/bin/x86_64-pc-linux-gnu- 的绝对路径) make ARCH=x86_64 CROSS_COMPILE=x86_64-pc-linux-gnu- menuconfig 将自己需要的驱动设置为“M” 编译驱动 make ARCH=x86_64 CROSS_COMPILE=x86_64-pc-linux-gnu- modules 编译完成后,生成的.ko文件分别在各自的源码目录下 可使用 find -name *.ko 查找其位置 之后可以手动或使用脚本将其复制到同一目录下 2*. 单独下载驱动代码包编译 在解压好的驱动代码目录下运行./configure 配置相应参数,如输出路径,依赖路径,编译器等 如我编译ens1371声卡驱动 ./configure --prefix=[.ko文件的输出路径] --with-kernel=/usr/src/linux-xpenoboot-5.2.5967.1 --with-cards=ens1371 --with-cross=x86_64-pc-linux-gnu- 编译 make 导出驱动 make install 单独编译的好处是生成的ko文件可以直接输出到指定目录下 (或许在内核目录下编译也可以,高手请指教) 3.目标平台加载驱动 把相应的ko文件传到nas的/lib/modules/[自定义一个目录]/ 注意,一定要在modules下新建一个目录,对于我编译的声卡驱动来说,生成新的snd.ko文件,但nas中原来就有此文件,但其中缺少对新编译驱动的支持,如果直接替换,每次关机重启后,新的snd.ko文件会被启动U盘中原来的snd.ko文件覆盖。 对于我编译的声卡驱动 lsmod |grep snd 如果snd.ko已经被加载,就使用rmmod将它以及依赖它的模块卸载 使用modprobe 加载我们编译好的新驱动 比如:我编译的虚拟机中使用的声卡驱动为snd-ens1371.ko modprobe snd-ens1371.ko 就可以将它以及它依赖的驱动加载上 查看/dev/snd目录下多了 pcmC0D0c,pcmC0D0p等,几个文件,就说明声卡驱动已经加载上了。 也可以使用lspci -v 查看声卡信息 至此,声卡驱动编译,加载完成,但想让它出声音,还需要alsa-lib和alsa-utils,如果想听歌或是流媒体的话,还需要播放器,我使用的是mplayer,每天定时播放电台广播,用来当闹钟,嘿嘿。 这些就后面开贴再做介绍吧。 XPEnologyXPEnology |
本帖最后由 hzjnet 于 2016-11-15 20:00 编辑
帅 能留个IM或者其它的联系吗? 我的QQ和维信都是15640872。好 谢谢楼主 ,kernel和mod都编译好了 继续试试32位的 |
说说播放器的随机策略
听歌喜欢将很多歌加入播放列表,然后使用随机播放。但很多播放器的随机策略不好,有些是经常重复播某些歌,但另一些又一直播不到;有些是列表循环播放过一轮后,第二轮的顺序和前一轮一模一样。 查看了一下mplayer处理播放列表部分的代码,它的做法是,随机播放时,每播放一首歌时,都会把这首歌做一个标记;当本首歌播放完后,再从播放列表中未做标记的歌中随机选取一首来播放,如此循环;当检测到所有歌全都做了标记时,就代表播放列表已全部播放,此时再清除所有标记,开始新一轮的循环。 这样做就避免了前面说的两个问题,但我在使用中,又遇到了另一个问题:每次运行mplayer听歌时,不会记住之前已播放的标记,也就是每次重新打开播放器时,列表中已播放的标记都是空的,所以还是会经常重复听到前一次播放的歌。 闲来无事,强迫症大发作,尝试修改了一下mplayer播放列表处理部分的代码,将播放列表的数据写入到外部文件中,当每次做已播放标记时,同步修改外部文件中的相应标记。这样,每次播放器重新启动时,先从外部保存的播放列表文件中读取相关数据,就可以从上次退出的位置继续随机播放了。 代码见附件。 |
本帖最后由 svdztn 于 2016-10-28 15:13 编辑
修改版alarm_start与alarm_stop 增加守护功能,若mplayer意外退出,会自行重启,每1分钟检查一次。运行alarm_stop后,关闭mplayer,同时关闭守护。 alarm_start.sh:
alarm_stop.sh:
|
本帖最后由 svdztn 于 2016-10-17 17:25 编辑
再说说mplayer的玩法。 玩法一: 电台闹钟,其实就是定时播放网络流媒体。 脚本 alarm_start.sh:
脚本 alarm_stop.sh:
玩法二: NAS,作为家里的媒体服务器,本地音乐文件都放在上面,用手机播放效果不好,而且音量不够,用nas的外接音箱来播放挺不错。 控制端使用Android手机上的ServerAssistant软件,可以将控制台命令做成按钮,一键完成SSH登录和执行命令。 脚本 volume_set.sh:
用法:volume_set.sh [volume] 如:volume_set.sh 90即为设置音量为90% 不带参数时为查看音量 脚本 music_start.sh:
(-loop 0:无限循环; -shuffle:随机播放) 如果睡觉前播放,定时关闭是少不了的, 脚本 timer.sh:
用法:timer.sh [-h hour] [-m minute] [-d do] [-s set] [-v volume] [-A] 参数解释: -h 设定多少小时后执行指定命令(大于24,按对24取余计算) -m 设定多少分钟后执行指定命令(可以大于60) (-h与-m可单独使用也可一起使用) -d 此参数不需手动使用 -s 设定定时执行指定命令或脚本 -v 执行定时任务时,是否重新设定音量(即执行上面的volume_set.sh脚本) -A 清除此前设定的全部任务(不会清除DSM原来的任务,请放心使用) 举例:
其实这个脚本的原理是,先向crontab中写入一条定时任务,即1小时30分后,以“-d”参数运行timer.sh本身; timer.sh以“-d”参数运行时,先执行指定命令,即“/.../alarm_stop.sh”脚本和“volume_set.sh 100”; 然后删除crontab中指定的定时任务。 注: timer.sh中出现的脚本路径,需要根据自己的实际情况修改。 最后,声明一句,上述脚本均经本人DSM上测试,若在其他人的主机上运行出现不可预期的后果,造成的损失本人不负责。 |
本帖最后由 svdztn 于 2016-10-17 17:30 编辑
很久没更新了,这回说说mplayer的编译。 为什么要用mplayer呢,因为它支持在控制台操作(其实是没用过别的播放器,嘿嘿)。 mplayer的功能还是很强大的,支持本地音、视频播放,网络流媒体播放。反正我需要的就这么多,而且我也不需要视频播放。 mplayer官网: http://www.mplayerhq.hu/design7/news.html 下载代码,解压到虚拟机中; 下载解码器 Binary Codec Packages,选择平台“Linux AMD64”。解压到将要生成mplayer可执行文件的目录,我放到了.../mplayer/lib/codecs下;如果不需要gui界面的话,可以不下载皮肤。 要成功编译mplayer,需要先安装nasm和zlib,可以下载代码编译安装,也可以使用apt-get install安装。 配置mplayer:
简单解释下: --prefix=/home/test/project/product/mplayer 生成可执行文件的目录。 --cc=x86_64-pc-linux-gnu-gcc 指定编译器。 --codecsdir=/home/test/project/product/mplayer/lib/codecs 前面下载的解码器目录。 --confdir=/home/test/project/product/mplayer 配置文件输出目录。 需要界面的,可以加上参数--enable-gui,带界面的我只在Ubuntu里运行过,应该需要X11支持 运行过configure后,如果没错误的话,会生成一个config.mak文件,重点来了。。。 因为我的DSM运行在AMD平台,而我的编译环境(即虚拟机)为Intel平台,configure这个脚本会自动判断当前编译平台的cpu,当我用上述配置直接编译时,发现生成的可执行文件放到DSM下运行不了。 查看编译器选项后,发现需要增加两个相关处理器优化的参数,因为暂时没找到configure相关配置参数, 直接修改config.mak文件: 在 “CFLAGS =”后,增加参数
(如果DSM为与编译环境同平台,应该就不需要增加) 下面是完整的CFLAGS:
之后make和make install, mplayer就在--prefix目录下等你了。 |
本人新手,用5.2的XPEnoboot,主板网卡是RTL8111E,系统只认成百兆,想自己编译加进驱动,看到楼主的帖子就想动手试下,虚拟机装好Ubuntu15了,请问楼主可以发下详细点的教程吗?新手+鸟语白痴看不懂啊。最好能私下指导下。非常感谢。
|
latest DSM(6.0x):kernel sources uploaded ,"I have 7274 source repo here https://github.com/quiknick/7274-kernel." ;
"kernel sources uploaded : http://setsunakawa.ddns.net/synology/dsm6/",来自: A new loader for latest DSM http://xpenology.com/forum/viewtopic.php?f=2&t=20216 |
svdztn 发表于 2016-9-14 16:12 十分感谢!! |
应 avivi 的要求,简单说一下alsa相关的东西。
简单来说,alsa层次结构如下: alsa app -------- alsa lib -------- alsa driver alsa driver: 我们知道,在linux下,应用程序是不能直接操作硬件设备的,要想使用设备,必须通过操作系统来完成,操作系统调用驱动程序与设备进行通信。alsa driver就是注册在内核的一个驱动模块,它负责与声卡通信,并把声卡描述成设备文件,从而应用程序就可以通过open、write等文件操作来操作声卡了。 alsa lib: 对于应用程序来说,如果直接调用设备文件,open、write、read等操作,这些操作在功能上太过于简单(或者说太底层),使用起来不够方便。为了使应用程序不必太过于关心底层操作,就需要将各种底层操作组合起来,构成更复杂、更高级的操作,再封装成接口函数,提供给上层的应用程序来使用,这就是alsa lib的作用。 alsa app: 各种播放器、alsa utils就属于这一层,alsa utils提供一组alsa音频相关的工具,通过这些工具,我们可以设置音量、测试声卡、编辑音频等,有些类似于windows下的音量合成器,但功能上更强大些。 关于alsa-lib和alsa-utils的编译,网上有很多资料,各个参数的设置解释也比较详细,这里我只做下简单的介绍,重点说下我觉得需要注意的细节。 先下载alsa-lib和alsa-utils的源码,两者版本尽量一致,我用的1.0.25,解压到编译环境中。 按照自下而上的原则,先编译alsa-lib,alsa-lib代码目录下: ./configure --host=x86_64-pc-linux-gnu --prefix=/usr/local make make install 再编译alsa-utils,alsa-utils代码目录下: ./configure --host=x86_64-pc-linux-gnu --prefix=/usr/local --with-alsa-inc-prefix=/usr/local/include --with-alsa-prefix=/usr/local/lib --disable-xmlto --with-curses=ncurses make make install 注意: 1.--with-alsa-inc-prefix 与 --with-alsa-prefix 是上面alsa-lib安装后,头文件和库文件所在的目录,要与上面alsa-lib设置对应好。 2.重点说下alsamixer alsamixer是一个可以在shell下提供图形化界面的音量控制器,界面如下: alsamixer 它使用起来比amixer更方便些 但它需要ncurses支持,所以如果需要alsamixer的话,需要下载ncurses源码,并编译一下(网上说可以用apt-get install libncurses5-dev安装,可能我的ubuntu源不大好),编译完成后,如果./configure配置 alsa-utils时,还提示检测不到ncurses,可以把生成的ncurses的头文件和库文件放到DSM-gcc编译器相应目录下(没找到为这个编译器指定默认include和lib目录的方法,哪位大神知道的话还请不吝赐教) 如果嫌麻烦的话,也可以不编译alsamixer,使用--disable-alsamixer参数配置configure 没有alsamixer,也可以使用amixer命令也可以设置音量等参数。 编译完成后,把生成目录下的lib、bin、sbin、share放到NAS的相应目录下(如果这些目录下原来就有其他文件,注意只考这次编译生成的文件,用文件修改时间做参考) 注意: 1.lib目录下的文件应该放到NAS的lib64下 2.share目录在NAS中的绝对路径要与在编译环境下一致。 声卡驱动一般默认静音,可以使用alsamixer,按m键开启,上下键调整音量; 也可以使用命令: amixer -q set Master unmute 100% amixer -q set PCM unmute 100% 不同的声卡,调整的项目可能不同,不一定使用Master和PCM 测试: aplay /usr/local/share/sounds/alsa/Front_Center.wav |