keyboard.jsonschema 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993
  1. {
  2. "$schema": "https://json-schema.org/draft/2020-12/schema#",
  3. "$id": "qmk.keyboard.v1",
  4. "title": "Keyboard Information",
  5. "definitions": {
  6. "encoder_config": {
  7. "type": "object",
  8. "properties": {
  9. "driver": {
  10. "type": "string",
  11. "enum": ["custom", "quadrature"]
  12. },
  13. "rotary": {
  14. "type": "array",
  15. "items": {
  16. "type": "object",
  17. "additionalProperties": false,
  18. "required": ["pin_a", "pin_b"],
  19. "properties": {
  20. "pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  21. "pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  22. "resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  23. }
  24. }
  25. }
  26. }
  27. },
  28. "dip_switch_config": {
  29. "type": "object",
  30. "properties": {
  31. "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
  32. }
  33. }
  34. },
  35. "type": "object",
  36. "not": {"required": ["vendorId", "productId"]}, // reject via keys...
  37. "properties": {
  38. "keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
  39. "keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"},
  40. "maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"},
  41. "manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"},
  42. "url": {
  43. "type": "string",
  44. "format": "uri"
  45. },
  46. "development_board": {
  47. "type": "string",
  48. "enum": ["promicro", "elite_c", "elite_pi", "proton_c", "kb2040", "promicro_rp2040", "blok", "michi", "bit_c_pro", "stemcell", "bluepill", "blackpill_f401", "blackpill_f411", "bonsai_c4", "helios", "liatris", "imera"]
  49. },
  50. "pin_compatible": {
  51. "type": "string",
  52. "enum": ["promicro", "elite_c"]
  53. },
  54. "processor": {
  55. "type": "string",
  56. "enum": [
  57. "cortex-m0",
  58. "cortex-m0plus",
  59. "cortex-m3",
  60. "cortex-m4",
  61. "cortex-m7",
  62. "cortex-m23",
  63. "cortex-m33",
  64. "cortex-m35p",
  65. "cortex-m55",
  66. "cortex-m85",
  67. "MKL26Z64",
  68. "MK20DX128",
  69. "MK20DX256",
  70. "MK64FX512",
  71. "MK66FX1M0",
  72. "RP2040",
  73. "STM32F042",
  74. "STM32F072",
  75. "STM32F103",
  76. "STM32F303",
  77. "STM32F401",
  78. "STM32F405",
  79. "STM32F407",
  80. "STM32F411",
  81. "STM32F446",
  82. "STM32G431",
  83. "STM32G474",
  84. "STM32H723",
  85. "STM32H733",
  86. "STM32L412",
  87. "STM32L422",
  88. "STM32L432",
  89. "STM32L433",
  90. "STM32L442",
  91. "STM32L443",
  92. "GD32VF103",
  93. "WB32F3G71",
  94. "WB32FQ95",
  95. "atmega16u2",
  96. "atmega32u2",
  97. "atmega16u4",
  98. "atmega32u4",
  99. "at90usb162",
  100. "at90usb646",
  101. "at90usb647",
  102. "at90usb1286",
  103. "at90usb1287",
  104. "atmega32a",
  105. "atmega328p",
  106. "atmega328",
  107. "attiny85",
  108. "unknown"
  109. ]
  110. },
  111. "apa102": {
  112. "type": "object",
  113. "additionalProperties": false,
  114. "properties": {
  115. "data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  116. "clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  117. "default_brightness": {
  118. "type": "integer",
  119. "minimum": 0,
  120. "maximum": 31
  121. }
  122. }
  123. },
  124. "audio": {
  125. "type": "object",
  126. "additionalProperties": false,
  127. "properties": {
  128. "default": {
  129. "type": "object",
  130. "additionalProperties": false,
  131. "properties": {
  132. "on": {"type": "boolean"},
  133. "clicky": {"type": "boolean"}
  134. }
  135. },
  136. "driver": {
  137. "type": "string",
  138. "enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
  139. },
  140. "macro_beep": {"type": "boolean"},
  141. "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
  142. "power_control": {
  143. "type": "object",
  144. "additionalProperties": false,
  145. "properties": {
  146. "on_state": {"$ref": "qmk.definitions.v1#/bit"},
  147. "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
  148. }
  149. },
  150. "voices": {"type": "boolean"}
  151. }
  152. },
  153. "backlight": {
  154. "type": "object",
  155. "additionalProperties": false,
  156. "properties": {
  157. "driver": {
  158. "type": "string",
  159. "enum": ["custom", "pwm", "software", "timer"]
  160. },
  161. "default": {
  162. "type": "object",
  163. "additionalProperties": false,
  164. "properties": {
  165. "on": {"type": "boolean"},
  166. "breathing": {"type": "boolean"},
  167. "brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  168. }
  169. },
  170. "breathing": {"type": "boolean"},
  171. "breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  172. "levels": {
  173. "type": "integer",
  174. "minimum": 1,
  175. "maximum": 31
  176. },
  177. "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  178. "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  179. "pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
  180. "on_state": {"$ref": "qmk.definitions.v1#/bit"},
  181. "as_caps_lock": {"type": "boolean"}
  182. }
  183. },
  184. "bluetooth": {
  185. "type": "object",
  186. "additionalProperties": false,
  187. "properties": {
  188. "driver": {
  189. "type": "string",
  190. "enum": ["bluefruit_le", "custom", "rn42"]
  191. }
  192. }
  193. },
  194. "bootmagic":{
  195. "type": "object",
  196. "additionalProperties": false,
  197. "properties": {
  198. "enabled": {"type": "boolean"},
  199. "matrix": {
  200. "type": "array",
  201. "minItems": 2,
  202. "maxItems": 2,
  203. "items": {
  204. "type": "integer",
  205. "minimum": 0
  206. }
  207. }
  208. }
  209. },
  210. "board": {
  211. "type": "string",
  212. "minLength": 2,
  213. "pattern": "^[a-zA-Z_][0-9a-zA-Z_]*$"
  214. },
  215. "bootloader": {
  216. "type": "string",
  217. "enum": [
  218. "apm32-dfu",
  219. "atmel-dfu",
  220. "bootloadhid",
  221. "caterina",
  222. "custom",
  223. "gd32v-dfu",
  224. "halfkay",
  225. "kiibohd",
  226. "lufa-dfu",
  227. "lufa-ms",
  228. "md-boot",
  229. "qmk-dfu",
  230. "qmk-hid",
  231. "rp2040",
  232. "stm32-dfu",
  233. "stm32duino",
  234. "tinyuf2",
  235. "uf2boot",
  236. "unknown",
  237. "usbasploader",
  238. "wb32-dfu"
  239. ]
  240. },
  241. "bootloader_instructions": {
  242. "type": "string",
  243. "description": "Instructions for putting the keyboard into a mode that allows for firmware flashing."
  244. },
  245. "build": {
  246. "type": "object",
  247. "additionalProperties": false,
  248. "properties": {
  249. "debounce_type": {
  250. "type": "string",
  251. "enum": ["asym_eager_defer_pk", "custom", "sym_defer_g", "sym_defer_pk", "sym_defer_pr", "sym_eager_pk", "sym_eager_pr"]
  252. },
  253. "firmware_format": {
  254. "type": "string",
  255. "enum": ["bin", "hex", "uf2"]
  256. },
  257. "lto": {"type": "boolean"}
  258. }
  259. },
  260. "diode_direction": {
  261. "type": "string",
  262. "enum": ["COL2ROW", "ROW2COL"]
  263. },
  264. "debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  265. "caps_word": {
  266. "type": "object",
  267. "additionalProperties": false,
  268. "properties": {
  269. "enabled": {"type": "boolean"},
  270. "both_shifts_turns_on": {"type": "boolean"},
  271. "double_tap_shift_turns_on": {"type": "boolean"},
  272. "idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  273. "invert_on_shift": {"type": "boolean"}
  274. }
  275. },
  276. "combo": {
  277. "type": "object",
  278. "properties": {
  279. "count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  280. "term": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  281. }
  282. },
  283. "community_layouts": {
  284. "type": "array",
  285. "items": {"$ref": "qmk.definitions.v1#/filename"}
  286. },
  287. "dip_switch": {
  288. "$ref": "#/definitions/dip_switch_config",
  289. "properties": {
  290. "enabled": {"type": "boolean"},
  291. "matrix_grid": {
  292. "type": "array",
  293. "minItems": 1,
  294. "items": {
  295. "type": "array",
  296. "minItems": 2,
  297. "maxItems": 2,
  298. "items": {
  299. "type": "integer",
  300. "minimum": 0
  301. }
  302. }
  303. }
  304. }
  305. },
  306. "eeprom": {
  307. "properties": {
  308. "driver": {"type": "string"},
  309. "wear_leveling": {
  310. "type": "object",
  311. "additionalProperties": false,
  312. "properties": {
  313. "driver": {
  314. "type": "string",
  315. "enum": ["custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"]
  316. },
  317. "backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  318. "logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  319. }
  320. }
  321. }
  322. },
  323. "encoder": {
  324. "$ref": "#/definitions/encoder_config",
  325. "properties": {
  326. "enabled": {"type": "boolean"}
  327. }
  328. },
  329. "features": {
  330. "$ref": "qmk.definitions.v1#/boolean_array",
  331. "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
  332. "not": {"required": ["lto"]}
  333. },
  334. "indicators": {
  335. "type": "object",
  336. "properties": {
  337. "caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  338. "num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  339. "scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  340. "compose": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  341. "kana": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  342. "on_state": {"$ref": "qmk.definitions.v1#/bit"}
  343. }
  344. },
  345. "joystick": {
  346. "type": "object",
  347. "properties": {
  348. "enabled": {"type": "boolean"},
  349. "driver": {"type": "string"},
  350. "button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  351. "axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  352. "axes": {
  353. "type": "object",
  354. "propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]}
  355. "additionalProperties": {
  356. "oneOf": [
  357. {
  358. "type": "object",
  359. "properties": {
  360. "input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  361. "low": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  362. "rest": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  363. "high": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  364. }
  365. },
  366. {
  367. "type": "string",
  368. "enum": ["virtual"]
  369. }
  370. ]
  371. }
  372. }
  373. }
  374. },
  375. "keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"},
  376. "layout_aliases": {
  377. "type": "object",
  378. "additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"}
  379. },
  380. "layouts": {
  381. "type": "object",
  382. "propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"},
  383. "additionalProperties": {
  384. "type": "object",
  385. "additionalProperties": false,
  386. "properties": {
  387. "filename": {"type": "string"},
  388. "c_macro": {"type": "boolean"},
  389. "json_layout": {"type": "boolean"},
  390. "layout": {
  391. "type": "array",
  392. "items": {
  393. "type": "object",
  394. "additionalProperties": false,
  395. "required": ["x", "y"],
  396. "properties": {
  397. "encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  398. "label": {
  399. "type": "string",
  400. "pattern": "^[^\\n]*$"
  401. },
  402. "matrix": {
  403. "type": "array",
  404. "minItems": 2,
  405. "maxItems": 2,
  406. "items": {
  407. "type": "integer",
  408. "minimum": 0
  409. }
  410. },
  411. "r": {"$ref": "qmk.definitions.v1#/signed_decimal"},
  412. "rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
  413. "ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
  414. "h": {"$ref": "qmk.definitions.v1#/key_unit"},
  415. "w": {"$ref": "qmk.definitions.v1#/key_unit"},
  416. "x": {"$ref": "qmk.definitions.v1#/key_unit"},
  417. "y": {"$ref": "qmk.definitions.v1#/key_unit"}
  418. }
  419. }
  420. }
  421. }
  422. }
  423. },
  424. "haptic": {
  425. "type": "object",
  426. "properties": {
  427. "driver": {
  428. "type": "string",
  429. "enum": ["drv2605l", "solenoid"]
  430. }
  431. }
  432. },
  433. "leader_key": {
  434. "type": "object",
  435. "properties": {
  436. "timing": {"type": "boolean"},
  437. "strict_processing": {"type": "boolean"},
  438. "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  439. }
  440. },
  441. "matrix_pins": {
  442. "type": "object",
  443. "additionalProperties": false,
  444. "properties": {
  445. "custom": {"type": "boolean"},
  446. "custom_lite": {"type": "boolean"},
  447. "ghost": {"type": "boolean"},
  448. "input_pressed_state": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  449. "io_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  450. "direct": {
  451. "type": "array",
  452. "items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
  453. },
  454. "cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
  455. "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
  456. }
  457. },
  458. "mouse_key": {
  459. "type": "object",
  460. "properties": {
  461. "enabled": {"type": "boolean"},
  462. "delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  463. "interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  464. "max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  465. "time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  466. "wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  467. }
  468. },
  469. "oneshot": {
  470. "type": "object",
  471. "properties": {
  472. "tap_toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  473. "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  474. }
  475. },
  476. "led_matrix": {
  477. "type": "object",
  478. "properties": {
  479. "animations": {
  480. "type": "object",
  481. "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
  482. "additionalProperties": {"type": "boolean"}
  483. },
  484. "default": {
  485. "type": "object",
  486. "additionalProperties": false,
  487. "properties": {
  488. "on": {"type": "boolean"},
  489. "animation": {"type": "string"},
  490. "val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  491. "speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  492. }
  493. },
  494. "driver": {
  495. "type": "string",
  496. "enum": [
  497. "custom",
  498. "is31fl3218",
  499. "is31fl3236",
  500. "is31fl3729",
  501. "is31fl3731",
  502. "is31fl3733",
  503. "is31fl3736",
  504. "is31fl3737",
  505. "is31fl3741",
  506. "is31fl3742a",
  507. "is31fl3743a",
  508. "is31fl3745",
  509. "is31fl3746a",
  510. "snled27351"
  511. ]
  512. },
  513. "center_point": {
  514. "type": "array",
  515. "minItems": 2,
  516. "maxItems": 2,
  517. "items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  518. },
  519. "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  520. "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  521. "val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  522. "speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  523. "led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  524. "led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  525. "react_on_keyup": {"type": "boolean"},
  526. "sleep": {"type": "boolean"},
  527. "split_count": {
  528. "type": "array",
  529. "minItems": 2,
  530. "maxItems": 2,
  531. "items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  532. },
  533. "layout": {
  534. "type": "array",
  535. "items": {
  536. "type": "object",
  537. "additionalProperties": false,
  538. "properties": {
  539. "matrix": {
  540. "type": "array",
  541. "minItems": 2,
  542. "maxItems": 2,
  543. "items": {
  544. "type": "integer",
  545. "minimum": 0
  546. }
  547. },
  548. "x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  549. "y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  550. "flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  551. }
  552. }
  553. }
  554. }
  555. },
  556. "rgb_matrix": {
  557. "type": "object",
  558. "properties": {
  559. "animations": {
  560. "type": "object",
  561. "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
  562. "additionalProperties": {"type": "boolean"}
  563. },
  564. "default": {
  565. "type": "object",
  566. "additionalProperties": false,
  567. "properties": {
  568. "on": {"type": "boolean"},
  569. "animation": {"type": "string"},
  570. "hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  571. "sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  572. "val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  573. "speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  574. }
  575. },
  576. "driver": {
  577. "type": "string",
  578. "enum": [
  579. "aw20216s",
  580. "custom",
  581. "is31fl3218",
  582. "is31fl3236",
  583. "is31fl3729",
  584. "is31fl3731",
  585. "is31fl3733",
  586. "is31fl3736",
  587. "is31fl3737",
  588. "is31fl3741",
  589. "is31fl3742a",
  590. "is31fl3743a",
  591. "is31fl3745",
  592. "is31fl3746a",
  593. "snled27351",
  594. "ws2812"
  595. ]
  596. },
  597. "center_point": {
  598. "type": "array",
  599. "minItems": 2,
  600. "maxItems": 2,
  601. "items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  602. },
  603. "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  604. "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  605. "hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  606. "sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  607. "val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  608. "speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  609. "led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  610. "led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  611. "react_on_keyup": {"type": "boolean"},
  612. "sleep": {"type": "boolean"},
  613. "split_count": {
  614. "type": "array",
  615. "minItems": 2,
  616. "maxItems": 2,
  617. "items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  618. },
  619. "layout": {
  620. "type": "array",
  621. "items": {
  622. "type": "object",
  623. "additionalProperties": false,
  624. "properties": {
  625. "matrix": {
  626. "type": "array",
  627. "minItems": 2,
  628. "maxItems": 2,
  629. "items": {
  630. "type": "integer",
  631. "minimum": 0
  632. }
  633. },
  634. "x": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  635. "y": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  636. "flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  637. }
  638. }
  639. }
  640. }
  641. },
  642. "rgblight": {
  643. "type": "object",
  644. "additionalProperties": false,
  645. "properties": {
  646. "animations": {
  647. "type": "object",
  648. "propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
  649. "additionalProperties": {"type": "boolean"}
  650. },
  651. "brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  652. "default": {
  653. "type": "object",
  654. "additionalProperties": false,
  655. "properties": {
  656. "on": {"type": "boolean"},
  657. "animation": {"type": "string"},
  658. "hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  659. "sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  660. "val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  661. "speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}
  662. }
  663. },
  664. "driver": {
  665. "type": "string",
  666. "enum": ["apa102", "custom", "ws2812"]
  667. },
  668. "hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  669. "layers": {
  670. "type": "object",
  671. "additionalProperties": false,
  672. "properties": {
  673. "blink": {"type": "boolean"},
  674. "enabled": {"type": "boolean"},
  675. "max": {
  676. "type": "integer",
  677. "minimum": 1,
  678. "maximum": 32
  679. },
  680. "override_rgb": {"type": "boolean"}
  681. }
  682. },
  683. "led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  684. "led_map": {
  685. "type": "array",
  686. "minItems": 2,
  687. "items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  688. },
  689. "max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  690. "pin": {
  691. "$ref": "qmk.definitions.v1#/mcu_pin",
  692. "$comment": "Deprecated: use ws2812.pin instead"
  693. },
  694. "rgbw": {
  695. "type": "boolean",
  696. "$comment": "Deprecated: use ws2812.rgbw instead"
  697. },
  698. "saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  699. "sleep": {"type": "boolean"},
  700. "split": {"type": "boolean"},
  701. "split_count": {
  702. "type": "array",
  703. "minItems": 2,
  704. "maxItems": 2,
  705. "items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  706. }
  707. }
  708. },
  709. "secure": {
  710. "type": "object",
  711. "additionalProperties": false,
  712. "properties": {
  713. "enabled": {"type": "boolean"},
  714. "unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  715. "idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  716. "unlock_sequence": {
  717. "type": "array",
  718. "minItems": 1,
  719. "maxItems": 5,
  720. "items": {
  721. "type": "array",
  722. "minItems": 2,
  723. "maxItems": 2,
  724. "items": {
  725. "type": "integer",
  726. "minimum": 0
  727. }
  728. }
  729. }
  730. }
  731. },
  732. "stenography": {
  733. "type": "object",
  734. "additionalProperties": false,
  735. "properties": {
  736. "enabled": {"type": "boolean"},
  737. "protocol": {
  738. "type": "string",
  739. "enum": ["all", "geminipr", "txbolt"]
  740. }
  741. }
  742. },
  743. "ps2": {
  744. "type": "object",
  745. "additionalProperties": false,
  746. "properties": {
  747. "enabled": {"type": "boolean"},
  748. "mouse_enabled": {"type": "boolean"},
  749. "clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  750. "data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  751. "driver": {
  752. "type": "string",
  753. "enum": ["busywait", "interrupt", "usart", "vendor"]
  754. }
  755. }
  756. },
  757. "split": {
  758. "type": "object",
  759. "additionalProperties": false,
  760. "properties": {
  761. "enabled": {"type": "boolean"},
  762. "bootmagic":{
  763. "type": "object",
  764. "additionalProperties": false,
  765. "properties": {
  766. "matrix": {
  767. "type": "array",
  768. "minItems": 2,
  769. "maxItems": 2,
  770. "items": {
  771. "type": "integer",
  772. "minimum": 0
  773. }
  774. }
  775. }
  776. },
  777. "matrix_pins": {
  778. "type": "object",
  779. "additionalProperties": false,
  780. "properties": {
  781. "right": {
  782. "type": "object",
  783. "additionalProperties": false,
  784. "properties": {
  785. "direct": {
  786. "type": "array",
  787. "items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
  788. },
  789. "cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
  790. "rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
  791. "unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}
  792. }
  793. }
  794. }
  795. },
  796. "dip_switch": {
  797. "type": "object",
  798. "additionalProperties": false,
  799. "properties": {
  800. "right": {
  801. "$ref": "#/definitions/dip_switch_config"
  802. }
  803. }
  804. },
  805. "encoder": {
  806. "type": "object",
  807. "additionalProperties": false,
  808. "properties": {
  809. "right": {
  810. "$ref": "#/definitions/encoder_config"
  811. }
  812. }
  813. },
  814. "handedness": {
  815. "type": "object",
  816. "additionalProperties": false,
  817. "properties": {
  818. "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  819. "matrix_grid": {
  820. "$ref": "qmk.definitions.v1#/mcu_pin_array",
  821. "minItems": 2,
  822. "maxItems": 2
  823. }
  824. }
  825. },
  826. "soft_serial_pin": {
  827. "$ref": "qmk.definitions.v1#/mcu_pin",
  828. "$comment": "Deprecated: use split.serial.pin instead"
  829. },
  830. "soft_serial_speed": {
  831. "type": "integer",
  832. "minimum": 0,
  833. "maximum": 5
  834. },
  835. "serial": {
  836. "type": "object",
  837. "additionalProperties": false,
  838. "properties": {
  839. "driver": {
  840. "type": "string",
  841. "enum": ["bitbang", "usart", "vendor"]
  842. },
  843. "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
  844. }
  845. },
  846. "transport": {
  847. "type": "object",
  848. "additionalProperties": false,
  849. "properties": {
  850. "protocol": {
  851. "type": "string",
  852. "enum": ["custom", "i2c", "serial"]
  853. },
  854. "sync": {
  855. "type": "object",
  856. "additionalProperties": false,
  857. "properties": {
  858. "activity": {"type": "boolean"},
  859. "detected_os": {"type": "boolean"},
  860. "haptic": {"type": "boolean"},
  861. "layer_state": {"type": "boolean"},
  862. "indicators": {"type": "boolean"},
  863. "matrix_state": {"type": "boolean"},
  864. "modifiers": {"type": "boolean"},
  865. "oled": {"type": "boolean"},
  866. "st7565": {"type": "boolean"},
  867. "wpm": {"type": "boolean"}
  868. }
  869. },
  870. "watchdog": {"type": "boolean"},
  871. "watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  872. "sync_matrix_state": {
  873. "type": "boolean",
  874. "$comment": "Deprecated: use sync.matrix_state instead"
  875. },
  876. "sync_modifiers": {
  877. "type": "boolean",
  878. "$comment": "Deprecated: use sync.modifiers instead"
  879. }
  880. }
  881. },
  882. "usb_detect": {
  883. "type": "object",
  884. "additionalProperties": false,
  885. "properties": {
  886. "enabled": {"type": "boolean"},
  887. "polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  888. "timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  889. }
  890. },
  891. "main": {
  892. "type": "string",
  893. "enum": ["eeprom", "left", "matrix_grid", "pin", "right"],
  894. "$comment": "Deprecated: use config.h options for now"
  895. },
  896. "matrix_grid": {
  897. "type": "array",
  898. "items": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  899. "$comment": "Deprecated: use split.handedness.matrix_grid instead"
  900. }
  901. }
  902. },
  903. "tags": {
  904. "type": "array",
  905. "items": {"type": "string"}
  906. },
  907. "tapping": {
  908. "type": "object",
  909. "properties": {
  910. "force_hold": {"type": "boolean"},
  911. "force_hold_per_key": {"type": "boolean"},
  912. "ignore_mod_tap_interrupt": {"type": "boolean"},
  913. "hold_on_other_key_press": {"type": "boolean"},
  914. "hold_on_other_key_press_per_key": {"type": "boolean"},
  915. "permissive_hold": {"type": "boolean"},
  916. "permissive_hold_per_key": {"type": "boolean"},
  917. "retro": {"type": "boolean"},
  918. "retro_per_key": {"type": "boolean"},
  919. "term": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  920. "term_per_key": {"type": "boolean"},
  921. "toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  922. }
  923. },
  924. "usb": {
  925. "type": "object",
  926. "additionalProperties": false,
  927. "properties": {
  928. "device_ver": {
  929. "$ref": "qmk.definitions.v1#/hex_number_4d",
  930. "$comment": "Deprecated: use device_version instead"
  931. },
  932. "device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
  933. "force_nkro": {"type": "boolean"},
  934. "pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
  935. "vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
  936. "max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  937. "no_startup_check": {"type": "boolean"},
  938. "polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  939. "shared_endpoint": {
  940. "type": "object",
  941. "additionalProperties": false,
  942. "properties": {
  943. "keyboard": {"type": "boolean"},
  944. "mouse": {"type": "boolean"}
  945. }
  946. },
  947. "suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  948. "wait_for_enumeration": {"type": "boolean"}
  949. }
  950. },
  951. "qmk": {
  952. "type": "object",
  953. "additionalProperties": false,
  954. "properties": {
  955. "keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
  956. "tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  957. "tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"},
  958. "locking": {
  959. "type": "object",
  960. "additionalProperties": false,
  961. "properties": {
  962. "enabled": {"type": "boolean"},
  963. "resync": {"type": "boolean"}
  964. }
  965. }
  966. }
  967. },
  968. "qmk_lufa_bootloader": {
  969. "type": "object",
  970. "additionalProperties": false,
  971. "properties": {
  972. "esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  973. "esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  974. "led": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  975. "speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"}
  976. }
  977. },
  978. "ws2812": {
  979. "type": "object",
  980. "additionalProperties": false,
  981. "properties": {
  982. "driver": {
  983. "type": "string",
  984. "enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
  985. },
  986. "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
  987. "rgbw": {"type": "boolean"},
  988. "i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"},
  989. "i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}
  990. }
  991. }
  992. }
  993. }