Subversion Repositories freemyipod

Rev

Rev 273 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 273 Rev 278
Line 25... Line 25...
25
#include "thread.h"
25
#include "thread.h"
26
#include "s5l8702.h"
26
#include "s5l8702.h"
27
#include "util.h"
27
#include "util.h"
28
 
28
 
29
 
29
 
30
static struct dma_lli
-
 
31
{
-
 
32
    void* srcaddr;
-
 
33
    void* dstaddr;
-
 
34
    struct dma_lli* nextlli;
30
static struct dma_lli lcd_lli[(LCD_WIDTH * LCD_HEIGHT - 1) / 0xfff]
35
    uint32_t control;
-
 
36
} lcd_lli[(LCD_WIDTH * LCD_HEIGHT - 1) / 0xfff] IDATA_ATTR __attribute__((aligned(16)));
31
    IDATA_ATTR __attribute__((aligned(16)));
37
 
32
 
38
static uint16_t lcd_color IDATA_ATTR;
33
static uint16_t lcd_color IDATA_ATTR;
39
 
34
 
40
 
35
 
41
void lcd_init()
36
void lcd_init()
Line 126... Line 121...
126
        lcd_send_data(endy >> 8);
121
        lcd_send_data(endy >> 8);
127
        lcd_send_data(endy & 0xff);
122
        lcd_send_data(endy & 0xff);
128
        lcd_send_cmd(0x2c);
123
        lcd_send_cmd(0x2c);
129
    }
124
    }
130
    int pixels = (endx - startx + 1) * (endy - starty + 1);
125
    int pixels = (endx - startx + 1) * (endy - starty + 1);
-
 
126
    if (pixels <= 0) return;
131
    int i;
127
    int i;
132
    bool solid = (int)data == -1;
128
    bool solid = (int)data == -1;
133
    bool last = !ARRAYLEN(lcd_lli) || pixels <= 0xfff;
-
 
134
    if (solid) lcd_color = color;
129
    if (solid) lcd_color = color;
135
    DMAC0C0SRCADDR = solid ? &lcd_color : data;
-
 
136
    DMAC0C0DESTADDR = (void*)((int)&LCDWDATA);
-
 
137
    DMAC0C0LLI = last ? (void*)0 : lcd_lli;
-
 
138
    DMAC0C0CONTROL = 0x70240000 | (last ? pixels : 0xfff)
-
 
139
                   | (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
-
 
140
    void* origdata=data;
-
 
141
    data = (void*)(((uint32_t)data) + 0x1ffe);
-
 
142
    for (i = 0, pixels -= 0xfff; i < ARRAYLEN(lcd_lli) && pixels > 0; i++, pixels -= 0xfff)
130
    for (i = -1; i < (int)ARRAYLEN(lcd_lli) && pixels > 0; i++, pixels -= 0xfff)
143
    {
131
    {
144
        last = i + 1 >= ARRAYLEN(lcd_lli) || pixels <= 0xfff;
132
        bool last = i + 1 >= ARRAYLEN(lcd_lli) || pixels <= 0xfff;
-
 
133
        struct dma_lli* lli = i < 0 ? (struct dma_lli*)((int)&DMAC0C0LLI) : &lcd_lli[i];
145
        lcd_lli[i].srcaddr = solid ? &lcd_color : data;
134
        lli->srcaddr = solid ? &lcd_color : data;
146
        lcd_lli[i].dstaddr = (void*)((int)&LCDWDATA);
135
        lli->dstaddr = (void*)((int)&LCDWDATA);
147
        lcd_lli[i].nextlli = last ? (void*)0 : &lcd_lli[i + 1];
136
        lli->nextlli = last ? NULL : &lcd_lli[i + 1];
148
        lcd_lli[i].control = 0x70240000 | (last ? pixels : 0xfff)
137
        lli->control = 0x70240000 | (last ? pixels : 0xfff)
149
                           | (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
138
                     | (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
150
        data = (void*)(((uint32_t)data) + 0x1ffe);
139
        data = (void*)(((uint32_t)data) + 0x1ffe);
151
    }
140
    }
152
    clean_dcache();
141
    clean_dcache();
153
    DMAC0C0CONFIG = 0x88c1;
142
    DMAC0C0CONFIG = 0x88c1;
154
}
143
}