FreeCalypso > hg > freecalypso-tools
annotate target-utils/lunadrv/lcdout.c @ 778:3ba64341137b
simagent: bare Tx works with extra delays
| author | Mychaela Falconia <falcon@freecalypso.org> | 
|---|---|
| date | Sat, 13 Mar 2021 19:31:53 +0000 | 
| parents | db9a8e88e63f | 
| children | 
| rev | line source | 
|---|---|
| 700 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 1 /* | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 2 * Generic LCD output operations are implemented here. All of the basic | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 3 * LCD controller registers needed for these operations are the same | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 4 * between ILI9225, ILI9225G and ST7775R controllers. | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 5 */ | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 6 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 7 #include <sys/types.h> | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 8 #include "types.h" | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 9 #include "luna.h" | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 10 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 11 set_lcd_addr_region(xstart, xend, ystart, yend) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 12 { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 13 /* set window area */ | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 14 LCD_REG_WR(0x36, xend); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 15 LCD_REG_WR(0x37, xstart); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 16 LCD_REG_WR(0x38, yend); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 17 LCD_REG_WR(0x39, ystart); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 18 /* set current write address */ | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 19 LCD_REG_WR(0x20, xstart); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 20 LCD_REG_WR(0x21, ystart); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 21 /* set up for GRAM write */ | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 22 LCD_IR = 0x22; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 23 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 24 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 25 void | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 26 cmd_fill(argbulk) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 27 char *argbulk; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 28 { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 29 char *argv[2]; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 30 u_long pixval; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 31 unsigned n; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 32 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 33 if (parse_args(argbulk, 1, 1, argv, 0) < 0) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 34 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 35 if (parse_hexarg(argv[0], 4, &pixval) < 0) { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 36 printf("ERROR: arg must be a valid 16-bit hex value\n"); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 37 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 38 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 39 set_lcd_addr_region(0, 175, 0, 219); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 40 for (n = 0; n < 176 * 220; n++) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 41 LCD_DR = pixval; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 42 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 43 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 44 void | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 45 cmd_rect(argbulk) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 46 char *argbulk; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 47 { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 48 char *argv[6]; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 49 u_long pixval; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 50 int xstart, xend, ystart, yend; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 51 int npix; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 52 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 53 if (parse_args(argbulk, 5, 5, argv, 0) < 0) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 54 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 55 xstart = atoi(argv[0]); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 56 if (xstart < 0 || xstart > 175) { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 57 range_err: printf("ERROR: coordinate arg out of range\n"); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 58 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 59 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 60 xend = atoi(argv[1]); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 61 if (xend < 0 || xend > 175) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 62 goto range_err; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 63 ystart = atoi(argv[2]); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 64 if (ystart < 0 || ystart > 219) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 65 goto range_err; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 66 yend = atoi(argv[3]); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 67 if (yend < 0 || yend > 219) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 68 goto range_err; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 69 if (xend < xstart || yend < ystart) { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 70 printf("ERROR: negative range\n"); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 71 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 72 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 73 if (parse_hexarg(argv[4], 4, &pixval) < 0) { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 74 printf("ERROR: pixel arg must be a valid 16-bit hex value\n"); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 75 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 76 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 77 set_lcd_addr_region(xstart, xend, ystart, yend); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 78 npix = (xend + 1 - xstart) * (yend + 1 - ystart); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 79 while (npix--) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 80 LCD_DR = pixval; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 81 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 82 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 83 void | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 84 cmd_mem2lcd(argbulk) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 85 char *argbulk; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 86 { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 87 char *argv[2]; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 88 u_long addr; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 89 const u16 *rdmem; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 90 unsigned n; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 91 | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 92 if (parse_args(argbulk, 1, 1, argv, 0) < 0) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 93 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 94 if (parse_hexarg(argv[0], 8, &addr) < 0) { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 95 printf("ERROR: argument must be a valid 32-bit hex address\n"); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 96 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 97 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 98 if (addr & 1) { | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 99 printf("ERROR: unaligned address\n"); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 100 return; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 101 } | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 102 rdmem = (const u16 *) addr; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 103 set_lcd_addr_region(0, 175, 0, 219); | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 104 for (n = 0; n < 176 * 220; n++) | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 105 LCD_DR = *rdmem++; | 
| 
db9a8e88e63f
target-utils lunadrv program written, compiles
 Mychaela Falconia <falcon@freecalypso.org> parents: diff
changeset | 106 } | 
