view target-utils/lunadrv/lcdout.c @ 752:c79aaed75bd8

compile-fc-batt: allow possible third field in source lines Battery tables maintained in the fc-battery-conf repository will now have a third field added, defining thresholds for the battery bars icon, and there will be a new utility to compile them into the new /etc/batterytab2 file read by the FC Tourmaline version of our FCHG driver. For backward compatibility with the original Magnetite version of FCHG, compile-fc-batt remains the tool for compiling the original /etc/batterytab file format, and it needs to ignore the newly added third field in battery table sources.
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 05 Nov 2020 20:37:55 +0000
parents db9a8e88e63f
children
line wrap: on
line source

/*
 * Generic LCD output operations are implemented here.  All of the basic
 * LCD controller registers needed for these operations are the same
 * between ILI9225, ILI9225G and ST7775R controllers.
 */

#include <sys/types.h>
#include "types.h"
#include "luna.h"

set_lcd_addr_region(xstart, xend, ystart, yend)
{
	/* set window area */
	LCD_REG_WR(0x36, xend);
	LCD_REG_WR(0x37, xstart);
	LCD_REG_WR(0x38, yend);
	LCD_REG_WR(0x39, ystart);
	/* set current write address */
	LCD_REG_WR(0x20, xstart);
	LCD_REG_WR(0x21, ystart);
	/* set up for GRAM write */
	LCD_IR = 0x22;
}

void
cmd_fill(argbulk)
	char *argbulk;
{
	char *argv[2];
	u_long pixval;
	unsigned n;

	if (parse_args(argbulk, 1, 1, argv, 0) < 0)
		return;
	if (parse_hexarg(argv[0], 4, &pixval) < 0) {
		printf("ERROR: arg must be a valid 16-bit hex value\n");
		return;
	}
	set_lcd_addr_region(0, 175, 0, 219);
	for (n = 0; n < 176 * 220; n++)
		LCD_DR = pixval;
}

void
cmd_rect(argbulk)
	char *argbulk;
{
	char *argv[6];
	u_long pixval;
	int xstart, xend, ystart, yend;
	int npix;

	if (parse_args(argbulk, 5, 5, argv, 0) < 0)
		return;
	xstart = atoi(argv[0]);
	if (xstart < 0 || xstart > 175) {
range_err:	printf("ERROR: coordinate arg out of range\n");
		return;
	}
	xend = atoi(argv[1]);
	if (xend < 0 || xend > 175)
		goto range_err;
	ystart = atoi(argv[2]);
	if (ystart < 0 || ystart > 219)
		goto range_err;
	yend = atoi(argv[3]);
	if (yend < 0 || yend > 219)
		goto range_err;
	if (xend < xstart || yend < ystart) {
		printf("ERROR: negative range\n");
		return;
	}
	if (parse_hexarg(argv[4], 4, &pixval) < 0) {
		printf("ERROR: pixel arg must be a valid 16-bit hex value\n");
		return;
	}
	set_lcd_addr_region(xstart, xend, ystart, yend);
	npix = (xend + 1 - xstart) * (yend + 1 - ystart);
	while (npix--)
		LCD_DR = pixval;
}

void
cmd_mem2lcd(argbulk)
	char *argbulk;
{
	char *argv[2];
	u_long addr;
	const u16 *rdmem;
	unsigned n;

	if (parse_args(argbulk, 1, 1, argv, 0) < 0)
		return;
	if (parse_hexarg(argv[0], 8, &addr) < 0) {
		printf("ERROR: argument must be a valid 32-bit hex address\n");
		return;
	}
	if (addr & 1) {
		printf("ERROR: unaligned address\n");
		return;
	}
	rdmem = (const u16 *) addr;
	set_lcd_addr_region(0, 175, 0, 219);
	for (n = 0; n < 176 * 220; n++)
		LCD_DR = *rdmem++;
}