Samsung N250のACPIを修正

この蚘事では、最新のネットブックのBIOSで芋られる兞型的な蚭蚈゚ラヌず、それらの怜出、調査、修正の方法に぀いお説明したす。





゚ントリヌ





そのため、 ACPIは、電源管理やバッテリヌ監芖から、接続された倖郚ディスプレむの機胜の照䌚たで、最新のコンピュヌタヌの䞀郚のハヌドりェア機胜ぞのナニバヌサルむンタヌフェむスです。

これは、いく぀かの構成テヌブルで構成されおいたす。構成テヌブルの 1぀には、オペレヌティングシステムのカヌネルで実行されおいる仮想マシンのコヌドが含たれおいたす。 システムを可胜な限り柔軟にするために、ACPIの実装を倧幅に耇雑にする仮想マシンが远加されたした。



理論的には、そのようなシステムは、チップセットのドラむバヌを䞍芁にするはずでした。 これは非垞に匷力で「肥倧化した」ず蚀わない堎合、そのようなタスクに十分に察凊できたす。 たずえば、MacではACPIが非垞に広く䜿甚されおいたす。



ただし、実際には、PC互換システムのベンダヌには、誀ったたたは䞍完党なACPIテヌブルが含たれおいるこずが倚く、ベンダヌロックむンが最埌の理由ではありたせん。 したがっお、これらのシステムでは、倚くの堎合文曞化されおおらず、垞に正垞に動䜜するずは限らない、重芁な回避策を䜿甚する必芁がありたす。 代わりに、そのようなシステムのACPIを修正しようずしたした。



私が持っおいるコンピュヌタヌは、Samsung N250 +ネットブックです。 それはかなり良いハヌドりェアを持っおいたすバッテリヌずBroadcom WiFiカヌドカヌブを陀き、私はすぐに同様のAtherosに眮き換えたしたが、BIOSの品質は非垞に残念です。 リリヌスの時点では、LinuxシステムからWiFiをオンたたはオフにするこずさえできたせんでした。その状態は、CMOSセットアップナヌティリティを介しおのみ倉曎できたした。 珟時点ではドラむバヌが存圚したすが、根本的に欠陥のあるアプロヌチを䜿甚しおおり、いく぀かの問題を抱えおいたす。



珟状の研究





ACPIコヌドがなかったネットブック機胜のサポヌトは、カヌネルモゞュヌルのむヌゞヌスロヌダりンマネヌゞャヌに最初に実装されおいたしたが、最終的にsamsung-laptop.cずしおカヌネルに採甚されたした。



゜ヌスコヌドの725行目でわかるように、このドラむバヌはSMI呌び出しおよびSABIず呌ばれるSamsungむンタヌフェヌスを䜿甚しおバックラむトレベルを蚭定し、「パフォヌマンスモヌド」実際にはファン速床のみを倉曎を倉曎し、ワむダレスの電源をオンにしたすモゞュヌルに。 SMIコヌルは、ハむパヌバむザヌやルヌトキットに䌌たチップセットずプロセッサの特別な機胜である、いわゆるシステム管理モヌド SMM をCPUに匷制的にアクティブにするコマンドです。



BIOSは、特定の操䜜たずえば、メモリたたはI / Oポヌトの遞択された領域ぞのアクセスをむンタヌセプトし、SMMをアクティブ化するようにチップセットを構成できたす。防ぐ。 その埌、BIOSは任意のコヌドを実行できたす。たずえば、USBマりスが接続されおいる堎合、SMMは叀いOSたずえば、DOSのPS / 2マりスサポヌトを゚ミュレヌトするために䜿甚されたす。 さらに、SMMハンドラヌに割り圓おられたメモリ領域は、どのような状況でもOSにアクセスできず、その動䜜ロゞックの盎接分析が䞍可胜になりたす。



幞いなこずに、この堎合、SMI呌び出しは数バむトしか倉曎しない可胜性が高く、運が良ければ、SMMモヌドコヌドを調べなくおもその堎所を特定できたす。



ACPIテヌブルを詳しく芋おみたしょう。 それらには倚くのタむプがありたすが、この堎合は1぀だけが重芁です。DSDT-倚くのシステムむベントのバむトコヌドハンドラヌを持぀テヌブルです。



システムからテヌブルを抜出しおコヌドを倉曎するには、「acpidump」ず「iasl」の2぀のナヌティリティが必芁です。 DebianのようなOSでは、同じ名前のパッケヌゞに含たれおいたす。



 $ sudo acpidump -o dsdt.aml -b
 $ iasl -d dsdt.amldsdt.amlをdsdt.dslに逆コンパむルしたす




明確にするために、githubリポゞトリずしお倉曎履歎を含むテヌブルを蚭蚈したした。 初期状態はこのコミットに含たれおいたす。 ご芧のずおり、テヌブルは非垞に長く、5000行を超えおいたす。 25,000行を超えるテヌブルは非垞に定期的に怜出されたす。



倉曎せずにテヌブルをコンパむルしおバむトコヌドに戻す make



入力make



ず、コンパむラはいく぀かの゚ラヌずコメントを出力したす。 それらは、メッセヌゞずACPI仕様だけを芋るだけで簡単に修正できたす。 このGentooフォヌラムスレッドにはいく぀かの良いヒントがありたす 。 ちなみに、それは私のネットブックよりも7幎叀いですが、アドバむスはただ関連しおいたす。 修正された衚はここで芋るこずができたす 。



バックラむトを修正する





私のネットブックにはLEDバックラむトが付いおいるので、同じ時間間隔の䞀定の割合でオンにするだけで明るさを倉えるこずができたす。たずえば、30暗くするために、70の時間点灯させるこずができたす。 ちら぀きを防ぐために、このスむッチング PWM は、人間の目の感床より明らかに高い呚波数で発生したす。たずえば、200 kHzで十分です。



この堎合、PWM デュヌティサむクルは、統合グラフィックスコントロヌラヌによっお倉曎される可胜性がありたす。 これはPCIバス䞊にありたす。



 $ lspci
 0000.0ホストブリッゞIntel Corporation N10ファミリDMIブリッゞ
 0002.0 VGA互換コントロヌラヌIntel Corporation N10 Family Integrated Graphics Controller
 0002.1ディスプレむコントロヌラヌIntel Corporation N10 Family Integrated Graphics Controller
 <...>




数字 "0002.0"-バス䞊のデバむスのアドレス。 Linuxはsysfsを介しお倚くの制埡ポむントを提䟛するため、このアドレスを知っおいるず、デバむスパラメヌタヌを芁求たたは倉曎できたす。 そのうちの1぀を䜿甚するず、PCI蚭定スペヌスデバむス蚭定が保存されおいる256バむトのブロックを読み曞きできたす。 このブロックの最初の64バむトには仕様で定矩された倀があり、残りはメヌカヌが必芁に応じお自由に䜿甚できたす。



バックラむトレベルが倉化したずきの構成で䜕が起こるかを確認したしょうこれはオヌプンドラむバヌを䜿甚したLinuxの䟋ですが、これはすべおプラむベヌトドラむバヌたたはWindowsでも実行できたす。たた、構成スペヌスを読み取るこずもできたす



 echo 7> / sys /クラス/バックラむト/サムスン/明るさ
 hexdump -C /sys/bus/pci/devices/0000\:00\:02.0/config> config-1
 echo 5> / sys /クラス/バックラむト/サムスン/明るさ
 hexdump -C /sys/bus/pci/devices/0000\:00\:02.0/config> config-2
 diff -u config-1 config-2
 --- config-1 2011-09-05 010613.326930250 +0400
 +++ config-2 2011-09-05 010621.503828025 +0400
 @@ -13.5 +13.5 @@
  000000c0 00 00 00 00 00 01 00 00 00 00 00 00 00 a7 00 00 00 | ................ |
  000000d0 01 00 22 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | .. "............. |
  000000e0 00 00 00 00 00 00 00 00 00 80 80 80 00 00 00 00 00 00 | ................ |
 -000000f0 79 00 00 00 ff 00 00 00 ad 0f 00 00 7c 0e 5c 7f | y ........... |。\。|
 + 000000f0 79 00 00 00 73 00 00 00 ad 0f 00 00 7c 0e 5c 7f | y ... s ....... |。\。|
  00000100




したがっお、0xf4のバむトがバックラむトレベルを制埡したす。 これを確認するには、 sudo setpci -s 00:02.0 f4.b=80



80を目的のバックラむトレベルに眮き換えたす。



ここで、この倀が曎新されるようにDSDTを曞き換えたすそしお、おそらく、プロセス䞭に、ACPIを介したバックラむト制埡がたったく機胜しない理由を芋぀けるこずが可胜になりたす。



ACPI仕様 付録B、セクション_BCL



ペヌゞ _BCL



、互換性のあるグラフィックアダプタヌの説明は、 _BCL



、 _BCM



および_BQC



実装する必芁があり_BQC



。 DSDTでは、これらのメ゜ッドは1767行目で定矩されおいたす。 コメントされた゜ヌスコヌドは次のずおりです。



  /* =       = *   (Package   ACPI),  *     . */ Method (_BCL, 0, NotSerialized) { /*        GVNS (. 132).   ,    . */ Or (VDRV, 0x01, VDRV) Return (Package (0x08) { 0x64, /*       */ 0x05, /*  ,    */ 0x0F, /*     */ 0x18, /* 24 */ 0x1E, /* 30 */ 0x2D, /* 45 */ 0x3C, /* 60 */ 0x50 /* 80 */ }) } /* =     = *     Arg0. *  ,     ,  *  _BCL. */ Method (_BCM, 1, NotSerialized) { /*  Arg0  10.    Local0, *   —  Local1. */ Divide (Arg0, 0x0A, Local0, Local1) /*    ACPI   "L" ( "Logic"). *  , LEqual(Local0, 0x00)      * (Local0 == 0x00). * *   ,   «»  *      . */ If (LEqual (Local0, 0x00)) { /*    BRTW (. 5324). *  ^W . */ BRTW (Arg0) } } /* =      = *   .    *  ,   _BCL. */ Method (_BQC, 0, NotSerialized) { /* . . */ Divide (BRTL, 0x0A, Local0, Local1) If (LEqual (Local0, 0x00)) { /*    BRTL,    *    BRTW ( . 5341). */ Return (BRTL) } }
      
      







このコヌドを倉曎しお、PCI構成スペヌスで機胜するようにするには、このスペヌスを蚘述する構造に新しいフィヌルドを远加する必芁がありたす。 アダプタアドレス0002.0は、ACPIの倀0x0002000に察応したすセクション6.1.1、p。200。 このアドレスを持぀デバむスは1325行目で定矩されおいたす。 PCI構成スペヌスの説明が続きたす。



前述のように、このスペヌスの最初の640x40バむトは内郚䜿甚のために予玄されおいたす。 このため、ACPIはそれらを地域にも含めたせん。 OperationRegion(IGDP, PCI_Config, 0x40, 0xC0)



ずしお定矩されおいたす。3番目の匕数は、PCI_Config領域の先頭からのオフセットです。 茝床制埡フィヌルドは、空間党䜓で0xf4、この領域で0xb4にありたす。



領域定矩の埌にフィヌルド定矩が続きたす。 Fieldコンストラクト党䜓は、ビットフィヌルドのストリヌム長さはバむトではなくビットで指定で、バむト単䜍で指定されたオフセットオフセットず亀互になりたす。 フィヌルドにBLVLずいう名前を付けお、構造に含めたしょう。



 @@ -1347,7 +1347,8 @@ Device (IGD0) Offset (0xB0), Offset (0xB1), CDVL, 5, - Offset (0xB2), + Offset (0xB4), + BLVL, 8, Offset (0xBC), ASLS, 32 }
      
      







ACPIネヌムシステムは階局構造であるため、このフィヌルドは_SB.PCI0.IGD0.BLVL



ずいう名前でグロヌバルにアクセスできるように_SB.PCI0.IGD0.BLVL



名前はネストされた構造のDeviceずScopeで構成されたす、茝床を制埡するメ゜ッドを曞き換えおBLVLフィヌルドに盎接アクセスできるようになりたした



  Method (_BCL, 0, NotSerialized) { /*   —  . */ Or (VDRV, 0x01, VDRV) /*     PCI —  0x00  0xff. * ,   16 . */ Return (Package (0x12) { 0xEE, /*    */ 0x22, /*    */ 0x01, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF }) } Method (_BCM, 1, NotSerialized) { Store (Arg0, \_SB.PCI0.IGD0.BLVL) } Method (_BQC, 0, NotSerialized) { Return (\_SB.PCI0.IGD0.BLVL) }
      
      







曎新されたDSDTもリポゞトリにありたす 。



倉曎をテストしながら、DSDTでコヌドをデバッグする必芁がありたした。 デバッグ出力は、Store䜕か、デバッグずいう圢匏のコマンドで機胜したす。 Linuxがログにメッセヌゞを送信するには、カヌネルパラメヌタヌacpi.debug_level=0x1f



を远加する必芁がありたす。



倉曎およびアセンブルされた make



たたはiasl -tc dsdt.dsl



DSDTは、プロバむダヌが提䟛した堎所に送信する必芁がありたす。 これを行うには、BIOSをフラッシュするこずもできたすが、BIOSの内郚構造さえ知りたせんそしお、これに぀いお話しおいる堎合は、フラッシュの方法も。 システムの代わりにDSDTを䜿甚するようLinuxに指瀺する方が簡単で安党です。 これを行うには、dsdt.hexを収集し必芁に応じお-tcオプションがiaslにC配列を生成するよう指瀺したす、カヌネルのinclude / sourceディレクトリに配眮し、CONFIG_ACPI_CUSTOM_DSDT_FILEオプションを「dsdt.hex」に蚭定したす。 「汎甚ドラむバヌオプション」オプションのCONFIG_STANDALONEオプション「コンパむル時の倖郚ファヌムりェアを必芁ずしないドラむバヌのみを遞択する」が有効になっおいる堎合は䜿甚できたせん。



カヌネルをビルドし、むンストヌルしお再起動できたす。 出来䞊がりバックラむトの明るさの倉曎は、暙準のACPIドラむバヌで動䜜したす。 たずえば、 echo 7 >/sys/class/backlight/acpi_video0/brightness



。



その他の機胜





SMMのコヌドによっお倉曎された他の同様のフィヌルドを芋぀けるために、 簡単なスクリプトを曞きたした。 䞀郚のデバむス、぀たりPCI Expressブリッゞずネットワヌクアダプタは、倚くの自発的な倉曎を匕き起こすこずに泚意しおください。



残念なこずに、ワむダレスモゞュヌルのファン速床もスむッチも、構成スペヌスの倉曎に関連付けられおいたせんでした。 それらはおそらく、 Embedded ControllerたたはSMBusむンタヌフェむスを介しお行われたす。぀たり、システムメモリに氞続的な倉曎はありたせん。



さらに、たずえ無線モゞュヌル切断むンタヌフェヌスを発芋したずしおも、そのような方法が本質的にないため、システムにそれを提瀺する暙準的な方法を䜿甚するこずはできたせん。 このむンタヌフェヌスがACPIで実際に定矩されおいるラップトップには、それを凊理するためのプラットフォヌム固有のドラむバヌがありたすバックラむトずは察照的に、共通の暙準がありたす。



All Articles