您的位置:首页 > 运维架构 > Linux

基于mini2440的SD卡MP3播放器的设计

2014-03-15 22:55 176 查看
这本来是友善之臂mini2440开发板附带的一个实战项目,但是原来给的说明文档太过于简略,对于我这个还没有开始学习驱动开发的新手来说,驱动那一块是很麻烦的。到网上找了很久的资料。看了很久才明白整个驱动的移植过程,在此把整个过程记录下来,以便于温故知新。

一、总体设计

这个是基于一个开源项目madplay的MP3播放系统,madplay是一个MP3格式的解码程序,使用它我们可以播放MP3格式的音乐,在此还需要一个MP3播放控制的主程序,该主程序调用madplay实现音乐的播放/暂停、上一首/下一首、停止等功能,这是应用软件部分的设计。而要实现mini2440上的按键播放就必须有相应的按键驱动,这个就需要我们自己来向开发板上移植了。所以我们的工作主要由三部分组成:①MP3主控程序的开发②madplay的移植③按键驱动的移植,具体如下展开。

二、MP3主控程序的开发

这一主控程序网上有很多,友善也已给出了,在此我们就使用后者,它主要由C语言文件player.c和相应的Makefile文件组成,将这两个文件在虚拟机中的交叉编译环境下进行编译即可生成可执行程序mp3_player,过程较为简单,在此不表。需注意的是,此处原本指定的播放目录是/sdcard/song目录,这是一个存储音乐文件的目录,但是在我的开发板上挂载U盘之后,自动生成的目录为/udisk,所以我们只需在自己的U盘里创建一个/song目录用于存储音乐,然后将此处的指定目录替换成/udisk/song/即可,同理,若想指定其他播放目录页类似

三、madplay的移植

网上有很多有关madplay移植的资料,也较为详细,整个过程较为清晰,具体可参照该项目附带的一个文档,这里提供一个链接,仅供参考http://blog.csdn.net/yichi7758/article/details/5329313,值得注意的是,在上一步骤中的MP3播放主控程序中指定的调用madplay的目录是/bin/madplay,也就是说,我们生成的madplay可执行程序要放在开发板中的/bin/目录下面。

四、按键驱动的移植

最麻烦的是按键驱动的移植,此时我还没有学习过驱动的移植,对于驱动移植的整个流程都不清楚,只能一点点找资料来了解。驱动一般都是在编译内核的时候被一起编译进内核里面的,但是有时候我们要开发针对特定应用程序的驱动,比如说,我们要做LED实验的时候,可能会加载针对LED的按键驱动,这样我们就可以按下不同的键使不同的LED灯闪烁了,而我们要按下不同的键来实现MP3的播放暂停上一曲下一曲等功能,我们就需要开发相应的驱动来指定不同的按键的不同功能。

 

通常来讲,驱动的开发的流程一般为将驱动程序的C语言文件放到内核源码中的相应位置,然后对内核的配置文件进行修改,之后在执行make menuconfig命令对内核进行配置,紧接着对内核进行编译,生成必要的中间文件,然后对驱动程序对应的Makefile文件进行修改,将其中的KERNELDIR内核源码路径修改成我们刚才配置的内核源码的路径,之后执行make,即可在当前路径下生成驱动模块,将其下载至开发板进行加载,创建节点,即可正常运行MP3播放程序了。关于把驱动编译进内核的方式,可参照http://www.linuxidc.com/Linux/2012-11/73468.htm

以上为大致流程,接下来为详细流程。

①首先针对内核源码目录中的driver/char中的Kconfig和Makefile进行修改,这个具体可参考http://blog.csdn.net/xdw1985829/article/details/6833319

②在内核源码目录下执行make menuconfig对内核进行配置,选定我们刚刚添加的相应的驱动条目

③在内核源码主目录下执行make zImage可生成相应的内核,执行make modules 可生成我们想要的中间模块

此处亦可参考http://zhangzhenyuan163.blog.163.com/blog/static/8581938920142810521613/,他移植的是LED驱动,不过和此处的按键驱动移植流程大致一样

④在单独的驱动文件目录下使用 make 命令执行修改后的Makefile(该Makefile文件的修改可参考http://zhidao.baidu.com/link?url=pRSdlNvvvqf4TbDi8i05ExAw5qFrMQ4Q2kiA89QZXeFwc4dZqThKzQhDiFKlXgqblj7LYFxmZImo0PteJi9c9q)文件,即可生成该按键驱动.ko模块

我第一次做到这一步的时候遇到了这样的一些类似的错误,就是头文件找不到,变量未声明之类的

/feng/SDK-MP3/driver/mini2440_buttons.c:11:28: error: mach/regs-gpio.h: No such file or directory

/feng/SDK-MP3/driver/mini2440_buttons.c:30: error: 'IRQ_EINT8' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:30: error: 'S3C2410_GPG0' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:30: error: 'S3C2410_PG0_EINT8' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:31: error: 'IRQ_EINT11' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:31: error: 'S3C2410_GPG3' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:31: error: 'S3C2410_GPG3_EINT11' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:32: error: 'IRQ_EINT13' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:32: error: 'S3C2410_GPG5' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:32: error: 'S3C2410_GPG5_EINT13' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:33: error: 'IRQ_EINT14' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:33: error: 'S3C2410_GPG6' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:33: error: 'S3C2410_GPG6_EINT14' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:34: error: 'IRQ_EINT15' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:34: error: 'S3C2410_GPG7' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:34: error: 'S3C2410_GPG7_EINT15' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:35: error: 'IRQ_EINT19' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:35: error: 'S3C2410_GPG11' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c:35: error: 'S3C2410_GPG11_EINT19' undeclared here (not in a function)

/feng/SDK-MP3/driver/mini2440_buttons.c: In function 'buttons_interrupt':

/feng/SDK-MP3/driver/mini2440_buttons.c:62: error: implicit declaration of function 's3c2410_gpio_getpin'

make[2]: *** [/feng/SDK-MP3/driver/mini2440_buttons.o] 错误 1

make[1]: *** [_module_/feng/SDK-MP3/driver] 错误 2

make[1]: Leaving directory `/feng/SDK-MP3/kernel/linux-2.6.29'

make: *** [all] 错误 2

查了很多资料才解决,原来就是在修改内核配置文件的时候出的问题,正确的解决办法应该是执行与③链接中的类似的 cp config_mini2440_w35 .config来修改./config配置文件

 http://zhangzhenyuan163.blog.163.com/blog/static/8581938920142810521613/

http://blog.sina.com.cn/s/blog_3c70fb610100mkk6.html

 

⑤将驱动模块.ko文件复制到开发板一个目录下面,然后执行命令insmod  <驱动模块名.ko>,即可加载该驱动程序,加载信息为key device installed, with major 253

The device name is: /dev/key

在这一步遇到的问题是insmod: cannot insert 'int_key_drv.ko': invalid module format,说是vermagic不一致

具体的解决方法是修改相应的Makefile文件中的开头部分EXTRAVERSION,具体可参考http://blog.csdn.net/zh98jm/article/details/6179496

⑥创建相应的设备节点,在上一步中我们可以看到加载驱动之后的设备名为/dev/key,所以执行命令mknod  /dev/key c 253 0 ,创建节点之后,我们在/dev/目录下就会看见有key这个设备

⑦执行第一部分中生成的MP3主控程序,我们就可以在终端下面看到播放程序已经启动了,按下相应的键即可播放音乐了。

为了让开发板在开机后自动加载该驱动,并自动执行该程序,我们可以讲⑤⑥⑦中的步骤写进一个shell脚本,然后开机执行此脚本即可,脚本命名为autorun,其内容如下:

#!/bin/sh

echo "starting to insert key driver module..."

insmod int_key_drv.ko

echo "making node..."

 

mknod /dev/key c 253 0

echo "starting to play mp3..."

 

保存之后记得给此脚本加上执行权限

然后修改开发板启动目录下的启动文件,开机执行此脚本文件即可

执行命令 vi /etc/init.d/rcS进入启动文件

在文件最后添加如下两句

cd /home/musicplayer/

/home/musicplayer/autorun  &

 

其中的/home/musicplayer/即为我放置autorun脚本、MP3主控应用程序、按键驱动模块的目录

开机重启就可以看到相应的启动信息了

然后直接按下K1键即可播放音乐了

 

关于开机启动部分,可参考http://blog.chinaunix.net/uid-24868917-id-118560.html

 

以上为此次学习的主要过程。。。

具体还可以参考我收藏的那一些文章,都是很不错的参考资料,共同向前辈们学习~~

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息