Merge branch 'master' of git://git.denx.de/u-boot-spi
[platform/kernel/u-boot.git] / board / gdsys / common / osd_cmd.c
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * (C) Copyright 2017
4  * Mario Six,  Guntermann & Drunck GmbH, mario.six@gdsys.cc
5  *
6  * based on the gdsys osd driver, which is
7  *
8  * (C) Copyright 2010
9  * Dirk Eibach,  Guntermann & Drunck GmbH, eibach@gdsys.de
10  */
11
12 #include <common.h>
13 #include <dm.h>
14 #include <hexdump.h>
15 #include <video_osd.h>
16 #include <malloc.h>
17
18 static int do_osd_write(cmd_tbl_t *cmdtp, int flag, int argc,
19                         char * const argv[])
20 {
21         struct udevice *dev;
22         uint x, y;
23         uint count;
24         char *hexstr;
25         u8 *buffer;
26         size_t buflen;
27         int res;
28
29         if (argc < 4 || (strlen(argv[3])) % 2)
30                 return CMD_RET_USAGE;
31
32         x = simple_strtoul(argv[1], NULL, 16);
33         y = simple_strtoul(argv[2], NULL, 16);
34         hexstr = argv[3];
35         count = (argc > 4) ? simple_strtoul(argv[4], NULL, 16) : 1;
36
37         buflen = strlen(hexstr) / 2;
38
39         buffer = malloc(buflen);
40         if (!buffer) {
41                 puts("Memory allocation failure\n");
42                 return CMD_RET_FAILURE;
43         }
44
45         res = hex2bin(buffer, hexstr, buflen);
46         if (res) {
47                 free(buffer);
48                 puts("Hexadecimal input contained invalid characters\n");
49                 return CMD_RET_FAILURE;
50         }
51
52         for (uclass_first_device(UCLASS_VIDEO_OSD, &dev);
53              dev;
54              uclass_next_device(&dev)) {
55                 int res;
56
57                 res = video_osd_set_mem(dev, x, y, buffer, buflen, count);
58                 if (res) {
59                         free(buffer);
60                         printf("Could not write to video mem on osd %s\n",
61                                dev->name);
62                         return CMD_RET_FAILURE;
63                 }
64         }
65
66         free(buffer);
67
68         return CMD_RET_SUCCESS;
69 }
70
71 static int do_osd_print(cmd_tbl_t *cmdtp, int flag, int argc,
72                         char * const argv[])
73 {
74         struct udevice *dev;
75         uint x, y;
76         u8 color;
77         char *text;
78
79         if (argc < 5)
80                 return CMD_RET_USAGE;
81
82         x = simple_strtoul(argv[1], NULL, 16);
83         y = simple_strtoul(argv[2], NULL, 16);
84         color = simple_strtoul(argv[3], NULL, 16);
85         text = argv[4];
86
87         for (uclass_first_device(UCLASS_VIDEO_OSD, &dev);
88              dev;
89              uclass_next_device(&dev)) {
90                 int res;
91
92                 res = video_osd_print(dev, x, y, color, text);
93                 if (res) {
94                         printf("Could not print string to osd %s\n", dev->name);
95                         return CMD_RET_FAILURE;
96                 }
97         }
98
99         return CMD_RET_SUCCESS;
100 }
101
102 static int do_osd_size(cmd_tbl_t *cmdtp, int flag, int argc,
103                        char * const argv[])
104 {
105         struct udevice *dev;
106         uint x, y;
107
108         if (argc < 3)
109                 return CMD_RET_USAGE;
110
111         x = simple_strtoul(argv[1], NULL, 16);
112         y = simple_strtoul(argv[2], NULL, 16);
113
114         for (uclass_first_device(UCLASS_VIDEO_OSD, &dev);
115              dev;
116              uclass_next_device(&dev)) {
117                 int res;
118
119                 res = video_osd_set_size(dev, x, y);
120
121                 if (res) {
122                         printf("Could not set size on osd %s\n", dev->name);
123                         return CMD_RET_FAILURE;
124                 }
125         }
126
127         return CMD_RET_SUCCESS;
128 }
129
130 U_BOOT_CMD(
131         osdw, 5, 0, do_osd_write,
132         "write 16-bit hex encoded buffer to osd memory",
133         "osdw [pos_x] [pos_y] [buffer] [count] - write 8-bit hex encoded buffer to osd memory\n"
134 );
135
136 U_BOOT_CMD(
137         osdp, 5, 0, do_osd_print,
138         "write ASCII buffer to osd memory",
139         "osdp [pos_x] [pos_y] [color] [text] - write ASCII buffer to osd memory\n"
140 );
141
142 U_BOOT_CMD(
143         osdsize, 3, 0, do_osd_size,
144         "set OSD XY size in characters",
145         "osdsize [size_x] [size_y] - set OSD XY size in characters\n"
146 );