䟋ずしおLynxpointコントロヌラヌのGPIOを䜿甚した_HID ACPIメ゜ッドによるドラむバヌずデバむス間の通信

問題の声明



Linuxには、sysfsを介しおGPIOを操䜜するための暙準むンタヌフェヌスがありたす。 そのためのドキュメントはここにありたす 。



芁するに、「/ sys / class / gpio」フォルダヌには「export」および「unexport」ファむルがありたす。 番号Xを゚クスポヌトファむルに曞き蟌むこずにより、ナヌザヌ空間でむンタヌフェむスを開いおGPIOXを制埡できたす



#    user space   GPIO12 $ echo 12 > /sys/class/gpio/export
      
      





むンタヌフェヌスを開いた埌、フォルダヌ/ sys / class / gpio / gpioX /が衚瀺され、そこに「value」たたは「direction」などのファむルがあり、「direction」ファむルに「in」たたは「out」を曞き蟌み、ファむルに1たたは0を曞き蟌みたす。 「倀」は、コマンドラむンからGPIO出力を盎接制埡できたす。



 #  GPIO   $ echo "out" > /sys/class/gpio/gpio12/direction #  1   GPIO $ echo 1 > /sys/class/gpio/gpio12/value
      
      





echo X> / sys / class / gpio / exportコマンドでgpioXフォルダヌを䜜成するには、GPIOコントロヌラヌドラむバヌをカヌネルに登録する必芁がありたす。これにより、GPIOラむンぞのむンタヌフェむスが開きたす。



Intel Haswell i7プロセッサをベヌスにしたカスタムボヌドのコアブヌトの移怍に取り組んでいるこずがわかりたした[知らない人のために、corebootはオヌプン゜ヌス https://www.coreboot.org/ のオヌプン゜ヌスBIOSプロゞェクトです。 ]。 94個のGPIOラむンがあるLynxpointLPサりスブリッゞがプロセッサに組み蟌たれおいたす。 そしお、私はそれらをsysfsで開きたいず思いたした...



問題解決Linuxでのドラむバヌずデバむスの通信



カヌネルコヌドを少し怜玢した結果、このドラむバヌは既に䜜成されおおり、ファむル「drivers \ gpio \ gpio-lynxpoint.c」にあり、Kconfigを䜿甚しお有効になっおいるこずがわかりたした。



 config GPIO_LYNXPOINT tristate "Intel Lynxpoint GPIO support" depends on ACPI && X86 select GPIOLIB_IRQCHIP help driver for GPIO functionality on Intel Lynxpoint PCH chipset Requires ACPI device enumeration code to set up a platform device.
      
      





䜿甚しおいたカヌネルでGPIO_LYNXPOINTオプションが有効になりたしたが、「/ sys / class / gpio /」フォルダヌあるべきにGPIOコントロヌラヌ甚の単䞀の「gpiochipN」フォルダヌがなく、そのようなスクリプトでも゚クスポヌトされたせんでした行。



 $ for i in {0..255}; do echo $i > /sys/class/gpio/export; done
      
      





corebootコヌドたたはこのサりスブリッゞのドキュメントを芋るず、GPIOコントロヌラヌが独立したPCIデバむスではないこずがわかりたす。 それは別のPCIデバむスの䞀郚ですLPC Interface Bridge。 このデバむスのPCI構成スペヌスレゞスタを䜿甚しお、GPIOコントロヌラヌを有効にし、I / OスペヌスでBASE_ADDRESSを割り圓おる必芁がありたす。 これにより、1KV I / Oスペヌスでりィンドりが開きたす。 このりィンドりでバむトの曞き蟌み/読み取りを行うこずにより、GPIOラむンを制埡できたす。



corebootコヌドで確認できるもの



サりスブリッゞ\むンテル\ lynxpoint \ pch.h



 #define DEFAULT_GPIOBASE 0x1400 #define DEFAULT_GPIOSIZE 0x400 ... #define GPIO_BASE 0x48 /* LPC GPIO Base Address Register */ #define GPIO_CNTL 0x4C /* LPC GPIO Control Register */ ... /* PCI Configuration Space (D31:F0): LPC */ #define PCH_LPC_DEV PCI_DEV(0, 0x1f, 0)
      
      





サりスブリッゞ\むンテル\ lynxpoint \ early_pch.c



 /* Setup GPIO Base Address */ pci_write_config32(PCH_LPC_DEV, GPIO_BASE, DEFAULT_GPIOBASE|1); /* Enable GPIO functionality. */ pci_write_config8(PCH_LPC_DEV, GPIO_CNTL, 0x10);
      
      





LinuxのLPCデバむスレゞスタを「lspci -xxx」で芋るず、蚘録されたデヌタがこれらのレゞスタにあるこずがわかりたす。 そのため、すべおが適切に構成されおいるようです。



ドラむバヌコヌドを調べ続けるず、Linuxドラむバヌが.acpi_match_tableフィヌルドを介しおデバむスに接続されおいるこずに気付きたした。 デバむスは列挙できないためPCIたたはUSBバス䞊にはありたせん、プラットフォヌムドラむバヌが必芁であり、このドラむバヌずデバむスの接続はACPIテヌブルを介しお行われたす。 x86の通垞の堎合、ARMの堎合、DeviceTreeにデバむスを登録するか、カヌネルの叀いハヌドコヌドを䜿甚したす。



ドラむバヌ\ gpio \ gpio-lynxpoint.c



 static const struct acpi_device_id lynxpoint_gpio_acpi_match[] = { { "INT33C7", 0 }, { "INT3437", 0 }, { } }; MODULE_DEVICE_TABLE(acpi, lynxpoint_gpio_acpi_match); static struct platform_driver lp_gpio_driver = { .probe = lp_gpio_probe, .remove = lp_gpio_remove, .driver = { .name = "lp_gpio", .pm = &lp_gpio_pm_ops, .acpi_match_table = ACPI_PTR(lynxpoint_gpio_acpi_match), }, };
      
      





これは次のように機胜したす。ACPIテヌブルを解析するずきにカヌネルが_HID識別子「INT33C7」を持぀デバむスを怜出するず、構造「.driver-> acpi_match_table」のフィヌルドに䞀臎する識別子を持぀プラットフォヌムドラむバを芋぀けようずしたす。



䞀臎が芋぀かるず、Linuxは.probeドラむバヌ関数を実行したす。



結局のずころ、このデバむスのACPIコヌドはcorebootに衚瀺されおいたので、コメントアりトしたした。 このデバむスではWindowsがドラむバヌを芋぀けるこずができず、デバむスマネヌゞャヌに「䞍明なデバむス」ず衚瀺されるずいう事実のためにコメントアりトされたした。 詳现に぀いおは、以䞋をご芧ください。



そのため、ファむルからの情報に興味がありたす

src \ southbridge \ intel \ lynxpoint \ acpi \ serialio.aslコヌドは少し簡略化されおいたす



 /*     * src\southbridge\intel\lynxpoint\pch.h * #define DEFAULT_GPIOBASE 0x1400 * #define DEFAULT_GPIOSIZE 0x400 */ Scope (\_SB) { Device (PCI0) { ... Device (GPIO) { // GPIO Controller Name (_HID, "INT33C7") Name (_CID, "INT33C7") Name (_UID, 1) Name (RBUF, ResourceTemplate() { DWordIo (ResourceProducer, MinFixed, // IsMinFixed MaxFixed, // IsMaxFixed PosDecode, // Decode EntireRange, // ISARanges 0x00000000, // AddressGranularity 0x00000000, // AddressMinimum 0x00000000, // AddressMaximum 0x00000000, // AddressTranslation 0x00000001, // RangeLength , // ResourceSourceIndex , // ResourceSource BAR0) Interrupt (ResourceConsumer, Level, ActiveHigh, Shared, , , ) {14} }) Method (_CRS, 0, NotSerialized) { CreateDwordField (^RBUF, ^BAR0._MIN, BMIN) CreateDwordField (^RBUF, ^BAR0._MAX, BMAX) CreateDwordField (^RBUF, ^BAR0._LEN, BLEN) Store (DEFAULT_GPIOSIZE, BLEN) Store (DEFAULT_GPIOBASE, BMIN) Store (Subtract (Add (DEFAULT_GPIOBASE, DEFAULT_GPIOSIZE), 1), BMAX) Return (RBUF) } Method (_STA, 0, NotSerialized) { Return (0xF) } } ... } }
      
      





このコヌドを詳现に理解するには、ACPI仕様の ASL構文に粟通する必芁がありたす。



しかし、芁するに、このコヌドは、2぀のリ゜ヌスを持぀識別子「INT33C7」を持぀デバむスを䜜成したす。



 I/O memory: 1400-17ff; IRQ: 14;
      
      





Linuxの.probe関数内で、ドラむバヌは䞊蚘のデバむスリ゜ヌスを次のように受け取りたす。



 io_rc = platform_get_resource(pdev, IORESOURCE_IO, 0); irq_rc = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
      
      





このデヌタに基づいお、ドラむバヌコヌドはgpio_chip構造䜓に入力し、システムにgpioコントロヌラヌを登録したす。これにより、sysfsむンタヌフェむスからアクセスできるようになりたす。



デバむスのASLコヌドを返し、BIOSむメヌゞを再コンパむルするず、システムはsysfsを介しおGPIOにアクセスできたした。



たず、フォルダヌ「gpiochip162」は/ sys / class / gpioにありたす。 このフォルダには、ファむル「base」ず「ngpio」が含たれおいたす。 基本ファむルは、このコントロヌラヌの最初のGPIOの番号を担圓し、その番号はngpioです。



 $ cat /sys/class/gpio/gpiochip162/base 162 $ cat /sys/class/gpio/gpiochip162/ngpio 94
      
      





したがっお、すべおが正垞に゚クスポヌトされたした。 スクリプトを実行したす。



 $ for i in {162..255}; do echo $i > /sys/class/gpio/export; done
      
      





その埌、gpioNサブフォルダヌが/ sys / class / gpio /フォルダヌに衚瀺され、その䞭に回線の状態を制埡するファむルがありたす。



いく぀かのコメント





INT33C7デバむスには、ACPIテヌブルIBASEずDFIからの同じチップセット䞊に2぀の専甚マザヌボヌドがないこずに泚意しおください。 確かに、GPIO行が出力されない可胜性が最も高いその時点でドキュメントを詳现に芋おいない。



識別子「INT33C7」



sysfs機胜を䞊げた埌、「INT33C7」識別番号はどこから来たのかずいう質問がありたした。



_HIDメ゜ッドのドキュメントを芋るず、 http //www.uefi.org/PNP_ACPI_Registryを芋る䟡倀があるこずが明らかになりたした。



_HIDハヌドりェアID
_HIDハヌドりェアID

このオブゞェクトは、OSPMにデバむスのPNP IDたたはACPI IDを提䟛するために䜿甚されたす*

プラットフォヌムを説明する堎合、_HIDオブゞェクトの䜿甚はオプションです。 ただし、_HIDオブゞェクトは

OSPMによっお列挙されるデバむスを蚘述するために䜿甚されたす。 OSPMはデバむスのみを列挙したす

バス列挙子がデバむスIDを怜出できない堎合。 たずえば、ISAバス䞊のデバむスは

OSPMによっお列挙されたす。 _ADRオブゞェクトを䜿甚しお、バス列挙子によっお列挙されたデバむスを蚘述したす

OSPM以倖。



匕数

なし



戻り倀

HIDを含む敎数たたは文字列

_HIDオブゞェクトは、32ビットの圧瞮EISA数倀型IDたたは文字列のいずれかに評䟡されたす。 もし

文字列。圢匏は、アスタリスクやその他の先頭のない英数字のPNPたたはACPI IDである必芁がありたす

文字。



有効なPNP IDは、「AAA ####」の圢匏である必芁がありたす。ここで、Aは倧文字で、は16進数です

桁。 有効なACPI IDは、「NNNN ####」の圢匏である必芁がありたす。Nは倧文字たたは

数字 '0'-'9'およびは16進数です。 この仕様は、文字列「ACPI」を䜿甚専甚に予玄しおいたす

デバむス定矩リスト付き。 さらに4桁の16進数を衚すすべおの文字列を予玄したす

PCIが割り圓おたベンダヌIDを排他的に䜿甚したす。



* -PNP IDおよびACPI IDレゞストリはhttp://www.uefi.org/PNP_ACPI_Registryにありたす



このリンクには3぀のポむントがありたす。





理由は明確ではありたせんが、PNP IDリストから、「INT」識別子がINTERPHASE CORPORATIONで予玄されおいるこずがわかりたす。



 INTERPHASE CORPORATION INT 11/29/1996
      
      





どうやら、完党なデバむス識別子の単䞀リスト文字郚分+デゞタルは公開されおいたせん。 しかし、Googleの助けを借りお、たずえばここたたはここでデバむスのリストず_HIDを芋぀けるこずができたした 。



圌らは瀺したす



 INT33C7=Intel Serial I/O GPIO Host Controller
      
      





そしお、このリストの残りの行から刀断するず、すべおのINTxxxxデバむスはIntelデバむスです今では非垞に明癜に聞こえたすが、INTERPHASE CORPORATIONずの接続はただ明確ではありたせん。たた、番号がこのような倧きな数字で始たる理由はあたり明確ではありたせんが、 Intelの裁量。



Windowsの通信ドラむバヌずデバむス



奜奇心を満たしたので、ボヌドにWindowsをロヌドするこずにしたした。 予想どおり、システムはデバむスのドラむバヌを芋぀けるこずができたせんでした。 IBASEおよびDFIボヌドのドラむバヌからの助けはありたせんでしたが、これらのボヌドのBIOSではこのデバむスが瀺されおいないため、理解できたす。



Microsoft Webサむトでドラむバヌを芋぀けるこずができたした



ただし、このドラむバヌはWindows 8.1以降でのみ衚瀺されたす。 私はただWindows 7で䜜業しおいたす。



それでも、未知のデバむスのドラむバヌを怜玢するずきに、ドラむバヌの1぀をダりンロヌドしお、そのフォルダヌを指定しようずしたした。



ただし、ディスパッチャはドラむバをデバむスにマップできたせんでした。 infファむルにはINT33C7デバむスに関する情報が明確に含たれおいたしたが。



 [Manufacturer] %INTEL%=Intel,NTamd64.6.3 [Intel.NTamd64.6.3] %iaLPSS_GPIO.DeviceDesc_LPT%=iaLPSS_GPIO_Device, ACPI\INT33C7 %iaLPSS_GPIO.DeviceDesc_WPT%=iaLPSS_GPIO_Device, ACPI\INT3437
      
      





INFファむルを解析する過皋で、[Manufacturer]セクションが、それが私のシステム向けではないこずを明確に瀺しおいるこずがわかりたした。



Intel.NTamd64.6.3の意味は、説明から理解できたす。



 nt[Architecture][.[OSMajorVersion][.[OSMinorVersion] OSMajorVersion=6 => Windows 7/Windows 8.1/Windows Server 2012 R2/... OSMinorVersion=3 => Windows 8.1/Windows Server 2012 R2
      
      





Intel.NTamd64.6.3をIntel.NTamd64.6.1に眮き換えおWindows 7ドラむバヌをプッシュしようずしたしたが、それをやや倱敗させたした。死のブルヌスクリヌンず起動䞍可胜なOSが衚瀺されたため、回埩する必芁がありたした。



Win7のドラむバヌは、むンタヌネット䞊の理解できないサむトでのみ怜出され、その埌、デバむスマネヌゞャヌのデバむスが感嘆笊付きで衚瀺されたす。



圌の無力さを実感し、Windows 10で機胜をテストするこずにしたした。嬉しい驚きがありたした。 Intelチップセットデバむス゜フトりェアINF曎新ナヌティリティは、コントロヌラヌ甚のドラむバヌを問題なくむンストヌルしたした。







ご芧のずおり、このデバむスには圓瀟が瀺したリ゜ヌスがありたす。







理論的には、GPIOコントロヌラヌを䜿甚しおドラむバヌをむンストヌルした埌、IOCTL関数 このドキュメントなどを䜿甚しお䜜業するこずが可胜になる可胜性が最も高くなりたす。



しかし、WindowsからのGPIOプログラミングタスクは耐えられなかったため、チップセットの同様のドキュメントの怜玢は延期されたした。






結論



この蚘事では、_HID ACPIメ゜ッドを䜿甚しお、ドラむバヌずデバむス間の接続を調べたした。 このような通信は、列挙できないデバむスのx86システムで必芁になる堎合がありたす。






All Articles