aboutsummaryrefslogtreecommitdiffstats
path: root/docs/README.md
blob: 22ab243cd2572268116d866ce30fa2e3f159bfc2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# Quantum Mechanical Keyboard Firmware

[![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
[![Build Status](https://travis-ci.org/qmk/qmk_firmware.svg?branch=master)](https://travis-ci.org/qmk/qmk_firmware)
[![Discord](https://img.shields.io/discord/440868230475677696.svg)](https://discord.gg/Uq7gcHh)
[![Docs Status](https://img.shields.io/badge/docs-ready-orange.svg)](https://docs.qmk.fm)
[![GitHub contributors](https://img.shields.io/github/contributors/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/pulse/monthly)
[![GitHub forks](https://img.shields.io/github/forks/qmk/qmk_firmware.svg?style=social&label=Fork)](https://github.com/qmk/qmk_firmware/)

## What is QMK Firmware?

QMK (*Quantum Mechanical Keyboard*) is an open source community that maintains QMK Firmware, QMK Toolbox, qmk.fm, and these docs. QMK Firmware is a keyboard firmware based on the [tmk\_keyboard](http://github.com/tmk/tmk_keyboard) with some useful features for Atmel AVR controllers, and more specifically, the [OLKB product line](http://olkb.com), the [ErgoDox EZ](http://www.ergodox-ez.com) keyboard, and the [Clueboard product line](http://clueboard.co/). It has also been ported to ARM chips using ChibiOS. You can use it to power your own hand-wired or custom keyboard PCB.

## How to Get It

If you plan on contributing a keymap, keyboard, or features to QMK, the easiest thing to do is [fork the repo through Github](https://github.com/qmk/qmk_firmware#fork-destination-box), and clone your repo locally to make your changes, push them, then open a [Pull Request](https://github.com/qmk/qmk_firmware/pulls) from your fork.

Otherwise, you can either download it directly ([zip](https://github.com/qmk/qmk_firmware/zipball/master), [tar](https://github.com/qmk/qmk_firmware/tarball/master)), or clone it via git (`git@github.com:qmk/qmk_firmware.git`), or https (`https://github.com/qmk/qmk_firmware.git`).

## How to Compile

Before you are able to compile, you'll need to [install an environment](getting_started_build_tools.md) for AVR or/and ARM development. Once that is complete, you'll use the `make` command to build a keyboard and keymap with the following notation:

    make planck/rev4:default

This would build the `rev4` revision of the `planck` with the `default` keymap. Not all keyboards have revisions (also called subprojects or folders), in which case, it can be omitted:

    make preonic:default

## How to Customize

QMK has lots of [features](features.md) to explore, and a good deal of [reference documentation](http://docs.qmk.fm) to dig through. Most features are taken advantage of by modifying your [keymap](keymap.md), and changing the [keycodes](keycodes.md).
emple Place - Suite 330, Boston, MA -- 02111-1307, USA. with Iirs; use Iirs; with Ortho_Nodes; package Translation is -- Initialize the package: create internal nodes. procedure Initialize; -- Translate (generate code) for design unit UNIT. -- If MAIN is true, the unit is really the unit being compiled (not an -- external unit). Code shouldn't be generated for external units. procedure Translate (Unit : Iir_Design_Unit; Main : Boolean); -- Translate std.standard. procedure Translate_Standard (Main : Boolean); -- Get the ortho node for subprogram declaration DECL. function Get_Ortho_Decl (Subprg : Iir) return Ortho_Nodes.O_Dnode; -- Get the internal _RESOLV function for FUNC. function Get_Resolv_Ortho_Decl (Func : Iir) return Ortho_Nodes.O_Dnode; procedure Finalize; procedure Gen_Filename (Design_File : Iir); -- Primary unit + secondary unit (architecture name which may be null) -- to elaborate. procedure Elaborate (Primary : String; Secondary : String; Filelist : String; Whole : Boolean); -- If set, generate Run-Time Information nodes. Flag_Rti : Boolean := True; -- If set, do not generate 64 bits integer types and operations. Flag_Only_32b : Boolean := False; -- If set, do not generate code for unused subprograms. -- Be careful: unless you are in whole compilation mode, this -- flag shouldn't be set for packages and entities. Flag_Discard_Unused : Boolean := False; -- If set, do not generate code for unused implicit subprograms. Flag_Discard_Unused_Implicit : Boolean := False; -- If set, dump drivers per process during compilation. Flag_Dump_Drivers : Boolean := False; -- If set, try to create direct drivers. Flag_Direct_Drivers : Boolean := True; -- If set, checks ranges (subtype ranges). Flag_Range_Checks : Boolean := True; -- If set, checks indexes (arrays index and slice). Flag_Index_Checks : Boolean := True; -- If set, do not create identifiers (for in memory compilation). Flag_Discard_Identifiers : Boolean := False; -- If true, do not create nested subprograms. -- This flag is forced during initialization if the code generated doesn't -- support nested subprograms. Flag_Unnest_Subprograms : Boolean := False; type Foreign_Kind_Type is (Foreign_Unknown, Foreign_Vhpidirect, Foreign_Intrinsic); type Foreign_Info_Type (Kind : Foreign_Kind_Type := Foreign_Unknown) is record case Kind is when Foreign_Unknown => null; when Foreign_Vhpidirect => -- Positions in name_table.name_buffer. Lib_First : Natural; Lib_Last : Natural; Subprg_First : Natural; Subprg_Last : Natural; when Foreign_Intrinsic => null; end case; end record; Foreign_Bad : constant Foreign_Info_Type := (Kind => Foreign_Unknown); -- Return a foreign_info for DECL. -- Can generate error messages, if the attribute expression is ill-formed. -- If EXTRACT_NAME is set, internal fields of foreign_info are set. -- Otherwise, only KIND discriminent is set. -- EXTRACT_NAME should be set only inside translation itself, since the -- name can be based on the prefix. function Translate_Foreign_Id (Decl : Iir) return Foreign_Info_Type; -- If not null, this procedure is called when a foreign subprogram is -- created. type Foreign_Hook_Access is access procedure (Decl : Iir; Info : Foreign_Info_Type; Ortho : Ortho_Nodes.O_Dnode); Foreign_Hook : Foreign_Hook_Access := null; end Translation;