<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.thinkwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=192.117.108.16</id>
	<title>ThinkWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.thinkwiki.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=192.117.108.16"/>
	<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/wiki/Special:Contributions/192.117.108.16"/>
	<updated>2026-09-25T11:23:47Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.12</generator>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Tp_smapi&amp;diff=18104</id>
		<title>Tp smapi</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Tp_smapi&amp;diff=18104"/>
		<updated>2006-01-15T22:20:31Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: /* Model-specific status */ - T22 completely unsupported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|style=&amp;quot;vertical-align:top;padding-right:20px;width:10px;white-space:nowrap;&amp;quot; | __TOC__&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |The &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; kernel module exposes some features of the ThinkPad's [[SMAPI support for Linux|SMAPI]] functionality via a &amp;lt;tt&amp;gt;sysfs&amp;lt;/tt&amp;gt; interface. Currently, the implemented functionality is control of battery charging, extended battery status and control of CD/DVD speed (disabled by default).&lt;br /&gt;
&lt;br /&gt;
For old ThinkPad models, see also [[tpctl]].&lt;br /&gt;
&lt;br /&gt;
{{WARN|This driver uses undocumented features and direct hardware access. They thus cannot be guaranteed to work, and may cause arbitrary damage (though so far none was reported)..}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
*Battery charge/discharge control&lt;br /&gt;
*Battery status information&lt;br /&gt;
*Optical drive speed control&lt;br /&gt;
&lt;br /&gt;
===Project Homepage / Availability===&lt;br /&gt;
* Project page: http://tpctl.sourceforge.net/&lt;br /&gt;
* You need to download only the [http://sourceforge.net/project/showfiles.php?group_id=1212&amp;amp;package_id=171579 tp_smapi kernel module].&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
For testing, you can simply compile and load the driver within the current&lt;br /&gt;
working directory:&lt;br /&gt;
:{{cmdroot|tar xzvf tp_smapi-0.16.tgz}}&lt;br /&gt;
:{{cmdroot|cd tp_smapi-0.16}}&lt;br /&gt;
:{{cmdroot|make load}}&lt;br /&gt;
&lt;br /&gt;
To compile and install into the kernel's module path:&lt;br /&gt;
:{{cmdroot|make install}}&lt;br /&gt;
&lt;br /&gt;
If you use the [[HDAPS]] driver, add &amp;lt;tt&amp;gt;HDAPS=1&amp;lt;/tt&amp;gt; to also patch the &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; for compatibility with &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; (this requires a kernel source tree):&lt;br /&gt;
:{{cmdroot|1=make load HDAPS=1}} &amp;amp;nbsp; or &amp;amp;nbsp;  {{cmdroot|1=make install HDAPS=1}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To prepare a stand-alone patch against the current kernel tree (including&lt;br /&gt;
a compatibility fixes to &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Kconfig&amp;lt;/tt&amp;gt; entries):&lt;br /&gt;
:{{cmdroot|make patch}}&lt;br /&gt;
&lt;br /&gt;
To delete all autogenerated files:&lt;br /&gt;
:{{cmdroot|make clean}}&lt;br /&gt;
&lt;br /&gt;
The original kernel tree is never modified by any these commands. &lt;br /&gt;
The {{path|/lib/modules}} directory is modified only by {{cmdroot|make install}}.&lt;br /&gt;
&lt;br /&gt;
===Battery charge control features===&lt;br /&gt;
To set the thresholds for starting and stopping battery charging (in percent of current full charge capacity):&lt;br /&gt;
:{{cmdroot|echo 40 &amp;gt; /sys/devices/platform/smapi/BAT0/start_charge_thresh}}&lt;br /&gt;
:{{cmdroot|echo 70 &amp;gt; /sys/devices/platform/smapi/BAT0/stop_charge_thresh}}&lt;br /&gt;
:{{cmdroot|cat /sys/devices/platform/smapi/BAT0/*_charge_thresh}}&lt;br /&gt;
{{HINT|Battery charging thresholds can be used to keep Li-Ion ad Li-Polymer batteries partially charged, in order to [[Maintenance#Battery_Treatment|increase their lifetime]].}}&lt;br /&gt;
To unconditionally inhibit charging for 17 minutes:&lt;br /&gt;
:{{cmdroot|echo 17 &amp;gt; /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes}}&lt;br /&gt;
{{HINT|Charge inhibiting can be used to reduce the power draw of the laptop, in order to use a an under-spec power supply that can't handle the combined power draw of running and charging. It can also be used to control which battery is charged when [[How to use UltraBay batteries|using an Ultrabay battery]].}}&lt;br /&gt;
&lt;br /&gt;
To cancel charge inhibiting:&lt;br /&gt;
:{{cmdroot|echo 0 &amp;gt; /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes}}&lt;br /&gt;
&lt;br /&gt;
To force battery discharging even if connected to AC, use one of these:&lt;br /&gt;
:{{cmdroot|echo 1 &amp;gt; /sys/devices/platform/smapi/BAT0/force_discharge}}&lt;br /&gt;
{{HINT|This can be used to choose which battery is discharged when [[How to use UltraBay batteries|using an UltraBay battery]].}}&lt;br /&gt;
&lt;br /&gt;
To cancel forced discharge:&lt;br /&gt;
:{{cmdroot|echo 0 &amp;gt; /sys/devices/platform/smapi/BAT0/force_discharge}}&lt;br /&gt;
&lt;br /&gt;
===Battery status features===&lt;br /&gt;
To view extended battery status such as charging state, voltage, current, capacity, cycle count and model information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/installed&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/state       # idle/charging/discharging&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/cycle_count &lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/current_now # instantaneous current&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/current_avg # last minute average&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/power_now   # instantaneous power&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/power_avg   # last minute average&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/last_full_capacity&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/remaining_capacity&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/design_capacity&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/voltage&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/design_voltage&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/manufacturer&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/model&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/serial&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/barcoding&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/chemistry&lt;br /&gt;
# cat /sys/devices/platform/smapi/ac_connected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The raw status data is also available, including some fields not listed above (in case you can figure them out):&lt;br /&gt;
&lt;br /&gt;
:{{cmdroot|cat /sys/devices/platform/smapi/BAT0/dump}}&lt;br /&gt;
&lt;br /&gt;
In all of the above, replace &amp;lt;tt&amp;gt;BAT0&amp;lt;/tt&amp;gt; with &amp;lt;tt&amp;gt;BAT1&amp;lt;/tt&amp;gt; to address the 2nd battery.&lt;br /&gt;
&lt;br /&gt;
Note that the battery status readout conflicts with the stock [[HDAPS|hdaps]] driver, so if you use &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; you will need to load &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; using {{cmdroot|1=make load HDAPS=1}} (see [[#Conflict_with_hdaps|Conflict with hdaps]] below).&lt;br /&gt;
&lt;br /&gt;
===Optical drive control features===&lt;br /&gt;
&lt;br /&gt;
To control the speed of the optical drive:&lt;br /&gt;
:{{cmdroot|echo 0 &amp;gt; /sys/devices/platform/smapi/cd_speed # slow}}&lt;br /&gt;
:{{cmdroot|echo 1 &amp;gt; /sys/devices/platform/smapi/cd_speed # medium}}&lt;br /&gt;
:{{cmdroot|echo 2 &amp;gt; /sys/devices/platform/smapi/cd_speed # fast}}&lt;br /&gt;
:{{cmdroot|cat /sys/devices/platform/smapi/cd_speed}}&lt;br /&gt;
&lt;br /&gt;
=====Enabling this feature=====&lt;br /&gt;
Changing the drive speed when a disc is being accessed will hang your computer. This feature is thus '''disabled by default''', but can be enabled using by adding &amp;lt;tt&amp;gt;#define PROVIDE_CD_SPEED&amp;lt;/tt&amp;gt; at the top of &amp;lt;tt&amp;gt;tp_smapi.c&amp;lt;/tt&amp;gt;. The safe way to set the drive speed is using &amp;lt;tt&amp;gt;hdparm -E num&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;eject -x num&amp;lt;/tt&amp;gt; for CD-ROM, and &amp;lt;tt&amp;gt;speedcontrol -x num&amp;lt;/tt&amp;gt; (sourcecode [http://safari.iki.fi/speedcontrol.c here]) for DVD. For kernels older than 2.6.15, this may require the [[Problems_with_SATA_and_Linux#No_SMART_support libata pass-through|libata pass-through patch]].&lt;br /&gt;
&lt;br /&gt;
===Other features===&lt;br /&gt;
Other things that can be controlled through SMAPI, but are not supported in this version of the driver, include forcing battery discharge, PCI bus power saving, CPU power saving control and fan control. See the included README file for more information.&lt;br /&gt;
&lt;br /&gt;
===Conflict with &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt;===&lt;br /&gt;
The extended battery status function conflicts with the [[HDAPS|hdaps]] kernel module (they use the same IO ports). &lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;tt&amp;gt;HDAPS=1&amp;lt;/tt&amp;gt; (see [[#Installation|Installation]]) to get a patched version of &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; which is compatible with &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Otherwise:&lt;br /&gt;
&lt;br /&gt;
If you load &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; first, &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; will disable its battery status functions (and log a message in the kernel log). If you load &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; first, &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; will refuse to load. To switch between the two, &amp;lt;tt&amp;gt;rmmod&amp;lt;/tt&amp;gt; both and then load one you need.&lt;br /&gt;
&lt;br /&gt;
Some of the battery status is also visible through ACPI ({{path|/proc/acpi/battery/*}}).&lt;br /&gt;
&lt;br /&gt;
The charging control files (&amp;lt;tt&amp;gt;*_charge_thresh&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;inhibit_charge_minutes&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;force_discharge*&amp;lt;/tt&amp;gt;) don't have this problem.&lt;br /&gt;
&lt;br /&gt;
===Model-specific status===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|+&amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; feature support matrix&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;times; &lt;br /&gt;
! &amp;lt;tt&amp;gt;start_charge_&amp;lt;br /&amp;gt;thresh&amp;lt;/tt&amp;gt; &lt;br /&gt;
!           &amp;lt;tt&amp;gt;stop_charge_&amp;lt;br /&amp;gt;thresh&amp;lt;/tt&amp;gt;&lt;br /&gt;
!                      &amp;lt;tt&amp;gt;inhbit_charge_&amp;lt;br /&amp;gt;minutes&amp;lt;/tt&amp;gt;&lt;br /&gt;
!                                   &amp;lt;tt&amp;gt;force_discharge&amp;lt;/tt&amp;gt;&lt;br /&gt;
!                                                battery status files&amp;lt;br \&amp;gt;&amp;lt;font size=&amp;quot;-2&amp;quot;&amp;gt;(see [[#Conflict_with_hdaps|note about &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt;]] above)&amp;lt;/font&amp;gt;&lt;br /&gt;
!                                                             &amp;lt;tt&amp;gt;cd_speed&amp;lt;/tt&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;font size=&amp;quot;-2&amp;quot;&amp;gt;(see [[#Enabling_this_feature|note]] above)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! colspan=7 style=&amp;quot;text-align:center;background:#efefef;&amp;quot; | G series&lt;br /&gt;
|-&lt;br /&gt;
! {{G41}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cunk}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! colspan=7 style=&amp;quot;text-align:center;background:#efefef;&amp;quot; | R series&lt;br /&gt;
|-&lt;br /&gt;
! {{R40}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cunk}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{R50p}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{R51}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cyes}}|| {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{R52}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cunk}} || {{Cunk}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! colspan=7 style=&amp;quot;text-align:center;background:#efefef;&amp;quot; | T series&lt;br /&gt;
|-&lt;br /&gt;
! {{T22}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cno}} || {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T23}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}}|| {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T40}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cyes}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T40p}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T41}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T41p}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cunk}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T42}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cyes}} || {{Cyes}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T42p}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cunk}}|| {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T43}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! {{T43p}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}}|| {{Cyes}} &lt;br /&gt;
|-&lt;br /&gt;
! colspan=7 style=&amp;quot;text-align:center;background:#efefef;&amp;quot; | X series&lt;br /&gt;
|-&lt;br /&gt;
! {{X24}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cyes}}|| {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{X31}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cyes}}|| {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{X32}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cunk}}|| {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{X40}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cyes}}|| {{Cunk}} &lt;br /&gt;
|-&lt;br /&gt;
! {{X41}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}}|| {{Cunk}} &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Please update the above and report your experience on the [[Talk:tp_smapi|discussion]] page. If the module loads but gives a &amp;quot;&amp;lt;tt&amp;gt;not supported&amp;lt;/tt&amp;gt;&amp;quot; or &amp;quot;&amp;lt;tt&amp;gt;not implementeded&amp;lt;/tt&amp;gt;&amp;quot; when you try to use some specific file in {{path|/sys/devices/platform/smapi/}}, please report the &amp;lt;tt&amp;gt;dmesg&amp;lt;/tt&amp;gt; output and whether the corresponding functionality is available under Windows - maybe your ThinkPad just can't do that.&lt;br /&gt;
&lt;br /&gt;
[[Category:Drivers]] [[Category:Patches]]&lt;br /&gt;
&lt;br /&gt;
===Tools using this driver===&lt;br /&gt;
&lt;br /&gt;
The driver's interface can be accessed directly through the files under {{path|/sys/devices/platform/smapi}}, or via the following tools:&lt;br /&gt;
* [[KThinkBat]] - display battery status on the KDE &amp;lt;tt&amp;gt;kicker&amp;lt;/tt&amp;gt; panel.&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Tp_smapi&amp;diff=14594</id>
		<title>Tp smapi</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Tp_smapi&amp;diff=14594"/>
		<updated>2006-01-11T16:23:04Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: /* Model-specific status */ - removed force_discharge2 column&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|style=&amp;quot;vertical-align:top;padding-right:20px;width:10px;white-space:nowrap;&amp;quot; | __TOC__&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |The &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; kernel module exposes some features of the ThinkPad's [[SMAPI support for Linux|SMAPI]] functionality via a &amp;lt;tt&amp;gt;sysfs&amp;lt;/tt&amp;gt; interface. Currently, the implemented functionality is control of battery charging, extended battery status and control of CD/DVD speed (disabled by default).&lt;br /&gt;
&lt;br /&gt;
For old ThinkPad models, see also [[tpctl]].&lt;br /&gt;
&lt;br /&gt;
{{WARN|This driver uses undocumented features and direct hardware access. They thus cannot be guaranteed to work, and may cause arbitrary damage (though so far none was reported)..}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===Features===&lt;br /&gt;
*Battery charge/discharge control&lt;br /&gt;
*Battery status information&lt;br /&gt;
*Optical drive speed control&lt;br /&gt;
&lt;br /&gt;
===Project Homepage / Availability===&lt;br /&gt;
* Project page: http://tpctl.sourceforge.net/&lt;br /&gt;
* You need to download only the [http://sourceforge.net/project/showfiles.php?group_id=1212&amp;amp;package_id=171579 tp_smapi kernel module].&lt;br /&gt;
&lt;br /&gt;
===Installation===&lt;br /&gt;
For testing, you can simply compile and load the driver within the current&lt;br /&gt;
working directory:&lt;br /&gt;
:{{cmdroot|tar xzvf tp_smapi-0.16.tgz}}&lt;br /&gt;
:{{cmdroot|cd tp_smapi-0.16}}&lt;br /&gt;
:{{cmdroot|make load}}&lt;br /&gt;
&lt;br /&gt;
To compile and install into the kernel's module path:&lt;br /&gt;
:{{cmdroot|make install}}&lt;br /&gt;
&lt;br /&gt;
If you use the [[HDAPS]] driver, add &amp;lt;tt&amp;gt;HDAPS=1&amp;lt;/tt&amp;gt; to also patch the &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; for compatibility with &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; (this requires a kernel source tree):&lt;br /&gt;
:{{cmdroot|1=make load HDAPS=1}} &amp;amp;nbsp; or &amp;amp;nbsp;  {{cmdroot|1=make install HDAPS=1}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To prepare a stand-alone patch against the current kernel tree (including&lt;br /&gt;
a compatibility fixes to &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Kconfig&amp;lt;/tt&amp;gt; entries):&lt;br /&gt;
:{{cmdroot|make patch}}&lt;br /&gt;
&lt;br /&gt;
To delete all autogenerated files:&lt;br /&gt;
:{{cmdroot|make clean}}&lt;br /&gt;
&lt;br /&gt;
The original kernel tree is never modified by any these commands. &lt;br /&gt;
The {{path|/lib/modules}} directory is modified only by {{cmdroot|make install}}.&lt;br /&gt;
&lt;br /&gt;
===Battery charge control features===&lt;br /&gt;
To set the thresholds for starting and stopping battery charging (in percent of current full charge capacity):&lt;br /&gt;
:{{cmdroot|echo 40 &amp;gt; /sys/devices/platform/smapi/BAT0/start_charge_thresh}}&lt;br /&gt;
:{{cmdroot|echo 70 &amp;gt; /sys/devices/platform/smapi/BAT0/stop_charge_thresh}}&lt;br /&gt;
:{{cmdroot|cat /sys/devices/platform/smapi/BAT0/*_charge_thresh}}&lt;br /&gt;
{{HINT|Battery charging thresholds can be used to keep Li-Ion ad Li-Polymer batteries partially charged, in order to [[Maintenance#Battery_Treatment|increase their lifetime]].}}&lt;br /&gt;
To unconditionally inhibit charging for 17 minutes:&lt;br /&gt;
:{{cmdroot|echo 17 &amp;gt; /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes}}&lt;br /&gt;
{{HINT|Charge inhibiting can be used to reduce the power draw of the laptop, in order to use a an under-spec power supply that can't handle the combined power draw of running and charging. It can also be used to control which battery is charged when [[How to use UltraBay batteries|using an Ultrabay battery]].}}&lt;br /&gt;
&lt;br /&gt;
To cancel charge inhibiting:&lt;br /&gt;
:{{cmdroot|echo 0 &amp;gt; /sys/devices/platform/smapi/BAT0/inhibit_charge_minutes}}&lt;br /&gt;
&lt;br /&gt;
To force battery discharging even if connected to AC, use one of these:&lt;br /&gt;
:{{cmdroot|echo 1 &amp;gt; /sys/devices/platform/smapi/BAT0/force_discharge}}&lt;br /&gt;
{{HINT|This can be used to choose which battery is discharged when [[How to use UltraBay batteries|using an UltraBay battery]].}}&lt;br /&gt;
&lt;br /&gt;
To cancel forced discharge:&lt;br /&gt;
:{{cmdroot|echo 0 &amp;gt; /sys/devices/platform/smapi/BAT0/force_discharge}}&lt;br /&gt;
&lt;br /&gt;
===Battery status features===&lt;br /&gt;
To view extended battery status such as charging state, voltage, current, capacity, cycle count and model information:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/installed&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/state       # idle/charging/discharging&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/cycle_count &lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/current_now # instantaneous current&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/current_avg # last minute average&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/power_now   # instantaneous power&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/power_avg   # last minute average&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/last_full_capacity&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/remaining_capacity&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/design_capacity&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/voltage&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/design_voltage&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/manufacturer&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/model&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/serial&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/barcoding&lt;br /&gt;
# cat /sys/devices/platform/smapi/BAT0/chemistry&lt;br /&gt;
# cat /sys/devices/platform/smapi/ac_connected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The raw status data is also available, including some fields not listed above (in case you can figure them out):&lt;br /&gt;
&lt;br /&gt;
:{{cmdroot|cat /sys/devices/platform/smapi/BAT0/dump}}&lt;br /&gt;
&lt;br /&gt;
In all of the above, replace &amp;lt;tt&amp;gt;BAT0&amp;lt;/tt&amp;gt; with &amp;lt;tt&amp;gt;BAT1&amp;lt;/tt&amp;gt; to address the 2nd battery.&lt;br /&gt;
&lt;br /&gt;
Note that the battery status readout conflicts with the stock [[HDAPS|hdaps]] driver, so if you use &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; you will need to load &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; using {{cmdroot|1=make load HDAPS=1}} (see [[#Conflict_with_hdaps|Conflict with hdaps]] below).&lt;br /&gt;
&lt;br /&gt;
===Optical drive control features===&lt;br /&gt;
&lt;br /&gt;
To control the speed of the optical drive:&lt;br /&gt;
:{{cmdroot|echo 0 &amp;gt; /sys/devices/platform/smapi/cd_speed # slow}}&lt;br /&gt;
:{{cmdroot|echo 1 &amp;gt; /sys/devices/platform/smapi/cd_speed # medium}}&lt;br /&gt;
:{{cmdroot|echo 2 &amp;gt; /sys/devices/platform/smapi/cd_speed # fast}}&lt;br /&gt;
:{{cmdroot|cat /sys/devices/platform/smapi/cd_speed}}&lt;br /&gt;
&lt;br /&gt;
=====Enabling this feature=====&lt;br /&gt;
Changing the drive speed when a disc is being accessed will hang your computer. This feature is thus '''disabled by default''', but can be enabled using by adding &amp;lt;tt&amp;gt;#define PROVIDE_CD_SPEED&amp;lt;/tt&amp;gt; at the top of &amp;lt;tt&amp;gt;tp_smapi.c&amp;lt;/tt&amp;gt;. The safe way to set the drive speed is using &amp;lt;tt&amp;gt;hdparm -E num&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;eject -x num&amp;lt;/tt&amp;gt; for CD-ROM, and &amp;lt;tt&amp;gt;speedcontrol -x num&amp;lt;/tt&amp;gt; (sourcecode [http://safari.iki.fi/speedcontrol.c here]) for DVD. For kernels older than 2.6.15, this may require the [[Problems_with_SATA_and_Linux#No_SMART_support libata pass-through|libata pass-through patch]].&lt;br /&gt;
&lt;br /&gt;
===Other features===&lt;br /&gt;
Other things that can be controlled through SMAPI, but are not supported in this version of the driver, include forcing battery discharge, PCI bus power saving, CPU power saving control and fan control. See the included README file for more information.&lt;br /&gt;
&lt;br /&gt;
===Conflict with &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt;===&lt;br /&gt;
The extended battery status function conflicts with the [[HDAPS|hdaps]] kernel module (they use the same IO ports). &lt;br /&gt;
&lt;br /&gt;
You can use &amp;lt;tt&amp;gt;HDAPS=1&amp;lt;/tt&amp;gt; (see [[#Installation|Installation]]) to get a patched version of &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; which is compatible with &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
Otherwise:&lt;br /&gt;
&lt;br /&gt;
If you load &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; first, &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; will disable its battery status functions (and log a message in the kernel log). If you load &amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; first, &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt; will refuse to load. To switch between the two, &amp;lt;tt&amp;gt;rmmod&amp;lt;/tt&amp;gt; both and then load one you need.&lt;br /&gt;
&lt;br /&gt;
Some of the battery status is also visible through ACPI ({{path|/proc/acpi/battery/*}}).&lt;br /&gt;
&lt;br /&gt;
The charging control files (&amp;lt;tt&amp;gt;*_charge_thresh&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;inhibit_charge_minutes&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;force_discharge*&amp;lt;/tt&amp;gt;) don't have this problem.&lt;br /&gt;
&lt;br /&gt;
===Model-specific status===&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;2&amp;quot;&lt;br /&gt;
|+&amp;lt;tt&amp;gt;tp_smapi&amp;lt;/tt&amp;gt; feature support matrix&lt;br /&gt;
|-&lt;br /&gt;
! &amp;amp;times; &lt;br /&gt;
! &amp;lt;tt&amp;gt;start_charge_&amp;lt;br /&amp;gt;thresh&amp;lt;/tt&amp;gt; &lt;br /&gt;
!           &amp;lt;tt&amp;gt;stop_charge_&amp;lt;br /&amp;gt;thresh&amp;lt;/tt&amp;gt;&lt;br /&gt;
!                      &amp;lt;tt&amp;gt;inhbit_charge_&amp;lt;br /&amp;gt;minutes&amp;lt;/tt&amp;gt;&lt;br /&gt;
!                                  &amp;lt;tt&amp;gt;cd_speed&amp;lt;/tt&amp;gt;&amp;lt;br \&amp;gt;&amp;lt;font size=&amp;quot;-2&amp;quot;&amp;gt;(see [[#Enabling_this_feature|note] above)&amp;lt;/font&amp;gt;&lt;br /&gt;
!                                                &amp;lt;tt&amp;gt;force_&amp;lt;br /&amp;gt;discharge&amp;lt;/tt&amp;gt;&lt;br /&gt;
!                                                             battery status files&amp;lt;br \&amp;gt;&amp;lt;font size=&amp;quot;-2&amp;quot;&amp;gt;(see [[#Conflict_with_hdaps|note about &amp;lt;tt&amp;gt;hdaps&amp;lt;/tt&amp;gt;]] above)&amp;lt;/font&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
! {{G41}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cyes}} || {{Cunk}} || {{Cunk}}&lt;br /&gt;
|-&lt;br /&gt;
! {{R40}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cunk}}&lt;br /&gt;
|-&lt;br /&gt;
! {{R50p}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}} || {{Cno}}  || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{R51}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cunk}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{R52}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cunk}} || {{Cunk}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T23}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cno}}  || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T40}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T40p}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}} || {{Cno}}  || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T41}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}} || {{Cno}}  || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T41p}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cunk}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T42}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T42p}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cunk}} || {{Cunk}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T43}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{T43p}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{X24}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cunk}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{X31}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cunk}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{X32}}&lt;br /&gt;
| {{Cno}}  || {{Cno}}  || {{Cno}}  || {{Cunk}} || {{Cunk}} || {{Cunk}}&lt;br /&gt;
|-&lt;br /&gt;
! {{X40}}&lt;br /&gt;
| {{Cyes}} || {{Cno}}  || {{Cyes}} || {{Cunk}} || {{Cunk}} || {{Cyes}}&lt;br /&gt;
|-&lt;br /&gt;
! {{X41}}&lt;br /&gt;
| {{Cyes}} || {{Cyes}} || {{Cyes}} || {{Cunk}} || {{Cyes}} || {{Cyes}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Please update the above and report your experience on the [[Talk:SMAPI support for Linux|discussion]] page. If the module loads but gives a &amp;quot;&amp;lt;tt&amp;gt;not supported&amp;lt;/tt&amp;gt;&amp;quot; or &amp;quot;&amp;lt;tt&amp;gt;not implementeded&amp;lt;/tt&amp;gt;&amp;quot; when you try to use some specific file in {{path|/sys/devices/platform/smapi/}}, please report the &amp;lt;tt&amp;gt;dmesg&amp;lt;/tt&amp;gt; output and whether the corresponding functionality is available under Windows - maybe your ThinkPad just can't do that.&lt;br /&gt;
&lt;br /&gt;
[[Category:Drivers]] [[Category:Patches]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Template:ThinkWiki_News&amp;diff=14642</id>
		<title>Template:ThinkWiki News</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Template:ThinkWiki_News&amp;diff=14642"/>
		<updated>2006-01-10T13:10:55Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: 2.6.15 does not yet have SATA resume&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;03.01.2006: The newly released [http://kernel.org/pub/linux/kernel/v2.6/ChangeLog-2.6.15 linux-2.6.15] fixes SATA problems&lt;br /&gt;
&lt;br /&gt;
03.01.2006: New [http://sourceforge.net/projects/ipw2200-ap Centrino access point driver] announced.&lt;br /&gt;
&lt;br /&gt;
06.12.2005: The new [[SMAPI support for Linux#Using the tp_smapi module|tp_smapi]] driver provides battery charging and CD speed control on recent ThinkPads.&lt;br /&gt;
&lt;br /&gt;
29.11.2005: [http://www-306.ibm.com/pc/support/site.wss/document.do?sitestyle=ibm&amp;amp;lndocid=MIGR-58597#bios New firmware] available for T43-26xx, adds option to disable [[Problem with non-ThinkPad hard disks|2010 warnings]].&lt;br /&gt;
&lt;br /&gt;
17.11.2005: [[KThinkBat|KThinkBat 0.1.3]] is a better looking battery applet for the [http://www.kde.org/ KDE]-Kicker.&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Category:T43&amp;diff=13064</id>
		<title>Category:T43</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Category:T43&amp;diff=13064"/>
		<updated>2005-12-08T17:04:50Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: hardware maintenance links changed&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 0; margin-right:10px; border: 1px solid #dfdfdf; padding: 0em 1em 1em 1em; background-color:#F8F8FF; align:right;&amp;quot;&amp;gt;&lt;br /&gt;
=== ThinkPad T43 ===&lt;br /&gt;
This pages gives an overview of all ThinkPad T43 related topics.&lt;br /&gt;
&lt;br /&gt;
Machine Type: 1871, 1872, 1875 and 1876 (Intel Graphics)&amp;lt;br&amp;gt;&lt;br /&gt;
Machine Type: 2668, 2669, 2686 and 2687 (ATI Graphics)&lt;br /&gt;
==== Standard Features ====&lt;br /&gt;
* [[Intel Pentium M (Dothan)]] 1.6, 1.73, 1.86, 2.0, 2.13 or 2.26 GHz CPU&lt;br /&gt;
* One of the following chipsets and graphics adapters:&lt;br /&gt;
** [[Intel 915GM]] chipset with integrated [[Intel Graphics Media Accelerator 900]] using shared system RAM&lt;br /&gt;
** [[Intel 915PM]] chipset and an [[ATI Mobility Radeon X300]] with 64MB on-chip dedicated RAM&lt;br /&gt;
* One of the following displays:&lt;br /&gt;
** 14.1&amp;quot; TFT display with 1024x768 resolution&lt;br /&gt;
** 14.1&amp;quot; TFT display with 1400x1050 resolution&lt;br /&gt;
** 15.0&amp;quot; TFT display with 1024x768 resolution&lt;br /&gt;
** 15.0&amp;quot; TFT display with 1400x1050 resolution&lt;br /&gt;
* 256 or 512MB [[PC2-4200]] memory standard, 2GB max&lt;br /&gt;
* 40, 60 or 80GB PATA HDD{{footnote|1}}&lt;br /&gt;
* [[AD1981B]] AC'97 Audio controller&lt;br /&gt;
* [[Ethernet Controllers|Broadcom 10/100/1000 Ethernet]]&lt;br /&gt;
* [[UltraBay|UltraBay Slim]] with one of the following:&lt;br /&gt;
** DVD-ROM&lt;br /&gt;
** DVD-ROM/CD-RW Combo&lt;br /&gt;
** DVDÂ±RW&lt;br /&gt;
* [[CDC slot]] with one of the following:&lt;br /&gt;
** [[IBM Integrated 56K Modem (MDC-2)]]&lt;br /&gt;
** [[IBM Integrated Bluetooth IV with 56K Modem (BMDC-3)]]&lt;br /&gt;
* [[MiniPCI slot]] with one of the following:&lt;br /&gt;
** none (empty)&lt;br /&gt;
** [[IBM 11a/b/g Wireless LAN Mini PCI Adapter II]]&lt;br /&gt;
** [[Intel PRO/Wireless 2200BG Mini-PCI Adapter]]&lt;br /&gt;
** [[Intel PRO/Wireless 2915ABG Mini-PCI Adapter]]&lt;br /&gt;
* [[CardBus slot]] (Type 2)&lt;br /&gt;
* [[ExpressCard slot|ExpressCard/54 slot]]&lt;br /&gt;
* [[Embedded Security Subsystem|IBM Embedded Security Subsystem 2.0]]&lt;br /&gt;
* [[Active Protection System|IBM Active Protection System]]&lt;br /&gt;
* [[Integrated Fingerprint Reader]] on select systems&lt;br /&gt;
* [[UltraNav]] (TrackPoint / Touchpad combo)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |&lt;br /&gt;
[[Image:ThinkpadT43P.JPG|ThinkPad T43]]&lt;br /&gt;
|}&lt;br /&gt;
* [http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-58837 ThinkPad T43 - Hardware Maintenance Manual (for 1xxxx models)]&lt;br /&gt;
* [http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-58791 ThinkPad T43/p - Hardware Maintenance Manual (for 2xxxx models)]&lt;br /&gt;
* [http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-58597 ThinkPad T43/p - Software and Device Drivers]&lt;br /&gt;
* [http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-50233 ThinkPad T40/p, T41/p, T42/p, T43/p - Hardware removal and installation] (instructions and '''movies''' for all major components)&lt;br /&gt;
&lt;br /&gt;
{{footnotes|&lt;br /&gt;
#While the physical disk is PATA (IDE), it is accessed through a SATA controller and a SATA-to-PATA bridge. It thus appears as a SATA device to the operating system, which casues some [[Problems with SATA and Linux|problems under Linux]]. The SATA-to-PATA bridge also necessitates drive firmware changes, causing a [[Problem with non-ThinkPad hard disks|problem with non-ThinkPad hard disks]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Models]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=TuxOnIce&amp;diff=12499</id>
		<title>TuxOnIce</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=TuxOnIce&amp;diff=12499"/>
		<updated>2005-11-17T23:13:51Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: /* Model-specific Status */ - suspend2 2.2-rc11 fixes fglrx issue&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
Software Suspend 2, also called &amp;quot;swsusp2&amp;quot; and &amp;quot;suspend2&amp;quot;, is an implementation of suspend-to-disk functionality in the form of a Linux kernel patch and several userspace utilities. It is an alternative to both the BIOS-driven hibernation feature found on most ThinkPad models, and the &amp;quot;software suspend&amp;quot; functionality built into recent Linux kernels.&lt;br /&gt;
&lt;br /&gt;
Compared to the alternatives, Software Suspend 2 has some unique [http://suspend2.net/features features]:&lt;br /&gt;
* The ability to compress the memory image as it is written to disk, thereby reducing suspend and resume times.&lt;br /&gt;
* Saving the memory image into the swap partition or a file on a normal filesystem, instead of a dedicated partition&lt;br /&gt;
* Cancelling a suspend in progress&lt;br /&gt;
* Control over amount of RAM written to disk -- can (optionally) discard cached disk blocks to reduce suspend and resume times&lt;br /&gt;
* Textual and graphical UI (optional)&lt;br /&gt;
* Improved reliability under some circumstances -- if the alternatives don't work, try this one!&lt;br /&gt;
&lt;br /&gt;
Since it is implemented purely in software, Software Suspend 2 is in principle machine-independent and should work on all modern ThinkPad models. However, in some cases problematic driver need to be unloaded before suspension.&lt;br /&gt;
&lt;br /&gt;
==Model-specific Status==&lt;br /&gt;
&lt;br /&gt;
* ThinkPad {{T43}}: works; requires SATA resume patch and the SATA drivers compiled as built-in or in initrd (see [[Problems with SATA and Linux]])&lt;br /&gt;
* ThinkPad {{T21}}: works; need to unload the sound module (&amp;lt;tt&amp;gt;snd-cs46xx&amp;lt;/tt&amp;gt;) on suspend&lt;br /&gt;
* ThinkPad {{X41T}}: works; requires SATA resume patch and the SATA drivers compiled as built-in or in initrd (see [[Problems with SATA and Linux]]) and a {{path|hibernate.conf}} fix (see [[Installing Fedora Core 4 on a ThinkPad X41 Tablet]])&lt;br /&gt;
* ThinkPad {{X22}}: works (see [[Installing Ubuntu (Breezy) on a ThinkPad X22]])&lt;br /&gt;
* ThinkPad {{G41}}: works (see [[Installing Debian on a ThinkPad G41]])&lt;br /&gt;
&lt;br /&gt;
==Installation Instructions==&lt;br /&gt;
&lt;br /&gt;
The [http://suspend2.net/ project home page] has a detailed HOWTO and FAQ.&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
* [http://suspend2.net/ Project home page]&lt;br /&gt;
&lt;br /&gt;
[[Category:Patches]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12188</id>
		<title>Script for theft alarm using HDAPS</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12188"/>
		<updated>2005-11-12T20:41:22Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: Support for negative readouts, increased threshold&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
Recent ThinkPad models include a built-in two-axis accelerometer, as part of the [[HDAPS]] feature. This accelerometer can be put to another use: as a laptop theft deterrent. The following script detects when the laptop is moved and emits a loud audio alarm. Against a casual laptop-snatcher in a populated environment (e.g., typical office space) this can be an effective deterrent.&lt;br /&gt;
&lt;br /&gt;
Note that the alarm cannot work when the laptop is suspended or powered off. You will buy an external motion detector alarm for those cases.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
&lt;br /&gt;
*hdaps module loaded (comes with kernel 2.6.14 and later)&lt;br /&gt;
*sox (SOund eXchange) sound utility&lt;br /&gt;
*aumix command line mixer&lt;br /&gt;
&lt;br /&gt;
The latter two should be included with your distribution, but check if they are installed.&lt;br /&gt;
&lt;br /&gt;
==The script==&lt;br /&gt;
&lt;br /&gt;
This Perl script periodically samples the tilt data reported by the accelerometer, computes the variance over recent samples, and triggers the alarm when the variance exceeds a given threshold.&lt;br /&gt;
&lt;br /&gt;
On an [[HDAPS]]-equipped laptop running a modern Linux installation, the script should work as is. Just run it and see (or rather, hear) what happens when you tilt your laptop. The volume and alarm sound can be adjusted at the top of the script. On a ThinkPad {{T43}}, the synthetic siren at a volume of 100 is quite ear-splitting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
# This script uses the HDAPS accelerometer found on recent ThinkPad models&lt;br /&gt;
# to emit an audio alarm when the laptop is tilted. In sufficiently&lt;br /&gt;
# populated environments, it can be used as a laptop theft deterrant.&lt;br /&gt;
#&lt;br /&gt;
# This file is placed in the public domain and may be freely distributed.&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Siren volume and content&lt;br /&gt;
&lt;br /&gt;
# Audio volume (0..100)&lt;br /&gt;
my $volume = 70;&lt;br /&gt;
&lt;br /&gt;
# Synthesize a syren for 1.0 seconds:&lt;br /&gt;
my $play_cmd = &amp;quot;sox -t nul /dev/null -t ossdsp /dev/dsp synth 1.0 sine 2000-4000 sine 4000-2000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Play a file:&lt;br /&gt;
# my $play_cmd = &amp;quot;play keep_your_hands_off_me.wav&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Other tweakables&lt;br /&gt;
&lt;br /&gt;
my $thresh = 0.20;   # tilt threshold (increase value to decrease sensitivity)&lt;br /&gt;
my $interval = 0.1;  # sampling interval in seconds&lt;br /&gt;
my $depth = 10;      # number of recent samples to analyze&lt;br /&gt;
my $pos_file='/sys/devices/platform/hdaps/position';&lt;br /&gt;
my $verbose = 1;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Code&lt;br /&gt;
&lt;br /&gt;
sub get_pos {&lt;br /&gt;
    open(POS,&amp;quot;&amp;lt;&amp;quot;,$pos_file) or die &amp;quot;Can't open HDAPS file $pos_file: $!\n&amp;quot;;&lt;br /&gt;
    $_=&amp;lt;POS&amp;gt;;&lt;br /&gt;
    m/^\((-?\d+),(-?\d+)\)$/ or die &amp;quot;Can't parse $pos_file content\n&amp;quot;;&lt;br /&gt;
    return ($1,$2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub stddev {&lt;br /&gt;
    my $sum=0;&lt;br /&gt;
    my $sumsq=0;&lt;br /&gt;
    my $n=$#_+1;&lt;br /&gt;
    for my $v (@_) {&lt;br /&gt;
	$sum += $v;&lt;br /&gt;
	$sumsq += $v*$v;&lt;br /&gt;
    }&lt;br /&gt;
    return sqrt($n*$sumsq - $sum*$sum)/($n*($n-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my (@XHIST, @YHIST);&lt;br /&gt;
my ($x,$y) = get_pos;&lt;br /&gt;
for (1..$depth) {&lt;br /&gt;
    push(@XHIST,$x);&lt;br /&gt;
    push(@YHIST,$y);&lt;br /&gt;
}&lt;br /&gt;
my $alarm_file; # flags ongoing alarm (and stores saved mixer settings)&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
    my ($x,$y) = get_pos;&lt;br /&gt;
    shift(@XHIST); push(@XHIST,$x);&lt;br /&gt;
    shift(@YHIST); push(@YHIST,$y);&lt;br /&gt;
    my $xdev = stddev(@XHIST);&lt;br /&gt;
    my $ydev = stddev(@YHIST);&lt;br /&gt;
&lt;br /&gt;
    # Print variance and history&lt;br /&gt;
    print &amp;quot;X: v=$xdev (&amp;quot;.join(',',@XHIST).&amp;quot;)  Y: v=$ydev (&amp;quot;.join(&amp;quot;,&amp;quot;,@YHIST).&amp;quot;)\n&amp;quot; if $verbose&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
    my $tilted = $xdev&amp;gt;$thresh || $ydev&amp;gt;$thresh;&lt;br /&gt;
&lt;br /&gt;
    if ($tilted &amp;amp;&amp;amp; !(defined($alarm_file) &amp;amp;&amp;amp; -f $alarm_file)) {&lt;br /&gt;
	print &amp;quot;ALARM\n&amp;quot; if $verbose&amp;gt;0;&lt;br /&gt;
	$alarm_file = `mktemp /tmp/hdaps-tilt.XXXXXXXX` or die &amp;quot;mktemp: $?&amp;quot;;&lt;br /&gt;
	chomp($alarm_file);&lt;br /&gt;
	system('/bin/bash', '-c', &amp;lt;&amp;lt;&amp;quot;EOF&amp;quot;)==0 or die &amp;quot;Failed: $?&amp;quot;;&lt;br /&gt;
( trap \&amp;quot;aumix -L -f $alarm_file &amp;gt; /dev/null; rm -f $alarm_file&amp;quot; EXIT HUP QUIT TERM&lt;br /&gt;
  aumix -S -f $alarm_file &amp;amp;&amp;amp;&lt;br /&gt;
  aumix -v $volume -w 100 &amp;amp;&amp;amp;&lt;br /&gt;
  $play_cmd) &amp;amp;&lt;br /&gt;
EOF&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    select(undef, undef, undef, $interval); # sleep&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The [[User:Thinker|author]] of the script disclaims all warranty for this script, and releases it to the public domain.&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
Features awaiting contribution:&lt;br /&gt;
* Start out quietly, and increase siren duration and volume if movement persists. Reset after a period of no movement.&lt;br /&gt;
* Automatically start and stop with screensaver (especially nifty when [[How to enable the fingerprint reader|integrated with the fingerprint reader]]). Can probably be done similarly to [http://fdd.com/software/radeon/lightwatch.pl lightwatch.pl].&lt;br /&gt;
* Report theft via network (if you get a chance to).&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12182</id>
		<title>Script for theft alarm using HDAPS</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12182"/>
		<updated>2005-11-12T19:45:44Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: Hint for screensaver&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
Recent ThinkPad models include a built-in two-axis accelerometer, as part of the [[HDAPS]] feature. This accelerometer can be put to another use: as a laptop theft deterrant. The following script detects when the laptop is moved and emits a loud audio alarm. Against a casual laptop-snatcher in a populated environment (e.g., typical office space) this can be an effective deterrant.&lt;br /&gt;
&lt;br /&gt;
Note that the alarm cannot work when the laptop is suspended or powered off. You will buy an external motion detector alarm for those cases.&lt;br /&gt;
&lt;br /&gt;
==Prerequisites==&lt;br /&gt;
&lt;br /&gt;
*hdaps module loaded (comes with kernel 2.6.14 and later)&lt;br /&gt;
*sox (SOund eXchange) sound utility&lt;br /&gt;
*aumix command line mixer&lt;br /&gt;
&lt;br /&gt;
The latter two should be included with your distribution, but check if they are installed.&lt;br /&gt;
&lt;br /&gt;
==The script==&lt;br /&gt;
&lt;br /&gt;
This Perl script periodically samples the tilt data reported by the accelerometer, computes the variance over recent samples, and triggers the alarm when the variance exceeds a given threshold.&lt;br /&gt;
&lt;br /&gt;
On an [[HDAPS]]-equipped laptop running a modern Linux installation, the script should work as is. Just run it and see (or rather, hear) what happens when you tilt your laptop. The volume and alarm sound can be adjusted at the top of the script. On a ThinkPad {{T43}}, the synthetic siren at a volume of 100 is quite ear-splitting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
# This script uses the HDAPS accelerometer found on recent ThinkPad models&lt;br /&gt;
# to emit an audio alarm when the laptop is tilted. In sufficiently&lt;br /&gt;
# populated environments, it can be used as a laptop theft deterrant.&lt;br /&gt;
#&lt;br /&gt;
# This file is placed in the public domain and may be freely distributed.&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Siren volume and content&lt;br /&gt;
&lt;br /&gt;
# Audio volume (0..100)&lt;br /&gt;
my $volume = 70;&lt;br /&gt;
&lt;br /&gt;
# Synthesize a syren for 1.0 seconds:&lt;br /&gt;
my $play_cmd = &amp;quot;sox -t nul /dev/null -t ossdsp /dev/dsp synth 1.0 sine 2000-4000 sine 4000-2000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Play a file:&lt;br /&gt;
# my $play_cmd = &amp;quot;play keep_your_hands_off_me.wav&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Other tweakables&lt;br /&gt;
&lt;br /&gt;
my $thresh = 0.15;   # tilt threshold (increase value to decrease sensitivity)&lt;br /&gt;
my $interval = 0.1;  # sampling interval in seconds&lt;br /&gt;
my $depth = 10;      # number of recent samples to analyze&lt;br /&gt;
my $pos_file='/sys/devices/platform/hdaps/position';&lt;br /&gt;
my $verbose = 1;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Code&lt;br /&gt;
&lt;br /&gt;
sub get_pos {&lt;br /&gt;
    open(POS,&amp;quot;&amp;lt;&amp;quot;,$pos_file) or die &amp;quot;Can't open HDAPS file $pos_file: $!\n&amp;quot;;&lt;br /&gt;
    $_=&amp;lt;POS&amp;gt;;&lt;br /&gt;
    m/^\((\d+),(\d+)\)$/ or die &amp;quot;Can't parse $pos_file content\n&amp;quot;;&lt;br /&gt;
    return ($1,$2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub stddev {&lt;br /&gt;
    my $sum=0;&lt;br /&gt;
    my $sumsq=0;&lt;br /&gt;
    my $n=$#_+1;&lt;br /&gt;
    for my $v (@_) {&lt;br /&gt;
	$sum += $v;&lt;br /&gt;
	$sumsq += $v*$v;&lt;br /&gt;
    }&lt;br /&gt;
    return sqrt($n*$sumsq - $sum*$sum)/($n*($n-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my (@XHIST, @YHIST);&lt;br /&gt;
my ($x,$y) = get_pos;&lt;br /&gt;
for (1..$depth) {&lt;br /&gt;
    push(@XHIST,$x);&lt;br /&gt;
    push(@YHIST,$y);&lt;br /&gt;
}&lt;br /&gt;
my $alarm_file; # flags ongoing alarm (and stores saved mixer settings)&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
    my ($x,$y) = get_pos;&lt;br /&gt;
    shift(@XHIST); push(@XHIST,$x);&lt;br /&gt;
    shift(@YHIST); push(@YHIST,$y);&lt;br /&gt;
    my $xdev = stddev(@XHIST);&lt;br /&gt;
    my $ydev = stddev(@YHIST);&lt;br /&gt;
&lt;br /&gt;
    # Print variance and history&lt;br /&gt;
    print &amp;quot;X: v=$xdev (&amp;quot;.join(',',@XHIST).&amp;quot;)  Y: v=$ydev (&amp;quot;.join(&amp;quot;,&amp;quot;,@YHIST).&amp;quot;)\n&amp;quot; if $verbose&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
    my $tilted = $xdev&amp;gt;$thresh || $ydev&amp;gt;$thresh;&lt;br /&gt;
&lt;br /&gt;
    if ($tilted &amp;amp;&amp;amp; !(defined($alarm_file) &amp;amp;&amp;amp; -f $alarm_file)) {&lt;br /&gt;
	print &amp;quot;ALARM\n&amp;quot; if $verbose&amp;gt;0;&lt;br /&gt;
	$alarm_file = `mktemp /tmp/hdaps-tilt.XXXXXXXX` or die &amp;quot;mktemp: $?&amp;quot;;&lt;br /&gt;
	chomp($alarm_file);&lt;br /&gt;
	system('/bin/bash', '-c', &amp;lt;&amp;lt;&amp;quot;EOF&amp;quot;)==0 or die &amp;quot;Failed: $?&amp;quot;;&lt;br /&gt;
( trap \&amp;quot;aumix -L -f $alarm_file &amp;gt; /dev/null; rm -f $alarm_file&amp;quot; EXIT HUP QUIT TERM&lt;br /&gt;
  aumix -S -f $alarm_file &amp;amp;&amp;amp;&lt;br /&gt;
  aumix -v $volume -w 100 &amp;amp;&amp;amp;&lt;br /&gt;
  $play_cmd) &amp;amp;&lt;br /&gt;
EOF&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    select(undef, undef, undef, $interval); # sleep&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
Features awaiting contribution:&lt;br /&gt;
* Start out quietly, and increase siren duration and volume if movement persists. Reset after a period of no movement.&lt;br /&gt;
* Automatically start and stop with screensaver (especially nifty when [[How to enable the fingerprint reader|integrated with the fingerprint reader]]). Can probably be done similarly to [http://fdd.com/software/radeon/lightwatch.pl lightwatch.pl].&lt;br /&gt;
* Report theft via network (if you get a chance to).&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Radeontool&amp;diff=12225</id>
		<title>Radeontool</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Radeontool&amp;diff=12225"/>
		<updated>2005-11-12T19:38:59Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: /* Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__TOC__&lt;br /&gt;
radeontool is a hack to turn on and off the panels background light and external video.&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
*turn background light on/off&lt;br /&gt;
*turn external video on/off&lt;br /&gt;
&lt;br /&gt;
There's also a script called [http://fdd.com/software/radeon/lightwatch.pl lightwatch.pl] available at the project homepage that turns off the background light whenever xscreensaver blanks the screen and back on when unblanked. A more sophisticated version can be found [http://web.utk.edu/~rmahurin/inspiron5100/node5.html#SECTION00055400000000000000 here].&lt;br /&gt;
&lt;br /&gt;
=== Project Homepage / Availability ===&lt;br /&gt;
http://fdd.com/software/radeon/&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
*stable and active&lt;br /&gt;
&lt;br /&gt;
=== Interesting links related to this project ===&lt;br /&gt;
*[[atitvout]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12177</id>
		<title>Script for theft alarm using HDAPS</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12177"/>
		<updated>2005-11-12T19:04:10Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: category&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
Recent ThinkPad models include a built-in two-axis accelerometer, as part of the [[HDAPS]] feature. This accelerometer can be put to another use: as a laptop theft deterrant. The following script detects when the laptop is moved and emits a loud audio alarm. Against a casual laptop-snatcher in a populated environment (e.g., typical office space) this can be an effective deterrant.&lt;br /&gt;
&lt;br /&gt;
Note that the alarm cannot work when the laptop is suspended or powered off. You will buy an external motion detector alarm for those cases.&lt;br /&gt;
&lt;br /&gt;
==The script==&lt;br /&gt;
&lt;br /&gt;
This Perl script periodically samples the tilt data reported by the accelerometer, computes the variance over recent samples, and triggers the alarn when the variance exceeds a given threshold.&lt;br /&gt;
&lt;br /&gt;
On an [[HDAPS]]-equipped laptop running a modern Linux installation, the script should work as is. Just run it and see (or rather, hear) what happens when you tilt your laptop. The volume and alarm sound can be adjusted at the top of the script. On a ThinkPad {{T43}}, the synthetic siren at a volume of 100 is quite ear-splitting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
# This script uses the HDAPS accelerometer found on recent ThinkPad models&lt;br /&gt;
# to emit an audio alarm when the laptop is tilted. In sufficiently&lt;br /&gt;
# populated environments, it can be used as a laptop theft deterrant.&lt;br /&gt;
#&lt;br /&gt;
# This file is placed in the public domain and may be freely distributed.&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Siren volume and content&lt;br /&gt;
&lt;br /&gt;
# Audio volume (0..100)&lt;br /&gt;
my $volume = 70;&lt;br /&gt;
&lt;br /&gt;
# Synthesize a syren for 1.0 seconds:&lt;br /&gt;
my $play_cmd = &amp;quot;sox -t nul /dev/null -t ossdsp /dev/dsp synth 1.0 sine 2000-4000 sine 4000-2000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Play a file:&lt;br /&gt;
# my $play_cmd = &amp;quot;play x.wav&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Other tweakables&lt;br /&gt;
&lt;br /&gt;
my $thresh = 0.15;   # tilt threshold (increase value to decrease sensitivity)&lt;br /&gt;
my $interval = 0.1;  # sampling interval in seconds&lt;br /&gt;
my $depth = 10;      # number of recent samples to analyze&lt;br /&gt;
my $pos_file='/sys/devices/platform/hdaps/position';&lt;br /&gt;
my $verbose = 1;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Code&lt;br /&gt;
&lt;br /&gt;
sub get_pos {&lt;br /&gt;
    open(POS,&amp;quot;&amp;lt;&amp;quot;,$pos_file) or die &amp;quot;Can't open HDAPS file $pos_file: $!\n&amp;quot;;&lt;br /&gt;
    $_=&amp;lt;POS&amp;gt;;&lt;br /&gt;
    m/^\((\d+),(\d+)\)$/ or die &amp;quot;Can't parse $pos_file content\n&amp;quot;;&lt;br /&gt;
    return ($1,$2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub stddev {&lt;br /&gt;
    my $sum=0;&lt;br /&gt;
    my $sumsq=0;&lt;br /&gt;
    my $n=$#_+1;&lt;br /&gt;
    for my $v (@_) {&lt;br /&gt;
	$sum += $v;&lt;br /&gt;
	$sumsq += $v*$v;&lt;br /&gt;
    }&lt;br /&gt;
    return sqrt($n*$sumsq - $sum*$sum)/($n*($n-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my (@XHIST, @YHIST);&lt;br /&gt;
my ($x,$y) = get_pos;&lt;br /&gt;
for (1..$depth) {&lt;br /&gt;
    push(@XHIST,$x);&lt;br /&gt;
    push(@YHIST,$y);&lt;br /&gt;
}&lt;br /&gt;
my $alarm_file; # flags ongoing alarm (and stores saved mixer settings)&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
    my ($x,$y) = get_pos;&lt;br /&gt;
    shift(@XHIST); push(@XHIST,$x);&lt;br /&gt;
    shift(@YHIST); push(@YHIST,$y);&lt;br /&gt;
    my $xdev = stddev(@XHIST);&lt;br /&gt;
    my $ydev = stddev(@YHIST);&lt;br /&gt;
&lt;br /&gt;
    # Print variance and history&lt;br /&gt;
    print &amp;quot;X: v=$xdev (&amp;quot;.join(',',@XHIST).&amp;quot;)  Y: v=$ydev (&amp;quot;.join(&amp;quot;,&amp;quot;,@YHIST).&amp;quot;)\n&amp;quot; if $verbose&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
    my $tilted = $xdev&amp;gt;$thresh || $ydev&amp;gt;$thresh;&lt;br /&gt;
&lt;br /&gt;
    if ($tilted &amp;amp;&amp;amp; !(defined($alarm_file) &amp;amp;&amp;amp; -f $alarm_file)) {&lt;br /&gt;
	print &amp;quot;ALARM\n&amp;quot; if $verbose&amp;gt;0;&lt;br /&gt;
	$alarm_file = `mktemp /tmp/hdaps-tilt.XXXXXXXX` or die &amp;quot;mktemp: $?&amp;quot;;&lt;br /&gt;
	chomp($alarm_file);&lt;br /&gt;
	system('/bin/bash', '-c', &amp;lt;&amp;lt;&amp;quot;EOF&amp;quot;)==0 or die &amp;quot;Failed: $?&amp;quot;;&lt;br /&gt;
( trap \&amp;quot;aumix -L -f $alarm_file &amp;gt; /dev/null; rm -f $alarm_file&amp;quot; EXIT HUP QUIT TERM&lt;br /&gt;
  aumix -S -f $alarm_file &amp;amp;&amp;amp;&lt;br /&gt;
  aumix -v $volume -w 100 &amp;amp;&amp;amp;&lt;br /&gt;
  $play_cmd) &amp;amp;&lt;br /&gt;
EOF&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    select(undef, undef, undef, $interval); # sleep&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
Features awaiting contribution:&lt;br /&gt;
* Start out quietly, and increase siren duration and volume if movement persists. Reset after a period of no movement.&lt;br /&gt;
* Automatically start and stop with screensaver (especially nifty when [[How to enable the fingerprint reader|integrated with the fingerprint reader]]).&lt;br /&gt;
* Report theft via network (if you get a chance to).&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12174</id>
		<title>Script for theft alarm using HDAPS</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Script_for_theft_alarm_using_HDAPS&amp;diff=12174"/>
		<updated>2005-11-12T18:56:35Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: OK, now we have prior art when someone tries to patent this.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==General==&lt;br /&gt;
&lt;br /&gt;
Recent ThinkPad models include a built-in two-axis accelerometer, as part of the [[HDAPS]] feature. This accelerometer can be put to another use: as a laptop theft deterrant. The following script detects when the laptop is moved and emits a loud audio alarm. Against a casual laptop-snatcher in a populated environment (e.g., typical office space) this can be an effective deterrant.&lt;br /&gt;
&lt;br /&gt;
Note that the alarm cannot work when the laptop is suspended or powered off. You will buy an external motion detector alarm for those cases.&lt;br /&gt;
&lt;br /&gt;
==The script==&lt;br /&gt;
&lt;br /&gt;
This Perl script periodically samples the tilt data reported by the accelerometer, computes the variance over recent samples, and triggers the alarn when the variance exceeds a given threshold.&lt;br /&gt;
&lt;br /&gt;
On an [[HDAPS]]-equipped laptop running a modern Linux installation, the script should work as is. Just run it and see (or rather, hear) what happens when you tilt your laptop. The volume and alarm sound can be adjusted at the top of the script. On a ThinkPad {{T43}}, the synthetic siren at a volume of 100 is quite ear-splitting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/usr/bin/perl&lt;br /&gt;
#&lt;br /&gt;
# This script uses the HDAPS accelerometer found on recent ThinkPad models&lt;br /&gt;
# to emit an audio alarm when the laptop is tilted. In sufficiently&lt;br /&gt;
# populated environments, it can be used as a laptop theft deterrant.&lt;br /&gt;
#&lt;br /&gt;
# This file is placed in the public domain and may be freely distributed.&lt;br /&gt;
&lt;br /&gt;
use strict;&lt;br /&gt;
use warnings;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Siren volume and content&lt;br /&gt;
&lt;br /&gt;
# Audio volume (0..100)&lt;br /&gt;
my $volume = 70;&lt;br /&gt;
&lt;br /&gt;
# Synthesize a syren for 1.0 seconds:&lt;br /&gt;
my $play_cmd = &amp;quot;sox -t nul /dev/null -t ossdsp /dev/dsp synth 1.0 sine 2000-4000 sine 4000-2000&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
# Play a file:&lt;br /&gt;
# my $play_cmd = &amp;quot;play x.wav&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Other tweakables&lt;br /&gt;
&lt;br /&gt;
my $thresh = 0.15;   # tilt threshold (increase value to decrease sensitivity)&lt;br /&gt;
my $interval = 0.1;  # sampling interval in seconds&lt;br /&gt;
my $depth = 10;      # number of recent samples to analyze&lt;br /&gt;
my $pos_file='/sys/devices/platform/hdaps/position';&lt;br /&gt;
my $verbose = 1;&lt;br /&gt;
&lt;br /&gt;
##############################&lt;br /&gt;
# Code&lt;br /&gt;
&lt;br /&gt;
sub get_pos {&lt;br /&gt;
    open(POS,&amp;quot;&amp;lt;&amp;quot;,$pos_file) or die &amp;quot;Can't open HDAPS file $pos_file: $!\n&amp;quot;;&lt;br /&gt;
    $_=&amp;lt;POS&amp;gt;;&lt;br /&gt;
    m/^\((\d+),(\d+)\)$/ or die &amp;quot;Can't parse $pos_file content\n&amp;quot;;&lt;br /&gt;
    return ($1,$2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sub stddev {&lt;br /&gt;
    my $sum=0;&lt;br /&gt;
    my $sumsq=0;&lt;br /&gt;
    my $n=$#_+1;&lt;br /&gt;
    for my $v (@_) {&lt;br /&gt;
	$sum += $v;&lt;br /&gt;
	$sumsq += $v*$v;&lt;br /&gt;
    }&lt;br /&gt;
    return sqrt($n*$sumsq - $sum*$sum)/($n*($n-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
my (@XHIST, @YHIST);&lt;br /&gt;
my ($x,$y) = get_pos;&lt;br /&gt;
for (1..$depth) {&lt;br /&gt;
    push(@XHIST,$x);&lt;br /&gt;
    push(@YHIST,$y);&lt;br /&gt;
}&lt;br /&gt;
my $alarm_file; # flags ongoing alarm (and stores saved mixer settings)&lt;br /&gt;
&lt;br /&gt;
while (1) {&lt;br /&gt;
    my ($x,$y) = get_pos;&lt;br /&gt;
    shift(@XHIST); push(@XHIST,$x);&lt;br /&gt;
    shift(@YHIST); push(@YHIST,$y);&lt;br /&gt;
    my $xdev = stddev(@XHIST);&lt;br /&gt;
    my $ydev = stddev(@YHIST);&lt;br /&gt;
&lt;br /&gt;
    # Print variance and history&lt;br /&gt;
    print &amp;quot;X: v=$xdev (&amp;quot;.join(',',@XHIST).&amp;quot;)  Y: v=$ydev (&amp;quot;.join(&amp;quot;,&amp;quot;,@YHIST).&amp;quot;)\n&amp;quot; if $verbose&amp;gt;1;&lt;br /&gt;
&lt;br /&gt;
    my $tilted = $xdev&amp;gt;$thresh || $ydev&amp;gt;$thresh;&lt;br /&gt;
&lt;br /&gt;
    if ($tilted &amp;amp;&amp;amp; !(defined($alarm_file) &amp;amp;&amp;amp; -f $alarm_file)) {&lt;br /&gt;
	print &amp;quot;ALARM\n&amp;quot; if $verbose&amp;gt;0;&lt;br /&gt;
	$alarm_file = `mktemp /tmp/hdaps-tilt.XXXXXXXX` or die &amp;quot;mktemp: $?&amp;quot;;&lt;br /&gt;
	chomp($alarm_file);&lt;br /&gt;
	system('/bin/bash', '-c', &amp;lt;&amp;lt;&amp;quot;EOF&amp;quot;)==0 or die &amp;quot;Failed: $?&amp;quot;;&lt;br /&gt;
( trap \&amp;quot;aumix -L -f $alarm_file &amp;gt; /dev/null; rm -f $alarm_file&amp;quot; EXIT HUP QUIT TERM&lt;br /&gt;
  aumix -S -f $alarm_file &amp;amp;&amp;amp;&lt;br /&gt;
  aumix -v $volume -w 100 &amp;amp;&amp;amp;&lt;br /&gt;
  $play_cmd) &amp;amp;&lt;br /&gt;
EOF&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    select(undef, undef, undef, $interval); # sleep&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==To do==&lt;br /&gt;
Features awaiting contribution:&lt;br /&gt;
* Start out quietly, and increase siren duration and volume if movement persists. Reset after a period of no movement.&lt;br /&gt;
* Automatically start and stop with screensaver (especially nifty when [[How to enable the fingerprint reader|integrated with the fingerprint reader]]).&lt;br /&gt;
* Report theft via network (if you get a chance to).&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Patch_for_controlling_fan_speed&amp;diff=11467</id>
		<title>Patch for controlling fan speed</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Patch_for_controlling_fan_speed&amp;diff=11467"/>
		<updated>2005-10-29T13:32:30Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Overview==&lt;br /&gt;
&lt;br /&gt;
This patch extends the [[ibm-acpi]] Linux kernel module to control fan speed. It can be used to reduce [[Problem with fan noise|fan noise]] (both speed and pulsing) and to decrease fan power consumption.&lt;br /&gt;
&lt;br /&gt;
When this patch is applied and the &amp;lt;tt&amp;gt;ibm-acpi&amp;lt;/tt&amp;gt; module is loaded with the &amp;lt;tt&amp;gt;experimental=1&amp;lt;/tt&amp;gt; module parameter, the following new capabilities are added to {{path|/proc/acpi/ibm/fan}}:&lt;br /&gt;
* {{cmdroot|echo level LEVEL &amp;gt; /proc/acpi/ibm/fan}} sets a fan speed level between 0 and 7, where &amp;lt;tt&amp;gt;LEVEL&amp;lt;/TT&amp;gt;=0 means fan off and &amp;lt;tt&amp;gt;LEVEL&amp;lt;/tt&amp;gt;=7 is the fastest speed.&lt;br /&gt;
* {{cmdroot|echo level auto &amp;gt; /proc/acpi/ibm/fan}} tells the embedded controller to set the fan speed automatically according to system temperatures (this is the default).&lt;br /&gt;
* {{cmdroot|echo level disengaged &amp;gt; /proc/acpi/ibm/fan}} tells the embedded controller to disengage fan speed control (see specs below).&lt;br /&gt;
* {{cmdroot|cat /proc/acpi/ibm/fan}} shows the current fan level (in addition to the fan speed in RPM).&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
 '''#cat /proc/acpi/ibm/fan'''&lt;br /&gt;
 status:         enabled&lt;br /&gt;
 level:          auto&lt;br /&gt;
 speed:          4219&lt;br /&gt;
 commands:       enable, disable, level &amp;lt;level&amp;gt;&lt;br /&gt;
                 (&amp;lt;level&amp;gt; is 0-7, auto or disengaged)&lt;br /&gt;
 &lt;br /&gt;
 '''#echo level 2 &amp;gt; /proc/acpi/ibm/fan'''&lt;br /&gt;
 &lt;br /&gt;
 '''#cat /proc/acpi/ibm/fan'''&lt;br /&gt;
 status:         enabled&lt;br /&gt;
 level:          2&lt;br /&gt;
 speed:          3142&lt;br /&gt;
 commands:       enable, disable, level &amp;lt;level&amp;gt;&lt;br /&gt;
                 (&amp;lt;level&amp;gt; is 0-7, auto or disengaged)&lt;br /&gt;
&lt;br /&gt;
This patch is best used with an [[ACPI fan control script#Variable speed control scripts|ACPI fan control script]] that monitors system temperature and sets the fan speed accordingly.&lt;br /&gt;
&lt;br /&gt;
{{WARN|Overriding the system's automatic temperature control may cause permanent hardware damage. Even when using temperature monitoring software, it is not clear whether the software can access all temperature sensor accessible to the embedded controller and understand them correctly. Moreover, this patch relies on an undocumented hardware interface, and may thus have arbitrary effects (especially on models it wasn't tested on).}}&lt;br /&gt;
&lt;br /&gt;
==Models on which this patch works==&lt;br /&gt;
&lt;br /&gt;
* ThinkPad {{T43}}, {{T43p}}&amp;lt;br /&amp;gt;(levels 1-2 = ~3300RPM, level 3-5 = ~4100RPM, level 6-7 = ~4700 RPM; disengaged mode works)&lt;br /&gt;
&lt;br /&gt;
Probably many other models; please update this page with your results.&lt;br /&gt;
&lt;br /&gt;
==Models on which this patch doesn't work==&lt;br /&gt;
&lt;br /&gt;
* ThinkPad {{560}}, {{600E}}, {{600X}}, {{770E}}, {{770X}} (these use a different fan control interface)&lt;br /&gt;
&lt;br /&gt;
==The patch==&lt;br /&gt;
&lt;br /&gt;
This also includes a minor fix (rename of &amp;lt;tt&amp;gt;device_add&amp;lt;/tt&amp;gt;) to make [[ibm-acpi]] 0.11 compile on kernel 2.6.13.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
--- ibm-acpi-0.11-orig/ibm_acpi.c	2005-03-17 12:06:16.000000000 +0200&lt;br /&gt;
+++ ibm-acpi-0.11/ibm_acpi.c	2005-10-26 06:21:57.000000000 +0200&lt;br /&gt;
@@ -1488,11 +1488,18 @@ static int fan_read(char *p)&lt;br /&gt;
 	} else {&lt;br /&gt;
 		/* all except 570, 600e/x, 770e, 770x */&lt;br /&gt;
 		if (!acpi_ec_read(fan_status_offset, &amp;amp;status))&lt;br /&gt;
 			len += sprintf(p + len, &amp;quot;status:\t\tunreadable\n&amp;quot;);&lt;br /&gt;
-		else&lt;br /&gt;
+		else {&lt;br /&gt;
 			len += sprintf(p + len, &amp;quot;status:\t\t%s\n&amp;quot;,&lt;br /&gt;
-				       enabled(status, 7));&lt;br /&gt;
+			              status ? &amp;quot;enabled&amp;quot; : &amp;quot;disabled&amp;quot;);&lt;br /&gt;
+			if (status &amp;amp; 0x40)&lt;br /&gt;
+				len += sprintf(p + len, &amp;quot;level:\t\tdisengaged\n&amp;quot;);&lt;br /&gt;
+			else if (status &amp;amp; 0x80)&lt;br /&gt;
+				len += sprintf(p + len, &amp;quot;level:\t\tauto\n&amp;quot;);&lt;br /&gt;
+			else&lt;br /&gt;
+				len += sprintf(p + len, &amp;quot;level:\t\t%d\n&amp;quot;, status);&lt;br /&gt;
+		}&lt;br /&gt;
 &lt;br /&gt;
 		if (!acpi_ec_read(fan_rpm_offset,     &amp;amp;lo) ||&lt;br /&gt;
 		    !acpi_ec_read(fan_rpm_offset + 1, &amp;amp;hi))&lt;br /&gt;
 			len += sprintf(p + len, &amp;quot;speed:\t\tunreadable\n&amp;quot;);&lt;br /&gt;
@@ -1506,9 +1513,12 @@ static int fan_read(char *p)&lt;br /&gt;
 		len += sprintf(p + len, &amp;quot;commands:\tlevel &amp;lt;level&amp;gt;&amp;quot;&lt;br /&gt;
 			       &amp;quot; (&amp;lt;level&amp;gt; is 0-7)\n&amp;quot;);&lt;br /&gt;
 	if (!gfan_handle)&lt;br /&gt;
 		/* all except 570, 600e/x, 770e, 770x */&lt;br /&gt;
-		len += sprintf(p + len, &amp;quot;commands:\tenable, disable\n&amp;quot;);&lt;br /&gt;
+		len += sprintf(p + len, &lt;br /&gt;
+		              &amp;quot;commands:\tenable, disable, level &amp;lt;level&amp;gt;\n&amp;quot;&lt;br /&gt;
+		              &amp;quot;         \t(&amp;lt;level&amp;gt; is 0-7, auto&amp;quot;&lt;br /&gt;
+		              &amp;quot;or disengaged)\n&amp;quot;);&lt;br /&gt;
 	if (fans_handle)&lt;br /&gt;
 		/* X31, X40 */&lt;br /&gt;
 		len += sprintf(p + len, &amp;quot;commands:\tspeed &amp;lt;speed&amp;gt;&amp;quot;&lt;br /&gt;
 			       &amp;quot; (&amp;lt;speed&amp;gt; is 0-65535)\n&amp;quot;);&lt;br /&gt;
@@ -1528,17 +1538,29 @@ static int fan_write(char *buf)&lt;br /&gt;
 			/* 570, 770x-JL */&lt;br /&gt;
 			if (!acpi_evalf(sfan_handle, NULL, NULL, &amp;quot;vd&amp;quot;, level))&lt;br /&gt;
 				return -EIO;&lt;br /&gt;
 		} else if (!gfan_handle &amp;amp;&amp;amp;&lt;br /&gt;
-			   strlencmp(cmd, &amp;quot;enable&amp;quot;) == 0) {&lt;br /&gt;
+			   ( (strlencmp(cmd, &amp;quot;enable&amp;quot;) == 0) ||&lt;br /&gt;
+			     (strlencmp(cmd, &amp;quot;level auto&amp;quot;) == 0) ) ) {&lt;br /&gt;
 			/* all except 570, 600e/x, 770e, 770x */&lt;br /&gt;
 			if (!acpi_ec_write(fan_status_offset, 0x80))&lt;br /&gt;
 				return -EIO;&lt;br /&gt;
 		} else if (!gfan_handle &amp;amp;&amp;amp;&lt;br /&gt;
 			   strlencmp(cmd, &amp;quot;disable&amp;quot;) == 0) {&lt;br /&gt;
 			/* all except 570, 600e/x, 770e, 770x */&lt;br /&gt;
 			if (!acpi_ec_write(fan_status_offset, 0x00))&lt;br /&gt;
 				return -EIO;&lt;br /&gt;
+		} else if (!gfan_handle &amp;amp;&amp;amp;&lt;br /&gt;
+			   strlencmp(cmd, &amp;quot;level disengaged&amp;quot;) == 0) {&lt;br /&gt;
+			/* all except 570, 600e/x, 770e, 770x */&lt;br /&gt;
+			if (!acpi_ec_write(fan_status_offset, 0x40))&lt;br /&gt;
+				return -EIO;&lt;br /&gt;
+		} else if (!gfan_handle &amp;amp;&amp;amp;&lt;br /&gt;
+		    sscanf(cmd, &amp;quot;level %d&amp;quot;, &amp;amp;level) == 1 &amp;amp;&amp;amp;&lt;br /&gt;
+		    level &amp;gt;=0 &amp;amp;&amp;amp; level &amp;lt;= 7) {&lt;br /&gt;
+			/* all except 570, 600e/x, 770e, 770x */&lt;br /&gt;
+			if (!acpi_ec_write(fan_status_offset, level))&lt;br /&gt;
+				return -EIO;&lt;br /&gt;
 		} else if (fans_handle &amp;amp;&amp;amp;&lt;br /&gt;
 		    sscanf(cmd, &amp;quot;speed %d&amp;quot;, &amp;amp;speed) == 1 &amp;amp;&amp;amp;&lt;br /&gt;
 		    speed &amp;gt;= 0 &amp;amp;&amp;amp; speed &amp;lt;= 65535) {&lt;br /&gt;
 			/* X31, X40 */&lt;br /&gt;
@@ -1751,9 +1773,9 @@ static int __init setup_notify(struct ib&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
-static int device_add(struct acpi_device *device)&lt;br /&gt;
+static int ibmacpi_device_add(struct acpi_device *device)&lt;br /&gt;
 {&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
@@ -1769,9 +1791,9 @@ static int __init register_driver(struct&lt;br /&gt;
 &lt;br /&gt;
 	memset(ibm-&amp;gt;driver, 0, sizeof(struct acpi_driver));&lt;br /&gt;
 	sprintf(ibm-&amp;gt;driver-&amp;gt;name, &amp;quot;%s/%s&amp;quot;, IBM_NAME, ibm-&amp;gt;name);&lt;br /&gt;
 	ibm-&amp;gt;driver-&amp;gt;ids = ibm-&amp;gt;hid;&lt;br /&gt;
-	ibm-&amp;gt;driver-&amp;gt;ops.add = &amp;amp;device_add;&lt;br /&gt;
+	ibm-&amp;gt;driver-&amp;gt;ops.add = &amp;amp;ibmacpi_device_add;&lt;br /&gt;
 &lt;br /&gt;
 	ret = acpi_bus_register_driver(ibm-&amp;gt;driver);&lt;br /&gt;
 	if (ret &amp;lt; 0) {&lt;br /&gt;
 		printk(IBM_ERR &amp;quot;acpi_bus_register_driver(%s) failed: %d\n&amp;quot;,&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Hardware specs==&lt;br /&gt;
&lt;br /&gt;
The patch relies on the following hardware behavior, which was discovered experimentally and neither provided by nor confirmed by IBM/Lenovo. The following description may be inaccurate and may vary by model (see list of models above). The terminology probably does not match the one used by IBM/Lenovo engineers.&lt;br /&gt;
&lt;br /&gt;
ACPI DSDT register _SB.PCI0.LPC.EC.HFSP (8 bits, offset 0x2F in the &amp;lt;tt&amp;gt;EmbeddedController&amp;lt;/tt&amp;gt; address space) &lt;br /&gt;
is read/writable and has the following meaning:&lt;br /&gt;
 &lt;br /&gt;
  7 6 5 4 3 2 1 0&lt;br /&gt;
  | | \_________/&lt;br /&gt;
  | |      |&lt;br /&gt;
  | |      +--------- manual fan speed level (0=disable, 1=min, ..., 7=max)&lt;br /&gt;
  | +---------------- disengaged (0=normal, 1=disengaged, overrides all)&lt;br /&gt;
  +------------------ automatic fan speed control (0=manual, 1=automatic, overrides manual)&lt;br /&gt;
&lt;br /&gt;
Manual speed levels 8-63 yield the same behavior as level 7, and the the ACPI DSDT uses level 7 for the emergency mode it enters upon critical CPU/GPU temperature, so apparently 7 is the real maximum level.&lt;br /&gt;
&lt;br /&gt;
When bit 7 is on, the embedded controller sets the fan speed automatically according to system temperaturesand some unknown algorithm. This overrides manual control.&lt;br /&gt;
&lt;br /&gt;
When bit 6 is on, the embedded controller does not read the fan RPM (hence &amp;lt;tt&amp;gt;EmbeddedController&amp;lt;/tt&amp;gt; offset 0x84 is not updated), and does not maintain a stable fan speed. This overrides manual and automatic control. When disengaged mode is entered the fan speed is not immediately changed (except if the fan was disabed, in which case it is turned on at a low level). However, once in disengaged mode, fan speed will slowly increase to ''beyond'' the maximum manual level (this may cause hardware damage!).&lt;br /&gt;
&lt;br /&gt;
{{HINT|Apparently the [[Problem with fan noise|pulsing fan noise]] experienced by some users can be cured by repeatedly running 2-4 seconds of manual control followed by 0.5-1 seconds of disengaged mode. The pulse occurs when the the embedded controller computes the fan speed and adjusts the fan voltage adaptively every few seconds (~4.8sec for the ThinkPad T43); the aforementioned mode switching doesn't give it a chance to do so. One of the [[ACPI fan control script#Variable speed control scripts|ACPI fan control scripts]] implements this solution.}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Patches]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Rovclock&amp;diff=11211</id>
		<title>Rovclock</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Rovclock&amp;diff=11211"/>
		<updated>2005-10-26T17:14:41Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: /* Stable clockrates */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Generel==&lt;br /&gt;
Rovclock is a utility to control frequency rates of your Radeon card.&lt;br /&gt;
&lt;br /&gt;
It is very helpfull for underclocking the Radeon chip in order to save power when running on batteries. Also, by underclocking it is possible to prevent the fan from running.&lt;br /&gt;
&lt;br /&gt;
It can also be used to gain performance by overclocking.&lt;br /&gt;
&lt;br /&gt;
==Features==&lt;br /&gt;
Used to under-/overclock Radeon gfx-cards.&lt;br /&gt;
* Controls GPU core frequency&lt;br /&gt;
* Controls gfx-memory frequency&lt;br /&gt;
&lt;br /&gt;
== Project Homepage / Availability ==&lt;br /&gt;
* Homepage: http://www.hasw.net/linux/&lt;br /&gt;
&lt;br /&gt;
==Usage==&lt;br /&gt;
*Set the core frequency (-c) to 100 Mhz and the memory frequency (-m) to 120 Mhz.&lt;br /&gt;
:{{cmduser|sudo rovclock -c 100 -m 120}}&lt;br /&gt;
*Get current frequencies among other information (-i).&lt;br /&gt;
:{{cmduser|sudo rovclock -i}}&lt;br /&gt;
&lt;br /&gt;
==Stable clockrates==&lt;br /&gt;
* {{T42}}, Radeon 7500&amp;lt;br /&amp;gt;NOTE: Setting the memory under 100Mhz may hang your card.&lt;br /&gt;
** LCD: 100MHz core, 120MHz memory.&lt;br /&gt;
** Using DVI output on Port replicator: 100Mhz core, 180MHz memory.&lt;br /&gt;
* {{T43}} with [[ATI Mobility Radeon X300]]: the following settings are used by ATI's Windows driver:&lt;br /&gt;
** &amp;quot;Optimal performance&amp;quot; (default): 297MHz core, 229.5MHz memory.&lt;br /&gt;
** &amp;quot;Balanced&amp;quot;: 209.255MHz core, 182.25 memory.&lt;br /&gt;
** &amp;quot;Optimal battery life&amp;quot;: 104.63MHz core, 121.5MHz memory&amp;lt;br /&amp;gt;Compared to the default setting, this reduces idle power consumption by approximately 300mW, and GPU temperature by 3-4 degrees. There is no noticable difference in 2D performance using the &amp;lt;tt&amp;gt;radeon&amp;lt;/tt&amp;gt; driver.&amp;lt;br /&amp;gt;Further reduction of either clock leads to display corruption.&lt;br /&gt;
&lt;br /&gt;
== Interesting links related to this project ==&lt;br /&gt;
*[http://forums.gentoo.org/viewtopic-t-343029.html Gentoo forum discussion]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:Tools]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Category:T43&amp;diff=11070</id>
		<title>Category:T43</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Category:T43&amp;diff=11070"/>
		<updated>2005-10-26T16:42:30Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: /* Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 0; margin-right:10px; border: 1px solid #dfdfdf; padding: 0em 1em 1em 1em; background-color:#F8F8FF; align:right;&amp;quot;&amp;gt;&lt;br /&gt;
=== ThinkPad T43 ===&lt;br /&gt;
This pages gives an overview of all ThinkPad T43 related topics.&lt;br /&gt;
&lt;br /&gt;
Machine Type: 1871, 1872, 1875 and 1876 (Intel Graphics)&amp;lt;br&amp;gt;&lt;br /&gt;
Machine Type: 2668, 2669, 2686 and 2687 (ATI Graphics)&lt;br /&gt;
==== Features ====&lt;br /&gt;
* [[Intel Pentium M (Dothan)]] 1.6, 1.73, 1.86 or 2.0 GHz CPU&lt;br /&gt;
* One of the following chipsets and graphics adapters:&lt;br /&gt;
** [[Intel 915GM]] chipset with integrated [[Intel Graphics Media Accelerator 900]] using shared system RAM&lt;br /&gt;
** [[Intel 915PM]] chipset and an [[ATI Mobility Radeon X300]] with 64MB on-chip dedicated RAM&lt;br /&gt;
* One of the following displays:&lt;br /&gt;
** 14.1&amp;quot; TFT display with 1024x768 resolution&lt;br /&gt;
** 14.1&amp;quot; TFT display with 1400x1050 resolution&lt;br /&gt;
** 15.0&amp;quot; TFT display with 1024x768 resolution&lt;br /&gt;
** 15.0&amp;quot; TFT display with 1400x1050 resolution&lt;br /&gt;
* 256 or 512MB memory standard, 2GB max (PC2-4200 533MHz DDR2 non-parity CL4 200-pin SO-DIMM, two sockets, dual-channel capable)&lt;br /&gt;
* 40, 60 or 80GB PATA HDD{{footnote|1}}&lt;br /&gt;
* [[AD1981B|AD1981B AC'97 Audio controller]]&lt;br /&gt;
* [[Ethernet Controllers|Broadcom 10/100/1000 Ethernet]]&lt;br /&gt;
* [[UltraBay|UltraBay Slim]] with one of the following:&lt;br /&gt;
** DVD-ROM&lt;br /&gt;
** DVD-ROM/CD-RW Combo&lt;br /&gt;
** DVDÂ±RW&lt;br /&gt;
* CDC slot with one of the following:&lt;br /&gt;
** [[IBM Integrated 56K Modem (MDC-2)]]&lt;br /&gt;
** [[IBM Integrated Bluetooth IV with 56K Modem (BMDC-3)]]&lt;br /&gt;
* MiniPCI slot with one of the following:&lt;br /&gt;
** none (empty)&lt;br /&gt;
** [[IBM 11a/b/g Wireless LAN Mini PCI Adapter II]]&lt;br /&gt;
** [[Intel PRO/Wireless 2200BG Mini-PCI Adapter]]&lt;br /&gt;
** [[Intel PRO/Wireless 2915ABG Mini-PCI Adapter]]&lt;br /&gt;
* [[CardBus slot]] (Type 2)&lt;br /&gt;
* [[ExpressCard slot|ExpressCard/54 slot]]&lt;br /&gt;
* [[Embedded Security Subsystem|IBM Embedded Security Subsystem 2.0]]&lt;br /&gt;
* [[Active Protection System|IBM Active Protection System]]&lt;br /&gt;
* [[Integrated Fingerprint Reader]] on select systems&lt;br /&gt;
* [[UltraNav]] (TrackPoint / Touchpad combo)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |&lt;br /&gt;
[[Image:ThinkpadT43P.JPG|ThinkPad T43]]&lt;br /&gt;
|}&lt;br /&gt;
* [ftp://ftp.software.ibm.com/pc/pccbbs/mobiles_pdf/27r0949.pdf ThinkPad T43 - Hardware Maintenance Manual (for 1XXX series T43s) (February 2005)] (4,461,520 Bytes)&lt;br /&gt;
* [ftp://ftp.software.ibm.com/pc/pccbbs/mobiles_pdf/27r0700.pdf ThinkPad T43/p - Hardware Maintenance Manual (for 2XXX series T43s) (January 2005)] (4,534,423 Bytes)&lt;br /&gt;
* [http://www-307.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-58597 ThinkPad T43/p - Software and Device Drivers]&lt;br /&gt;
&lt;br /&gt;
{{footnotes|&lt;br /&gt;
#While the physical disk is PATA (IDE), it is accessed through a SATA controller and a SATA-to-PATA bridge. It thus appears as a SATA device to the operating system, which casues some [[Problems with SATA and Linux|problems under Linux]]. The SATA-to-PATA bridge also necessitates drive firmware changes, causing a [[Problem with non-ThinkPad hard disks|problem with non-ThinkPad hard disks]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Models]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Problem_with_fan_noise&amp;diff=11293</id>
		<title>Problem with fan noise</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Problem_with_fan_noise&amp;diff=11293"/>
		<updated>2005-10-26T16:20:53Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: The term &amp;quot;pulsing&amp;quot; has been used in forums. Updated status.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Information about the fan noise problem in Thinkpad models from 2003/2004/2005.&lt;br /&gt;
&lt;br /&gt;
==Problem description==&lt;br /&gt;
&lt;br /&gt;
There seem to be two different occurances of the problem (or two different problems).&lt;br /&gt;
&lt;br /&gt;
===Acceleration (pulsing) problem:===&lt;br /&gt;
The Thinkpad fan briefly accelerates in regular intervals every few seconds, causing an annoying pulsing noise.&lt;br /&gt;
&lt;br /&gt;
===Always-on problem:===&lt;br /&gt;
The Fan is always on, even though the processor is rather cool.&lt;br /&gt;
&lt;br /&gt;
==Affected Models==&lt;br /&gt;
&lt;br /&gt;
===Acceleration (pulsing) problem:===&lt;br /&gt;
*ThinkPad {{R40}}&lt;br /&gt;
*ThinkPad {{T40}}, {{T40p}}, {{T41}}, {{T42}}(?)&lt;br /&gt;
&lt;br /&gt;
===Always-on problem:===&lt;br /&gt;
*ThinkPad {{600X}}&lt;br /&gt;
*ThinkPad {{770X}}&lt;br /&gt;
*ThinkPad {{A31p}}&lt;br /&gt;
*ThinkPad {{R32}}, {{R50}}, {{R50p}}, {{R51}}, {{R52}}&lt;br /&gt;
*ThinkPad {{T40}}, {{T40p}}, {{T41}}, {{T41p}}, {{T42}}, {{T42p}}, {{T43}}, {{T43p}}&lt;br /&gt;
*ThinkPad {{X32}}, {{X40}}, {{X41}}&lt;br /&gt;
&lt;br /&gt;
==Affected Operating Systems==&lt;br /&gt;
&lt;br /&gt;
===Acceleration (pulsing) problem:===&lt;br /&gt;
*Linux, all flavours&lt;br /&gt;
&lt;br /&gt;
===Always-on problem:===&lt;br /&gt;
*Linux, all flavours&lt;br /&gt;
*FreeBSD 5.3&lt;br /&gt;
*OpenBSD 3.7 (Tested with X40)&lt;br /&gt;
*Windows XP&lt;br /&gt;
*Windows 2000 pro&lt;br /&gt;
&lt;br /&gt;
==Status==&lt;br /&gt;
&lt;br /&gt;
===Acceleration (pulsing) problem:===&lt;br /&gt;
For some models, IBM released an update to the embedded controller program that seems to at least partially solve this problem:&lt;br /&gt;
&lt;br /&gt;
 Version 3.03 - 1RHT70WW&lt;br /&gt;
 NOTE: This version of Embedded Controller Program will only work with BIOS Version 3.06f (or higher).&lt;br /&gt;
    * (Fix) Reduced Fan noise in some models.&lt;br /&gt;
&lt;br /&gt;
The update can be found here: http://www-306.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-50279&lt;br /&gt;
&lt;br /&gt;
For other models (e.g., ThinkPad {{T43}}), a workaround can be implemented through an [[ACPI fan control script]] and the [[patch for controlling fan speed]]&lt;br /&gt;
&lt;br /&gt;
===Always-on problem:===&lt;br /&gt;
The problem is yet unsolved. But see the partial fix below.&lt;br /&gt;
&lt;br /&gt;
IBM made a statement regarding this on their homepage:&lt;br /&gt;
http://www-307.ibm.com/pc/support/site.wss/MIGR-56504.html&lt;br /&gt;
&lt;br /&gt;
It seems that it's a feature of centrino - http://mailman.linux-thinkpad.org/pipermail/linux-thinkpad/2004-September/019737.html&lt;br /&gt;
Perhaps it's fixable by adding the fans and temps to the dsdt?&lt;br /&gt;
&lt;br /&gt;
==Solutions==&lt;br /&gt;
&lt;br /&gt;
===Acceleration problem:===&lt;br /&gt;
&lt;br /&gt;
====Replacing the fan====&lt;br /&gt;
Some people reported that they replaced the original fan against one of a similar notebook without the problem has worked for them, i.e. changing a {{T41}}s fan against one from a {{T41p}}.&lt;br /&gt;
&lt;br /&gt;
====BIOS upgrade====&lt;br /&gt;
You can try upgrading your embedded controller program to version 3.03 or newer.&lt;br /&gt;
&lt;br /&gt;
The update can be found here: http://www-306.ibm.com/pc/support/site.wss/document.do?lndocid=MIGR-50279&lt;br /&gt;
&lt;br /&gt;
===Always on problem:===&lt;br /&gt;
&lt;br /&gt;
It seems like for some people a combination of enabling dynamic frequency scaling and using the most recent radeon drivers (from xorg 6.8.x) with the  DynamicClocks option enabled helped lowing the fan rotation and hence making it more quiet.&lt;br /&gt;
&lt;br /&gt;
Also the fglrx driver from ATI is said to show the same effect when used together with dynamic frequency scaling.&lt;br /&gt;
&lt;br /&gt;
On a 770X the fan can be fully controlled through ACPI. Thermal Zone THM5 (possibly the battery/charging circuit, it's definitely warmer when using 5v PCMCIA cards and AC) triggers it to turn on and not ever off by design. Can be solved by a custom DSDT, which also makes use of the variable-speed features of the fan (will release this once I've finished tweaking and testing it).&lt;br /&gt;
&lt;br /&gt;
I can confirm that on my R51, the graphics card seems to be the problem.  The fan keeps running most of the time even with AC on, but even though I activated DynamicClocks (with the radeon driver), I can see in /proc/acpi/ibm/thermal that the GPU (4th value) is at 52-53Â°.  The fan stops running as soon as the temperature gets down to 50 degrees and starts again at 53.  While debugging, I seemed(!) to be able to reduce the temperature together with the resolution (e.g. &amp;quot;xrandr -s 2&amp;quot; to get from 1400x1050 to 1024x768) or by switching off the graphics with &amp;quot;xset dpms force off&amp;quot;.  The bottom line is that the below &amp;quot;partial fix&amp;quot; won't work because the GPU temperature is the problem.&lt;br /&gt;
&lt;br /&gt;
The GPU also seems to be the culprit on the t43p. Even with the fan always on (with speeds of around 4K reported in /proc/acpi/ibm/fan), the temperature never drops below 55. This is with the Xorg driver and DynamicClocks=on. With the ATI's fglrx driver, the GPU temp seems slightly higher (although I haven't performed a careful comparison). Without the fan, the temperature very quickly climbs to above 60. &lt;br /&gt;
&lt;br /&gt;
With the Pentium M, CPU heat dissipation can be reduced through [[Pentium M undervolting and underclocking|undervolting and underclocking]].&lt;br /&gt;
&lt;br /&gt;
An extensive forum discussion of this problem for the ThinkPad {{T43}}/{{T43p}}, and possible hardware mods, appears [http://forum.thinkpads.com/viewtopic.php?t=14580http://forum.thinkpads.com/viewtopic.php?t=14580 here].&lt;br /&gt;
&lt;br /&gt;
====Partial fix====&lt;br /&gt;
{{WARN|This circumvents the BIOS fan control, so be careful and use at your own risk! Don't toast your ThinkPad.}}&lt;br /&gt;
&lt;br /&gt;
When loading [[ibm-acpi]] v0.11 with experimental switch ({{cmdroot|1=modprobe ibm_acpi experimental=1}}), it is possible to read and write the status of fan:&lt;br /&gt;
&lt;br /&gt;
 '''#cat /proc/acpi/ibm/fan'''&lt;br /&gt;
 status:         enabled&lt;br /&gt;
 speed:          3580&lt;br /&gt;
 commands:       enable, disable&lt;br /&gt;
 &lt;br /&gt;
 '''#echo disable &amp;gt; /proc/acpi/ibm/fan'''&lt;br /&gt;
 &lt;br /&gt;
 '''cat /proc/acpi/ibm/fan'''&lt;br /&gt;
 status:         disabled&lt;br /&gt;
 speed:          0&lt;br /&gt;
 commands:       enable, disable&lt;br /&gt;
&lt;br /&gt;
But the fan will then '''never''' wake up. So, we need a [[ACPI fan control script|small script]] witch is constantly checking the temperature and setting the fan on/off when needed.&lt;br /&gt;
&lt;br /&gt;
On my T41 (gentoo-sources-2.6.11.11 ) I noticed that after unloading the fan module the fan noise stopped. With the module loaded the fan was working even at very low cpu temperatures, without the module it's ok so far.&lt;br /&gt;
&lt;br /&gt;
A [[patch for controlling fan speed]] allows finer control on some models.&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Fan_control_scripts&amp;diff=11220</id>
		<title>Fan control scripts</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Fan_control_scripts&amp;diff=11220"/>
		<updated>2005-10-26T16:13:23Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: Solution for fan pulsing noise&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Fan control shell scripts==&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;sh&amp;lt;/tt&amp;gt; script example===&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 MAXTEMP=50&lt;br /&gt;
 &lt;br /&gt;
 while [ 1 ];&lt;br /&gt;
 do&lt;br /&gt;
        fan=no&lt;br /&gt;
 &lt;br /&gt;
        for temp in `sed s/temperatures:// &amp;lt; /proc/acpi/ibm/thermal`&lt;br /&gt;
        do&lt;br /&gt;
                test $temp -gt $MAXTEMP &amp;amp;&amp;amp; fan=yes&lt;br /&gt;
        done&lt;br /&gt;
 &lt;br /&gt;
        command='disable'&lt;br /&gt;
        test &amp;quot;$fan&amp;quot; = &amp;quot;yes&amp;quot; &amp;amp;&amp;amp; command='enable'&lt;br /&gt;
        echo $command &amp;gt; /proc/acpi/ibm/fan&lt;br /&gt;
 &lt;br /&gt;
        sleep 20&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;sh&amp;lt;/tt&amp;gt; script with more features===&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 # fan control-script&lt;br /&gt;
 #&lt;br /&gt;
 # based upon ibm-acpi 0.11 (experimental=1 !)&lt;br /&gt;
 #&lt;br /&gt;
 # eliminates anoying &amp;quot;fan always on&amp;quot; in battery mode&lt;br /&gt;
 # works with hysteresis (DELTA) so that always-turn-on/turn-off is avoided&lt;br /&gt;
 # fan acivates at MAXTEMP and cools down CPU, GPU etc. to MAXTEMP-DELTA than the fan is turned off&lt;br /&gt;
 # furthermore detects if AC is on and gives back fan control to default behaviour than&lt;br /&gt;
 #&lt;br /&gt;
 # one can change MAXTEMP and DELTA to individual values&lt;br /&gt;
 # but take care of your THINKPAD don`t melt it!&lt;br /&gt;
 #&lt;br /&gt;
 # have fun!&lt;br /&gt;
 # mk 05.05.05&lt;br /&gt;
 &lt;br /&gt;
 MAXTEMP=51&lt;br /&gt;
 DELTA=4&lt;br /&gt;
 &lt;br /&gt;
 SWITCHTEMP=$MAXTEMP&lt;br /&gt;
 &lt;br /&gt;
 #make sure the script doesn't leave the fan off on error&lt;br /&gt;
 trap &amp;quot;echo enable &amp;gt; /proc/acpi/ibm/fan&amp;quot; EXIT&lt;br /&gt;
 &lt;br /&gt;
 while [ 1 ];&lt;br /&gt;
 do&lt;br /&gt;
   for ac in `sed s/state:// &amp;lt; /proc/acpi/ac_adapter/AC/state`&lt;br /&gt;
     do&lt;br /&gt;
      if [ &amp;quot;$ac&amp;quot; = &amp;quot;off-line&amp;quot; ]; then&lt;br /&gt;
          fan=no&lt;br /&gt;
          for temp in `sed s/temperatures:// &amp;lt; /proc/acpi/ibm/thermal`&lt;br /&gt;
            do&lt;br /&gt;
              test $temp -gt $SWITCHTEMP &amp;amp;&amp;amp; fan=yes&lt;br /&gt;
            done&lt;br /&gt;
 &lt;br /&gt;
          if [ &amp;quot;$fan&amp;quot; = &amp;quot;yes&amp;quot; ]; then&lt;br /&gt;
            command='enable'&lt;br /&gt;
            SWITCHTEMP=`expr $MAXTEMP - $DELTA`&lt;br /&gt;
          else&lt;br /&gt;
            SWITCHTEMP=$MAXTEMP&lt;br /&gt;
            command='disable'&lt;br /&gt;
          fi&lt;br /&gt;
 &lt;br /&gt;
        else # ac-adapter on -&amp;gt; set fan control to standard behaviour&lt;br /&gt;
          command='enable'&lt;br /&gt;
        fi&lt;br /&gt;
 &lt;br /&gt;
        echo $command &amp;gt; /proc/acpi/ibm/fan&lt;br /&gt;
        sleep 15&lt;br /&gt;
      done &lt;br /&gt;
   done&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;sh&amp;lt;/tt&amp;gt; script with extra safety functionality ===&lt;br /&gt;
ibm_acpi usually works well. But to rely on it completely, this script provides some extra safety functionality:&lt;br /&gt;
# It catches various signals and turns the fan on before it quits.&lt;br /&gt;
# It turns off the fan under very strict conditions, leaving it on when unexpected errors occur.&lt;br /&gt;
&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 # july 2005 Erik Groeneveld, erik@cq2.nl&lt;br /&gt;
 # It makes sure the fan is on in case of errors&lt;br /&gt;
 # and only turns it off when all temps are ok.&lt;br /&gt;
 &lt;br /&gt;
 IBM_ACPI=/proc/acpi/ibm&lt;br /&gt;
 THERMOMETER=$IBM_ACPI/thermal&lt;br /&gt;
 FAN=$IBM_ACPI/fan&lt;br /&gt;
 MAXTRIPPOINT=65&lt;br /&gt;
 MINTRIPPOINT=60&lt;br /&gt;
 TRIPPOINT=$MINTRIPPOINT&lt;br /&gt;
 &lt;br /&gt;
 echo fancontrol: Thermometer: $THERMOMETER, Fan: $FAN&lt;br /&gt;
 echo fancontrol: Current `cat $THERMOMETER`&lt;br /&gt;
 echo fancontrol: Controlling temperatures between $MINTRIPPOINT and $MAXTRIPPOINT degrees.&lt;br /&gt;
 &lt;br /&gt;
 # Make sure the fan is turned on when the script crashes or is killed&lt;br /&gt;
 trap &amp;quot;echo enable &amp;gt; $FAN; exit 0&amp;quot; HUP KILL INT ABRT STOP QUIT SEGV TERM&lt;br /&gt;
 &lt;br /&gt;
 while [ 1 ];&lt;br /&gt;
 do&lt;br /&gt;
        command=enable&lt;br /&gt;
        temperatures=`sed s/temperatures:// &amp;lt; $THERMOMETER`&lt;br /&gt;
        result=&lt;br /&gt;
        for temp in $temperatures&lt;br /&gt;
        do&lt;br /&gt;
                test $temp -le $TRIPPOINT &amp;amp;&amp;amp; result=$result.Ok&lt;br /&gt;
        done&lt;br /&gt;
        if [ &amp;quot;$result&amp;quot; = &amp;quot;.Ok.Ok.Ok.Ok.Ok.Ok.Ok.Ok&amp;quot; ]; then&lt;br /&gt;
                command=disable&lt;br /&gt;
                TRIPPOINT=$MAXTRIPPOINT&lt;br /&gt;
        else&lt;br /&gt;
                command=enable&lt;br /&gt;
                TRIPPOINT=$MINTRIPPOINT&lt;br /&gt;
        fi&lt;br /&gt;
        echo $command &amp;gt; $FAN&lt;br /&gt;
        # Temperature ramps up quickly, so pick this not too large:&lt;br /&gt;
        sleep 5&lt;br /&gt;
 done&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;bash&amp;lt;/tt&amp;gt; script with fine control over fan speed===&lt;br /&gt;
While the above scripts only toggle the fan on and off, the following also sets the fan speed according to sytem temperatures. In addition, it includes a hack for preventing the annoying fan pulsing that occurs on some systems. &lt;br /&gt;
&lt;br /&gt;
Prerequisite: the [[patch for controlling fan speed]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/bash&lt;br /&gt;
&lt;br /&gt;
# This script dynamically controls fan speed on some ThinkPad models&lt;br /&gt;
# according to user-defined temperature thresholds.  It implements its&lt;br /&gt;
# own decision algorithm, overriding the ThinkPad embedded&lt;br /&gt;
# controller. It also implements a workaround for the fan noise pulse&lt;br /&gt;
# experienced every few seconds on some ThinkPads.&lt;br /&gt;
#&lt;br /&gt;
# The script requires the ibm_acpi patch at &lt;br /&gt;
# http://thinkwiki.org/wiki/Patch_for_controlling_fan_speed&lt;br /&gt;
#&lt;br /&gt;
# WARNING: This script relies on undocumented hardware features and&lt;br /&gt;
# overrides nominal hardware behavior. It may thus cause arbitrary&lt;br /&gt;
# damage to your laptop or data. Watch your temperatures!&lt;br /&gt;
#&lt;br /&gt;
# This file is placed in the public domain and may be freely distributed.&lt;br /&gt;
&lt;br /&gt;
LEVELS=(    0      2      4      7)  # Fan speed levels&lt;br /&gt;
UP_TEMPS=(      52     60     68  )  # Speed increase trip points&lt;br /&gt;
DOWN_TEMPS=(  48     56     64    )  # Speed decrease trip points&lt;br /&gt;
&lt;br /&gt;
ANTIPULSE=( 0      1      0      0)  # Prevent fan pulsing noise at this level&lt;br /&gt;
                                     #   (this also prevents fan speed updates)&lt;br /&gt;
&lt;br /&gt;
IBM_ACPI=/proc/acpi/ibm&lt;br /&gt;
FAN=$IBM_ACPI/fan&lt;br /&gt;
INTERVAL=3&lt;br /&gt;
VERBOSE=true&lt;br /&gt;
DRY_RUN=false&lt;br /&gt;
&lt;br /&gt;
[[ &amp;quot;$1&amp;quot; == &amp;quot;-t&amp;quot; ]] &amp;amp;&amp;amp; { DRY_RUN=true; echo &amp;quot;$0: Dry run, will not change fan state.&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
# Enable the fan in default mode if anything goes wrong:&lt;br /&gt;
set -e -E -u&lt;br /&gt;
$DRY_RUN || trap &amp;quot;echo enable &amp;gt; $FAN; exit 0&amp;quot; EXIT HUP INT ABRT QUIT SEGV TERM&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
thermometer() { # output list of temperatures&lt;br /&gt;
    read X Y &amp;lt; $IBM_ACPI/thermal&lt;br /&gt;
    [[ &amp;quot;$X&amp;quot; == &amp;quot;temperatures:&amp;quot; ]] || { &lt;br /&gt;
	echo &amp;quot;$0: Bad temperatures: $X $Y&amp;quot; &amp;gt;&amp;amp;2 &lt;br /&gt;
	exit 1&lt;br /&gt;
    }&lt;br /&gt;
    echo &amp;quot;$Y&amp;quot;; &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
speedometer() { # output fan speed&lt;br /&gt;
    cat $FAN | sed '/^speed/!d; s/speed:[ \t]*//'&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
IDX=0&lt;br /&gt;
MAX_IDX=$(( ${#LEVELS[@]} - 1 ))&lt;br /&gt;
SETTLE=0&lt;br /&gt;
&lt;br /&gt;
while true; do&lt;br /&gt;
    TEMPS=`thermometer`&lt;br /&gt;
    $VERBOSE &amp;amp;&amp;amp; SPEED=`speedometer`&lt;br /&gt;
&lt;br /&gt;
    # Calculate new level&lt;br /&gt;
    NEWIDX=$IDX&lt;br /&gt;
    DOWN=$(( IDX &amp;gt; 0 ))&lt;br /&gt;
    for TEMP in $TEMPS; do&lt;br /&gt;
        # Increase speed as much as needed&lt;br /&gt;
        while [[ $NEWIDX -lt $MAX_IDX ]] &amp;amp;&amp;amp; &lt;br /&gt;
              [[ $TEMP -ge ${UP_TEMPS[$NEWIDX]} ]]; do&lt;br /&gt;
            (( NEWIDX ++ ))&lt;br /&gt;
            DOWN=0&lt;br /&gt;
        done&lt;br /&gt;
        # Allow decrease (by one index)?&lt;br /&gt;
        if [[ $DOWN == 1 ]] &amp;amp;&amp;amp; &lt;br /&gt;
           [[ $TEMP -gt ${DOWN_TEMPS[$(( IDX - 1 ))]} ]]; then&lt;br /&gt;
            DOWN=0&lt;br /&gt;
        fi&lt;br /&gt;
    done&lt;br /&gt;
    if [[ $DOWN == 1 ]]; then&lt;br /&gt;
        NEWIDX=$(( IDX - 1 ))&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    # Transition&lt;br /&gt;
    OLDLEVEL=${LEVELS[$IDX]}&lt;br /&gt;
    NEWLEVEL=${LEVELS[$NEWIDX]}&lt;br /&gt;
    $VERBOSE &amp;amp;&amp;amp; echo &amp;quot;tpfan: Temps: $TEMPS   Fan: $SPEED   Level: $OLDLEVEL-&amp;gt;$NEWLEVEL&amp;quot;&lt;br /&gt;
    $DRY_RUN || echo level $NEWLEVEL &amp;gt; $FAN&lt;br /&gt;
&lt;br /&gt;
    sleep $INTERVAL&lt;br /&gt;
&lt;br /&gt;
    # If needed, apply anti-pulsing hack after a settle-down period:&lt;br /&gt;
    if [[ ${ANTIPULSE[${NEWIDX}]} == 1 ]]; then&lt;br /&gt;
	if [[ $NEWLEVEL == $OLDLEVEL ]]; then&lt;br /&gt;
	    if [[ $SETTLE -ge 0 ]]; then&lt;br /&gt;
		(( SETTLE -= INTERVAL ))&lt;br /&gt;
	    else&lt;br /&gt;
		$DRY_RUN || echo level disengaged &amp;gt;&amp;gt; $FAN&lt;br /&gt;
		sleep 0.5&lt;br /&gt;
	    fi&lt;br /&gt;
	else&lt;br /&gt;
	    SETTLE=6&lt;br /&gt;
	fi&lt;br /&gt;
    fi&lt;br /&gt;
&lt;br /&gt;
    IDX=$NEWIDX&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Init script example==&lt;br /&gt;
&lt;br /&gt;
 #! /bin/sh&lt;br /&gt;
 &lt;br /&gt;
 N=/etc/init.d/fan&lt;br /&gt;
 &lt;br /&gt;
 set -e&lt;br /&gt;
 &lt;br /&gt;
 case &amp;quot;$1&amp;quot; in&lt;br /&gt;
  start)&lt;br /&gt;
        # make sure privileges don't persist across reboots&lt;br /&gt;
        if [ -d /var/run/fan ] &amp;amp;&amp;amp; [ &amp;quot;x`ls /var/run/fan`&amp;quot; != x ]&lt;br /&gt;
        then&lt;br /&gt;
                touch -t 198501010000 /var/run/fan/*&lt;br /&gt;
        fi&lt;br /&gt;
        fan.sh &amp;amp;    # Script from above&lt;br /&gt;
        ;;&lt;br /&gt;
  stop|reload|restart|force-reload)&lt;br /&gt;
        killall fan.sh&lt;br /&gt;
        echo enable &amp;gt; /proc/acpi/ibm/fan&lt;br /&gt;
        ;;&lt;br /&gt;
  *)&lt;br /&gt;
        echo &amp;quot;Usage: $N {start|stop|restart|force-reload}&amp;quot; &amp;gt;&amp;amp;2&lt;br /&gt;
        exit 1&lt;br /&gt;
        ;;&lt;br /&gt;
 esac&lt;br /&gt;
 &lt;br /&gt;
 exit 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Init script example for gentoo==&lt;br /&gt;
Assume one of the above control scripts is /usr/sbin/ibm-fancontrold, for gentoo use the following init script in /etc/init.d/ibm-fancontrol.&lt;br /&gt;
Copy the script to /etc/init.d/ibm-fancontrol, then do &lt;br /&gt;
&lt;br /&gt;
 # rc-update add ibm-fancontrol default&lt;br /&gt;
&lt;br /&gt;
This will add the init script to the default runlevel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 #!/sbin/runscript&lt;br /&gt;
 # 2005 Gilbert Tiefengruber&lt;br /&gt;
 # Distributed under the terms of the GNU General Public License v2 &lt;br /&gt;
 # IBM Fancontrol init script for IBM Thinkpad laptops (tested with R50)&lt;br /&gt;
 # This init script was written for gentoo 2005.1, kernel 2.6.12&lt;br /&gt;
 # You need the ibm_acpi kernel module version 0.11 or greater&lt;br /&gt;
 # load the module with experimental=1 to enable the fan controls&lt;br /&gt;
 &lt;br /&gt;
 depend() {&lt;br /&gt;
         need localmount&lt;br /&gt;
 }&lt;br /&gt;
 checkconfig() {&lt;br /&gt;
         if [ ! -e /proc/acpi/ibm/fan ]; then&lt;br /&gt;
                 eerror &amp;quot;The ibm_acpi module must be loaded with (experimental=1)&amp;quot;&lt;br /&gt;
                 return 1&lt;br /&gt;
         fi&lt;br /&gt;
 } &lt;br /&gt;
 start() {&lt;br /&gt;
         checkconfig || return 1&lt;br /&gt;
         ebegin &amp;quot;Starting ibm-fancontrold&amp;quot;&lt;br /&gt;
         start-stop-daemon --quiet -p /var/run/ibm-fancontrold.pid -m -b --start -a /usr/sbin/ibm-fancontrold&lt;br /&gt;
         eend ${?}&lt;br /&gt;
 } &lt;br /&gt;
 stop() {&lt;br /&gt;
         ebegin &amp;quot;Stopping ibm-fancontrold&amp;quot;&lt;br /&gt;
         start-stop-daemon --stop --quiet -p /var/run/ibm-fancontrold.pid&lt;br /&gt;
         eend ${?}&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
==fanctrld==&lt;br /&gt;
&lt;br /&gt;
[http://log.does-not-exist.org/archives/2005/08/13/2043_t_43_fan_control_daemon.html fanctrld] is a daemon (written in C) that controls the Thinkpad's fan. The basic approach is to monitor both temperature and fan speed. The fan is enabled when a certain temperature is exceeded, and disabled when the BIOS slows down the fan below a certain speed.&lt;br /&gt;
&lt;br /&gt;
[[Category:Scripts]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=S3_Savage_IX8&amp;diff=6874</id>
		<title>S3 Savage IX8</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=S3_Savage_IX8&amp;diff=6874"/>
		<updated>2005-06-28T19:55:10Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: Noted s3switch.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 0; margin-right:10px; border: 1px solid #dfdfdf; padding: 0em 1em 1em 1em; background-color:#F8F8FF; align:right;&amp;quot;&amp;gt;&lt;br /&gt;
=== S3 Savage IX8 or IX8+===&lt;br /&gt;
This is a S3 video adapter&amp;lt;br&amp;gt;&lt;br /&gt;
S3 is now owned by Via Technologies&lt;br /&gt;
&lt;br /&gt;
The IX8 and IX8+ chips share the same PCI-ID&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
* Chipset: S3&lt;br /&gt;
* PCI ID: 5333:8c12&lt;br /&gt;
* AGP 2X&lt;br /&gt;
* 8MB SGRAM video memory&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|style=&amp;quot;vertical-align:top&amp;quot; |&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Linux X.Org driver ===&lt;br /&gt;
This chip is supported by the '[[savage]]' driver as part of the X.Org distribution&lt;br /&gt;
&lt;br /&gt;
==== ThinkPad LCD ====&lt;br /&gt;
Display on the internal LCD works as long as you set the monitor settings correct.&lt;br /&gt;
&lt;br /&gt;
==== External VGA port ====&lt;br /&gt;
Works. Fn-F7 switches between either LCD and CRT but not both. To use both, use [http://www.probo.com/timr/savage40.html s3switch].&lt;br /&gt;
&lt;br /&gt;
==== SVideo port ====&lt;br /&gt;
??&lt;br /&gt;
&lt;br /&gt;
=== Linux kernel Framebuffer driver ===&lt;br /&gt;
This chip will work with either the 'vesa' or 'savagefb' driver as part of any recent 2.4 or 2.6 kernel.&lt;br /&gt;
&lt;br /&gt;
=== ThinkPad's this chip may be found in ===&lt;br /&gt;
* {{A22e}}&lt;br /&gt;
* {{T20}}, {{T21}}, {{T22}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Components]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Savage&amp;diff=5908</id>
		<title>Savage</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Savage&amp;diff=5908"/>
		<updated>2005-06-26T15:48:21Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: Noted video RAM limitation on 3D modes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Xorg S3 Savage Driver ==&lt;br /&gt;
&lt;br /&gt;
Your X11 driver of choice if you have a Thinkpad with a Savage MX, IX or a SuperSavage chip.&lt;br /&gt;
It is based on [http://www.probo.com/timr/savage40.html Tim Roberts savage driver for X], which didn't improve for a long time.&lt;br /&gt;
&lt;br /&gt;
=== Features ===&lt;br /&gt;
*supports Xinerama and MergedFB&lt;br /&gt;
&lt;br /&gt;
=== Project Homepage / Availability ===&lt;br /&gt;
*Homepage: http://www.botchco.com/alex/new-savage/html/&lt;br /&gt;
*The driver is also included in Xorg [http://www.freedesktop.org/XOrg/CvsPage cvs].  &lt;br /&gt;
&lt;br /&gt;
=== Packages ===&lt;br /&gt;
Binary snapshots (DDX, DRI, DRM) are available [http://freedesktop.org/~fxkuehl/snapshots/ here].&lt;br /&gt;
&lt;br /&gt;
=== CVS ===&lt;br /&gt;
See this page for [http://dri.freedesktop.org/wiki/Building instructions] on building from cvs.&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
*in development, usable, secure.&lt;br /&gt;
*3D is supported in xorg/mesa/drm [http://dri.freedesktop.org/wiki/Building cvs] (but usable modes are limited by video RAM; with 8MB of video RAM, the DRI 3D drivers don't support 1400x1050 32-bit mode).&lt;br /&gt;
&lt;br /&gt;
=== Interesting links related to this project ===&lt;br /&gt;
&lt;br /&gt;
*[http://www.probo.com/timr/savage40.html Tim Roberts savage driver for X]&lt;br /&gt;
*[http://dri.sourceforge.net/cgi-bin/moin.cgi/S3Savage DRI OpenGL driver for savage chipsets]&lt;br /&gt;
*[http://utah-glx.sourceforge.net/ Utah GLX OpenGL Driver for Savage chipsets]&lt;br /&gt;
*[http://www.s3graphics.com/prod_savage_ix_features.htm S3's Savage IX page]&lt;br /&gt;
&lt;br /&gt;
[[Category:Drivers]] [[Category:T20]] [[Category:T21]] [[Category:T22]] [[Category:T23]] [[Category:A22e]]&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
	<entry>
		<id>https://www.thinkwiki.org/w/index.php?title=Talk:Problem_with_3Com_10/100_Ethernet_card_not_being_recognized&amp;diff=5970</id>
		<title>Talk:Problem with 3Com 10/100 Ethernet card not being recognized</title>
		<link rel="alternate" type="text/html" href="https://www.thinkwiki.org/w/index.php?title=Talk:Problem_with_3Com_10/100_Ethernet_card_not_being_recognized&amp;diff=5970"/>
		<updated>2005-06-21T23:31:39Z</updated>

		<summary type="html">&lt;p&gt;192.117.108.16: Bug in the script?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Why does the script assume that the IO port numbers in the output of &amp;quot;lspci -v&amp;quot; are in decimal? In the versions I checked (2.1.10 and 2.1.99-test8), they're in hex.&lt;/div&gt;</summary>
		<author><name>192.117.108.16</name></author>
		
	</entry>
</feed>