Chinaunix首页 | 论坛 | 博客
  • 博客访问: 513058
  • 博文数量: 92
  • 博客积分: 3146
  • 博客等级: 中校
  • 技术积分: 2314
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-27 10:20
文章分类

全部博文(92)

文章存档

2014年(3)

2013年(17)

2012年(16)

2011年(22)

2010年(34)

分类: 嵌入式

2010-11-15 18:36:49

 相信大家在前面弄了下会发现在开发板上还是不能播放文件,这里还得修改下内核:
 内核版本:2.6.12
编译器版本:arm-linux-gcc 3.4.1
1  修改/arch/arm/mach-s3c2410/devs.c
解决文件系统大于30M无法烧到板上的问题:
struct mtd_partition gec24xx_default_nand_part_b[] = {
 [0] = {
  .name = "Bootload",
  .size = 0x00030000,
  .offset = 0
 },
 [1] = {
  .name = "Kernel",
  .size = 0x001d0000,
  .offset = 0x00030000,
 },
 [2] = {
  .name = "RootFileSystem",
  .size = 0x03e00000,   
  .offset = 0x00200000,
 }
 
};
struct s3c2410_nand_set nandset ={
nr_partitions: 3 ,
partitions: gec24xx_default_nand_part_b,  //partition_info ,
};

2  修改/sound/oss/s3c2410-oss.c文件,解决mplayer无法使用oss播放音频
音频无法播放的原因及解决:
这个问题产生的根源最终追溯到音频的驱动部分。现在大部分的嵌入式板子都使用菲利普uda1341音频芯片,
因而也都使用了相同一个音频驱动,即MIZI 公司拥有版权的linux   uda1341音频驱动,这个驱动基本上符合了oss的规范,
但是当使用到多段DMA音频数据传输时,出现了一个问题,即DMA缓冲的建立发生在第一次调用write()函数
将音频数据传送到设备描述符的时候,然而oss驱动的调用者通常要在打开音频设备描述时候,就期望获取DMA缓冲的信息,
然而因为缓冲尚未建立,因而返回缓冲大小为0这个结果。 
  
      解决的办法是在音频驱动源码的smdk2410_audio_open()函数体,加上如下一段代码, 
  
  if   (!output_stream   .buffers   &&   audio_setup_buf(&output_stream))    
                                      return   -ENOMEM; 
  
  添加的位置具体见以下代码的粗体部分:    
  
  static   int   smdk2410_audio_open(struct   inode   *inode,   struct   file   *file)    
  {    
                int   cold   =   !audio_active;   
  
                DPRINTK("audio_open\n");    
  
                if   ((file->f_flags   &   O_ACCMODE)   ==   O_RDONLY)   { 
  
                              if   (audio_rd_refcount   ||   audio_wr_refcount) 
  
                                            return   -EBUSY; 
  
                              audio_rd_refcount++; 
  
                }   else   if   ((file->f_flags   &   O_ACCMODE)   ==   O_WRONLY)   { 
  
                              if   (audio_wr_refcount) 
  
                                            return   -EBUSY; 
  
                              audio_wr_refcount++; 
  
                }   else   if   ((file->f_flags   &   O_ACCMODE)   ==   O_RDWR)   { 
  
                              if   (audio_rd_refcount   ||   audio_wr_refcount) 
  
                                            return   -EBUSY; 
  
                              audio_rd_refcount++; 
  
                              audio_wr_refcount++; 
  
                }   else 
  
                              return   -EINVAL;    
  
              if   (cold)   { 
  
                              audio_rate   =   AUDIO_RATE_DEFAULT; 
  
                              audio_channels   =   AUDIO_CHANNELS_DEFAULT; 
  
                              audio_fragsize   =   AUDIO_FRAGSIZE_DEFAULT; 
  
                              audio_nbfrags   =   AUDIO_NBFRAGS_DEFAULT; 
  
                              if   ((file->f_mode   &   FMODE_WRITE)){ 
  
                                                          init_s3c2410_iis_bus_tx(); 
  
                                                          audio_clear_buf(&output_stream); 
  
                                //   加上以下这行代码       
                                if   (!output_stream   .buffers   &&   audio_setup_buf(&output_stream))    
                                      return   -ENOMEM;    
                              } 
  
                              if   ((file->f_mode   &   FMODE_READ)){ 
  
                                                          init_s3c2410_iis_bus_rx(); 
  
                                                          audio_clear_buf(&input_stream); 
  
                              } 
  
                }    
  
                MOD_INC_USE_COUNT; 
  
                return   0; 
  
  }    
  
  改完驱动后,重新编译内核。  
  重新烧下zImage吧,相信大家照这样下来基本上都能播放文件了。  
阅读(1205) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-02 20:30:55

请问smdk2410_audio_open()函数是在哪个文件里面?