Как сказал @AndréBorie в своем комментарии, вам нужно скомпилировать QEMU с поддержкой GTK. Используйте ./configure --help
для просмотра опций.
Эти сообщения генерируются кодом ввода-вывода общего назначения ядра, по-видимому, при попытке загрузить модуль, представленный этим патчем или его более развитым эквивалентом .
Короткая версия:
Модуль находит интерфейс программирования WMI, который ищет, но упускает из виду тот факт, что интерфейс сообщает об отсутствии управляемых линий GPIO в вашем оборудовании. Он должен был остановить попытку регистрации и отклонить установку модуля с кодом ошибки -ENODEV
. Вы можете избавиться от сообщений, занеся модуль gpio-aaeon
в черный список, т.е. создав файл с именем, например. /etc/modprobe.d/no-aaeon-gpio-here.conf
со следующим содержанием:
blacklist gpio-aaeon
Вы обнаружили ошибку в этом модуле ядра и можете сообщить о ней разработчикам Linux GPIO . Ваше оборудование, кажется, представляет собой интересный «угловой случай» для тестирования модуля gpio_aaeon
, который разработчики, по-видимому, не учли. Это понятно, так как модуль кажется довольно новым :, патч, на который я ссылался выше, был опубликован в конце мая этого года.
Длинная версия:
Подсистема GPIO жалуется на то, что модуль gpio_aaeon
попытался зарегистрировать микросхему, которая на самом деле не имеет линий ввода-вывода общего назначения для управления, поэтому нет смысла регистрировать такую микросхему в подсистеме GPIO.
Регистрация происходит в функции датчика модуля:
+static int __init aaeon_gpio_probe(struct platform_device *pdev)
+{
+ int err, i;
+ int dio_number = 0;
+ struct aaeon_gpio_data *data;
+ struct aaeon_gpio_bank *bank;
+
+ /* Prevent other drivers adding this platfom device */
+ if (!wmi_has_guid(AAEON_WMI_MGMT_GUID)) {
+ pr_debug("AAEON Management GUID not found\n");
+ return -ENODEV;
+ }
+
+ dio_number = aaeon_gpio_get_number();
+ if (dio_number < 0)
+ return -ENODEV;
+
+ data = devm_kzalloc(&pdev->dev, sizeof(*data), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+ data->nr_bank = ARRAY_SIZE(aaeon_gpio_bank);
+ data->bank = aaeon_gpio_bank;
+ platform_set_drvdata(pdev, data);
+ bank = &data->bank[0];
+ bank->chip.parent = &pdev->dev;
+ bank->chip.ngpio = dio_number;
+ bank->data = data;
+ err = devm_gpiochip_add_data(&pdev->dev, &bank->chip, bank);
+ if (err)
+ pr_debug("Failed to register gpiochip %d: %d\n", i, err);
+
+ return err;
+}
Поскольку попытка загрузить модуль не просто закончилась ошибкой -ENODEV
, ваша система, по-видимому, имеет API управления WMI, который ищет этот драйвер... но при запросе API фактически говорит, что ему нечего контролировать.
Другими словами, модуль может перейти к вызову dio_number = aaeon_gpio_get_number();
, который заканчивается просто вызовом метода WMI для получения одного целого числа, которое, по-видимому, представляет собой количество линий GPIO, доступных для управления через этот API. Метод WMI не возвращает ошибок... но количество строк, которые он сообщает, очевидно, равно 0.
Функция переходит к выделению некоторой памяти и начинает создавать структуры, необходимые подсистеме GPIO Linux для регистрации линий GPIO для управления. Как только это сделано, он вызывает функцию devm_gpiochip_add_data()
подсистемы GPIO для регистрации нового чипа GPIO... но подсистема GPIO выполняет некоторую проверку работоспособности и замечает, что эти структуры фактически указывают, что в чипе есть 0 линий GPIO для управления.
Согласно Elixir.bootlin.com перекрестному справочнику ядра Linux -, devm_gpiochip_add_data()
— это макрос, который просто вызывает функцию devm_gpiochip_add_data_with_key()
с двумя последними параметрами, равными NULL. Это, в свою очередь, вызывает функциюgpiochip_add_data_with_key()
, которая выдает первое сообщение об ошибке, которое вы видите в строке #628 .
Другие сообщения после этого создаются по мере того, как цепочка вызовов функций раскручивается, поскольку каждая функция возвращает код ошибки вызывающей стороне.
Если значение, возвращаемое aaeon_gpio_get_number()
, действительно является количеством линий GPIO, которыми может управлять WMI API, то тест:
+ if (dio_number < 0)
+ return -ENODEV;
на самом деле должно быть:
+ if (dio_number < 1)
+ return -ENODEV;
Но если число, возвращаемое WMI API, на самом деле означает что-то несколько иное, например, «0 -номер последней контролируемой линии GPIO» (, то есть значение 0 будет означать «есть только одна линия GPIO #0 и никаких других" ), тогда использование dio_number
в качестве значения bank->chip.ngpio
приводит к выключению -на -одну ошибку, и модуль пропустит последнюю управляемую линию GPIO во всех системах которые имеют этот WMI API для GPIO.
Так или иначе, кое-что нужно исправить.
У меня были такие же сообщения об ошибках при попытке установить Xubuntu 20.04 с USB-накопителя. Я использовал Ryzen 5600X на материнской плате ASUS ROG STRIX R550 -F. Проблема была в видеокарте nVidia. Как только я выбрал вариант с «безопасной графикой», он смог запуститься.