Zram内存压缩-开机自启动配置

这设备真奇怪,重新装ubuntu系统之后原来编译完的内核装上,右声道无论如何都没声音。把右扬声器设置为左声道,有声音。左扬声器设置为右声道,无声音。都设为左声道,都有声音。都设为右声道,都没声音。
也许还有其他因素在里面

有一个忽略了的问题,

SND_SOC_DAPM_MUX("Amp Input", SND_SOC_NOPM, 0, 0, &chsa_mux),

这是一个多路选择MUX widget,也就是同时只通一路Left或right,

{"Amp Input", "Left", "AIFINL"}
{"Amp Input", "Right", "AIFINR"},

cset "name='Amp Input' Left" 会只接通 AIFINLcset "name='Amp Input' Right" 会只接通 AIFINR

但现在硬件接线上已经进行了环接,应该不按声道区分扬声器。所以可以让两个芯片在左右声道下都连通。

//第一芯片
	{"Amp Input", "Left", "AIFINL"},
	{"Amp Input", "Right", "AIFINR"},
//第二芯片
	{"Amp Input1", "Left", "AIFINL1"},
	{"Amp Input1", "Right", "AIFINR1"},

或者直接接通

	{"AMPE", NULL,"AIFINL"},
	{"AMPE", NULL, "AIFINR"},

直接接通试过,不行。之前是Amp Input每个芯片只保留一路,正常使用。后来重装系统就不行了

试试切换声道的时候,amixer手动调整widget配置

cset "name='Amp Input' Left"
cset "name='Amp Input' Right" 

如果起效果的话,那就可以在conf文件里配置一个芯片Left 一个芯片Right。

还是一样,使用左声道正常,但是右声道无声音

$ amixer -c0 sset "Amp Input1" Right
Simple mixer control 'Amp Input1',0
  Capabilities: enum
  Items: 'Left' 'Right'
  Item0: 'Right'
$ amixer -c 0|grep -n3 Amp 
121:Simple mixer control 'Amp Input',0
122-  Capabilities: enum
123-  Items: 'Left' 'Right'
124-  Item0: 'Left'
125:Simple mixer control 'Amp Input1',0
126-  Capabilities: enum
127-  Items: 'Left' 'Right'
128-  Item0: 'Right'

还有可以试试两个都用0而不用1,rt5659输入端没有分开0,1两个通道

//SND_SOC_DAPM_AIF_IN("AIFINR", "HiFi Playback", 1, SND_SOC_NOPM, 0, 0),
SND_SOC_DAPM_AIF_IN("AIFINR", "HiFi Playback", 0, SND_SOC_NOPM, 0, 0),

真好了。虽然不知道之前这么弄好的,但是你的方案确实有效

rt5659里有专门widget去处理单声道多声道的,参考rt5672的ucm conf文件,通过conf文件可以实现很多功能,让alsa在收到声卡操作时(切换扬声器、耳机、声道等)自动匹配对应的controls操作去配置widget,但是widget太多太杂我没去理清,现在那份几乎只是实现最简单的一种route连通。之前有可能是你的机器里rt5659的widget寄存器存了以前的值,后来重装系统寄存起又重置了也说不定。

现在连通的route,多通道音频DAC转换后再ADC转换至AIF2输出到tfa9890,所以可能tfa9890进来是都混响到一通道,第二通道没有声音。

那样就算玄学了。这几天从C语言0基础变成入门,要学的东西还有很多

加油 :fist:

我用的这板系统alsa-conf从conf.d移到Intel文件夹下了。另外对比rt5672,修复了音量调整,现在不用使用特定的音频后端(pipewire-pulseaudio高版本带“专业音频”模式),直接pulseaudio-alsa就行。

音量条修正

sound/soc/codecs/rt5659.c

// 音量修复 临时
// static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0);
static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -6562, 37, 0);

HiFi.conf

SectionVerb {
	If.Controls {
		Condition {
			Type ControlExists
			Control "name='media0_in Gain 0 Switch'"
		}
		Before.EnableSequence "0"
		True {
			Include.pe.File "/platforms/bytcr/PlatformEnableSeq.conf"
			Include.pd.File "/platforms/bytcr/PlatformDisableSeq.conf"
		}
	}

    EnableSequence [
		cset "name='codec_out0 Gain 0 Volume' 72%"
		cset "name='IF2 ADC Mux' DAC_REF"
		cset "name='IF3 ADC Mux' IF_ADC1"
		# 音量50%
		# cset "name='DAC1 Playback Volume' 50%"
		# 设置右扬声器使用右声道
		cset "name='Amp Input1' Rihgt" 
    ]

	DisableSequence [

	]

	Value {
		PlaybackPCM "hw:${CardId}"
		# The speaker ampl. path on the 5659 has no speaker vol control
		# Use the digital DAC1 master control as MixerElem
		# PlaybackMixerElem "DAC1"
		# PlaybackVolume "DAC1 Playback Volume"
		# PlaybackSwitch "DAC1 Playback Switch"
		# PlaybackVolumeScale "0-155:0-100%log"
	}
}

SectionDevice."Speaker" {
	Comment "Stereo Speakers"

	ConflictingDevice [
		# 还没实现,取消注释就报错了
		# "Headphones"
	]

	Value {
		# The speaker ampl. path on the 5659 has no speaker vol control
		# Use the digital DAC1 master control as MixerElem
		PlaybackMixerElem "DAC1"
		PlaybackVolume "DAC1 Playback Volume"
		PlaybackSwitch "DAC1 Playback Switch"
	}

	EnableSequence [
		cset "name='DAC1 Playback Switch' on"
	]
	DisableSequence [
		cset "name='DAC1 Playback Switch' off"
	]
}

cht-bsw-rt5659.conf

Syntax 3

SectionUseCase."HiFi" {
	File "/Intel/cht-bsw-rt5659/HiFi.conf"
	Comment "Default"
}

大佬,有内核源码吗?

按照Brunch里下载原始内核源码后打上patch,重构启动脚本:
https://github.com/sebanc/brunch-unstable
并且给gpu相关的i915驱动源码打上补丁,然后按Brunch里的方式在U盘或内部存储部署系统镜像分区,即可在小米平板2上运行Chrome OS 。

如果是要运行FydeOS,替换成FydeOS的镜像即可,需要在编译内核时加上openfyde的patch,否则无法启动安卓子系统(缺少安卓文件管理模块相关的编译config)。可以参考Damenly的源码:
https://github.com/Damenly/brunch-unstable

小米平板2显示驱动补丁参考:
https://patchwork.kernel.org/project/intel-gfx/patch/20211024155010.126275-1-hdegoede@redhat.com/#24558529

可以参考我这个补丁https://github.com/Qs315490/brunch-unstable-latte/commit/fd798180607c69a693e4a73bab1d268dacbc9613

由于fydeos相比传统Linux差异较大,目前还在研究。

我这边替换内核成功开机,现在研究一下怎么修剪内核。每次编译带amd显卡驱动,这些无用部分导致编译缓慢

背光控制修复
/etc/init/powerd.conf

# start on started boot-services改为以下内容
start on started boot-services and started system-services  # 确保关键服务已启动

/etc/power_manager/powerd_prefs.conf

# 禁用 EC 控制(因 /dev/cros_ec 不存在)
use_cros_ec_for_brightness=0
# 禁用不必要的服务检查
ignore_ui_model_settings=1

顶技术贴

耳机检测貌似可以使用驱动自带的方式。从原理图上看,耳机是接在标准接口上的。
只要模拟设备树传递信息给驱动就行。
理论存在,在实践中

/* 小米平板2没有设备树提供这些信息。ACPI只注册了这个设备 */
static const struct software_node rt5659_swnode = {
	.name = "rt5659",
	.properties = (const struct property_entry[]) {
		PROPERTY_ENTRY_U32("realtek,jd-src", 1),
		{ }
	},
};

static int match_rt5659_client(struct device *dev, const void *data)
{
	struct acpi_device *adev;

	/* 1. 检查设备名是否为 RT5659 */
	if (!strstr(dev_name(dev), "10EC5659"))
		return 0;

	/* 2. 获取 ACPI parent device */
	/* 直接假设 parent 是 ACPI device(ACPI 创建的 I2C client 必然如此) */
	adev = to_acpi_device(dev->parent);
	if (!adev)
		return 0;

	dev_dbg(dev, "[match_rt5659_client]: is acpi device\n");
	return 1;
}

static int __init xiaomi_mipad2_init(struct device *dev)
{
	struct device *client_dev;
	struct i2c_client *client;
	struct led_classdev *led_cdev;
	int ret;

	..............

	ret = software_node_register_node_group(ktd2026_node_group);
	if (ret)
		return dev_err_probe(dev, ret, "registering node_group\n");

	ret = software_node_register(&rt5659_swnode);
	if (ret)
		return ret;

	/* 在 I2C bus 上查找 RT5659 client */
	client_dev = bus_find_device(&i2c_bus_type, NULL, NULL, match_rt5659_client);
	if (!client_dev) {
		pr_err("RT5659 I2C client not found\n");
		goto END;
	}

	client = to_i2c_client(client_dev);
	set_secondary_fwnode(&client->dev, software_node_fwnode(&rt5659_swnode));

	put_device(client_dev);
	pr_info("Bound software node to RT5659\n");

END:
	return 0;
}

麦克风目前只能录音没有声音传出。另外我搞到了android的tinymix输出,对应Linux上amixer。
以下是个人见解
Kernel DAPM 路径: 信号需要从 Int MicAIF1 Capture (SSP2 Rx)。这通过激活 RECMIX1L/R BST3 , Stereo1 ADC Source , Stereo1 ADC MIXL/R ADC1 等控件实现

SST DSP 路径: 信号从 AIF1 Rxcodec1_in_pipe_outmain_matrix (codec1_inmedia_loop2_out) → media_mic_eqpcm_record 子系统main_matrixpcm1_out ALSA Device。Linux 缺失的是 pcm_record 子系统的激活。

SectionDevice."IntMic" {
	Comment "Microphone"

	ConflictingDevice [
		"Headphones"
		"HeadsetMic"
	]

	EnableSequence [
		# 开启 Int Mic
		cset "name='Int Mic Switch' on"
		cset "name='RECMIX1L BST3 Switch' on"
    	cset "name='RECMIX1R BST4 Switch' on"

		# 开启 Boost(如果需要)
		cset "name='IN3 Boost Volume' 45"
		cset "name='IN4 Boost Volume' 45"

		# 设置 ADC 源 (选择录音混音器的输出作为 ADC 输入)
        cset "name='Stereo1 ADC Source' 'ADC1'"
        cset "name='Stereo1 ADC1 Source' 'ADC'"

		# 设置录音混音器输出到 ADC
		cset "name='Stereo1 ADC MIXL ADC1 Switch' on"
		cset "name='Stereo1 ADC MIXR ADC1 Switch' on"
		cset "name='DAC1 MIXL DAC1 Switch' off"
		cset "name='DAC1 MIXR DAC1 Switch' off"
		cset "name='DAC1 MIXL Stereo ADC Switch' off"
		cset "name='DAC1 MIXR Stereo ADC Switch' off"

		# 设置 ADC 音量
		cset "name='IN Capture Volume' 23"
		cset "name='STO1 ADC Capture Volume' 70"
	]

	DisableSequence [
		cset "name='Int Mic Switch' off"
	]

	Value {
		CapturePCM "hw:${CardId}"
		CaptureMixerElem "Int Mic"
		CaptureVolume "IN Capture Volume"
		CaptureSwitch "Int Mic Switch"
	}
}

麦克风成功攻破,参考github提交,想复杂了。只要路由通就行