| Index: emcore/trunk/drawing.S | 
| — | — | @@ -157,8 +157,8 @@ | 
| 158 | 158 | bne	renderchar_x | 
| 159 | 159 | ldmfd	sp!, {r4-r9,pc} | 
| 160 | 160 |  | 
|  | 161 | +renderchar_native: | 
| 161 | 162 | #if (LCD_BYTESPERPIXEL == 2) | 
| 162 |  | -renderchar_native:
 | 
| 163 | 163 | stmfd	sp!, {r4-r7,lr} | 
| 164 | 164 | ldr	r7, [sp,#0x14] | 
| 165 | 165 | cmn	r2, #1 | 
| — | — | @@ -224,8 +224,49 @@ | 
| 225 | 225 | add	r0, r0, #2 | 
| 226 | 226 | ldmfd	sp!, {r4-r7,pc} | 
| 227 | 227 | #else | 
|  | 228 | +#if (LCD_BYTESPERPIXEL == 4) | 
|  | 229 | + | 
|  | 230 | +	stmfd	sp!, {r4-r7,lr} | 
|  | 231 | +	ldr	r7, [sp,#0x14] | 
|  | 232 | +	cmn	r2, #1 | 
|  | 233 | +	beq	renderchar_native_nobg | 
|  | 234 | +	mov	r6, r0 | 
|  | 235 | +	mov	r4, #8 | 
|  | 236 | +renderchar_native_opaquerow: | 
|  | 237 | +	mov	r5, #6 | 
|  | 238 | +renderchar_native_opaquecol: | 
|  | 239 | +	str	r2, [r6], #4 | 
|  | 240 | +	subs	r5, r5, #1 | 
|  | 241 | +	bne	renderchar_native_opaquecol | 
|  | 242 | +	add	r6, r6, r7,lsl#1 | 
|  | 243 | +	sub	r6, r6, #12 | 
|  | 244 | +	subs	r4, r4, #1 | 
|  | 245 | +	bne	renderchar_native_opaquerow | 
|  | 246 | +renderchar_native_nobg: | 
|  | 247 | +	adr	r5, renderchar_font | 
|  | 248 | +	sub	r3, r3, #0x20 | 
|  | 249 | +	cmp	r3, #0x5f | 
|  | 250 | +	addcc	r5, r3,lsl#2 | 
|  | 251 | +	addcc	r5, r3 | 
|  | 252 | +	mov	r3, #5 | 
|  | 253 | +renderchar_native_col: | 
|  | 254 | +	mov	r6, r0 | 
|  | 255 | +	ldrb	r4, [r5], #1 | 
|  | 256 | +renderchar_native_row: | 
|  | 257 | +	tst	r4, #1 | 
|  | 258 | +	strne	r1, [r6] | 
|  | 259 | +	add	r6, r6, r7,lsl#2 | 
|  | 260 | +	movs	r4, r4,lsr#1 | 
|  | 261 | +	bne	renderchar_native_row | 
|  | 262 | +	add	r0, r0, #4 | 
|  | 263 | +	subs	r3, r3, #1 | 
|  | 264 | +	bne	renderchar_native_col | 
|  | 265 | +	add	r0, r0, #4 | 
|  | 266 | +	ldmfd	sp!, {r4-r7,pc} | 
|  | 267 | +#else | 
| 228 | 268 | #error Unknown number of bytes per pixel! | 
| 229 | 269 | #endif | 
|  | 270 | +#endif | 
| 230 | 271 |  | 
| 231 | 272 | renderchar_font: | 
| 232 | 273 | .byte 0, 0, 0, 0, 0 | 
| Index: emcore/trunk/TARGETS | 
| — | — | @@ -2,3 +2,4 @@ | 
| 3 | 3 | ipodnano3g | 
| 4 | 4 | ipodnano4g | 
| 5 | 5 | ipodclassic | 
|  | 6 | +ipodtouch2g | 
| Index: emcore/trunk/target/ipodtouch2g/lcd.c | 
| — | — | @@ -0,0 +1,156 @@ | 
|  | 2 | +// | 
|  | 3 | +// | 
|  | 4 | +//    Copyright 2011 TheSeven | 
|  | 5 | +// | 
|  | 6 | +// | 
|  | 7 | +//    This file is part of emCORE. | 
|  | 8 | +// | 
|  | 9 | +//    emCORE is free software: you can redistribute it and/or | 
|  | 10 | +//    modify it under the terms of the GNU General Public License as | 
|  | 11 | +//    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +//    License, or (at your option) any later version. | 
|  | 13 | +// | 
|  | 14 | +//    emCORE is distributed in the hope that it will be useful, | 
|  | 15 | +//    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +//    See the GNU General Public License for more details. | 
|  | 18 | +// | 
|  | 19 | +//    You should have received a copy of the GNU General Public License along | 
|  | 20 | +//    with emCORE.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +// | 
|  | 22 | +// | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +#include "global.h" | 
|  | 26 | +#include "thread.h" | 
|  | 27 | +#include "util.h" | 
|  | 28 | +#include "lcd.h" | 
|  | 29 | + | 
|  | 30 | + | 
|  | 31 | +static struct mutex lcd_mutex IDATA_ATTR; | 
|  | 32 | +#define fb ((uint32_t*)0x0fc00000) | 
|  | 33 | + | 
|  | 34 | + | 
|  | 35 | +void lcd_init() | 
|  | 36 | +{ | 
|  | 37 | +    mutex_init(&lcd_mutex); | 
|  | 38 | +} | 
|  | 39 | + | 
|  | 40 | +int lcd_get_width() | 
|  | 41 | +{ | 
|  | 42 | +    return LCD_WIDTH; | 
|  | 43 | +} | 
|  | 44 | + | 
|  | 45 | +int lcd_get_height() | 
|  | 46 | +{ | 
|  | 47 | +    return LCD_HEIGHT; | 
|  | 48 | +} | 
|  | 49 | + | 
|  | 50 | +int lcd_get_bytes_per_pixel() | 
|  | 51 | +{ | 
|  | 52 | +    return LCD_BYTESPERPIXEL; | 
|  | 53 | +} | 
|  | 54 | + | 
|  | 55 | +int lcd_get_format() | 
|  | 56 | +{ | 
|  | 57 | +    return LCD_FORMAT; | 
|  | 58 | +} | 
|  | 59 | + | 
|  | 60 | +void lcd_shutdown() | 
|  | 61 | +{ | 
|  | 62 | +} | 
|  | 63 | + | 
|  | 64 | +bool displaylcd_busy() ICODE_ATTR; | 
|  | 65 | +bool displaylcd_busy() | 
|  | 66 | +{ | 
|  | 67 | +    return false; | 
|  | 68 | +} | 
|  | 69 | + | 
|  | 70 | +void displaylcd_sync() ICODE_ATTR; | 
|  | 71 | +void displaylcd_sync() | 
|  | 72 | +{ | 
|  | 73 | +} | 
|  | 74 | + | 
|  | 75 | +void displaylcd_native(unsigned int startx, unsigned int endx, | 
|  | 76 | +                       unsigned int starty, unsigned int endy, void* data) | 
|  | 77 | +{ | 
|  | 78 | +    mutex_lock(&lcd_mutex, TIMEOUT_BLOCK); | 
|  | 79 | +    displaylcd_safe_native(startx, endx, starty, endy, data); | 
|  | 80 | +    mutex_unlock(&lcd_mutex); | 
|  | 81 | +} | 
|  | 82 | + | 
|  | 83 | +void displaylcd_safe_native(unsigned int startx, unsigned int endx, | 
|  | 84 | +                            unsigned int starty, unsigned int endy, void* data) | 
|  | 85 | +{ | 
|  | 86 | +    int pixels = (endx - startx + 1) * (endy - starty + 1); | 
|  | 87 | +    if (pixels <= 0) return; | 
|  | 88 | +    uint32_t* ptr = &fb[starty * LCD_WIDTH + startx]; | 
|  | 89 | +    int rows = endy - starty + 1; | 
|  | 90 | +    int rowsize = (endx - startx + 1) * 4; | 
|  | 91 | +    while (rows--) | 
|  | 92 | +    { | 
|  | 93 | +        memcpy(ptr, data, rowsize); | 
|  | 94 | +        ptr += LCD_WIDTH; | 
|  | 95 | +        data += rowsize; | 
|  | 96 | +    } | 
|  | 97 | +} | 
|  | 98 | + | 
|  | 99 | +void filllcd_native(unsigned int startx, unsigned int endx, | 
|  | 100 | +                    unsigned int starty, unsigned int endy, int color) | 
|  | 101 | +{ | 
|  | 102 | +    int pixels = (endx - startx + 1) * (endy - starty + 1); | 
|  | 103 | +    if (pixels <= 0) return; | 
|  | 104 | +    uint32_t* ptr = &fb[starty * LCD_WIDTH + startx]; | 
|  | 105 | +    int rows = endy - starty + 1; | 
|  | 106 | +    int rowsize = (endx - startx + 1) * 4; | 
|  | 107 | +    while (rows--) | 
|  | 108 | +    { | 
|  | 109 | +        int i; | 
|  | 110 | +        for (i = 0; i < rowsize; i += 4) fb[i] = color; | 
|  | 111 | +        ptr += LCD_WIDTH; | 
|  | 112 | +    } | 
|  | 113 | +    mutex_unlock(&lcd_mutex); | 
|  | 114 | +} | 
|  | 115 | + | 
|  | 116 | +void displaylcd(unsigned int x, unsigned int y, unsigned int width, unsigned int height, | 
|  | 117 | +                void* data, unsigned int datax, unsigned int datay, unsigned int stride) | 
|  | 118 | +{ | 
|  | 119 | +    if (width * height <= 0) return; | 
|  | 120 | +    mutex_lock(&lcd_mutex, TIMEOUT_BLOCK); | 
|  | 121 | +    uint32_t* ptr = &fb[y * LCD_WIDTH + x]; | 
|  | 122 | +    uint8_t* inptr = &((uint8_t*)data)[datay * stride + datax]; | 
|  | 123 | +    int rowsize = stride * 3; | 
|  | 124 | +    while (height--) | 
|  | 125 | +    { | 
|  | 126 | +        int pixels = width; | 
|  | 127 | +        uint8_t* ip = inptr; | 
|  | 128 | +        uint32_t* op = ptr; | 
|  | 129 | +        while (pixels--) | 
|  | 130 | +        { | 
|  | 131 | +            uint32_t value = *ip++ << 16; | 
|  | 132 | +            value |= *ip++ << 8; | 
|  | 133 | +            value |= *ip++; | 
|  | 134 | +            *op++ = value; | 
|  | 135 | +        } | 
|  | 136 | +        inptr += rowsize; | 
|  | 137 | +        ptr += LCD_WIDTH; | 
|  | 138 | +    } | 
|  | 139 | +    mutex_unlock(&lcd_mutex); | 
|  | 140 | +} | 
|  | 141 | + | 
|  | 142 | +void filllcd(unsigned int x, unsigned int y, unsigned int width, unsigned int height, int color) | 
|  | 143 | +{ | 
|  | 144 | +    filllcd_native(x, y, width, height, color); | 
|  | 145 | +} | 
|  | 146 | + | 
|  | 147 | +int lcd_translate_color(uint8_t alpha, uint8_t red, uint8_t green, uint8_t blue) | 
|  | 148 | +    ICODE_ATTR __attribute__((naked, noinline)); | 
|  | 149 | +int lcd_translate_color(uint8_t alpha, uint8_t red, uint8_t green, uint8_t blue) | 
|  | 150 | +{ | 
|  | 151 | +    asm volatile( | 
|  | 152 | +        "orr r0, r3, r0,lsl#24 \n\t" | 
|  | 153 | +        "orr r1, r2, r1,lsl#8  \n\t" | 
|  | 154 | +        "orr r0, r0, r1,lsl#8  \n\t" | 
|  | 155 | +        "mov pc, lr            \n\t" | 
|  | 156 | +    ); | 
|  | 157 | +} | 
| Index: emcore/trunk/target/ipodtouch2g/ls.x | 
| — | — | @@ -0,0 +1,101 @@ | 
|  | 2 | +ENTRY(__start) | 
|  | 3 | +OUTPUT_FORMAT(elf32-littlearm) | 
|  | 4 | +OUTPUT_ARCH(arm) | 
|  | 5 | +STARTUP(build/ipodtouch2g/target/ipodtouch2g/crt0.o) | 
|  | 6 | + | 
|  | 7 | +MEMORY | 
|  | 8 | +{ | 
|  | 9 | +    INIT : ORIGIN = 0x09000000, LENGTH = 0x06b00000 | 
|  | 10 | +    SRAM : ORIGIN = 0x22000000, LENGTH = 0x00100000 | 
|  | 11 | +    SDRAM : ORIGIN = 0x0fb00000, LENGTH = 0x00100000 | 
|  | 12 | +} | 
|  | 13 | + | 
|  | 14 | +SECTIONS | 
|  | 15 | +{ | 
|  | 16 | +    .inithead : | 
|  | 17 | +    { | 
|  | 18 | +        _initheadstart = .; | 
|  | 19 | +        _poolstart = .; | 
|  | 20 | +	*(.inithead*) | 
|  | 21 | +        . = ALIGN(0x4); | 
|  | 22 | +        _initheadend = .; | 
|  | 23 | +    } > INIT | 
|  | 24 | + | 
|  | 25 | +    .sram : | 
|  | 26 | +    { | 
|  | 27 | +        _sramstart = .; | 
|  | 28 | +        KEEP(*(.intvect)) | 
|  | 29 | +        *(.intvect) | 
|  | 30 | +        *(.icode*) | 
|  | 31 | +        *(.irodata*) | 
|  | 32 | +        *(.idata*) | 
|  | 33 | +        . = ALIGN(0x4); | 
|  | 34 | +        _sramend = .; | 
|  | 35 | +    } > SRAM AT> INIT | 
|  | 36 | +    _sramsource = LOADADDR(.sram); | 
|  | 37 | + | 
|  | 38 | +    .sdram : | 
|  | 39 | +    { | 
|  | 40 | +        _sdramstart = .; | 
|  | 41 | +        _poolend = .; | 
|  | 42 | +        *(.text*) | 
|  | 43 | +        *(.glue_7) | 
|  | 44 | +        *(.glue_7t) | 
|  | 45 | +        . = ALIGN(0x4); | 
|  | 46 | +        *(.rodata*) | 
|  | 47 | +        . = ALIGN(0x4); | 
|  | 48 | +        *(.data*) | 
|  | 49 | +        . = ALIGN(0x4); | 
|  | 50 | +        _sdramend = .; | 
|  | 51 | +    } > SDRAM AT> INIT | 
|  | 52 | +    _sdramsource = LOADADDR(.sdram); | 
|  | 53 | + | 
|  | 54 | +    .init : | 
|  | 55 | +    { | 
|  | 56 | +        _initstart = .; | 
|  | 57 | +        *(.initcode*) | 
|  | 58 | +        *(.initrodata*) | 
|  | 59 | +        *(.initdata*) | 
|  | 60 | +        . = ALIGN(0x4); | 
|  | 61 | +        _initend = .; | 
|  | 62 | +    } > INIT | 
|  | 63 | + | 
|  | 64 | +    .inittail : | 
|  | 65 | +    { | 
|  | 66 | +        _inittailstart = .; | 
|  | 67 | +        *(.inittail*) | 
|  | 68 | +        . = ALIGN(0x4); | 
|  | 69 | +        _inittailend = .; | 
|  | 70 | +    } > INIT | 
|  | 71 | + | 
|  | 72 | +    .ibss (NOLOAD) : | 
|  | 73 | +    { | 
|  | 74 | +        _ibssstart = .; | 
|  | 75 | +        *(.ibss*) | 
|  | 76 | +        . = ALIGN(0x4); | 
|  | 77 | +        _abortstackstart = .; | 
|  | 78 | +        . += 0x400; | 
|  | 79 | +        _abortstackend = .; | 
|  | 80 | +        _irqstackstart = .; | 
|  | 81 | +        . += 0x400; | 
|  | 82 | +        _irqstackend = .; | 
|  | 83 | +        *(.stack*) | 
|  | 84 | +        . = ALIGN(0x4); | 
|  | 85 | +        _ibssend = .; | 
|  | 86 | +    } > SRAM | 
|  | 87 | + | 
|  | 88 | +    .bss (NOLOAD) : | 
|  | 89 | +    { | 
|  | 90 | +        _bssstart = .; | 
|  | 91 | +        *(.bss*) | 
|  | 92 | +        *(COMMON) | 
|  | 93 | +        . = ALIGN(0x4); | 
|  | 94 | +        _bssend = .; | 
|  | 95 | +    } > SDRAM | 
|  | 96 | + | 
|  | 97 | +    /DISCARD/ : | 
|  | 98 | +    { | 
|  | 99 | +        *(.eh_frame) | 
|  | 100 | +    } | 
|  | 101 | + | 
|  | 102 | +} | 
| Index: emcore/trunk/target/ipodtouch2g/crt0.S | 
| — | — | @@ -0,0 +1,305 @@ | 
|  | 2 | +@ | 
|  | 3 | +@ | 
|  | 4 | +@    Copyright 2010 TheSeven | 
|  | 5 | +@ | 
|  | 6 | +@ | 
|  | 7 | +@    This file is part of emCORE. | 
|  | 8 | +@ | 
|  | 9 | +@    emCORE is free software: you can redistribute it and/or | 
|  | 10 | +@    modify it under the terms of the GNU General Public License as | 
|  | 11 | +@    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +@    License, or (at your option) any later version. | 
|  | 13 | +@ | 
|  | 14 | +@    emCORE is distributed in the hope that it will be useful, | 
|  | 15 | +@    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +@    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +@    See the GNU General Public License for more details. | 
|  | 18 | +@ | 
|  | 19 | +@    You should have received a copy of the GNU General Public License | 
|  | 20 | +@    along with emCORE.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +@ | 
|  | 22 | +@ | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +.section .intvect,"ax",%progbits | 
|  | 26 | +	ldr pc, =reset_handler | 
|  | 27 | +	ldr pc, =undef_instr_handler | 
|  | 28 | +	ldr pc, =syscall_handler | 
|  | 29 | +	ldr pc, =prefetch_abort_handler | 
|  | 30 | +	ldr pc, =data_abort_handler | 
|  | 31 | +	ldr pc, =reserved_handler | 
|  | 32 | +	ldr pc, =irq_handler | 
|  | 33 | +	ldr pc, =fiq_handler | 
|  | 34 | +.ltorg | 
|  | 35 | + | 
|  | 36 | + | 
|  | 37 | +.section .inithead,"ax",%progbits | 
|  | 38 | +.global __start | 
|  | 39 | +__start: | 
|  | 40 | +	b	_start | 
|  | 41 | + | 
|  | 42 | +.section .initcode,"ax",%progbits | 
|  | 43 | +.global _start | 
|  | 44 | +_start: | 
|  | 45 | +	ldr	r0, =0x00450878 | 
|  | 46 | +	mcr	p15, 0, r0,c1,c0,0 | 
|  | 47 | +	ldr	r0, =_sramsource | 
|  | 48 | +	ldr	r1, =_sramstart | 
|  | 49 | +	ldr	r2, =_sramend | 
|  | 50 | +.copysram: | 
|  | 51 | +	cmp	r2, r1 | 
|  | 52 | +	ldrhi	r3, [r0], #4 | 
|  | 53 | +	strhi	r3, [r1], #4 | 
|  | 54 | +	bhi	.copysram | 
|  | 55 | +	ldr	r0, =_sdramsource | 
|  | 56 | +	ldr	r1, =_sdramstart | 
|  | 57 | +	ldr	r2, =_sdramend | 
|  | 58 | +.copysdram: | 
|  | 59 | +	cmp	r2, r1 | 
|  | 60 | +	ldrhi	r3, [r0], #4 | 
|  | 61 | +	strhi	r3, [r1], #4 | 
|  | 62 | +	bhi	.copysdram | 
|  | 63 | +	ldr	r0, =_ibssstart | 
|  | 64 | +	ldr	r1, =_ibssend | 
|  | 65 | +	mov	r2, #0 | 
|  | 66 | +.clearibss: | 
|  | 67 | +	cmp	r1, r0 | 
|  | 68 | +	strhi	r2, [r0], #4 | 
|  | 69 | +	bhi	.clearibss | 
|  | 70 | +	ldr	r0, =_bssstart | 
|  | 71 | +	ldr	r1, =_bssend | 
|  | 72 | +.clearbss: | 
|  | 73 | +	cmp	r1, r0 | 
|  | 74 | +	strhi	r2, [r0], #4 | 
|  | 75 | +	bhi	.clearbss | 
|  | 76 | +	ldr	r1, =0x38200000 | 
|  | 77 | +	ldr	r0, [r1] | 
|  | 78 | +	orr	r0, r0, #1 | 
|  | 79 | +	bic	r0, r0, #0x10000 | 
|  | 80 | +	str	r0, [r1] | 
|  | 81 | +	mov	r0, #0 | 
|  | 82 | +	mcr	p15, 0, r0,c7,c5,0 | 
|  | 83 | +	add	r1, r1, #0x00c00000 | 
|  | 84 | +	add	r2, r1, #0x00001000 | 
|  | 85 | +	add	r3, r1, #0x00002000 | 
|  | 86 | +	sub	r4, r0, #1 | 
|  | 87 | +	str	r4, [r1,#0x14] | 
|  | 88 | +	str	r4, [r2,#0x14] | 
|  | 89 | +	str	r4, [r1,#0xf00] | 
|  | 90 | +	str	r4, [r2,#0xf00] | 
|  | 91 | +	str	r4, [r3,#0x08] | 
|  | 92 | +	str	r4, [r3,#0x0c] | 
|  | 93 | +	str	r0, [r1,#0x14] | 
|  | 94 | +	str	r0, [r2,#0x14] | 
|  | 95 | +	mov	r0, #0 | 
|  | 96 | +	ldr	r1, =0x3c500000 | 
|  | 97 | +	str	r0, [r1,#0x48] | 
|  | 98 | +	str	r0, [r1,#0x4c] | 
|  | 99 | +	msr	cpsr_c, #0xd2 | 
|  | 100 | +	ldr	sp, =_irqstackend | 
|  | 101 | +	msr	cpsr_c, #0xd7 | 
|  | 102 | +	ldr	sp, =_abortstackend | 
|  | 103 | +	msr	cpsr_c, #0xdb | 
|  | 104 | +	ldr	sp, =_abortstackend | 
|  | 105 | +	msr	cpsr_c, #0x1f | 
|  | 106 | +	ldr	sp, =_abortstackend | 
|  | 107 | +	bl	init | 
|  | 108 | +	bl	yield | 
|  | 109 | +	mov	r0, #0 | 
|  | 110 | +	ldr	pc, =idleloop | 
|  | 111 | +.ltorg | 
|  | 112 | + | 
|  | 113 | + | 
|  | 114 | +.section .icode, "ax", %progbits | 
|  | 115 | +.align 2 | 
|  | 116 | +idleloop: | 
|  | 117 | +	mcr	p15, 0, r0,c7,c0,4 | 
|  | 118 | +	b	idleloop | 
|  | 119 | + | 
|  | 120 | +.global reset | 
|  | 121 | +.global hang | 
|  | 122 | +.type reset, %function | 
|  | 123 | +.type hang, %function | 
|  | 124 | +reset: | 
|  | 125 | +	msr	cpsr_c, #0xd3 | 
|  | 126 | +	mov	r0, #0x100000 | 
|  | 127 | +	mov	r1, #0x3c800000 | 
|  | 128 | +	str	r0, [r1] | 
|  | 129 | +hang: | 
|  | 130 | +	msr	cpsr_c, #0xd3 | 
|  | 131 | +	mcr	p15, 0, r0,c7,c0,4 | 
|  | 132 | +	b	hang | 
|  | 133 | +.size reset, .-reset | 
|  | 134 | +.size hang, .-hang | 
|  | 135 | + | 
|  | 136 | +.type reset_handler, %function | 
|  | 137 | +reset_handler: | 
|  | 138 | +	stmfd	sp, {r10-r12} | 
|  | 139 | +	mov	r10, sp | 
|  | 140 | +	mov	r11, lr | 
|  | 141 | +	mrs	r12, cpsr | 
|  | 142 | +	msr	cpsr_c, #0xd7 | 
|  | 143 | +	sub	sp, sp, #0x44 | 
|  | 144 | +	stmia	sp!, {r0-r9} | 
|  | 145 | +	sub	r0, r10, #0xc | 
|  | 146 | +	ldmia	r0, {r0-r2} | 
|  | 147 | +	mov	r3, r10 | 
|  | 148 | +	mov	r4, r11 | 
|  | 149 | +	mov	r5, r11 | 
|  | 150 | +	mov	r6, r12 | 
|  | 151 | +	stmia	sp!, {r0-r6} | 
|  | 152 | +	sub	sp, sp, #0x44 | 
|  | 153 | +	mov	r0, #0 | 
|  | 154 | +	adr	r1, reset_text | 
|  | 155 | +	mov	r2, r11 | 
|  | 156 | +	b	panic | 
|  | 157 | +.size reset_handler, .-reset_handler | 
|  | 158 | + | 
|  | 159 | +.global undef_instr_handler | 
|  | 160 | +.type undef_instr_handler, %function | 
|  | 161 | +undef_instr_handler: | 
|  | 162 | +	sub	sp, sp, #0x44 | 
|  | 163 | +	stmia	sp!, {r0-r12} | 
|  | 164 | +	sub	r2, lr, #4 | 
|  | 165 | +	mrs	r3, spsr | 
|  | 166 | +	mrs	r4, cpsr | 
|  | 167 | +	orr	r0, r3, #0xc0 | 
|  | 168 | +	msr	cpsr_c, r0 | 
|  | 169 | +	mov	r0, sp | 
|  | 170 | +	mov	r1, lr | 
|  | 171 | +	msr	cpsr_c, r4 | 
|  | 172 | +	stmia	sp!, {r0-r3} | 
|  | 173 | +	sub	sp, sp, #0x44 | 
|  | 174 | +	mov	r0, #0 | 
|  | 175 | +	adr	r1, undef_instr_text | 
|  | 176 | +	ldr	r3, [r2] | 
|  | 177 | +	b	panicf | 
|  | 178 | +.size undef_instr_handler, .-undef_instr_handler | 
|  | 179 | + | 
|  | 180 | +.type prefetch_abort_handler, %function | 
|  | 181 | +prefetch_abort_handler: | 
|  | 182 | +	sub	sp, sp, #0x44 | 
|  | 183 | +	stmia	sp!, {r0-r12} | 
|  | 184 | +	sub	r2, lr, #4 | 
|  | 185 | +	mrs	r3, spsr | 
|  | 186 | +	mrs	r4, cpsr | 
|  | 187 | +	orr	r0, r3, #0xc0 | 
|  | 188 | +	msr	cpsr_c, r0 | 
|  | 189 | +	mov	r0, sp | 
|  | 190 | +	mov	r1, lr | 
|  | 191 | +	msr	cpsr_c, r4 | 
|  | 192 | +	stmia	sp!, {r0-r3} | 
|  | 193 | +	sub	sp, sp, #0x44 | 
|  | 194 | +	mov	r0, #0 | 
|  | 195 | +	adr	r1, prefetch_abort_text | 
|  | 196 | +	mrc	p15, 0, r3,c5,c0,1 | 
|  | 197 | +	mov	r4, r3,lsr#4 | 
|  | 198 | +	and	r4, r4, #0xf | 
|  | 199 | +	and	r5, r3, #0xf | 
|  | 200 | +	stmfd	sp!, {r4-r5} | 
|  | 201 | +	b	panicf | 
|  | 202 | +.size prefetch_abort_handler, .-prefetch_abort_handler | 
|  | 203 | + | 
|  | 204 | +.type data_abort_handler, %function | 
|  | 205 | +data_abort_handler: | 
|  | 206 | +	sub	sp, sp, #0x44 | 
|  | 207 | +	stmia	sp!, {r0-r12} | 
|  | 208 | +	sub	r2, lr, #8 | 
|  | 209 | +	mrs	r3, spsr | 
|  | 210 | +	mrs	r4, cpsr | 
|  | 211 | +	orr	r0, r3, #0xc0 | 
|  | 212 | +	msr	cpsr_c, r0 | 
|  | 213 | +	mov	r0, sp | 
|  | 214 | +	mov	r1, lr | 
|  | 215 | +	msr	cpsr_c, r4 | 
|  | 216 | +	stmia	sp!, {r0-r3} | 
|  | 217 | +	sub	sp, sp, #0x44 | 
|  | 218 | +	mov	r0, #0 | 
|  | 219 | +	adr	r1, data_abort_text | 
|  | 220 | +	mrc	p15, 0, r3,c5,c0 | 
|  | 221 | +	mov	r4, r3,lsr#4 | 
|  | 222 | +	and	r4, r4, #0xf | 
|  | 223 | +	and	r5, r3, #0xf | 
|  | 224 | +	mrc	p15, 0, r6,c6,c0 | 
|  | 225 | +	stmfd	sp!, {r4-r6} | 
|  | 226 | +	b	panicf | 
|  | 227 | +.size data_abort_handler, .-data_abort_handler | 
|  | 228 | + | 
|  | 229 | +.type reserved_handler, %function | 
|  | 230 | +reserved_handler: | 
|  | 231 | +	stmfd	sp, {r10-r12} | 
|  | 232 | +	mov	r10, sp | 
|  | 233 | +	mov	r11, lr | 
|  | 234 | +	mrs	r12, cpsr | 
|  | 235 | +	msr	cpsr_c, #0xd7 | 
|  | 236 | +	sub	sp, sp, #0x44 | 
|  | 237 | +	stmia	sp!, {r0-r9} | 
|  | 238 | +	sub	r0, r10, #0xc | 
|  | 239 | +	ldmia	r0, {r0-r2} | 
|  | 240 | +	mov	r3, r10 | 
|  | 241 | +	mov	r4, r11 | 
|  | 242 | +	mov	r5, r11 | 
|  | 243 | +	mov	r6, r12 | 
|  | 244 | +	stmia	sp!, {r0-r6} | 
|  | 245 | +	sub	sp, sp, #0x44 | 
|  | 246 | +	mov	r0, #0 | 
|  | 247 | +	adr	r1, reserved_text | 
|  | 248 | +	mov	r2, r11 | 
|  | 249 | +	b	panic | 
|  | 250 | +.size reserved_handler, .-reserved_handler | 
|  | 251 | + | 
|  | 252 | +.type fiq_handler, %function | 
|  | 253 | +fiq_handler: | 
|  | 254 | +	mov	r0, #2 | 
|  | 255 | +	adr	r1, fiq_text | 
|  | 256 | +	b	panic | 
|  | 257 | +.size fiq_handler, .-fiq_handler | 
|  | 258 | + | 
|  | 259 | +prefetch_abort_text: | 
|  | 260 | +	.ascii	"Prefetch abort at %08X!\nFSR: %08X (domain %d, fault %d)\0" | 
|  | 261 | + | 
|  | 262 | +reset_text: | 
|  | 263 | +	.ascii	"Hit reset vector!\n(Last known PC: %08X)\0" | 
|  | 264 | + | 
|  | 265 | +undef_instr_text: | 
|  | 266 | +	.ascii	"Undefined instruction at %08X!\n(Opcode: %08X)\0" | 
|  | 267 | + | 
|  | 268 | +data_abort_text: | 
|  | 269 | +	.ascii	"Data abort at %08X!\nFSR: %08X (domain %d, fault %d)\nAddress: %08X\0" | 
|  | 270 | + | 
|  | 271 | +fiq_text: | 
|  | 272 | +	.ascii	"Unhandled FIQ!\0" | 
|  | 273 | + | 
|  | 274 | +reserved_text: | 
|  | 275 | +	.ascii	"Hit reserved exception handler!\n(Last known PC: %08X)\0" | 
|  | 276 | + | 
|  | 277 | +syscall_text: | 
|  | 278 | +	.ascii	"Unhandled syscall!\0" | 
|  | 279 | + | 
|  | 280 | + | 
|  | 281 | +.section .icode.usec_timer, "ax", %progbits | 
|  | 282 | +.align 2 | 
|  | 283 | +.global read_native_timer | 
|  | 284 | +.type read_native_timer, %function | 
|  | 285 | +read_native_timer: | 
|  | 286 | +	ldr	r0, val_3c700000 | 
|  | 287 | +	ldr	r1, [r0,#0x80] | 
|  | 288 | +	ldr	r0, [r0,#0x84] | 
|  | 289 | +	bx	lr | 
|  | 290 | +.size read_native_timer, .-read_native_timer | 
|  | 291 | + | 
|  | 292 | +.global read_usec_timer | 
|  | 293 | +.type read_usec_timer, %function | 
|  | 294 | +read_usec_timer: | 
|  | 295 | +	ldr	r0, val_3c700000 | 
|  | 296 | +	ldr	r1, [r0,#0x80] | 
|  | 297 | +	ldr	r0, [r0,#0x84] | 
|  | 298 | +	mov	r0, r0,lsr#5 | 
|  | 299 | +	orr	r0, r0, r1,lsl#27 | 
|  | 300 | +	add	r0, r0, r0,asr#2 | 
|  | 301 | +	add	r0, r0, r0,asr#6 | 
|  | 302 | +	bx	lr | 
|  | 303 | +.size read_usec_timer, .-read_usec_timer | 
|  | 304 | + | 
|  | 305 | +val_3c700000: | 
|  | 306 | +	.word	0x3c700000 | 
| Index: emcore/trunk/target/ipodtouch2g/config.h | 
| — | — | @@ -0,0 +1,40 @@ | 
|  | 2 | +// | 
|  | 3 | +// | 
|  | 4 | +//    Copyright 2009 TheSeven | 
|  | 5 | +// | 
|  | 6 | +// | 
|  | 7 | +//    This file is part of the Linux4Nano toolkit. | 
|  | 8 | +// | 
|  | 9 | +//    TheSeven's iBugger is free software: you can redistribute it and/or | 
|  | 10 | +//    modify it under the terms of the GNU General Public License as | 
|  | 11 | +//    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +//    License, or (at your option) any later version. | 
|  | 13 | +// | 
|  | 14 | +//    TheSeven's iBugger is distributed in the hope that it will be useful, | 
|  | 15 | +//    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +//    See the GNU General Public License for more details. | 
|  | 18 | +// | 
|  | 19 | +//    You should have received a copy of the GNU General Public License along | 
|  | 20 | +//    with the Linux4Nano toolkit.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +// | 
|  | 22 | +// | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +#ifndef __CONFIG_H__ | 
|  | 26 | +#define __CONFIG_H__ | 
|  | 27 | + | 
|  | 28 | + | 
|  | 29 | +//#define NAND_DEBUG | 
|  | 30 | +//#define NAND_TRACE | 
|  | 31 | +//#define VFL_DEBUG | 
|  | 32 | +//#define VFL_TRACE | 
|  | 33 | +//#define FTL_DEBUG | 
|  | 34 | +//#define FTL_TRACE | 
|  | 35 | + | 
|  | 36 | + | 
|  | 37 | +//#define DEBUG_CONSOLES 2 | 
|  | 38 | +//#define DEBUG_PRINT_SOURCE_LINE | 
|  | 39 | + | 
|  | 40 | + | 
|  | 41 | +#endif | 
| Index: emcore/trunk/target/ipodtouch2g/target.h | 
| — | — | @@ -0,0 +1,64 @@ | 
|  | 2 | +// | 
|  | 3 | +// | 
|  | 4 | +//    Copyright 2010 TheSeven | 
|  | 5 | +// | 
|  | 6 | +// | 
|  | 7 | +//    This file is part of emCORE. | 
|  | 8 | +// | 
|  | 9 | +//    emCORE is free software: you can redistribute it and/or | 
|  | 10 | +//    modify it under the terms of the GNU General Public License as | 
|  | 11 | +//    published by the Free Software Foundation, either version 2 of the | 
|  | 12 | +//    License, or (at your option) any later version. | 
|  | 13 | +// | 
|  | 14 | +//    emCORE is distributed in the hope that it will be useful, | 
|  | 15 | +//    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | 16 | +//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 
|  | 17 | +//    See the GNU General Public License for more details. | 
|  | 18 | +// | 
|  | 19 | +//    You should have received a copy of the GNU General Public License along | 
|  | 20 | +//    with emCORE.  If not, see <http://www.gnu.org/licenses/>. | 
|  | 21 | +// | 
|  | 22 | +// | 
|  | 23 | + | 
|  | 24 | + | 
|  | 25 | +#ifndef __TARGET_H__ | 
|  | 26 | +#define __TARGET_H__ | 
|  | 27 | + | 
|  | 28 | + | 
|  | 29 | +#define PLATFORM_ID 0x47325449 | 
|  | 30 | + | 
|  | 31 | + | 
|  | 32 | +#define ARM_ARCH 6 | 
|  | 33 | +#define LITTLE_ENDIAN | 
|  | 34 | +#define CACHEALIGN_BITS 4 | 
|  | 35 | +#define CPU_FREQ 532000000 | 
|  | 36 | + | 
|  | 37 | + | 
|  | 38 | +#define CONSOLE_BOOT 3 | 
|  | 39 | +#define CONSOLE_PANIC 3 | 
|  | 40 | +#define CONSOLE_PANICDUMP 0 | 
|  | 41 | + | 
|  | 42 | + | 
|  | 43 | +#define HAVE_USB | 
|  | 44 | +#define USB_NUM_ENDPOINTS 5 | 
|  | 45 | + | 
|  | 46 | +#define HAVE_LCD | 
|  | 47 | +#define LCD_WIDTH 320 | 
|  | 48 | +#define LCD_HEIGHT 480 | 
|  | 49 | +#define LCD_FORMAT 0x00721d07  // rgb888 | 
|  | 50 | +#define LCD_BYTESPERPIXEL 4 | 
|  | 51 | +#define LCDCONSOLE_FGCOLOR 0 | 
|  | 52 | +#define LCDCONSOLE_BGCOLOR -1 | 
|  | 53 | + | 
|  | 54 | +#define HAVE_BACKLIGHT | 
|  | 55 | + | 
|  | 56 | +#define HAVE_I2C | 
|  | 57 | + | 
|  | 58 | +//#define HAVE_STORAGE | 
|  | 59 | +//#define HAVE_FLASH_STORAGE | 
|  | 60 | +//#define HAVE_STORAGE_FLUSH | 
|  | 61 | +//#define CONFIG_STORAGE STORAGE_NAND | 
|  | 62 | +//#define SECTOR_SIZE 4096 | 
|  | 63 | + | 
|  | 64 | + | 
|  | 65 | +#endif | 
| Index: emcore/trunk/target/ipodtouch2g/target.mk | 
| — | — | @@ -0,0 +1 @@ | 
|  | 2 | +CFLAGS_ipodtouch2g += -mcpu=arm1136j-s | 
| Index: emcore/trunk/SOURCES | 
| — | — | @@ -59,6 +59,19 @@ | 
| 60 | 60 | target/ipodclassic/usbtarget.c | 
| 61 | 61 | #endif | 
| 62 | 62 |  | 
|  | 63 | +#ifdef TARGET_ipodtouch2g | 
|  | 64 | +target/ipodnano4g/mmu.c | 
|  | 65 | +target/ipodnano4g/timer.c | 
|  | 66 | +target/ipodnano4g/i2c.S | 
|  | 67 | +target/ipodnano4g/interrupt.c | 
|  | 68 | +target/ipodnano4g/power.c | 
|  | 69 | +target/ipodnano4g/accel.c | 
|  | 70 | +target/ipodnano4g/backlight.c | 
|  | 71 | +target/ipodnano4g/clockgates.c | 
|  | 72 | +target/ipodtouch2g/lcd.c | 
|  | 73 | +usb/synopsysotg.c | 
|  | 74 | +#endif | 
|  | 75 | + | 
| 63 | 76 | #ifdef ARM_ARCH | 
| 64 | 77 | arm/arm-support.S | 
| 65 | 78 | arm/contextswitch.S | 
| Index: emcore/trunk/usb/synopsysotg.h | 
| — | — | @@ -34,7 +34,7 @@ | 
| 35 | 35 | #if defined(TARGET_ipodnano3g) || defined(TARGET_ipodclassic) | 
| 36 | 36 | #include "target/ipodnano3g/s5l8702.h" | 
| 37 | 37 | #endif | 
| 38 |  | -#ifdef TARGET_ipodnano4g
 | 
|  | 38 | +#if defined(TARGET_ipodnano4g) || defined(TARGET_ipodtouch2g) | 
| 39 | 39 | #include "target/ipodnano4g/s5l8720.h" | 
| 40 | 40 | #endif | 
| 41 | 41 |  |