@typecad/framework-zephyr 1.0.0-alpha.11 → 1.0.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/display/index.d.ts +1 -1
- package/dist/display/index.js +1 -1
- package/dist/display/profiles.d.ts +33 -0
- package/dist/display/profiles.js +36 -0
- package/dist/display/touch-adapter.d.ts +3 -4
- package/dist/display/touch-adapter.js +119 -16
- package/dist/display/ui-adapter.d.ts +4 -0
- package/dist/display/ui-adapter.js +348 -139
- package/dist/dt-config/kconfig.d.ts +5 -1
- package/dist/dt-config/kconfig.js +22 -5
- package/dist/dt-config/overlay.d.ts +26 -2
- package/dist/dt-config/overlay.js +138 -27
- package/dist/framework.manifest.d.ts +29 -28
- package/dist/framework.manifest.js +9 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.js +5 -0
- package/dist/lowering/ble.js +3 -1
- package/dist/lowering/gpio.js +7 -3
- package/dist/strategy.d.ts +24 -0
- package/dist/strategy.js +326 -134
- package/dist/toolchain/debug-config.d.ts +43 -2
- package/dist/toolchain/debug-config.js +129 -17
- package/dist/toolchain/index.d.ts +13 -0
- package/dist/toolchain/index.js +104 -23
- package/dist/toolchain/scaffold.js +40 -18
- package/dist/toolchain/west-discover.js +4 -1
- package/package.json +4 -4
- package/src/display/index.ts +1 -1
- package/src/display/profiles.ts +63 -0
- package/src/display/touch-adapter.ts +119 -15
- package/src/display/ui-adapter.ts +357 -139
- package/src/dt-config/kconfig.ts +26 -6
- package/src/dt-config/overlay.ts +450 -298
- package/src/framework.manifest.ts +9 -3
- package/src/index.ts +6 -0
- package/src/lowering/ble.ts +3 -1
- package/src/lowering/gpio.ts +7 -3
- package/src/strategy.ts +355 -136
- package/src/toolchain/debug-config.ts +137 -14
- package/src/toolchain/index.ts +107 -24
- package/src/toolchain/scaffold.ts +39 -16
- package/src/toolchain/west-discover.ts +4 -1
package/dist/display/index.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { DisplayHALOp } from '@typecad/cuttlefish/api/shared';
|
|
|
2
2
|
import { type ZephyrDisplayProfile } from './profiles.js';
|
|
3
3
|
export { zephyrUiDisplayAdapter, zephyrDisplayAdapterGenerator } from './ui-adapter.js';
|
|
4
4
|
export { zephyrTouchAdapter } from './touch-adapter.js';
|
|
5
|
-
export { ZEPHYR_DISPLAY_PROFILES, DEFAULT_ZEPHYR_DISPLAY_PROFILE } from './profiles.js';
|
|
5
|
+
export { ZEPHYR_DISPLAY_PROFILES, DEFAULT_ZEPHYR_DISPLAY_PROFILE, BUILT_IN_PROFILES } from './profiles.js';
|
|
6
6
|
export type { ZephyrDisplayProfile } from './profiles.js';
|
|
7
7
|
export interface DisplayState {
|
|
8
8
|
initialized: boolean;
|
package/dist/display/index.js
CHANGED
|
@@ -15,7 +15,7 @@ import { DEFAULT_ZEPHYR_DISPLAY_PROFILE } from './profiles.js';
|
|
|
15
15
|
// and consumers can reach them from the package barrel.
|
|
16
16
|
export { zephyrUiDisplayAdapter, zephyrDisplayAdapterGenerator } from './ui-adapter.js';
|
|
17
17
|
export { zephyrTouchAdapter } from './touch-adapter.js';
|
|
18
|
-
export { ZEPHYR_DISPLAY_PROFILES, DEFAULT_ZEPHYR_DISPLAY_PROFILE } from './profiles.js';
|
|
18
|
+
export { ZEPHYR_DISPLAY_PROFILES, DEFAULT_ZEPHYR_DISPLAY_PROFILE, BUILT_IN_PROFILES } from './profiles.js';
|
|
19
19
|
/** Fresh display state (used by the strategy per-build). */
|
|
20
20
|
export function newDisplayState() {
|
|
21
21
|
return { initialized: false, profile: DEFAULT_ZEPHYR_DISPLAY_PROFILE };
|
|
@@ -15,7 +15,32 @@ export interface ZephyrDisplayProfile {
|
|
|
15
15
|
readonly rotation?: number;
|
|
16
16
|
/** DT alias for the backlight GPIO (set high at init), if any. */
|
|
17
17
|
readonly backlight?: string;
|
|
18
|
+
/** Panel controller the direct-drive UI adapter targets. Selects the init
|
|
19
|
+
* sequence + pixel wire format (ST7796S: 18-bit; ILI9341: 16-bit RGB565).
|
|
20
|
+
* Required for rgb565 profiles; mono profiles use the direct-op GFX
|
|
21
|
+
* runtime and ignore it. */
|
|
22
|
+
readonly controller?: ZephyrPanelController;
|
|
23
|
+
/** DT compatible string for the display@0 node. Defaults per controller
|
|
24
|
+
* (see PANEL_CONTROLLER_DEFAULTS) — override only for a panel whose DT
|
|
25
|
+
* binding differs from its controller family. */
|
|
26
|
+
readonly dtCompatible?: string;
|
|
27
|
+
/** SPI controller nodelabel the panel hangs off (and SPI touch, if any).
|
|
28
|
+
* Default 'spi2' — the ESP32-S3 first general-purpose SPI controller. */
|
|
29
|
+
readonly busLabel?: string;
|
|
30
|
+
/** Nodelabel of the MIPI DBI bridge node carrying the dc/reset GPIOs.
|
|
31
|
+
* Default 'mipi_dbi' (the overlay emits the bridge under that label). */
|
|
32
|
+
readonly bridgeLabel?: string;
|
|
18
33
|
}
|
|
34
|
+
/** Panel controllers the direct-drive UI adapter knows how to init. */
|
|
35
|
+
export type ZephyrPanelController = 'st7796s' | 'ili9341';
|
|
36
|
+
/** Per-controller DT + transport defaults, shared by the overlay generator
|
|
37
|
+
* (DT node props) and the UI adapter (init sequence + wire format). */
|
|
38
|
+
export declare const PANEL_CONTROLLER_DEFAULTS: Record<ZephyrPanelController, {
|
|
39
|
+
dtCompatible: string;
|
|
40
|
+
}>;
|
|
41
|
+
/** Resolve a profile's panel controller, inferring it from the driver id when
|
|
42
|
+
* the profile doesn't declare one (the '<controller>-zephyr' naming scheme). */
|
|
43
|
+
export declare function panelControllerFor(profile: Pick<ZephyrDisplayProfile, 'driver' | 'controller'>): ZephyrPanelController;
|
|
19
44
|
/**
|
|
20
45
|
* Built-in profile registry. Looked up by driver id. Add a profile here when a
|
|
21
46
|
* new board's display node is wired into its devicetree.
|
|
@@ -23,3 +48,11 @@ export interface ZephyrDisplayProfile {
|
|
|
23
48
|
export declare const ZEPHYR_DISPLAY_PROFILES: Record<string, ZephyrDisplayProfile>;
|
|
24
49
|
/** The default profile used when resolveDisplayOp is probed without a display.init. */
|
|
25
50
|
export declare const DEFAULT_ZEPHYR_DISPLAY_PROFILE: ZephyrDisplayProfile;
|
|
51
|
+
/**
|
|
52
|
+
* The Zephyr profiles mapped to the shared DisplayProfile shape — the single
|
|
53
|
+
* mapping, so no consumer needs to know the DT-binding descriptor layout.
|
|
54
|
+
* The strategy's getProfileRegistry() and the preview's profile-registry
|
|
55
|
+
* loader both consume this (the same role `BUILT_IN_PROFILES` plays in
|
|
56
|
+
* framework-arduino's displays modules).
|
|
57
|
+
*/
|
|
58
|
+
export declare const BUILT_IN_PROFILES: Record<string, import('@typecad/cuttlefish/api/shared').DisplayProfile>;
|
package/dist/display/profiles.js
CHANGED
|
@@ -6,6 +6,21 @@
|
|
|
6
6
|
// pin wiring. The GFX runtime (gfx.ts) reads width/height/colorFormat from the
|
|
7
7
|
// active profile to size its line buffer.
|
|
8
8
|
// ---------------------------------------------------------------------------
|
|
9
|
+
/** Per-controller DT + transport defaults, shared by the overlay generator
|
|
10
|
+
* (DT node props) and the UI adapter (init sequence + wire format). */
|
|
11
|
+
export const PANEL_CONTROLLER_DEFAULTS = {
|
|
12
|
+
st7796s: { dtCompatible: 'sitronix,st7796s' },
|
|
13
|
+
ili9341: { dtCompatible: 'ilitek,ili9341' },
|
|
14
|
+
};
|
|
15
|
+
/** Resolve a profile's panel controller, inferring it from the driver id when
|
|
16
|
+
* the profile doesn't declare one (the '<controller>-zephyr' naming scheme). */
|
|
17
|
+
export function panelControllerFor(profile) {
|
|
18
|
+
if (profile.controller)
|
|
19
|
+
return profile.controller;
|
|
20
|
+
if (profile.driver.startsWith('ili9341'))
|
|
21
|
+
return 'ili9341';
|
|
22
|
+
return 'st7796s';
|
|
23
|
+
}
|
|
9
24
|
/**
|
|
10
25
|
* Built-in profile registry. Looked up by driver id. Add a profile here when a
|
|
11
26
|
* new board's display node is wired into its devicetree.
|
|
@@ -17,6 +32,7 @@ export const ZEPHYR_DISPLAY_PROFILES = {
|
|
|
17
32
|
width: 320,
|
|
18
33
|
height: 240,
|
|
19
34
|
colorFormat: 'rgb565',
|
|
35
|
+
controller: 'ili9341',
|
|
20
36
|
rotation: 90,
|
|
21
37
|
backlight: 'backlight',
|
|
22
38
|
},
|
|
@@ -33,6 +49,7 @@ export const ZEPHYR_DISPLAY_PROFILES = {
|
|
|
33
49
|
nativeWidth: 320,
|
|
34
50
|
nativeHeight: 480,
|
|
35
51
|
colorFormat: 'rgb565',
|
|
52
|
+
controller: 'st7796s',
|
|
36
53
|
rotation: 1,
|
|
37
54
|
backlight: 'backlight',
|
|
38
55
|
},
|
|
@@ -52,3 +69,22 @@ export const ZEPHYR_DISPLAY_PROFILES = {
|
|
|
52
69
|
};
|
|
53
70
|
/** The default profile used when resolveDisplayOp is probed without a display.init. */
|
|
54
71
|
export const DEFAULT_ZEPHYR_DISPLAY_PROFILE = ZEPHYR_DISPLAY_PROFILES['ili9341-zephyr'];
|
|
72
|
+
/**
|
|
73
|
+
* The Zephyr profiles mapped to the shared DisplayProfile shape — the single
|
|
74
|
+
* mapping, so no consumer needs to know the DT-binding descriptor layout.
|
|
75
|
+
* The strategy's getProfileRegistry() and the preview's profile-registry
|
|
76
|
+
* loader both consume this (the same role `BUILT_IN_PROFILES` plays in
|
|
77
|
+
* framework-arduino's displays modules).
|
|
78
|
+
*/
|
|
79
|
+
export const BUILT_IN_PROFILES = Object.fromEntries(Object.entries(ZEPHYR_DISPLAY_PROFILES).map(([name, p]) => [
|
|
80
|
+
name,
|
|
81
|
+
{
|
|
82
|
+
driver: p.driver,
|
|
83
|
+
width: p.width,
|
|
84
|
+
height: p.height,
|
|
85
|
+
nativeWidth: p.nativeWidth,
|
|
86
|
+
nativeHeight: p.nativeHeight,
|
|
87
|
+
colorFormat: p.colorFormat,
|
|
88
|
+
rotation: p.rotation ?? 1,
|
|
89
|
+
},
|
|
90
|
+
]));
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { TouchAdapterCodegen } from "@typecad/cuttlefish/api/shared";
|
|
2
2
|
import type { TouchProfile } from "@typecad/cuttlefish/api/shared";
|
|
3
3
|
/**
|
|
4
|
-
* Generate
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* strategy can decline.
|
|
4
|
+
* Generate a Zephyr touch adapter for the profile's library. Returns
|
|
5
|
+
* undefined for libraries this framework doesn't handle so the strategy can
|
|
6
|
+
* decline and cuttlefish surfaces a clear error.
|
|
8
7
|
*/
|
|
9
8
|
export declare function zephyrTouchAdapter(touch: TouchProfile): TouchAdapterCodegen | undefined;
|
|
@@ -1,29 +1,132 @@
|
|
|
1
1
|
// ---------------------------------------------------------------------------
|
|
2
|
-
// Zephyr touch
|
|
2
|
+
// Zephyr touch adapters for the Cuttlefish UI rendering pipeline.
|
|
3
3
|
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
4
|
+
// Two controllers, both driven directly (polling, no in-tree driver):
|
|
5
|
+
// - FT6336U capacitive over I2C (i2c_write_read_dt)
|
|
6
|
+
// - XPT2046 resistive over SPI (spi_transceive_dt) — the Zephyr analog of
|
|
7
|
+
// Arduino's XPT2046_Touchscreen adapter. The DT node uses the in-tree
|
|
8
|
+
// xptek,xpt2046 binding; CONFIG_INPUT stays off, so the in-tree input
|
|
9
|
+
// driver does not build and this adapter owns the chip.
|
|
8
10
|
//
|
|
9
|
-
// The
|
|
10
|
-
//
|
|
11
|
-
// the `focaltech,ft6336u` (or compatible) binding so the device is ready.
|
|
11
|
+
// The adapters emit touch_init / touch_isTouched / touch_readRaw — the three
|
|
12
|
+
// symbols the runtime's ui_poll_touch body calls.
|
|
12
13
|
//
|
|
13
14
|
// EMIT BOUNDARY: emitted bytes land in user firmware. Covered by the TypeCAD
|
|
14
15
|
// Runtime Exception (RUNTIME_EXCEPTION.md at the repo root).
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
16
17
|
/**
|
|
17
|
-
* Generate
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* strategy can decline.
|
|
18
|
+
* Generate a Zephyr touch adapter for the profile's library. Returns
|
|
19
|
+
* undefined for libraries this framework doesn't handle so the strategy can
|
|
20
|
+
* decline and cuttlefish surfaces a clear error.
|
|
21
21
|
*/
|
|
22
22
|
export function zephyrTouchAdapter(touch) {
|
|
23
|
-
if (touch.library
|
|
24
|
-
return
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
if (touch.library === "XPT2046_Touchscreen")
|
|
24
|
+
return xpt2046Adapter(touch);
|
|
25
|
+
if (touch.library === "FT6336U")
|
|
26
|
+
return ft6336uAdapter(touch);
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
/** XPT2046 control bytes (12-bit differential mode, auto power-down). */
|
|
30
|
+
const XPT2046_CMD_X = 0x90;
|
|
31
|
+
const XPT2046_CMD_Y = 0xd0;
|
|
32
|
+
const XPT2046_CMD_Z1 = 0xb0;
|
|
33
|
+
const hex = (v) => `0x${v.toString(16).toUpperCase()}`;
|
|
34
|
+
function xpt2046Adapter(touch) {
|
|
35
|
+
// Pen-detect Z1 threshold (raw 12-bit counts). Resistive panels need a few
|
|
36
|
+
// hundred counts above noise; the TouchProfile default (10) is far too low
|
|
37
|
+
// for raw Z1, so the adapter defaults to 400 (the Arduino XPT2046
|
|
38
|
+
// library's Z_THRESHOLD) unless the config sets one explicitly.
|
|
39
|
+
const zThreshold = touch.minPressure ?? 400;
|
|
40
|
+
return {
|
|
41
|
+
includes: [
|
|
42
|
+
`#include <zephyr/kernel.h>`,
|
|
43
|
+
`#include <zephyr/drivers/spi.h>`,
|
|
44
|
+
`#include <zephyr/drivers/gpio.h>`,
|
|
45
|
+
],
|
|
46
|
+
declaration: [
|
|
47
|
+
`// Zephyr XPT2046 resistive touch — SPI device resolved via devicetree.`,
|
|
48
|
+
`// The overlay defines the 'xpt2046' nodelabel on the panel's SPI bus`,
|
|
49
|
+
`// (CS index 1) with the xptek,xpt2046 binding; the bus + CS + 2.5MHz`,
|
|
50
|
+
`// ceiling come from that node. Raw X/Y/Z1 values are reported — the`,
|
|
51
|
+
`// runtime applies the profile calibration + rotation.`,
|
|
52
|
+
`static const struct spi_dt_spec __tc_touch =`,
|
|
53
|
+
` SPI_DT_SPEC_GET(DT_NODELABEL(xpt2046), SPI_OP_MODE_MASTER | SPI_WORD_SET(8), 0U);`,
|
|
54
|
+
`static int16_t __tc_touch_cached_x = 0;`,
|
|
55
|
+
`static int16_t __tc_touch_cached_y = 0;`,
|
|
56
|
+
`static int16_t __tc_touch_cached_z = 0;`,
|
|
57
|
+
`static uint8_t __tc_touch_cached_valid = 0;`,
|
|
58
|
+
`#if DT_NODE_HAS_PROP(DT_NODELABEL(xpt2046), int_gpios)`,
|
|
59
|
+
`static const struct gpio_dt_spec __tc_touch_irq = GPIO_DT_SPEC_GET(DT_NODELABEL(xpt2046), int_gpios);`,
|
|
60
|
+
`static uint8_t __tc_touch_irq_ready = 0;`,
|
|
61
|
+
`#endif`,
|
|
62
|
+
].join("\n"),
|
|
63
|
+
functions: [
|
|
64
|
+
`// One XPT2046 conversion: clock out a control byte, read the 12-bit`,
|
|
65
|
+
`// result. The rx byte during the command phase is a dummy; the value is`,
|
|
66
|
+
`// MSB-aligned across the following 16 bits ((b1<<8 | b2) >> 3). The`,
|
|
67
|
+
`// control byte's PD bits are 00 (auto power-down between transactions),`,
|
|
68
|
+
`// so the bus stays shareable with the panel. Touch is polled every frame`,
|
|
69
|
+
`// from ui_poll_touch, so a failed transfer is non-fatal — returns 0 and`,
|
|
70
|
+
`// touch_isTouched() reports false.`,
|
|
71
|
+
`static uint16_t __tc_xpt_read(uint8_t cmd) {`,
|
|
72
|
+
` if (!device_is_ready(__tc_touch.bus)) return 0U;`,
|
|
73
|
+
` uint8_t __tx[3] = { cmd, 0U, 0U };`,
|
|
74
|
+
` uint8_t __rx[3] = { 0U, 0U, 0U };`,
|
|
75
|
+
` struct spi_buf __bt = { __tx, sizeof(__tx) };`,
|
|
76
|
+
` struct spi_buf __br = { __rx, sizeof(__rx) };`,
|
|
77
|
+
` struct spi_buf_set __st = { &__bt, 1 };`,
|
|
78
|
+
` struct spi_buf_set __sr = { &__br, 1 };`,
|
|
79
|
+
` if (spi_transceive_dt(&__tc_touch, &__st, &__sr) != 0) return 0U;`,
|
|
80
|
+
` return static_cast<uint16_t>(((static_cast<uint16_t>(__rx[1]) << 8) | __rx[2]) >> 3);`,
|
|
81
|
+
`}`,
|
|
82
|
+
``,
|
|
83
|
+
`static inline void touch_init() {`,
|
|
84
|
+
` // The SPI bus + CS are configured by devicetree. Configure the pen IRQ`,
|
|
85
|
+
` // input (active low) when the overlay wired it — the cheap detect path.`,
|
|
86
|
+
`#if DT_NODE_HAS_PROP(DT_NODELABEL(xpt2046), int_gpios)`,
|
|
87
|
+
` if (device_is_ready(__tc_touch_irq.port)) {`,
|
|
88
|
+
` gpio_pin_configure_dt(&__tc_touch_irq, GPIO_INPUT);`,
|
|
89
|
+
` __tc_touch_irq_ready = 1U;`,
|
|
90
|
+
` }`,
|
|
91
|
+
`#endif`,
|
|
92
|
+
` (void)device_is_ready(__tc_touch.bus);`,
|
|
93
|
+
`}`,
|
|
94
|
+
``,
|
|
95
|
+
`static inline bool touch_isTouched() {`,
|
|
96
|
+
` __tc_touch_cached_valid = 0;`,
|
|
97
|
+
` __tc_touch_cached_z = 0;`,
|
|
98
|
+
`#if DT_NODE_HAS_PROP(DT_NODELABEL(xpt2046), int_gpios)`,
|
|
99
|
+
` if (__tc_touch_irq_ready != 0U) {`,
|
|
100
|
+
` // PENIRQ asserts (active low) while the panel is pressed — no SPI`,
|
|
101
|
+
` // traffic needed to answer the per-frame poll.`,
|
|
102
|
+
` if (gpio_pin_get_dt(&__tc_touch_irq) <= 0) return false;`,
|
|
103
|
+
` }`,
|
|
104
|
+
`#endif`,
|
|
105
|
+
` // No IRQ (or it fired): confirm via Z1 pressure before reading coords.`,
|
|
106
|
+
` uint16_t __z1 = __tc_xpt_read(${hex(XPT2046_CMD_Z1)});`,
|
|
107
|
+
` if (__z1 <= ${zThreshold}) return false;`,
|
|
108
|
+
` __tc_touch_cached_x = static_cast<int16_t>(__tc_xpt_read(${hex(XPT2046_CMD_X)}));`,
|
|
109
|
+
` __tc_touch_cached_y = static_cast<int16_t>(__tc_xpt_read(${hex(XPT2046_CMD_Y)}));`,
|
|
110
|
+
` __tc_touch_cached_z = static_cast<int16_t>(__z1);`,
|
|
111
|
+
` __tc_touch_cached_valid = 1;`,
|
|
112
|
+
` return true;`,
|
|
113
|
+
`}`,
|
|
114
|
+
``,
|
|
115
|
+
`static inline void touch_readRaw(int16_t* x, int16_t* y, int16_t* z) {`,
|
|
116
|
+
` // touch_isTouched() is polled each frame by ui_poll_touch; the cached`,
|
|
117
|
+
` // values are fresh. If something calls readRaw before isTouched, probe now.`,
|
|
118
|
+
` if (!__tc_touch_cached_valid) {`,
|
|
119
|
+
` (void)touch_isTouched();`,
|
|
120
|
+
` }`,
|
|
121
|
+
` if (x) *x = __tc_touch_cached_x;`,
|
|
122
|
+
` if (y) *y = __tc_touch_cached_y;`,
|
|
123
|
+
` if (z) *z = __tc_touch_cached_z;`,
|
|
124
|
+
` __tc_touch_cached_valid = 0;`,
|
|
125
|
+
`}`,
|
|
126
|
+
].join("\n"),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function ft6336uAdapter(_touch) {
|
|
27
130
|
return {
|
|
28
131
|
includes: [
|
|
29
132
|
`#include <zephyr/drivers/i2c.h>`,
|
|
@@ -10,6 +10,10 @@ export interface ZephyrDisplayReadbackOptions {
|
|
|
10
10
|
scanlineSync?: boolean;
|
|
11
11
|
/** MISO/SDO GPIO; readback is disabled when it is not explicitly wired. */
|
|
12
12
|
miso?: number;
|
|
13
|
+
/** Tearing-effect GPIO (panel TE output). When set, panel updates wait for
|
|
14
|
+
* the TE frame pulse instead of GET_SCANLINE readback — no MISO required.
|
|
15
|
+
* The overlay adds te-gpios to the display DT node from this. */
|
|
16
|
+
tearingEffectPin?: number;
|
|
13
17
|
}
|
|
14
18
|
export declare function zephyrUiDisplayAdapter(profile: ZephyrDisplayProfile, readback?: ZephyrDisplayReadbackOptions): DisplayAdapterCode;
|
|
15
19
|
/**
|