2-in, 8-out DSP platform using the Raspberry Pi + HATs

My board is v1.2 and has the SupTronics logo on it... so I guess it's just resold.

Currently I am struggling a little. I am using latest raspbian (buster). I grabbed the kernel code from the rpi kernel repos but did not modify it since the channels_max is already 8. I will add S24_3LE support later once I can get 8 channels working. I did compile the newer kernel and boot from that (which you'll see in uname output).

Code:
pi@raspberrypi:~ $ uname -r
5.4.65-v7l+
pi@raspberrypi:~ $ aplay -l
**** List of PLAYBACK Hardware Devices ****
card 0: b1 [bcm2835 HDMI 1], device 0: bcm2835 HDMI 1 [bcm2835 HDMI 1]
  Subdevices: 4/4
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
card 1: Headphones [bcm2835 Headphones], device 0: bcm2835 Headphones [bcm2835 Headphones]
  Subdevices: 4/4
  Subdevice #0: subdevice #0
  Subdevice #1: subdevice #1
  Subdevice #2: subdevice #2
  Subdevice #3: subdevice #3
pi@raspberrypi:~ $ aplay -D hw:0,0,0 -d1 --dump-hw-param /dev/zero
Playing raw data '/dev/zero' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "hw:0,0":
--------------------
ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT:  U8 S16_LE
SUBFORMAT:  STD
SAMPLE_BITS: [8 16]
FRAME_BITS: [8 32]
CHANNELS: [1 2]
RATE: [8000 192000]
PERIOD_TIME: [10000 16384000]
PERIOD_SIZE: [256 131072]
PERIOD_BYTES: [1024 131072]
PERIODS: [1 128]
BUFFER_TIME: (1333 16384000]
BUFFER_SIZE: [256 131072]
BUFFER_BYTES: [1024 131072]
TICK_TIME: ALL
--------------------
pi@raspberrypi:~ $ cat /etc/asound.conf
cat: /etc/asound.conf: No such file or directory
pi@raspberrypi:/boot $ grep hdmi config.txt
#hdmi_safe=1
# uncomment if hdmi display is not detected and composite is being output
hdmi_force_hotplug=1
hdmi_group=1
hdmi_mode=1
hdmi_drive=2
#config_hdmi_boost=4

aplay --dump-hw-param for hw:0,0,1 hw:0,0,2 and hw:0,0,3 gives the same output.

speaker-test in 2-channel mode does give me output on the first stereo jack. 8-channel mode throws "channel count not available"

BTW If you get sick of hearing pink noise, use the -t wav option in speaker-test.
 
Last edited:
I seem to recall that the way the computer (the Pi in this case) knows the capabilities of whatever is connected to its HDMI port is via the EDID info. This data is read at bootup, possibly only at bootup. Was the Suptronics HAT installed or connected to the Pi at that time, or did you add it after bootup?

If that is not the cause, you can try to play around with various EDID setting via the config.txt file. Lots of info here:
Video options in config.txt - Raspberry Pi Documentation

For instance one of these might help to solve the problem:
Code:
hdmi_force_edid_audio=1
"Setting hdmi_force_edid_audio to 1 pretends that all audio formats are supported by the display, allowing passthrough of DTS/AC3 even when this is not reported as supported."
Code:
hdmi_ignore_edid=0xa5000080
"Setting hdmi_ignore_edid to 0xa5000080 enables the ignoring of EDID/display data if your display does not have an accurate EDID. It requires this unusual value to ensure that it is not triggered accidentally."

Also, if you are using a DVI monitor with an adapter this will cause some problems. In that case, try:
"In some rare cases, it is necessary to edit config.txt to force HDMI mode (as opposed to DVI mode, which does not send sound). You can do this by editing /boot/config.txt and setting hdmi_drive=2, then rebooting for the change to take effect."

These are just some shots in the dark. Let us know what happens and if you find a fix.
 
It doesn't seem to be the problem.

Code:
pi@raspberrypi:~ $ tvservice -d edid.bin
Written 256 bytes to edid.bin
pi@raspberrypi:~ $ edidparser edid.bin 
Enabling fuzzy format match...
Parsing edid.bin...
HDMI:EDID version 1.3, 1 extensions, screen size 16x9 cm
HDMI:EDID features - videodef 0x80 !standby !suspend !active off; colour encoding:RGB444|YCbCr422; sRGB is not default colourspace; preferred format is native; does not support GTF
HDMI:EDID found monitor name descriptor tag 0xfc
HDMI:EDID monitor name is SAMSUNG
HDMI:EDID found monitor range descriptor tag 0xfd
HDMI:EDID monitor range offsets: V min=0, V max=0, H min=0, H max=0
HDMI:EDID monitor range: vertical is 24-60 Hz, horizontal is 26-68 kHz, max pixel clock is 230 MHz
HDMI:EDID monitor range does not support GTF
HDMI:EDID found preferred CEA detail timing format: 1280x720p @ 60 Hz (4)
HDMI:EDID found CEA detail timing format: 1280x720p @ 50 Hz (19)
HDMI:EDID established timing I/II bytes are 21 08 00
HDMI:EDID found DMT format: code 4, 640x480p @ 60 Hz in established timing I/II
HDMI:EDID found DMT format: code 9, 800x600p @ 60 Hz in established timing I/II
HDMI:EDID found DMT format: code 16, 1024x768p @ 60 Hz in established timing I/II
HDMI:EDID standard timings block x 8: 0x0101 0101 0101 0101 0101 0101 0101 0101 
HDMI:EDID parsing v3 CEA extension 0
HDMI:EDID monitor support - underscan IT formats:no, basic audio:yes, yuv444:yes, yuv422:yes, #native DTD:1
HDMI:EDID found CEA detail timing format: 1280x720p @ 60 Hz (4)
HDMI:EDID found CEA detail timing format: 1280x720p @ 50 Hz (19)
HDMI:EDID found CEA detail timing format: 1920x1080i @ 60 Hz (5)
HDMI:EDID found CEA detail timing format: 1920x1080i @ 50 Hz (20)
HDMI:EDID found CEA format: code 4, 1280x720p @ 60Hz (native)
HDMI:EDID found CEA format: code 19, 1280x720p @ 50Hz 
HDMI:EDID found CEA format: code 5, 1920x1080i @ 60Hz 
HDMI:EDID found CEA format: code 20, 1920x1080i @ 50Hz 
HDMI:EDID found CEA format: code 3, 720x480p @ 60Hz 
HDMI:EDID found CEA format: code 18, 720x576p @ 50Hz 
HDMI:EDID found CEA format: code 16, 1920x1080p @ 60Hz 
HDMI:EDID found CEA format: code 31, 1920x1080p @ 50Hz 
HDMI:EDID found CEA format: code 32, 1920x1080p @ 24Hz 
HDMI:EDID found CEA format: code 33, 1920x1080p @ 25Hz 
HDMI:EDID found CEA format: code 34, 1920x1080p @ 30Hz 
HDMI:EDID found audio format 2 channels PCM, sample rate: 32|44|48|88 kHz, sample size: 16|20|24 bits
HDMI:EDID found audio format 8 channels PCM, sample rate: 32|44|48|88|96|176|192 kHz, sample size: 16|20|24 bits
HDMI:EDID found audio format 6 channels AC3, sample rate: 32|44|48 kHz, bitrate: 640 kbps
HDMI:EDID found audio format 7 channels DTS, sample rate: 44|48 kHz, bitrate: 1536 kbps
HDMI:EDID found audio format 8 channels Dobly Digital+, sample rate: 44|48 kHz, codec define: 1
HDMI:EDID found audio format 8 channels DTS-HD, sample rate: 32|44|48|88|96|176|192 kHz, codec define: 1
HDMI:EDID found audio format 8 channels MLP, sample rate: 32|44|48|88|96|176|192 kHz, codec define: 1
HDMI:EDID found HDMI VSDB length 7
HDMI:EDID HDMI VSDB has physical address 3.1.0.0
HDMI:EDID HDMI VSDB supports AI:yes, dual link DVI:no
HDMI:EDID HDMI VSDB deep colour support - 48-bit:no 36-bit:yes 30-bit:no DC_yuv444:yes
HDMI:EDID HDMI VSDB max TMDS clock 225 MHz
HDMI:EDID HDMI VSDB has no latency information
HDMI:EDID found Video Capability DB length 2
HDMI:EDID video capability: CE:3 IT:3 PT:0 QS:0
HDMI:EDID adding mandatory support for CEA (1) 640x480p @ 60Hz
HDMI:EDID adding mandatory support for CEA (2) 720x480p @ 60Hz
HDMI:EDID adding mandatory support for CEA (17) 720x576p @ 50Hz
HDMI:EDID filtering formats with pixel clock unlimited MHz or h. blanking unlimited
HDMI:EDID best score mode initialised to CEA (1) 640x480p @ 60 Hz with pixel clock 25 MHz (score 0)
HDMI:EDID best score mode is now CEA (1) 640x480p @ 60 Hz with pixel clock 25 MHz (score 61864)
HDMI:EDID best score mode is now CEA (2) 720x480p @ 60 Hz with pixel clock 27 MHz (score 66472)
HDMI:EDID CEA mode (3) 720x480p @ 60 Hz with pixel clock 27 MHz has a score of 66472
HDMI:EDID best score mode is now CEA (4) 1280x720p @ 60 Hz with pixel clock 74 MHz (score 5190888)
HDMI:EDID DMT mode (4) 640x480p @ 60 Hz with pixel clock 25 MHz has a score of 18432
HDMI:EDID CEA mode (5) 1920x1080i @ 60 Hz with pixel clock 74 MHz has a score of 3273832
HDMI:EDID DMT mode (9) 800x600p @ 60 Hz with pixel clock 40 MHz has a score of 28800
HDMI:EDID CEA mode (16) 1920x1080p @ 60 Hz with pixel clock 148 MHz has a score of 273832
HDMI:EDID DMT mode (16) 1024x768p @ 60 Hz with pixel clock 65 MHz has a score of 47185
HDMI:EDID CEA mode (17) 720x576p @ 50 Hz with pixel clock 27 MHz has a score of 66472
HDMI:EDID CEA mode (18) 720x576p @ 50 Hz with pixel clock 27 MHz has a score of 66472
HDMI:EDID CEA mode (19) 1280x720p @ 50 Hz with pixel clock 74 MHz has a score of 4617160
HDMI:EDID CEA mode (20) 1920x1080i @ 50 Hz with pixel clock 74 MHz has a score of 2732360
HDMI:EDID CEA mode (31) 1920x1080p @ 50 Hz with pixel clock 148 MHz has a score of 232360
HDMI:EDID CEA mode (32) 1920x1080p @ 24 Hz with pixel clock 74 MHz has a score of 124532
HDMI:EDID CEA mode (33) 1920x1080p @ 25 Hz with pixel clock 74 MHz has a score of 128680
HDMI:EDID CEA mode (34) 1920x1080p @ 30 Hz with pixel clock 74 MHz has a score of 149416
HDMI0:EDID preferred mode remained as CEA (4) 1280x720p @ 60 Hz with pixel clock 74 MHz
HDMI:EDID has HDMI support and audio support
edidparser exited with code 0

Has anybody actually had this board working with Pi4B?

I was able to use the multi ALSA plugin create a PCM that combines the 4 ALSA sub-devices, but when playing an 8channel WAV, everything came out on channels 1 and 2. Very weird. Still not convinced I haven't made a mistake in routing the channels.

I may just buy a 3B and keep the 4 for other projects, as I want to build this into a box with 8 channels of amplification as well.
 
It doesn't seem to be the problem.

Has anybody actually had this board working with Pi4B?

I was able to use the multi ALSA plugin create a PCM that combines the 4 ALSA sub-devices, but when playing an 8channel WAV, everything came out on channels 1 and 2. Very weird. Still not convinced I haven't made a mistake in routing the channels.

I may just buy a 3B and keep the 4 for other projects, as I want to build this into a box with 8 channels of amplification as well.

I doubt that the problem lies with the hardware (the Pi 4) or that buying a 3B will change anything. From the output that you provided and that I have copied below, the Raspbian customized kernel seems to be configured so that only 2 channels can be played to the HDMI output. You will need to modify and rebuild the kernel, similar to what I outlined in post 3 of this thread. Since the SOC has changed and the kernel more recent, the files will likely be in slightly differently named directories and have different names, e.g. bcm2835-pcm.c is likely now called bcm2711-pcm.c, etc.

Do you think you will be able to get the linux headers and then track down the files yourself?

Code:
pi@raspberrypi:~ $ aplay -D hw:0,0,0 -d1 --dump-hw-param /dev/zero
Playing raw data '/dev/zero' : Unsigned 8 bit, Rate 8000 Hz, Mono
HW Params of device "hw:0,0":
--------------------
ACCESS:  MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT:  U8 S16_LE
SUBFORMAT:  STD
SAMPLE_BITS: [8 16]
FRAME_BITS: [8 32]
CHANNELS: [1 2]     [B][COLOR="Red"]<---------- LOOK HERE ! ONLY 2 CHANNELS MAXIMUM.[/COLOR][/B]
RATE: [8000 192000]
PERIOD_TIME: [10000 16384000]
PERIOD_SIZE: [256 131072]
PERIOD_BYTES: [1024 131072]
PERIODS: [1 128]
BUFFER_TIME: (1333 16384000]
BUFFER_SIZE: [256 131072]
BUFFER_BYTES: [1024 131072]
TICK_TIME: ALL
--------------------

This is a guess, but another potentially faster way around the problem may be to flash the Ubuntu server image to an SD card, then install ALSA. I recall that the Ubuntu kernel for the Pi didn't have the 2 channel limitation, but that was a year or two ago with 18.04 and now there is 20.04. You will not get a GUI desktop, however, if you were planning on building this into a box and running headless that won't really matter.
 
Last edited:
The kernel I’m using has the mod described already... the max_channels for the bcm2835 structure with spdif in the name is set to 8. However the structure without spdif in the name is still at 2. It doesn’t make sense to me why you were changing the spdif one since spdif is not being used as far as I can see, but i figured you know better than me. At one point I did try changing the non-spdif struct and it does change the 2 you’ve indicated to 8. It didn’t seem to help but let me try it again.
There are stacks of people having trouble with HDMI on pi4 because of the fact there is two HDMI ports. So I get that in theory it should work, but you never know for sure until it is tested - especially with hardware.
Even the fact that the pi 4 seems to be using the non-spdif struct to configure the audio indicates differences.
 
The kernel I’m using has the mod described already... the max_channels for the bcm2835 structure with spdif in the name is set to 8. However the structure without spdif in the name is still at 2. It doesn’t make sense to me why you were changing the spdif one since spdif is not being used as far as I can see, but i figured you know better than me. At one point I did try changing the non-spdif struct and it does change the 2 you’ve indicated to 8. It didn’t seem to help but let me try it again.
There are stacks of people having trouble with HDMI on pi4 because of the fact there is two HDMI ports. So I get that in theory it should work, but you never know for sure until it is tested - especially with hardware.
Even the fact that the pi 4 seems to be using the non-spdif struct to configure the audio indicates differences.

You might have outted your issue right there. The Raspbian OS can work on all of the Pi models, but each of them has a different version of the Broadcom system on a chip (SOC). You modified the file that is intended for use with the Pi 3, which uses the BCM2835 SOC, but you have a Pi 4. The Pi 4 uses a different SOC, the BCM2711. This means that the file that will actually be used for your Pi is located in another directory and you modified the wrong file.

Sorry, but at the time I wrote the instruction the Pi 4 had not yet been released!

Can you check on that?

Since the HDMI analog audio extractor HAT is again available, I probably should create some new instructions for Pi 4 users.
 
Last edited:
Yeah I think the pi4 still uses the bcm2835. The bcm2711 replaces the bcm2709 SoC used in the pi3.
And yes, I realise that the pi4 wasn’t released back then, I just wanted to see if this board has actually ever been shown to work with it :)
I will keep trying for a little while and then see if I can borrow a pi3 from someone. The pi4 is my first Pi (although I have used Linux for 20 years).
Edit - sorry the chip names are confusing with package vs chip. You are right that the bcm2835 is not used, but it is probably more complicated since as I said, modifying the non-spdif struct does up the channel count. I will post aplay output showing this.
 
Last edited:
Yeah I think the pi4 still uses the bcm2835.

Um, no it doesn't!

From here:
FAQs - Raspberry Pi Documentation

Why does cpuinfo report I have a BCM2835?

The upstream Linux kernel developers had decided that all models of Raspberry Pi return bcm2835 as the SoC name. At Raspberry Pi we like to use as much upstream kernel code as possible, as it makes software maintenance much easier, so we use this code. Unfortunately it means that cat /proc/cpuinfo is inaccurate for the Raspberry Pi 2, Raspberry Pi 3 and Raspberry Pi 4, which use the bcm2836/bcm2837, bcm2837 and bcm2711 respectively. You can use cat /proc/device-tree/model to get an accurate description of the SoC on your Raspberry Pi model.
 
SUCCESS!

speaker-test -c8 -t wave -D hw:0,0,0
gives me output on all 8 channels exactly as shown on the vendor site.

lsmod shows a whole bunch of drivers with bcm2835 in the name, and the sound one is one of them (even though it controls the bcm2711 chip!) so we are still modifying the correct file. But the trick is, it's necessary to modify the 1st struct (without spdif in the name). Here is a diff showing my changes:

Code:
pi@raspberrypi:~/kernel-dev/linux $ git diff
diff --git a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
index e4603ba74..cae639133 100644
--- a/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
+++ b/drivers/staging/vc04_services/bcm2835-audio/bcm2835-pcm.c
@@ -18,10 +18,10 @@ static const struct snd_pcm_hardware snd_bcm2835_playback_hw = {
        .rate_min = 8000,
        .rate_max = 192000,
        .channels_min = 1,
-       .channels_max = 2,
-       .buffer_bytes_max = 128 * 1024,
+       .channels_max = 8,
+       .buffer_bytes_max = 512 * 1024,
        .period_bytes_min = 1 * 1024,
-       .period_bytes_max = 128 * 1024,
+       .period_bytes_max = 512 * 1024,
        .periods_min = 1,
        .periods_max = 128,
 };

It's also necessary to put the following in /boot/cmdline.txt - DO NOT add it as a new line, just add it on the end of what is there.

Code:
snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1 snd_bcm2835.enable_compat_alsa=0

To check you did it right, use the command "wc -l /boot/cmdline.txt" and you should get 1 (this tells you the number of lines in the file).

I currently have the following in /boot/config.txt but I will play around to see what is actually required:
Code:
# Definitely required
dtparam=audio=on

# Not sure if these ones are required
#dtoverlay=vc4-fkms-v3d -- commented out, it's on by default
hdmi_force_hotplug=1
hdmi_drive=2

Very happy now, thanks for all the hints... it really helps to have someone asking good questions!
 
I uncommented the dtoverlay=vc4-fkms-3d and commented out hdmi_force_hotplug=1 and hdmi_drive=2, and it still works (although, I don't have any display plugged in to the output on the card). I also removed the /boot/cmdline.txt stuff and it's still fine.

Tomorrow I will try a fresh OS install with just the kernel modifications.
 
Last edited:
@gordoste could you post an output of aplay -l after kernel patch?

Just got the 7.1ch board from the ebay vendor. It says x6000 v1.2 and has the SupTronics logo on it.

Hooked up to an old RPi 1B+ running Moode (RaspiOS Buster Lite 2020-05-27 (10.4)/Linux kernel 5.4.51 build #1325), enabled HDMI and have the same problem @gordoste.
Works but only two channels in aplay.
I also have a Pi4, will try on that tomorrow. I will have to patch the kernel as above, the non-spdif max_channels entry.

2 things:
1) the big chip on it runs damn hot. It nearly burnt me a finger... I'm considering to put a heatsink there. Also will not stack on top of the pi4, but will place side by side on a bigger case.
2) why do they call for a 4+amps power supply? a quick measurement says like 0.8A max (x6000 board + rpi1b + wifi usb dongle ). I will go with a 5V/5A on the pi4 just in case.
 
I don't have mine hooked up right now but I remember that it is showing 4 sub-devices under the bcm2835 ALSA device.

For the Pi lower than 4, I'm not exactly sure what's needed. It may be worth trying the same patch as I did - it's actually possible that the later kernel has stopped using the spdif struct.

Definitely get a heatsink on that chip. I have found that if you have the hat on top of the Pi, a normal 5V fan can cool both (currently I have heatsink of this card but nothing on the Pi). You can power this easily via GPIO (the holes on the side of the board are connected to these, despite not being labelled). I am awaiting a 40-pin connector so I can move this board to the side (like you) and put a case on the Pi as cooling. This will also allow me to expose the Pi USB ports on an enclosure, but keep the 4x3.5mm plugs internal and connect them to amplifier boards.

The Pi's official power supply is oversized so you can power peripherals via GPIO or USB. I suspect they just added 1A to the 2.5A Pi3 power supply recommendation and then rounded up.
 
ok I did it too and the 8 channels work, even on my Rpi1B+.
The kernel patch on the non spdif struct is definitely required, without that it only outputs to the first 2 channels .
speakertest & aplay are working and identical to yours, board named "b1", 4 subdevices etc.

about 24bits...
is it normal that while I play
pi@raspberrypi:~ $ aplay -f S24_LE 8_Channel_ID.wav
Warning: format is changed to S24_3LE
Playing WAVE '8_Channel_ID.wav' : Signed 24 bit Little Endian in 3bytes, Rate 48000 Hz, Channels 8

hw params shows 16bit?
pi@raspberrypi:~ $ cat /proc/asound/card0/pcm0p/sub0/hw_params
access: MMAP_INTERLEAVED
format: S16_LE
subformat: STD
channels: 8
rate: 48000 (48000/1)
period_size: 2048
buffer_size: 8192

Also ran alsa-capabilities and still shows 16bits max?
Code:
pi@raspberrypi:~ $ bash alsa-capabilities -s
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
1: `bcm2835 HDMI 1' Digital non-UAC audio output on device bcm2835 HDMI 1
    -hardware address:               hw:0,0  (or hw:b1,0)
    -device label:                   bcm2835 HDMI 1
    -sample rates per format:        U8: 384000, 352800, 192000, 176400, 96000, 88200, 48000, 44100
                                     S16_LE: 384000, 352800, 192000, 176400, 96000, 88200, 48000, 44100
    -usb audio class:                (n/a)
    -streamfile:                     (n/a)
    -character device:               /dev/snd/pcmC0D0p
    -monitor file:                   /proc/asound/card0/pcm0p/sub0/hw_params

pi@raspberrypi:~ $ aplay -D hw:0,0 -c 8 --dump-hw-params 8_Channel_ID.wav
Playing WAVE '8_Channel_ID.wav' : Signed 24 bit Little Endian in 3bytes, Rate 48000 Hz, Channels 8
HW Params of device "hw:0,0":
--------------------
ACCESS: MMAP_INTERLEAVED RW_INTERLEAVED
FORMAT: U8 S16_LE
SUBFORMAT: STD
SAMPLE_BITS: [8 16]
FRAME_BITS: [8 128]
CHANNELS: [1 8]
RATE: [8000 192000]
PERIOD_TIME: [10000 16384000]
PERIOD_SIZE: [80 131072]
PERIOD_BYTES: [1024 524288]
PERIODS: [1 128]
BUFFER_TIME: (416 16384000]
BUFFER_SIZE: [80 131072]
BUFFER_BYTES: [1024 131072]
TICK_TIME: ALL
--------------------
aplay: set_params:1339: Sample format non available
Available formats:
- U8
- S16_LE
 
Last edited:
Here :confused:

Code:
pi@raspberrypi:~ $ aplay -v -f S24_LE 8_Channel_ID.wav
Warning: format is changed to S24_3LE
Playing WAVE '8_Channel_ID.wav' : Signed 24 bit Little Endian in 3bytes, Rate 48000 Hz, Channels 8
Plug PCM: Linear conversion PCM (S16_LE)
Its setup is:
  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : S24_3LE
  subformat    : STD
  channels     : 8
  rate         : 48000
  exact rate   : 48000 (48000/1)
  msbits       : 24
  buffer_size  : 8192
  period_size  : 2048
  period_time  : 42666
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 2048
  period_event : 0
  start_threshold  : 8192
  stop_threshold   : 8192
  silence_threshold: 0
  silence_size : 0
  boundary     : 1073741824
Slave: Hardware PCM card 0 'bcm2835 HDMI 1' device 0 subdevice 0
Its setup is:
  stream       : PLAYBACK
  access       : MMAP_INTERLEAVED
  format       : S16_LE
  subformat    : STD
  channels     : 8
  rate         : 48000
  exact rate   : 48000 (48000/1)
  msbits       : 16
  buffer_size  : 8192
  period_size  : 2048
  period_time  : 42666
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 2048
  period_event : 0
  start_threshold  : 8192
  stop_threshold   : 8192
  silence_threshold: 0
  silence_size : 0
  boundary     : 1073741824
  appl_ptr     : 0
  hw_ptr       : 0
 
ok thank you, forgot to ramp up periods_max, and add the S24_3LE format
in driver source. Now it's happy :D

Code:
pi@raspberrypi:~ $ aplay -v -D hw:0,0 -f S24_LE 8_Channel_ID.wav
Warning: format is changed to S24_3LE
Playing WAVE '8_Channel_ID.wav' : Signed 24 bit Little Endian in 3bytes, Rate 48000 Hz, Channels 8
Hardware PCM card 0 'bcm2835 HDMI 1' device 0 subdevice 0
Its setup is:
  stream       : PLAYBACK
  access       : RW_INTERLEAVED
  format       : S24_3LE
  subformat    : STD
  channels     : 8
  rate         : 48000
  exact rate   : 48000 (48000/1)
  msbits       : 24
  buffer_size  : 5461
  period_size  : 1366
  period_time  : 28458
  tstamp_mode  : NONE
  tstamp_type  : MONOTONIC
  period_step  : 1
  avail_min    : 1366
  period_event : 0
  start_threshold  : 5461
  stop_threshold   : 5461
  silence_threshold: 0
  silence_size : 0
  boundary     : 1431568384
  appl_ptr     : 0
  hw_ptr       : 0

Code:
pi@raspberrypi:~ $ cat /proc/asound/card0/pcm0p/sub0/hw_params 
access: RW_INTERLEAVED
format: S24_3LE
subformat: STD
channels: 8
rate: 48000 (48000/1)
period_size: 1366
buffer_size: 5461

Code:
pi@raspberrypi:~ $ bash alsa-capabilities 
bash: warning: setlocale: LC_ALL: cannot change locale (en_US.UTF-8)
1: `bcm2835 HDMI 1' Digital non-UAC audio output on device bcm2835 HDMI 1
    -hardware address:               hw:0,0  (or hw:b1,0)
    -device label:                   bcm2835 HDMI 1
    -formats:                        S16_LE, S24_3LE
    -usb audio class:                (n/a)
    -streamfile:                     (n/a)
    -character device:               /dev/snd/pcmC0D0p
    -monitor file:                   /proc/asound/card0/pcm0p/sub0/hw_params