hc
2023-05-31 43fd8d44e8182b691c8ee61d487cec02ca11afd2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
 * (C) Copyright 2021 Rockchip Electronics Co., Ltd
 *
 * SPDX-License-Identifier:     GPL-2.0+
 */
#include <common.h>
#include <adc.h>
#include <boot_rkimg.h>
#include <bmp_layout.h>
#include <malloc.h>
#include <asm/io.h>
#include <asm/unaligned.h>
#include <asm/arch/resource_img.h>
#include <dm/ofnode.h>
 
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;
}