亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? cs4334.c

?? 經(jīng)過一番努力
?? C
字號:
#include <linux/module.h>
#include <linux/types.h>
#include <linux/wait.h>
#include <linux/fs.h>
#include <linux/sched.h>
#include <linux/poll.h>
#include <linux/miscdevice.h>
#include <linux/init.h>
#include <linux/compiler.h>
#include <linux/interrupt.h>
#include <linux/sound.h>
#include <linux/soundcard.h>

#include <asm/io.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/hardware.h>

#include <linux/init.h>
#include <linux/mm.h>
#include <linux/pm.h>
#include <linux/errno.h>
#include <asm/dma.h>
#include <asm/hardware.h>
#include <asm/arch/irqs.h>


#define SOUND_NAME    "audio"
#define SOUND_IRQ  S3C44B0X_INTERRUPT_BDMA0


#ifndef AUDIO_CODEC_CLOCK
#define AUDIO_CODEC_CLOCK 256
#endif

#ifndef SOUND_MAJOR
#define SOUND_MAJOR 14
#endif


static const char sound_driver_version[] = "S3C44B0 Sound driver";

#define bmda1_id  "BDMA1_audio"
static volatile unsigned int DMA_Done = 1;
static unsigned char audio_used=0;

static int sound_cpu_init(void)
{
    (*(volatile unsigned *)S3C44B0X_PCONE)&=0x0ffff;
    (*(volatile unsigned *)S3C44B0X_PCONE)|=0x20000;
    (*(volatile unsigned *)S3C44B0X_PCONF)&=0x0703ff;
    (*(volatile unsigned *)S3C44B0X_PCONF)|=0x209000;
    return 0;  
}

static int irq_sound(int irq, void *dev_id, struct pt_regs *regs)
{
    DMA_Done = 1;
    return 1;
}


static int sound_open(struct inode *inode, struct file *filp)
{
    int retII=0;
    
    if (audio_used) return -1;
    audio_used=1;
    MOD_INC_USE_COUNT;
    DMA_Done = 1; // set start status.
    retII=request_irq(SOUND_IRQ, irq_sound, SA_INTERRUPT,SOUND_NAME,NULL);
    if (retII!=0) 
    {
 printk(KERN_WARNING "s3c44b0_sound: failed to get IRQ\n");
 return -1;
    }

    (*(volatile unsigned *)S3C44B0X_INTMSK)&=~(0x01<<S3C44B0X_INTERRUPT_BDMA0); 
    return 0; 
}

static ssize_t sound_write(struct file *filp, const char *buf, size_t count, loff_t *ppos)
{
    unsigned int dma_addr;
    
    while ( DMA_Done == 0 ) {}
    /* Aligment to half word*/
    count &= 0xfffffffe;
    dma_addr = (unsigned int) buf;
    dma_addr = (dma_addr + 1) & 0x0ffffffe;
    
    /****** IIS Initialize ******/
    (*(volatile unsigned *)S3C44B0X_IISCON)=0x22;
#if (AUDIO_CODEC_CLOCK == 256)          
    (*(volatile unsigned *)S3C44B0X_IISMOD)=0x89; //Master,Tx,L-ch=low,iis,16bit ch.,codeclk=256fs,lrck=32fs
#else
    (*(volatile unsigned *)S3C44B0X_IISMOD)=0x8D; //Master,Tx,L-ch=low,iis,16bit ch.,codeclk=384fs,lrck=32fs
#endif
    (*(volatile unsigned *)S3C44B0X_IISFIFCON)=0xa00;

    /****** DMA Initialize ******/
    (*(volatile unsigned *)S3C44B0X_BDISRC0)=(1<<30)+(1<<28)+ dma_addr; //Half word,inc,Buf   
(*(volatile unsigned *)S3C44B0X_BDIDES0)=(1<<30)+(3<<28)+(unsigned int)(S3C44B0X_IISFIF); 
    (*(volatile unsigned *)S3C44B0X_BDICNT0)=(1<<30)+(1<<26)+(3<<22)+(0<<21)+(0<<20)+count; 
    (*(volatile unsigned *)S3C44B0X_BDICNT0)|=0x01<<20;
    (*(volatile unsigned *)S3C44B0X_BDCON0)=0x0<<2; // Enable DMA

    DMA_Done = 0;
    (*(volatile unsigned *)S3C44B0X_IISCON)|=0x01;
    return count;
}

static int sound_release(struct inode *inode, struct file *filp)
{    
 MOD_DEC_USE_COUNT;
 /*cancel the DMA*/
 (*(volatile unsigned *)S3C44B0X_BDCON0)=0x07; 
 /*Disable IIS*/
        (*(volatile unsigned *)S3C44B0X_IISCON)=0x0c;
        DMA_Done = 0;
 audio_used=0;
        free_irq(SOUND_IRQ,NULL);
 return 0;
}

static int sound_ioctl(struct inode *inode, struct file *filp,unsigned int cmd, unsigned long arg)
{
 long val = 0;
 int ret = 0;

 switch (cmd) {
 case SNDCTL_DSP_STEREO:
  ret = get_user(val, (int *) arg);
  if (ret)
   return ret;
  ret = (val == 0) ? -EINVAL : 1;
  return put_user(ret, (int *) arg);

 case SNDCTL_DSP_CHANNELS:
 case SOUND_PCM_READ_CHANNELS:
  /* the CS4334 is stereo only */
  return put_user(2, (long *) arg);

 case SNDCTL_DSP_SPEED:
  ret = get_user(val, (long *) arg);
  if (ret) break;
  if (val < 8000) val = 8000;
  if (val > 44100) val = 44100;

  switch(val) {
  case 8000:
#if (AUDIO_CODEC_CLOCK == 256)        
 (*(volatile unsigned *)S3C44B0X_IISPSR)=(6<<4)+6; /*System clock too high,*/
#else
 (*(volatile unsigned *)S3C44B0X_IISPSR=(6<<4)+6; /*System clock too high*/
#endif
  break;
  case 11025:
#if (AUDIO_CODEC_CLOCK == 256)        
       (*(volatile unsigned *)S3C44B0X_IISPSR)=(6<<4)+6;  /*System clock too high*/
#else
       (*(volatile unsigned *)S3C44B0X_IISPSR)=(6<<4)+6; /*Should be 14*/
#endif
   break;
  case 22050:
#if (AUDIO_CODEC_CLOCK == 256)        
       (*(volatile unsigned *)S3C44B0X_IISPSR)=(4<<4)+4;      /*Should be 10.6 */
#else 
       (*(volatile unsigned *)S3C44B0X_IISPSR)=(0xe<<4)+0xe; /*Should be 7*/
#endif
  break;
  case 44100:
#if (AUDIO_CODEC_CLOCK == 256)        
      (*(volatile unsigned *)S3C44B0X_IISPSR)=(0xc<<4)+0xc; /*Should be 5.31*/
#else
  (*(volatile unsigned *)S3C44B0X_IISPSR=(1<<4)+1;   /*Should be 3.5*/
#endif                
  break;
  default:
#if (AUDIO_CODEC_CLOCK == 256)        
  (*(volatile unsigned *)S3C44B0X_IISPSR)=(4<<4)+4;
#else
  (*(volatile unsigned *)S3C44B0X_IISPSR)=(6<<4)+6;
#endif                
  break;
  } 

 case SOUND_PCM_READ_RATE: /* I am n't sure what it is  */
  return put_user(val , (long *) arg);

 case SNDCTL_DSP_SETFMT:
 case SNDCTL_DSP_GETFMTS:
  return put_user(AFMT_S16_LE, (long *) arg);

 default:
  return ret;
 }

 return ret;
}

 

static struct file_operations sound_fops = {
 .write=(void(*))sound_write,
 .ioctl=(void(*))sound_ioctl,
 .open=(void(*))sound_open,
 .release=(void(*))sound_release,
};


int __init sound_init_module(void)
{
   int ret;
    (*(volatile unsigned *)S3C44B0X_INTMSK)|=(0x01<<S3C44B0X_INTERRUPT_BDMA0); 
    sound_cpu_init();

    #if (AUDIO_CODEC_CLOCK == 256)        
      (*(volatile unsigned *)S3C44B0X_IISPSR)=(4<<4)+4;      /*Should be 10.6 , the register is 4 */
    #else 
      (*(volatile unsigned *)S3C44B0X_IISPSR)=(0xe<<4)+0xe;  /*Should be 7 */
    #endif
    ret=register_chrdev(SOUND_MAJOR,SOUND_NAME,&sound_fops);
    if (ret<0)
    {
        printk(": can't get major number\n");
        return -1;
    }
    printk("%s\n",sound_driver_version);    
    return 0;
}


void __exit sound_cleanup_module(void)
{
 printk(": S3C44B0 Sound Exit.\n");
 unregister_chrdev(SOUND_MAJOR,SOUND_NAME);
}

module_init(sound_init_module);
module_exit(sound_cleanup_module);

MODULE_DESCRIPTION("S3C44B0 Sound(CS4334) driver");
MODULE_LICENSE("GPL");
MODULE_AUTHOR("decker_0422@163.com");


?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产另类ts人妖一区二区| 中文字幕一区二区三区四区不卡| 亚洲午夜激情网页| 日韩精品在线一区| 亚洲成人tv网| 精品国产污污免费网站入口| 国产成人在线看| 亚洲免费在线看| 在线电影一区二区三区| 蜜桃精品视频在线观看| 国产欧美一区二区三区鸳鸯浴| 99re视频这里只有精品| 亚洲一区二区三区四区在线| 日韩一区二区在线观看| 成人午夜在线视频| 亚洲亚洲人成综合网络| 2023国产一二三区日本精品2022| av一区二区三区在线| 亚洲午夜在线电影| 久久女同精品一区二区| 色综合久久中文综合久久牛| 日韩不卡在线观看日韩不卡视频| 久久久91精品国产一区二区精品 | 国产午夜精品福利| 色综合久久综合网欧美综合网| 日韩专区一卡二卡| 亚洲国产精品精华液ab| 欧美精品日日鲁夜夜添| 岛国精品在线播放| 日韩电影免费一区| 中文字幕五月欧美| 精品粉嫩aⅴ一区二区三区四区| 不卡的av电影| 久久99久久99| 又紧又大又爽精品一区二区| 久久久久久久综合日本| 欧美日韩不卡一区| 99国产精品久久久久久久久久| 热久久国产精品| 一区二区三区在线观看动漫| 久久综合狠狠综合久久综合88| 日韩 欧美一区二区三区| 国产欧美日韩视频一区二区| 91精品国产色综合久久久蜜香臀| 不卡av在线免费观看| 国产一区二区三区在线看麻豆| 亚洲国产精品久久不卡毛片| 亚洲欧美中日韩| 日本一区二区三区视频视频| 欧美电影免费观看高清完整版在| 欧美三级日韩三级| 91视频www| 成人免费毛片app| 精品亚洲欧美一区| 免费美女久久99| 亚洲成a人片在线不卡一二三区| 亚洲天堂成人网| 国产精品国产三级国产普通话三级| 日韩免费高清电影| 91精品国产高清一区二区三区蜜臀 | 精品剧情v国产在线观看在线| 91麻豆国产香蕉久久精品| 国产成人鲁色资源国产91色综| 久久99精品久久久久婷婷| 青青国产91久久久久久| 日韩综合在线视频| 午夜国产不卡在线观看视频| 亚洲一区视频在线观看视频| 亚洲欧美视频在线观看视频| 国产精品短视频| 综合久久给合久久狠狠狠97色| 国产精品久久精品日日| 国产精品久久国产精麻豆99网站 | 色综合色综合色综合| 91亚洲永久精品| 日本电影欧美片| 在线观看日产精品| 欧美视频一区二区三区在线观看| 色综合中文字幕国产 | 色综合久久综合| 99精品久久99久久久久| 色综合久久综合中文综合网| 在线观看视频一区二区欧美日韩| 在线视频你懂得一区二区三区| 欧美日韩亚洲综合| 欧美日韩精品福利| 日韩欧美一二三区| 国产亚洲视频系列| 中文字幕第一页久久| 日韩码欧中文字| 亚洲一区二区在线观看视频| 亚洲h精品动漫在线观看| 日韩国产一区二| 国产在线不卡视频| 东方欧美亚洲色图在线| 99riav久久精品riav| 欧美人成免费网站| 久久久一区二区三区捆绑**| 亚洲欧美在线视频| 天天综合色天天| 国产成人亚洲综合a∨婷婷图片| 成人av手机在线观看| 欧美日韩一区三区四区| 精品剧情在线观看| 亚洲欧美日韩综合aⅴ视频| 午夜私人影院久久久久| 国产在线乱码一区二区三区| bt7086福利一区国产| 欧美人xxxx| 国产精品人成在线观看免费| 亚洲一区二区三区视频在线播放| 蜜桃视频第一区免费观看| 成人a免费在线看| 欧美精品在线观看一区二区| 久久久精品日韩欧美| 亚洲成人av一区二区三区| 国产乱码精品一区二区三区av | 欧美一区二区三区成人| 国产欧美1区2区3区| 亚洲成人先锋电影| 成人一级视频在线观看| 欧美日韩精品一区二区三区四区 | 26uuu久久天堂性欧美| 一区二区三区免费| 国产寡妇亲子伦一区二区| 欧美三级韩国三级日本三斤| 久久久精品黄色| 日韩成人精品在线观看| 日本大香伊一区二区三区| 久久久久久久免费视频了| 婷婷国产在线综合| 99久久99久久久精品齐齐| 日韩精品一区二区三区四区视频| 一区二区三区日韩精品| 国产伦精品一区二区三区免费迷 | 久久夜色精品国产噜噜av| 亚洲曰韩产成在线| 成人免费视频网站在线观看| 精品福利二区三区| 日韩精品午夜视频| 91成人免费在线| 中文字幕在线不卡视频| 国产一区二区看久久| 日韩午夜激情电影| 日韩精品一卡二卡三卡四卡无卡| 色综合咪咪久久| 亚洲人妖av一区二区| 成人午夜碰碰视频| 久久久噜噜噜久噜久久综合| 久久成人18免费观看| 欧美一区日本一区韩国一区| 亚洲一区二区综合| 色综合久久久久综合体桃花网| 欧美国产一区二区在线观看| 国产一区欧美一区| 久久免费精品国产久精品久久久久| 日韩av在线发布| 91麻豆精品国产无毒不卡在线观看| 亚洲图片有声小说| 欧美网站一区二区| 午夜伦欧美伦电影理论片| 欧美色倩网站大全免费| 亚洲不卡在线观看| 欧美日韩不卡在线| 日本欧美加勒比视频| 91麻豆精品国产91久久久久| 日韩精品欧美成人高清一区二区| 欧美日韩国产免费一区二区 | 国产精品欧美综合在线| 国产91精品欧美| 中文字幕不卡在线观看| 成人h动漫精品一区二| 日韩理论片一区二区| 色综合中文综合网| 亚洲成人1区2区| 欧美日韩在线三级| 日韩和欧美的一区| 欧美一区二区三区色| 韩国午夜理伦三级不卡影院| 国产亚洲一区二区三区| 成人av资源在线观看| 一区二区三区欧美亚洲| 91麻豆精品国产91| 九一九一国产精品| 中文幕一区二区三区久久蜜桃| 91网站最新网址| 香蕉乱码成人久久天堂爱免费| 日韩精品一区二区三区四区视频| 国产成人精品www牛牛影视| 国产精品福利av| 欧美日韩精品高清| 国产精品99久久久久久似苏梦涵| 国产精品免费视频观看| 欧美三区在线观看| 国产自产2019最新不卡| 一区二区三区四区国产精品| 日韩一级视频免费观看在线| 国产成人午夜99999| 亚洲综合男人的天堂| 精品精品国产高清a毛片牛牛 |