Subversion Repositories freemyipod

Rev

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

Rev 268 Rev 278
Line 25... Line 25...
25
#include "thread.h"
25
#include "thread.h"
26
#include "s5l8720.h"
26
#include "s5l8720.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 100... Line 95...
100
    lcd_send_data(((endy & 0x7f00) << 1) | (endy & 0xff));
95
    lcd_send_data(((endy & 0x7f00) << 1) | (endy & 0xff));
101
    lcd_send_cmd(0x2c);
96
    lcd_send_cmd(0x2c);
102
    int pixels = (endx - startx + 1) * (endy - starty + 1);
97
    int pixels = (endx - startx + 1) * (endy - starty + 1);
103
    int i;
98
    int i;
104
    bool solid = (int)data == -1;
99
    bool solid = (int)data == -1;
105
    bool last = !ARRAYLEN(lcd_lli) || pixels <= 0xfff;
-
 
106
    if (solid) lcd_color = color;
100
    if (solid) lcd_color = color;
107
    DMAC0C0SRCADDR = solid ? &lcd_color : data;
-
 
108
    DMAC0C0DESTADDR = (void*)((int)&LCDWDATA);
-
 
109
    DMAC0C0LLI = last ? (void*)0 : lcd_lli;
-
 
110
    DMAC0C0CONTROL = 0x70240000 | (last ? pixels : 0xfff)
-
 
111
                   | (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
-
 
112
    void* origdata=data;
-
 
113
    data = (void*)(((uint32_t)data) + 0x1ffe);
-
 
114
    for (i = 0, pixels -= 0xfff; i < ARRAYLEN(lcd_lli) && pixels > 0; i++, pixels -= 0xfff)
101
    for (i = -1; i < (int)ARRAYLEN(lcd_lli) && pixels > 0; i++, pixels -= 0xfff)
115
    {
102
    {
116
        last = i + 1 >= ARRAYLEN(lcd_lli) || pixels <= 0xfff;
103
        bool last = i + 1 >= ARRAYLEN(lcd_lli) || pixels <= 0xfff;
-
 
104
        struct dma_lli* lli = i < 0 ? (struct dma_lli*)((int)&DMAC0C0LLI) : &lcd_lli[i];
117
        lcd_lli[i].srcaddr = solid ? &lcd_color : data;
105
        lli->srcaddr = solid ? &lcd_color : data;
118
        lcd_lli[i].dstaddr = (void*)((int)&LCDWDATA);
106
        lli->dstaddr = (void*)((int)&LCDWDATA);
119
        lcd_lli[i].nextlli = last ? (void*)0 : &lcd_lli[i + 1];
107
        lli->nextlli = last ? NULL : &lcd_lli[i + 1];
120
        lcd_lli[i].control = 0x70240000 | (last ? pixels : 0xfff)
108
        lli->control = 0x70240000 | (last ? pixels : 0xfff)
121
                           | (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
109
                     | (last ? 0x80000000 : 0) | (solid ? 0 : 0x4000000);
122
        data = (void*)(((uint32_t)data) + 0x1ffe);
110
        data = (void*)(((uint32_t)data) + 0x1ffe);
123
    }
111
    }
124
    clean_dcache();
112
    clean_dcache();
125
    DMAC0C0CONFIG = 0x88c1;
113
    DMAC0C0CONFIG = 0x88c1;
126
}
114
}