xref: /rk3399_rockchip-uboot/test/dm/video.c (revision 57dc53a72460e8e301fa1cc7951b41db8e731485)
13c97c4fbSSimon Glass /*
23c97c4fbSSimon Glass  * Copyright (c) 2014 Google, Inc
33c97c4fbSSimon Glass  * Written by Simon Glass <sjg@chromium.org>
43c97c4fbSSimon Glass  *
53c97c4fbSSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
63c97c4fbSSimon Glass  */
73c97c4fbSSimon Glass 
83c97c4fbSSimon Glass #include <common.h>
93c97c4fbSSimon Glass #include <bzlib.h>
103c97c4fbSSimon Glass #include <dm.h>
113c97c4fbSSimon Glass #include <mapmem.h>
123c97c4fbSSimon Glass #include <os.h>
133c97c4fbSSimon Glass #include <video.h>
143c97c4fbSSimon Glass #include <video_console.h>
153c97c4fbSSimon Glass #include <dm/test.h>
163c97c4fbSSimon Glass #include <dm/uclass-internal.h>
173c97c4fbSSimon Glass #include <test/ut.h>
183c97c4fbSSimon Glass 
193c97c4fbSSimon Glass /*
203c97c4fbSSimon Glass  * These tests use the standard sandbox frame buffer, the resolution of which
213c97c4fbSSimon Glass  * is defined in the device tree. This only supports 16bpp so the tests only
223c97c4fbSSimon Glass  * test that code path. It would be possible to adjust this fairly easily,
233c97c4fbSSimon Glass  * by adjusting the bpix value in struct sandbox_sdl_plat. However the code
243c97c4fbSSimon Glass  * in sandbox_sdl_sync() would also need to change to handle the different
253c97c4fbSSimon Glass  * surface depth.
263c97c4fbSSimon Glass  */
273c97c4fbSSimon Glass DECLARE_GLOBAL_DATA_PTR;
283c97c4fbSSimon Glass 
293c97c4fbSSimon Glass /* Basic test of the video uclass */
dm_test_video_base(struct unit_test_state * uts)303c97c4fbSSimon Glass static int dm_test_video_base(struct unit_test_state *uts)
313c97c4fbSSimon Glass {
323c97c4fbSSimon Glass 	struct video_priv *priv;
333c97c4fbSSimon Glass 	struct udevice *dev;
343c97c4fbSSimon Glass 
353c97c4fbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
363c97c4fbSSimon Glass 	ut_asserteq(1366, video_get_xsize(dev));
373c97c4fbSSimon Glass 	ut_asserteq(768, video_get_ysize(dev));
383c97c4fbSSimon Glass 	priv = dev_get_uclass_priv(dev);
393c97c4fbSSimon Glass 	ut_asserteq(priv->fb_size, 1366 * 768 * 2);
403c97c4fbSSimon Glass 
413c97c4fbSSimon Glass 	return 0;
423c97c4fbSSimon Glass }
433c97c4fbSSimon Glass DM_TEST(dm_test_video_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
443c97c4fbSSimon Glass 
453c97c4fbSSimon Glass /**
463c97c4fbSSimon Glass  * compress_frame_buffer() - Compress the frame buffer and return its size
473c97c4fbSSimon Glass  *
483c97c4fbSSimon Glass  * We want to write tests which perform operations on the video console and
493c97c4fbSSimon Glass  * check that the frame buffer ends up with the correct contents. But it is
503c97c4fbSSimon Glass  * painful to store 'known good' images for comparison with the frame
513c97c4fbSSimon Glass  * buffer. As an alternative, we can compress the frame buffer and check the
523c97c4fbSSimon Glass  * size of the compressed data. This provides a pretty good level of
533c97c4fbSSimon Glass  * certainty and the resulting tests need only check a single value.
543c97c4fbSSimon Glass  *
553c97c4fbSSimon Glass  * @dev:	Video device
563c97c4fbSSimon Glass  * @return compressed size of the frame buffer, or -ve on error
573c97c4fbSSimon Glass  */
compress_frame_buffer(struct udevice * dev)583c97c4fbSSimon Glass static int compress_frame_buffer(struct udevice *dev)
593c97c4fbSSimon Glass {
603c97c4fbSSimon Glass 	struct video_priv *priv = dev_get_uclass_priv(dev);
613c97c4fbSSimon Glass 	uint destlen;
623c97c4fbSSimon Glass 	void *dest;
633c97c4fbSSimon Glass 	int ret;
643c97c4fbSSimon Glass 
653c97c4fbSSimon Glass 	destlen = priv->fb_size;
663c97c4fbSSimon Glass 	dest = malloc(priv->fb_size);
673c97c4fbSSimon Glass 	if (!dest)
683c97c4fbSSimon Glass 		return -ENOMEM;
693c97c4fbSSimon Glass 	ret = BZ2_bzBuffToBuffCompress(dest, &destlen,
703c97c4fbSSimon Glass 				       priv->fb, priv->fb_size,
713c97c4fbSSimon Glass 				       3, 0, 0);
723c97c4fbSSimon Glass 	free(dest);
733c97c4fbSSimon Glass 	if (ret)
743c97c4fbSSimon Glass 		return ret;
753c97c4fbSSimon Glass 
763c97c4fbSSimon Glass 	return destlen;
773c97c4fbSSimon Glass }
783c97c4fbSSimon Glass 
793c97c4fbSSimon Glass /*
803c97c4fbSSimon Glass  * Call this function at any point to halt and show the current display. Be
813c97c4fbSSimon Glass  * sure to run the test with the -l flag.
823c97c4fbSSimon Glass  */
see_output(void)833c97c4fbSSimon Glass static void __maybe_unused see_output(void)
843c97c4fbSSimon Glass {
853c97c4fbSSimon Glass 	video_sync_all();
863c97c4fbSSimon Glass 	while (1);
873c97c4fbSSimon Glass }
883c97c4fbSSimon Glass 
898df8dad5SSimon Glass /* Select the video console driver to use for a video device */
select_vidconsole(struct unit_test_state * uts,const char * drv_name)908df8dad5SSimon Glass static int select_vidconsole(struct unit_test_state *uts, const char *drv_name)
918df8dad5SSimon Glass {
928df8dad5SSimon Glass 	struct sandbox_sdl_plat *plat;
938df8dad5SSimon Glass 	struct udevice *dev;
948df8dad5SSimon Glass 
958df8dad5SSimon Glass 	ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
968df8dad5SSimon Glass 	ut_assert(!device_active(dev));
978df8dad5SSimon Glass 	plat = dev_get_platdata(dev);
988df8dad5SSimon Glass 	plat->vidconsole_drv_name = "vidconsole0";
998df8dad5SSimon Glass 
1008df8dad5SSimon Glass 	return 0;
1018df8dad5SSimon Glass }
1028df8dad5SSimon Glass 
1033c97c4fbSSimon Glass /* Test text output works on the video console */
dm_test_video_text(struct unit_test_state * uts)1043c97c4fbSSimon Glass static int dm_test_video_text(struct unit_test_state *uts)
1053c97c4fbSSimon Glass {
1063c97c4fbSSimon Glass 	struct udevice *dev, *con;
1073c97c4fbSSimon Glass 	int i;
1083c97c4fbSSimon Glass 
1093c97c4fbSSimon Glass #define WHITE		0xffff
1103c97c4fbSSimon Glass #define SCROLL_LINES	100
1113c97c4fbSSimon Glass 
1128df8dad5SSimon Glass 	ut_assertok(select_vidconsole(uts, "vidconsole0"));
1133c97c4fbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
1143c97c4fbSSimon Glass 	ut_asserteq(46, compress_frame_buffer(dev));
1153c97c4fbSSimon Glass 
1163c97c4fbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
1173c97c4fbSSimon Glass 	vidconsole_putc_xy(con, 0, 0, 'a');
1183c97c4fbSSimon Glass 	ut_asserteq(79, compress_frame_buffer(dev));
1193c97c4fbSSimon Glass 
1203c97c4fbSSimon Glass 	vidconsole_putc_xy(con, 0, 0, ' ');
1213c97c4fbSSimon Glass 	ut_asserteq(46, compress_frame_buffer(dev));
1223c97c4fbSSimon Glass 
1233c97c4fbSSimon Glass 	for (i = 0; i < 20; i++)
124f2661786SSimon Glass 		vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
1253c97c4fbSSimon Glass 	ut_asserteq(273, compress_frame_buffer(dev));
1263c97c4fbSSimon Glass 
1273c97c4fbSSimon Glass 	vidconsole_set_row(con, 0, WHITE);
1283c97c4fbSSimon Glass 	ut_asserteq(46, compress_frame_buffer(dev));
1293c97c4fbSSimon Glass 
1303c97c4fbSSimon Glass 	for (i = 0; i < 20; i++)
131f2661786SSimon Glass 		vidconsole_putc_xy(con, VID_TO_POS(i * 8), 0, ' ' + i);
1323c97c4fbSSimon Glass 	ut_asserteq(273, compress_frame_buffer(dev));
1333c97c4fbSSimon Glass 
1343c97c4fbSSimon Glass 	return 0;
1353c97c4fbSSimon Glass }
1363c97c4fbSSimon Glass DM_TEST(dm_test_video_text, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
1373c97c4fbSSimon Glass 
1383c97c4fbSSimon Glass /* Test handling of special characters in the console */
dm_test_video_chars(struct unit_test_state * uts)1393c97c4fbSSimon Glass static int dm_test_video_chars(struct unit_test_state *uts)
1403c97c4fbSSimon Glass {
1413c97c4fbSSimon Glass 	struct udevice *dev, *con;
1425508f10aSSimon Glass 	const char *test_string = "Well\b\b\b\bxhe is\r \n\ta very \amodest  \bman\n\t\tand Has much to\b\bto be modest about.";
1433c97c4fbSSimon Glass 	const char *s;
1443c97c4fbSSimon Glass 
1458df8dad5SSimon Glass 	ut_assertok(select_vidconsole(uts, "vidconsole0"));
1463c97c4fbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
1473c97c4fbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
1483c97c4fbSSimon Glass 	for (s = test_string; *s; s++)
1493c97c4fbSSimon Glass 		vidconsole_put_char(con, *s);
1503c97c4fbSSimon Glass 	ut_asserteq(466, compress_frame_buffer(dev));
1513c97c4fbSSimon Glass 
1523c97c4fbSSimon Glass 	return 0;
1533c97c4fbSSimon Glass }
1543c97c4fbSSimon Glass DM_TEST(dm_test_video_chars, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
1553c97c4fbSSimon Glass 
1563c97c4fbSSimon Glass /**
1573c97c4fbSSimon Glass  * check_vidconsole_output() - Run a text console test
1583c97c4fbSSimon Glass  *
1593c97c4fbSSimon Glass  * @uts:	Test state
1603c97c4fbSSimon Glass  * @rot:	Console rotation (0, 90, 180, 270)
1613c97c4fbSSimon Glass  * @wrap_size:	Expected size of compressed frame buffer for the wrap test
1623c97c4fbSSimon Glass  * @scroll_size: Same for the scroll test
1633c97c4fbSSimon Glass  * @return 0 on success
1643c97c4fbSSimon Glass  */
check_vidconsole_output(struct unit_test_state * uts,int rot,int wrap_size,int scroll_size)1653c97c4fbSSimon Glass static int check_vidconsole_output(struct unit_test_state *uts, int rot,
1663c97c4fbSSimon Glass 				   int wrap_size, int scroll_size)
1673c97c4fbSSimon Glass {
1683c97c4fbSSimon Glass 	struct udevice *dev, *con;
1693c97c4fbSSimon Glass 	struct sandbox_sdl_plat *plat;
1703c97c4fbSSimon Glass 	int i;
1713c97c4fbSSimon Glass 
1723c97c4fbSSimon Glass 	ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
1733c97c4fbSSimon Glass 	ut_assert(!device_active(dev));
1743c97c4fbSSimon Glass 	plat = dev_get_platdata(dev);
1753c97c4fbSSimon Glass 	plat->rot = rot;
1763c97c4fbSSimon Glass 
1773c97c4fbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
1783c97c4fbSSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
1793c97c4fbSSimon Glass 	ut_asserteq(46, compress_frame_buffer(dev));
1803c97c4fbSSimon Glass 
1813c97c4fbSSimon Glass 	/* Check display wrap */
1823c97c4fbSSimon Glass 	for (i = 0; i < 120; i++)
1833c97c4fbSSimon Glass 		vidconsole_put_char(con, 'A' + i % 50);
1843c97c4fbSSimon Glass 	ut_asserteq(wrap_size, compress_frame_buffer(dev));
1853c97c4fbSSimon Glass 
1863c97c4fbSSimon Glass 	/* Check display scrolling */
1873c97c4fbSSimon Glass 	for (i = 0; i < SCROLL_LINES; i++) {
1883c97c4fbSSimon Glass 		vidconsole_put_char(con, 'A' + i % 50);
1893c97c4fbSSimon Glass 		vidconsole_put_char(con, '\n');
1903c97c4fbSSimon Glass 	}
1913c97c4fbSSimon Glass 	ut_asserteq(scroll_size, compress_frame_buffer(dev));
1923c97c4fbSSimon Glass 
1933c97c4fbSSimon Glass 	/* If we scroll enough, the screen becomes blank again */
1943c97c4fbSSimon Glass 	for (i = 0; i < SCROLL_LINES; i++)
1953c97c4fbSSimon Glass 		vidconsole_put_char(con, '\n');
1963c97c4fbSSimon Glass 	ut_asserteq(46, compress_frame_buffer(dev));
1973c97c4fbSSimon Glass 
1983c97c4fbSSimon Glass 	return 0;
1993c97c4fbSSimon Glass }
2003c97c4fbSSimon Glass 
2013c97c4fbSSimon Glass /* Test text output through the console uclass */
dm_test_video_context(struct unit_test_state * uts)2023c97c4fbSSimon Glass static int dm_test_video_context(struct unit_test_state *uts)
2033c97c4fbSSimon Glass {
2048df8dad5SSimon Glass 	ut_assertok(select_vidconsole(uts, "vidconsole0"));
2058df8dad5SSimon Glass 	ut_assertok(check_vidconsole_output(uts, 0, 788, 453));
2068df8dad5SSimon Glass 
2078df8dad5SSimon Glass 	return 0;
2083c97c4fbSSimon Glass }
2093c97c4fbSSimon Glass DM_TEST(dm_test_video_context, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
21085e08db8SSimon Glass 
21185e08db8SSimon Glass /* Test rotated text output through the console uclass */
dm_test_video_rotation1(struct unit_test_state * uts)21285e08db8SSimon Glass static int dm_test_video_rotation1(struct unit_test_state *uts)
21385e08db8SSimon Glass {
21485e08db8SSimon Glass 	ut_assertok(check_vidconsole_output(uts, 1, 1112, 680));
21585e08db8SSimon Glass 
21685e08db8SSimon Glass 	return 0;
21785e08db8SSimon Glass }
21885e08db8SSimon Glass DM_TEST(dm_test_video_rotation1, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
21985e08db8SSimon Glass 
22085e08db8SSimon Glass /* Test rotated text output through the console uclass */
dm_test_video_rotation2(struct unit_test_state * uts)22185e08db8SSimon Glass static int dm_test_video_rotation2(struct unit_test_state *uts)
22285e08db8SSimon Glass {
22385e08db8SSimon Glass 	ut_assertok(check_vidconsole_output(uts, 2, 785, 446));
22485e08db8SSimon Glass 
22585e08db8SSimon Glass 	return 0;
22685e08db8SSimon Glass }
22785e08db8SSimon Glass DM_TEST(dm_test_video_rotation2, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
22885e08db8SSimon Glass 
22985e08db8SSimon Glass /* Test rotated text output through the console uclass */
dm_test_video_rotation3(struct unit_test_state * uts)23085e08db8SSimon Glass static int dm_test_video_rotation3(struct unit_test_state *uts)
23185e08db8SSimon Glass {
23285e08db8SSimon Glass 	ut_assertok(check_vidconsole_output(uts, 3, 1134, 681));
23385e08db8SSimon Glass 
23485e08db8SSimon Glass 	return 0;
23585e08db8SSimon Glass }
23685e08db8SSimon Glass DM_TEST(dm_test_video_rotation3, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
237747440d0SSimon Glass 
238747440d0SSimon Glass /* Read a file into memory and return a pointer to it */
read_file(struct unit_test_state * uts,const char * fname,ulong * addrp)239747440d0SSimon Glass static int read_file(struct unit_test_state *uts, const char *fname,
240747440d0SSimon Glass 		     ulong *addrp)
241747440d0SSimon Glass {
242747440d0SSimon Glass 	int buf_size = 100000;
243747440d0SSimon Glass 	ulong addr = 0;
244747440d0SSimon Glass 	int size, fd;
245747440d0SSimon Glass 	char *buf;
246747440d0SSimon Glass 
247747440d0SSimon Glass 	buf = map_sysmem(addr, 0);
248747440d0SSimon Glass 	ut_assert(buf != NULL);
249747440d0SSimon Glass 	fd = os_open(fname, OS_O_RDONLY);
250747440d0SSimon Glass 	ut_assert(fd >= 0);
251747440d0SSimon Glass 	size = os_read(fd, buf, buf_size);
252*a108082dSSimon Glass 	os_close(fd);
253747440d0SSimon Glass 	ut_assert(size >= 0);
254747440d0SSimon Glass 	ut_assert(size < buf_size);
255747440d0SSimon Glass 	*addrp = addr;
256747440d0SSimon Glass 
257747440d0SSimon Glass 	return 0;
258747440d0SSimon Glass }
259747440d0SSimon Glass 
260747440d0SSimon Glass /* Test drawing a bitmap file */
dm_test_video_bmp(struct unit_test_state * uts)261747440d0SSimon Glass static int dm_test_video_bmp(struct unit_test_state *uts)
262747440d0SSimon Glass {
263747440d0SSimon Glass 	struct udevice *dev;
264747440d0SSimon Glass 	ulong addr;
265747440d0SSimon Glass 
266747440d0SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
267747440d0SSimon Glass 	ut_assertok(read_file(uts, "tools/logos/denx.bmp", &addr));
268747440d0SSimon Glass 
269747440d0SSimon Glass 	ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
270747440d0SSimon Glass 	ut_asserteq(1368, compress_frame_buffer(dev));
271747440d0SSimon Glass 
272747440d0SSimon Glass 	return 0;
273747440d0SSimon Glass }
274747440d0SSimon Glass DM_TEST(dm_test_video_bmp, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
275747440d0SSimon Glass 
276747440d0SSimon Glass /* Test drawing a compressed bitmap file */
dm_test_video_bmp_comp(struct unit_test_state * uts)277747440d0SSimon Glass static int dm_test_video_bmp_comp(struct unit_test_state *uts)
278747440d0SSimon Glass {
279747440d0SSimon Glass 	struct udevice *dev;
280747440d0SSimon Glass 	ulong addr;
281747440d0SSimon Glass 
282747440d0SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
283747440d0SSimon Glass 	ut_assertok(read_file(uts, "tools/logos/denx-comp.bmp", &addr));
284747440d0SSimon Glass 
285747440d0SSimon Glass 	ut_assertok(video_bmp_display(dev, addr, 0, 0, false));
286747440d0SSimon Glass 	ut_asserteq(1368, compress_frame_buffer(dev));
287747440d0SSimon Glass 
288747440d0SSimon Glass 	return 0;
289747440d0SSimon Glass }
290747440d0SSimon Glass DM_TEST(dm_test_video_bmp_comp, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
2915674ead7SSimon Glass 
2925674ead7SSimon Glass /* Test TrueType console */
dm_test_video_truetype(struct unit_test_state * uts)2935674ead7SSimon Glass static int dm_test_video_truetype(struct unit_test_state *uts)
2945674ead7SSimon Glass {
2955674ead7SSimon Glass 	struct udevice *dev, *con;
2965674ead7SSimon Glass 	const char *test_string = "Criticism may not be agreeable, but it is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things. Some see private enterprise as a predatory target to be shot, others as a cow to be milked, but few are those who see it as a sturdy horse pulling the wagon. The \aprice OF\b\bof greatness\n\tis responsibility.\n\nBye";
2975674ead7SSimon Glass 	const char *s;
2985674ead7SSimon Glass 
2995674ead7SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
3005674ead7SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
3015674ead7SSimon Glass 	for (s = test_string; *s; s++)
3025674ead7SSimon Glass 		vidconsole_put_char(con, *s);
3035674ead7SSimon Glass 	ut_asserteq(12619, compress_frame_buffer(dev));
3045674ead7SSimon Glass 
3055674ead7SSimon Glass 	return 0;
3065674ead7SSimon Glass }
3075674ead7SSimon Glass DM_TEST(dm_test_video_truetype, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
3085674ead7SSimon Glass 
3095674ead7SSimon Glass /* Test scrolling TrueType console */
dm_test_video_truetype_scroll(struct unit_test_state * uts)3105674ead7SSimon Glass static int dm_test_video_truetype_scroll(struct unit_test_state *uts)
3115674ead7SSimon Glass {
3125674ead7SSimon Glass 	struct sandbox_sdl_plat *plat;
3135674ead7SSimon Glass 	struct udevice *dev, *con;
3145674ead7SSimon Glass 	const char *test_string = "Criticism may not be agreeable, but it is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things. Some see private enterprise as a predatory target to be shot, others as a cow to be milked, but few are those who see it as a sturdy horse pulling the wagon. The \aprice OF\b\bof greatness\n\tis responsibility.\n\nBye";
3155674ead7SSimon Glass 	const char *s;
3165674ead7SSimon Glass 
3175674ead7SSimon Glass 	ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
3185674ead7SSimon Glass 	ut_assert(!device_active(dev));
3195674ead7SSimon Glass 	plat = dev_get_platdata(dev);
3205674ead7SSimon Glass 	plat->font_size = 100;
3215674ead7SSimon Glass 
3225674ead7SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
3235674ead7SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
3245674ead7SSimon Glass 	for (s = test_string; *s; s++)
3255674ead7SSimon Glass 		vidconsole_put_char(con, *s);
3265674ead7SSimon Glass 	ut_asserteq(33849, compress_frame_buffer(dev));
3275674ead7SSimon Glass 
3285674ead7SSimon Glass 	return 0;
3295674ead7SSimon Glass }
3305674ead7SSimon Glass DM_TEST(dm_test_video_truetype_scroll, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
3315674ead7SSimon Glass 
3325674ead7SSimon Glass /* Test TrueType backspace, within and across lines */
dm_test_video_truetype_bs(struct unit_test_state * uts)3335674ead7SSimon Glass static int dm_test_video_truetype_bs(struct unit_test_state *uts)
3345674ead7SSimon Glass {
3355674ead7SSimon Glass 	struct sandbox_sdl_plat *plat;
3365674ead7SSimon Glass 	struct udevice *dev, *con;
3375674ead7SSimon Glass 	const char *test_string = "...Criticism may or may\b\b\b\b\b\bnot be agreeable, but seldom it is necessary\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\bit is necessary. It fulfils the same function as pain in the human body. It calls attention to an unhealthy state of things.";
3385674ead7SSimon Glass 	const char *s;
3395674ead7SSimon Glass 
3405674ead7SSimon Glass 	ut_assertok(uclass_find_device(UCLASS_VIDEO, 0, &dev));
3415674ead7SSimon Glass 	ut_assert(!device_active(dev));
3425674ead7SSimon Glass 	plat = dev_get_platdata(dev);
3435674ead7SSimon Glass 	plat->font_size = 100;
3445674ead7SSimon Glass 
3455674ead7SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO, 0, &dev));
3465674ead7SSimon Glass 	ut_assertok(uclass_get_device(UCLASS_VIDEO_CONSOLE, 0, &con));
3475674ead7SSimon Glass 	for (s = test_string; *s; s++)
3485674ead7SSimon Glass 		vidconsole_put_char(con, *s);
3495674ead7SSimon Glass 	ut_asserteq(34871, compress_frame_buffer(dev));
3505674ead7SSimon Glass 
3515674ead7SSimon Glass 	return 0;
3525674ead7SSimon Glass }
3535674ead7SSimon Glass DM_TEST(dm_test_video_truetype_bs, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
354