diff --git a/tools/tune/common/sof_ucm_blob_write.m b/tools/tune/common/sof_ucm_blob_write.m new file mode 100644 index 000000000..0a6c4da44 --- /dev/null +++ b/tools/tune/common/sof_ucm_blob_write.m @@ -0,0 +1,52 @@ +function sof_ucm_blob_write(fn, blob8) + +% Export blob to UCM2 cset-tlv binary format +% +% sof_ucm_blob_write(fn, blob) +% +% Input parameters +% fn - Filename for the blob +% blob - Vector of data with uint8 type +% + +% SPDX-License-Identifier: BSD-3-Clause +% +% Copyright (c) 2024, Intel Corporation. All rights reserved. + +% Export for UCM cset-tlv with additional 8 bytes header +SOF_CTRL_CMD_BINARY = 3; +nh = 8; +nb = length(blob8); +ublob8 = zeros(nb + nh, 1, 'uint8'); +ublob8(1:4) = w32b(SOF_CTRL_CMD_BINARY); +ublob8(5:8) = w32b(nb); +ublob8(9:end) = blob8; + +%% Write blob +check_create_dir(fn); +fh = fopen(fn, 'wb'); +fwrite(fh, ublob8, 'uint8'); +fclose(fh); + +%% Print as 8 bit hex +nb = length(ublob8); +nl = ceil(nb/16); +for i = 1:nl + m = min(16, nb-(i-1)*16); + for j = 1:m + fprintf(1, "%02x ", ublob8((i-1)*16 + j)); + end + fprintf(1, "\n"); +end + +fprintf(1, "\n"); +end + +function bytes = w32b(word) +sh = [0 -8 -16 -24]; +bytes = uint8(zeros(1,4)); +bytes(1) = bitand(bitshift(word, sh(1)), 255); +bytes(2) = bitand(bitshift(word, sh(2)), 255); +bytes(3) = bitand(bitshift(word, sh(3)), 255); +bytes(4) = bitand(bitshift(word, sh(4)), 255); +end diff --git a/tools/tune/crossover/example_crossover.m b/tools/tune/crossover/example_crossover.m index 6bdf596ab..7b93b0edf 100644 --- a/tools/tune/crossover/example_crossover.m +++ b/tools/tune/crossover/example_crossover.m @@ -88,7 +88,7 @@ mkdir_check(tpath2); mkdir_check(ctlpath); tplg_write(tplg1_fn, blob8, "CROSSOVER"); tplg2_write(tplg2_fn, blob8_ipc4, "crossover_config", 'Exported Control Bytes'); -blob_write(blob_fn, blob8); +sof_ucm_blob_write(blob_fn, blob8); alsactl_write(alsa_fn, blob8); % Plot Magnitude and Phase Response of each sink diff --git a/tools/tune/dcblock/example_dcblock.m b/tools/tune/dcblock/example_dcblock.m index 6ffa179e5..5e1d022c8 100644 --- a/tools/tune/dcblock/example_dcblock.m +++ b/tools/tune/dcblock/example_dcblock.m @@ -58,13 +58,13 @@ blob8_ipc4 = dcblock_build_blob(R_coeffs, endian, 4); tplg_write(tplg1_fn, blob8, "DCBLOCK", ... "Exported with script example_dcblock.m", ... "cd tools/tune/dcblock; octave example_dcblock.m"); -blob_write(blob3_fn, blob8); +sof_ucm_blob_write(blob3_fn, blob8); alsactl_write(alsa3_fn, blob8); tplg2_write(tplg2_fn, blob8_ipc4, "dcblock_config", ... "Exported with script example_dcblock.m" , ... "cd tools/tune/dcblock; octave example_dcblock.m"); -blob_write(blob4_fn, blob8_ipc4); +sof_ucm_blob_write(blob4_fn, blob8_ipc4); alsactl_write(alsa4_fn, blob8_ipc4); % Plot Filter's Transfer Function and Step Response diff --git a/tools/tune/drc/example_drc.m b/tools/tune/drc/example_drc.m index 4ebae19c0..2a21fe1d9 100644 --- a/tools/tune/drc/example_drc.m +++ b/tools/tune/drc/example_drc.m @@ -73,9 +73,9 @@ drc_note = sprintf("Exported with script %s.m", my_name); drc_howto = sprintf("cd tools/tune/drc; octave --no-window-system %s.m", my_name); tplg_write(tplg1_fn, blob8, "DRC", drc_note, drc_howto); tplg2_write(tplg2_fn, blob8_ipc4, "drc_config", drc_note, drc_howto); -blob_write(blob3_fn, blob8); +sof_ucm_blob_write(blob3_fn, blob8); alsactl_write(alsa3_fn, blob8); -blob_write(blob4_fn, blob8_ipc4); +sof_ucm_blob_write(blob4_fn, blob8_ipc4); alsactl_write(alsa4_fn, blob8_ipc4); % Plot x-y response in dB diff --git a/tools/tune/eq/example_fir_eq.m b/tools/tune/eq/example_fir_eq.m index 3131b8899..be942cd37 100644 --- a/tools/tune/eq/example_fir_eq.m +++ b/tools/tune/eq/example_fir_eq.m @@ -16,6 +16,8 @@ fn.tpath1 = '../../topology/topology1/m4'; fn.tpath2 = '../../topology/topology2/include/components/eqfir'; fn.priv = 'DEF_EQFIR_PRIV'; +addpath ../common + %% ------------------- %% Example 1: Loudness %% ------------------- @@ -133,6 +135,8 @@ eq_pack_export(bm, fn, comment); %% Done. %% -------------------------- +rmpath ../common + end %% ------------------- @@ -221,7 +225,7 @@ function eq_pack_export(bm, fn, note) bp = eq_fir_blob_pack(bm, 3); % IPC3 if ~isempty(fn.bin) - eq_blob_write(fullfile(fn.cpath3, fn.bin), bp); + sof_ucm_blob_write(fullfile(fn.cpath3, fn.bin), bp); end if ~isempty(fn.txt) eq_alsactl_write(fullfile(fn.cpath3, fn.txt), bp); @@ -232,7 +236,7 @@ end bp = eq_fir_blob_pack(bm, 4); % IPC4 if ~isempty(fn.bin) - eq_blob_write(fullfile(fn.cpath4, fn.bin), bp); + sof_ucm_blob_write(fullfile(fn.cpath4, fn.bin), bp); end if ~isempty(fn.txt) eq_alsactl_write(fullfile(fn.cpath4, fn.txt), bp); diff --git a/tools/tune/eq/example_iir_bandsplit.m b/tools/tune/eq/example_iir_bandsplit.m index 37e6bcd60..fdef97ffe 100644 --- a/tools/tune/eq/example_iir_bandsplit.m +++ b/tools/tune/eq/example_iir_bandsplit.m @@ -14,6 +14,8 @@ tpath = '../../topology/topology1/m4'; cpath = '../../ctl'; priv = 'DEF_EQIIR_PRIV'; +addpath ../common + %% -------------------------------------------------- %% Example: Band-split 2ch to 4ch low and high bands %% -------------------------------------------------- @@ -47,6 +49,7 @@ eq_pack_export(bm, blob_fn, alsa_fn, tplg_fn, priv, comment) %% Done. %% ------------------------------------ +rmpath ../common end %% ------------------- @@ -126,7 +129,7 @@ function eq_pack_export(bm, bin_fn, ascii_fn, tplg_fn, priv, note) bp = eq_iir_blob_pack(bm); if ~isempty(bin_fn) - eq_blob_write(bin_fn, bp); + sof_ucm_blob_write(bin_fn, bp); end if ~isempty(ascii_fn) diff --git a/tools/tune/eq/example_iir_eq.m b/tools/tune/eq/example_iir_eq.m index 990ebcb7d..b47aa7405 100644 --- a/tools/tune/eq/example_iir_eq.m +++ b/tools/tune/eq/example_iir_eq.m @@ -16,6 +16,8 @@ fn.tpath1 = '../../topology/topology1/m4'; fn.tpath2 = '../../topology/topology2/include/components/eqiir'; fn.priv = 'DEF_EQIIR_PRIV'; +addpath ../common + %% ------------------- %% Example 1: Loudness %% ------------------- @@ -225,6 +227,8 @@ eq_pack_export(bm, fn, comment) %% Done. %% ------------------------------------ +rmpath ../common + end %% ------------------- @@ -349,8 +353,8 @@ end function eq_pack_export(bm, fn, note) bp = eq_iir_blob_pack(bm, 3); % IPC3 -if ~isempty(fn. bin) - eq_blob_write(fullfile(fn.cpath3, fn.bin), bp); +if ~isempty(fn.bin) + sof_ucm_blob_write(fullfile(fn.cpath3, fn.bin), bp); end if ~isempty(fn.txt) eq_alsactl_write(fullfile(fn.cpath3, fn.txt), bp); @@ -361,7 +365,7 @@ end bp = eq_iir_blob_pack(bm, 4); % IPC4 if ~isempty(fn.bin) - eq_blob_write(fullfile(fn.cpath4, fn.bin), bp); + sof_ucm_blob_write(fullfile(fn.cpath4, fn.bin), bp); end if ~isempty(fn.txt) eq_alsactl_write(fullfile(fn.cpath4, fn.txt), bp); diff --git a/tools/tune/eq/example_spk_eq.m b/tools/tune/eq/example_spk_eq.m index 80c4d1fac..92c7c5d2f 100644 --- a/tools/tune/eq/example_spk_eq.m +++ b/tools/tune/eq/example_spk_eq.m @@ -35,6 +35,8 @@ iir.bin = 'eq_iir_spk.bin'; iir.tplg1 = 'eq_iir_coef_spk.m4'; iir.tplg2 = 'example_speaker.conf'; +addpath ../common + %% Get defaults for equalizer design eq = eq_defaults(); @@ -133,11 +135,11 @@ if eq.enable_fir [ bq_fir ]); bp_fir = eq_fir_blob_pack(bm_fir, 3); % IPC3 eq_alsactl_write(fullfile(fn.cpath3, fir.txt), bp_fir); - eq_blob_write(fullfile(fn.cpath3, fir.bin), bp_fir); + sof_ucm_blob_write(fullfile(fn.cpath3, fir.bin), bp_fir); eq_tplg_write(fullfile(fn.tpath1, fir.tplg1), bp_fir, fir.priv, fir.comment); bp_fir = eq_fir_blob_pack(bm_fir, 4); % IPC4 eq_alsactl_write(fullfile(fn.cpath4, fir.txt), bp_fir); - eq_blob_write(fullfile(fn.cpath4, fir.bin), bp_fir); + sof_ucm_blob_write(fullfile(fn.cpath4, fir.bin), bp_fir); eq_tplg2_write(fullfile(fir.tpath2, fir.tplg2), bp_fir, 'eq_fir', fir.comment); end @@ -150,12 +152,14 @@ if eq.enable_iir [ bq_iir ]); bp_iir = eq_iir_blob_pack(bm_iir, 3); % IPC3 eq_alsactl_write(fullfile(fn.cpath3, iir.txt), bp_iir); - eq_blob_write(fullfile(fn.cpath3, iir.bin), bp_iir); + sof_ucm_blob_write(fullfile(fn.cpath3, iir.bin), bp_iir); eq_tplg_write(fullfile(fn.tpath1, iir.tplg1), bp_iir, iir.priv, iir.comment); bp_iir = eq_iir_blob_pack(bm_iir, 4); % IPC4 eq_alsactl_write(fullfile(fn.cpath4, iir.txt), bp_iir); - eq_blob_write(fullfile(fn.cpath4, iir.bin), bp_iir); + sof_ucm_blob_write(fullfile(fn.cpath4, iir.bin), bp_iir); eq_tplg2_write(fullfile(iir.tpath2, iir.tplg2), bp_iir, 'eq_iir', iir.comment); end +rmpath ../common + end diff --git a/tools/tune/multiband_drc/example_multiband_drc.m b/tools/tune/multiband_drc/example_multiband_drc.m index 486e79dd8..e5ab98808 100644 --- a/tools/tune/multiband_drc/example_multiband_drc.m +++ b/tools/tune/multiband_drc/example_multiband_drc.m @@ -140,9 +140,9 @@ blob8_ipc4 = multiband_drc_build_blob(num_bands, enable_emp_deemp, emp_coefs, .. tplg_write(tplg1_fn, blob8, "MULTIBAND_DRC"); tplg2_write(tplg2_fn, blob8_ipc4, "multiband_drc_config", "Exported with script example_multiband_drc.m"); -blob_write(blob3_fn, blob8); +sof_ucm_blob_write(blob3_fn, blob8); alsactl_write(alsa3_fn, blob8); -blob_write(blob4_fn, blob8_ipc4); +sof_ucm_blob_write(blob4_fn, blob8_ipc4); alsactl_write(alsa4_fn, blob8_ipc4); rmpath ../common