FreeCalypso > hg > freecalypso-tools
diff target-utils/lunadrv/lcdout.c @ 700:db9a8e88e63f
target-utils lunadrv program written, compiles
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 07 May 2020 02:19:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/target-utils/lunadrv/lcdout.c Thu May 07 02:19:51 2020 +0000 @@ -0,0 +1,106 @@ +/* + * 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++; +}