hi,

thank you for your quick and insightful response. this is the most 
sophisticated question i’ve been asked in terms of interfacing code with 
hardware (it’s “my first driver’).

i am not certain this sound card (Xonar HDAV1.3 Deluxe) has a single clock 
because it has multiple DMA engines.

from what i can gather, it may be a single clock for a few of the engines (an 
SPI clock) but each engine may be (is) using different periods.

but for sure there is a separate “sampling clock" for the SPDIF.

can we attach images on a mailing list? probably not, right?

at the end of this message, i’ve included relevant portions from the 
specification.
        - i believe the term ‘codec’ is equivalent to streams. i have a maximum 
of 6 IOAudioStream objects, which corresponds to the codecs 0-5. 
                -not all cards have six engines. it’s a family of cards that 
use a different combination of these six.

man there has to be a way to do this. 

SPI (Serial Port Interface) Bus Control Registers

PCI 98: SPI Control Register Address Offset: 98h
Default Value: 00h

Bit

Attribute

Description

7

R/W

SPI CEN control
0: codec latch control data at SPI clock low (default) 1: codec latch control 
data at SPI clock high

6:4

R/W

Codec select
000: codec 0 (XSPI_CEN0) 001: codec 1 (XSPI_CEN1) 010: codec 2 (XSPI_CEN2) 011: 
codec 3 (XSPI_CEN3)

100: codec 4 (XSPI_CEN4) 101: codec 5 (XSPI_CEN5) others: no use

3:2

R/W

SPI clock period 00: 160 ns 01: 320 ns 10: 640 ns

11: 1280 ns (1.28 micro-second)

1

R/W

The data length of read/write, 0: 2 bytes (D6-D7), 1: 3 bytes (D6-D8)

0

R/W

Write 1 to trigger read/write operation, After read/write operation completes, 
the bit will be cleared to 0 automatically. 


and

PCI 70: SPDIF Function Control Register Address Offset: 70-73h
Default Value: 02000000h

High Performance PCI Audio Controller CMI8788/CMI8787 Register Specification 
V.0.1

Bit

Attribute

Description

31:27

Reserved.

26:24

R/W

SPDIF/OUT Sampling Rate (all support)

SPDOSR[2:0]

000 : 001 : 010 : 011 : 100 : 101 : 110 : 111 :

32 Khz 44.1 Khz 48 Khz 64 Khz 88.2 Khz 96 Khz 176.4 Khz 192 Khz

23:17

Reserved.

16

R/W

SPDIF/IN Sampling clock

1: >96khz 0: <=96khz

15

R/W/C

RATE_INT, SPDIN smp rate change interrupt. Write 1 to clear

14

R/W/C

LOCK_INT, Interrupt of SPDIN data is locked or not. Write 1 to clear

13

R/W/C

SENSE_INT, Interrupt of SPDIN data is sensed or not. Write 1 to clear.

12

Read only

LOCK_STUS, indicate SPDIN data is locked or not

11

Read only

SENSE_STUS, indicate there is transition in SPDIN

10

R/W

LOCK_PAR, LOCK_INTR trigger level 0: low to high, 1: high to low

9

R/W

SENSE_PAR, SENSE_INTR trigger level 0: low to high; 1: high to low

7-8

Reserved

6

R/W

SPDVALID, SPDIF/IN valid bit detect enabled.

5

R/W

RATE_MASK, 1: RATE_INT is un-masked

4

R/W

LOCK_MASK, 1: LOCK_INT is un-masked

3

R/W

SENSE_MASK, 1: SENSE_INT is un-masked

2

R/W

SPDFLOOPI, internal SPDIF/IN loopback to SPDIF/OUT

1

R/W

ENSPDOUT, enable SPDIF/OUT to I/O Interface

0

-


Reserved


btw i do think the panic was caused by having an empty getCurrentSampleFrame 
since, 0x08 is the address (on the device) where the driver writes the 
IOBufferMemoryDescriptor’s physical address:
> 
> Anonymous UUID:       9DD1C300-68BB-0152-2C74-E8415A6CC86C
> 
> Wed Dec 21 16:06:45 2022
> 
> *** Panic Report ***
> panic(cpu 0 caller 0xffffff801bcdab9d): Kernel trap at 0xffffff801c2200c5, 
> type 14=page fault, registers:
> CR0: 0x000000008001003b, CR2: 0x0000000000000008, CR3: 0x000000002253f000, 
> CR4: 0x00000000000226e0
> RAX: 0x0000000000000000, RBX: 0xffffff818d9b22e0, RCX: 0x0000000024000000, 
> RDX: 0xffffff8110f18900
> RSP: 0xffffff8e20a1bce0, RBP: 0xffffff8e20a1bd30, RSI: 0xffffff818d9b22e0, 
> RDI: 0x0000000000000000
> R8:  0xffffff81927a10c0, R9:  0x0000000000000000, R10: 0x0000000000000002, 
> R11: 0x0000000000000000
> R12: 0xffffff81c8245140, R13: 0xffffff81c8245140, R14: 0x0000000000000001, 
> R15: 0xffffff8110f18900
> RFL: 0x0000000000010206, RIP: 0xffffff801c2200c5, CS:  0x0000000000000008, 
> SS:  0x0000000000000010
> Fault CR2: 0x0000000000000008, Error code: 0x0000000000000000, Fault CPU: 
> 0x0, PL: 0, VF: 1
> 
> Backtrace (CPU 0), Frame : Return Address
> 0xffffff8e20a1b7b0 : 0xffffff801bbad5cd 
> 0xffffff8e20a1b800 : 0xffffff801bce9245 
> 0xffffff8e20a1b840 : 0xffffff801bcda97a 
> 0xffffff8e20a1b8b0 : 0xffffff801bb5a9d0 
> 0xffffff8e20a1b8d0 : 0xffffff801bbacfe7 
> 0xffffff8e20a1b9f0 : 0xffffff801bbace33 
> 0xffffff8e20a1ba60 : 0xffffff801bcdab9d 
> 0xffffff8e20a1bbd0 : 0xffffff801bb5a9d0 
> 0xffffff8e20a1bbf0 : 0xffffff801c2200c5 
> 0xffffff8e20a1bd30 : 0xffffff801c2267f7 
> 0xffffff8e20a1bd80 : 0xffffff7f9d0a43d3 
> 0xffffff8e20a1bdb0 : 0xffffff7fa1b5b658 
> 0xffffff8e20a1bdd0 : 0xffffff7fa1b5b321 
> 0xffffff8e20a1be00 : 0xffffff7f9d0a2fd2 
> 0xffffff8e20a1be40 : 0xffffff801c22df6b 
> 0xffffff8e20a1be80 : 0xffffff801c22dc25 
> 0xffffff8e20a1bf00 : 0xffffff801c22d1e7 
> 0xffffff8e20a1bf50 : 0xffffff801c22ecd6 
> 0xffffff8e20a1bfa0 : 0xffffff801bb5a0ce 
>       Kernel Extensions in backtrace:
>          
> com.apple.iokit.IOAudioFamily(206.5)[F5DBFDB4-22C9-32C1-BB72-3372EAAB1FCB]@0xffffff7f9d09f000->0xffffff7f9d0ddfff
>             dependency: 
> com.apple.vecLib.kext(1.2.0)[3B4888B9-CBFC-39DE-A8A2-1C6377702BC3]@0xffffff7f9cfcf000
>          
> com.CMedia.CMI8788.PCIAudioDriver(1337.0)[911B90EB-E9A8-32ED-BE28-B51438A69824]@0xffffff7fa1b58000->0xffffff7fa1c09fff
>             dependency: 
> com.apple.iokit.IOPCIFamily(2.9)[CE5E5806-48AB-39C0-8C1F-B57921B37D71]@0xffffff7f9c492000
>             dependency: 
> com.apple.iokit.IOAudioFamily(206.5)[F5DBFDB4-22C9-32C1-BB72-3372EAAB1FCB]@0xffffff7f9d09f000
>             dependency: 
> com.apple.kec.pthread(1)[6C7628FE-2621-3C19-B248-D4DA0D722123]@0xffffff7f9cb26000
> 
> BSD process name corresponding to current thread: kernel_task
> Boot args: agdpmod=pikera enable-gva-support shikigva=80 unfairgva=1 mbasd=1 
> -no_compat_check no32exec=0 debug=0x8 serverperfmode=1 ncl=262144
> 


> On Dec 21, 2022, at 5:20 PM, Devin Roth <[email protected]> wrote:
> 
> I assume all your streams use the same clock. In that case it will be the 
> same for all of them. I’m pretty sure that clocks run at the device level 
> rather than the stream level. 
> 
> Devin
> On Dec 21, 2022, 3:56 PM -0800, Gagan Sidhu via Coreaudio-api 
> <[email protected]>, wrote:
>> hello all,
>> 
>> so the driver completes inithardware, the streams are ready to go, but it’s 
>> panicking and there’s no printf to show where.
>> 
>> 1. is it possible/likely it’s crashing because i have an empty 
>> getCurrentSampleFrame method?
>> -probably?
>> 
>> 2. the engine is asking me to return a single UInt32 value. what if i have 
>> multiple streams, though?
>> -we would want to update the position of each active stream, would we not?
>> -this would require one UInt32 per stream.
>> 
>> this is done in the ALSA driver as follows:
>> 
>>> static snd_pcm_uframes_t oxygen_pointer(struct snd_pcm_substream *substream)
>>> {
>>> struct oxygen *chip = snd_pcm_substream_chip(substream);
>>> struct snd_pcm_runtime *runtime = substream->runtime;
>>> unsigned int channel = oxygen_substream_channel(substream);
>>> u32 curr_addr;
>>> 
>>> /* no spinlock, this read should be atomic */
>>> curr_addr = oxygen_read32(chip, channel_base_registers[channel]);
>>> return bytes_to_frames(runtime, curr_addr - (u32)runtime->dma_addr);
>>> }
>>> 
>> 
>> it seems ALSA passes the stream to the function and then it can be updated 
>> easily.
>> 
>> in the APPUL case, it does not seem like we know what stream we’re being 
>> asked to update. there are no parameters being passed.
>> 
>> in short: how can we update the position of multiple streams using the 
>> existing getCurrentSampleFrame prototype?
>> 
>> so close to getting this bad boy going (i think)!!
>> 
>> Thanks,
>> Gagan
>> 
>> _______________________________________________
>> Do not post admin requests to the list. They will be ignored.
>> Coreaudio-api mailing list ([email protected])
>> Help/Unsubscribe/Update your Subscription:
>> https://lists.apple.com/mailman/options/coreaudio-api/devinroth%40existential.audio
>> 
>> This email sent to [email protected]

 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Coreaudio-api mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/coreaudio-api/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to