svdztn 发表于 2016-8-29 13:01:01

likewhm 发表于 2016-8-27 15:37
楼主可以发一下提取rd.cpio的方法吗?

关于zImage文件的解压:
以5967版内核为例。
用7-Zip打开,查看属性

可以看出,能够识别出文件的压缩算法为LZMA2,与内核编译选项中的设置一致,
但提示“有效数据外包含额外数据”,说明正常的压缩数据之外还有其他描述性数据,这些数据对我们来说是没用的,需要去掉。
有效压缩数据前,有7245字节无用数据
使用UltraEdit打开zImage,选中第一个字节->右键->十六进制插入/删除->选择删除,填入上面7245字节
删除后另存一个文件,再用7-Zip打开,查看属性,应该还会有额外数据,继续用上面方法删除

如果显示了“尾部大小”,且尾部大小相对于整个文件大小来说不是太大,就说明有效压缩数据之后,也有额外数据,也需要一并删除。
方法是:
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查看属性如下

likewhm 发表于 2016-8-29 13:59:39

svdztn 发表于 2016-8-29 13:01
关于zImage文件的解压:
以5967版内核为例。
用7-Zip打开,查看属性


谢谢楼主!

pureivan 发表于 2016-8-29 14:50:44

{:8_212:}感谢分享!!!

amwypm3974 发表于 2016-8-29 21:21:27

总算又看到有人说编译了。。。我有一块扩展卡,不知道怎么编译驱动,,大神能给个QQ交流下吗?

whoisdr 发表于 2016-8-31 10:34:51

谢谢楼主分享

Heidiandian 发表于 2016-9-1 20:37:01

膜拜大神......!!

avivi 发表于 2016-9-12 15:00:53

“但想让它出声音,还需要alsa-lib和alsa-utils,如果想听歌或是流媒体的话,还需要播放器,我使用的是mplayer,每天定时播放电台广播,用来当闹钟,嘿嘿。这些就后面开贴再做介绍吧。”


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

liruisheng 发表于 2016-9-14 02:51:08

{:8_218:}哇...超屌啊...感谢啊

tossp 发表于 2016-9-14 12:46:27

make,,,这个好

svdztn 发表于 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下提供图形化界面的音量控制器,界面如下:

它使用起来比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

wokexi 发表于 2016-9-17 18:25:59

这个好专业啊,收藏了谢谢

avivi 发表于 2016-9-18 15:37:59

svdztn 发表于 2016-9-14 16:12
应 avivi 的要求,简单说一下alsa相关的东西。
简单来说,alsa层次结构如下:



十分感谢!!

superwh 发表于 2016-9-18 23:18:29

感觉好强大。。。

CZQ83 发表于 2016-10-12 01:54:27

LZ能帮编译一个BCM43602CS的无线网卡驱动吗......求!

kingzwj168 发表于 2016-10-12 15:03:50

能照葫芦画瓢编译出6.0的引导就好了

avivi 发表于 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

avivi 发表于 2016-10-13 17:35:26

可考虑IPOIB的驱动。

四哥! 发表于 2016-10-13 19:24:44

本人新手,用5.2的XPEnoboot,主板网卡是RTL8111E,系统只认成百兆,想自己编译加进驱动,看到楼主的帖子就想动手试下,虚拟机装好Ubuntu15了,请问楼主可以发下详细点的教程吗?新手+鸟语白痴看不懂啊。最好能私下指导下。非常感谢。

svdztn 发表于 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:
./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   =”后,增加参数-march=amdfam10 -mtune=amdfam10
(如果DSM为与编译环境同平台,应该就不需要增加)

下面是完整的CFLAGS:
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 发表于 2016-10-17 16:47:32

本帖最后由 svdztn 于 2016-10-17 17:25 编辑

再说说mplayer的玩法。

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

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


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




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

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

if [ $# -eq 0 ];then
echo -------------------------------------
echo No volume input,leave without modify
echo -------------------------------------
echo Current Volume:
amixer |grep -A 4 Master
exit 0
fi

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

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


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


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

##-----------------Read Para-----------------##
while getopts "h:m:d:s:v:A" arg
do
      case $arg in
                h)
                        sethour=$OPTARG
                        echo sethour = $sethour
                        ;;
                m)
                        setmin=$OPTARG
                        echo setmin = $setmin
                        ;;
                d) #DO TASK#
                        task="$OPTARG"
                        dsflag=1
                        ;;
                s) #SET TASK#
                        task="$OPTARG"
                        dsflag=0
                        ;;
                v) #SET VOLUME#
                        setvolume="$OPTARG"
                        ;;
                A) #ABORT ALL TASKS#
                        abort=1
                        ;;
                ?)
                        echo "unkonw argument"
                        exit 1
                        ;;
      esac
done
echo "-----------------"

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

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

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

exit 0
fi

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

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

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

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

echo SET TASK ["$task"]

##Check volume set##
if [ $setvolume -ge 0 ];then
if [ $setvolume -gt 100 ];then
echo "Error:Input volume error,exit without change..."
exit 1
else
echo SET VOLUME ["$setvolume"]
fi
fi

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

##Calc time##
nhour=`date +%H`
nmin=`date +%M`
if [ $nhour -lt 10 ];then #convert "08" to "8"#
nhour=${nhour:1:1}
fi
if [ $nmin -lt 10 ];then
nmin=${nmin:1:1}
fi

thour=$(($nhour+$sethour))
tmin=$(($nmin+$setmin))

if [ $tmin -gt 59 ];then
thour=$(($thour+$(($tmin/60))))
tmin=$(($tmin%60))
fi
if [ $thour -gt 23 ];then
thour=$(($thour%24))
fi

echo RUN TIME [$thour:$tmin]

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

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

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

exit 0
fi


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

##Run task##
`$task`

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

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

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

exit 0
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原来的任务,请放心使用)

举例:
timer.sh -h 1 -m 30 -s /.../alarm_stop.sh -v 100或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上测试,若在其他人的主机上运行出现不可预期的后果,造成的损失本人不负责。




页: 1 [2] 3
查看完整版本: XPEnoboot 5.2 驱动编译 & Mplayer 玩法