diff --git a/data/xap/xap_0.1.0.hjson b/data/xap/xap_0.1.0.hjson index 6835ec05bd..7ad69aafba 100755 --- a/data/xap/xap_0.1.0.hjson +++ b/data/xap/xap_0.1.0.hjson @@ -317,6 +317,14 @@ return_type: u8 return_execute: request_bootloader_jump } + 0x08: { + type: command + name: info.json + define: HARDWARE_ID + description: Retrieves a unique identifier for the board. + return_type: u32[4] + return_execute: get_hardware_id + } } }, diff --git a/lib/python/qmk/cli/xap/xap.py b/lib/python/qmk/cli/xap/xap.py index 57f93afaf1..71ff23a9a4 100644 --- a/lib/python/qmk/cli/xap/xap.py +++ b/lib/python/qmk/cli/xap/xap.py @@ -35,6 +35,9 @@ def print_dotted_output(kb_info_json, prefix=''): continue elif key == 'layouts' and prefix == '': cli.echo(' {fg_blue}layouts{fg_reset}: %s', ', '.join(sorted(kb_info_json['layouts'].keys()))) + elif isinstance(kb_info_json[key], bytes): + conv = "".join(["{:02X}".format(b) for b in kb_info_json[key]]) + cli.echo(' {fg_blue}%s{fg_reset}: %s', new_prefix, conv) elif isinstance(kb_info_json[key], dict): print_dotted_output(kb_info_json[key], new_prefix) elif isinstance(kb_info_json[key], list): @@ -105,6 +108,10 @@ def _query_device(device): return {'xap': ver, 'secure': secure} +def _query_device_id(device): + return _xap_transaction(device, 0x01, 0x08) + + def _query_device_info_len(device): len_data = _xap_transaction(device, 0x01, 0x05) if not len_data: @@ -146,6 +153,7 @@ def _list_devices(): if cli.config.general.verbose: # TODO: better formatting like "lsusb -v"? data = _query_device_info(device) + data["_id"] = _query_device_id(device) print_dotted_output(data) diff --git a/lib/python/qmk/xap/gen_firmware/header_generator.py b/lib/python/qmk/xap/gen_firmware/header_generator.py index 0af3b6d7c4..292cd4a7b3 100755 --- a/lib/python/qmk/xap/gen_firmware/header_generator.py +++ b/lib/python/qmk/xap/gen_firmware/header_generator.py @@ -150,8 +150,10 @@ def _append_route_types(lines, container, container_id=None, route_stack=None): elif 'return_type' in container: return_type = container['return_type'] - if return_type == 'u8[32]': - lines.append(f'typedef struct {{ uint8_t x[32]; }} {route_name}_t;') + found = re.search(r'(u\d+)\[(\d+)\]', return_type) + if found: + return_type, size = found.groups() + lines.append(f'typedef struct {{ {_get_c_type(return_type)} x[{size}]; }} {route_name}_t;') else: lines.append(f'typedef {_get_c_type(return_type)} {route_name}_t;') diff --git a/quantum/xap/xap_handlers.c b/quantum/xap/xap_handlers.c index 8d0b2e4725..c6350b1038 100644 --- a/quantum/xap/xap_handlers.c +++ b/quantum/xap/xap_handlers.c @@ -17,6 +17,7 @@ #include #include +#include "hardware_id.h" #include "secure.h" #ifndef SECURE_ENABLE # define secure_get_status() SECURE_UNLOCKED @@ -98,6 +99,11 @@ bool xap_respond_request_bootloader_jump(xap_token_t token, const void *data, si } #endif +bool xap_respond_get_hardware_id(xap_token_t token, const void *data, size_t length) { + hardware_id_t ret = get_hardware_id(); + return xap_respond_data(token, &ret, sizeof(ret)); +} + #if ((defined(DYNAMIC_KEYMAP_ENABLE))) bool xap_respond_dynamic_keymap_get_keycode(xap_token_t token, const void *data, size_t length) { if (length != sizeof(xap_route_dynamic_keymap_get_keymap_keycode_arg_t)) {