Интересно, что при поиске по вариантам слов ошибки, включая Lenovo, Alps и Ultranav, я нашел статью, предлагающую параметры ядра в сообщении на вики Arch Linux libinput
Touchpad not detected at all
Notes: Not a libinput issue. An explanation of the parameters is linked in Touchpad_Synaptics#No_Multi-touch_in_some_Elantech_touchpads, which is much better than saying "try some of these".
If a touchpad device is not detected and shown as a device at all, a possible solution might be using one or more of these kernel parameters.
i8042.noloop i8042.nomux i8042.nopnp i8042.reset
Затем я сделал несколько тестов и обнаружил, что в моем случае достаточно добавить параметр ядра i8042.reset
в GRUB_CMDLINE_LINUX_DEFAULT
в файле /etc/default/grub
и запустить:
update-grub2
После этого я вынул батарею, чтобы попытаться воспроизвести ошибку. После того, как машина вышла из строя и перезагрузила Linux, внутренняя мышь Ultranav/Elantech уже была распознана и сначала работала, без необходимости предварительной загрузки Windows 10.
Я бы сказал, что это ошибка ядра.
Как и другие ноутбуки, Lenovo Thinkpad необходимо добавить в список сброса устройств i8042 в ядре Linux, где есть список семейных машин, которым требуется сброс набора микросхем i8042, чтобы постоянно обнаруживать сенсорную панель Elantech.
Я обнаружил это более позднее требование после обнаружения этих записей об ошибках Ввод :i8042 -добавить Lenovo LaVie Z в список сброса i8042 и Ввод :i8042 :добавить Lenovo Список сброса ThinkPad L460 на i8042
Судя по визуальному осмотру исходного кода ядра Linux, исходный код для добавления Lenovo ThinkPad E560 в список сброса i8042 также отсутствует в последних исходных кодах ядра 4.19 -rc2.
Поэтому для его добавления я написал простой diff/patch, который можно использовать вместо использования параметра ядра i8042.reset в grub:
--- drivers/input/serio/i8042-x86ia64io.h.old 2018-09-06 04:53:36.460003164 +0100
+++ drivers/input/serio/i8042-x86ia64io.h 2018-09-06 04:57:16.833465129 +0100
@@ -655,6 +655,14 @@
DMI_MATCH(DMI_PRODUCT_NAME, "P65xRP"),
},
},
+ {
+ /* Lenovo ThinkPad E560 */
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad E560"),
+ },
+ },
+
{ }
};
ПС. Следуя предложению @StephenKitt, я попытался отправить этот пост в качестве отчета об ошибке ядра Linux на linux -input@vger.kernel.org
Эта часть регулярного выражения является источником ошибки:[\s-.]
Если вы хотите, чтобы -
рассматривалось как просто еще один символ в выражении в квадратных скобках, поместите его в начало или конец выражения. В противном случае он будет рассматриваться как диапазон.
Например:
[a-z]
означает «сопоставить все строчные буквы от a до z» [-az]
или [az-]
означают «соответствие тире, букве «а» или букве «z» Кстати, ни одна известная мне версия sed не понимает perl -ish \d
как синоним [0-9]
или [:digit:]
. Некоторые версии sed
(, например. GNU sed )понимает \s
как синоним пробелов и табуляции ([:blank:]
), но, конечно, не все. А те, кто действительно понимают \s
, возможно, понимают только вне скобочных выражений (я не знаю никого, кто понимает это внутри []
, но это не это не означает, что нет какого-то неясного варианта sed, который делает ).
И, насколько мне известно, sed не понимает, что Perl (?:)
означает незахватывающее -подвыражение.
Чтобы использовать функции расширенного регулярного выражения (ERE ), такие как {}, не экранируя их как \{
и \}
, вам нужно использовать параметр sed -E
(, и их экранирование может быть GNU расширение, как и для \+
, поэтому может не работать для всех версий sed ).
Чтобы сопоставить 12 -19 цифр, которые могут содержать пробелы или тире, и заменить их звездочками, сначала нужно удалить пробелы и тире, а затем попытаться сопоставить 12 -19 цифр.. например.
echo "$info" | sed -E -e 's/[[:blank:]-]//; s/[[:digit:]]{12,19}/*/g'
ПРИМЕЧАНИЕ. :Если вас не волнует переносимость и вы вряд ли когда-либо будете иметь дело со старыми или проприетарными версиями sed, это будет нормально. В противном случае придерживайтесь основных регулярных выражений (BRE )или используйте perl -n
или perl -p
вместоsed
(и определенно используйте perl, если вы хотите использовать диалект Perl регулярных выражений ).
Также обратите внимание, что это повлияет на все, что находится в $info
, поэтому все пробелы и тире будут удалены. В зависимости от того, что находится в $info, это может быть не то, что вам нужно.
Если $info может содержать другой текст (, например. VISA 1234123412341234 EXP 1222 CVV 123
вместо просто 1234123412341234
), тогда вам, вероятно, следует использовать awk или perl вместо sed, чтобы вы могли легко работать с каждым отдельным полем, а не со всей строкой.