blob: 6a9c0b4c24f0dad5ab8438a451b11d9ced346af0 [file] [log] [blame]
Mario Sixf8395902018-09-27 09:19:34 +02001// 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>
Simon Glassed38aef2020-05-10 11:40:03 -060013#include <command.h>
Mario Sixf8395902018-09-27 09:19:34 +020014#include <dm.h>
15#include <hexdump.h>
16#include <video_osd.h>
17#include <malloc.h>
18
Simon Glassed38aef2020-05-10 11:40:03 -060019static int do_osd_write(struct cmd_tbl *cmdtp, int flag, int argc,
20 char *const argv[])
Mario Sixf8395902018-09-27 09:19:34 +020021{
22 struct udevice *dev;
23 uint x, y;
24 uint count;
25 char *hexstr;
26 u8 *buffer;
27 size_t buflen;
28 int res;
29
30 if (argc < 4 || (strlen(argv[3])) % 2)
31 return CMD_RET_USAGE;
32
Simon Glass3ff49ec2021-07-24 09:03:29 -060033 x = hextoul(argv[1], NULL);
34 y = hextoul(argv[2], NULL);
Mario Sixf8395902018-09-27 09:19:34 +020035 hexstr = argv[3];
Simon Glass3ff49ec2021-07-24 09:03:29 -060036 count = (argc > 4) ? hextoul(argv[4], NULL) : 1;
Mario Sixf8395902018-09-27 09:19:34 +020037
38 buflen = strlen(hexstr) / 2;
39
40 buffer = malloc(buflen);
41 if (!buffer) {
42 puts("Memory allocation failure\n");
43 return CMD_RET_FAILURE;
44 }
45
46 res = hex2bin(buffer, hexstr, buflen);
47 if (res) {
48 free(buffer);
49 puts("Hexadecimal input contained invalid characters\n");
50 return CMD_RET_FAILURE;
51 }
52
53 for (uclass_first_device(UCLASS_VIDEO_OSD, &dev);
54 dev;
55 uclass_next_device(&dev)) {
56 int res;
57
58 res = video_osd_set_mem(dev, x, y, buffer, buflen, count);
59 if (res) {
60 free(buffer);
61 printf("Could not write to video mem on osd %s\n",
62 dev->name);
63 return CMD_RET_FAILURE;
64 }
65 }
66
67 free(buffer);
68
69 return CMD_RET_SUCCESS;
70}
71
Simon Glassed38aef2020-05-10 11:40:03 -060072static int do_osd_print(struct cmd_tbl *cmdtp, int flag, int argc,
73 char *const argv[])
Mario Sixf8395902018-09-27 09:19:34 +020074{
75 struct udevice *dev;
76 uint x, y;
77 u8 color;
78 char *text;
79
80 if (argc < 5)
81 return CMD_RET_USAGE;
82
Simon Glass3ff49ec2021-07-24 09:03:29 -060083 x = hextoul(argv[1], NULL);
84 y = hextoul(argv[2], NULL);
85 color = hextoul(argv[3], NULL);
Mario Sixf8395902018-09-27 09:19:34 +020086 text = argv[4];
87
88 for (uclass_first_device(UCLASS_VIDEO_OSD, &dev);
89 dev;
90 uclass_next_device(&dev)) {
91 int res;
92
93 res = video_osd_print(dev, x, y, color, text);
94 if (res) {
95 printf("Could not print string to osd %s\n", dev->name);
96 return CMD_RET_FAILURE;
97 }
98 }
99
100 return CMD_RET_SUCCESS;
101}
102
Simon Glassed38aef2020-05-10 11:40:03 -0600103static int do_osd_size(struct cmd_tbl *cmdtp, int flag, int argc,
104 char *const argv[])
Mario Sixf8395902018-09-27 09:19:34 +0200105{
106 struct udevice *dev;
107 uint x, y;
108
109 if (argc < 3)
110 return CMD_RET_USAGE;
111
Simon Glass3ff49ec2021-07-24 09:03:29 -0600112 x = hextoul(argv[1], NULL);
113 y = hextoul(argv[2], NULL);
Mario Sixf8395902018-09-27 09:19:34 +0200114
115 for (uclass_first_device(UCLASS_VIDEO_OSD, &dev);
116 dev;
117 uclass_next_device(&dev)) {
118 int res;
119
120 res = video_osd_set_size(dev, x, y);
121
122 if (res) {
123 printf("Could not set size on osd %s\n", dev->name);
124 return CMD_RET_FAILURE;
125 }
126 }
127
128 return CMD_RET_SUCCESS;
129}
130
131U_BOOT_CMD(
132 osdw, 5, 0, do_osd_write,
133 "write 16-bit hex encoded buffer to osd memory",
134 "osdw [pos_x] [pos_y] [buffer] [count] - write 8-bit hex encoded buffer to osd memory\n"
135);
136
137U_BOOT_CMD(
138 osdp, 5, 0, do_osd_print,
139 "write ASCII buffer to osd memory",
140 "osdp [pos_x] [pos_y] [color] [text] - write ASCII buffer to osd memory\n"
141);
142
143U_BOOT_CMD(
144 osdsize, 3, 0, do_osd_size,
145 "set OSD XY size in characters",
146 "osdsize [size_x] [size_y] - set OSD XY size in characters\n"
147);