keyboard.jsonschema 39 KB

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