zx2000 HDMI audio

长见识了,zx2000 fpga验证HDMI audio 的时候,发现走的是intel PCI HDA audio架构。没见过arm芯片hdmi audio走这条路的。可能公司之前是做x86芯片的,PC上的HDMI audio好像都走intel的pci hda audio架构, 现成的IP,集成到arm芯片里就可以了。

调试过程中遇到三个问题:

1:zx2000没有pci控制器,需要增加一个假的pcie控制器代码。

2:sound/pci/hda/下面增加一个自己的patch文件。这是可以省略的。zx2000的代码根本没有执行到这个patch里面。

3: 播放音乐时,dma中断出不来,LPIB fifo里的数据为空。Chip->position_fix[0] 默认为POS_FIX_AUTO,代码里面实际起作用的都在POS_FIX_LPIB case,将Chip->position_fix[0] = POS_FIX_LPIB时,中断出来了,声音出来了。

Elite2000 HDA进入下面的判断时,会根据chip->position_fix = auto 而进入default,在default中拿到的pos0chip->position_fix被改成了posbuf。所以Elite2000 HDA audio实际上走的是POS_FIX_POSBUF模式。

zx2000 HDA进入上面的判断时,在default中拿到的pos = 0, chip->position_fix被改成了POS_FIX_LPIB,所以zx2000 HDA audio走的是POS_FIX_LPIB模式。

但是:

1 zx2000由默认的auto模式,通过上面的default改为POS_FIX_LPIB后,DMA中断就出不来了,无法播放音乐。
2:如果在开始初始化的时候,就将默认的auto改为POS_FIX_LPIBDMA中断就能正常出来,音乐播放正常。
从打印消息来看,12 少进了一次HDA中断。2在这次中断中获取的INTSTS寄存器的值为0x80000001:

2的打印:

1的打印:

进一步调试发现,在音乐播放之前的pcm_prepare阶段,我们的代码里有下面的操作:

如果将这段操作拿掉的话,上面1操作就不会丢失status=0x80000001的这次中断,后面的中断也会继续出来。DPLBASE寄存器描述如下,应该是和POS_FIX_POSBUF这个模式有关:

我做了一个实验,2这种情况下(初始化时采用POS_FIX_LPIB),pcm_prepareenable DPLBASE,播放音乐时,也会和1发生同样的情况,无DMA中断,无法播放音乐。
这里想问一下IC两个问题:

1:为什么enable DPLBASE后,POS_FIX_LPIB这种模式就用不了了?

我觉得这个的原因可以用来解释1为什么不能播放音乐。

2elite2000zx2000跑的是同样的代码,初始化时默认的都是POS_FIX_AUTO,而在上面第一幅图的default中,elite2000走的是POS_FIX_POSBUFzx2000由于拿到的pos=0而走了POS_FIX_LPIB。是什么原因导致了zx2000没有走POS_FIX_POSBUF这条通路(可能是由于丢了一次中断,为什么会丢这次中断?)。

 

人生处处有惊喜。五年前开始学习audio的时候,看了Takashi Iwai写的《how to writ a pci sound card》文档。后来在FSL调audio的时候,咨询过Takashi很多建议。现在调pci hda audio,这块的代码在社区的维护者就是Takashi。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值