S3C2440裸板WM8976声卡驱动实现

发布者:码字奇思最新更新时间:2018-07-24 来源: eefocus关键字:S3C2440  裸板  WM8976  声卡驱动 手机看文章 扫描二维码
随时随地手机看文章

本源代码在Ubuntu9.10环境下用arm-linux-gcc 4.3.2编译通过,并在勤研2440开发板上验证过可以播放采样频率为22050HZ的音频WAV文件



#include "def.h"  

#include "iis.h"  

#include "s3c24xx.h"  

#define L3M (1<<2)  

#define L3D (1<<3)  

#define L3C (1<<4)  

unsigned char *Buf = (unsigned char *)0x31000000;  

//data chunk size  

unsigned int size = 0;  

//sampling frequency  

unsigned int fs = 0;  

//-------------------------------------------------------------  

//  S3C2440A IIS Configuration  

//  GPB4 = L3CLOCK, GPB3 = L3DATA,  GPB2 = L3MODE  

//  GPE0 = I2SLRCK, GPE1 = I2SSCLK, GPE3 = I2SSDI, GPE4 = I2SSDO, GPE2 = CDCLK  

//-------------------------------------------------------------  

void Play_WAV(void)  

{  

    Printf("[ IIS test using WM8976 CODEC ]/r/n");  

    IIS_PortSetting();  

    Init8976();  

    //set INT_DMA2 interrput service is available  

    INTMSK &= ~(1 << 19);  

      

    fs = *(Buf + 0x18) | *(Buf + 0x19)<<8 | *(Buf + 0x1a)<<16 | *(Buf + 0x1b)<<24;  

      

    if(fs == 44100)     //11.2896MHz (256fs)  

    {  

    //  IISPSR = (3<<5) + 3;  

    }  

    else if(fs == 22050)        //5.6448MHz (256fs)  

    {  

        IISPSR = (8<<5) + 8;  

        size = *(Buf + 0x28) | *(Buf + 0x29)<<8 | *(Buf + 0x2a)<<16 | *(Buf + 0x2b)<<24;  

        DISRC2 = (int)(Buf + 0x2c);  

    }  

    Printf("Sample Size = 0x%x/r/n", size/2);  

    Printf("Sampling Frequency = %d Hz/r/n", fs);  

    Printf("/r/n[ Nowing play the wav file ...]/r/n");  

    //init IIS  

    IISCON = (1<<5) + (1<<2) + (1<<1);    //Tx DMA service request Enable[5], Rx Idle[2], IIS prescaler Enable[1];  

    IISMOD = (0<<9) + (0<<8) + (2<<6) + (0<<5) + (0<<4) + (1<<3) + (0<<2) + (1<<0);  

    IISFCON = (1<<15) + (1<<13);    //Tx FIFO access mode DMA[15], Tx FIFO Enable[13]  

    //init DMA2  

    DISRCC2 = (0<<1) + (0<<0);  //the source is in the AHB, increment  

    DIDST2 = (U32)IISFIFO;      //IISFIFO  

    DIDSTC2 = (1<<1) + (1<<0);  //the destination is in the APB, fixed  

    //Handshake[31], Sync PCLK[30], CURR_TC Interrupt enable[29],Unit Transfer[28],Single Service Mode[27]  

    //I2SSDO[26:24], DMA Source[23], Auto Reload[22], Half-Word[21:20], TC[19:0]  

    DCON2 = (1<<31)+(0<<30)+(1<<29)+(0<<28)+(0<<27)+(0<<24)+(1<<23)+(1<<22)+(1<<20)+(size/2);  

    //No-Stop[2], DMA channel is turned on[1], No-Trigger in S/W request mode[0]  

    DMASKTRIG2 = (0<<2)+(1<<1)+(0<<0);  

      

    //IIS Interface Start  

    IISCON |= 0x1;   

      

}  

void IIS_PortSetting(void)  

{  

//------------------------------------------------------  

//     Port E Group  

//Ports:    GPE0    GPE1    GPE2    GPE3    GPE4  

//Signal:   I2SLRCK I2SSCLK CDCLK   I2SSDI  I2SSDO  

//      [1:0]   [3:2]   [5:4]   [7:6]   [9:8]  

//Binary:   10  10  10  10  10  

//------------------------------------------------------  

    GPEUP = GPEUP | (0x1f);  

    GPECON = GPECON & ~(0x3ff) | (0x2aa);  

}  

void Init8976(void)  

{  

//----------------------------------------  

//         Port B Group  

//Ports:    GPB2    GPB3    GPB4  

//Signal:   L3MODE  L3DATA  L3CLOCK  

//Setting:  OUTPUT  OUTPUT  OUTPUT  

//      [9:8]   [7:6]   [5:4]  

//Binary:   01  01  01  

//----------------------------------------  

    GPBUP = GPBUP | (0x7<<2); //disable GPB[4:2] pull up function  

    GPBCON = GPBCON & ~(0x3f<<4) | (0x15<<4);  

    GPBDAT = GPBDAT & ~(L3M|L3D|L3C) | (L3M|L3C);   //L3Mode=H, L3Clock=H  

    WriteL3Data((0x3<<1)+1,0xef);//RMIXEN,LMIXEN,DACENR,DACENL          

    WriteL3Data((0x1<<1)+0,0x1f);//biasen,BUFIOEN.VMIDSEL=11b  

    WriteL3Data((0x2<<1)+1,0x80);//ROUT1EN LOUT1EN  

    WriteL3Data((0x6<<1)+0,0x0);//SYSCLK=MCLK  

    WriteL3Data((0x4<<1)+0,0x10);//16bit         

    WriteL3Data((0x2B<<1)+0,0x10);//BTL OUTPUT  

    WriteL3Data((0x9<<1)+0,0x50);//Jack detect enable  

    WriteL3Data((0xD<<1)+0,0x21);//Jack detect  

    WriteL3Data((0x7<<1)+0,0x01);//Jack detect  

}  

void WriteL3Data(unsigned char regaddr, unsigned char data)  

{  

    int i, j;  

    //start condition: L3M = High L3C = High  

    GPBDAT |= L3M;  

    GPBDAT |= L3C;  

    GPBDAT |= L3M;  

    GPBDAT |= L3C;  

    for(i=0; i<100; i++);    //delay  

    //control register address  

    for(j=0; j<8; j++)  

    {  

        if(regaddr & 0x80)  

        {  

            GPBDAT &= ~L3C;  

            GPBDAT |= L3D;  

            for(i=0; i<10; i++); //delay  

            GPBDAT |= L3C;  

            for(i=0; i<10; i++); //delay  

        }  

        else  

        {  

            GPBDAT &= ~L3C;  

            GPBDAT &= ~L3D;  

            for(i=0; i<10; i++); //delay  

            GPBDAT |= L3C;  

            for(i=0; i<10; i++); //delay  

        }  

        regaddr = regaddr << 1;  

    }  

    //control register data bits  

    for(j=0; j<8; j++)  

    {  

        if(data & 0x80)  

        {  

            GPBDAT &= ~L3C;  

            GPBDAT |= L3D;  

            for(i=0; i<10; i++); //delay  

            GPBDAT |= L3C;  

            for(i=0; i<10; i++); //delay  

        }  

        else  

        {  

            GPBDAT &= ~L3C;  

            GPBDAT &= ~L3D;  

            for(i=0; i<10; i++); //delay  

            GPBDAT |= L3C;  

            for(i=0; i<10; i++); //delay  

        }  

        data = data << 1;  

    }  

    GPBDAT &= ~L3M;  

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

    GPBDAT |= L3M;  

    GPBDAT |= L3C;  

}  

void DMA2_Done(void)  

{  

    SRCPND |= (1<<19);  

    INTPND = (1<<19);  

    IISCON = 0x0;       //IIS Interface stop  

    DMASKTRIG2 = (1<<2);  //DMA2 stop  

    IISFCON = 0x0;      //FIFO flush  

    INTMSK = INTMSK | (1<<19);  


关键字:S3C2440  裸板  WM8976  声卡驱动 引用地址:S3C2440裸板WM8976声卡驱动实现

上一篇:LPC1768 -- RTC实时时钟
下一篇:STM32之timer1产生PWM(互补通道)

推荐阅读最新更新时间:2024-03-16 16:09

S3C2440核心原理图设计:与NAND FLASH接线分析
NAND FLASH 的接线方式和 NOR FLASH,SDRAM 都不一样。以 TQ2440 开发板用的 K9F1208 为例,分析 NAND FLASH 的接线方式。 K9F1208 结构如下图: K9F1208 位宽是8 位。 一页: 512byte + 16byte 最后 16byte 是用于存储校验码和其他信息用的,不能存放实际的数据。 一个块有 32 page:(16k+512)byte K9F1208 有 4096 个块:(64M+2M)byte,总共有64Mbyte 可操作的芯片容量 NAND FLASH以页为单位读写数据,以块为单位擦除数据。 S3C24440 和K9F1208 的接线图如下:
[单片机]
<font color='red'>S3C2440</font>核心<font color='red'>板</font>原理图设计:与NAND FLASH接线分析
S3C2440触摸屏驱动实例开发讲解
一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理 层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层
[单片机]
<font color='red'>S3C2440</font>触摸屏<font color='red'>驱动</font>实例开发讲解
s3c2440裸机-电阻触摸屏编程(4.isr设计_4.2支持长按和滑动)
1.改进定时器 五. irq之定时器中断这记一节中,是在handle_irq_c()中去区分中断源,执行不同的isr。那现在通过register_timer注册对应的定时器中断服务程序,timer_irq进行执行不同的定时器中断服务程序。 #define TIMER_NUM 32 #define NULL ((void *)0) typedef void(*timer_func)(void); typedef struct timer_desc {   char *name;   timer_func fp; }timer_desc, *p_timer_desc; timer_desc timer_array ; in
[单片机]
S3C2440-按键
[单片机]
S3C2440-按键
移植u-boot-2010.09到S3C2440(三)——判断NAND还是NOR启动的汇编代码
参考文档:s3c2440的nandflash启动 guess_flash: #define BWSCON 0x48000000 ldr r4, =BWSCON ldr r6, ands r6, r6, #0x6 mov r6, r6, LSL#4 ldr r5, =GPBDAT str r6, bl guess_flash 这几行的意思是: 获取0X48000000地址的值,获得其 位,在LEDs显示其值。 结论: 通过LED的显示,可以发现在NAND和在NOR运行的显示效果不同。
[单片机]
linux中S3C2440的物理地址映射到虚拟地址详解
linux-2.6.30.4\arch\arm\plat-s3c\include\plat\ map-base.h #defineS3C_ADDR_BASE (0xF4000000) #ifndef __ASSEMBLY__ #define S3C_ADDR(x) ((void__iomem __force *)S3C_ADDR_BASE+ (x)) #else #defineS3C_ADDR(x) (S3C_ADDR_BASE+ (x)) #endif #define S3C_VA_IRQ S3C_ADDR(0x00000000) /* irq controller(s) */ #d
[单片机]
s3c2440液晶屏驱动 (内核自带) linux-4.1.24
自带有一部分驱动的配置信息,只要修改这部分就能支援 不同的液晶屏 - /arch/arm/mach-s3c24xx/mach-smdk2440.c 另一部分在 /drivers/video/fbdev/s3c2410fb.c 先打开调试功能,这样内核在启动的时候,就可以输出这些信息,或者使用 dmesg 查看到这些信息。当然,你配置内核 make menuconfig 也可以打开,但是太麻烦了,不如这样。 1 #define CONFIG_FB_S3C2410_DEBUG 2 #define dprintk(msg...) 3 do { 4 if (debug) 5 printk(msg);
[单片机]
<font color='red'>s3c2440</font>液晶屏<font color='red'>驱动</font> (内核自带) linux-4.1.24
AD9779A的寄存器配置及PLL频带优化
    随着科学技术的发展,通信、测量等各个领域对信号源的要求越来越高,高速任意波形发生器成为市场的热点。高速DAC作为任意波形发生器的关键部分,其性能对高速信号有着极大的影响。AD9779A是目前国内能买到的性能较高的高速DAC芯片,内部集成PLL倍频电路、同步控制、增益控制等功能模块,通过SPI接口和外部通信,可以设置优化各种功能以达到最佳性能。 1 AD9779A简介     AD9779A是Analog Devices公司生产的双通道16位高速宽动态范围数DAC,采样率1Gsps,允许高至奈奎斯特频率的多载波生成。0.18μm CMOS工艺制作,工作电压1.8~3.3 V,采样率1 Gsps时功耗1 W,具有高速、低功
[网络通信]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved