我的全新 Thinkpad X120e 在 Ubuntu Natty 上运行良好。现在我想得到tp_smapi模块工作,以便我可以控制电池充电行为。不幸的是我得到“没有 Thinkpad 嵌入式控制器”(如下)。
thinkwiki tp_smapi 页面在这种情况下说“你应该升级你的BIOS。一些早期的 BIOS(例如 X31 上的 1.x)不处理嵌入式控制器”。但就我而言,dmidecode 表明我已经在使用几乎最新的来自 IBM 的 BIOS。
# apt-get install tp-smapi-dkms
...(works)...
# modprobe -v tp_smapi
WARNING: Error inserting thinkpad_ec (/lib/modules/2.6.38-7-generic/updates/dkms/thinkpad_ec.ko): No such device
FATAL: Error inserting tp_smapi (/lib/modules/2.6.38-7-generic/updates/dkms/tp_smapi.ko): No such device
# tail -1 /var/log/syslog
Apr 19 23:45:05 xilotl kernel: [ 5552.149408] thinkpad_ec: no ThinkPad embedded controller!
# dmidecode -s bios-version
8FET26WW (1.10 )
还有其他想法如何使这项工作有效吗?
dmidecode
更新:以下是(即)的其他相关部分dmidecode -t0 -t1 -t11
:
Handle 0x0000, DMI type 0, 24 bytes
BIOS Information
Vendor: LENOVO
Version: 8FET26WW (1.10 )
Release Date: 03/09/2011
...
Handle 0x0001, DMI type 1, 27 bytes
System Information
Manufacturer: LENOVO
Product Name: 0596CTO
Version: ThinkPad X120e
...
Handle 0x0027, DMI type 11, 5 bytes
OEM Strings
String 1: OEM default string
答案1
我能够通过编辑 的源代码来完成这项工作thinkpad_ec.c
。
该代码预计当您运行时dmidecode -t 11
输出应提及“IBM ThinkPad Embedded Controller”。然而,新的Thinkpad X120e有一个很好的嵌入式控制器,下面没有提到dmidecode -t 11
。结果,代码失败并出现错误“thinkpad_ec:没有 ThinkPad 嵌入式控制器!”。
为了避开这项检查,我将 ThinkPad X120e 添加到了当前列入白名单的 ThinkPad 型号列表中thinkpad_ec.c
,然后重建了该模块。它加载成功,我能够按照广告在 /sys/devices/platform/smapi/BAT0 中设置电池的停止充电阈值。
如果您是Thinkpad X120e用户并且现在想使用tp_smapi模块,这是我克服模块加载失败的方法:
$ sudo su
# apt-get install tp-smapi-dkms
...(works)...
# modprobe -v tp_smapi
WARNING: Error inserting thinkpad_ec (/lib/modules/2.6.38-7-generic/updates/dkms/thinkpad_ec.ko): No such device
FATAL: Error inserting tp_smapi (/lib/modules/2.6.38-7-generic/updates/dkms/tp_smapi.ko): No such device
# tail -1 /var/log/syslog
Apr 19 23:45:05 xilotl kernel: [ 5552.149408] thinkpad_ec: no ThinkPad embedded controller!
编辑关键文件,vi /usr/src/tp-smapi-0.40/thinkpad_ec.c
添加标有 + 的行:
diff --git a/thinkpad_ec.c b/thinkpad_ec.c
index a924d18..90d117e 100644
--- a/thinkpad_ec.c
+++ b/thinkpad_ec.c
@@ -460,6 +460,7 @@ static int __init check_dmi_for_ec(void)
TP_DMI_MATCH("IBM", "ThinkPad A30"),
TP_DMI_MATCH("IBM", "ThinkPad T23"),
TP_DMI_MATCH("IBM", "ThinkPad X24"),
+ TP_DMI_MATCH("LENOVO", "ThinkPad X120e"),
{ .ident = NULL }
};
return dmi_find_substring(DMI_DEV_TYPE_OEM_STRING,
重建模块:
# dkms remove -m tp-smapi -v 0.40 --all
# dkms add -m tp-smapi -v 0.40
# dkms build -m tp-smapi -v 0.40
# dkms install -m tp-smapi -v 0.40
# modprobe tp-smapi
最后尝试使用它:
# cd /sys/devices/platform/smapi/BAT0
# echo 60 > stop_charge_thresh
正如 hwong557 提到的,添加tp_smapi
到/etc/modules
以便它将在启动时自动加载。
如果您是tp_smapi
模块维护者或其他能够获得此修复“正确”的知识渊博的人:这是“正确”的修复吗? Thinkpad X120e 是否应该永久添加到此白名单中,或者是否有其他方法可以检查嵌入式控制器是否存在?我希望此更改或问题的其他修复将添加到上游源中。
答案2
修复了架构Linux
下载tp_smapiAUR 的模块。
构建并安装:makepkg -i
尝试加载模块:
$ sudo modprobe -v tp_smapi
insmod /lib/modules/2.6.38-ARCH/extra/thinkpad_ec.ko.gz
WARNING: Error inserting thinkpad_ec (/lib/modules/2.6.38-ARCH/extra/thinkpad_ec.ko.gz): No such device
FATAL: Error inserting tp_smapi (/lib/modules/2.6.38-ARCH/extra/tp_smapi.ko.gz): No such device
检查系统日志:
$ dmesg | tail -1
[ 1009.371778] thinkpad_ec: no ThinkPad embedded controller!
按照 krubo 的答案进行编辑src/tp_smapi-0.40/thinkpad_ec.c
,向包中添加补丁:
--- thinkpad_ec.c.orig 2011-05-15 13:35:28.556634244 -0700
+++ thinkpad_ec.c 2011-05-15 13:35:40.466634616 -0700
@@ -460,6 +460,7 @@
TP_DMI_MATCH("IBM", "ThinkPad A30"),
TP_DMI_MATCH("IBM", "ThinkPad T23"),
TP_DMI_MATCH("IBM", "ThinkPad X24"),
+ TP_DMI_MATCH("LENOVO", "ThinkPad X120e"),
{ .ident = NULL }
};
return dmi_find_substring(DMI_DEV_TYPE_OEM_STRING,
编辑 PKGBUILD 以包含新补丁:
patch -Np1 < "$srcdir/thinkpad-x120e.patch"
makepkg -i
删除任何以前构建的软件包,然后使用此补丁重建并安装该软件包 ( )
加载模块,你就可以开始工作了:
$ sudo modprobe tp_smapi
$ dmesg | tail -1
[ 1735.966431] tp_smapi successfully loaded (smapi_port=0xb0).
$ ls /sys/devices/platform/smapi
ac_connected BAT0 BAT1 driver modalias power
smapi_request subsystem uevent
答案3
我试过了克鲁博的解决方案适用于我的 Thinkpad T420。然而,在最后一步install
,我必须添加 a--force
才能使 modprobe 成功;否则它给了我与最初相同的错误。
然而,当我尝试修改电池设置时,命令echo
成功/sys/devices/platform/smapi/BAT0/stop_charge_thresh
,但读取后,cat
仍然给出 100。
另外,重新启动后,该模块不再加载,我需要再次手动 modprobe。通过添加tp_smapi
到 来修复此问题/etc/modules
。
不过,我很高兴地报告 hdaps 正在工作;我必须将/etc/defaults/hdaps
,中的最后一个设置更改FORCEENABLE
为yes
。我使用此链接检查了它:验证 hdapsd 是否正常工作 (Thinkpad Wiki)。