~ruther/qmk_firmware

c72ed7c02473dec4da6cb263c1e0fb2ca4856b94 — Ryan 3 years ago 557fbbd
CLI: Parse USB device version BCD (#14580)

* CLI: Parse USB device version BCD

* Apply suggestions
42 files changed, 88 insertions(+), 52 deletions(-)

M data/mappings/info_config.json
M data/schemas/definitions.jsonschema
M data/schemas/keyboard.jsonschema
M docs/reference_info_json.md
M keyboards/40percentclub/25/config.h
M keyboards/40percentclub/5x5/config.h
M keyboards/40percentclub/6lit/config.h
M keyboards/40percentclub/foobar/config.h
M keyboards/40percentclub/half_n_half/config.h
M keyboards/boston_meetup/2019/config.h
M keyboards/capsunlocked/cu80/v2_ansi/info.json
M keyboards/capsunlocked/cu80/v2_iso/info.json
M keyboards/clueboard/17/info.json
M keyboards/clueboard/2x1800/2019/info.json
M keyboards/clueboard/60/info.json
M keyboards/clueboard/66/rev1/info.json
M keyboards/clueboard/66/rev2/info.json
M keyboards/clueboard/66/rev3/info.json
M keyboards/clueboard/66/rev4/info.json
M keyboards/clueboard/66_hotswap/gen1/info.json
M keyboards/clueboard/66_hotswap/prototype/info.json
M keyboards/clueboard/card/info.json
M keyboards/clueboard/info.json
M keyboards/coarse/ixora/config.h
M keyboards/coarse/vinta/config.h
M keyboards/cybergear/macro25/info.json
M keyboards/dyz/dyz60/info.json
M keyboards/ez_maker/directpins/promicro/info.json
M keyboards/ez_maker/directpins/proton_c/info.json
M keyboards/ez_maker/directpins/teensy_2/info.json
M keyboards/ez_maker/directpins/teensy_2pp/info.json
M keyboards/ez_maker/directpins/teensy_32/info.json
M keyboards/ez_maker/directpins/teensy_lc/info.json
M keyboards/forever65/info.json
M keyboards/frooastboard/info.json
M keyboards/handwired/qc60/config.h
M keyboards/lets_split_eh/config.h
M keyboards/ramonimbao/squishytkl/config.h
M keyboards/spacetime/config.h
M keyboards/tempo_turtle/bradpad/info.json
M lib/python/qmk/cli/generate/config_h.py
M lib/python/qmk/info.py
M data/mappings/info_config.json => data/mappings/info_config.json +2 -0
@@ 15,6 15,8 @@
    "COMBO_TERM": {"info_key": "combo.term", "value_type": "int"},
    "DEBOUNCE": {"info_key": "debounce", "value_type": "int"},
    "DEVICE_VER": {"info_key": "usb.device_ver", "value_type": "hex"},
    # TODO: Replace ^^^ with vvv
    #"DEVICE_VER": {"info_key": "usb.device_version", "value_type": "bcd_version"},
    "DESCRIPTION": {"info_key": "keyboard_folder", "to_json": false},
    "DIODE_DIRECTION": {"info_key": "diode_direction"},
    "FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "bool"},

M data/schemas/definitions.jsonschema => data/schemas/definitions.jsonschema +7 -3
@@ 20,6 20,10 @@
        "type": "string",
        "pattern": "^0x[0-9A-F]{4}$"
    },
    "bcd_version": {
        "type": "string",
        "pattern": "^[0-9]{1,2}\\.[0-9]\\.[0-9]$"
    },
    "text_identifier": {
        "type": "string",
        "minLength": 1,


@@ 70,13 74,13 @@
    "signed_int": {
        "type": "number",
        "multipleOf": 1
    }
    },
    "signed_int_8": {
        "type": "number",
        "min": -127,
        "max": 127,
        "multipleOf": 1
    }
    },
    "string_array": {
        "type": "array",
        "items": {


@@ 97,7 101,7 @@
        "type": "number",
        "min": 0,
        "multipleOf": 1
    }
    },
    "unsigned_int_8": {
        "type": "number",
        "min": 0,

M data/schemas/keyboard.jsonschema => data/schemas/keyboard.jsonschema +2 -1
@@ 320,7 320,8 @@
            "type": "object",
            "additionalProperties": false,
            "properties": {
                "device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
                "device_ver": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, # Deprecated
                "device_version": {"$ref": "qmk.definitions.v1#/bcd_version"},
                "force_nkro": {"type": "boolean"},
                "pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
                "vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},

M docs/reference_info_json.md => docs/reference_info_json.md +4 -2
@@ 172,7 172,7 @@ The following animations can be enabled:

### USB

Every USB keyboard needs to have its USB parmaters defined. At a minimum you need to set vid, pid, and device version.
Every USB keyboard needs to have its USB parameters defined. At a minimum you need to set the Vendor ID, Product ID, and device version.

Example:



@@ 181,7 181,9 @@ Example:
    "usb": {
        "vid": "0xC1ED",
        "pid": "0x23B0",
        "device_ver": "0x0001"
        "device_version": "1.0.0"
    }
}
```

The device version is a BCD (binary coded decimal) value, in the format `MMmr`, so the below value would look like `0x0100` in the generated code. This also means the maximum valid values for each part are `99.9.9`, despite it being a hexadecimal value under the hood.

M keyboards/40percentclub/25/config.h => keyboards/40percentclub/25/config.h +3 -3
@@ 19,9 19,9 @@
#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4025
#define PRODUCT_ID      0x0A0C
#define DEVICE_VER      0x0F25
#define VENDOR_ID       0x4025 // 40%
#define PRODUCT_ID      0x0F25
#define DEVICE_VER      0x0100
#define MANUFACTURER    di0ib
#define PRODUCT         The 5x5 Keyboard


M keyboards/40percentclub/5x5/config.h => keyboards/40percentclub/5x5/config.h +3 -3
@@ 5,9 5,9 @@
#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4025
#define PRODUCT_ID      0x0A0C
#define DEVICE_VER      0x05B5
#define VENDOR_ID       0x4025 // 40%
#define PRODUCT_ID      0x05B5
#define DEVICE_VER      0x0100
#define MANUFACTURER    di0ib
#define PRODUCT         The 5x5 Keyboard


M keyboards/40percentclub/6lit/config.h => keyboards/40percentclub/6lit/config.h +3 -3
@@ 19,9 19,9 @@
#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4025
#define PRODUCT_ID      0x0A0C
#define DEVICE_VER      0x0F61
#define VENDOR_ID       0x4025 // 40%
#define PRODUCT_ID      0x0F61
#define DEVICE_VER      0x0100
#define MANUFACTURER    di0ib
#define PRODUCT         The 6lit Macropad


M keyboards/40percentclub/foobar/config.h => keyboards/40percentclub/foobar/config.h +3 -3
@@ 19,9 19,9 @@
#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4025
#define PRODUCT_ID      0x0A0C
#define DEVICE_VER      0x0F00
#define VENDOR_ID       0x4025 // 40%
#define PRODUCT_ID      0x0F00
#define DEVICE_VER      0x0100
#define MANUFACTURER    di0ib
#define PRODUCT         The foobar Keyboard


M keyboards/40percentclub/half_n_half/config.h => keyboards/40percentclub/half_n_half/config.h +3 -3
@@ 20,9 20,9 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
#include "config_common.h"

/* USB Device descriptor parameter */
#define VENDOR_ID       0x4025
#define PRODUCT_ID      0x0A0C
#define DEVICE_VER      0x4A1F
#define VENDOR_ID       0x4025 // 40%
#define PRODUCT_ID      0x4A1F
#define DEVICE_VER      0x0100
#define MANUFACTURER    di0ib
#define PRODUCT         half_n_half


M keyboards/boston_meetup/2019/config.h => keyboards/boston_meetup/2019/config.h +1 -1
@@ 1,7 1,7 @@
#pragma once

/* USB Device descriptor parameter */
#define DEVICE_VER 0x07E3
#define DEVICE_VER 0x2019

#undef MATRIX_ROWS
#undef MATRIX_COLS

M keyboards/capsunlocked/cu80/v2_ansi/info.json => keyboards/capsunlocked/cu80/v2_ansi/info.json +1 -1
@@ 37,7 37,7 @@
  },
  "url": "https://caps-unlocked.com/cu80-round-2/",
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x0081",
    "vid": "0x4355"
  },

M keyboards/capsunlocked/cu80/v2_iso/info.json => keyboards/capsunlocked/cu80/v2_iso/info.json +1 -1
@@ 37,7 37,7 @@
  },
  "url": "https://caps-unlocked.com/cu80-round-2/",
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x0080",
    "vid": "0x4355"
  },

M keyboards/clueboard/17/info.json => keyboards/clueboard/17/info.json +1 -1
@@ 32,7 32,7 @@
  },
  "url": "",
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2312",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/2x1800/2019/info.json => keyboards/clueboard/2x1800/2019/info.json +1 -1
@@ 24,7 24,7 @@
    "rows": ["C0", "C1", "C2", "C3", "C7", "F7", "B1", "F2", "F3", "F4", "F5", "F6", "C6"]
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x23A0",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/60/info.json => keyboards/clueboard/60/info.json +1 -1
@@ 25,7 25,7 @@
    "rows": ["B0", "B1", "B2", "A15", "A10"]
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2350",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/66/rev1/info.json => keyboards/clueboard/66/rev1/info.json +1 -1
@@ 37,7 37,7 @@
    "saturation_steps": 17
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2301",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/66/rev2/info.json => keyboards/clueboard/66/rev2/info.json +1 -1
@@ 37,7 37,7 @@
    "saturation_steps": 17
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2320",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/66/rev3/info.json => keyboards/clueboard/66/rev3/info.json +1 -1
@@ 37,7 37,7 @@
    "saturation_steps": 17
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2370",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/66/rev4/info.json => keyboards/clueboard/66/rev4/info.json +1 -1
@@ 36,7 36,7 @@
    "saturation_steps": 17
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2390",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/66_hotswap/gen1/info.json => keyboards/clueboard/66_hotswap/gen1/info.json +1 -1
@@ 25,7 25,7 @@
    "rows": ["B11", "A6", "A3", "A2", "A1", "B5", "B6", "C15", "C14", "C13"]
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2391",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/66_hotswap/prototype/info.json => keyboards/clueboard/66_hotswap/prototype/info.json +1 -1
@@ 37,7 37,7 @@
    "saturation_steps": 17
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2390",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/card/info.json => keyboards/clueboard/card/info.json +1 -1
@@ 32,7 32,7 @@
    "saturation_steps": 17
  },
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "pid": "0x2330",
    "vid": "0xC1ED"
  },

M keyboards/clueboard/info.json => keyboards/clueboard/info.json +1 -1
@@ 2,7 2,7 @@
  "manufacturer": "Clueboard",
  "maintainer": "skullydazed",
  "usb": {
    "device_ver": "0x0001",
    "device_version": "0.0.1",
    "vid": "0xC1ED"
  }
}

M keyboards/coarse/ixora/config.h => keyboards/coarse/ixora/config.h +1 -1
@@ 5,7 5,7 @@
/* USB Device descriptor parameter */
#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x0C61
#define DEVICE_VER      0x00C6
#define DEVICE_VER      0x0100
#define MANUFACTURER    PeiorisBoards
#define PRODUCT         Ixora Rev1


M keyboards/coarse/vinta/config.h => keyboards/coarse/vinta/config.h +1 -1
@@ 5,7 5,7 @@
/* USB Device descriptor parameter */
#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x0C61
#define DEVICE_VER      0x00C6
#define DEVICE_VER      0x0100
#define MANUFACTURER    PeiorisBoards
#define PRODUCT         Vinta R1


M keyboards/cybergear/macro25/info.json => keyboards/cybergear/macro25/info.json +1 -1
@@ 5,7 5,7 @@
    "usb": {
        "vid": "0x1209",
        "pid": "0x69A1",
        "device_ver": "0x0001"
        "device_version": "0.0.1",
    },
    "diode_direction": "COL2ROW",
    "layouts": {

M keyboards/dyz/dyz60/info.json => keyboards/dyz/dyz60/info.json +1 -1
@@ 20,7 20,7 @@
    "usb": {
        "vid": "0xD772",
        "pid": "0x000A",
        "device_ver": "0x0001"
        "device_version": "0.0.1"
    },
    "layouts": {
        "LAYOUT_all": {

M keyboards/ez_maker/directpins/promicro/info.json => keyboards/ez_maker/directpins/promicro/info.json +1 -1
@@ 26,7 26,7 @@
    },
    "processor": "atmega32u4",
    "usb": {
        "device_ver": "0x0001",
        "device_version": "0.0.1",
        "pid": "0x2320",
        "vid": "0xFEED"
    },

M keyboards/ez_maker/directpins/proton_c/info.json => keyboards/ez_maker/directpins/proton_c/info.json +1 -1
@@ 32,7 32,7 @@
        ]
    },
    "usb": {
        "device_ver": "0x0001",
        "device_version": "0.0.1",
        "pid": "0x2321",
        "vid": "0xFEED"
    },

M keyboards/ez_maker/directpins/teensy_2/info.json => keyboards/ez_maker/directpins/teensy_2/info.json +1 -1
@@ 28,7 28,7 @@
        ]
    },
    "usb": {
        "device_ver": "0x0001",
        "device_version": "0.0.1",
        "pid": "0x2322",
        "vid": "0xFEED"
    },

M keyboards/ez_maker/directpins/teensy_2pp/info.json => keyboards/ez_maker/directpins/teensy_2pp/info.json +1 -1
@@ 35,7 35,7 @@
        ]
    },
    "usb": {
        "device_ver": "0x0001",
        "device_version": "0.0.1",
        "pid": "0x2323",
        "vid": "0xFEED"
    },

M keyboards/ez_maker/directpins/teensy_32/info.json => keyboards/ez_maker/directpins/teensy_32/info.json +1 -1
@@ 27,7 27,7 @@
        ]
    },
    "usb": {
        "device_ver": "0x0001",
        "device_version": "0.0.1",
        "pid": "0x2324",
        "vid": "0xFEED"
    },

M keyboards/ez_maker/directpins/teensy_lc/info.json => keyboards/ez_maker/directpins/teensy_lc/info.json +1 -1
@@ 27,7 27,7 @@
        ]
    },
    "usb": {
        "device_ver": "0x0001",
        "device_version": "0.0.1",
        "pid": "0x2325",
        "vid": "0xFEED"
    },

M keyboards/forever65/info.json => keyboards/forever65/info.json +1 -1
@@ 12,7 12,7 @@
    "usb": {
        "vid": "0x4E53",
        "pid": "0x0F65",
        "device_ver": "0x0001"
        "device_version": "0.0.1"
    },
    "features": {
        "bootmagic": true,

M keyboards/frooastboard/info.json => keyboards/frooastboard/info.json +1 -1
@@ 37,6 37,6 @@
    "usb": {
        "vid": "0x4642",
        "pid": "0x6F21",
        "device_ver": "0x0001"
        "device_version": "0.0.1"
    }
}

M keyboards/handwired/qc60/config.h => keyboards/handwired/qc60/config.h +1 -1
@@ 5,7 5,7 @@
/* USB Device descriptor parameter */
#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x0C60
#define DEVICE_VER      0x00C6
#define DEVICE_VER      0x0100
#define MANUFACTURER    PeiorisBoards
#define PRODUCT         QC60


M keyboards/lets_split_eh/config.h => keyboards/lets_split_eh/config.h +1 -1
@@ 22,7 22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
/* USB Device descriptor parameter */
#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0xE401
#define DEVICE_VER      0x0E41
#define DEVICE_VER      0x0100
#define MANUFACTURER    That-Canadian
#define PRODUCT         Lets Split Eh?


M keyboards/ramonimbao/squishytkl/config.h => keyboards/ramonimbao/squishytkl/config.h +1 -1
@@ 22,7 22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
/* USB Device descriptor parameter */
#define VENDOR_ID    0xB16B
#define PRODUCT_ID   0x00B1
#define DEVICE_VER   0xE500
#define DEVICE_VER   0x0100
#define MANUFACTURER Ramon Imbao
#define PRODUCT      SquishyTKL


M keyboards/spacetime/config.h => keyboards/spacetime/config.h +1 -1
@@ 22,7 22,7 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
/* USB Device descriptor parameter */
#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0x0A0C
#define DEVICE_VER      0x4A1F
#define DEVICE_VER      0x0100
#define MANUFACTURER    Kyle Terry
#define PRODUCT         spacetime


M keyboards/tempo_turtle/bradpad/info.json => keyboards/tempo_turtle/bradpad/info.json +1 -1
@@ 10,7 10,7 @@
    "usb":{
        "vid":"0x7474",
        "pid":"0x6270",
        "device_ver":"0x0001"
        "device_version":"0.0.1"
    },
    "layouts": {
        "LAYOUT": {

M lib/python/qmk/cli/generate/config_h.py => lib/python/qmk/cli/generate/config_h.py +6 -0
@@ 108,6 108,12 @@ def generate_config_items(kb_info_json, config_h_lines):
                config_h_lines.append(f'#ifndef {key}')
                config_h_lines.append(f'#   define {key} {value}')
                config_h_lines.append(f'#endif // {key}')
        elif key_type == 'bcd_version':
            (major, minor, revision) = config_value.split('.')
            config_h_lines.append('')
            config_h_lines.append(f'#ifndef {config_key}')
            config_h_lines.append(f'#   define {config_key} 0x{major.zfill(2)}{minor}{revision}')
            config_h_lines.append(f'#endif // {config_key}')
        else:
            config_h_lines.append('')
            config_h_lines.append(f'#ifndef {config_key}')

M lib/python/qmk/info.py => lib/python/qmk/info.py +21 -0
@@ 387,6 387,19 @@ def _extract_matrix_info(info_data, config_c):
    return info_data


# TODO: kill off usb.device_ver in favor of usb.device_version
def _extract_device_version(info_data):
    if info_data.get('usb'):
        if info_data['usb'].get('device_version') and not info_data['usb'].get('device_ver'):
            (major, minor, revision) = info_data['usb']['device_version'].split('.', 3)
            info_data['usb']['device_ver'] = f'0x{major.zfill(2)}{minor}{revision}'
        if not info_data['usb'].get('device_version') and info_data['usb'].get('device_ver'):
            major = int(info_data['usb']['device_ver'][2:4])
            minor = int(info_data['usb']['device_ver'][4])
            revision = int(info_data['usb']['device_ver'][5])
            info_data['usb']['device_version'] = f'{major}.{minor}.{revision}'


def _extract_config_h(info_data):
    """Pull some keyboard information from existing config.h files
    """


@@ 430,6 443,13 @@ def _extract_config_h(info_data):
                elif key_type == 'int':
                    dotty_info[info_key] = int(config_c[config_key])

                elif key_type == 'bcd_version':
                    major = int(config_c[config_key][2:4])
                    minor = int(config_c[config_key][4])
                    revision = int(config_c[config_key][5])

                    dotty_info[info_key] = f'{major}.{minor}.{revision}'

                else:
                    dotty_info[info_key] = config_c[config_key]



@@ 444,6 464,7 @@ def _extract_config_h(info_data):
    _extract_split_main(info_data, config_c)
    _extract_split_transport(info_data, config_c)
    _extract_split_right_pins(info_data, config_c)
    _extract_device_version(info_data)

    return info_data