Вы можете довольно легко управлять некоторыми регистрами шины pci устройства с помощью setpci . Примечание: это опасно и может привести к сбою вашей системы!
Например, найдите шину pci и слот для своей графической платы:
$ lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
$ lspci -s 00:02.0 -v
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) (prog-if 00 [VGA controller])
DeviceName: Onboard IGD
Subsystem: Holco Enterprise Co, Ltd/Shuttle Computer Device 4018
Flags: bus master, fast devsel, latency 0, IRQ 29
Memory at f7400000 (64-bit, non-prefetchable) [size=4M]
Memory at e0000000 (64-bit, prefetchable) [size=256M]
I/O ports at f000 [size=64]
Expansion ROM at [disabled]
Capabilities:
Kernel driver in use: i915
Kernel modules: i915
Вы можете читать и записывать регистры с помощью setpci
. Вы должны быть root, чтобы читать некоторые регистры и записывать любой из них. Имена регистров перечислены как setpci --dumpregs
. Например:
$ setpci -s 00:02.0 command
0407
16-битный регистр pci config command
является важным регистром. Значение битов можно получить из заголовка linux . Младшие 3 бита равны 1, чтобы позволить устройству реагировать на циклы ввода-вывода и памяти от процессора, а также быть мастером шины, чтобы оно могло передавать данные в основную память процессора.
Если вы отключите эти биты, устройство больше не будет реагировать на ваш драйвер. Остерегайтесь, это может привести к сбою вашей системы . Не проверяйте это легкомысленно:
$ sudo setpci -s 00:02.0 command=0000 # DONT DO THIS!
Вы можете попробовать написать сценарий, чтобы установить регистр в 0, подождав несколько секунд, пока ваша графика попытается нарисовать, а затем верните регистр к исходному значению (command = 0407). Все числа в шестнадцатеричном формате (без префикса 0x). Как упоминалось в комментариях, вам может потребоваться предоставить 4 цифры для значения, несмотря на то, что ширина именованных регистров (например, command
) известна setpci
. Вы можете указать ширину с суффиксом к имени регистра .b
(8 бит), .w
(16) или .l
(32) .
Сброс оборудования сложнее, так как часто требуется, чтобы вы знали о конкретном регистре в оборудовании для сброса или в оборудовании родительской шины.