diff --git a/firmware2/.cargo/config.toml b/firmware2/.cargo/config.toml index 390834f..17dc3bb 100644 --- a/firmware2/.cargo/config.toml +++ b/firmware2/.cargo/config.toml @@ -1,12 +1,13 @@ [target.'cfg(all(any(target_arch = "riscv32", target_arch = "xtensa"), target_os = "none"))'] runner = "espflash flash --monitor" +# runner = "probe-rs run --chip esp32s3 --preverify" [build] target = "xtensa-esp32s3-none-elf" rustflags = [ # Required to obtain backtraces (e.g. when using the "esp-backtrace" crate.) # NOTE: May negatively impact performance of produced code - "-C", "force-frame-pointers", + "-C", "force-frame-pointers", "-C", "link-arg=-Wl,--wrap=strncmp", ] diff --git a/firmware2/.vscode/launch.json b/firmware2/.vscode/launch.json new file mode 100644 index 0000000..b6b99b9 --- /dev/null +++ b/firmware2/.vscode/launch.json @@ -0,0 +1,61 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "probe-rs debug restart", + "type": "probe-rs-debug", + "request": "launch", + "probe": "303a:1001", + "chip": "esp32s3", + "coreConfigs": [ + { + "programBinary": "target/xtensa-esp32s3-none-elf/debug/acid-firmware" + } + ] + }, + { + "name": "probe-rs release restart", + "type": "probe-rs-debug", + "request": "launch", + "probe": "303a:1001", + "chip": "esp32s3", + "coreConfigs": [ + { + "programBinary": "target/xtensa-esp32s3-none-elf/release/acid-firmware" + } + ] + }, + { + "preLaunchTask": "rust: cargo build", + "name": "probe-rs debug", + "type": "probe-rs-debug", + "request": "launch", + "flashingConfig": { + "flashingEnabled": true, + }, + "probe": "303a:1001", + "chip": "esp32s3", + "coreConfigs": [ + { + "programBinary": "target/xtensa-esp32s3-none-elf/debug/acid-firmware" + } + ] + }, + { + "preLaunchTask": "rust: cargo build --release", + "name": "probe-rs release", + "type": "probe-rs-debug", + "request": "launch", + "flashingConfig": { + "flashingEnabled": true, + }, + "probe": "303a:1001", + "chip": "esp32s3", + "coreConfigs": [ + { + "programBinary": "target/xtensa-esp32s3-none-elf/release/acid-firmware" + } + ] + } + ] +} diff --git a/firmware2/.vscode/tasks.json b/firmware2/.vscode/tasks.json new file mode 100644 index 0000000..56d012d --- /dev/null +++ b/firmware2/.vscode/tasks.json @@ -0,0 +1,35 @@ +{ + "version": "2.0.0", + "tasks": [ + { + "label": "rust: cargo build", + "type": "cargo", + "command": "build", + "args": [ + "--no-default-features", "--features=probe,info" + ], + "problemMatcher": [ + "$rustc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + }, + { + "label": "rust: cargo build --release", + "type": "cargo", + "command": "build", + "args": [ + "--release", "--no-default-features", "--features=probe,info" + ], + "problemMatcher": [ + "$rustc" + ], + "group": { + "kind": "build", + "isDefault": true + }, + } + ] +} diff --git a/firmware2/Cargo.lock b/firmware2/Cargo.lock index 6c8fa87..5d97482 100644 --- a/firmware2/Cargo.lock +++ b/firmware2/Cargo.lock @@ -33,12 +33,16 @@ dependencies = [ "json", "lazy_static", "log", + "mutually_exclusive_features", + "panic-rtt-target", "paste", "rand_core 0.6.4", "rmk", + "rtt-target", "slint", "slint-build", "static_cell", + "xkbcommon 0.9.0", "xz2", ] @@ -3722,7 +3726,7 @@ dependencies = [ "input", "memmap2", "nix", - "xkbcommon", + "xkbcommon 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -4660,6 +4664,12 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "mutually_exclusive_features" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94e1e6445d314f972ff7395df2de295fe51b71821694f0b0e1e79c4f12c8577" + [[package]] name = "nb" version = "0.1.3" @@ -5240,6 +5250,17 @@ dependencies = [ "primeorder", ] +[[package]] +name = "panic-rtt-target" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8116ffce1f89818647b84fba66d16cfdf3c0bee3c9320e606588d3e7415ce7" +dependencies = [ + "critical-section", + "portable-atomic", + "rtt-target", +] + [[package]] name = "parking" version = "2.2.1" @@ -6077,6 +6098,19 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "rtt-target" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7afed1f4302eeba88c601636cf2c554c45e1cbb464bab44c6012bab0e71473c" +dependencies = [ + "critical-section", + "log", + "once_cell", + "portable-atomic", + "ufmt-write", +] + [[package]] name = "rust-ini" version = "0.21.3" @@ -6879,6 +6913,15 @@ dependencies = [ "strict-num", ] +[[package]] +name = "tinyrlibc" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d07d242693682e46801cb0186c583858bce022f698401b3f04bbd729c9a87e7" +dependencies = [ + "cc", +] + [[package]] name = "tinystr" version = "0.8.2" @@ -8119,6 +8162,14 @@ dependencies = [ "rustix 1.1.3", ] +[[package]] +name = "xkbcommon" +version = "0.9.0" +dependencies = [ + "tinyrlibc", + "xkeysym", +] + [[package]] name = "xkbcommon" version = "0.9.0" diff --git a/firmware2/Cargo.toml b/firmware2/Cargo.toml index 8197c5b..a345082 100644 --- a/firmware2/Cargo.toml +++ b/firmware2/Cargo.toml @@ -9,8 +9,9 @@ edition = "2024" [features] default = ["usb-log", "limit-fps", "warn"] -develop = ["limit-fps", "alt-log"] +# Make RMK not to use USB no-usb = ["rmk/_no_usb"] +# Let RMK use BLE ble = ["rmk/esp32s3_ble"] # Use alternative logging via GPIO5 as RX and GPIO12 as TX. # Disables default logging via USB. @@ -18,13 +19,23 @@ ble = ["rmk/esp32s3_ble"] alt-log = [] # Standard logging implementation over USB. usb-log = ["esp-backtrace/panic-handler"] +# RTT (+ logging) for probe-rs +rtt-log = ["dep:rtt-target", "dep:panic-rtt-target"] +# Block the main core while it is driving the LCD. +# This prevents the main core from accessing PSRAM while the LCD is being driven, +# which causes the LCD to glitch. To prevent the main core from spending all its +# execution time on just driving the LCD, it will be limited. limit-fps = [] -# Log levels (lower takes precedence) +# Log levels (lower takes precedence) TODO: Use env vars error = [] warn = [] info = [] debug = [] trace = [] +# Development profiles +develop = ["limit-fps", "alt-log"] +develop-usb = ["limit-fps", "usb-log", "no-usb"] +probe = ["limit-fps", "rtt-log", "no-usb"] [dependencies] rmk = { version = "0.8.2", default-features = false, features = [ @@ -60,10 +71,14 @@ bytemuck = "1.24.0" slint = { version = "1.14.1", default-features = false, features = ["compat-1-2", "libm", "log", "unsafe-single-threaded", "renderer-software"]} critical-section = "1.2.0" cfg-if = "1.0.4" +xkbcommon = { path = "../../../rust/xkbcommon-rs-ffi", default-features = false, features = ["tinyrlibc"] } +rtt-target = { version = "0.6.2", features = ["log"], optional = true } +panic-rtt-target = { version = "0.2.0", optional = true } # Crates for serial UART CLI embedded-cli = { version = "0.2.1", default-features = false, features = ["help", "macros"] } embedded-io = "0.6.1" +mutually_exclusive_features = "0.1.0" [build-dependencies] xz2 = "0.1.7" @@ -83,20 +98,48 @@ bench = false inherits = "release" debug = true + [profile.dev.package.esp-storage] opt-level = 3 +# btuuid fails to compile with `opt-level = "s"` +[profile.dev.package.btuuid] +opt-level = 0 + +# Optimize dependencies +[profile.dev.package."*"] +opt-level = 3 + +# [profile.dev.package.xtensa-lx] +# opt-level = 0 + +# [profile.dev.package.esp-sync] +# opt-level = 0 + +# [profile.dev.package.esp-alloc] +# opt-level = 0 + [profile.dev] # Rust debug is too slow. # For debug builds always builds with some optimization -opt-level = "s" +# opt-level = "s" +opt-level = 0 +lto = false + +[profile.release.package."*"] +opt-level = 3 + +# btuuid fails to compile with `opt-level = "3"` +[profile.release.package.btuuid] +opt-level = 0 [profile.release] codegen-units = 1 # LLVM can perform better optimizations using a single thread debug = 2 debug-assertions = false incremental = false -lto = 'thin' -opt-level = 3 +# lto = 'thin' +lto = false +# opt-level = 3 +opt-level = 0 overflow-checks = false - diff --git a/firmware2/build.rs b/firmware2/build.rs index 9c0d80f..bf46d19 100644 --- a/firmware2/build.rs +++ b/firmware2/build.rs @@ -1,6 +1,6 @@ use std::fs::{File, OpenOptions}; use std::io::{Read, Write}; -use std::path::Path; +use std::path::{Path, PathBuf}; use std::env; use const_gen::*; @@ -29,6 +29,17 @@ fn main() { // Set the extra linker script from defmt // println!("cargo:rustc-link-arg=-Tdefmt.x"); + // 1. Tell cargo where to find the library + // let lib_path = PathBuf::from(manifest_dir).join("libs"); + // println!(r#"cargo:rustc-link-search=native={}"#, lib_path.display()); + println!(r#"cargo:rustc-link-search=native=C:\Users\Limeth\workspace\c\libxkbcommon-linux\build-debug"#); + + // 2. Link the static library (strip the 'lib' prefix and '.a' extension) + println!("cargo:rustc-link-lib=static=xkbcommon"); + + // 3. Re-run if build.rs or the library changes + println!(r#"cargo:rerun-if-changed=C:\Users\Limeth\workspace\c\libxkbcommon-linux\build-debug\libxkbcommon.a"#); + let slint_config = CompilerConfiguration::new() // .with_scale_factor(4.0) .with_style("cosmic-dark".to_string()) diff --git a/firmware2/keymaps/cz.xkb b/firmware2/keymaps/cz.xkb new file mode 100644 index 0000000..2143275 --- /dev/null +++ b/firmware2/keymaps/cz.xkb @@ -0,0 +1,1914 @@ +xkb_keymap { +xkb_keycodes "(unnamed)" { + minimum = 8; + maximum = 708; + = 9; + = 10; + = 11; + = 12; + = 13; + = 14; + = 15; + = 16; + = 17; + = 18; + = 19; + = 20; + = 21; + = 22; + = 23; + = 24; + = 25; + = 26; + = 27; + = 28; + = 29; + = 30; + = 31; + = 32; + = 33; + = 34; + = 35; + = 36; + = 37; + = 38; + = 39; + = 40; + = 41; + = 42; + = 43; + = 44; + = 45; + = 46; + = 47; + = 48; + = 49; + = 50; + = 51; + = 52; + = 53; + = 54; + = 55; + = 56; + = 57; + = 58; + = 59; + = 60; + = 61; + = 62; + = 63; + = 64; + = 65; + = 66; + = 67; + = 68; + = 69; + = 70; + = 71; + = 72; + = 73; + = 74; + = 75; + = 76; + = 77; + = 78; + = 79; + = 80; + = 81; + = 82; + = 83; + = 84; + = 85; + = 86; + = 87; + = 88; + = 89; + = 90; + = 91; + = 92; + = 94; + = 95; + = 96; + = 97; + = 98; + = 99; + = 100; + = 101; + = 102; + = 103; + = 104; + = 105; + = 106; + = 107; + = 108; + = 109; + = 110; + = 111; + = 112; + = 113; + = 114; + = 115; + = 116; + = 117; + = 118; + = 119; + = 120; + = 121; + = 122; + = 123; + = 124; + = 125; + = 126; + = 127; + = 128; + = 129; + = 130; + = 131; + = 132; + = 133; + = 134; + = 135; + = 136; + = 137; + = 138; + = 139; + = 140; + = 141; + = 142; + = 143; + = 144; + = 145; + = 146; + = 147; + = 148; + = 149; + = 150; + = 151; + = 152; + = 153; + = 154; + = 155; + = 156; + = 157; + = 158; + = 159; + = 160; + = 161; + = 162; + = 163; + = 164; + = 165; + = 166; + = 167; + = 168; + = 169; + = 170; + = 171; + = 172; + = 173; + = 174; + = 175; + = 176; + = 177; + = 178; + = 179; + = 180; + = 181; + = 182; + = 183; + = 184; + = 185; + = 186; + = 187; + = 188; + = 189; + = 190; + = 191; + = 192; + = 193; + = 194; + = 195; + = 196; + = 197; + = 198; + = 199; + = 200; + = 201; + = 202; + = 203; + = 204; + = 205; + = 206; + = 207; + = 208; + = 209; + = 210; + = 211; + = 212; + = 213; + = 214; + = 215; + = 216; + = 217; + = 218; + = 219; + = 220; + = 221; + = 222; + = 223; + = 224; + = 225; + = 226; + = 227; + = 228; + = 229; + = 230; + = 231; + = 232; + = 233; + = 234; + = 235; + = 236; + = 237; + = 238; + = 239; + = 240; + = 241; + = 242; + = 243; + = 244; + = 245; + = 246; + = 247; + = 248; + = 249; + = 250; + = 251; + = 252; + = 253; + = 254; + = 255; + = 256; + = 360; + = 361; + = 362; + = 363; + = 364; + = 365; + = 366; + = 367; + = 368; + = 369; + = 370; + = 371; + = 372; + = 373; + = 374; + = 375; + = 376; + = 377; + = 378; + = 379; + = 380; + = 381; + = 382; + = 383; + = 384; + = 385; + = 386; + = 387; + = 388; + = 389; + = 390; + = 391; + = 392; + = 393; + = 394; + = 395; + = 396; + = 397; + = 398; + = 399; + = 400; + = 401; + = 402; + = 403; + = 404; + = 405; + = 406; + = 407; + = 408; + = 409; + = 410; + = 411; + = 412; + = 413; + = 414; + = 415; + = 416; + = 417; + = 418; + = 419; + = 420; + = 421; + = 422; + = 423; + = 424; + = 425; + = 426; + = 427; + = 428; + = 429; + = 430; + = 431; + = 432; + = 433; + = 434; + = 435; + = 436; + = 437; + = 438; + = 439; + = 440; + = 441; + = 442; + = 443; + = 444; + = 445; + = 446; + = 447; + = 448; + = 449; + = 450; + = 452; + = 453; + = 454; + = 456; + = 457; + = 458; + = 459; + = 472; + = 473; + = 474; + = 475; + = 476; + = 477; + = 478; + = 479; + = 480; + = 481; + = 482; + = 483; + = 484; + = 485; + = 486; + = 487; + = 488; + = 489; + = 490; + = 491; + = 492; + = 493; + = 505; + = 506; + = 507; + = 508; + = 509; + = 510; + = 511; + = 512; + = 513; + = 514; + = 520; + = 521; + = 522; + = 523; + = 524; + = 525; + = 526; + = 527; + = 528; + = 529; + = 530; + = 531; + = 532; + = 533; + = 534; + = 535; + = 536; + = 537; + = 538; + = 539; + = 540; + = 541; + = 542; + = 543; + = 544; + = 545; + = 546; + = 547; + = 548; + = 549; + = 550; + = 568; + = 569; + = 584; + = 585; + = 586; + = 587; + = 588; + = 589; + = 590; + = 591; + = 592; + = 593; + = 594; + = 595; + = 596; + = 597; + = 600; + = 601; + = 616; + = 617; + = 618; + = 619; + = 620; + = 621; + = 622; + = 623; + = 624; + = 625; + = 626; + = 627; + = 628; + = 629; + = 630; + = 631; + = 632; + = 633; + = 634; + = 635; + = 636; + = 637; + = 638; + = 639; + = 640; + = 641; + = 642; + = 643; + = 644; + = 645; + = 646; + = 647; + = 648; + = 649; + = 650; + = 651; + = 652; + = 653; + = 654; + = 655; + = 656; + = 657; + = 664; + = 665; + = 666; + = 667; + = 668; + = 669; + = 670; + = 671; + = 672; + = 673; + = 674; + = 675; + = 676; + = 677; + = 678; + = 679; + = 680; + = 681; + = 682; + = 683; + = 684; + = 685; + = 686; + = 687; + = 688; + = 689; + = 690; + = 691; + = 692; + = 693; + = 696; + = 697; + = 698; + = 699; + = 700; + = 701; + = 704; + = 705; + = 706; + = 707; + = 708; + indicator 1 = "Caps Lock"; + indicator 2 = "Num Lock"; + indicator 3 = "Scroll Lock"; + indicator 4 = "Compose"; + indicator 5 = "Kana"; + indicator 6 = "Sleep"; + indicator 7 = "Suspend"; + indicator 8 = "Mute"; + indicator 9 = "Misc"; + indicator 10 = "Mail"; + indicator 11 = "Charging"; + indicator 12 = "Shift Lock"; + indicator 13 = "Group 2"; + indicator 14 = "Mouse Keys"; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; + alias = ; +}; + +xkb_types "(unnamed)" { + virtual_modifiers NumLock,Alt,LevelThree,LevelFive,Meta,Super,Hyper,ScrollLock; + + type "ONE_LEVEL" { + modifiers= none; + level_name[1]= "Any"; + }; + type "TWO_LEVEL" { + modifiers= Shift; + map[Shift]= 2; + level_name[1]= "Base"; + level_name[2]= "Shift"; + }; + type "ALPHABETIC" { + modifiers= Shift+Lock; + map[Shift]= 2; + map[Lock]= 2; + level_name[1]= "Base"; + level_name[2]= "Caps"; + }; + type "PC_ALT_LEVEL2" { + modifiers= Alt; + map[Alt]= 2; + level_name[1]= "Base"; + level_name[2]= "Alt"; + }; + type "PC_SUPER_LEVEL2" { + modifiers= Mod4; + map[Mod4]= 2; + level_name[1]= "Base"; + level_name[2]= "Super"; + }; + type "PC_CONTROL_LEVEL2" { + modifiers= Control; + map[Control]= 2; + level_name[1]= "Base"; + level_name[2]= "Control"; + }; + type "CTRL+ALT" { + modifiers= Shift+Control+Alt+LevelThree; + map[Shift]= 2; + preserve[Shift]= Shift; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + preserve[Shift+LevelThree]= Shift; + map[Control+Alt]= 5; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "Ctrl+Alt"; + }; + type "THREE_LEVEL" { + modifiers= Shift+LevelThree; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "Level3"; + }; + type "FOUR_LEVEL" { + modifiers= Shift+LevelThree; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_ALPHABETIC" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 4; + map[Shift+Lock+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_SEMIALPHABETIC" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 3; + preserve[Lock+LevelThree]= Lock; + map[Shift+Lock+LevelThree]= 4; + preserve[Shift+Lock+LevelThree]= Lock; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_KEYPAD" { + modifiers= Shift+NumLock+LevelThree; + map[Shift]= 2; + map[NumLock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[NumLock+LevelThree]= 4; + map[Shift+NumLock+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift/Numlock"; + level_name[3]= "AltGr"; + level_name[4]= "Shift/Numlock AltGr"; + }; + type "FOUR_LEVEL_MIXED_KEYPAD" { + modifiers= Shift+NumLock+LevelThree; + map[Shift]= 2; + map[NumLock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[NumLock+LevelThree]= 3; + map[Shift+NumLock+LevelThree]= 4; + level_name[1]= "Base"; + level_name[2]= "Number"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + }; + type "FOUR_LEVEL_X" { + modifiers= Shift+Control+Alt+LevelThree; + map[LevelThree]= 2; + map[Shift+LevelThree]= 3; + map[Control+Alt]= 4; + level_name[1]= "Base"; + level_name[2]= "AltGr"; + level_name[3]= "Shift AltGr"; + level_name[4]= "Ctrl+Alt"; + }; + type "SEPARATE_CAPS_AND_SHIFT_ALPHABETIC" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[Lock]= 4; + preserve[Lock]= Lock; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 3; + preserve[Lock+LevelThree]= Lock; + map[Shift+Lock+LevelThree]= 3; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Caps / Shift AltGr"; + }; + type "FOUR_LEVEL_PLUS_LOCK" { + modifiers= Shift+Lock+LevelThree; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock]= 5; + map[Shift+Lock]= 2; + map[Lock+LevelThree]= 3; + map[Shift+Lock+LevelThree]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "Lock"; + }; + type "EIGHT_LEVEL" { + modifiers= Shift+LevelThree+LevelFive; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_ALPHABETIC" { + modifiers= Shift+Lock+LevelThree+LevelFive; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 4; + map[Shift+Lock+LevelThree]= 3; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + map[Lock+LevelFive]= 6; + map[Shift+Lock+LevelFive]= 5; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[Lock+LevelThree+LevelFive]= 8; + map[Shift+Lock+LevelThree+LevelFive]= 7; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_SEMIALPHABETIC" { + modifiers= Shift+Lock+LevelThree+LevelFive; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 3; + preserve[Lock+LevelThree]= Lock; + map[Shift+Lock+LevelThree]= 4; + preserve[Shift+Lock+LevelThree]= Lock; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + map[Lock+LevelFive]= 6; + map[Shift+Lock+LevelFive]= 5; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[Lock+LevelThree+LevelFive]= 7; + preserve[Lock+LevelThree+LevelFive]= Lock; + map[Shift+Lock+LevelThree+LevelFive]= 8; + preserve[Shift+Lock+LevelThree+LevelFive]= Lock; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_WITH_LEVEL5_LOCK" { + modifiers= Shift+NumLock+LevelThree+LevelFive; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + preserve[Shift+LevelFive]= Shift; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[NumLock]= 5; + map[Shift+NumLock]= 6; + preserve[Shift+NumLock]= Shift; + map[NumLock+LevelThree]= 7; + map[Shift+NumLock+LevelThree]= 8; + map[Shift+NumLock+LevelFive]= 2; + map[NumLock+LevelThree+LevelFive]= 3; + map[Shift+NumLock+LevelThree+LevelFive]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_ALPHABETIC_WITH_LEVEL5_LOCK" { + modifiers= Shift+Lock+NumLock+LevelThree+LevelFive; + map[Shift]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[LevelFive]= 5; + map[Shift+LevelFive]= 6; + preserve[Shift+LevelFive]= Shift; + map[LevelThree+LevelFive]= 7; + map[Shift+LevelThree+LevelFive]= 8; + map[NumLock]= 5; + map[Shift+NumLock]= 6; + preserve[Shift+NumLock]= Shift; + map[NumLock+LevelThree]= 7; + map[Shift+NumLock+LevelThree]= 8; + map[Shift+NumLock+LevelFive]= 2; + map[NumLock+LevelThree+LevelFive]= 3; + map[Shift+NumLock+LevelThree+LevelFive]= 4; + map[Lock]= 2; + map[Lock+LevelThree]= 3; + map[Shift+Lock+LevelThree]= 4; + map[Lock+LevelFive]= 5; + map[Shift+Lock+LevelFive]= 6; + map[Lock+LevelThree+LevelFive]= 7; + map[Shift+Lock+LevelThree+LevelFive]= 8; + map[Lock+NumLock]= 5; + map[Shift+Lock+NumLock]= 6; + map[Lock+NumLock+LevelThree]= 7; + map[Shift+Lock+NumLock+LevelThree]= 8; + map[Lock+NumLock+LevelFive]= 2; + map[Lock+NumLock+LevelThree+LevelFive]= 3; + map[Shift+Lock+NumLock+LevelThree+LevelFive]= 4; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "AltGr"; + level_name[4]= "Shift AltGr"; + level_name[5]= "X"; + level_name[6]= "X Shift"; + level_name[7]= "X AltGr"; + level_name[8]= "X Shift AltGr"; + }; + type "EIGHT_LEVEL_BY_CTRL" { + modifiers= Shift+Lock+Control+LevelThree; + map[Shift]= 2; + map[Lock]= 2; + map[LevelThree]= 3; + map[Shift+LevelThree]= 4; + map[Lock+LevelThree]= 4; + map[Shift+Lock+LevelThree]= 3; + map[Control]= 5; + map[Shift+Control]= 6; + map[Lock+Control]= 6; + map[Shift+Lock+Control]= 5; + map[Control+LevelThree]= 7; + map[Shift+Control+LevelThree]= 8; + map[Lock+Control+LevelThree]= 8; + map[Shift+Lock+Control+LevelThree]= 7; + level_name[1]= "Base"; + level_name[2]= "Shift"; + level_name[3]= "Level3"; + level_name[4]= "Shift Level3"; + level_name[5]= "Ctrl"; + level_name[6]= "Shift Ctrl"; + level_name[7]= "Level3 Ctrl"; + level_name[8]= "Shift Level3 Ctrl"; + }; + type "KEYPAD" { + modifiers= Shift+NumLock; + map[NumLock]= 2; + level_name[1]= "Base"; + level_name[2]= "Number"; + }; + type "SHIFT+ALT" { + modifiers= Shift+Alt; + map[Shift+Alt]= 2; + level_name[1]= "Base"; + level_name[2]= "Shift+Alt"; + }; +}; + +xkb_compatibility "(unnamed)" { + virtual_modifiers NumLock,Alt,LevelThree,LevelFive,Meta,Super,Hyper,ScrollLock; + + interpret.useModMapMods= AnyLevel; + interpret.repeat= False; + interpret ISO_Level2_Latch+Exactly(Shift) { + useModMapMods=level1; + action= LatchMods(modifiers=Shift,clearLocks,latchToLock); + }; + interpret Shift_Lock+AnyOf(Shift+Lock) { + action= LockMods(modifiers=Shift); + }; + interpret Num_Lock+AnyOf(all) { + virtualModifier= NumLock; + action= LockMods(modifiers=NumLock); + }; + interpret ISO_Level3_Shift+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= SetMods(modifiers=LevelThree,clearLocks); + }; + interpret ISO_Level3_Latch+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); + }; + interpret ISO_Level3_Lock+AnyOf(all) { + virtualModifier= LevelThree; + useModMapMods=level1; + action= LockMods(modifiers=LevelThree); + }; + interpret Alt_L+AnyOf(all) { + virtualModifier= Alt; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Alt_R+AnyOf(all) { + virtualModifier= Alt; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Meta_L+AnyOf(all) { + virtualModifier= Meta; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Meta_R+AnyOf(all) { + virtualModifier= Meta; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Super_L+AnyOf(all) { + virtualModifier= Super; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Super_R+AnyOf(all) { + virtualModifier= Super; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Hyper_L+AnyOf(all) { + virtualModifier= Hyper; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Hyper_R+AnyOf(all) { + virtualModifier= Hyper; + action= SetMods(modifiers=modMapMods,clearLocks); + }; + interpret Scroll_Lock+AnyOf(all) { + virtualModifier= ScrollLock; + action= LockMods(modifiers=modMapMods); + }; + interpret ISO_Level5_Shift+AnyOf(all) { + virtualModifier= LevelFive; + useModMapMods=level1; + action= SetMods(modifiers=LevelFive,clearLocks); + }; + interpret ISO_Level5_Latch+AnyOf(all) { + virtualModifier= LevelFive; + useModMapMods=level1; + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); + }; + interpret ISO_Level5_Lock+AnyOf(all) { + virtualModifier= LevelFive; + useModMapMods=level1; + action= LockMods(modifiers=LevelFive); + }; + interpret Mode_switch+AnyOfOrNone(all) { + action= SetGroup(group=+1); + }; + interpret ISO_Level3_Shift+AnyOfOrNone(all) { + action= SetMods(modifiers=LevelThree,clearLocks); + }; + interpret ISO_Level3_Latch+AnyOfOrNone(all) { + action= LatchMods(modifiers=LevelThree,clearLocks,latchToLock); + }; + interpret ISO_Level3_Lock+AnyOfOrNone(all) { + action= LockMods(modifiers=LevelThree); + }; + interpret ISO_Group_Latch+AnyOfOrNone(all) { + action= LatchGroup(group=2); + }; + interpret ISO_Next_Group+AnyOfOrNone(all) { + action= LockGroup(group=+1); + }; + interpret ISO_Prev_Group+AnyOfOrNone(all) { + action= LockGroup(group=-1); + }; + interpret ISO_First_Group+AnyOfOrNone(all) { + action= LockGroup(group=1); + }; + interpret ISO_Last_Group+AnyOfOrNone(all) { + action= LockGroup(group=2); + }; + interpret KP_1+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret KP_End+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret KP_2+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=+1); + }; + interpret KP_Down+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=+1); + }; + interpret KP_3+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret KP_Next+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret KP_4+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+0); + }; + interpret KP_Left+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+0); + }; + interpret KP_6+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+0); + }; + interpret KP_Right+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+0); + }; + interpret KP_7+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret KP_Home+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret KP_8+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=-1); + }; + interpret KP_Up+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+0,y=-1); + }; + interpret KP_9+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret KP_Prior+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret KP_5+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret KP_Begin+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret KP_F2+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret KP_Divide+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret KP_F3+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret KP_Multiply+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret KP_F4+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=3); + }; + interpret KP_Subtract+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=3); + }; + interpret KP_Separator+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default,count=2); + }; + interpret KP_Add+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default,count=2); + }; + interpret KP_0+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=lock); + }; + interpret KP_Insert+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=lock); + }; + interpret KP_Decimal+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=unlock); + }; + interpret KP_Delete+AnyOfOrNone(all) { + repeat= True; + action= LockPtrBtn(button=default,affect=unlock); + }; + interpret F25+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=1); + }; + interpret F26+AnyOfOrNone(all) { + repeat= True; + action= SetPtrDflt(affect=button,button=2); + }; + interpret F27+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=-1); + }; + interpret F29+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=-1); + }; + interpret F31+AnyOfOrNone(all) { + repeat= True; + action= PtrBtn(button=default); + }; + interpret F33+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=-1,y=+1); + }; + interpret F35+AnyOfOrNone(all) { + repeat= True; + action= MovePtr(x=+1,y=+1); + }; + interpret Pointer_Button_Dflt+AnyOfOrNone(all) { + action= PtrBtn(button=default); + }; + interpret Pointer_Button1+AnyOfOrNone(all) { + action= PtrBtn(button=1); + }; + interpret Pointer_Button2+AnyOfOrNone(all) { + action= PtrBtn(button=2); + }; + interpret Pointer_Button3+AnyOfOrNone(all) { + action= PtrBtn(button=3); + }; + interpret Pointer_DblClick_Dflt+AnyOfOrNone(all) { + action= PtrBtn(button=default,count=2); + }; + interpret Pointer_DblClick1+AnyOfOrNone(all) { + action= PtrBtn(button=1,count=2); + }; + interpret Pointer_DblClick2+AnyOfOrNone(all) { + action= PtrBtn(button=2,count=2); + }; + interpret Pointer_DblClick3+AnyOfOrNone(all) { + action= PtrBtn(button=3,count=2); + }; + interpret Pointer_Drag_Dflt+AnyOfOrNone(all) { + action= LockPtrBtn(button=default,affect=both); + }; + interpret Pointer_Drag1+AnyOfOrNone(all) { + action= LockPtrBtn(button=1,affect=both); + }; + interpret Pointer_Drag2+AnyOfOrNone(all) { + action= LockPtrBtn(button=2,affect=both); + }; + interpret Pointer_Drag3+AnyOfOrNone(all) { + action= LockPtrBtn(button=3,affect=both); + }; + interpret Pointer_EnableKeys+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeys); + }; + interpret Pointer_Accelerate+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeysAccel); + }; + interpret Pointer_DfltBtnNext+AnyOfOrNone(all) { + action= SetPtrDflt(affect=button,button=+1); + }; + interpret Pointer_DfltBtnPrev+AnyOfOrNone(all) { + action= SetPtrDflt(affect=button,button=-1); + }; + interpret AccessX_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AccessXKeys); + }; + interpret AccessX_Feedback_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AccessXFeedback); + }; + interpret RepeatKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=RepeatKeys); + }; + interpret SlowKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=SlowKeys); + }; + interpret BounceKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=BounceKeys); + }; + interpret StickyKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=StickyKeys); + }; + interpret MouseKeys_Enable+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeys); + }; + interpret MouseKeys_Accel_Enable+AnyOfOrNone(all) { + action= LockControls(controls=MouseKeysAccel); + }; + interpret Overlay1_Enable+AnyOfOrNone(all) { + action= LockControls(controls=none); + }; + interpret Overlay2_Enable+AnyOfOrNone(all) { + action= LockControls(controls=none); + }; + interpret AudibleBell_Enable+AnyOfOrNone(all) { + action= LockControls(controls=AudibleBell); + }; + interpret Terminate_Server+AnyOfOrNone(all) { + action= Terminate(); + }; + interpret Alt_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Alt,clearLocks); + }; + interpret Alt_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Alt,clearLocks); + }; + interpret Meta_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Meta,clearLocks); + }; + interpret Meta_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Meta,clearLocks); + }; + interpret Super_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Super,clearLocks); + }; + interpret Super_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Super,clearLocks); + }; + interpret Hyper_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Hyper,clearLocks); + }; + interpret Hyper_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Hyper,clearLocks); + }; + interpret Shift_L+AnyOfOrNone(all) { + action= SetMods(modifiers=Shift,clearLocks); + }; + interpret Shift_R+AnyOfOrNone(all) { + action= SetMods(modifiers=Shift,clearLocks); + }; + interpret XF86Switch_VT_1+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=1,!same); + }; + interpret XF86Switch_VT_2+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=2,!same); + }; + interpret XF86Switch_VT_3+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=3,!same); + }; + interpret XF86Switch_VT_4+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=4,!same); + }; + interpret XF86Switch_VT_5+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=5,!same); + }; + interpret XF86Switch_VT_6+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=6,!same); + }; + interpret XF86Switch_VT_7+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=7,!same); + }; + interpret XF86Switch_VT_8+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=8,!same); + }; + interpret XF86Switch_VT_9+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=9,!same); + }; + interpret XF86Switch_VT_10+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=10,!same); + }; + interpret XF86Switch_VT_11+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=11,!same); + }; + interpret XF86Switch_VT_12+AnyOfOrNone(all) { + repeat= True; + action= SwitchScreen(screen=12,!same); + }; + interpret XF86LogGrabInfo+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x47,data[3]=0x72,data[4]=0x62,data[5]=0x73,data[6]=0x00); + }; + interpret XF86LogWindowTree+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x50,data[1]=0x72,data[2]=0x57,data[3]=0x69,data[4]=0x6e,data[5]=0x73,data[6]=0x00); + }; + interpret XF86Next_VMode+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x2b,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); + }; + interpret XF86Prev_VMode+AnyOfOrNone(all) { + repeat= True; + action= Private(type=0x86,data[0]=0x2d,data[1]=0x56,data[2]=0x4d,data[3]=0x6f,data[4]=0x64,data[5]=0x65,data[6]=0x00); + }; + interpret ISO_Level5_Shift+AnyOfOrNone(all) { + action= SetMods(modifiers=LevelFive,clearLocks); + }; + interpret ISO_Level5_Latch+AnyOfOrNone(all) { + action= LatchMods(modifiers=LevelFive,clearLocks,latchToLock); + }; + interpret ISO_Level5_Lock+AnyOfOrNone(all) { + action= LockMods(modifiers=LevelFive); + }; + interpret Caps_Lock+AnyOfOrNone(all) { + action= LockMods(modifiers=Lock); + }; + interpret Any+Exactly(Lock) { + action= LockMods(modifiers=Lock); + }; + interpret Any+AnyOf(all) { + action= SetMods(modifiers=modMapMods,clearLocks); + }; + indicator "Caps Lock" { + whichModState= locked; + modifiers= Lock; + }; + indicator "Num Lock" { + whichModState= locked; + modifiers= NumLock; + }; + indicator "Scroll Lock" { + whichModState= locked; + modifiers= ScrollLock; + }; + indicator "Shift Lock" { + whichModState= locked; + modifiers= Shift; + }; + indicator "Group 2" { + groups= 0xfe; + }; + indicator "Mouse Keys" { + controls= MouseKeys; + }; +}; + +xkb_symbols "(unnamed)" { + name[Group1]="Czech"; + + key { [ Escape ] }; + key { [ plus, 1, exclam, dead_tilde ] }; + key { [ ecaron, 2, at, dead_caron ] }; + key { [ scaron, 3, numbersign, dead_circumflex ] }; + key { [ ccaron, 4, dollar, dead_breve ] }; + key { [ rcaron, 5, percent, dead_abovering ] }; + key { [ zcaron, 6, asciicircum, dead_ogonek ] }; + key { [ yacute, 7, ampersand, dead_grave ] }; + key { [ aacute, 8, asterisk, dead_abovedot ] }; + key { [ iacute, 9, braceleft, dead_acute ] }; + key { [ eacute, 0, braceright, dead_doubleacute ] }; + key { [ equal, percent, backslash, dead_diaeresis ] }; + key { [ dead_acute, dead_caron, dead_macron, dead_cedilla ] }; + key { [ BackSpace, BackSpace ] }; + key { [ Tab, ISO_Left_Tab ] }; + key { [ q, Q, backslash, Greek_OMEGA ] }; + key { [ w, W, bar, section ] }; + key { [ e, E, EuroSign, E ] }; + key { [ r, R, paragraph, registered ] }; + key { [ t, T, tslash, Tslash ] }; + key { [ z, Z, leftarrow, yen ] }; + key { [ u, U, downarrow, uparrow ] }; + key { [ i, I, rightarrow, idotless ] }; + key { [ o, O, oslash, Oslash ] }; + key { [ p, P, thorn, THORN ] }; + key { [ uacute, slash, bracketleft, division ] }; + key { [ parenright, parenleft, bracketright, multiply ] }; + key { [ Return ] }; + key { [ Control_L ] }; + key { [ a, A, asciitilde, AE ] }; + key { [ s, S, dstroke, U1E9E ] }; + key { [ d, D, Dstroke, ETH ] }; + key { [ f, F, bracketleft, ordfeminine ] }; + key { [ g, G, bracketright, ENG ] }; + key { [ h, H, grave, Hstroke ] }; + key { [ j, J, apostrophe, dead_horn ] }; + key { [ k, K, lstroke, ampersand ] }; + key { [ l, L, Lstroke, Lstroke ] }; + key { [ uring, quotedbl, dollar, dead_doubleacute ] }; + key { [ section, exclam, apostrophe, ssharp ] }; + key { [ semicolon, dead_abovering, grave, asciitilde ] }; + key { [ Shift_L ] }; + key { [ dead_diaeresis, apostrophe, backslash, bar ] }; + key { [ y, Y, degree, less ] }; + key { [ x, X, numbersign, greater ] }; + key { [ c, C, ampersand, copyright ] }; + key { [ v, V, at, singlelowquotemark ] }; + key { [ b, B, braceleft, leftsinglequotemark ] }; + key { [ n, N, braceright, rightsinglequotemark ] }; + key { [ m, M, asciicircum, ordmasculine ] }; + key { [ comma, question, less, multiply ] }; + key { [ period, colon, greater, division ] }; + key { [ minus, underscore, asterisk, dead_abovedot ] }; + key { [ Shift_R ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Multiply, KP_Multiply, KP_Multiply, KP_Multiply, XF86ClearGrab ] + }; + key { [ Alt_L, Meta_L ] }; + key { [ space, space, space, space ] }; + key { [ Caps_Lock ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F6, F6, F6, F6, XF86Switch_VT_6 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F7, F7, F7, F7, XF86Switch_VT_7 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F8, F8, F8, F8, XF86Switch_VT_8 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F9, F9, F9, F9, XF86Switch_VT_9 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F10, F10, F10, F10, XF86Switch_VT_10 ] + }; + key { [ Num_Lock ] }; + key { [ Scroll_Lock ] }; + key { [ KP_Home, KP_7 ] }; + key { [ KP_Up, KP_8 ] }; + key { [ KP_Prior, KP_9 ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Subtract, KP_Subtract, KP_Subtract, KP_Subtract, XF86Prev_VMode ] + }; + key { [ KP_Left, KP_4 ] }; + key { [ KP_Begin, KP_5 ] }; + key { [ KP_Right, KP_6 ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Add, KP_Add, KP_Add, KP_Add, XF86Next_VMode ] + }; + key { [ KP_End, KP_1 ] }; + key { [ KP_Down, KP_2 ] }; + key { [ KP_Next, KP_3 ] }; + key { [ KP_Insert, KP_0 ] }; + key { [ KP_Delete, KP_Decimal ] }; + key { [ ISO_Level3_Shift ] }; + key { [ backslash, bar, slash, brokenbar ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ] + }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ] + }; + key { [ Katakana ] }; + key { [ Hiragana ] }; + key { [ Henkan_Mode ] }; + key { [ Hiragana_Katakana ] }; + key { [ Muhenkan ] }; + key { [ KP_Enter ] }; + key { [ Control_R ] }; + key { + type= "CTRL+ALT", + symbols[Group1]= [ KP_Divide, KP_Divide, KP_Divide, KP_Divide, XF86Ungrab ] + }; + key { + type= "PC_ALT_LEVEL2", + symbols[Group1]= [ Print, Sys_Req ] + }; + key { + type= "ONE_LEVEL", + symbols[Group1]= [ ISO_Level3_Shift ] + }; + key { [ Linefeed ] }; + key { [ Home ] }; + key { [ Up ] }; + key { [ Prior ] }; + key { [ Left ] }; + key { [ Right ] }; + key { [ End ] }; + key { [ Down ] }; + key { [ Next ] }; + key { [ Insert ] }; + key { [ Delete ] }; + key { [ XF86AudioMute ] }; + key { [ XF86AudioLowerVolume ] }; + key { [ XF86AudioRaiseVolume ] }; + key { [ XF86PowerOff ] }; + key { [ KP_Equal ] }; + key { [ plusminus ] }; + key { + type= "PC_CONTROL_LEVEL2", + symbols[Group1]= [ Pause, Break ] + }; + key { [ XF86LaunchA ] }; + key { [ KP_Decimal, KP_Decimal ] }; + key { [ Hangul ] }; + key { [ Hangul_Hanja ] }; + key { [ Super_L ] }; + key { [ Super_R ] }; + key { [ Menu ] }; + key { [ Cancel ] }; + key { [ Redo ] }; + key { [ SunProps ] }; + key { [ Undo ] }; + key { [ SunFront ] }; + key { [ XF86Copy ] }; + key { [ XF86Open ] }; + key { [ XF86Paste ] }; + key { [ Find ] }; + key { [ XF86Cut ] }; + key { [ Help ] }; + key { [ XF86MenuKB ] }; + key { [ XF86Calculator ] }; + key { [ XF86Sleep ] }; + key { [ XF86WakeUp ] }; + key { [ XF86Explorer ] }; + key { [ XF86Send ] }; + key { [ XF86Xfer ] }; + key { [ XF86Launch1 ] }; + key { [ XF86Launch2 ] }; + key { [ XF86WWW ] }; + key { [ XF86DOS ] }; + key { [ XF86ScreenSaver ] }; + key { [ XF86RotateWindows ] }; + key { [ XF86TaskPane ] }; + key { [ XF86Mail ] }; + key { [ XF86Favorites ] }; + key { [ XF86MyComputer ] }; + key { [ XF86Back ] }; + key { [ XF86Forward ] }; + key { [ XF86Eject ] }; + key { [ XF86Eject ] }; + key { [ XF86AudioNext ] }; + key { [ XF86AudioPlay, XF86AudioPause ] }; + key { [ XF86AudioPrev ] }; + key { [ XF86AudioStop, XF86Eject ] }; + key { [ XF86AudioRecord ] }; + key { [ XF86AudioRewind ] }; + key { [ XF86Phone ] }; + key { [ XF86Tools ] }; + key { [ XF86HomePage ] }; + key { [ XF86Reload ] }; + key { [ XF86Close ] }; + key { [ XF86ScrollUp ] }; + key { [ XF86ScrollDown ] }; + key { [ parenleft ] }; + key { [ parenright ] }; + key { [ XF86New ] }; + key { [ Redo ] }; + key { [ XF86Tools ] }; + key { [ XF86Launch5 ] }; + key { [ XF86Launch6 ] }; + key { [ XF86Launch7 ] }; + key { [ XF86Launch8 ] }; + key { [ XF86Launch9 ] }; + key { [ XF86AudioMicMute ] }; + key { [ XF86TouchpadToggle ] }; + key { [ XF86TouchpadOn ] }; + key { [ XF86TouchpadOff ] }; + key { [ ISO_Level5_Shift ] }; + key { [ NoSymbol, Alt_L ] }; + key { [ NoSymbol, Meta_L ] }; + key { [ NoSymbol, Super_L ] }; + key { [ NoSymbol, Hyper_L ] }; + key { [ XF86AudioPlay ] }; + key { [ XF86AudioPause ] }; + key { [ XF86Launch3 ] }; + key { [ XF86Launch4 ] }; + key { [ XF86LaunchB ] }; + key { [ XF86Suspend ] }; + key { [ XF86Close ] }; + key { [ XF86AudioPlay ] }; + key { [ XF86AudioForward ] }; + key { [ Print ] }; + key { [ XF86WebCam ] }; + key { [ XF86AudioPreset ] }; + key { [ XF86Mail ] }; + key { [ XF86Messenger ] }; + key { [ XF86Search ] }; + key { [ XF86Go ] }; + key { [ XF86Finance ] }; + key { [ XF86Game ] }; + key { [ XF86Shop ] }; + key { [ Cancel ] }; + key { [ XF86MonBrightnessDown ] }; + key { [ XF86MonBrightnessUp ] }; + key { [ XF86AudioMedia ] }; + key { [ XF86Display ] }; + key { [ XF86KbdLightOnOff ] }; + key { [ XF86KbdBrightnessDown ] }; + key { [ XF86KbdBrightnessUp ] }; + key { [ XF86Send ] }; + key { [ XF86Reply ] }; + key { [ XF86MailForward ] }; + key { [ XF86Save ] }; + key { [ XF86Documents ] }; + key { [ XF86Battery ] }; + key { [ XF86Bluetooth ] }; + key { [ XF86WLAN ] }; + key { [ XF86UWB ] }; + key { [ XF86Next_VMode ] }; + key { [ XF86Prev_VMode ] }; + key { [ XF86MonBrightnessCycle ] }; + key { [ XF86BrightnessAuto ] }; + key { [ XF86DisplayOff ] }; + key { [ XF86WWAN ] }; + key { [ XF86RFKill ] }; + key { [ XF86AudioMicMute ] }; + key { [ XF86Info ] }; + key { [ XF86Favorites ] }; + key { [ XF86CycleAngle ] }; + key { [ XF86FullScreen ] }; + key { [ XF86Keyboard ] }; + key { [ XF86AspectRatio ] }; + key { [ XF86DVD ] }; + key { [ XF86Audio ] }; + key { [ XF86Video ] }; + key { [ XF86Calendar ] }; + key { [ XF86ChannelUp ] }; + key { [ XF86ChannelDown ] }; + key { [ XF86AudioRandomPlay ] }; + key { [ XF86Break ] }; + key { [ XF86VideoPhone ] }; + key { [ XF86Game ] }; + key { [ XF86ZoomIn ] }; + key { [ XF86ZoomOut ] }; + key { [ XF86ZoomReset ] }; + key { [ XF86Word ] }; + key { [ XF86Editor ] }; + key { [ XF86Excel ] }; + key { [ XF86GraphicsEditor ] }; + key { [ XF86Presentation ] }; + key { [ XF86Database ] }; + key { [ XF86News ] }; + key { [ XF86Voicemail ] }; + key { [ XF86Addressbook ] }; + key { [ XF86Messenger ] }; + key { [ XF86DisplayToggle ] }; + key { [ XF86SpellCheck ] }; + key { [ XF86LogOff ] }; + key { [ dollar ] }; + key { [ EuroSign ] }; + key { [ XF86FrameBack ] }; + key { [ XF86FrameForward ] }; + key { [ XF86ContextMenu ] }; + key { [ XF86MediaRepeat ] }; + key { [ XF8610ChannelsUp ] }; + key { [ XF8610ChannelsDown ] }; + key { [ XF86Images ] }; + key { [ XF86NotificationCenter ] }; + key { [ XF86PickupPhone ] }; + key { [ XF86HangupPhone ] }; + key { [ XF86Fn ] }; + key { [ XF86Fn_Esc ] }; + key { [ XF86FnRightShift ] }; + key { [ braille_dot_1 ] }; + key { [ braille_dot_2 ] }; + key { [ braille_dot_3 ] }; + key { [ braille_dot_4 ] }; + key { [ braille_dot_5 ] }; + key { [ braille_dot_6 ] }; + key { [ braille_dot_7 ] }; + key { [ braille_dot_8 ] }; + key { [ braille_dot_9 ] }; + key { [ braille_dot_1 ] }; + key { [ XF86Numeric0 ] }; + key { [ XF86Numeric1 ] }; + key { [ XF86Numeric2 ] }; + key { [ XF86Numeric3 ] }; + key { [ XF86Numeric4 ] }; + key { [ XF86Numeric5 ] }; + key { [ XF86Numeric6 ] }; + key { [ XF86Numeric7 ] }; + key { [ XF86Numeric8 ] }; + key { [ XF86Numeric9 ] }; + key { [ XF86NumericStar ] }; + key { [ XF86NumericPound ] }; + key { [ XF86NumericA ] }; + key { [ XF86NumericB ] }; + key { [ XF86NumericC ] }; + key { [ XF86NumericD ] }; + key { [ XF86CameraFocus ] }; + key { [ XF86WPSButton ] }; + key { [ XF86TouchpadToggle ] }; + key { [ XF86TouchpadOn ] }; + key { [ XF86TouchpadOff ] }; + key { [ XF86CameraZoomIn ] }; + key { [ XF86CameraZoomOut ] }; + key { [ XF86CameraUp ] }; + key { [ XF86CameraDown ] }; + key { [ XF86CameraLeft ] }; + key { [ XF86CameraRight ] }; + key { [ XF86AttendantOn ] }; + key { [ XF86AttendantOff ] }; + key { [ XF86AttendantToggle ] }; + key { [ XF86LightsToggle ] }; + key { [ XF86ALSToggle ] }; + key { [ XF86RotationLockToggle ] }; + key { [ XF86Buttonconfig ] }; + key { [ XF86Taskmanager ] }; + key { [ XF86Journal ] }; + key { [ XF86ControlPanel ] }; + key { [ XF86AppSelect ] }; + key { [ XF86Screensaver ] }; + key { [ XF86VoiceCommand ] }; + key { [ XF86Assistant ] }; + key { [ ISO_Next_Group ] }; + key { [ XF86EmojiPicker ] }; + key { [ XF86Dictate ] }; + key { [ XF86CameraAccessEnable ] }; + key { [ XF86CameraAccessDisable ] }; + key { [ XF86CameraAccessToggle ] }; + key { [ XF86BrightnessMin ] }; + key { [ XF86BrightnessMax ] }; + key { [ XF86KbdInputAssistPrev ] }; + key { [ XF86KbdInputAssistNext ] }; + key { [ XF86KbdInputAssistPrevgroup ] }; + key { [ XF86KbdInputAssistNextgroup ] }; + key { [ XF86KbdInputAssistAccept ] }; + key { [ XF86KbdInputAssistCancel ] }; + key { [ XF86RightUp ] }; + key { [ XF86RightDown ] }; + key { [ XF86LeftUp ] }; + key { [ XF86LeftDown ] }; + key { [ XF86RootMenu ] }; + key { [ XF86MediaTopMenu ] }; + key { [ XF86Numeric11 ] }; + key { [ XF86Numeric12 ] }; + key { [ XF86AudioDesc ] }; + key { [ XF863DMode ] }; + key { [ XF86NextFavorite ] }; + key { [ XF86StopRecord ] }; + key { [ XF86PauseRecord ] }; + key { [ XF86VOD ] }; + key { [ XF86Unmute ] }; + key { [ XF86FastReverse ] }; + key { [ XF86SlowReverse ] }; + key { [ XF86Data ] }; + key { [ XF86OnScreenKeyboard ] }; + key { [ XF86PrivacyScreenToggle ] }; + key { [ XF86SelectiveScreenshot ] }; + key { [ XF86NextElement ] }; + key { [ XF86PreviousElement ] }; + key { [ XF86AutopilotEngageToggle ] }; + key { [ XF86MarkWaypoint ] }; + key { [ XF86Sos ] }; + key { [ XF86NavChart ] }; + key { [ XF86FishingChart ] }; + key { [ XF86SingleRangeRadar ] }; + key { [ XF86DualRangeRadar ] }; + key { [ XF86RadarOverlay ] }; + key { [ XF86TraditionalSonar ] }; + key { [ XF86ClearvuSonar ] }; + key { [ XF86SidevuSonar ] }; + key { [ XF86NavInfo ] }; + key { [ XF86BrightnessAdjust ] }; + key { [ XF86Macro1 ] }; + key { [ XF86Macro2 ] }; + key { [ XF86Macro3 ] }; + key { [ XF86Macro4 ] }; + key { [ XF86Macro5 ] }; + key { [ XF86Macro6 ] }; + key { [ XF86Macro7 ] }; + key { [ XF86Macro8 ] }; + key { [ XF86Macro9 ] }; + key { [ XF86Macro10 ] }; + key { [ XF86Macro11 ] }; + key { [ XF86Macro12 ] }; + key { [ XF86Macro13 ] }; + key { [ XF86Macro14 ] }; + key { [ XF86Macro15 ] }; + key { [ XF86Macro16 ] }; + key { [ XF86Macro17 ] }; + key { [ XF86Macro18 ] }; + key { [ XF86Macro19 ] }; + key { [ XF86Macro20 ] }; + key { [ XF86Macro21 ] }; + key { [ XF86Macro22 ] }; + key { [ XF86Macro23 ] }; + key { [ XF86Macro24 ] }; + key { [ XF86Macro25 ] }; + key { [ XF86Macro26 ] }; + key { [ XF86Macro27 ] }; + key { [ XF86Macro28 ] }; + key { [ XF86Macro29 ] }; + key { [ XF86Macro30 ] }; + key { [ XF86MacroRecordStart ] }; + key { [ XF86MacroRecordStop ] }; + key { [ XF86MacroPresetCycle ] }; + key { [ XF86MacroPreset1 ] }; + key { [ XF86MacroPreset2 ] }; + key { [ XF86MacroPreset3 ] }; + key { [ XF86KbdLcdMenu1 ] }; + key { [ XF86KbdLcdMenu2 ] }; + key { [ XF86KbdLcdMenu3 ] }; + key { [ XF86KbdLcdMenu4 ] }; + key { [ XF86KbdLcdMenu5 ] }; + modifier_map Shift { , }; + modifier_map Lock { }; + modifier_map Control { , }; + modifier_map Mod1 { , , }; + modifier_map Mod2 { }; + modifier_map Mod3 { }; + modifier_map Mod4 { , , , }; + modifier_map Mod5 { }; +}; + +}; + diff --git a/firmware2/src/ffi.rs b/firmware2/src/ffi.rs new file mode 100644 index 0000000..ec7bfd2 --- /dev/null +++ b/firmware2/src/ffi.rs @@ -0,0 +1,241 @@ +#![allow(unused)] + +use core::{ffi::{CStr, VaList, c_char, c_int, c_long, c_longlong, c_size_t, c_uchar, c_void}, ptr::{null, null_mut}}; + +unsafe extern "C" { + fn malloc(size: c_size_t) -> *mut c_void; +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn strpbrk(s: *const c_char, accept: *const c_char) -> *mut c_char { + todo!() +} + +#[allow(non_camel_case_types)] +type c_intmax_t = c_longlong; + +#[unsafe(no_mangle)] +unsafe extern "C" fn imaxabs(j: c_intmax_t) -> c_intmax_t { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn eaccess(pathname: *const c_char, mode: c_int ) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn vasprintf(strp: *mut *mut c_char, fmt: *const c_char, ap: VaList) -> c_int { + todo!() +} + +#[allow(non_camel_case_types)] +type stat = c_void; // Not implemented + +#[unsafe(no_mangle)] +unsafe extern "C" fn stat(path: *const c_char, buf: *mut stat) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn __errno() -> *mut c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn strerror(errnum: c_int) -> *mut c_char { + todo!() +} + +#[allow(non_camel_case_types)] +type DIR = c_void; // Not implemented + +#[allow(non_camel_case_types)] +type dirent = c_void; // Not implemented + +#[unsafe(no_mangle)] +unsafe extern "C" fn opendir(name: *const c_char) -> *mut DIR { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn readdir(dirp: *mut DIR) -> *mut dirent { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn closedir(dirp: *mut DIR) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn qsort( + base: *mut c_void, + num: c_size_t, + size: c_size_t, + compar: Option c_int>, +) { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn __getreent() -> *mut c_void /*struct _reent*/ { + todo!() +} + +#[allow(non_camel_case_types)] +#[allow(clippy::upper_case_acronyms)] +enum FILE {} + +#[unsafe(no_mangle)] +unsafe extern "C" fn fprintf( + stream: *mut FILE, + format: *const c_char, + ... +) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn vfprintf(stream: *mut FILE, format: *const c_char, ap: VaList) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn strtol(nptr: *const c_char, endptr: *mut *mut c_char, base: c_int) -> c_long { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn secure_getenv(name: *const c_char) -> *mut c_char { + unsafe { getenv(name) } +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn getenv(name: *const c_char) -> *mut c_char { + null_mut() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn fseek( + stream: *mut FILE, + offset: c_long, + whence: c_int, +) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn ftell(stream: *mut FILE) -> c_long { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn fread( + ptr: *mut c_void, + size: c_size_t, + nobj: c_size_t, + stream: *mut FILE, +) -> c_size_t { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn open( + path: *const c_char, + oflag: c_int, + ... +) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn fstat(fildes: c_int, buf: *mut stat) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn close(fd: c_int) -> c_int { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn fdopen( + fd: c_int, + mode: *const c_char, +) -> *mut FILE { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn strndup( + s: *const c_char, + n: c_size_t, +) -> *mut c_char { + let len = unsafe { strnlen(s, n) }; + let new = unsafe { malloc(len + 1) } as *mut c_char; + + if new.is_null() { + return null_mut(); + } + + unsafe { + *new.add(len) = b'\0'; + + memcpy(new as *mut c_void, s as *const c_void, len) as *mut c_char + } +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn labs(i: c_long) -> c_long { + i.abs() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn memcpy(dest: *mut c_void, src: *const c_void, n: c_size_t) -> *mut c_void { + todo!() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn strnlen(s: *const c_char, maxlen: c_size_t) -> c_size_t { + let found: *const c_char = unsafe { memchr(s as *const c_void, b'\0' as c_int, maxlen) } as *const c_char; + if !found.is_null() { unsafe { found.offset_from(s) as c_size_t } } else { maxlen } +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn memchr(s: *const c_void, c: c_int, n: c_size_t) -> *mut c_void { + let mut s = s as *const c_uchar; + let c = c as c_uchar; + + for _ in 0..n { + unsafe { + if *s == c { + return s as *mut c_void; + } + + s = s.add(1); + } + } + + null_mut() +} + +#[unsafe(no_mangle)] +unsafe extern "C" fn __wrap_strncmp( + s1: *const c_char, + s2: *const c_char, + n: c_size_t, +) -> c_int { + unsafe { + for i in 0..n as isize { + let s1_i = s1.offset(i); + let s2_i = s2.offset(i); + + let val = *s1_i as c_int - *s2_i as c_int; + if val != 0 || *s1_i == 0 { + return val; + } + } + 0 + } +} diff --git a/firmware2/src/logging.rs b/firmware2/src/logging.rs index 974f4c8..0ef2a2d 100644 --- a/firmware2/src/logging.rs +++ b/firmware2/src/logging.rs @@ -43,6 +43,10 @@ const YELLOW: &str = "\u{001B}[33m"; const BLUE: &str = "\u{001B}[34m"; const CYAN: &str = "\u{001B}[35m"; +#[cfg(feature = "rtt-log")] +#[allow(unused)] +use ::rtt_target::{rprint as print, rprintln as println}; + #[cfg(feature = "alt-log")] #[allow(unused)] macro_rules! println { @@ -78,7 +82,10 @@ fn print_log_record(uart: &mut UartTx<'_, Blocking>, record: &log::Record) { uart.flush().unwrap(); } -#[cfg(not(feature = "usb-log"))] +#[cfg(feature = "rtt-log")] +use panic_rtt_target as _; + +#[cfg(feature = "alt-log")] #[panic_handler] fn panic_handler(info: &core::panic::PanicInfo) -> ! { use esp_backtrace::Backtrace; diff --git a/firmware2/src/main.rs b/firmware2/src/main.rs index a54c522..41f4908 100644 --- a/firmware2/src/main.rs +++ b/firmware2/src/main.rs @@ -9,12 +9,16 @@ #![no_std] #![no_main] #![feature(macro_metavar_expr)] +#![feature(c_variadic)] +#![feature(c_size_t)] extern crate alloc; use core::alloc::Layout; use core::cell::RefCell; +use core::ffi::CStr; +use alloc::string::ToString; use alloc::boxed::Box; use alloc::vec; use bt_hci::controller::ExternalController; @@ -23,7 +27,7 @@ use embassy_executor::Spawner; use embassy_sync::blocking_mutex::raw::{CriticalSectionRawMutex}; use embassy_sync::channel::Channel; use embassy_sync::signal::Signal; -use embassy_time::Duration; +use embassy_time::{Duration, Timer}; use esp_alloc::{HeapRegion, MemoryCapability}; use esp_hal::clock::CpuClock; use esp_hal::dma::{BurstConfig, DmaDescriptor, DmaTxBuf, ExternalBurstConfig}; @@ -62,6 +66,7 @@ use slint::platform::software_renderer::Rgb565Pixel; use slint::ComponentHandle; use static_cell::StaticCell; use ui::AppWindow; +use xkbcommon::xkb::{self, Keymap}; use {esp_alloc as _, esp_backtrace as _}; use crate::matrix::IoeMatrix; @@ -69,12 +74,15 @@ use crate::peripherals::st7701s::St7701s; use crate::ui::backend::{FramebufferPtr, SlintBackend}; use crate::vial::{VIAL_KEYBOARD_DEF, VIAL_KEYBOARD_ID, CustomKeycodes}; +mutually_exclusive_features::none_or_one_of!["usb-log", "alt-log", "rtt-log"]; + mod keymap; mod matrix; mod peripherals; mod vial; mod ui; mod logging; +mod ffi; #[cfg(feature = "alt-log")] mod console; @@ -111,12 +119,14 @@ static SIGNAL_UI_RENDER: Signal = Signal::new(); #[esp_rtos::main] async fn main(_spawner: Spawner) { - #[cfg(not(feature = "alt-log"))] - let alt_uart_rx_task = { + #[cfg(feature = "usb-log")] + { esp_println::logger::init_logger(LOG_LEVEL_FILTER); info!("Logger initialized!"); - async {} - }; + } + + #[cfg(feature = "rtt-log")] + rtt_target::rtt_init_log!(LOG_LEVEL_FILTER); let config = esp_hal::Config::default() .with_cpu_clock(CpuClock::max()) @@ -139,6 +149,9 @@ async fn main(_spawner: Spawner) { console::run_console(uart_rx.into_async()) }; + #[cfg(not(feature = "alt-log"))] + let alt_uart_rx_task = async {}; + // Use the internal DRAM as the heap. esp_alloc::heap_allocator!(#[unsafe(link_section = ".dram2_uninit")] size: 64 * 1024); info!("Heap initialized! {:#?}", esp_alloc::HEAP.stats()); @@ -155,8 +168,12 @@ async fn main(_spawner: Spawner) { } } - let mut io = Io::new(peripherals.IO_MUX); - io.set_interrupt_handler(interrupt_handler); + info!("PSRAM allocator initialized!"); + + // let mut io = Io::new(peripherals.IO_MUX); + // io.set_interrupt_handler(interrupt_handler); + + // info!("IO Mux initialized!"); // Enable pull-up on GPIO0 to prevent booting into download mode. let gpio0 = Output::new( @@ -181,6 +198,8 @@ async fn main(_spawner: Spawner) { timg0.timer0, /*, software_interrupt.software_interrupt0 */ ); + info!("ESP-RTOS started!"); + #[cfg(feature = "ble")] let mut host_resources = rmk::HostResources::new(); #[cfg(feature = "ble")] @@ -194,8 +213,11 @@ async fn main(_spawner: Spawner) { let connector = BleConnector::new(radio, bluetooth, Default::default()).unwrap(); let controller: ExternalController<_, 20> = ExternalController::new(connector); let central_addr = [0x18, 0xe2, 0x21, 0x80, 0xc0, 0xc7]; + let ble_stack = rmk::ble::build_ble_stack(controller, central_addr, &mut rng, &mut host_resources).await; - rmk::ble::build_ble_stack(controller, central_addr, &mut rng, &mut host_resources).await + info!("BLE stack for RMK built!"); + + ble_stack }; // Initialize USB @@ -209,7 +231,11 @@ async fn main(_spawner: Spawner) { let usb = Usb::new(peripherals.USB0, peripherals.GPIO20, peripherals.GPIO19); // Create the driver, from the HAL. let config = Config::default(); - Driver::new(usb, unsafe { &mut *addr_of_mut!(EP_MEMORY) }, config) + let driver = Driver::new(usb, unsafe { &mut *addr_of_mut!(EP_MEMORY) }, config); + + info!("USB driver for RMK built!"); + + driver }; // Initialize the flash @@ -224,6 +250,8 @@ async fn main(_spawner: Spawner) { .multicore_auto_park(); let flash = async_flash_wrapper(flash); + info!("Flash memory configured!"); + let sck = Output::new(peripherals.GPIO36, Level::High, OutputConfig::default()); let mosi = Flex::new(peripherals.GPIO35); let cs = Output::new(peripherals.GPIO6, Level::High, OutputConfig::default()); @@ -261,6 +289,8 @@ async fn main(_spawner: Spawner) { let st7701s = St7701s::new(sck, mosi, cs, unconfigured_dpi).await; + info!("ST7701S-based LCD display initialized!"); + // RMK config let vial_config = VialConfig::new(VIAL_KEYBOARD_ID, VIAL_KEYBOARD_DEF, &[(0, 0), (1, 1)]); let storage_config = StorageConfig { @@ -288,6 +318,8 @@ async fn main(_spawner: Spawner) { ) .await; + info!("Initialized keymap and storage for RMK!"); + // Initialize the matrix and keyboard const I2C_ADDR_MATRIX_LEFT: I2cAddress = I2cAddress::SevenBit(0b0100000); const I2C_ADDR_MATRIX_RIGHT: I2cAddress = I2cAddress::SevenBit(0b0100001); @@ -308,12 +340,16 @@ async fn main(_spawner: Spawner) { .await; let mut keyboard = Keyboard::new(&keymap); // Initialize the light controller + info!("Keyboard initialized!"); + static FRAMEBUFFER: StaticCell = StaticCell::new(); let framebuffer = FRAMEBUFFER.init(Framebuffer::new( 360 + /* TODO: Figure out why more bytes are needed: */ 8, 960, )); + info!("Framebuffer created!"); + // let window_size = [framebuffer.width, framebuffer.height]; let window_size = [framebuffer.height, framebuffer.width]; let framebuffer_ptr = FramebufferPtr(framebuffer.as_target_pixels() as _); @@ -346,6 +382,8 @@ async fn main(_spawner: Spawner) { }, ); + info!("Second core started!"); + let hid_report_proxy_task = { static KEYBOARD_REPORT_PROXY: Channel = Channel::new(); @@ -353,6 +391,16 @@ async fn main(_spawner: Spawner) { *rmk::channel::KEYBOARD_REPORT_SENDER.write().await = &KEYBOARD_REPORT_PROXY; } + info!("HID Report Proxy Task: Waiting 1 sec..."); + Timer::after_secs(1).await; + info!("HID Report Proxy Task: Done waiting."); + const KEYMAP_STRING: &str = include_str!("../keymaps/cz.xkb"); + info!("HID Report Proxy Task: test"); + let context = xkb::Context::new(xkb::CONTEXT_NO_FLAGS); + info!("HID Report Proxy Task: foo"); + let keymap = Keymap::new_from_string(&context, KEYMAP_STRING, xkb::KEYMAP_FORMAT_TEXT_V1, xkb::KEYMAP_COMPILE_NO_FLAGS).unwrap(); + info!("HID Report Proxy Task: bar"); + async { loop { let report = KEYBOARD_REPORT_PROXY.receive().await; @@ -365,6 +413,8 @@ async fn main(_spawner: Spawner) { let mut user_controller = UserController::new(); + info!("Awaiting on all tasks..."); + // TODO: Probably want to select! instead and re-try. join_all![ // We currently send the framebuffer data using the main core, which does not seem to slow @@ -546,11 +596,12 @@ async fn run_lcd(mut st7701s: St7701s<'static, Blocking>, framebuffer: &'static } } -#[handler] -#[ram] // TODO: Is this necessary? -fn interrupt_handler() { - esp_println::println!( - "GPIO Interrupt with priority {}", - esp_hal::xtensa_lx::interrupt::get_level() - ); -} +// // TODO: Not needed currently. If it is ever enabled, don't forget to register it in Io. +// #[handler] +// #[ram] // TODO: Is this necessary? +// fn interrupt_handler() { +// // esp_println::println!( +// // "GPIO Interrupt with priority {}", +// // esp_hal::xtensa_lx::interrupt::get_level() +// // ); +// } diff --git a/firmware2/src/ui/backend.rs b/firmware2/src/ui/backend.rs index 0216dde..b111260 100644 --- a/firmware2/src/ui/backend.rs +++ b/firmware2/src/ui/backend.rs @@ -3,7 +3,7 @@ use core::{cell::RefCell, time::Duration}; use alloc::rc::Rc; use esp_hal::{time::Instant}; use log::info; -use slint::{PhysicalSize, WindowSize, platform::software_renderer::{RenderingRotation, RepaintBufferType, Rgb565Pixel, SoftwareRenderer}}; +use slint::{PhysicalSize, WindowSize, platform::{Key, software_renderer::{RenderingRotation, RepaintBufferType, Rgb565Pixel, SoftwareRenderer}}}; use super::window_adapter::SoftwareWindowAdapter;