扫描二维码关注官方公众号
返回列表 发布新帖

[讨论/分享] XPEnoboot 5.2 驱动编译 & Mplayer 玩法

评论45

svdztn楼主Lv.5 发表于 2016-8-29 13:01:01 | 显示全部楼层
likewhm 发表于 2016-8-27 15:37
楼主可以发一下提取rd.cpio的方法吗?

关于zImage文件的解压:
以5967版内核为例。
用7-Zip打开,查看属性
QQ截图20160829113742.jpg
可以看出,能够识别出文件的压缩算法为LZMA2,与内核编译选项中的设置一致,
但提示“有效数据外包含额外数据”,说明正常的压缩数据之外还有其他描述性数据,这些数据对我们来说是没用的,需要去掉。
有效压缩数据前,有7245字节无用数据
使用UltraEdit打开zImage,选中第一个字节->右键->十六进制插入/删除->选择删除,填入上面7245字节
删除后另存一个文件,再用7-Zip打开,查看属性,应该还会有额外数据,继续用上面方法删除
QQ截图20160829123102.jpg
如果显示了“尾部大小”,且尾部大小相对于整个文件大小来说不是太大,就说明有效压缩数据之后,也有额外数据,也需要一并删除。
方法是:
1.查看文件最后一个字节的序号,如:0x0120f64f,要删除尾部的1024字节数据;
2.计算器计算,1024转16进制为0x400,0x0120f64f-0x400=0x120f24f
3.UltraEdit中,找到序号为0x120f24f的那个字节,选中下一个字节(即:0x120f250号字节),右键删除后面的1024字节


头部偏移两次,尾部偏移一次,就不在显示有额外数据了(我遇到的情况是这样),用7-Zip就能直接打开了。(这时候用UltraEdit查看文件,开头数据为“FD 37 7A 58 5A”(?7zXZ),当然内核选择不同的压缩算法时,压缩文件的起始标志是不一样的)
找到里面的“.init.data”文件,这个就是rd.cpio了,它也包含了额外数据,需要使用上面方法去除。
完整扒出来的rd.cpio文件,使用7-Zip查看属性如下
QQ截图20160829125926.jpg
回复 点赞

使用道具 举报

likewhmLv.3 发表于 2016-8-29 13:59:39 | 显示全部楼层
svdztn 发表于 2016-8-29 13:01
关于zImage文件的解压:
以5967版内核为例。
用7-Zip打开,查看属性

谢谢楼主!
回复 点赞

使用道具 举报

pureivanLv.10 发表于 2016-8-29 14:50:44 | 显示全部楼层
感谢分享!!!
回复 点赞

使用道具 举报

amwypm3974Lv.3 发表于 2016-8-29 21:21:27 | 显示全部楼层
总算又看到有人说编译了。。。我有一块扩展卡,不知道怎么编译驱动,,大神能给个QQ交流下吗?
回复 点赞

使用道具 举报

whoisdrLv.1 发表于 2016-8-31 10:34:51 | 显示全部楼层
谢谢楼主分享
回复 点赞

使用道具 举报

HeidiandianLv.1 发表于 2016-9-1 20:37:01 | 显示全部楼层
膜拜大神......!!
回复 点赞

使用道具 举报

aviviLv.5 发表于 2016-9-12 15:00:53 | 显示全部楼层
“但想让它出声音,还需要alsa-lib和alsa-utils,如果想听歌或是流媒体的话,还需要播放器,我使用的是mplayer,每天定时播放电台广播,用来当闹钟,嘿嘿。这些就后面开贴再做介绍吧。”


请作者继续!谢谢提供!!

回复 点赞

使用道具 举报

liruishengLv.6 发表于 2016-9-14 02:51:08 | 显示全部楼层
哇...超屌啊...感谢啊
回复 点赞

使用道具 举报

tosspLv.7 发表于 2016-9-14 12:46:27 | 显示全部楼层
make,,,这个好
回复 点赞

使用道具 举报

svdztn楼主Lv.5 发表于 2016-9-14 16:12:45 | 显示全部楼层
应 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

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
回复 点赞

使用道具 举报

wokexiLv.1 发表于 2016-9-17 18:25:59 | 显示全部楼层
这个好专业啊,收藏了谢谢
回复 点赞

使用道具 举报

aviviLv.5 发表于 2016-9-18 15:37:59 | 显示全部楼层
svdztn 发表于 2016-9-14 16:12
应 avivi 的要求,简单说一下alsa相关的东西。
简单来说,alsa层次结构如下:

十分感谢!!
回复 点赞

使用道具 举报

superwhLv.1 发表于 2016-9-18 23:18:29 | 显示全部楼层
感觉好强大。。。
回复 点赞

使用道具 举报

CZQ83Lv.6 发表于 2016-10-12 01:54:27 | 显示全部楼层
LZ能帮编译一个BCM43602CS的无线网卡驱动吗......求!
回复 点赞

使用道具 举报

kingzwj168Lv.10 发表于 2016-10-12 15:03:50 | 显示全部楼层
能照葫芦画瓢编译出6.0的引导就好了
回复 点赞

使用道具 举报

aviviLv.5 发表于 2016-10-13 17:34:08 | 显示全部楼层
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
回复 点赞

使用道具 举报

aviviLv.5 发表于 2016-10-13 17:35:26 | 显示全部楼层
可考虑IPOIB的驱动。
回复 点赞

使用道具 举报

四哥!Lv.6 发表于 2016-10-13 19:24:44 | 显示全部楼层
本人新手,用5.2的XPEnoboot,主板网卡是RTL8111E,系统只认成百兆,想自己编译加进驱动,看到楼主的帖子就想动手试下,虚拟机装好Ubuntu15了,请问楼主可以发下详细点的教程吗?新手+鸟语白痴看不懂啊。最好能私下指导下。非常感谢。
回复 点赞

使用道具 举报

svdztn楼主Lv.5 发表于 2016-10-17 15:12:28 | 显示全部楼层
本帖最后由 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:
  1. ./configure --prefix=/home/test/project/product/mplayer --host-cc=gcc --cc=x86_64-pc-linux-gnu-gcc --enable-alsa --target=amd64-linux --enable-cross-compile --codecsdir=/home/test/project/product/mplayer/lib/codecs --confdir=/home/test/project/product/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   =”后,增加参数
  1. -march=amdfam10 -mtune=amdfam10
复制代码

(如果DSM为与编译环境同平台,应该就不需要增加)

下面是完整的CFLAGS:
  1. CFLAGS   = -Wundef -Wall -Wno-switch -Wno-parentheses -Wpointer-arith -Wredundant-decls -Werror=format-security -Wstrict-prototypes -Wmissing-prototypes -Wdisabled-optimization -Wno-pointer-sign -Wdeclaration-after-statement -std=gnu99 -Werror-implicit-function-declaration -D_POSIX_C_SOURCE=200112 -D_XOPEN_SOURCE=600 -D_ISOC99_SOURCE -I. -Iffmpeg -O4 -march=amdfam10 -mtune=amdfam10 -pipe -ffast-math -fomit-frame-pointer -fno-tree-vectorize -fno-asynchronous-unwind-tables -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE  -fpie -DPIC -D_REENTRANT  -DZLIB_CONST
复制代码

之后make和make install,
mplayer就在--prefix目录下等你了。





回复 点赞

使用道具 举报

svdztn楼主Lv.5 发表于 2016-10-17 16:47:32 | 显示全部楼层
本帖最后由 svdztn 于 2016-10-17 17:25 编辑

再说说mplayer的玩法。

玩法一:
电台闹钟,其实就是定时播放网络流媒体。

脚本 alarm_start.sh:
  1. /.../mplayer/bin/mplayer rtmp://................ </dev/null >/dev/null 2>&1 &
复制代码
流媒体地址根据自己的喜好来设定,在DSM任务计划中,添加定时任务,定时执行alarm_start.sh,播放流媒体。


脚本 alarm_stop.sh:
  1. NAME=$(ps | grep mplayer |grep -v grep | awk 'NR==1{print $1}')
  2. kill $NAME
复制代码
在DSM任务计划中,添加定时任务,定时执行alarm_stop.sh,关闭播放器。




玩法二:
NAS,作为家里的媒体服务器,本地音乐文件都放在上面,用手机播放效果不好,而且音量不够,用nas的外接音箱来播放挺不错。
控制端使用Android手机上的ServerAssistant软件,可以将控制台命令做成按钮,一键完成SSH登录和执行命令。

脚本 volume_set.sh:
  1. ##set Volume##
  2. vol=$1

  3. if [ $# -eq 0 ];then
  4. echo -------------------------------------
  5. echo No volume input,leave without modify
  6. echo -------------------------------------
  7. echo Current Volume:
  8. amixer |grep -A 4 Master
  9. exit 0
  10. fi

  11. if [ $vol -gt 100 ] || [ $vol -lt 0 ];then
  12. echo Error:Input volume error
  13. exit 1
  14. fi

  15. echo set volume = $vol
  16. amixer -q set Master unmute $vol%
  17. #amixer -q set Front unmute $vol%
  18. exit 0
复制代码
功能:设置/查看音量
用法:volume_set.sh [volume]
如:volume_set.sh 90即为设置音量为90%
不带参数时为查看音量


脚本 music_start.sh:
  1. ##play music##
  2. /.../mplayer/bin/mplayer -loop 0 -shuffle /.../* </dev/null >/dev/null 2>&1 &
复制代码
播放指定目录下的所有文件
(-loop 0:无限循环;  -shuffle:随机播放)


如果睡觉前播放,定时关闭是少不了的,
脚本 timer.sh:
  1. sethour=0
  2. setmin=0
  3. task="null"
  4. dsflag=0 #Do/Set#
  5. abort=0
  6. setvolume=-1

  7. ##-----------------Read Para-----------------##
  8. while getopts "h:m:d:s:v:A" arg
  9. do
  10.         case $arg in
  11.                 h)
  12.                         sethour=$OPTARG
  13.                         echo sethour = $sethour
  14.                         ;;
  15.                 m)
  16.                         setmin=$OPTARG
  17.                         echo setmin = $setmin
  18.                         ;;
  19.                 d) #DO TASK#
  20.                         task="$OPTARG"
  21.                         dsflag=1
  22.                         ;;
  23.                 s) #SET TASK#
  24.                         task="$OPTARG"
  25.                         dsflag=0
  26.                         ;;
  27.                 v) #SET VOLUME#
  28.                         setvolume="$OPTARG"
  29.                         ;;
  30.                 A) #ABORT ALL TASKS#
  31.                         abort=1
  32.                         ;;
  33.                 ?)
  34.                         echo "unkonw argument"
  35.                         exit 1
  36.                         ;;
  37.         esac
  38. done
  39. echo "-----------------"

  40. ##-----------------Abort All Tasks-----------------##
  41. if [ $abort -eq 1 ];then
  42. echo ABORT ALL TASKS

  43. ##Del all timer.sh tasks from crontab##
  44. task="/volume1/@appstore/sh/timer.sh"
  45. sed -i "s#$task#dEltAsktEmp#" /etc/crontab
  46. sed -i '/dEltAsktEmp/d' /etc/crontab

  47. ##Reload config##
  48. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  49. kill $crondpid

  50. exit 0
  51. fi

  52. ##-----------------Set Task-----------------##
  53. if [ $dsflag -eq 0 ];then

  54. ##Shortcut for mpstop.sh##
  55. if [ "$task" = "mpstop" ];then
  56. task="/volume1/@appstore/sh/mpstop.sh"
  57. fi

  58. ##Check input time##
  59. if [ $sethour -eq 0 ] && [ $setmin -eq 0 ];then
  60. echo "Error: No time input,exit without change..."
  61. exit 1
  62. fi

  63. ##Check input task##
  64. if [ "$task" = "null" ];then
  65. echo "Error: No task input,exit without change..."
  66. exit 1
  67. fi

  68. echo SET TASK ["$task"]

  69. ##Check volume set##
  70. if [ $setvolume -ge 0 ];then
  71. if [ $setvolume -gt 100 ];then
  72. echo "Error:Input volume error,exit without change..."
  73. exit 1
  74. else
  75. echo SET VOLUME ["$setvolume"]
  76. fi
  77. fi

  78. if [ "$task" = "null" ];then
  79. echo "No task input,exit without change..."
  80. exit 1
  81. fi

  82. ##Calc time##
  83. nhour=`date +%H`
  84. nmin=`date +%M`
  85. if [ $nhour -lt 10 ];then #convert "08" to "8"#
  86. nhour=${nhour:1:1}
  87. fi
  88. if [ $nmin -lt 10 ];then
  89. nmin=${nmin:1:1}
  90. fi

  91. thour=$(($nhour+$sethour))
  92. tmin=$(($nmin+$setmin))

  93. if [ $tmin -gt 59 ];then
  94. thour=$(($thour+$(($tmin/60))))
  95. tmin=$(($tmin%60))
  96. fi
  97. if [ $thour -gt 23 ];then
  98. thour=$(($thour%24))
  99. fi

  100. echo RUN TIME [$thour:$tmin]

  101. ##Bakup crontab##
  102. cp -f /etc/crontab /etc/crontab.bak

  103. ##Write crontab##
  104. if [ $setvolume -ge 0 ];then
  105. echo "$tmin        $thour        *        *        *        root        /volume1/@appstore/sh/timer.sh -h $thour -m $tmin -d $task -v $setvolume">>/etc/crontab
  106. else
  107. echo "$tmin        $thour        *        *        *        root        /volume1/@appstore/sh/timer.sh -h $thour -m $tmin -d $task">>/etc/crontab
  108. fi

  109. ##Reload config##
  110. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  111. kill $crondpid

  112. exit 0
  113. fi


  114. ##-----------------Do Task-----------------##
  115. if [ $dsflag -eq 1 ];then
  116. echo DO TASK ["$task"]

  117. ##Run task##
  118. `$task`

  119. ##Set Volume##
  120. if [ $setvolume -ge 0 ];then
  121. `/volume1/@appstore/sh/volume_set.sh $setvolume`
  122. fi

  123. ##Del task from crontab##
  124. task="/volume1/@appstore/sh/timer.sh -h $sethour -m $setmin -d $task"
  125. sed -i "s#$task#dEltAsktEmp#" /etc/crontab
  126. sed -i '/dEltAsktEmp/d' /etc/crontab

  127. ##Reload config##
  128. crondpid=$(ps | grep crond |grep -v grep | awk 'NR==1{print $1}')
  129. kill $crondpid

  130. exit 0
  131. fi
复制代码
功能:定时执行指定命令或脚本,且执行完成后,删除相应的定时任务
用法: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原来的任务,请放心使用)

举例:
  1. timer.sh -h 1 -m 30 -s /.../alarm_stop.sh -v 100
复制代码
  1. timer.sh -m 90 -s /.../alarm_stop.sh -v 100
复制代码
即:1小时30分后,运行“/.../alarm_stop.sh”脚本,并将音量设置为100%
其实这个脚本的原理是,先向crontab中写入一条定时任务,即1小时30分后,以“-d”参数运行timer.sh本身;
timer.sh以“-d”参数运行时,先执行指定命令,即“/.../alarm_stop.sh”脚本和“volume_set.sh 100”;
然后删除crontab中指定的定时任务。
注:
timer.sh中出现的脚本路径,需要根据自己的实际情况修改。



最后,声明一句,上述脚本均经本人DSM上测试,若在其他人的主机上运行出现不可预期的后果,造成的损失本人不负责。




回复 点赞

使用道具 举报

回复

懒得打字嘛,点击右侧快捷回复 【本站酷狼4T,750元】
您需要登录后才可以回帖 登录 | 注册

本版积分规则

投诉/建议联系

support@gebi1.cn

未经授权禁止转载,复制和建立镜像,
如有违反,追究法律责任
  • 关注公众号
  • 添加微信客服
Copyright © 2001-2024 隔壁网 版权所有 All Rights Reserved. 粤ICP备14056481号-1
关灯 在本版发帖
扫一扫添加微信客服
返回顶部
快速回复 返回顶部 返回列表