Функциональные клавиши |
|
|

May 10 2010, 07:56 AM




- Advanced Member
- Group: Developer
- Posts: 5,555
Любопытный у меня вопрос возник. С патчем ДСДТ (там, например, прописано устройство PNLF), у меня заработала функциональная клавиша Fn+F2, и в соответствии с нарисованным на клавиатуре рисует на экране информацию о батарейке
Battery.png ( 453.51K )
Number of downloads: 111Эту же картинку я видел и в Виндоусе, но никогда на других компах. Откуда?
Если это в БИОСе, то почему только после патча ДСДТ?
Как вообще работают функциональные клавиши? Как добиться правильной работы? Что менять? Принимаются ответы от БИОСа до ядра системы. Только аргументировано.
Между прочим, клавиши работают и на подключенной извне USB клавиатуре, но в Тигре не все, а вот в Барсике на Делле даже яркость регулируется.
--------------------------
Разрешено
http://www.projectosx.com/forum/index.php?...ost&p=10007Есть также решение насчет яркости
http://www.insanelymac.com/forum/index.php?showtopic=236835

May 10 2010, 05:17 PM




- Advanced Member
- Group: Comrade
- Posts: 146
Есть такая штука - OSD, управляет ей контроллер панели (это если дисплей внешний, от компа сигнал VGA идет на контроллер, с контроллера через LVDS на панель). У тебя на ноуте контроллер находится непосредственно на материнке и видимо может принимать какие-то значения по SMBus (ИМХО). Т.е. у тебя не работает управление яркостью и прочим через софт Mac OS. Управление происходит исключительно на низком уровне - через методы DSDT, а инфу о батареи выводит контроллер панели мимо видеокарты. Попробуй внешний дисплей, будет меню или нет?

May 10 2010, 06:06 PM




- Advanced Member
- Group: Developer
- Posts: 5,555
Работает (с родной клавиатуры) управление яркостью (допустим панель PNLF), громкостью (в DSDT нет ничего похожего на это), показ батарейки, отключение тачпада, и все это после стандартного исправления ДСДТ (тип системы, PNLF, лишние девайсы). С оемДСДТ ничего не работает.
Т.е. кроме алгоритмов операционной системы и АЦПИ есть еще что-то, которое активируется в ДСДТ? SMBus контроллер? Я смотрел даташит на Максимку, там, кроме интеллектуальной зарядки батареи нет ничего, даже интерфейса с ЦПУ.
А где прошита программа генерации цифр зарядки батарейки на экране?
А где прошито солнышко яркости экрана и изображение динамика регулятора громкости - они же у всех одинаковы?

May 10 2010, 10:18 PM




- Advanced Member
- Group: Comrade
- Posts: 146
Я всего лишь предположил что генерацией картинки с батареей занимается контроллер твоей панели (OSD) для него это не проблема, если есть связь с ACPI. Возможно это и не так, но мне кажется что это наиболее вероятный вариант.
Картинки с "солнышком" и динамиков рисует Mac OS, но ты уверен что управление яркостью происходит на высоком уровне а не на низком?

May 11 2010, 07:33 AM




- Advanced Member
- Group: Developer
- Posts: 5,555
QUOTE (tea @ May 11 2010, 01:18 AM)

Я всего лишь предположил что генерацией картинки с батареей занимается контроллер твоей панели (OSD) для него это не проблема, если есть связь с ACPI. Возможно это и не так, но мне кажется что это наиболее вероятный вариант.
Верю, простоя не могу найти в ДСДТ что-то онтосящееся к этому, а должно быть.
QUOTE
Картинки с "солнышком" и динамиков рисует Mac OS, но ты уверен что управление яркостью происходит на высоком уровне а не на низком?
На Делле солнышко рисуется клавишами Fn+ScrollLock/Pause, а управление яркостью - Fn+Up/Down. Я хочу, чтобы клавиши совпадали.
Динамики с громкостью совпадают.
Я вот не могу понять, что именно в МакОСе рисует солнышко, и по какой команде.
Более того, подключив ЮСБ клавиатуру, я получаю другую комбинацию для рисования солнышка. Но она тоже есть!
Тут протокол PS2->ACPI, там протокол USB->PCI. На каком уровне можно перехватить эту команду? И где находится битовый рисунок солнышка?

May 11 2010, 10:12 AM




- Advanced Member
- Group: Comrade
- Posts: 146
У меня регулировка яркости тоже не совпадает, громкость на месте. Где именно происходит обработка? Я думаю что в AppleACPIButtons.kext. Давай искать.

May 11 2010, 11:47 AM




- Advanced Member
- Group: Developer
- Posts: 5,555
QUOTE (tea @ May 11 2010, 02:12 PM)

У меня регулировка яркости тоже не совпадает, громкость на месте. Где именно происходит обработка? Я думаю что в AppleACPIButtons.kext. Давай искать.
Там я уже посмотрел, вообще кроме конструктора и деструктора ничего нет. В других АЦПИ кекстах тоже не видно с первого раза. Вот, думаю, сделать трассировку команд, поступающих от ЮСБ устройств, и посмотреть с моей ЮСБ клавой. Скан-коды с PS2 клавы я уже ловил, куча цифр, ни о чем не говорящих, но вот от Fn+Up/Down отклика никакого, а яркость меняется. Т.е. до кекста клавиатуры эта комбинация не доходит.
В руках исходники практически всего, кроме АЦПИ, а тот есть в дизабленном виде. И нигде я не вижу отклика на такую комбинацию.
С другой стороны, все это зависит от EC controller. Если в Делле запустить этот кекст, то регулировки все пропадают. А на Самсунге наоборот, все работает, если этот кекст запущен. И, кстати, он имеет прямую связь с SMBus.
Видишь, у меня мыслей много, тока их надо распутать.

May 11 2010, 12:58 PM




- Advanced Member
- Group: Comrade
- Posts: 146
Комбинации с Fn не имеют скэн-кодов.

May 11 2010, 04:40 PM



- Member
- Group: Comrade
- Posts: 80
вставлю свои пять копеек:
как-то очень давно экспериментировал с DSDT от macbook 2,1. в то время я решил вообще полностью его скопировать, и у меня получилось, от своего я оставил только
CODE
OperationRegion (PRT0, SystemIO, 0x80, 0x04)
Field (PRT0, DWordAcc, Lock, Preserve)
{
P80H, 32
}
OperationRegion (S_IO, SystemIO, 0x06B0, 0x11)
Field (S_IO, ByteAcc, NoLock, Preserve)
{
PMS0, 8,
PME0, 8,
PMS1, 8,
PMS2, 8,
PMS3, 8,
PME1, 8,
PME2, 8,
PME3, 8,
SMS1, 8,
SMS2, 8,
SME1, 8,
SME2, 8,
RT10, 1,
RT11, 1,
, 1,
RT13, 1,
Offset (0x0E),
RT30, 1,
RT31, 1,
RT32, 1,
RT33, 1,
RT34, 1,
RT35, 1,
RT36, 1,
RT37, 1,
Offset (0x10),
DLPC, 1,
CK33, 1,
CK14, 1
}
OperationRegion (IO_T, SystemIO, 0x0800, 0x10)
Field (IO_T, ByteAcc, NoLock, Preserve)
{
Offset (0x08),
TRP0, 8
}
OperationRegion (PMIO, SystemIO, 0x1000, 0x80)
Field (PMIO, ByteAcc, NoLock, Preserve)
{
Offset (0x30),
GSMI, 1,
, 3,
SLPE, 1,
Offset (0x42),
, 1,
GPEC, 1
}
OperationRegion (GPIO, SystemIO, 0x1180, 0x3C)
Field (GPIO, ByteAcc, NoLock, Preserve)
{
GU00, 8,
GU01, 8,
GU02, 8,
GU03, 8,
GIO0, 8,
GIO1, 8,
GIO2, 8,
GIO3, 8,
Offset (0x0C),
GL00, 8,
, 4,
GP12, 1,
Offset (0x0E),
GL02, 8,
, 1,
GP25, 1,
GP26, 1,
Offset (0x10),
Offset (0x18),
GB00, 8,
GB01, 8,
GB02, 8,
GB03, 8,
Offset (0x2C),
GIV0, 8,
GIV1, 8,
GIV2, 8,
GIV3, 8,
GU04, 8,
GU05, 8,
GU06, 8,
GU07, 8,
GIO4, 8,
GIO5, 8,
GIO6, 8,
GIO7, 8,
, 7,
GP39, 1,
GL05, 8,
GL06, 8,
GL07, 8
}
OperationRegion (GNVS, SystemMemory, 0xBFE84DBC, 0x0100)
Field (GNVS, AnyAcc, Lock, Preserve)
{
OSYS, 16,
SMIF, 8,
PRM0, 8,
PRM1, 8,
SCIF, 8,
PRM2, 8,
PRM3, 8,
LCKF, 8,
PRM4, 8,
PRM5, 8,
P80D, 32,
LIDS, 8,
PWRS, 8,
DBGS, 8,
LINX, 8,
Offset (0x14),
ACTT, 8,
PSVT, 8,
TC1V, 8,
TC2V, 8,
TSPV, 8,
CRTT, 8,
DTSE, 8,
DTS1, 8,
DTS2, 8,
Offset (0x1E),
BNUM, 8,
BCAP, 8,
B1SC, 8,
B2SC, 8,
B0SS, 8,
B1SS, 8,
B2SS, 8,
Offset (0x28),
APIC, 8,
MPEN, 8,
Offset (0x2B),
PPCM, 8,
PCP0, 8,
PCP1, 8,
Offset (0x32),
NATP, 8,
CMAP, 8,
CMBP, 8,
LPTP, 8,
FDCP, 8,
CMCP, 8,
CIRP, 8,
Offset (0x3C),
IGDS, 8,
TLST, 8,
CADL, 8,
PADL, 8,
CSTE, 16,
NSTE, 16,
SSTE, 16,
NDID, 8,
DID1, 32,
DID2, 32,
DID3, 32,
DID4, 32,
DID5, 32,
Offset (0x67),
BLCS, 8,
BRTL, 8,
ALSE, 8,
ALAF, 8,
LLOW, 8,
LHIH, 8,
Offset (0x6E),
EMAE, 8,
EMAP, 16,
EMAL, 16,
Offset (0x74),
MEFE, 8,
Offset (0x78),
TPMP, 8,
TPME, 8,
Offset (0x82),
GTF0, 56,
GTF2, 56,
IDEM, 8,
Offset (0xB4),
WMIA, 8,
WMIO, 8,
ACPS, 8,
HPBD, 8,
IVIM, 8,
EXTM, 8,
Z000, 8,
Z001, 8,
Z002, 8,
Z003, 8,
Z004, 8,
Z005, 8,
Z006, 8,
Z007, 8,
Z008, 8,
Z009, 8,
Z00A, 8,
EXCM, 8,
Z00B, 8
}
OperationRegion (RCRB, SystemMemory, 0xFED1C000, 0x4000)
Field (RCRB, DWordAcc, Lock, Preserve)
{
Offset (0x1000),
Offset (0x3000),
Offset (0x3404),
HPAS, 2,
, 5,
HPAE, 1,
Offset (0x3418),
, 1,
PATD, 1,
SATD, 1,
SMBD, 1,
HDAD, 1,
A97D, 1,
Offset (0x341A),
RP1D, 1,
RP2D, 1,
RP3D, 1,
RP4D, 1,
RP5D, 1,
RP6D, 1
}
и кое-что добавил от яблока в эти регионы...
в итоге ноутбук загрузился без проблем, причем визуально скорость загрузки увеличиласть, но судя по тестам производительность упала на треть, кроме этого отвалился спидстеп, и ФУНКЦИОНАЛЬНЫЕ КЛИВИШИ. вот как-то так... Так что я думаю, что FN где-то в DSDT забита, ну или корни оттуда растут...
This post has been edited by Clubber_77: May 11 2010, 04:41 PM

May 12 2010, 08:41 AM




- Advanced Member
- Group: Developer
- Posts: 5,555
Да, в ДСДТ есть какие-то непонятные регионы, и есть какие-то методы SMI, которые, в частности, обращаются и к SMBus, хотя этого явно не видно.
А еще есть загадочная вещь EC controller, у которого есть методы перехвата событий, например _Q09. И для каждого железа эти номера разные.
Откуда их взять? Как узнать какие номера соответствуют каким событиям?

May 16 2010, 07:24 AM




- Advanced Member
- Group: Developer
- Posts: 5,555
QUOTE (tea @ May 11 2010, 03:58 PM)

Комбинации с Fn не имеют скэн-кодов.
Клавиатура пристегнута к ящику тонким шнурочком, и когда мы нажимаем Fn+Up по этому шнурочку бежит сигнал.
Хочешь, не называй это скан-кодом, но сигнал есть. Другое дело, что он не доходит до драйвера клавиатуры. Вот я и пытаюсь выяснить, на каком этапе сигнал перехватывается, чтобы изменить яркость экрана.
И почему МакОС ждет другого сигнала, чтобы нарисовать солнышко.
А я ответил на вопрос, почему все это заработало после исправления ДСДТ.
Дело в том, что я там исправил определение OS=Darwin. А это используется очень обширно. Одно из мест
CODE
Method (_Q51, 0, NotSerialized) -- одно из событий ЕС
{
Store (0x51, ISL0)
PHS (0x90)
Notify (ADP1, 0x80)
Store (One, PWRS)
If (LGreaterEqual (OSTB, 0x04)) -- тип ОС не меньше 4, т.е. WinXP, Vista. Darwin я сделал=20
{
Notify (\_PR.CPU0, 0x81)
}
}
Так что такой простой патч может серьезно улучшить систему.

May 17 2010, 04:20 AM




- Advanced Member
- Group: Comrade
- Posts: 146
Да, заработали "фичи" твоего EC контроллера. Тоже искал информацию по _Qxx методам... так и не нашел ничего.

May 17 2010, 10:35 AM




- Advanced Member
- Group: Developer
- Posts: 5,555
У меня вот нет такой программы, через которую я мог бы наблюдать в реальном времени какие-то происшествия в ДСДТ.
Когда будет - будет новая эра солюшинов и триков.

Jun 8 2010, 08:49 PM


- Member
- Group: Comrade
- Posts: 55
Вот немножко перебрав свой DSDT определил за счёт чего срабатывают функциональные клавиши(это FN+... F1 сон, F2 отк вкл wifi, F5,F6,F7 яркость экрана и выключить экран). Ещё неопределил за счёт чего срабатуют в DSDT функциональные клавиши FN Num LK(а вот как раз они и неотваливаются после сна).
Управление FN +
CODE
Scope (_SB.PCI0.LPCB.EC)
..........................
Method (_Q0A, 0, NotSerialized)// срабатывает сон FN+F1
{
Notify (SLPB, 0x80)
}
Method (_Q0B, 0, NotSerialized) // вкл окл wifi FN+F2
{
FNF2 ()
}
Method (FNF2, 0, Serialized)
{
If (And (^^^^ATKD.WAPF, 0x04))
{
If (ATKP)
{
Notify (ATKD, 0x88)
}
}
Else
{
Store (OHWR (), Local0)
If (And (Local0, 0x02))
{
If (And (Local0, One))
{
Store (One, Local0)
}
Else
{
Store (Zero, Local0)
}
}
Else
{
Store (One, Local0)
}
If (Local0)
{
If (And (^^^^ATKD.WAPF, One))
{
If (LAnd (WLDP, BTDP))
{
Store (WRST, Local0)
Or (ShiftLeft (BRST, One), Local0, Local0)
Increment (Local0)
If (LGreater (Local0, 0x03))
{
Store (Zero, Local0)
}
Store (DerefOf (Index (WBTL, Local0)), Local1)
If (LEqual (Local1, Zero))
{
Notify (ATKD, 0x5D)
Sleep (0x0DAC)
OBTD (Zero)
Notify (ATKD, 0x7E)
}
If (LEqual (Local1, One))
{
Notify (ATKD, 0x5D)
Sleep (0x0DAC)
OBTD (Zero)
Notify (ATKD, 0x7E)
}
If (LEqual (Local1, 0x02))
{
Notify (ATKD, 0x5D)
Sleep (0x0DAC)
OBTD (One)
Notify (ATKD, 0x7D)
}
If (LEqual (Local1, 0x03))
{
Notify (ATKD, 0x5D)
Sleep (0x0DAC)
OBTD (One)
Notify (ATKD, 0x7D)
}
}
Else
{
If (WLDP)
{
Notify (ATKD, 0x5D)
}
Else
{
If (BTDP)
{
If (BRST)
{
OBTD (Zero)
Notify (ATKD, 0x7E)
}
Else
{
OBTD (One)
Notify (ATKD, 0x7D)
}
}
}
}
}
Else
{
If (LAnd (WLDP, BTDP))
{
Store (WRST, Local0)
Or (ShiftLeft (BRST, One), Local0, Local0)
Increment (Local0)
If (LGreater (Local0, 0x03))
{
Store (Zero, Local0)
}
Store (DerefOf (Index (WBTL, Local0)), Local1)
If (LEqual (Local1, Zero))
{
OWLD (Zero)
Notify (ATKD, 0x5F)
Sleep (0x0DAC)
OBTD (Zero)
Notify (ATKD, 0x7E)
}
If (LEqual (Local1, One))
{
OWLD (One)
Notify (ATKD, 0x5E)
Sleep (0x0DAC)
OBTD (Zero)
Notify (ATKD, 0x7E)
}
If (LEqual (Local1, 0x02))
{
OWLD (Zero)
Notify (ATKD, 0x5F)
Sleep (0x0DAC)
OBTD (One)
Notify (ATKD, 0x7D)
}
If (LEqual (Local1, 0x03))
{
OWLD (One)
Notify (ATKD, 0x5E)
Sleep (0x0DAC)
OBTD (One)
Notify (ATKD, 0x7D)
}
}
Else
{
If (WLDP)
{
If (WRST)
{
OWLD (Zero)
Notify (ATKD, 0x5F)
}
Else
{
OWLD (One)
Notify (ATKD, 0x5E)
}
}
Else
{
If (BTDP)
{
If (BRST)
{
OBTD (Zero)
Notify (ATKD, 0x7E)
}
Else
{
OBTD (One)
Notify (ATKD, 0x7D)
}
}
}
}
}
}
Else
{
If (WLDP)
{
Notify (ATKD, 0x5F)
}
If (LAnd (WLDP, BTDP))
{
Sleep (0x0DAC)
}
If (BTDP)
{
Notify (ATKD, 0x7E)
}
}
}
}
Name (WBTL, Package (0x04)
{
Zero,
One,
0x02,
0x03
})
Method (_Q0E, 0, NotSerialized)//уменьшение яркости
{
If (LGreater (LBTN, Zero))
{
Decrement (LBTN)
}
If (LGreater (LBTN, 0x0F))
{
Store (0x0F, LBTN)
}
STBR ()
If (ATKP)
{
Notify (ATKD, Add (LBTN, 0x20))
}
Return (One)
}
Method (_Q0F, 0, NotSerialized)//увелечения ярк
{
If (LLess (LBTN, 0x0F))
{
Increment (LBTN)
}
Else
{
Store (0x0F, LBTN)
}
STBR ()
If (ATKP)
{
Notify (ATKD, Add (LBTN, 0x10))
}
Return (One)
}
Method (_Q10, 0, NotSerialized) //выкл вкл экран
{
Store (One, Local0)
Store (RPIN (0x11), Local0)
XOr (Local0, One, Local0)
SPIN (0x11, Local0)
If (ATKP)
{
Subtract (0x34, Local0, Local0)
Notify (ATKD, Local0)
}
}
...........
Не срабатывают в OSX (переключение на внешний разьём VGA. и регулировка звука)
CODE
Name (AVNC, Package (0x19)
{
Zero,
0x61,
0x62,
0x63,
0x64,
0x65,
0x66,
0x67,
0xA0,
0xA1,
0xA2,
0xA4,
0xA3,
0xA5,
0xA6,
0xA7,
0x8C,
0x8D,
0x8E,
0x90,
0x8F,
0x91,
0x92,
0x93,
Zero
})
Method (_Q11, 0, NotSerialized)
{
If (LNot (^^^IXVE.IGPU.NVDR))
{
If (LGreaterEqual (GDOS (), 0x02))
{
If (LEqual (GDOS (), 0x03))
{
NVGA (0x82)
}
}
Else
{
FHKW ()
Store (ADVG (), Local0)
If (NATK ())
{
Store (DerefOf (Index (AVNC, Local0)), Local1)
If (ATKP)
{
Notify (ATKD, Local1)
}
Else
{
SWHG (Local0)
}
}
Else
{
SWHG (Local0)
}
FHKS ()
}
}
Else
{
If (Or (LEqual (OSFG, OSVT), LEqual (OSFG, OSW7)))
{
Notify (^^^IXVE.IGPU, 0xCB)
}
Else
{
Notify (WMI0, 0xCB)
}
}
}
Name (FHKM, One)
Method (FHKW, 0, Serialized)
{
While (LNot (FHKM))
{
Sleep (0x0A)
}
Store (Zero, FHKM)
}
Method (FHKS, 0, Serialized)
{
Store (One, FHKM)
}
Method (_Q12, 0, NotSerialized)
{
If (ATKP)
{
And (TPAD, One, Local1)
If (Local1)
{
Notify (ATKD, 0x6F)
}
Else
{
Notify (ATKD, 0x6B)
}
}
}
Method (_Q13, 0, NotSerialized)
{
And (TPAD, 0x02, Local1)
If (Local1)
{
Noop
}
Else
{
If (ATKP)
{
Notify (ATKD, 0x32)
}
}
}
Method (_Q14, 0, NotSerialized)
{
And (TPAD, 0x02, Local1)
If (Local1)
{
Noop
}
Else
{
And (AVOL, 0x0F, AVOL)
If (LGreater (AVOL, Zero))
{
Decrement (AVOL)
}
If (ATKP)
{
Notify (ATKD, 0x31)
}
}
}
Method (_Q15, 0, NotSerialized)
{
And (TPAD, 0x02, Local1)
If (Local1)
{
Noop
}
Else
{
And (AVOL, 0x0F, AVOL)
If (LLess (AVOL, 0x0F))
{
Increment (AVOL)
}
If (ATKP)
{
Notify (ATKD, 0x30)
}
}
}
На управление клавиш PS2controller никакого влияния не несёт, функционируют за счёт загружемого драйвера AppleACPIEC.kext.
После сна те клавиши которые работают отваливаются, через DSDT возможно ли исправить?
This post has been edited by rus: Jun 8 2010, 10:33 PM

Jun 9 2010, 06:46 AM




- Advanced Member
- Group: Developer
- Posts: 5,555
QUOTE (rus @ Jun 9 2010, 12:49 AM)

Вот немножко перебрав свой DSDT определил за счёт чего срабатывают функциональные клавиши(это FN+... F1 сон, F2 отк вкл wifi, F5,F6,F7 яркость экрана и выключить экран). Ещё неопределил за счёт чего срабатуют в DSDT функциональные клавиши FN Num LK(а вот как раз они и неотваливаются после сна).
На управление клавиш PS2controller никакого влияния не несёт, функционируют за счёт загружемого драйвера AppleACPIEC.kext.
После сна те клавиши которые работают отваливаются, через DSDT возможно ли исправить?
Ну обычно мы лечим драйвер, который не просыпается прописыванием Notify в методе _Lxx
Вот пробуждение звука, к примеру
CODE
Method (_L0D, 0, NotSerialized) //EHC1, EHC2, HDEF
{
Store (SMI (0xC6, Zero), Local0)
If (And (Local0, One))
{
Notify (\_SB.PCI0.HDEF, 0x02)
}
Тебе только нужно выяснить, какое устройство не просыпается, LPC или EC, какой у него _PRW, и прописать нотифай.
Насчет методов _Qxx.
Я видел разные ДСДТ, и у всех нумерация методов для управления яркостью разная. Вопрос. Откуда берутся эти номера?
У меня на Делле ЕС вообще отсутствует, я хочу его прописать, но при этом все функциональные клавиши теряются, я их могу сделать через _Qxx методы, но не имею ни малейшего понятия о номерах, поскольку в оригинале их вообще нет.

Jul 22 2010, 11:37 AM

- Initiate
- Group: Comrade
- Posts: 5
А есть пример дсдт от ноута, у которого управление яркостью совпало со значениями МакОси для рисования солнышка? Чтобы посмотреть какие в дсдт прописаны методы для этих клавишь.

Jul 22 2010, 09:13 PM




- Advanced Member
- Group: Developer
- Posts: 5,555
QUOTE (Zatoichy @ Jul 22 2010, 03:37 PM)

А есть пример дсдт от ноута, у которого управление яркостью совпало со значениями МакОси для рисования солнышка? Чтобы посмотреть какие в дсдт прописаны методы для этих клавишь.
Насколько я успел убедиться - нет. Видно, есть два разных стандарта PC и MAC. А в ДСДТ прописаны самые разные методы, в разных РС по-разному. Я так понимаю, что это прошито в чипе ЕС, который разные производители вставляют разный.
Значит так: Fn+Up является стандартом для РС, и под него настаивают ЕС чипы разные производители, получаются разные методы _Qxx.
В Маке стандартом является Fn+Ins, который генерит
какое-то системное событие для всего ядерного, к железу это отношения не имеет,
какой-то кекст или фреймворк ловит это событие, рисует солнышко, и отправляет на драйвер приказ об изменении яркости.
Моя мечта, выяснить значения местоимений "какой-то".

Jul 24 2010, 09:24 AM

- Initiate
- Group: Comrade
- Posts: 24
Есть Samsung Q35, Backlight(PNLF) работает в 32х и в 64х. Если Backlight не заведён, то яркость регулируется с Fn+Up и Fn+Down и убавляется не до нуля. Если Backlight заведён, то яркость регулируется с Fn+12 и Fn+14 и убавляется до нуля. Пока kext не загружен - Fn+Up и Fn+Down, как только kext загрузился - Fn+12 и Fn+14.

Sep 16 2010, 05:12 PM




- Advanced Member
- Group: Developer
- Posts: 5,555
Разрешил.
Итак, функциональные клавиши имеют скан-коды и работают с драйвером клавиатуры. Я сделал модернизированный драйвер ApplePS2Keyboard который ловит все эти клавиши и заставил работать плейер (перемотка, плей, пауза).
Здесь:
http://www.projectosx.com/forum/index.php?showtopic=1456Далее драйвер формирует событие, которое передает в IOHIDFamily. Часть этих событий попадают драйверу AppleACPIEC.kext, который их обрабатывает согласно алгоритму, заложенному в ДСДТ. Вот так!
На маме есть еще интеллектуальные микросхемы LPC, SMBus, EC, BulkConverter, или даже что-то наподобие SMC, которые параллельно работают по своему алгоритму, независимо от операционной системы. На это мы повлиять не можем, разве что, методами ДСДТ или специальными драйверами заставить их реагировать на наши события. Например, FakeSMC извлекает оттуда температурный датчик, и регулирует вентиллятор (например для LPC ITE). Это частности. А в общем по топику - все в руках клавиатурного драйвера.