git: c4959c18fe76 - stable/14 - keymaps: add map for some Lenovo laptops found in Brazillian market

From: Alfredo Dal'Ava Junior <alfredo_at_FreeBSD.org>
Date: Tue, 22 Apr 2025 11:11:02 UTC
The branch stable/14 has been updated by alfredo:

URL: https://cgit.FreeBSD.org/src/commit/?id=c4959c18fe767d1fe6172fd068b2613a1a14bdb0

commit c4959c18fe767d1fe6172fd068b2613a1a14bdb0
Author:     Alfredo Dal'Ava Junior <alfredo@FreeBSD.org>
AuthorDate: 2025-03-25 19:35:38 +0000
Commit:     Alfredo Dal'Ava Junior <alfredo@FreeBSD.org>
CommitDate: 2025-04-22 11:10:47 +0000

    keymaps: add map for some Lenovo laptops found in Brazillian market
    
    Some laptops sold in Brazil have the key "/, ?" in same position
    where it should be the right control key.
    
    Reported by:    Andrei Drusian <drusian@gmail.com>
    Tested by:      Andrei Drusian <drusian@gmail.com>
    MFC After:      1 week
    
    (cherry picked from commit 9357c694e8dca627c25b15529e8435b2ab3dd48b)
---
 share/vt/keymaps/INDEX.keymaps |   3 +
 share/vt/keymaps/br.lenovo.kbd | 160 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 163 insertions(+)

diff --git a/share/vt/keymaps/INDEX.keymaps b/share/vt/keymaps/INDEX.keymaps
index 278f9ec9f373..a3b59989cc5d 100644
--- a/share/vt/keymaps/INDEX.keymaps
+++ b/share/vt/keymaps/INDEX.keymaps
@@ -83,6 +83,9 @@ br.noacc.kbd:fr:Brésilien (sans accents)
 br.noacc.kbd:pt:Brasileiro (without accent keys)
 br.noacc.kbd:es:Brasileño (without accent keys)
 
+br.lenovo.kbd:en:Brazilian Lenovo Laptop (accent keys, with slash in place of right Ctrl)
+br.lenovo.kbd:pt:Brasileiro Lenovo Laptop (com acentos, com barra no lugar do Ctrl da direita)
+
 by.kbd:en:Belarusian
 by.kbd:da:Hviderussisk
 by.kbd:de:Weißrussisch
diff --git a/share/vt/keymaps/br.lenovo.kbd b/share/vt/keymaps/br.lenovo.kbd
new file mode 100644
index 000000000000..c5cd3be60b09
--- /dev/null
+++ b/share/vt/keymaps/br.lenovo.kbd
@@ -0,0 +1,160 @@
+#
+# Keymap for Lenovo laptops (Thinkpad, Ideapad, Yoga, Legion)
+#
+# Some laptops sold in Brazil have written "/, ?" in same position
+# where it should be the right control key. The keyboard sends
+# the incorrect scancode.
+#
+# This map should be the same as br.keymap, but with 090 (rctrl)
+# replaced by 115 scancode content (?, /, 0xb0).
+#
+#                                                         alt
+# scan                       cntrl          alt    alt   cntrl lock
+# code  base   shift  cntrl  shift  alt    shift  cntrl  shift state
+# ------------------------------------------------------------------
+  000   nop    nop    nop    nop    nop    nop    nop    nop     O
+  001   esc    esc    esc    esc    esc    esc    debug  esc     O
+  002   '1'    '!'    nop    nop    0xb9   '!'    nop    nop     O
+  003   '2'    '@'    nul    nul    0xb2   '@'    nul    nul     O
+  004   '3'    '#'    nop    nop    0xb3   '#'    nop    nop     O
+  005   '4'    '$'    nop    nop    0xa3   '$'    nop    nop     O
+  006   '5'    '%'    nop    nop    0xa2   '%'    nop    nop     O
+  007   '6'    duml   rs     rs     0xac   duml   rs     rs      O
+  008   '7'    '&'    nop    nop    '7'    '&'    nop    nop     O
+  009   '8'    '*'    nop    nop    '8'    '*'    nop    nop     O
+  010   '9'    '('    nop    nop    '9'    '('    nop    nop     O
+  011   '0'    ')'    nop    nop    '0'    ')'    nop    nop     O
+  012   '-'    '_'    us     us     '-'    '_'    us     us      O
+  013   '='    '+'    nop    nop    0xa7   '+'    nop    nop     O
+  014   bs     bs     del    del    bs     bs     del    del     O
+  015   ht     btab   nop    nop    ht     btab   nop    nop     O
+  016   'q'    'Q'    dc1    dc1    '/'    'Q'    dc1    dc1     C
+  017   'w'    'W'    etb    etb    '?'    'W'    etb    etb     C
+  018   'e'    'E'    enq    enq    0x00b0 'E'    enq    enq     C
+  019   'r'    'R'    dc2    dc2    'r'    'R'    dc2    dc2     C
+  020   't'    'T'    dc4    dc4    't'    'T'    dc4    dc4     C
+  021   'y'    'Y'    em     em     'y'    'Y'    em     em      C
+  022   'u'    'U'    nak    nak    'u'    'U'    nak    nak     C
+  023   'i'    'I'    ht     ht     'i'    'I'    ht     ht      C
+  024   'o'    'O'    si     si     'o'    'O'    si     si      C
+  025   'p'    'P'    dle    dle    'p'    'P'    dle    dle     C
+  026   dacu   dgra   nop    nop    dacu   dgra   nop    nop     O
+  027   '['    '{'    esc    esc    0xaa   '{'    esc    esc     O
+  028   cr     cr     nl     nl     cr     cr     nl     nl      O
+  029   lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl  lctrl   O
+  030   'a'    'A'    soh    soh    'a'    'A'    soh    soh     C
+  031   's'    'S'    dc3    dc3    's'    'S'    dc3    dc3     C
+  032   'd'    'D'    eot    eot    'd'    'D'    eot    eot     C
+  033   'f'    'F'    ack    ack    'f'    'F'    ack    ack     C
+  034   'g'    'G'    bel    bel    'g'    'G'    bel    bel     C
+  035   'h'    'H'    bs     bs     'h'    'H'    bs     bs      C
+  036   'j'    'J'    nl     nl     'j'    'J'    nl     nl      C
+  037   'k'    'K'    vt     vt     'k'    'K'    vt     vt      C
+  038   'l'    'L'    ff     ff     'l'    'L'    ff     ff      C
+  039   0xe7   0xc7   nop    nop    0xe7   0xc7   nop    nop     C
+  040   dtil   dcir   nop    nop    dtil   dcir   nop    nop     O
+  041   '''    '"'    nop    nop    '''    '"'    nop    nop     O
+  042   lshift lshift lshift lshift lshift lshift lshift lshift  O
+  043   ']'    '}'    gs     gs     0xba   '}'    gs     gs      O
+  044   'z'    'Z'    sub    sub    'z'    'Z'    sub    sub     C
+  045   'x'    'X'    can    can    'x'    'X'    can    can     C
+  046   'c'    'C'    etx    etx    0x20a2 'C'    etx    etx     C
+  047   'v'    'V'    syn    syn    'v'    'V'    syn    syn     C
+  048   'b'    'B'    stx    stx    'b'    'B'    stx    stx     C
+  049   'n'    'N'    so     so     'n'    'N'    so     so      C
+  050   'm'    'M'    cr     cr     'm'    'M'    cr     cr      C
+  051   ','    '<'    nop    nop    ','    '<'    nop    nop     O
+  052   '.'    '>'    nop    nop    '.'    '>'    nop    nop     O
+  053   ';'    ':'    nop    nop    ';'    ':'    nop    nop     O
+  054   rshift rshift rshift rshift rshift rshift rshift rshift  O
+  055   '*'    '*'    '*'    '*'    '*'    '*'    '*'    '*'     O
+  056   lalt   lalt   lalt   lalt   lalt   lalt   lalt   lalt    O
+  057   ' '    ' '    nul    ' '    ' '    ' '    susp   ' '     O
+  058   clock  clock  clock  clock  clock  clock  clock  clock   O
+  059   fkey01 fkey13 fkey25 fkey37 scr01  scr11  scr01  scr11   O
+  060   fkey02 fkey14 fkey26 fkey38 scr02  scr12  scr02  scr12   O
+  061   fkey03 fkey15 fkey27 fkey39 scr03  scr13  scr03  scr13   O
+  062   fkey04 fkey16 fkey28 fkey40 scr04  scr14  scr04  scr14   O
+  063   fkey05 fkey17 fkey29 fkey41 scr05  scr15  scr05  scr15   O
+  064   fkey06 fkey18 fkey30 fkey42 scr06  scr16  scr06  scr16   O
+  065   fkey07 fkey19 fkey31 fkey43 scr07  scr07  scr07  scr07   O
+  066   fkey08 fkey20 fkey32 fkey44 scr08  scr08  scr08  scr08   O
+  067   fkey09 fkey21 fkey33 fkey45 scr09  scr09  scr09  scr09   O
+  068   fkey10 fkey22 fkey34 fkey46 scr10  scr10  scr10  scr10   O
+  069   nlock  nlock  nlock  nlock  nlock  nlock  nlock  nlock   O
+  070   slock  slock  slock  slock  slock  slock  slock  slock   O
+  071   fkey49 '7'    '7'    '7'    '7'    '7'    '7'    '7'     N
+  072   fkey50 '8'    '8'    '8'    '8'    '8'    '8'    '8'     N
+  073   fkey51 '9'    '9'    '9'    '9'    '9'    '9'    '9'     N
+  074   fkey52 '-'    '-'    '-'    '-'    '-'    '-'    '-'     N
+  075   fkey53 '4'    '4'    '4'    '4'    '4'    '4'    '4'     N
+  076   fkey54 '5'    '5'    '5'    '5'    '5'    '5'    '5'     N
+  077   fkey55 '6'    '6'    '6'    '6'    '6'    '6'    '6'     N
+  078   fkey56 '+'    '+'    '+'    '+'    '+'    '+'    '+'     N
+  079   fkey57 '1'    '1'    '1'    '1'    '1'    '1'    '1'     N
+  080   fkey58 '2'    '2'    '2'    '2'    '2'    '2'    '2'     N
+  081   fkey59 '3'    '3'    '3'    '3'    '3'    '3'    '3'     N
+  082   fkey60 '0'    '0'    '0'    '0'    '0'    '0'    '0'     N
+  083   del    ','    ','    ','    ','    ','    boot   boot    N
+  084   nop    nop    nop    nop    nop    nop    nop    nop     O
+  085   nop    nop    nop    nop    nop    nop    nop    nop     O
+  086   '\'    '|'    fs     fs     '\'    '|'    fs     fs      O
+  087   fkey11 fkey23 fkey35 fkey47 scr11  scr11  scr11  scr11   O
+  088   fkey12 fkey24 fkey36 fkey48 scr12  scr12  scr12  scr12   O
+  089   cr     cr     nl     nl     cr     cr     nl     nl      O
+  090   '/'    '?'    nop    nop    0xb0   '?'    nop    nop     O
+  091   '/'    '/'    '/'    '/'    '/'    '/'    '/'    '/'     N
+  092   nscr   pscr   debug  debug  nop    nop    nop    nop     O
+  093   ralt   ralt   ralt   ralt   ralt   ralt   ralt   ralt    O
+  094   fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49 fkey49  O
+  095   fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50 fkey50  O
+  096   fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51 fkey51  O
+  097   fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53 fkey53  O
+  098   fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55 fkey55  O
+  099   fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57 fkey57  O
+  100   fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58 fkey58  O
+  101   fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59 fkey59  O
+  102   fkey60 paste  fkey60 fkey60 fkey60 fkey60 fkey60 fkey60  O
+  103   fkey61 fkey61 fkey61 fkey61 fkey61 fkey61 boot   fkey61  O
+  104   slock  saver  slock  saver  susp   nop    susp   nop     O
+  105   fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62 fkey62  O
+  106   fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63 fkey63  O
+  107   fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64 fkey64  O
+  108   nop    nop    nop    nop    nop    nop    nop    nop     O
+  109   nop    nop    nop    nop    nop    nop    nop    nop     O
+  110   nop    nop    nop    nop    nop    nop    nop    nop     O
+  111   nop    nop    nop    nop    nop    nop    nop    nop     O
+  112   nop    nop    nop    nop    nop    nop    nop    nop     O
+  113   nop    nop    nop    nop    nop    nop    nop    nop     O
+  114   nop    nop    nop    nop    nop    nop    nop    nop     O
+  115   nop    nop    nop    nop    nop    nop    nop    nop     O
+  116   nop    nop    nop    nop    nop    nop    nop    nop     O
+  117   nop    nop    nop    nop    nop    nop    nop    nop     O
+  118   nop    nop    nop    nop    nop    nop    nop    nop     O
+  119   nop    nop    nop    nop    nop    nop    nop    nop     O
+  120   nop    nop    nop    nop    nop    nop    nop    nop     O
+  121   nop    nop    nop    nop    nop    nop    nop    nop     O
+  122   nop    nop    nop    nop    nop    nop    nop    nop     O
+  123   nop    nop    nop    nop    nop    nop    nop    nop     O
+  124   nop    nop    nop    nop    nop    nop    nop    nop     O
+  125   nop    nop    nop    nop    nop    nop    nop    nop     O
+  126   '.'    '.'    '.'    '.'    '.'    '.'    '.'    '.'     N
+
+  dgra '`'     ( 'a'    0xe0    ) ( 'A'    0xc0    ) ( 'e'    0xe8    ) ( 'E'    0xc8    )
+               ( 'i'    0xec    ) ( 'I'    0xcc    ) ( 'o'    0xf2    ) ( 'O'    0xd2    )
+               ( 'u'    0xf9    ) ( 'U'    0xd9    )
+
+  dacu 0xb4    ( 'a'    0xe1    ) ( 'A'    0xc1    ) ( 'e'    0xe9    ) ( 'E'    0xc9    )
+               ( 'i'    0xed    ) ( 'I'    0xcd    ) ( 'o'    0xf3    ) ( 'O'    0xd3    )
+               ( 'u'    0xfa    ) ( 'U'    0xda    ) ( 'y'    0xfd    ) ( 'Y'    0xdd    )
+
+  dcir '^'     ( 'a'    0xe2    ) ( 'A'    0xc2    ) ( 'e'    0xea    ) ( 'E'    0xca    )
+               ( 'i'    0xee    ) ( 'I'    0xce    ) ( 'o'    0xf4    ) ( 'O'    0xd4    )
+               ( 'u'    0xfb    ) ( 'U'    0xdb    )
+
+  dtil '~'     ( 'a'    0xe3    ) ( 'A'    0xc3    ) ( 'n'    0xf1    ) ( 'N'    0xd1    )
+               ( 'o'    0xf5    ) ( 'O'    0xd5    )
+
+  duml 0xa8    ( 'a'    0xe4    ) ( 'A'    0xc4    ) ( 'e'    0xeb    ) ( 'E'    0xcb    )
+               ( 'i'    0xef    ) ( 'I'    0xcf    ) ( 'o'    0xf6    ) ( 'O'    0xd6    )
+               ( 'u'    0xfc    ) ( 'U'    0xdc    ) ( 'y'    0xff    )