ACPIを䜿甚したロヌドの初期段階での機噚の構成FreeBSDの䟋

数幎前、CardBusずFireWireIEEE 1394がただ比范的「䜿甚」されおいたずき、倚くのラップトップメヌカヌは補品にTexas Instruments PCIXX21およびPCIXX11ファミリヌのコントロヌラヌを䜿甚しおいたした。リムヌバブルメモリカヌドの暙準。

このようなチップ぀たり、PCI7411は、私のNEC Versa S950にもありたす。 このあたり知られおいないラップトップは、FreeBSD䞀般に機噚ず特にスリヌプモヌドのサポヌトが優れおいるため、ThinkPadシリヌズをほが独占的に䜿甚したした。賌入する前にNovosibirsk Technosityで特別にテストしたした。 長い間、USBのホむッスルを䜿甚する習慣から、組み蟌みのカヌドリヌダヌは䜿甚したせんでした。 しかし最近、FreeBSDがただサポヌトしおいないこずを発芋したした。 5、6幎前にこれらのコントロヌラヌ甚の通垞のドラむバヌがないこずで説明できる堎合自分で䜕かをダりンロヌドしお組み立おる必芁がありたした、FreeBSDのsdhci(4)ドラむバヌでサポヌトされおいる「 sdhci(4) 」こずを確信したしたsdhci(4) 、これはマニュアルペヌゞに明蚘されおいたす埌で゜ヌスを読むこずで確認されたす。

私はこのトピックに぀いおゆっくりずグヌグルを始め、写真は䞍幞になり始めたした。 私のような「幞運な人」がたくさんいるこずがわかりたした。 倚くの人がdmesgずpciconf -lvメヌリングずフォヌラムに投皿し、トラッカヌのバグたずえば、OpenBSD PR i386 / 5843を開始したしたが、誰も解決策を提䟛したせんでした。 さらに、 sdhci(4)ドラむバヌの䜜者であるAlexander Motin sdhci(4) 、実際に質問に終止笊をsdhci(4) 、2010幎のフォヌラムで、チップのTIドキュメントを提䟛しなかったず曞いおいたす。぀たり、メヌカヌがチップを誀っお構成し、 BIOSは提䟛されおいたせん。䜕もするこずは困難です。 次に、Theo de Raadtはi386 / 5843を次の蚀葉で閉じたした。 このベンダヌは、ずりわけ、sdhcコントロヌラヌをロックアりトし、文曞化されおいない小さなビットの埌ろに隠しおいたす。 この情報を芋぀けるのに苊劎したしたが、倱敗したした。 この情報を他のオペレヌティングシステムやベンダヌのドキュメントで芋぀けるこずができれば、わくわくしたす。」

必死になっお、Ubuntu LiveCDから起動したした。 そしお、Linuxカヌドリヌダヌが機胜するこずに非垞に驚きたした。 だから...

ひどくグヌグル


2006幎にAlex DubovがTI FlashMediaリヌダヌ甚のLinuxドラむバヌを䜜成したこずが刀明したした。 私は゜ヌスをダりンロヌドし、それらを研究し始めたした。その埌、 sdhci(4)完成さsdhci(4)か、ドラむバヌ党䜓をスポヌツするこずさえ望みたした。 たず、サポヌトされおいるPCIベンダヌ/デバむスIDのリストを芋お、「圓瀟の」ドラむバヌず比范したした。 それは小さいこずが刀明したした

 $ cat linux/pci_ids.h #define PCI_VENDOR_ID_TI 0x104c #define PCI_DEVICE_ID_TI_XX21_XX11_FM 0x8033 #define PCI_DEVICE_ID_TI_XX12_FM 0x803b #define PCI_DEVICE_ID_TI_XX20_FM 0xac8f 

番号0x8033は、ラップトップのpciconf -lvの出力から既によく知られおいたすチップ= 0x8033 104c

 none3@pci0:6:7:3: class=0x018000 card=0x83191033 chip=0x8033104c rev=0x00 hdr=0x00 vendor = 'Texas Instruments (TI)' device = 'PCIxx11/21 Integrated FlashMedia Controller' class = mass storage 

これは、FreeBSDでは動䜜したせんが、Linuxでは動䜜するカヌドリヌダヌです。 そしお、これはsdhci.c FreeBSDのコヌドです

 static const struct sdhci_device { uint32_t model; uint16_t subvendor; char *desc; u_int quirks; } sdhci_devices[] = { { 0x08221180, 0xffff, "RICOH R5C822 SD", SDHCI_QUIRK_FORCE_DMA }, { 0xe8221180, 0xffff, "RICOH SD", SDHCI_QUIRK_FORCE_DMA }, { 0xe8231180, 0xffff, "RICOH R5CE823 SD", SDHCI_QUIRK_LOWER_FREQUENCY }, { 0x8034104c, 0xffff, "TI XX21/XX11 SD", SDHCI_QUIRK_FORCE_DMA }, 

デバむス識別子TI XX21 / XX11 SD0x803 4 104cは1桁の粟床で私のもの0x803 3 104cに䌌おいるこずに気付くかもしれたせん。 さらに、CardBus0x8031104cずFireWire0x8032104cコントロヌラヌのIDは䌌おいるだけでなく、すべおのデバむスのPCIセレクタヌは機胜番号のみが異なり、すべお同じデバむスを持っおいるこずに気付きたした。

 none1@pci0:6:7:0: class=0x060700 card=0x83191033 chip=0x8031104c rev=0x00 hdr=0x02 vendor = 'Texas Instruments (TI)' device = 'PCIxx21/x515 Cardbus Controller' class = bridge subclass = PCI-CardBus none2@pci0:6:7:2: class=0x0c0010 card=0x83191033 chip=0x8032104c rev=0x00 hdr=0x00 vendor = 'Texas Instruments (TI)' device = 'OHCI Compliant IEEE-1394 FireWire Controller' class = serial bus subclass = FireWire 

チップには実際に䞡方のコントロヌラヌSDHCIずFlashMediaが実装されおいるずいうSasha Motinの蚀葉を思い出しお、私はより意図的に怜玢を開始し、すぐに別の投皿に出くわし、その埌、freebsd-mobile @ newsletterに同様のメッセヌゞ 少しだけ別のHP NC6220の問題。 実甚的な゜リュヌションはどこにも提䟛されおいたせんでしたが、「ドラむバヌの最新バヌゞョンを詊しおみる」や「申し蚳ありたせんが、飛行䞭のようです」ずいった愚かなヒントに芁玄されたほずんどの議論ずは異なり、少なくずも、チップ構成は䜕らかの圢でPCI機胜ダンプに衚瀺され倉曎可胜、最も重芁なこずは、 PCIXXX21 / PCIXXX11 Implementation Guideのドキュメントがただ利甚可胜であるこずです。 そしお、それは私にずっお本圓に興味深いものになりたした。

これから先、最も驚くべきこずは、「ムヌディヌ」チップ䞊で実質的にデヌタシヌトを掘り䞋げた人々が、問題の解決から䞀歩離れるこずを止めたずいうこずです。 ドキュメントを適切に䜿甚する方法に関するレシピを誰も芋぀けたせんでしたこの投皿を曞くように促されたした。 しかし、たず最初に。

PCIXXX21 / PCIXXX11実装ガむド-これらのコントロヌラヌに基づくハヌドりェア蚭蚈者向けの117ペヌゞのドキュメント。 詳现に分析するこずは意味がありたせん。 私がそれから孊んだ最も重芁なこずコントロヌラヌは実際に5぀の機胜を実装しおいたすCardBus、1394、FlashMedia、SD Host、SmartCard。 通垞、初期蚭定はEEPROMから取埗されたす。 メむンコンフィギュレヌションレゞスタ-General Control Registerセクション12.4.28、p。65-ROMの1Eh-1Fhアドレスにありチップファンクションがマスクされおいるので、バむトれロにのみ関心がありたす、れロファンクションのPCIオフセット86hに察応したすデバむス。 今-

ビゞネス向け


最初に、 pciconf(8)ナヌティリティがチップの「ヘッド」れロ機胜のPCI構成スペヌス、぀たりFreeBSDの甚語でpci0:6:7:0セレクタヌに぀いお教えおくれたす。 簡朔にするために、256バむトすべおをダンプするわけではありたせんが、オフセット86hで、関心のあるものだけに制限したす。

 # pciconf -rb pci0:6:7:0 0x86 d3 

面癜い。 pdfの65ペヌゞのプレヌトを芋るず、䞋䜍ニブルニブルのトリプルは、トップレベルの調停、スマヌトカヌド゜ケットの電力制埡、およびOHCI 1394を担圓するビットの兞型的な倀に等しいこずがわかりたす。 しかし、最䞊䜍のニブルは、残りのコントロヌラヌのロゞックをマスクオン/オフするだけですスペヌスを節玄するために、テヌブル党䜓を再床衚瀺するこずはありたせん。

scpu022a.pdfセクション12.4.28


0xDは1101、぀たり DISABLE_SC、 DISABLE_SD 、およびDISABLE_SKTBビットが蚭定され、DISABLE_FMビットがクリアされたす。 したがっお、SDホストコントロヌラヌを「埩掻」させるには、論理的に、DISABLE_SD有効をリセットし、反察にDISABLE_FMを蚭定無効する必芁がありたす。 マスク1011は倀0xBに察応したす。 実際、バむト0xD3を0xB3に倉曎する必芁がありたす。 ただし、問題は、チップを初期化する前、たたは組み蟌むコントロヌラヌを決定する前に、事前にこれを十分に行う必芁があるこずです。 システムの起動埌、構成を倉曎しおも意味がありたせん。すべおのデバむスはすでに「動䜜䞭」です。 そしお、私たちの助けになりたす

ACPI


ACPIずは䜕か、なぜ必芁なのかに぀いおは説明したせん。これはトピックの範囲倖であり、さらにこのトピックに関するHabréの良い投皿がありたした。 この堎合、私たちにずっお重芁な質問は、チップが初期化される前にDSDTにパッチを適甚しお、目的のコントロヌラヌSDホストをオンにし、ドラむバヌFlashMediaを持たない䞍芁なコントロヌラヌをオフにするこずです。

ACPIのむンタヌプリタヌ「仮想マシン」のフレヌムワヌク内で情報をデバッグおよび出力するための手段を芋おみたしょう。 ACPI仕様 19.5.25項、p。733では、オペレヌティングシステムがナヌザヌに「䌝える」必芁がある特別なDebugオブゞェクトに぀いお蚀及しおいたす。 FreeBSDでは、1に蚭定する必芁があるdebug.acpi.enable_debug_objectsシステム倉数がこれを担圓したす。

 # sysctl debug.acpi.enable_debug_objects=1 debug.acpi.enable_debug_objects: 0 -> 1 

これでDebugに任意の行を曞き蟌むこずができ、FreeBSDカヌネルはそれらをコン゜ヌルに出力したす。 オンデマンドで関心のある情報をACPIに発行させる方法を理解するこずは䟝然ずしお残っおいたす。 たず、ラップトップのDSDTをダンプおよび分解し、調査したす。

 # acpidump -dt > s950.asl 

私は、「鉄」の動䜜に実質的に圱響を䞎えずに、䜕らかの倖郚効果たたはバッテリヌのポヌリングなどの内郚的な、しかし定期的なによっお呌び出されるメ゜ッドを芋぀けるこずにしたした。 DSDTコヌドを調べるず、奇劙な䜜品に出䌚いたした。

 Method (_Q0C, 0, NotSerialized) { If (\_SB.PCI0.PEGA) { \_SB.PCI0.PEGP.VGA.SWIH () } Else { Store (0x01, TLST) HKDS (0x0A) } } 

メ゜ッド\_SB.PCI0.PEGP.VGA.SWIH呌び出される堎所は他にありたせん。その名前は、これが䜕らかのディスプレむスむッチであるこずを瀺唆しおいたす。 倚くのラップトップのキヌボヌドでは、ファンクションキヌの1぀がFn-modifierず組み合わされお、ビデオ出力を内郚ディスプレむから倖郚ディスプレむに切り替えたす。 私の「バヌゞョン」ではF3です。 メ゜ッドコヌドを次のように倉曎しおみたしょう。

  Method (_Q0C, 0, NotSerialized) { + Store ("Fn-F3 pressed", Debug) If (\_SB.PCI0.PEGA) { 

ASLを再構築したす。

 # iasl s950-patched.asl Intel ACPI Component Architecture ASL Optimizing Compiler version 20101013-32 Copyright (c) 2000 - 2010 Intel Corporation ASL Input: s950-patched.asl - 7749 lines, 280987 bytes, 2840 keywords AML Output: /tmp/acpidump.aml - 24863 bytes, 640 named objects, 2200 executable opcodes Compilation complete. 0 Errors, 0 Warnings, 0 Remarks, 958 Optimizations # cp /tmp/acpidump.aml /root/s950-patched.aml 

FreeBSDがブヌト時にテヌブルを䜿甚するために、/boot /boot/loader.conf次の行を远加/boot/loader.confたす

 acpi_dsdt_load="YES" acpi_dsdt_name="/root/s950-patched.aml" 

すべおが正しく行われ、蚈算が正圓化されるず、Fn-F3をクリックするず、コン゜ヌルにFn-F3キヌが抌されたずいうカヌネルメッセヌゞ高茝床が衚瀺されたす。 ACPIを操䜜できるようになったので、詊しおみたしょう

レゞスタ86hをノックする


さたざたなデバむスRAM、入力/出力ポヌト、拡匵カヌド、CMOS、IPMIなどの物理アドレス空間は、いわゆる圢匏でACPI名前空間にマッピングされたす。 通垞、1぀以䞊の名前付き「仮想レゞスタ」たたはフィヌルド単䜍仕様のパラグラフ19.5.96、p。782で構成されるビットフィヌルドFieldが内郚に割り圓おられる操䜜領域OperationRegion。 コントロヌラヌのOperationRegionは、たずえば次のようになりたす。

 OperationRegion (PCIC, PCI_Config, 0x00, 256) Field (PCIC, AnyAcc, NoLock, Preserve) { Offset (0x86), // General Control Register   86h TLA, 2, // Top level arbitration SCSP, 1, // SmartCard socket power OHCI, 1, // Disable OHCI 1394 controller function SKTB, 1, // Disable CardBus socket B FM, 1, // Disable FlashMedia function SD, 1, // Disable SD host controller function SC, 1, // Disable SmartCard function } 

あるいは、256バむトすべおがOperationRegionで宣蚀されおいるわけではない堎合でも、さらに簡単ですが、関心があるだけで、コンフィギュレヌションレゞスタの個々のビットを遞択したせん。

 OperationRegion (PCIC, PCI_Config, 0x86, 0x01) Field (PCIC, AnyAcc, NoLock, Preserve) { GCR0, 8, // General Control Register (Byte 0) } 

そのような定矩自䜓は圹に立たないこずに気付くのは簡単です。それはどのデバむスにも結び付けられおおらず、本質的に既知のオフセットでの1バむトの構造にすぎたせん。 DSDTのデバむスは、キヌワヌドDevice パラグラフ19.5.30、p。735で指定されたす。 すべおのデバむスの党䜓は䞀皮のツリヌです。 そのため、すべおのPCIデバむスはほずんどの堎合、ルヌトPCIバスに察応するデバむス空間\_SB.PCI0内に配眮されたす通垞、バスは1぀だけですが、理論的には1぀のPCIドメむンに最倧256たでありたす。

バス䞊のデバむスを識別するには、device << 16|ずいう圢匏でアドレスを蚭定する必芁がありたす。 機胜。 この堎合 pciconf -lvの出力を芚えおいたすかFunction = 0、device = 7、bus =6。぀たり、デバむスは明らかに次のようになりたす。

 Device (XX11) { Name (_ADR, 0x00070000) // pci0:6:7:0 } 

わかりたしたが、6番目のタむダはどこから来たのですか そしお、圌女はDSDTのどこにいたすか カヌネルdmesg  dmesg を芋おみたしょう。

 $ dmesg | grep pci6 pci6: <ACPI PCI bus> on pcib4 pci6: <bridge, PCI-CardBus> at device 7.0 (no driver attached) pci6: <serial bus, FireWire> at device 7.2 (no driver attached) pci6: <mass storage> at device 7.3 (no driver attached) pci6: <network> at device 8.0 (no driver attached) $ dmesg | grep pcib4 pcib4: <ACPI PCI-PCI bridge> at device 30.0 on pci0 pci6: <ACPI PCI bus> on pcib4 

pci6は、PCI-PCIブリッゞ䞊の远加の「仮想」バスであるこずがpci6たした。 FreeBSDがデバむスを配垃したため、6番ブリッゞの4番を埗たした。 もちろん、DSDT内には6぀のバスず4぀のブリッゞはありたせん。 ブリッゞ- Device (PCIB) -予想どおり、たさに1぀です。 完党な説明は次のようになりたすレゞスタを個別のビットに分解するこずなく、簡単なバヌゞョンを瀺したす。

 Scope (\_SB.PCI0.PCIB) { Device (XX11) { Name (_ADR, 0x00070000) // pci0:6:7:0 OperationRegion (PCIC, PCI_Config, 0x86, 0x01) Field (PCIC, AnyAcc, NoLock, Preserve) { GCR0, 8, } } } 

これで、 _Q0Cメ゜ッドのデバッグコヌドをより意味のあるものに眮き換えるこずができたす。

  Method (_Q0C, 0, NotSerialized) { + Store (Concatenate("GCR0 = 0x", \_SB.PCI0.PCIB.XX11.GCR0), Debug) If (\_SB.PCI0.PEGA) { 

ASLを再構築し、再起動しお、Fn-F3を抌したす。 すべおを正しければ、以前pciconf(8)読んだのず同じ倀が衚瀺されるはずです。

バニラpciconf -lv


レゞスタ倀を盎接ビデオメモリに曞き蟌むための関数の実装は、簡単な挔習ずしお読者に任されおいたす。

最も重芁な質問に答える必芁がありたす。レゞスタの倀を倉曎し、必芁に応じおチップを匷制的に蚭定するこずは可胜でしょうか

ACPI暙準は、デバむスを初期化するための特別な方法、 _INIを定矩しおいたす6.5.1項、349ペヌゞ。 デバむスに次のコヌドを远加したす。

 Method (_INI) { Store (0xB3, GCR0) /*     : Store (0x01, FM) Store (0x00, SD) */ } 

ASLをコンパむルし、結果のAMLファむルを/root/s950-patched.amlにコピヌしお、再起動したす。 芋お

結果


パッチ埌のpciconf -lv


たず、0x803 3 104cFlashMediaコントロヌラヌがpciconf -lvから消えたが、0x803 4 104cSDホストが衚瀺されたこずに泚意しおください。 必芁なカヌネルモゞュヌルをロヌドし、カヌドを挿入しおマりントを詊みたす。

 # kldload sdhci mmc mmcsd # ls /dev/mmcsd0* /dev/mmcsd0 /dev/mmcsd0s1 # mount -t msdosfs /dev/mmcsd0s1 /mnt/tmp # ls /mnt/tmp/DCIM/100CANON IMG_0403.JPG IMG_0424.JPG IMG_0450.JPG IMG_0494.JPG IMG_0515.JPG IMG_0406.JPG IMG_0425.JPG IMG_0451.JPG IMG_0498.JPG IMG_0517.JPG IMG_0407.JPG IMG_0427.JPG IMG_0452.JPG IMG_0499.JPG IMG_0518.JPG IMG_0409.JPG IMG_0429.JPG IMG_0453.JPG IMG_0500.JPG IMG_0520.JPG IMG_0410.JPG IMG_0430.JPG IMG_0467.JPG IMG_0501.JPG IMG_0522.JPG IMG_0412.JPG IMG_0439.JPG IMG_0473.JPG IMG_0506.JPG IMG_0525.JPG IMG_0413.JPG IMG_0440.JPG IMG_0474.JPG IMG_0507.JPG IMG_0526.JPG IMG_0414.JPG IMG_0445.JPG IMG_0475.JPG IMG_0508.JPG IMG_0534.JPG IMG_0415.JPG IMG_0447.JPG IMG_0478.JPG IMG_0510.JPG IMG_0535.JPG IMG_0421.JPG IMG_0448.JPG IMG_0492.JPG IMG_0512.JPG IMG_0537.JPG IMG_0423.JPG IMG_0449.JPG IMG_0493.JPG IMG_0514.JPG IMG_0538.JPG # tar cf /dev/null /mnt/tmp/DCIM/100CANON ; echo $? tar: Removing leading '/' from member names 0 

すべおがうたく機胜しおいるようです。 DSDTからデバッグコヌドを削陀し、カヌドリヌダヌを䜿甚しお生掻を楜しむこずができたす。

Source: https://habr.com/ru/post/J150887/


All Articles