1.1 --- a/stage2/lcd.c Mon Jan 25 18:01:52 2016 +0100
1.2 +++ b/stage2/lcd.c Mon Jan 25 18:04:21 2016 +0100
1.3 @@ -33,49 +33,89 @@
1.4
1.5 extern vidinfo_t panel_info;
1.6 static unsigned long lcd_base;
1.7 -unsigned long irq_counter = 0;
1.8
1.9 -void test_pixel(unsigned short h, unsigned short v)
1.10 +static unsigned int get_line_length()
1.11 +{
1.12 + return ALIGN((panel_info.vl_col * NBITS(panel_info.vl_bpix)) / 8, sizeof(u32));
1.13 +}
1.14 +
1.15 +static u32 *get_pixel32(unsigned short h, unsigned short v)
1.16 {
1.17 - unsigned short v_max = panel_info.vl_row;
1.18 - unsigned short h_max = panel_info.vl_col;
1.19 - unsigned long *pix = (unsigned long *)lcd_base + v * h_max + h;
1.20 + return (u32 *) (lcd_base + v * get_line_length()) + h;
1.21 +}
1.22
1.23 - /* NOTE: Code assumes 32 bits/pixel. */
1.24 -#ifdef NORMAL
1.25 +static u16 *get_pixel16(unsigned short h, unsigned short v)
1.26 +{
1.27 + return (u16 *) (lcd_base + v * get_line_length()) + h;
1.28 +}
1.29 +
1.30 +static void test_pixel32(unsigned short h, unsigned short v)
1.31 +{
1.32 + unsigned short v_max = panel_info.vl_row;
1.33 + unsigned short h_max = panel_info.vl_col;
1.34 + u32 *pix = get_pixel32(h, v);
1.35 +
1.36 *pix = (
1.37 (((255 * (h_max - h)) / (h_max - 1)) << 16) +
1.38 ((((255 * h) / (h_max - 1) + (255 * (v_max - v)) / (v_max - 1)) / 2) << 8) +
1.39 ((255 * v) / (v_max - 1))
1.40 );
1.41 -#elif HANDLER
1.42 - unsigned short offset, bit;
1.43 - bit = 31 - (32 * h / (h_max - 1));
1.44 - offset = v / 4;
1.45 - *pix = ((*((unsigned long *) 0x80000200 + offset) & (1 << bit)) >> bit) ? 0xffffffff : 0;
1.46 -#else
1.47 - unsigned short bit;
1.48 - volatile unsigned int cp0_register;
1.49 - asm volatile(
1.50 - "mfc0 %0, $12\n"
1.51 - "nop"
1.52 - : "=r"(cp0_register)
1.53 +}
1.54 +
1.55 +static void test_pixel16_565(unsigned short h, unsigned short v)
1.56 +{
1.57 + unsigned short v_max = panel_info.vl_row;
1.58 + unsigned short h_max = panel_info.vl_col;
1.59 + u16 *pix = get_pixel16(h, v);
1.60 +
1.61 + *pix = (
1.62 + (((31 * (h_max - h)) / (h_max - 1)) << 11) +
1.63 + ((((63 * h) / (h_max - 1) + (63 * (v_max - v)) / (v_max - 1)) / 2) << 5) +
1.64 + ((31 * v) / (v_max - 1))
1.65 );
1.66 - bit = 31 - (32 * h / (h_max - 1));
1.67 - *pix = (((cp0_register & (1 << bit)) >> bit) ? 0x007f0000 : 0x0000001f) * ((bit % 2) ? 2 : 1);
1.68 - /* *pix = (((irq_counter & (1 << bit)) >> bit) ? 0x007f0000 : 0x0000001f) * ((bit % 2) ? 2 : 1); */
1.69 -#endif
1.70 +}
1.71 +
1.72 +void test_pixel(unsigned short h, unsigned short v)
1.73 +{
1.74 + switch (panel_info.vl_bpix)
1.75 + {
1.76 + case LCD_COLOR32:
1.77 + test_pixel32(h, v);
1.78 + break;
1.79 +
1.80 + default:
1.81 + test_pixel16_565(h, v);
1.82 + break;
1.83 + }
1.84 +}
1.85 +
1.86 +void clear_pixel32(unsigned short h, unsigned short v)
1.87 +{
1.88 + u32 *pix = get_pixel32(h, v);
1.89 + *pix = 0;
1.90 +}
1.91 +
1.92 +void clear_pixel16(unsigned short h, unsigned short v)
1.93 +{
1.94 + u16 *pix = get_pixel16(h, v);
1.95 + *pix = 0;
1.96 }
1.97
1.98 void clear_pixel(unsigned short h, unsigned short v)
1.99 {
1.100 - unsigned short h_max = panel_info.vl_col;
1.101 - unsigned long *pix = (unsigned long *)lcd_base + v * h_max + h;
1.102 + switch (panel_info.vl_bpix)
1.103 + {
1.104 + case LCD_COLOR32:
1.105 + clear_pixel32(h, v);
1.106 + break;
1.107
1.108 - *pix = 0;
1.109 + default:
1.110 + clear_pixel16(h, v);
1.111 + break;
1.112 + }
1.113 }
1.114
1.115 -void test_pattern(void *lcd_base)
1.116 +void test_pattern()
1.117 {
1.118 unsigned short v_max = panel_info.vl_row;
1.119 unsigned short h_max = panel_info.vl_col;