关于乌龟海岸CS4630 声卡在 ubuntu 13.04 一直警报,不能使用的问题的临时解决。(已找到解决方法了)

CPU/显卡/打印机/USB设备等硬件问题
回复
bangbu
帖子: 38
注册时间: 2011-01-15 0:49

关于乌龟海岸CS4630 声卡在 ubuntu 13.04 一直警报,不能使用的问题的临时解决。(已找到解决方法了)

#1

帖子 bangbu » 2013-05-05 10:00

之前发过该帖 viewtopic.php?f=171&t=416032 ,升级新内核,声卡就一直在警报了,不能使用,也给ubuntu 报了bug了 https://bugs.launchpad.net/ubuntu/+sour ... ug/1157525 ,无奈英语不会,最后把 ubuntu 12.04 装3.9内核,声卡是可以正常使用的,可这个3.9 内核,显卡都不能编译,日。
之后我把系统我升级 ubuntu 13.04 测试版 ,可一样警报。。。。装3.9内核也一样。。。。当时被气得不得了,一气之下删除ubuntu ,装lmde,装alsa-driver,临时回避声卡问题。
:em09 昨天又无聊,想装ubuntu 13.04 ,好吧,一直声卡警报,dmesg 输出错误 dsp_spos: SPIOWriteTask not respondingn 。。。。。。。。。
我下了 http://kernel.ubuntu.com/git?p=ubuntu/ubuntu-raring.git 源码,该声卡驱动 sound/pci/cs46xx 里暂时找找这个输出,
在 dsp_spos.c C源码文件,找到这个函数,大概是处理 SPDIF 的

a.png
我把下面几行删除掉了
b.png
b.png (10.2 KiB) 查看 2020 次

编译了下内核模块(修改了内核 Makefile 版本号,和运行的内核一致),把编译后的 snd-cs46xx.ko 替换 /lib/modules/`uname -r`/kernel/sound/pci/cs46xx 里的 snd-cs46xx.ko ,重启系统,终于不再警报了,打开audacious,动人的旋律从音响里播出。[/color]


上面的方法已经过时!!!最后解决的方法看 3 楼
上次由 bangbu 在 2013-05-05 22:07,总共编辑 3 次。
bangbu
帖子: 38
注册时间: 2011-01-15 0:49

Re: 关于乌龟海岸CS4630 声卡在 ubuntu 13.04 一直警报,不能使用的问题的临时解决。

#2

帖子 bangbu » 2013-05-05 10:02

:em01 再次找下好心人,把这个 bug 跟官方报告下,我英语渣得可以了。。。。。
bangbu
帖子: 38
注册时间: 2011-01-15 0:49

Re: 关于乌龟海岸CS4630 声卡在 ubuntu 13.04 一直警报,不能使用的问题的临时解决。

#3

帖子 bangbu » 2013-05-05 21:51

已经找到最终方法了!


:em05 1 楼的方法只是暂时的解决,声卡有部分功能是不能使用的,今天回到家,又继续看了下原cs46xx的源码,发现 dsp_spos.c 里 cs46xx_poke_via_dsp ,被调用的,均有加锁 mutex_lock(&chip->spos_mutex) 和解锁 mutex_unlock(&chip->spos_mutex) ,可以推测 cs46xx_poke_via_dsp 函数的调用是需要线程安全,多线程调用会发生混乱 ,接着发现 dsp_spos.c 里面 cs46xx_dsp_resume 函数调用 cs46xx_poke_via_dsp,并没加锁,调用 cs46xx_dsp_resume 函数的 cs46xx_lib.c里的 snd_cs46xx_resume 函数,也没有加锁,所以我对 dsp_spos.c 的 cs46xx_dsp_resume 函数锁了一下。

dsp_spos.c 函数 cs46xx_dsp_resume
更改前:

代码: 全选

int cs46xx_dsp_resume(struct snd_cs46xx * chip)
{
	struct dsp_spos_instance * ins = chip->dsp_spos_instance;

	int i, err;

	/* clear parameter, sample and code areas */
	snd_cs46xx_clear_BA1(chip, DSP_PARAMETER_BYTE_OFFSET,
			     DSP_PARAMETER_BYTE_SIZE);
	snd_cs46xx_clear_BA1(chip, DSP_SAMPLE_BYTE_OFFSET,
			     DSP_SAMPLE_BYTE_SIZE);
	snd_cs46xx_clear_BA1(chip, DSP_CODE_BYTE_OFFSET, DSP_CODE_BYTE_SIZE);
       省略这里的代码.....
	if (chip->dsp_spos_instance->spdif_status_in) {
		cs46xx_poke_via_dsp(chip, SP_ASER_COUNTDOWN, 0x80000005);
		cs46xx_poke_via_dsp(chip, SP_SPDIN_CONTROL, 0x800003ff);
	}
	return 0;
}
更改后

代码: 全选

int cs46xx_dsp_resume(struct snd_cs46xx * chip)
{
	struct dsp_spos_instance * ins = chip->dsp_spos_instance;
       mutex_lock(&chip->spos_mutex);
	int i, err;

	/* clear parameter, sample and code areas */
	snd_cs46xx_clear_BA1(chip, DSP_PARAMETER_BYTE_OFFSET,
			     DSP_PARAMETER_BYTE_SIZE);
	snd_cs46xx_clear_BA1(chip, DSP_SAMPLE_BYTE_OFFSET,
			     DSP_SAMPLE_BYTE_SIZE);
	snd_cs46xx_clear_BA1(chip, DSP_CODE_BYTE_OFFSET, DSP_CODE_BYTE_SIZE);
       省略这里的代码.....
	if (chip->dsp_spos_instance->spdif_status_in) {
		cs46xx_poke_via_dsp(chip, SP_ASER_COUNTDOWN, 0x80000005);
		cs46xx_poke_via_dsp(chip, SP_SPDIN_CONTROL, 0x800003ff);
	}
       mutex_unlock(&chip->spos_mutex);
	return 0;
}

重新编译该驱动,替换原先的驱动,声音正常,功能正常,推测是正确的! :em09 cs46xx 该bug终于解决了。
bangbu
帖子: 38
注册时间: 2011-01-15 0:49

Re: 关于乌龟海岸CS4630 声卡在 ubuntu 13.04 一直警报,不能使用的问题的临时解决。(已找到解决方法

#4

帖子 bangbu » 2013-05-09 17:42

关于如何编译 snd-cs46xx.ko 可以参考下下面的内容:
1.更新下系统,然后从这里下载内核源码 http://kernel.ubuntu.com/git?p=ubuntu/u ... git;a=tree (点击快照 snapshot 下载)
2.解压,然后cd 到内核源码目录,修改 Makefile 文件,比如内核版本号是 3.8.0-20-generic ,则修改为:

代码: 全选

VERSION = 3
PATCHLEVEL = 8
SUBLEVEL = 0
EXTRAVERSION = -20-generic
3.按照3楼的帖子修改代码然后执行下面的命令:

代码: 全选

cp /boot/config-`uname -r`  .config
cp /usr/src/linux-headers-`uname -r`/Module.symvers .
make oldconfig
make prepare
make outputmakefile
make archprepare
make modules SUBDIRS=scripts
make modules SUBDIRS=sound/pci/cs46xx
4.把 sound/pci/cs46xx 里面生成的 snd-cs46xx.ko 模块替换 /lib/modules/`uname -r`/kernel/sound/pci/cs46xx 下的 snd-cs46xx.ko。,然后重启。
bangbu
帖子: 38
注册时间: 2011-01-15 0:49

Re: 关于乌龟海岸CS4630 声卡在 ubuntu 13.04 一直警报,不能使用的问题的临时解决。(已找到解决方法

#5

帖子 bangbu » 2013-05-11 0:23

:em20 今天更新了系统,又一直警报 dedededededededededededededededededededededededededededededededede
回复