Ik ben bezig met het een acpi interface, waarmee ik features zoals speedstepping van me P4M kan gebruiken, dat doe ik in python. Wat echter een beetje tegenvalt is de documentatie over acpi in linux, het is dan ook nog niet in de huidige kernel. Ik gebruik de 2.4.20 van kernel.org met de acpi patch 20021212 en de bijbehorende patch voor softwaresuspend.
Ik lees nu de acpiinfo direct uit het /proc filesystem uit, parse deze en bouw er wat classes mee. Allemaal niet zo vreselijk ingewikkeld dus.
Even wat meer details:
Dit zijn twee voorbeelde van de /proc/acpi interfaces die ik aan kan spreken, enwel als volgt:
Dat werkt dus. Ook met performance natuurlijk.
Hieruit wordt denk ik wel duidelijk hoe het werkt. De meeste info heb ik uit een c't artikel van 2.12.2002 waarin naar de acpi mogelijkheden van linux wordt gekeken.
Settings aanpassen doe ik op dit moment als volgt:
Dit is ook nog redelijk straightforward. Echter, om de info uit te lezen parse ik de output van bovengenoemde 'files', redelijk veel werk, foutgevoelig en als de acpi specs aangepast worden werkt de code mogelijk niet meer, daarnaast levert het code als
deze op. Niet echt mooi dus.
Wat ik dus heel graag wil weten is welke manieren er zijn om de info over acpi dingen makkelijker leesbaar eruit te krijgen. Ik heb me nog niet echt super verdiept in de geheimen van de Linux kernel en het /proc filesystem, maar heel simpel gezegd, als ik er een 1 inschrijf, kan ik dan niet ook gewoon een 1 terugkrijgen als ik vraag?
Hier kun je de complete sourcecode vinden.
Ik kan ook wel wat info via programma's zoals acpi vergaren, maar dat is eigenlijk niet mijn bedoeling.
Ik lees nu de acpiinfo direct uit het /proc filesystem uit, parse deze en bouw er wat classes mee. Allemaal niet zo vreselijk ingewikkeld dus.
Even wat meer details:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| sebas@neo / $ cat /proc/acpi/processor/CPU0/performance
state count: 2
active state: P0
states:
*P0: 1800 MHz, 20000 mW, 250 uS
P1: 1200 MHz, 10000 mW, 250 uS
sebas@neo / $ cat /proc/acpi/processor/CPU0/throttling
state count: 8
active state: T0
states:
*T0: 00%
T1: 12%
T2: 25%
T3: 37%
T4: 50%
T5: 62%
T6: 75%
T7: 87%
sebas@neo / $ |
Dit zijn twee voorbeelde van de /proc/acpi interfaces die ik aan kan spreken, enwel als volgt:
code:
1
2
3
| neo / # echo 3 > /proc/acpi/processor/CPU0/throttling neo / # grep \* /proc/acpi/processor/CPU0/throttling *T3: 37% |
Dat werkt dus. Ook met performance natuurlijk.
Hieruit wordt denk ik wel duidelijk hoe het werkt. De meeste info heb ik uit een c't artikel van 2.12.2002 waarin naar de acpi mogelijkheden van linux wordt gekeken.
Settings aanpassen doe ik op dit moment als volgt:
code:
1
2
3
4
5
6
7
8
| def step(self, state):
""" set performance level """
pf = open(self.performance, 'w')
pf.write(str(state))
pf.close()
self.cur_perf()
self.current_state = self.current_Pstate()
message(">> CPU speed is now %s <<" % self.current_state.speed) |
Dit is ook nog redelijk straightforward. Echter, om de info uit te lezen parse ik de output van bovengenoemde 'files', redelijk veel werk, foutgevoelig en als de acpi specs aangepast worden werkt de code mogelijk niet meer, daarnaast levert het code als
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
| def initialize_Pstates(self):
""" checks for performance (speedstep states and throttling states
and makes them available in the Acpi class """
def create_pstate_list(self, Ps, Ts):
states = []
for p in Ps:
for t in Ts:
speed = p[1] * t[1] /100
pstate = Pstate(p[0], t[0], speed)
states.append(pstate)
#print (
return states
# check out speedstep states
l = readfile(self.performance)
Ps = []
(bla,c) = string.split(l[0], ':')
c = int(string.strip(c))
# current performance state is p (P0 or P1)
(bla,p) = string.split(l[1], ':')
p = string.strip(p)
P = int(p[-1])
k = l[-c:]
for kl in k:
(p1,p2) = string.split(kl, ':')
p2 = string.strip(p2)
P = int(kl[5])
#if kl[3] == '*':
# print "Current :)"
# pass
(mhz, watt, uS) = string.split(p2,',')
mhz = int(string.split(mhz)[0])
ps = (P, mhz)
Ps.append(ps)
# check out throttling states
l = readfile(self.throttling)
c = int(string.split(l[0])[2])
print "we have %i possible throttling states" % c
self.throttlestatecount = c
Ts = []
k = l[-c:]
for kl in k:
#if kl[3] == '*':
# pass # this is the current state
sl = string.split(kl)
t = int(sl[0][-2])
perc_throttled = 100 - int(sl[1][0:2])
Ts.append((t, perc_throttled))
self.Ps = Ps
self.Ts = Ts
all_states = create_pstate_list(self, Ps, Ts)
return all_states |
deze op. Niet echt mooi dus.
Wat ik dus heel graag wil weten is welke manieren er zijn om de info over acpi dingen makkelijker leesbaar eruit te krijgen. Ik heb me nog niet echt super verdiept in de geheimen van de Linux kernel en het /proc filesystem, maar heel simpel gezegd, als ik er een 1 inschrijf, kan ik dan niet ook gewoon een 1 terugkrijgen als ik vraag?
Hier kun je de complete sourcecode vinden.
Ik kan ook wel wat info via programma's zoals acpi vergaren, maar dat is eigenlijk niet mijn bedoeling.
Everyone complains of his memory, no one of his judgement.