@kvell007/embed-labs-cli 0.1.0-alpha.97 → 0.1.0-alpha.99

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.
@@ -0,0 +1,49 @@
1
+ export interface TaishanPiBootLogoComposeOptions {
2
+ releaseRoot: string;
3
+ logoPath: string;
4
+ kernelLogoPath?: string;
5
+ baseImagePath?: string;
6
+ outputImagePath: string;
7
+ outputResourcePath?: string;
8
+ manifestPath?: string;
9
+ force?: boolean;
10
+ }
11
+ export interface TaishanPiBootLogoComposeResult {
12
+ schema_version: "1.0";
13
+ operation_kind: "image.boot_logo.local_compose";
14
+ board_id: "taishanpi-1m-rk3566";
15
+ release_root: string;
16
+ logo_path: string;
17
+ kernel_logo_path: string;
18
+ base_image_path: string;
19
+ output_image_path: string;
20
+ output_resource_path: string;
21
+ manifest_path: string;
22
+ dimensions: BmpDimensions;
23
+ fit_resource: FitExternalDataInfo;
24
+ fit_resource_hash_offset: number;
25
+ base_boot_sha256: string;
26
+ output_boot_sha256: string;
27
+ base_resource_sha256: string;
28
+ output_resource_sha256: string;
29
+ converter: string;
30
+ kernel_converter: string;
31
+ ready_for_flash: true;
32
+ local_merge_strategy: "local_resource_repack_and_fit_patch";
33
+ cross_platform: true;
34
+ platform: NodeJS.Platform;
35
+ arch: string;
36
+ observed_at: string;
37
+ summary_for_user: string;
38
+ }
39
+ interface BmpDimensions {
40
+ width: number;
41
+ height: number;
42
+ bits_per_pixel: number;
43
+ }
44
+ interface FitExternalDataInfo {
45
+ offset: number;
46
+ size: number;
47
+ }
48
+ export declare function composeTaishanPiBootLogoLocal(options: TaishanPiBootLogoComposeOptions): Promise<TaishanPiBootLogoComposeResult>;
49
+ export {};
@@ -0,0 +1,364 @@
1
+ import { createHash } from "node:crypto";
2
+ import { execFile } from "node:child_process";
3
+ import { constants } from "node:fs";
4
+ import { access, copyFile, mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
5
+ import { arch as osArch, platform as osPlatform } from "node:os";
6
+ import { delimiter, dirname, isAbsolute, join, resolve } from "node:path";
7
+ import { promisify } from "node:util";
8
+ const execFileAsync = promisify(execFile);
9
+ export async function composeTaishanPiBootLogoLocal(options) {
10
+ const releaseRoot = resolve(options.releaseRoot);
11
+ const logoPath = resolve(options.logoPath);
12
+ const kernelLogoPath = resolve(options.kernelLogoPath ?? options.logoPath);
13
+ const outputImagePath = resolve(options.outputImagePath);
14
+ const outputResourcePath = resolve(options.outputResourcePath ?? join(dirname(outputImagePath), "boot-logo-resource.img"));
15
+ const manifestPath = resolve(options.manifestPath ?? `${outputImagePath}.embedlabs-boot-logo.json`);
16
+ const resourceTool = await resourceToolPath(releaseRoot);
17
+ if (!resourceTool) {
18
+ throw new Error("resource_tool_missing: local TaishanPi SDK is missing Rockchip resource_tool.");
19
+ }
20
+ const baseBootImage = await firstExistingPath([
21
+ options.baseImagePath,
22
+ join(releaseRoot, "images", "current", "boot.img"),
23
+ join(releaseRoot, "boot-workspace", "out", "boot.img")
24
+ ]);
25
+ if (!baseBootImage) {
26
+ throw new Error("base_boot_image_missing: local TaishanPi SDK does not contain images/current/boot.img or boot-workspace/out/boot.img.");
27
+ }
28
+ await assertReadableFile(logoPath, "startup-logo image");
29
+ await assertReadableFile(kernelLogoPath, "kernel-logo image");
30
+ await assertReadableFile(baseBootImage, "base boot image");
31
+ if (!options.force && await pathExists(outputImagePath)) {
32
+ throw new Error(`output_image_exists: ${outputImagePath}. Pass force=true or choose another output path.`);
33
+ }
34
+ const baseBootBytes = await readFile(baseBootImage);
35
+ const headerSize = readFdtTotalsize(baseBootBytes);
36
+ if (!headerSize) {
37
+ throw new Error("unsupported_boot_image_format: boot.img is not a FIT image that can be patched locally.");
38
+ }
39
+ const workDir = join(dirname(outputImagePath), "boot-logo-work");
40
+ await rm(workDir, { recursive: true, force: true });
41
+ await mkdir(workDir, { recursive: true });
42
+ const fitResource = await readFitExternalDataInfo(baseBootImage, "resource", workDir, releaseRoot);
43
+ if (!fitResource || fitResource.offset + fitResource.size > baseBootBytes.length) {
44
+ throw new Error("fit_resource_not_found: could not locate the resource image payload inside boot.img.");
45
+ }
46
+ const baseResourcePath = join(workDir, "base-resource.img");
47
+ await writeFile(baseResourcePath, baseBootBytes.subarray(fitResource.offset, fitResource.offset + fitResource.size));
48
+ const unpackResult = await runProcess(resourceTool, ["--unpack", `--image=${baseResourcePath}`], { cwd: workDir });
49
+ if (unpackResult.code !== 0) {
50
+ throw new Error(`resource_unpack_failed: ${summarizeProcessOutput(unpackResult) || "resource_tool unpack failed."}`);
51
+ }
52
+ const unpackDir = join(workDir, "out");
53
+ const logoBmpPath = join(unpackDir, "logo.bmp");
54
+ const kernelLogoBmpPath = join(unpackDir, "logo_kernel.bmp");
55
+ const dimensions = await readBmpDimensions(logoBmpPath);
56
+ const convertedLogoPath = join(workDir, "converted-logo.bmp");
57
+ const convertedKernelLogoPath = join(workDir, "converted-logo-kernel.bmp");
58
+ const converter = await convertImageToBootBmp(logoPath, convertedLogoPath, dimensions.width, dimensions.height, releaseRoot);
59
+ const kernelConverter = await convertImageToBootBmp(kernelLogoPath, convertedKernelLogoPath, dimensions.width, dimensions.height, releaseRoot);
60
+ await copyFile(convertedLogoPath, logoBmpPath);
61
+ await copyFile(convertedKernelLogoPath, kernelLogoBmpPath);
62
+ await mkdir(dirname(outputResourcePath), { recursive: true });
63
+ const packResult = await runProcess(resourceTool, [
64
+ "--pack",
65
+ `--image=${outputResourcePath}`,
66
+ "rk-kernel.dtb",
67
+ "logo.bmp",
68
+ "logo_kernel.bmp"
69
+ ], { cwd: unpackDir });
70
+ if (packResult.code !== 0) {
71
+ throw new Error(`resource_pack_failed: ${summarizeProcessOutput(packResult) || "resource_tool pack failed."}`);
72
+ }
73
+ let patchedResourceBytes = await readFile(outputResourcePath);
74
+ if (patchedResourceBytes.length > fitResource.size) {
75
+ const extra = patchedResourceBytes.subarray(fitResource.size);
76
+ if (extra.every((byte) => byte === 0)) {
77
+ patchedResourceBytes = patchedResourceBytes.subarray(0, fitResource.size);
78
+ await writeFile(outputResourcePath, patchedResourceBytes);
79
+ }
80
+ }
81
+ if (patchedResourceBytes.length < fitResource.size) {
82
+ const padded = Buffer.alloc(fitResource.size);
83
+ patchedResourceBytes.copy(padded, 0);
84
+ patchedResourceBytes = padded;
85
+ await writeFile(outputResourcePath, patchedResourceBytes);
86
+ }
87
+ if (patchedResourceBytes.length !== fitResource.size) {
88
+ throw new Error(`resource_size_mismatch: packed resource.img is ${patchedResourceBytes.length} bytes, but the FIT resource slot is ${fitResource.size} bytes.`);
89
+ }
90
+ const baseResourceBytes = baseBootBytes.subarray(fitResource.offset, fitResource.offset + fitResource.size);
91
+ const baseResourceHash = Buffer.from(sha256Buffer(baseResourceBytes), "hex");
92
+ const patchedResourceHash = Buffer.from(sha256Buffer(patchedResourceBytes), "hex");
93
+ const hashOffset = findUniqueSubBufferOffset(baseBootBytes.subarray(0, headerSize), baseResourceHash);
94
+ if (hashOffset < 0) {
95
+ throw new Error("fit_resource_hash_not_found: could not uniquely locate the resource hash in the FIT header.");
96
+ }
97
+ const outputBootBytes = Buffer.from(baseBootBytes);
98
+ patchedResourceHash.copy(outputBootBytes, hashOffset);
99
+ patchedResourceBytes.copy(outputBootBytes, fitResource.offset);
100
+ await mkdir(dirname(outputImagePath), { recursive: true });
101
+ await writeFile(outputImagePath, outputBootBytes);
102
+ const result = {
103
+ schema_version: "1.0",
104
+ operation_kind: "image.boot_logo.local_compose",
105
+ board_id: "taishanpi-1m-rk3566",
106
+ release_root: releaseRoot,
107
+ logo_path: logoPath,
108
+ kernel_logo_path: kernelLogoPath,
109
+ base_image_path: baseBootImage,
110
+ output_image_path: outputImagePath,
111
+ output_resource_path: outputResourcePath,
112
+ manifest_path: manifestPath,
113
+ dimensions,
114
+ fit_resource: fitResource,
115
+ fit_resource_hash_offset: hashOffset,
116
+ base_boot_sha256: sha256Buffer(baseBootBytes),
117
+ output_boot_sha256: sha256Buffer(outputBootBytes),
118
+ base_resource_sha256: sha256Buffer(baseResourceBytes),
119
+ output_resource_sha256: sha256Buffer(patchedResourceBytes),
120
+ converter: converter.converter,
121
+ kernel_converter: kernelConverter.converter,
122
+ ready_for_flash: true,
123
+ local_merge_strategy: "local_resource_repack_and_fit_patch",
124
+ cross_platform: true,
125
+ platform: osPlatform(),
126
+ arch: osArch(),
127
+ observed_at: new Date().toISOString(),
128
+ summary_for_user: "Startup logo was converted locally, resource.img was repacked, and boot.img was patched for approved flashing."
129
+ };
130
+ await mkdir(dirname(manifestPath), { recursive: true });
131
+ await writeFile(manifestPath, `${JSON.stringify(result, null, 2)}\n`, "utf8");
132
+ return result;
133
+ }
134
+ async function assertReadableFile(filePath, label) {
135
+ const info = await stat(filePath);
136
+ if (!info.isFile()) {
137
+ throw new Error(`${label} is not a file: ${filePath}`);
138
+ }
139
+ await access(filePath, constants.R_OK);
140
+ }
141
+ async function pathExists(filePath) {
142
+ try {
143
+ await stat(filePath);
144
+ return true;
145
+ }
146
+ catch {
147
+ return false;
148
+ }
149
+ }
150
+ async function firstExistingPath(candidates) {
151
+ for (const candidate of candidates) {
152
+ if (!candidate)
153
+ continue;
154
+ try {
155
+ const resolved = resolve(candidate);
156
+ const info = await stat(resolved);
157
+ if (info.isFile())
158
+ return resolved;
159
+ }
160
+ catch {
161
+ // Continue to the next candidate.
162
+ }
163
+ }
164
+ return undefined;
165
+ }
166
+ async function resourceToolPath(releaseRoot) {
167
+ const platformDirs = osPlatform() === "darwin"
168
+ ? ["mac", "darwin"]
169
+ : osPlatform() === "win32"
170
+ ? ["windows", "win"]
171
+ : ["linux", "linux-x64", "linux-x86_64"];
172
+ const names = osPlatform() === "win32" ? ["resource_tool.exe", "resource_tool"] : ["resource_tool"];
173
+ const candidates = [];
174
+ for (const dir of platformDirs) {
175
+ for (const name of names) {
176
+ candidates.push(join(releaseRoot, "tools", dir, name));
177
+ }
178
+ }
179
+ for (const name of names) {
180
+ candidates.push(join(releaseRoot, "tools", name));
181
+ }
182
+ return await firstExecutablePath(candidates);
183
+ }
184
+ async function firstExecutablePath(candidates) {
185
+ for (const candidate of candidates) {
186
+ try {
187
+ const info = await stat(candidate);
188
+ if (info.isFile()) {
189
+ return candidate;
190
+ }
191
+ }
192
+ catch {
193
+ // Continue to the next candidate.
194
+ }
195
+ }
196
+ return undefined;
197
+ }
198
+ async function runProcess(command, args, options = {}) {
199
+ try {
200
+ const result = await execFileAsync(command, args, {
201
+ cwd: options.cwd,
202
+ timeout: 60_000,
203
+ maxBuffer: 10 * 1024 * 1024
204
+ });
205
+ return { code: 0, stdout: result.stdout, stderr: result.stderr };
206
+ }
207
+ catch (error) {
208
+ const item = error;
209
+ const code = typeof item.code === "number" ? item.code : 1;
210
+ return {
211
+ code,
212
+ stdout: typeof item.stdout === "string" ? item.stdout : "",
213
+ stderr: typeof item.stderr === "string" ? item.stderr : item.message ?? ""
214
+ };
215
+ }
216
+ }
217
+ function summarizeProcessOutput(result) {
218
+ return `${result.stderr || result.stdout}`.trim().split(/\r?\n/).slice(0, 4).join(" ").slice(0, 500);
219
+ }
220
+ async function readBmpDimensions(filePath) {
221
+ const bytes = await readFile(filePath);
222
+ if (bytes.length < 54 || bytes.toString("ascii", 0, 2) !== "BM") {
223
+ throw new Error(`Not a Windows BMP file: ${filePath}`);
224
+ }
225
+ return {
226
+ width: Math.abs(bytes.readInt32LE(18)),
227
+ height: Math.abs(bytes.readInt32LE(22)),
228
+ bits_per_pixel: bytes.readUInt16LE(28)
229
+ };
230
+ }
231
+ async function normalizeBmpTopDown(filePath) {
232
+ const bytes = Buffer.from(await readFile(filePath));
233
+ if (bytes.length < 54 || bytes.toString("ascii", 0, 2) !== "BM")
234
+ return;
235
+ const width = bytes.readInt32LE(18);
236
+ const height = bytes.readInt32LE(22);
237
+ const bitsPerPixel = bytes.readUInt16LE(28);
238
+ if (height <= 0 || width <= 0 || bitsPerPixel <= 0)
239
+ return;
240
+ const pixelOffset = bytes.readUInt32LE(10);
241
+ const rowSize = Math.floor((bitsPerPixel * width + 31) / 32) * 4;
242
+ const pixelBytes = rowSize * height;
243
+ if (pixelOffset + pixelBytes > bytes.length)
244
+ return;
245
+ const original = Buffer.from(bytes.subarray(pixelOffset, pixelOffset + pixelBytes));
246
+ for (let row = 0; row < height; row += 1) {
247
+ const sourceStart = (height - row - 1) * rowSize;
248
+ original.copy(bytes, pixelOffset + row * rowSize, sourceStart, sourceStart + rowSize);
249
+ }
250
+ bytes.writeInt32LE(-height, 22);
251
+ await writeFile(filePath, bytes);
252
+ }
253
+ async function convertImageToBootBmp(inputPath, outputPath, width, height, releaseRoot) {
254
+ try {
255
+ const inputDimensions = await readBmpDimensions(inputPath);
256
+ if (inputDimensions.width === width && inputDimensions.height === height) {
257
+ await copyFile(inputPath, outputPath);
258
+ await normalizeBmpTopDown(outputPath);
259
+ return { converter: "bmp-copy", output_path: outputPath };
260
+ }
261
+ }
262
+ catch {
263
+ // Non-BMP inputs continue through system converters.
264
+ }
265
+ const extraPathDirs = executableSearchDirs(releaseRoot);
266
+ for (const [converter, commandNames, args] of [
267
+ ["magick", ["magick"], [
268
+ inputPath, "-auto-orient", "-resize", `${width}x${height}^`, "-gravity", "center",
269
+ "-extent", `${width}x${height}`, "-type", "TrueColor", "-depth", "8", `BMP3:${outputPath}`
270
+ ]],
271
+ ["convert", ["convert"], [
272
+ inputPath, "-auto-orient", "-resize", `${width}x${height}^`, "-gravity", "center",
273
+ "-extent", `${width}x${height}`, "-type", "TrueColor", "-depth", "8", `BMP3:${outputPath}`
274
+ ]],
275
+ ["sips", ["sips"], [
276
+ "-s", "format", "bmp", "-z", String(height), String(width), inputPath, "--out", outputPath
277
+ ]],
278
+ ["ffmpeg", ["ffmpeg"], [
279
+ "-y", "-i", inputPath, "-vf", `scale=${width}:${height}:force_original_aspect_ratio=increase,crop=${width}:${height}`, outputPath
280
+ ]]
281
+ ]) {
282
+ const command = await resolveExecutableFromPath(commandNames, extraPathDirs);
283
+ if (!command)
284
+ continue;
285
+ const result = await runProcess(command, args);
286
+ if (result.code === 0) {
287
+ await normalizeBmpTopDown(outputPath);
288
+ return { converter, output_path: outputPath };
289
+ }
290
+ }
291
+ throw new Error("image_converter_missing: no local image converter was found. Install ImageMagick or provide a BMP with the target dimensions.");
292
+ }
293
+ function readFdtTotalsize(bytes) {
294
+ if (bytes.length < 8 || bytes.readUInt32BE(0) !== 0xd00dfeed)
295
+ return 0;
296
+ const totalSize = bytes.readUInt32BE(4);
297
+ return totalSize > 0 && totalSize <= bytes.length ? totalSize : 0;
298
+ }
299
+ async function readFitExternalDataInfo(imagePath, nodeName, workDir, releaseRoot) {
300
+ const fdtget = await resolveExecutableFromPath(["fdtget", "fdtget.exe"], executableSearchDirs(releaseRoot));
301
+ if (!fdtget)
302
+ return undefined;
303
+ const nodePath = `/images/${nodeName}`;
304
+ const offset = await readFitIntegerProperty(fdtget, imagePath, nodePath, "data-position", workDir);
305
+ const size = await readFitIntegerProperty(fdtget, imagePath, nodePath, "data-size", workDir);
306
+ if (offset === undefined || size === undefined)
307
+ return undefined;
308
+ return { offset, size };
309
+ }
310
+ async function readFitIntegerProperty(fdtget, imagePath, nodePath, property, workDir) {
311
+ const result = await runProcess(fdtget, ["-ti", imagePath, nodePath, property], { cwd: workDir });
312
+ if (result.code !== 0)
313
+ return undefined;
314
+ const value = Number.parseInt(result.stdout.trim(), 10);
315
+ return Number.isSafeInteger(value) && value >= 0 ? value : undefined;
316
+ }
317
+ function executableSearchDirs(releaseRoot) {
318
+ const platformDirs = osPlatform() === "darwin"
319
+ ? ["mac", "darwin"]
320
+ : osPlatform() === "win32"
321
+ ? ["windows", "win"]
322
+ : ["linux", "linux-x64", "linux-x86_64"];
323
+ return [
324
+ ...platformDirs.map((dir) => join(releaseRoot, "tools", dir)),
325
+ join(releaseRoot, "tools")
326
+ ];
327
+ }
328
+ async function resolveExecutableFromPath(names, extraDirs = []) {
329
+ const extensions = osPlatform() === "win32" ? ["", ".exe", ".cmd", ".bat"] : [""];
330
+ const dirs = [
331
+ ...extraDirs,
332
+ ...`${process.env.PATH ?? ""}`.split(delimiter).filter(Boolean)
333
+ ];
334
+ for (const name of names) {
335
+ if (isAbsolute(name) && await firstExecutablePath([name]))
336
+ return name;
337
+ for (const dir of dirs) {
338
+ for (const ext of extensions) {
339
+ const candidate = join(dir, `${name}${ext}`);
340
+ if (await firstExecutablePath([candidate]))
341
+ return candidate;
342
+ }
343
+ }
344
+ }
345
+ return undefined;
346
+ }
347
+ function findUniqueSubBufferOffset(haystack, needle) {
348
+ let found = -1;
349
+ let searchFrom = 0;
350
+ while (searchFrom < haystack.length) {
351
+ const index = haystack.indexOf(needle, searchFrom);
352
+ if (index < 0)
353
+ break;
354
+ if (found >= 0)
355
+ return -1;
356
+ found = index;
357
+ searchFrom = index + 1;
358
+ }
359
+ return found;
360
+ }
361
+ function sha256Buffer(bytes) {
362
+ return createHash("sha256").update(bytes).digest("hex");
363
+ }
364
+ //# sourceMappingURL=boot-logo-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-logo-local.js","sourceRoot":"","sources":["../src/boot-logo-local.ts"],"names":[],"mappings":"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"}