Перейти к содержимому

Amd gpio для promontory что это

  • автор:

Обзор поддержки драйверов GPIO

Начиная с Windows 8, расширение платформы GPIO (GpioClx) упрощает создание драйвера для устройства контроллера GPIO. Кроме того, GpioClx обеспечивает поддержку драйверов для периферийных устройств, которые подключаются к контактам GPIO. GpioClx, которое является системным расширением для платформы драйвера в режиме ядра (KMDF), выполняет задачи обработки, общие для членов класса устройств GPIO.

В этом обзоре рассматриваются следующие темы:

  • Обзор поддержки драйверов GPIO
    • Драйверы контроллера GPIO
    • Драйверы для периферийных устройств, использующих контакты GPIO

    Драйверы контроллера GPIO

    Поставщики оборудования предоставляют драйверы для управления контроллерами GPIO. Драйвер контроллера GPIO — это драйвер KMDF, который управляет всеми аппаратными операциями для контроллера GPIO. Драйвер контроллера GPIO взаимодействует с GpioClx для обработки запросов ввода-вывода для групп контактов GPIO, настроенных в качестве входных и выходных данных. Кроме того, этот драйвер взаимодействует с GpioClx для обработки запросов прерываний от контактов GPIO, настроенных как входные данные прерывания.

    Устройство контроллера GPIO имеет некоторое количество контактов GPIO. Эти контакты могут быть физически подключены к периферийным устройствам. Контакты GPIO можно настроить как входные данные, выходные данные или входные данные прерывания запроса. Как правило, пин-код GPIO выделяется для периферийного устройства и не используется двумя или более устройствами. Подключения между контактами GPIO и периферийными устройствами фиксируются и не могут быть изменены пользователем (например, путем удаления периферийного устройства и замены его другим устройством). Таким образом, назначение контактов GPIO периферийным устройствам можно описать в встроенном ПО платформы.

    На следующей схеме показаны драйвер контроллера GPIO и GpioClx.

    блок-схема компонентов gpio.

    Драйвер контроллера GPIO и GpioClx взаимодействуют друг с другом через интерфейс драйвера устройства (DDI) GpioClx. Драйвер контроллера GPIO вызывает методы поддержки драйверов , реализованные GpioClx. GpioClx вызывает функции обратного вызова событий , реализованные драйвером контроллера GPIO.

    Драйвер контроллера GPIO напрямую обращается к аппаратным регистрам устройства контроллера GPIO.

    GpioClx обрабатывает запросы ввода-вывода от драйверов для периферийных устройств, которые физически подключаются к контактам GPIO. GpioClx преобразует эти запросы ввода-вывода в простые аппаратные операции, которые выполняются путем вызова функций обратного вызова событий, реализованных драйвером контроллера GPIO. Например, чтобы считывать данные из набора контактов GPIO или записывать их в набор, GpioClx вызывает функции обратного вызова событий, такие как CLIENT_ReadGpioPins и CLIENT_WriteGpioPins. GpioClx управляет очередями ввода-вывода для контроллера GPIO и тем самым освобождает драйвер контроллера GPIO от этой задачи.

    Кроме того, GpioClx обрабатывает основные прерывания с устройства контроллера GPIO и сопоставляет эти прерывания со вторичными прерываниями, которые обрабатываются драйверами периферийных устройств. Основные прерывания — это прерывания, создаваемые аппаратными устройствами. Дополнительные прерывания создаются операционной системой в ответ на некоторые основные прерывания. Первичные и вторичные прерывания определяются глобальными системными прерываниями (GSIS). Встроенное ПО ACPI для аппаратной платформы назначает GSIS основным прерываниям, а во время выполнения операционная система назначает GSIS вторичным прерываниям.

    Например, встроенное ПО назначает GSI аппаратному прерыванию из контроллера GPIO, а операционная система назначает GSI контакту GPIO, настроенной в качестве входных данных прерывания.

    GpioClx реализует ISR, который обрабатывает созданные оборудованием основные прерывания с устройства контроллера GPIO. Когда периферийное устройство подтверждает прерывание контакта GPIO, а прерывания на этом контакте включены и отключены, контроллер GPIO прерывает работу процессора. В ответ обработчик ловушки ядра планирует запуск ISR GpioClx. Чтобы определить контакт GPIO, вызвавшего прерывание, isR GpioClx вызывает функцию обратного вызова события CLIENT_QueryActiveInterrupts , которая реализуется драйвером контроллера GPIO. Затем ISR GpioClx ищет GSI, назначенный этому контакту, и передает этот GSI на уровень аппаратной абстракции (HAL). HAL создает дополнительное прерывание путем вызова ISR, зарегистрированного для этого GSI. Этот ISR принадлежит драйверу для периферийного устройства, которое первоначально подтвердило прерывание.

    Дополнительные сведения о первичных и вторичных прерываниях см. в разделе Прерывания GPIO.

    Драйверы для периферийных устройств, использующих контакты GPIO

    При запуске диспетчер Plug and Play (PnP) перечисляет как устройства PnP, так и устройства, отличные от PnP. Для устройств, отличных от PnP, которые имеют фиксированные подключения к контактам GPIO, диспетчер PnP запрашивает встроенное ПО платформы, чтобы определить, какие контакты GPIO назначаются в качестве управляемых системой аппаратных ресурсов для этих устройств.

    Драйвер KMDF для периферийного устройства получает назначенные ему аппаратные ресурсы во время обратного вызова EvtDevicePrepareHardware . Эти ресурсы могут включать контакты GPIO, настроенные в качестве выходных данных, входных данных или входных данных запроса прерывания.

    Ресурс ввода-вывода GPIO — это новый тип ресурса Windows в Windows 8. Этот ресурс состоит из одного или нескольких контактов GPIO, которые можно использовать в качестве входных или выходных данных. Если драйвер периферийного устройства открывает ресурс ввода-вывода GPIO для операций чтения, драйвер использует все контакты в ресурсе в качестве входных данных. Если драйвер открывает ресурс ввода-вывода GPIO для операций записи, драйвер использует все контакты в ресурсе в качестве выходных данных. Примеры кода, показывающие, как драйвер периферийного устройства открывает логическое подключение к набору контактов ввода-вывода GPIO, см. в следующих разделах:

    Пин-код GPIO, настроенный в качестве входных данных прерывания, назначается драйверу в качестве обычного ресурса прерывания Windows. Абстракция ресурса прерывания скрывает тот факт, что прерывание может быть реализовано контактом GPIO, а не, например, программируемым контроллером прерываний. Таким образом, драйвер может обрабатывать ресурс прерываний на основе GPIO так же, как и любой другой ресурс прерывания.

    Чтобы получить доступ к контактам GPIO в ресурсе ввода-вывода GPIO, драйвер периферийного устройства должен открыть логическое подключение к контактам. Драйвер KMDF вызывает метод WdfIoTargetOpen , чтобы открыть подключение. Через это подключение драйвер может отправлять запросы ввода-вывода к контактам GPIO. Драйвер отправляет IOCTL_GPIO_READ_PINS запросы на чтение данных из этих контактов (если они являются входными) или IOCTL_GPIO_WRITE_PINS запросы на запись данных в них (если это выходные контакты).

    Чтобы получать прерывания от контакта GPIO в ресурсе прерывания, драйвер периферийного устройства должен зарегистрировать свою подпрограмму обслуживания прерываний (ISR) для получения прерываний из ресурса прерывания, реализованного этим контактом. Драйвер KMDF вызывает метод WdfInterruptCreate для подключения ISR к прерыванию.

    Совместная работа с нами на GitHub

    Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

    AMD GPIO Driver — что это за драйвер? (AMD GPIO Controller)

    Драйвер интерфейса ввода/вывода (чипсет).

    Простыми словами — нужен для корректной работы чипсета (набор логики) на материнской плате.

    Без драйвера скорее всего тоже все будет работать, но функции будут только базовые, дополнительные — работать не будут. Всякие технологии, заложенные в чипсет, в том числе которые теоретически могут ускорить работу Windows — будут работать только после установки этого драйвера. Например регулировка частоты в Windows (в настройках Электропитания), автоматическое ее снижение в простое — не будет работать без этого драйвера. Также могут не работать порты USB 3.0/3.1 (точнее работать будут, но как версия 2.0) или некоторые технологии ускорения передачи данных по USB.

    Также вы можете встретить драйвер с названием AMD GPIO Driver Promontory — это просто версия для чипсетов серии 300, 400 и X570.

    Сам драйвер входит в состав пакета AMD Chipset Drivers. Поэтому можно сделать вывод, что он точно нужен для чипсета. Также в пакет входят и другие — AMD PCI driver, PSP driver, AMD SMbus, Promonotory GPIO Driver. И еще — после установки пакета можно перейти в эту папку (в нее распаковываются дрова):

    И установить оттуда схему электропитания Ryzen balanced PowerPlan, которая тоже оптимизирует работу ПК.

    После корректной установки драйверов у вас в диспетчере появится устройство AMD GPIO Controller:

    Надеюсь информация оказалась полезной. Удачи и добра, до новых встреч друзья!

    Драйвер виртуальных GPIO с контроллером прерываний на базе QEMU ivshmem для Linux

    Природа прерываний

    Трудно недооценить роль GPIO, особенно в мире встраиваемых систем ARM. Помимо того, что это крайне популярный материал для всех руководств для начинающих, GPIO обеспечивают способ для управления многими периферийными устройствами, выступают в качестве источника ценных прерываний, или даже могут быть единственным доступным способом общения с миром для SOC.

    Основываясь на собственном скромном опыте, могу сказать, что прерывания далеко не самая освященная тема в сообществе Linux. Из-за своих особенностей, а так же сильной привязки к аппаратной части, все обучающие материалы посвященные прерываниям лишены реального и легко воспроизводимого примера. Данный факт мешает пониманию того, что очень часто прерывания и GPIO неразделимы, особенно в области встраиваемого Linux. Многие начинают верить, что GPIO это очень простая и скучная вещь (которая кстати и стала таковой благодаря подсистеме sysfs).

    Даже в примере приведенном в LDD3 (драйвер snull) прерывания эмитируются явным вызовом функции парного устройства. Так же имеются примеры в курсах USFCA (http://cs.usfca.edu/~cruse/cs686s08/), но они используют чужое прерывание, тесно связаны с архитектурой x86 и сильно устарели.

    Предлагаемое решение способно решить данные проблемы. С точки зрения пространства пользователя и, во многом, во внутренней реализации драйвер неотличим от большинства «реальных», предоставляющих прерывания портов входов/выходов общего назначения. На данный момент драйвер поддерживает прерывания по переднему или заднему фронту и может быть использован как источник прерываний для других устройств.

    ivshmem — разделяемая память Inter-VM

    Разработано для совместного использования разделяемой памяти (выделенной на хост-платформе через механизм POSIX shared memory API) множественными процессами QEMU с различными гостевыми платформами. Для того чтобы все гостевые платформы имели доступ к области разделяемой памяти, ivshmem моделирует PCI устройство предоставляя доступ к памяти как PCI BAR.

    • BAR0 представляет из себя область MMIO поддерживающую регистры и прерывания в случае если MSI не используется, размером один килобайт
    • BAR1 используется для MSI-X, если поддержка MSI включена.
    • BAR2 для доступа к объекту разделяемой памяти.
    • zero-copy доступ к данным
    • механизм прерываний
    • взаимодействие гость/гость и хозяин/гость

    и проанализировал быстродействие в целом.

    В настоящей момент, официально, сопровождение ivshmem никто не осуществляет, тем не менее большой вклад в развитие ivshmem вносят сотрудники Red Hat.

    Цель

    ivshmem может послужить основой для симуляции и отладки многих классов устройств.
    В данной статье мы рассматриваем виртуальную pci плату ввода/вывода общего назначения (general-purpose input/output, GPIO), которая так же является источником прерываний, и соответствующий драйвер с предоставлением доступа и управления посредством механизма sysfs.

    • Исходный код Qemu 2.5.1.1 (не рекомендуется брать более младшую версию)
    • Исходный код linux-kernel 4.1

    Для разработки и тестирования использовалась виртуальная плата qemu versatilepb (system ARM).

    • arm-cross-toolchain
    • nairobi-embedded — Guest-side ivshmem PCI device test sources

    g>> — команды или вывод выполняемые на гостевой системе.
    h>> — на основной.

    Пример и оригинальный код

    Для начала продемонстрируем оригинальный код, основанный на оригинальном коде ( https://github.com/henning-schild/ivshmem-guest-code ), и модифицированном, в последствии, Siro Mugabi.

    h>> qemu: += -device ivshmem,shm=ivshmem,size=1 g>> # insmod ne_ivshmem_ldd_basic.ko ivshmem 0000:00:0d.0: data_mmio iomap base = 0xc8c00000 ivshmem 0000:00:0d.0: data_mmio_start = 0x60000000 data_mmio_len = 1048576 ivshmem 0000:00:0d.0: regs iomap base = 0xc88ee400, irq = 27 ivshmem 0000:00:0d.0: regs_addr_start = 0x50002400 regs_len = 256 g>> # ./ne_ivshmem_shm_guest_usr -w "TEST STRING" h>> $ xxd -l 16 /dev/shm/ivshmem 0000000: 5445535420535452 494e 4700 0000 0000 TEST STRING. 

    В принципе этого вполне достаточно для эмуляции GPIO уже в таком виде. И во многих случаях так и поступали, когда достаточно простого состояния входа или записи в выход, использование sysfs и прерываний предполагают небольшую надстройку на I/O mem.

    Реализация

    Заметим, что /dev/ivshmem0 и ne_ivshmem_shm_guest_usr.c нам более не нужны, вся работа с устройством со стороны гостевой машины из пространства пользователя (user-space) будет осуществляться средствами интерфейса sysfs.

    Прежде чем разметить наше устройство в памяти, хотелось бы отметить, что мы просто дублируем схему применяемую в большинстве gpio драйверов.

    Во-первых все входа/выхода gpio разделены на порты, как правило по 8, 16, 32 входа. Каждый порт имеет, как минимум, регистр состояния входов (GPIO_DATA), регистр направления, если переключение in/out поддерживается (GPIO_OUTPUT). Далее (если есть поддержка в самом устройстве), регистр состояния прерываний, регистры прерывания по переднему фронту (rising) и заднему фронту (falling) и по уровню (high и low). Аппаратное прерывание, поставляемое главным контроллером прерываний, как правило, одно на весь порт и делится между всеми входами порта.

    Примеры существующих реализаций с комментариями

    Sitara am335x

    более известна в составе платы beaglebone

    Разработчик: Texas Instruments
    Документация: AM335x Sitara Processors Technical Reference Manual (page 4865)
    Соответствующий ему драйвер gpio: linux/drivers/gpio/gpio-omap.c
    Соответствующий заголовок: linux/include/linux/platform_data/gpio-omap.h
    Количество входов/выходов: 128 (4 gpio порта — по 32 контакта каждый)

    am335x Sitara таблица регистров gpio — порт A

    Имя регистра Смещение Имя в драйвере Комментарий
    GPIO_IRQSTATUS_0 0x02С OMAP4_GPIO_IRQSTATUS_0 Состояние прерывания для заданного входа
    GPIO_IRQSTATUS_1 0x030 OMAP4_GPIO_IRQSTATUS_1 Состояние прерывания для заданного входа
    GPIO_IRQSTATUS_SET_0 0x034 OMAP4_GPIO_IRQSTATUS_SET_0 Включает прерывания по заданному входу
    GPIO_IRQSTATUS_SET_1 0x038 OMAP4_GPIO_IRQSTATUS_SET_1 Включает прерывания по заданному входу
    GPIO_IRQSTATUS_CLR_0 0x03С OMAP4_GPIO_IRQSTATUS_CLR_0 Выключает прерывания по заданному входу
    GPIO_IRQSTATUS_CLR_1 0x040 OMAP4_GPIO_IRQSTATUS_CLR_1 Выключает прерывания по заданному входу
    GPIO_OE 0x134 OMAP4_GPIO_OE Контролирует состояние вход/выход (in/out)
    GPIO_DATAIN 0x138 OMAP4_GPIO_DATAIN Состояние входа/выхода
    GPIO_DATAOUT 0x13C OMAP4_GPIO_DATAOUT Задание состояния для выходов (low/high)
    GPIO_LEVELDETECT0 0x140 OMAP4_GPIO_LEVELDETECT0 Включение/выключения прерывания для входа по низкому уровню сигнала
    GPIO_LEVELDETECT1 0x144 OMAP4_GPIO_LEVELDETECT1 Включение/выключения прерывания для входа по высокому уровню сигнала
    GPIO_RISINGDETECT 0x148 OMAP4_GPIO_RISINGDETECT Включение/выключения прерывания для входа по переднему фронту
    GPIO_FALLINGDETECT 0x14С OMAP4_GPIO_FALLINGDETECT Включение/выключения прерывания для входа по заднему фронту
    GPIO_CLEARDATAOUT 0x190 OMAP4_GPIO_CLEARDATAOUT Переключает соответствующий вход в состояние low
    GPIO_SETDATAOUT 0x194 OMAP4_GPIO_SETDATAOUT Переключает соответствующий вход в состояние high

    Примечание: GPIO_IRQSTATUS_N также используется для IRQ ACK. Управление дребезгом, а так же питанием выходит за рамки данной статьи.

    • Стандартный: Чтение запись регистра полностью по основному адресу
    • Задание и очистка (рекомендуемый производителем): Для задания и очистки соответствующего контакта как выхода используются два соответствующих регистра, то же самое относится к управлению прерываниями.

    ep9301

    Разработчик: Cirrus Logic
    Документация: EP9301 User’s Guide (page 523)
    Соответствующий ему драйвер gpio: linux/drivers/gpio/gpio-ep93xx.c
    Соответствующий заголовок: linux/arch/arm/mach-ep93xx/include/mach/gpio-ep93xx.h
    Количество входов/выходов: 56 (7 портов gpio — по 8 контактов каждый)

    ep9301 таблица регистров gpio — порт A

    Имя регистра Смещение Имя в драйвере Описание
    PADR 0x00 EP93XX_GPIO_REG(0x0) Регистр состояние входов/выходов доступен для чтения записи
    PADDR 0x10 EP93XX_GPIO_REG(0x10) Контролирует состояние вход/выход (in/out)
    GPIOAIntEn 0x9C int_en_register_offset[0] Включает прерывания по заданному входу
    GPIOAIntType1 0x90 int_type1_register_offset[0] Задает тип прерывания level/edge
    GPIOAIntType2 0x94 int_type2_register_offset[0] Задает high/rising или low/fallingв зависимости от выбранного типа прерываний
    GPIOAEOI 0x98 eoi_register_offset[0] Регистр для оповещения об обработанном прерывании
    IntStsA 0xA0 EP93XX_GPIO_A_INT_STATUS Регистр состояние прерывания

    Примечание:
    Из них для доступны 7 портов по 8, 8, 1, 2, 3, 2, 4 входов/выходов причем регистрами прерываний обладают только первый, второй и пятый порты.
    В таблице рассмотрен только порт A.
    Одной из особенностей ep9301, является то что тип прерываний both на аппаратном уровне не поддерживается, в драйвере происходит переключение в момент срабатывания прерывания. Другая интересная особенность — на порту F каждый контакт имеет свое собственное прерывание.

    Bt848

    Последний пример: pci плата Bt848, с gpio.

    Разработчик: Intel
    Документация: Bt848/848A/849A (page 68)
    Соответствующий драйвер gpio: linux/drivers/gpio/gpio-bt8xx.c
    Соответствующий заголовок: linux/drivers/media/pci/bt8xx/bt848.h
    Количество входов/выходов: 24

    Bt848 является платой видеозахвата.

    Bt848 таблица регистров gpio

    Имя регистра Смещение Имя в драйвере Описание
    BT848_GPIO_OUT_EN 0x118 BT848_GPIO_OUT_EN Регистр состояние входов/выходов доступен для чтения и записи
    BT848_GPIO_DATA 0x200 BT848_GPIO_DATA Контролирует состояние вход/выход (in/out)

    Поддержки прерываний нет. Всего два регистра — состояние и настройка in/out.

    Размечаем в памяти наше устройство

    Для начала выделим место под данные и управление состоянием.

    Пусть устройство обладает 8 входами/выходами общего назначения, тогда:

    Имя регистра Смещение Имя в драйвере Описание
    DATA 0x00 VIRTUAL_GPIO_DATA Регистр состояние входов/выходов доступен для чтения и записи
    OUTPUTEN 0x01 VIRTUAL_GPIO_OUT_EN Контролирует состояние вход/выход (in/out)

    Краткая справка по интерфейсу gpio

    struct gpio_chip < /* имя порта gpio */ const char *label; /* функция задания как входа */ int (*direction_input)(struct gpio_chip *chip, unsigned offset); /* состояние контакта */ int (*get)(struct gpio_chip *chip, unsigned offset); /* функция задания как выхода */ int (*direction_output)(struct gpio_chip *chip, unsigned offset, int value); /* задание состояния */ void (*set)(struct gpio_chip *chip, unsigned offset, int value); /* номер первого контакта в контексте ядра, присваивается динамически в случае значения равном -1 */ int base; /* количество контактов */ u16 ngpio; >;
    Состояние выхода при переключении

    Необходимо отметить параметр int value в функции direction_output, которая обслуживает файл /sys/class/gpio/gpioN/direction, принимающий значение не только “in”/”out”, но так же и “high”/“low”, значения которых передаются как параметр value (этот простой факт, по какой-то причине, редко упоминается в руководствах для начинающих).

    g>> /sys/class/gpio # echo low > gpio0/direction g>> /sys/class/gpio # cat gpio0/value 0 g>> /sys/class/gpio # echo high > gpio0/direction g>> /sys/class/gpio # cat gpio0/value 1
    Динамическое присвоение int base и наследие ARCH_NR_GPIOS

    Исторически, количество GPIO в ядре было ограничено параметром ARCH_NR_GPIOS, по умолчанию равном 256 и, впоследствии увеличенном до 512 (версия 3.18).

    Его смысл достаточно прост, в ядре не может быть больше GPIO чем значение параметра, если планируемое количество было больше чем значение по умолчанию, он переопределялся в соответствующем заголовочном файле платформы.

    Причиной такого поведения было определение таблицы описаний GPIO как статической и максимальная величина смещения для каждого порта была ограничена:

    static struct gpio_desc gpio_desc[ARCH_NR_GPIOS];

    Порты GPIO и их смещения были жестко определены в файлах описывающих аппаратную часть конкретного SOC, например:

    EP93XX_GPIO_BANK

    #define EP93XX_GPIO_BANK(name, dr, ddr, base_gpio) \ < \ .chip = < \ .label = name, \ .direction_input = ep93xx_gpio_direction_input, \ .direction_output = ep93xx_gpio_direction_output,\ .get = ep93xx_gpio_get, \ .set = ep93xx_gpio_set, \ .dbg_show = ep93xx_gpio_dbg_show, \ .base = base_gpio, \ .ngpio = 8, \ >, \ .data_reg = EP93XX_GPIO_REG(dr), \ .data_dir_reg = EP93XX_GPIO_REG(ddr), \ > static struct ep93xx_gpio_chip ep93xx_gpio_banks[] = < EP93XX_GPIO_BANK("A", 0x00, 0x10, 0), EP93XX_GPIO_BANK("B", 0x04, 0x14, 8), EP93XX_GPIO_BANK("C", 0x08, 0x18, 40), EP93XX_GPIO_BANK("D", 0x0c, 0x1c, 24), EP93XX_GPIO_BANK("E", 0x20, 0x24, 32), EP93XX_GPIO_BANK("F", 0x30, 0x34, 16), EP93XX_GPIO_BANK("G", 0x38, 0x3c, 48), EP93XX_GPIO_BANK("H", 0x40, 0x44, 56), >;

    Начиная с версии 3.19 статический массив был заменен на динамические для каждого порта GPIO, выделяемого в фукнции gpiochip_add().

    Тем не менее ARCH_NR_GPIOS все еще здесь (на момент версии 4.7) и используется для поиска смещения при динамическом присваивании base.

    /* dynamic allocation of GPIOs, e.g. on a hotplugged device */ static int gpiochip_find_base(int ngpio);

    Параметр base структуры gpio_chip может быть определен как -1, тогда смещение будет определено как первый свободный диапазон начиная с конца, то есть если у порта количество контактов равно 8 смещение будет равно 248 при параметре ARCH_NR_GPIOS равном 256 (ARCH_NR_GPIOS — ngpio) в случае если порт регистрируется в системе первым.

    Определим следующие функции нашего драйвера

    Задать соответствующий контакт как вход:

    static int virtual_gpio_direction_input(struct gpio_chip *gpio, unsigned nr)

    static int virtual_gpio_direction_input(struct gpio_chip *gpio, unsigned nr) < struct virtual_gpio *vg = to_virtual_gpio(gpio); unsigned long flags; u8 outen, data; spin_lock_irqsave(&vg->lock, flags); data = vgread(VIRTUAL_GPIO_DATA); data &= ~(1 lock, flags); return 0; >

    Чтение текущего состояния контакта:

    static int virtual_gpio_get(struct gpio_chip *gpio, unsigned nr)

    static int virtual_gpio_get(struct gpio_chip *gpio, unsigned nr) < struct virtual_gpio *vg = to_virtual_gpio(gpio); unsigned long flags; u8 data; spin_lock_irqsave(&vg->lock, flags); data= vgread(VIRTUAL_GPIO_DATA); spin_unlock_irqrestore(&vg->lock, flags); return !!(data & (1

    Задать соответствующий контакт как выход:

    static int virtual_gpio_direction_output(struct gpio_chip *gpio, unsigned nr, int val)

    static int virtual_gpio_direction_output(struct gpio_chip *gpio, unsigned nr, int val) < struct virtual_gpio *vg = to_virtual_gpio(gpio); unsigned long flags; u8 outen, data; spin_lock_irqsave(&vg->lock, flags); outen = vgread(VIRTUAL_GPIO_OUT_EN); outen |= (1 lock, flags); return 0; >

    Задать состояние выхода:

    static void virtual_gpio_set(struct gpio_chip *gpio, unsigned nr, int val)

    static void virtual_gpio_set(struct gpio_chip *gpio, unsigned nr, int val) < struct virtual_gpio *vg = to_virtual_gpio(gpio); unsigned long flags; u8 data; spin_lock_irqsave(&vg->lock, flags); data = vgread(VIRTUAL_GPIO_DATA); if (val) data |= (1 lock, flags); >

    Функция регистрации нашего драйвера как устройства gpio_chip:

    static void virtual_gpio_setup(struct virtual_gpio *gpio)

    static void virtual_gpio_setup(struct virtual_gpio *gpio) < struct gpio_chip *chip = &gpio->chip; chip->label = dev_name(&gpio->pdev->dev); chip->owner = THIS_MODULE; chip->direction_input = virtual_gpio_direction_input; chip->get = virtual_gpio_get; chip->direction_output = virtual_gpio_direction_output; chip->set = virtual_gpio_set; chip->dbg_show = NULL; chip->base = modparam_gpiobase; chip->ngpio = VIRTUAL_GPIO_NR_GPIOS; chip->can_sleep = 0; // gpio never sleeps! >

    vgread и vgwrite это просто обертки для функций iowrite8 и ioread8:

    #define vgwrite(dat, adr) iowrite8((dat), vg->data_base_addr+(adr)) #define vgread(adr) ioread8(vg->data_base_addr+(adr))

    Передача значения gpiobase в качестве параметра при динамической загрузки модуля

    static int modparam_gpiobase = -1; /* dynamic */ module_param_named(gpiobase, modparam_gpiobase, int, 0444); MODULE_PARM_DESC(gpiobase, "The GPIO base number. -1 means dynamic, which is the default.");

    Загрузка и тестирования модуля

    h>> $ rm /dev/shm/ivshmem h>> Adding parameters to qemu launch command line += -device ivshmem,shm=ivshmem,size=1 g>> # ls /sys/class/gpio/ export unexport g>> # insmod virtual_gpio_basic.ko PCI: enabling device 0000:00:0d.0 (0100 -> 0102) ivshmem_gpio 0000:00:0d.0: data_mmio iomap base = 0xc8a00000 ivshmem_gpio 0000:00:0d.0: data_mmio_start = 0x60000000 data_mmio_len = 1048576 ivshmem_gpio 0000:00:0d.0: regs iomap base = 0xc88e6400, irq = 27 ivshmem_gpio 0000:00:0d.0: regs_addr_start = 0x50002400 regs_len = 256 g>> # ls /sys/class/gpio/ export gpiochip248 unexport g>> # cat /sys/class/gpio/gpiochip248/label 0000:00:0d.0 g>> # cat /sys/class/gpio/gpiochip248/base 248 g>> # cat /sys/class/gpio/gpiochip248/ngpio 8 g>> # rmmod virtual_gpio_basic Unregister virtual_gpio device. g>> # insmod virtual_gpio_basic.ko gpiobase=0 g>> # ls /sys/class/gpio/ export gpiochip0 unexport g>> # echo 0 > /sys/class/gpio/export g>> # echo high > /sys/class/gpio/gpio0/direction
    h>> $ xxd -b -l 2 -c 2 /dev/shm/ivshmem 0000000: 00000001 00000001 ..

    DATA выставлен, OUTPUTEN выставлен.

    Добавляем прерывания

    Разметка регистров прерываний и базовая обработка прерывания

    Примечание: В виртуальном драйвере рассматриваются только EDGEDETECT_RISE и EDGEDETECT_FALL.

    Добавляем следующие регистры:

    Имя регистра Смещение Имя в драйвере Описание
    INTERRUPT_EN 0x01 VIRTUAL_GPIO_INT_EN Включает прерывания по заданному входу
    INTERRUPT_ST 0x02 VIRTUAL_GPIO_INT_ST Регистр состояния прерывания
    INTERRUPT_EOI 0x03 VIRTUAL_GPIO_INT_EOI Регистр для оповещения об обработанном прерывании
    EDGEDETECT_RISE 0x04 VIRTUAL_GPIO_RISING Включение/выключения прерывания для входа по переднему фронту
    EDGEDETECT_FALL 0x05 VIRTUAL_GPIO_FALLING Включение/выключения прерывания для входа по заднему фронту
    LEVELDETECT_HIGH NC NOT CONNECTED
    LEVELDETECT_LOW NC NOT CONNECTED

    За обработку прерывания от pci шины отвечает следующая функция, на данный момент её роль заключается всего лишь в уведомлении об обработанном прерывании:

    static irqreturn_t virtual_gpio_interrupt(int irq, void *data)

     static irqreturn_t virtual_gpio_interrupt(int irq, void *data) < u32 status; struct virtual_gpio *vg = (struct virtual_gpio *)data; status = readl(vg->regs_base_addr + IntrStatus); if (!status || (status == 0xFFFFFFFF)) return IRQ_NONE; printk(KERN_INFO "VGPIO: interrupt (status = 0x%04x)\n", status); return IRQ_HANDLED; >

    Для данного этапа потребуется внешний демон, которой включен в стандартную поставку qemu — ivshmem-server. В строку запуска qemu добавляется параметр -chardev путь к UNIX сокету, обмен сообщениями между запущенными экзеплярами qemu, ivshmem-server и ivshmem-client реализован с помощью механизма eventfd.

    h>> $ ivshmem-server -v -F -p ivshmem.pid -l 1M # запускаем qemu с новыми параметрами h>> $ += -chardev socket,path=/tmp/ivshmem_socket,id=ivshmemid -device ivshmem,chardev=ivshmemid,size=1,msi=off g>> # echo 8 > /proc/sys/kernel/printk g>> # insmod virtual_gpio_basic.ko h>> $ ivshmem-client # каждый экземпляр qemu ivshmem региструет себя в ivshmem-server и ему присваивается уникальный id cmd> int 0 0 # Примечание: листинг доступных команд можно посмотреть командой cmd> help # Вывод гостевой машины: g>> VGPIO: interrupt (status = 0x0001)

    irq_chip и концепция chained_interrupt

    Мы не будем углубляться в детали, данная тема хорошо раскрыта в первом патче представившим irq_chip , документации ядра и книге “Professional Linux Kernel Architecture” (к настоящему моменту она устарела, но irq_chip это так же не новая вещь).

    На данный момент для нас является главным тот факт, что порты GPIO предоставляющие прерывания каскадируемые от родительского контроллера прерываний обычная практика в дни современного линукса.

    Вот почему часть драйвера GPIO отвечающего за прерывания использует irq_chip. Другими словами такой драйвер использует две подсистемы одновременно: gpio_chip и irq_chip.

    Беглый взгляд на подсистему irq дает нам следующую картину:

    High-Level Interrupt Service Routines (ISRs) — Выполняет всю необходимую работу по обслуживанию прерывания на драйвере устройства. Например, если прерывание используется для индикации доступных для чтения новых данных, работа ISR будет заключаться в копировании данных в соответствующее место.

    Interrupt Flow Handling — Данная подсистема отвечает за особенности в реализации обработок прерываний, таких как срабатывание по уровню сигнала (level) или по фронту (edge).

    Срабатывание по фронту (Edge-triggering) происходит при определении, что на линии произошло изменение потенциала. Срабатывание по уровню (Level-triggering), определяется как определенное значение потенциала, при этом изменение потенциала не играет роли.

    С точки зрения ядра, срабатывание по уровню более сложный случай, так как, после в начале каждого прерывания его необходимо маскировать.

    Chip-Level Hardware Encapsulation — Используется для инкапсуляции особенностей реализации работы с аппаратной частью. Данную подсистему можно рассматривать как разновидность “драйвера устройства” для контроллеров прерываний.

    Как мы видим ядро берет на себя управление обработкой цепочки прерывания и разницу в реализации типов (по фронту и по уровню), если предоставить соответствующую инфраструктуру.

    IRQ Domains

    Подсистема IRQ Domain появившееся в патче irq: add irq_domain translation infrastructure позволила отделить локальные для контроллера номера прерываний от номеров прерываний в ядре, предоставив общий массив номеров прерываний. Цитируя официальную документацию: «Сегодня номер IRQ, это просто номер».

    До данного обновления аппаратные номера отображались на номерами ядра как 1:1, а каскадирование не поддерживалось. Под аппаратными номерами, понимается локальные для контроллера номера прерывания, которые в нашем случае совпадают с локальными номерами GPIO.

    • Линейное
    • В виде дерева
    • И тип «No map» (Без отображения)

    Поскольку наш вектор прерываний достаточно мал, и у нас точно нет интереса в «No map» отображении, наше отображение линейно, фактически номера сопоставляются 1:1 со смещением, разница со старым подходом состоит в том что за присвоение номеров irq и за вычисление смещения отвечает ядро, при этом гарантируется непрерывность выделяемого диапазона.

    В каждую функцию интерфейса irq_chip передается указатель на структуру struct irq_data, где irq_data->irq это номер прерывания в ядре linux, a irq_data->hwirq это наш локальный номер прерывания в рамках драйвера. Так же в struct irq_data передается указатель на нашу структуру struct virtual_gpio, что неудивительно.

    Связывание irq_chip и gpio_chip

    Если бы мы ориентировались на более младшие версии ядра, нам пришлось бы воспользоваться функцией irq_domain_add_simple для отображения наших номер, но с версии 3.15 в патче gpio: add IRQ chip helpers in gpiolib patch нет необходимости напрямую использовать интерфейс IRQ Domain.

    Поэтому вместо прямого использования интерфейса IRQ Domain и предоставления инфраструктуры для отображения локальных номеров на глобальные (.map() ops), мы воспользуемся функциями gpiochip_irqchip_add и gpiochip_set_chained_irqchip (зависят от параметра GPIOLIB_IRQCHIP Kconfig).

    Прекрасным примером использования и простоты в применении, является драйвер gpio-pl061.

    Привязываем наш irq_chip к уже существующему gpio_chip:

    gpiochip_irqchip_add(&vg->chip, &virtual_gpio_irq_chip, 0, handle_edge_irq, IRQ_TYPE_NONE);

    handle_edge_irq — это один из встроенных обработчиков потока, который берет на себя управление цепочкой прерывания по фронтам.

    Примечание: прерывания по фронтам является наиболее распространенным. Главное отличие от прерываний по уровню заключается как раз в управлении цепочкой, прерывание по уровню маскируется в ядре сразу после получения.

    gpiochip_set_chained_irqchip(&vg->chip, &virtual_gpio_irq_chip, pdev->irq, NULL);

    Вызовом функции gpiochip_set_chained_irqchip мы сообщаем ядру, что наш irq_chip использует прерывание от PCI шины и наши прерывания каскадируются от pdev->irq.

    Доработаем наш обработчик, чтобы он генерировал прерывания в зависимости от состояния VIRTUAL_GPIO_INT_ST:

    pending = vgread(VIRTUAL_GPIO_INT_ST); /* check if irq is really raised */ if(pending) < for_each_set_bit(i, &pending, VIRTUAL_GPIO_NR_GPIOS) generic_handle_irq(irq_find_mapping(vg->chip.irqdomain, i)); >

    irq_find_mapping — вспомогательная функция для трансляции локального номера входа в глобальный номер прерывания.

    Собираем все вместе

    Прежде всего, отметим, что интерфейс irq_chip нашего драйвера, выглядит следующим образом:

    static struct irq_chip virtual_gpio_irq_chip = < .name = "GPIO", .irq_ack = virtual_gpio_irq_ack, .irq_mask = virtual_gpio_irq_mask, .irq_unmask = virtual_gpio_irq_unmask, .irq_set_type = virtual_gpio_irq_type, >;

    Функция ack() всегда тесна связана с аппаратной спецификой контроллера. Некоторым устройствам, например требуется подтверждение обработки запроса прерывания, прежде чем могут быть обслужены последующие запросы.

    static void virtual_gpio_irq_ack(struct irq_data *d)

    static void virtual_gpio_irq_ack(struct irq_data *d) < unsigned long flags; u8 nr = d->hwirq; u8 mask = 1 lock, flags); vgwrite(mask, VIRTUAL_GPIO_INT_EOI); spin_unlock_irqrestore(&vg->lock, flags); >

    В нашем случае в программе vg_get_set – используется достаточно грубая эмуляция регистра eoi. После выставления флага статуса прерывания, в цикле постоянно опрашивается eoi регистр. Когда бит входа уведомления о прерывании выставляется драйвером, происходит обнуление регистра eoi и снятие бита статуса прерывания на входе.

    Маскирование и демаскирование производится записью соответствующего значения в регистр INTERRUPT_EN.

    static void virtual_gpio_irq_mask(struct irq_data *d)

    static void virtual_gpio_irq_mask(struct irq_data *d) < u8 mask; unsigned long flags; u8 nr = d->hwirq; struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct virtual_gpio *vg = to_virtual_gpio(gc); spin_lock_irqsave(&vg->lock, flags); mask = vgread(VIRTUAL_GPIO_INT_EN); mask &= ~(1 lock, flags); >

    static void virtual_gpio_irq_unmask(struct irq_data *d)

    static void virtual_gpio_irq_unmask(struct irq_data *d) < u8 mask; unsigned long flags; u8 nr = d->hwirq; struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct virtual_gpio *vg = to_virtual_gpio(gc); spin_lock_irqsave(&vg->lock, flags); mask = vgread(VIRTUAL_GPIO_INT_EN); mask |= (1 lock, flags); >

    irq_type позволяет задать тип триггера — на текущий момент в ядре определены следующие типы:
    IRQ_TYPE_NONE — тип не задан
    IRQ_TYPE_EDGE_RISING — по переднему фронту
    IRQ_TYPE_EDGE_FALLING — по заднему фронту
    IRQ_TYPE_EDGE_BOTH — по переднему и заднему фронту
    IRQ_TYPE_LEVEL_HIGH — по высокому уровню
    IRQ_TYPE_LEVEL_LOW — по низкому уровню

    static int virtual_gpio_irq_type(struct irq_data *d, unsigned int type)

    static int virtual_gpio_irq_type(struct irq_data *d, unsigned int type) < unsigned long flags; struct gpio_chip *gc = irq_data_get_irq_chip_data(d); struct virtual_gpio *vg = to_virtual_gpio(gc); u8 mask; u8 nr = d->hwirq; spin_lock_irqsave(&vg->lock, flags); switch (type) < case IRQ_TYPE_EDGE_RISING: mask = vgread(VIRTUAL_GPIO_RISING); mask |= (1 /* enable interrupt */ mask = vgread(VIRTUAL_GPIO_INT_EN); mask &= ~(1 lock, flags); return retval; >

    Тестирование и результаты

    Для тестирования передачи информации о прерываниях в user space, воспользуемся специально написанной утилитой vg_guest_client. Согласно документации по gpio_sysfs, “Если вы используете select для отслеживания событий, задайте файловый дескриптор (входа) в exceptfds”.

     FD_ZERO(&efds); maxfd = 0; for(i = 0; i < gpio_size; i++) < FD_SET(gpios[i].fd, &efds); maxfd = (maxfd < gpios[i].fd) ? gpios[i].fd : maxfd; >ready = pselect(maxfd + 1, NULL, NULL, &efds, NULL, NULL); if(ready > 0) for(i = 0; i < gpio_size; i++) if(FD_ISSET(gpios[i].fd, &efds)) < read(gpios[i].fd, &value, 1); /* для пояснений использования lseek смотрите http://lxr.free-electrons.com/source/fs/kernfs/file.c?v=4.1#L769 */ if(lseek(gpios[i].fd, 0, SEEK_SET) == -1) perror("lseek"); printf("gpio number=%d interrupt caught\n", gpios[i].number); >

    Подготавливаем входы к работе при помощи sysfs:

    g>> # echo 504 > /sys/class/gpio/export g>> # echo 505 > /sys/class/gpio/export g>> # echo 506 > /sys/class/gpio/export g>> # echo rising > /sys/class/gpio/gpio504/edge g>> # echo rising > /sys/class/gpio/gpio505/edge g>> # echo rising > /sys/class/gpio/gpio506/edge

    Примечание: gpio на подавляющем большинстве устройств по умолчанию инициализируются как входы.

    # в качестве аргумента используется номер gpiochip в системе g>> # ./vg_guest_client 504 gpio_chip: base: 504 ngpio: 8 Added gpio 504 to watchlist. Added gpio 505 to watchlist. Added gpio 506 to watchlist. Entering loop with 3 gpios. h>> $ ./vg_get_set -p 1 -i 0 g>> gpio number=504 interrupt caught

    Цепочка вызовов от нашего обработчика прерывания к уведомлению pselect:

    static irqreturn_t virtual_gpio_interrupt (int irq, void *data) int generic_handle_irq(unsigned int irq); . static irqreturn_t gpio_sysfs_irq(int irq, void *priv); static inline void sysfs_notify_dirent(struct kernfs_node *kn); void kernfs_notify(struct kernfs_node *kn); static void kernfs_notify_workfn(struct work_struct *work);

    Заключение

    Данная статья подразумевалась мной, как базовая для материала, который сложно, или даже невозможно, представить без какого-либо общего вступления. Qemu в паре с ivshmem послужили отличным и понятным базисом для этой цели. Причиной выбора этой конкретной связки является наличие вменяемой документации и прозрачности использования.

    Сама работа с gpio sysfs ничем не отличается для любых устройств с реализованной поддержкой sysfs, любая инструкция по использованию GPIO может быть успешно применена к другому подобному устройству, как и задумывалось при разработке данного интерфейса. Все различия заканчиваются на уровне конкретного драйвера устройства.

    Сам драйвер, несмотря на безусловную образовательную ценность, далек от идеала в контексте современного ядра. Для подобного простого драйвера стоит использовать generic-gpio драйвер, созданный, чтобы избежать похожего, повторяющегося кода для mmio gpio драйверов, использование которого, правда, не так очевидно. Обработку прерываний можно было бы сделать более элегантной, а значения смещений регистров лучше хранить в структуре драйвера.

    • Интеграция с подсистемой Device Tree и использование в качестве источника прерываний
    • Использование драйвера generic-gpio для упрощения разработки mmio gpio драйверов
    • Реализация на базе нетипичных устройств, например GPIO на АЦП
    • Специальные драйвера основанные на gpio — кнопки, диоды, питание и сброс

    Так же нельзя упускать из виду последние изменения в gpiolibsysfs gpio теперь является устаревшей. Новый основанный на ioctl интерфейс для gpiolib на пути становления как новый стандарт для общения с GPIO. Но младшие версии еще долго будут использоваться, к тому же никто не собирается на данный момент убирать из ядра старый интерфейс. У меня например до сих пор есть устройства успешно работающие на версии ядра 2.6.34.

    1. http://nairobi-embedded.org/category/device-drivers.html[Siro Mugabi]
    2. http://lxr.free-electrons.com/source
    3. Professional Linux Kernel Architecture [Wolfgang Mauerer]
    4. LDD3 [Jonathan Corbet, Alessandro Rubini, and Greg Kroah-Hartman]
    1. http://derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction/ (все три части)
    2. https://developer.ridgerun.com/wiki/index.php?title=Gpio-int-test.c
    3. http://www.assert.cc/2015/01/03/selects-exceptional-conditions.html

    Не ставится пакет драйверов AMD

    Author24 — интернет-сервис помощи студентам

    Винда довольно древняя, LTSC 1809 (задумываюсь об установке недавно вышедшего апдейта 21H2 для LTSC, но сейчас речь не об этом). Скачал с сайта производителя (материнка ASUS X370-Pro) последний пак драйверов для чипсета. Заметил ещё несколько месяцев назад, что этот инсталлер и предыдущий отличается от того, которым я когда-то давно ставил все дрова. Ещё в прошлый раз я столкнулся ровно с теми же проблемами. Запускаем AMD_Chipset_Software.exe, ждём распаковки в C:\AMD, выбираем любые компоненты, например «драйвер PCI», и ждём результата.

    А результат всегда один и тот же: «Не удалось выполнить установку программного обеспечения AMD». Уже пробовал официальную утилиту amdcleanuputility-x64.exe из-под безопасного режима, которая сказала, что удаление всех продуктов амуде успешно. Действительно, из «установки и удаления программ» пропал текущий манагер, а из диспетчера несколько устройств. В остальном же — не поменялось решительно ничего.

    В ущербном логе, который пишет манагер (AMD_Chipset_Software_Install.log), понятно только, что MSI’шный процесс завершился с кодом 1603. Исходная же причина оного не ясна в принципе. Дальше интереснее: другой текстовый файлик (AMD_Chipset_Software_Install_Summary) сообщает данные:

    Кликните здесь для просмотра всего текста

    AMD Chipset Software Install Summary

    Name : AMD Ryzen Power Plan
    Version : 7.0.4.4
    Install : Fail

    Name : AMD PCI Device Driver
    Version : 1.0.0.83
    Install : Success

    Name : AMD GPIO Driver
    Version : 2.2.0.130
    Install : Success

    Name : AMD GPIO Driver (for Promontory)
    Version : 2.0.1.0
    Install : Success

    Name : AMD PSP Driver
    Version : 5.17.0.0
    Install : Fail

    Name : AMD SMBus Driver
    Version : 5.12.0.38
    Install : Success

    По факту же ничего из этого не было не установлено. Да, видимо разработчикам показалось логичным откатывать всё обратно, если не установился хотя бы один. Полный файл лога от последнего раза.

    К слову, план электропитания «High Performance» от прошлого раза остался нетронутым при удалении из-под безопасного. Кто поможет побороть проблему?

    94731 / 64177 / 26122
    Регистрация: 12.04.2006
    Сообщений: 116,782
    Ответы с готовыми решениями:

    ASUS K53TA AMD A4 3300 не ставится новый процессор AMD A6 3400m
    Добрые люди помогите разобраться.У меня есть ноутбук ASUS K53TA на нём установлен процессор AMD A4.

    Скачать полный пакет Драйверов
    Добрый день. Подскажите пожалуйста реально ли скачать Полный пакет драйверов для принтера Samsung.

    В ноутбуке установлена AMD Radeon HD 6450M, а после установки драйверов показывает AMD Radeon HD 7400M
    В ноутбуке установлена AMD Radeon HD 6450M, а после установки драйверов показывает AMD Radeon HD.

    Lenovo Thinkpad T400 пакет драйверов
    Доброго времени суток! Windows 7 (32) . Нужен пакет драйверов. На оф. сайте на эту модель нет, а.

    Регистрация: 26.04.2010
    Сообщений: 457

    Вот такой результат например при выборе только PCI. Другой файл рапортует об успехе этого компонента:

    Кликните здесь для просмотра всего текста

    AMD Chipset Software Install Summary

    Name : AMD PCI Device Driver
    Version : 1.0.0.83
    Install : Success

    Добавлено через 6 минут
    Вот незадача: а из-под безопасного поставить нельзя, т.к. служба установщика недоступна

    К слову, в обычном режиме попытки производятся из-под админа и касперский при этом выключен.

    596 / 446 / 69
    Регистрация: 29.04.2019
    Сообщений: 2,160

    Max_92, ну попробуй поставить старые версии https://www.amd.com/ru/support. t-am4/x370, винда ж у тебя не обновлена, а амд никогда не блестала нормальными драйверами — вечно проблемы.
    это читал? https://www.amd.com/ru/support/kb/faq/gpu-kb1603

    Регистрация: 26.04.2010
    Сообщений: 457

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    ну попробуй поставить старые версии https://www.amd.com/ru/support. t-am4/x370

    На сайте асуса есть 2 предпоследних — оба за 20-ый год, за 21-ый больше нет. Странно, что списки отличаются. Знаю, что один из них точно поставится, но меня это не устраивает. И кстати, там «X370», а не Pro — критично ли?

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    Вроде ничего нового. Скорее всего, «sfc /scannow» ничего не даст, с правами в реестре тоже вероятно всё норм (в 7-ой постоянно права слетали, расширения не регистрировались и прочее, а здесь вроде норм).

    Стало быть проблема, в том что у меня не 21H2? Но даже если исходить из такой логики, в 20-ом году дрова уже выходили с обновлённым инсталлером, который не ставился. А для LTSC с 2019-ого обнов (не патчей безопасности) не было от слова совсем. Только 11 дней назад выкатили 21H2. Выходит, что амуде ещё с того момента предлагает нерабочий инсталлер (забив на LTSC). или же всё-таки проблема в чём-то ещё.

    596 / 446 / 69
    Регистрация: 29.04.2019
    Сообщений: 2,160

    ЦитатаСообщение от Max_92 Посмотреть сообщение

    Знаю, что один из них точно поставится, но меня это не устраивает.
    значит обновляй винду

    ЦитатаСообщение от Max_92 Посмотреть сообщение

    И кстати, там «X370», а не Pro — критично ли?

    Pro — это относится к модели материнки, а не к чипсету

    Добавлено через 1 минуту

    ЦитатаСообщение от Max_92 Посмотреть сообщение

    или же всё-таки проблема в чём-то ещё
    Может и в другом, хз. дрова амуде — это загадки
    Регистрация: 26.04.2010
    Сообщений: 457

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    значит обновляй винду

    Хотел потом вернуться к этому вопросу, но события видимо заставляют сделать это уже сейчас)

    Не по теме, но если ставить отдельно апдейт 21H2 поверх текущей 1809, слетят ли какие-то данные и самое главное KMS-активатор, который сейчас активен? Переустановку целиком не рассматриваю.

    596 / 446 / 69
    Регистрация: 29.04.2019
    Сообщений: 2,160

    ЦитатаСообщение от Max_92 Посмотреть сообщение

    Не по теме, но если ставить отдельно апдейт 21H2 поверх текущей 1809, слетят ли какие-то данные и самое главное KMS-активатор, который сейчас активен? Переустановку целиком не рассматриваю.

    по этому ничего сказать не могу. всегда ставлю начисто
    Регистрация: 26.04.2010
    Сообщений: 457

    Winston Mint,

    Он с точно таким же обновлённым инсталлером. Без шансов, та же ошибка.

    Добавлено через 58 минут
    Кстати, с официального сайта пак от 2020/07/16 УЖЕ не ставится.

    Регистрация: 26.04.2010
    Сообщений: 457

    Ещё один сюрприз. Тот пак, который раньше ставился без проблем (который весит 460 метров), сначала выдал «не удалось загрузить драйвер поиска». А теперь: «Ошибка 99 программа установки не может продолжить работу так как драйвер не имеет цифровой подписи». Wtf?

    Дно пробито
    4634 / 2817 / 379
    Регистрация: 07.10.2020
    Сообщений: 19,408

    Max_92 на вирусы проверься на всякий случай . Кстати в режиме пропуска драйверов пробовал ставить ? Принудительно тоже не ставиться ?

    Регистрация: 26.04.2010
    Сообщений: 457

    ЦитатаСообщение от Wadim_Ymniy Посмотреть сообщение

    на вирусы проверься на всякий случай

    У меня на постоянной основе работает «Kaspersky Free». Надо возможно чем-то ещё просканироваться.

    ЦитатаСообщение от Wadim_Ymniy Посмотреть сообщение

    Кстати в режиме пропуска драйверов пробовал ставить ?

    Это через дополнительные параметры загрузки? Попробую через эту групповую политику.

    Могло быть такое, что через несколько обновлений после эти драйвера перестали считаться «подписанными»?

    З.Ы. хотя политика эта для 10-ки не предназначена) В порядке общего бреда: попробую завтра с отключённым подписыванием поставить сначала из последнего пака.

    596 / 446 / 69
    Регистрация: 29.04.2019
    Сообщений: 2,160
    Max_92, вот тебе и сборки винды от дяди вани дают о себе знать.

    ЦитатаСообщение от Max_92 Посмотреть сообщение

    А теперь: «Ошибка 99 программа установки не может продолжить работу так как драйвер не имеет цифровой подписи»

    Так отключи это в настройках системы сети
    596 / 446 / 69
    Регистрация: 29.04.2019
    Сообщений: 2,160

    ЦитатаСообщение от Max_92 Посмотреть сообщение

    У меня на постоянной основе работает «Kaspersky Free»

    м-да уж. его вообще отрубать на время установки надо. эти антивирусы не от вирусов защищают, а гемор приносят на блюдце. они даже майнер поймать не могут

    Дно пробито
    4634 / 2817 / 379
    Регистрация: 07.10.2020
    Сообщений: 19,408

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    м-да уж. его вообще отрубать на время установки надо. эти антивирусы не от вирусов защищают, а гемор приносят на блюдце. они даже майнер поймать не могут

    это точно — а этот ещё и кривой и с мочёной репутацией .
    Регистрация: 26.04.2010
    Сообщений: 457

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    вот тебе и сборки винды от дяди вани дают о себе знать.

    Так раньше ведь при тех же исходных данных именно этот пакет ставился. Отсюда вывод, что с подписями в amd что-то не так.

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    Так отключи это в настройках системы сети

    Попробую. Но вопрос на подумать: зачем ему вообще лезть в сеть за чем-то (кроме проверок версий), если в распакованном виде уже и так гиг с лишним всего необходимого для установки?
    Сначала через опцию загрузки с отключённой проверкой подписи попробую поставить последний пак — вдруг прокатит.

    Добавлено через 29 секунд

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    м-да уж. его вообще отрубать на время установки надо

    На время установки отрубал — результат тот же.

    Добавлено через 2 минуты

    ЦитатаСообщение от Winston Mint Посмотреть сообщение

    они даже майнер поймать не могут

    У большинства других антивирей это детектится как зловред с несколькими восклицательными знаками, без компромиссов. Этот же говорит «not-a-virus» — ты сам принимаешь решение, нужен ли тебе запущенный майнер в твоей системе или он попал сюда не по твоей воле.

    Регистрация: 26.04.2010
    Сообщений: 457

    ЦитатаСообщение от Max_92 Посмотреть сообщение

    через опцию загрузки с отключённой проверкой подписи попробую поставить последний пак

    Предсказуемо, не сработало. в последних двух паках причина не в цифровой подписи, а в несовместимости с 1809, вероятнее всего. Установка же «VER193028_20200120R» прошла в режиме отключения проверки.

    При этом там не стал выбирать «balanced power plan», который уже был установлен когда-то давно и не удалён amdcleanuputility. Интересный момент в том, что сейчас у меня выбран план «high performance». Как он попал в систему? Если я правильно помню, когда пытался ставить предпоследний на текущий момент на официальном сайте «V20504352_20200716R» (который ведёт себя ровно так же как последний от ноября 2021), инсталлер видимо тогда после общей ошибки 1603 решил не выкидывать его обратно (в отличие от остальных компонентов), и с тех пор он остался.

    Ещё одна особенность. В центре обновлений винды (пользуюсь сторонним ручным апдейтером и не ставлю всё подряд) у меня давно висел драйвер AMD PCI версии «1.0.0.83» — долго не решался его ставить, зная про корявость драйверов из центра обновлений. Но вчера случайно кнопка «проверить наличие обновлений» в настройках системы всё же была нажата (впервые за 2,5 года) и он поставился. Собсно это и смотивировало меня начать разбираться, почему не ставится последний пак, в котором драйвер точно правильный. После перезагрузки убедился, что микрософтовский драйвер опасности не представляет. И теперь вот этот устаревший из древнего пака конца 19-ого (1.0.0.0074) так и быть решил поменять на 1.0.0.83. Но в списке апдейтов его теперь уже больше нет)) Благо вчера скопировал содержимое папки «SoftwareDistribution» (т.к. хотел отменить нежелательные, запланированные после перезагрузки, обновления — и это не помогло, они всё равно поставились) и сейчас через «Диспетчер устройств» просто накатил его отдельно (см. скрин)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *