/* * (C) Copyright 2021 Rockchip Electronics Co., Ltd * * SPDX-License-Identifier: GPL-2.0+ */ #include #include #include #include #include #include #include #include #include static int read_bmp(struct blk_desc *dev_desc, const char *name, disk_partition_t *part, uint32_t offset, uint32_t *size) { struct bmp_header *header; u32 blk_offset; u32 filesz; int ret; blk_offset = DIV_ROUND_UP(offset, dev_desc->blksz); header = memalign(ARCH_DMA_MINALIGN, dev_desc->blksz); if (!header) { ret = -ENOMEM; goto out; } if (blk_dread(dev_desc, part->start + blk_offset, 1, header) != 1) { ret = -EIO; goto out; } if (header->signature[0] != 'B' || header->signature[1] != 'M') { ret = -EINVAL; goto out; } filesz = get_unaligned_le32(&header->file_size); ret = resource_replace_entry(name, part->start, blk_offset, filesz); if (!ret) { printf("LOGO: %s\n", name); if (size) *size = filesz; } out: free(header); return ret; } /* * Add logo.bmp and logo_kernel.bmp from "logo" parititon * * Provide a "logo" partition for user to store logo.bmp and * logo_kernel.bmp, so that the user can update them from * kernel or user-space dynamically. * * "logo" partition layout, do not change order: * * |----------------------| 0x00 * | raw logo.bmp | * |----------------------| N*512-byte aligned * | raw logo_kernel.bmp | * |----------------------| * * N: the sector count of logo.bmp * * How to generate: * cat logo.bmp > logo.img && truncate -s %512 logo.img && cat logo_kernel.bmp >> logo.img */ int resource_read_logo_bmps(void) { struct blk_desc *dev_desc; disk_partition_t part; u32 filesz; dev_desc = rockchip_get_bootdev(); if (!dev_desc) { printf("No dev_desc!\n"); return -ENODEV; } if (part_get_info_by_name(dev_desc, PART_LOGO, &part) < 0) return -ENODEV; if (!read_bmp(dev_desc, "logo.bmp", &part, 0, &filesz)) read_bmp(dev_desc, "logo_kernel.bmp", &part, filesz, NULL); return 0; }