基于mini2440的mp3播放器

2020-05-22来源: eefocus关键字:mini2440  mp3播放器

基于mini2440开发板和MADPLAY,用声卡,按键实现MP3功能,通过mini2440的6个按键实现开始,暂停,上一首,下一首,音量+,音量-的功能,而且可以顺序播放和随机播放。

 

按键平台驱动

 

device

 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

static struct resource button_resource[]=

{

    [0] = {

              .start = IRQ_EINT8,

              .end = IRQ_EINT8,

              .flags = IORESOURCE_IRQ,

          },

    [1] = {

              .start = IRQ_EINT11,

              .end = IRQ_EINT11,

              .flags = IORESOURCE_IRQ,

          },

    [2] = {

              .start = IRQ_EINT13,

              .end = IRQ_EINT13,

              .flags = IORESOURCE_IRQ,

          },

    [3] = {

              .start = IRQ_EINT14,

              .end = IRQ_EINT14,

              .flags = IORESOURCE_IRQ,

          },

    [4] = {

              .start = IRQ_EINT15,

              .end = IRQ_EINT15,

              .flags = IORESOURCE_IRQ,

          },

    [5] = {

              .start = IRQ_EINT19,

              .end = IRQ_EINT19,

              .flags = IORESOURCE_IRQ,

          },

};

 

struct platform_device *my_button;

 

static int __init platform_dev_init(void)

{

    int ret;

 

    my_button = platform_device_alloc("my_button", -1);

 

    platform_device_add_resources(my_button,button_resource,6);

 

 

    ret = platform_device_add(my_button);

 

    if(ret)

    {

        platform_device_put(my_button);

    }

 

    return ret;

}

 

static void __exit platform_dev_exit(void)

{

    platform_device_unregister(my_button);

}

 

module_init(platform_dev_init);

module_exit(platform_dev_exit);

 

MODULE_AUTHOR("zxf");

MODULE_LICENSE("GPL");


 


driver


 


#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

 

#define DEVICE_NAME     "buttons"

 

struct button_irq_desc {

    int irq;

    int pin;

    int pin_setting;

    int number;

    char *name;

};

 

static struct button_irq_desc button_irqs [] = {

    {IRQ_EINT8 , S3C2410_GPG(0) ,  S3C2410_GPG0_EINT8  , 0, "KEY0"},

    {IRQ_EINT11, S3C2410_GPG(3) ,  S3C2410_GPG3_EINT11 , 1, "KEY1"},

    {IRQ_EINT13, S3C2410_GPG(5) ,  S3C2410_GPG5_EINT13 , 2, "KEY2"},

    {IRQ_EINT14, S3C2410_GPG(6) ,  S3C2410_GPG6_EINT14 , 3, "KEY3"},

    {IRQ_EINT15, S3C2410_GPG(7) ,  S3C2410_GPG7_EINT15 , 4, "KEY4"},

    {IRQ_EINT19, S3C2410_GPG(11),  S3C2410_GPG11_EINT19, 5, "KEY5"},

};

static volatile char key_values [] = {'0', '0', '0', '0', '0', '0'};

 

static DECLARE_WAIT_QUEUE_HEAD(button_waitq);

 

static volatile int ev_press = 0;

 

 

static irqreturn_t buttons_interrupt(int irq, void *dev_id)

{

    struct button_irq_desc *button_irqs = (struct button_irq_desc *)dev_id;

    int down;

 

    // udelay(0);

    down = !s3c2410_gpio_getpin(button_irqs->pin);

 

    if (down != (key_values[button_irqs->number] & 1)) { // Changed

 

key_values[button_irqs->number] = '0' + down;

 

        ev_press = 1;

        wake_up_interruptible(&button_waitq);

    }

 

    return IRQ_RETVAL(IRQ_HANDLED);

}

 

 

static int s3c24xx_buttons_open(struct inode *inode, struct file *file)

{

    int i;

    int err = 0;

 

    for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {

if (button_irqs[i].irq < 0) {

continue;

}

        err = request_irq(button_irqs[i].irq, buttons_interrupt, IRQ_TYPE_EDGE_BOTH,

                          button_irqs[i].name, (void *)&button_irqs[i]);

        if (err)

            break;

    }

 

    if (err) {

        i--;

        for (; i >= 0; i--) {

    if (button_irqs[i].irq < 0) {

continue;

    }

    disable_irq(button_irqs[i].irq);

            free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);

        }

        return -EBUSY;

    }

 

    ev_press = 1;

 

    return 0;

}

 

 

static int s3c24xx_buttons_close(struct inode *inode, struct file *file)

{

    int i;

 

    for (i = 0; i < sizeof(button_irqs)/sizeof(button_irqs[0]); i++) {

if (button_irqs[i].irq < 0) {

    continue;

}

free_irq(button_irqs[i].irq, (void *)&button_irqs[i]);

    }

 

    return 0;

}

 

 

static int s3c24xx_buttons_read(struct file *filp, char __user *buff, size_t count, loff_t *offp)

{

    unsigned long err;

 

    if (!ev_press) {

if (filp->f_flags & O_NONBLOCK)

    return -EAGAIN;

else

    wait_event_interruptible(button_waitq, ev_press);

    }

 

    ev_press = 0;

 

    err = copy_to_user(buff, (const void *)key_values, min(sizeof(key_values), count));

 

    return err ? -EFAULT : min(sizeof(key_values), count);

}

 

static unsigned int s3c24xx_buttons_poll( struct file *file, struct poll_table_struct *wait)

{

    unsigned int mask = 0;

    poll_wait(file, &button_waitq, wait);

    if (ev_press)

        mask |= POLLIN | POLLRDNORM;

    return mask;

}

 

 

static struct file_operations dev_fops = {

    .owner   =   THIS_MODULE,

    .open    =   s3c24xx_buttons_open,

    .release =   s3c24xx_buttons_close,

    .read    =   s3c24xx_buttons_read,

    .poll    =   s3c24xx_buttons_poll,

};

 

static struct miscdevice misc = {

.minor = MISC_DYNAMIC_MINOR,

.name = DEVICE_NAME,

.fops = &dev_fops,

};

 

 

 

static int my_plat_probe(struct platform_device *dev)

{

    int ret,i;

    struct resource *button_resource;

    struct platform_device *pdev = dev;

 

    printk("platform dirver mach platfrom device.n");

 

    for( i=0; i < 6; i++ )

    {

        button_resource = platform_get_resource(pdev,IORESOURCE_IRQ,i);

        if( button_resource == NULL )

        {

            return -ENOENT;

        }

        button_irqs[i].irq = button_resource->start;

    }

    ret = misc_register(&misc);

    if(ret)

    {

        return ret;

    }

    return 0;

}

 

static int my_plat_remove(struct platform_device *dev)

{

    printk("my platfrom button has removed.n");

    misc_deregister(&misc);

    return 0;

}

 

struct platform_driver my_button =

{

    .probe = my_plat_probe,

    .remove = my_plat_remove,

    .driver =

    {

        .owner = THIS_MODULE,

        .name = "my_button",

    },

};

 

static int __init platform_drv_init(void)

{

    int ret;

    ret = platform_driver_register(&my_button);

    printk (DEVICE_NAME"tinitializedn");

    return ret;

}

 

static void __exit platform_drv_exit(void)

{

    platform_driver_unregister(&my_button);

}

 

module_init(platform_drv_init);

module_exit(platform_drv_exit);

MODULE_LICENSE("GPL");

MODULE_AUTHOR("FriendlyARM Inc.");


 


source


 


[1] [2] [3]
关键字:mini2440  mp3播放器 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic497977.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:Linux-4.9.2内核在mini2440上的移植(三)——编译环境测试
下一篇:QEMU模拟FriendlyArm的Mini2440开发板

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

一起学mini2440裸机开发(三)--S3C2440时钟学习
前言首先,我们应该知道一点,mini2440开发板在没有开启时钟前,整个开发板全靠一个12MHz的外部晶振提供频率来工作运行的,也就是说CPU、内存、UART、ADC等所有需要用到时钟频率的硬件都工作在12MHz下,而S3C2440A可以正常工作在400MHz下,可想而知两者速度相差会有多大了。如果CPU工作在12MHz频率下,开发板的使用效率非常低,所有依赖系统时钟工作的硬件,其工作效率也很低,比如,我们电脑里面经常提到的超频,超频就是让CPU工作在更高的频率下,让电脑运算速度更快,虽然频率是越高越好,但是由于硬件特性决定了任何一个设备都不可能无止境的超频,电脑超频时要考虑到CPU或主板发热过大,烧坏的危险,同样开发板的主板
发表于 2020-05-14
一起学mini2440裸机开发(三)--S3C2440时钟学习
成功在mini2440上移植ffmpeg
在mini2440上,整个移植过程分三个步骤:(1)编译x264;(2)编译ffmpeg;(3)移植成功后,进行测试,即使用ffmpeg录像。(1)编译x264官网上下了个最新的x264,地址http://www.videolan.org/developers/x264.html。我下载的文件是last_x264.tar.bz2。解压命令为#tar -jxv -f last_x264.tar.bz2,解压后的目录为x264-snapshot-20130313-2245。进入解压后的目录,执行命令./configure --disable-asm,则会生成config.mak。之后就需要修改这个config.mak文件了,改写
发表于 2020-05-14
成功在mini2440上移植ffmpeg
arm mini2440 基于v4l2 ffmpeg x264的视频远程监控
网络上盛传的基于mini2440的摄像头监控一般是基于 MJPEG-Streamer。这种方法利用的是V4L2的底层驱动,然后配合mjpeg这种格式的流传输,然后通过浏览器浏览视频和控制。下面用一个更接近真实的IP-camera的方案来实现。首先先看一下网友sunkwei写的《基于v4l2的webcam应用,本地预监》http://blog.csdn.net/sunkwei/article/details/6530343文本照搬他的代码,只是将他的webcam_server交叉编译到arm上,webcam_shower编译到pc上。这种方案是用的V4L2的视频驱动,然后配合ffmpeg、x264的软件编解码,通过udp上传至pc
发表于 2020-05-14
arm mini2440 基于v4l2 ffmpeg x264的视频远程监控
MINI2440裸机流水灯
概述流水灯是每个嵌入式开发者接触到一款新的控制器时最先实现的程序,本文记录了在友善之臂MINI2440平台上实现流水灯的过程。实现原理通过查看友善之臂提供的MINI2440原理图我们可以知道,MINI2440开发板上四个LED为共阳极接法,四个LED的N极与S3C2440的连接关系如下:LED1 >> GPB5LED2 >> GPB6LED3 >> GPB7LED4 >> GPB8当上述4个IO端口输出低电平时即可点亮对应的LED灯。编写程序及Makefile我们知道,S3C2440内部具有4KB的SRAM,当从NOR Flash启动时,这部分区域的起始地址为0x40000000
发表于 2020-05-14
MINI2440裸机流水灯
二、mini2440裸机程序之按键检测实验
开发板:mini2440, NandFlash:K9F2G08U0B 256M大小,CPU:S3C2440A  。开发环境:MDK4.11仿真器:Jlink v8这是我用csdn发表的第一个文章,之前使用过arm-linux-gcc裸机开发mini2440,但是很多函数什么的不能直接调用(我的技术问题),准备重新整理一下ARM裸机,整理好之后准备下一阶段学习。关于软件MDK4.11和它的注册机,我传不上去,说是由于文件太大,又想要的直接留言邮箱要就行了。下面开始我们的第一个LED灯的点亮程序吧!1、新建一个项目工程双击MDK图标进入开发环境,如下图,  单击Project/New uVision
发表于 2020-05-14
二、mini2440裸机程序之按键检测实验
mini2440第一个裸机程序——点亮LED
手头的Mini2440搁置了两年半之后,我再次决定拿出它,重新尝试嵌入式Linux的学习。我使用的是友善之臂的Mini2440开发板、韦东山的《嵌入式Linux应用开发完成手册》及其视频教程。所以,本篇文章中所涉及到的各种软件均可在以下两处找到:0. Mini2440开发板的配套光盘韦东山JZ2440开发板的光盘JZ2440是韦东山出品的开发板,作为《嵌入式Linux应用开发完全手册》的配套硬件,它和Mini2440相差无几,所以我这里用的是Mini2440。一、目标动手之前先确定好一个小目标——这一次,我们的目标是在Mini2440上点亮LED,怎么样,听起来很简单吧。但是做起来,可并不是很简单喏,主要是因为会涉及到比较多的软件
发表于 2020-05-14
mini2440第一个裸机程序——点亮LED
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved