summaryrefslogtreecommitdiff
path: root/firmware/target
diff options
context:
space:
mode:
Diffstat (limited to 'firmware/target')
-rw-r--r--firmware/target/arm/iriver/h10/lcd-h10_5gb.c114
-rw-r--r--firmware/target/arm/system-pp502x.c2
-rw-r--r--firmware/target/coldfire/memcpy-coldfire.S440
3 files changed, 81 insertions, 475 deletions
diff --git a/firmware/target/arm/iriver/h10/lcd-h10_5gb.c b/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
index 680d2c47a5..8972fd1e9c 100644
--- a/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
+++ b/firmware/target/arm/iriver/h10/lcd-h10_5gb.c
@@ -108,7 +108,6 @@ void lcd_init_device(void)
{
CLCD_CLOCK_SRC |= 0xc0000000; /* Set LCD interface clock to PLL */
/* H10 LCD is initialised by the bootloader */
- lcd_write_reg(R_ENTRY_MODE, 0x1030); /* BGR =1, ID1 = 1, ID0 = 1 */
}
/*** update functions ***/
@@ -290,51 +289,88 @@ void lcd_yuv_blit(unsigned char * const src[3],
/* Update a fraction of the display. */
-void lcd_update_rect(int x, int y, int width, int height)
+void lcd_update_rect(int x0, int y0, int width, int height)
{
- const fb_data *addr;
- int bytes_to_write;
-
- if (x + width >= LCD_WIDTH)
- width = LCD_WIDTH - x;
- if (y + height >= LCD_HEIGHT)
- height = LCD_HEIGHT - y;
-
- if ((width <= 0) || (height <= 0))
- return; /* Nothing left to do. 0 would hang the transfer. */
-
- /* Ensure x and width are both even, so we can read
- * 32-bit aligned data from the framebuffer */
- width = (width + (x & 1) + 1) & ~1;
- x &= ~1;
-
- lcd_write_reg(R_VERT_RAM_ADDR_POS, (LCD_HEIGHT-1) << 8);
- lcd_write_reg(R_HORIZ_RAM_ADDR_POS, ((x + width - 1) << 8) | x);
- lcd_write_reg(R_RAM_ADDR_SET, (y << 8) | x);
+ int x1, y1;
+ int newx,newwidth;
+ unsigned long *addr;
+ /* Ensure x and width are both even - so we can read 32-bit aligned
+ data from lcd_framebuffer */
+ newx=x0&~1;
+ newwidth=width&~1;
+ if (newx+newwidth < x0+width) { newwidth+=2; }
+ x0=newx; width=newwidth;
+
+ /* calculate the drawing region */
+ y1 = (y0 + height) - 1; /* max vert */
+ x1 = (x0 + width) - 1; /* max horiz */
+
+
+ /* swap max horiz < start horiz */
+ if (y1 < y0) {
+ int t;
+ t = y0;
+ y0 = y1;
+ y1 = t;
+ }
+
+ /* swap max vert < start vert */
+ if (x1 < x0) {
+ int t;
+ t = x0;
+ x0 = x1;
+ x1 = t;
+ }
+
+ /* max horiz << 8 | start horiz */
+ lcd_write_reg(R_HORIZ_RAM_ADDR_POS, (x1 << 8) | x0);
+
+ /* max vert << 8 | start vert */
+ lcd_write_reg(R_VERT_RAM_ADDR_POS, (y1 << 8) | y0);
+
+ /* start vert << 8 | start horiz */
+ lcd_write_reg(R_RAM_ADDR_SET, (y0 << 8) | x0);
+
+ /* start drawing */
lcd_send_cmd(R_WRITE_DATA_2_GRAM);
- addr = &lcd_framebuffer[y][x];
- bytes_to_write = width * height * sizeof(fb_data);
- /* must be <= 0x10000, but that's guaranteed on H10. */
+ addr = (unsigned long*)&lcd_framebuffer[y0][x0];
- LCD2_BLOCK_CTRL = 0x10000080;
- LCD2_BLOCK_CONFIG = 0xc0010000 | (bytes_to_write - 1);
- LCD2_BLOCK_CTRL = 0x34000000;
-
- do
- {
- int w = width >> 1;
- do
- {
- while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_TXOK));
- LCD2_BLOCK_DATA = *(unsigned long*)addr; /* output 2 pixels */
- addr += 2;
+ while (height > 0) {
+ int c, r;
+ int h, pixels_to_write;
+
+ pixels_to_write = (width * height) * 2;
+ h = height;
+
+ /* calculate how much we can do in one go */
+ if (pixels_to_write > 0x10000) {
+ h = (0x10000/2) / width;
+ pixels_to_write = (width * h) * 2;
}
- while (--w > 0);
- addr += LCD_WIDTH - width;
+
+ LCD2_BLOCK_CTRL = 0x10000080;
+ LCD2_BLOCK_CONFIG = 0xc0010000 | (pixels_to_write - 1);
+ LCD2_BLOCK_CTRL = 0x34000000;
+
+ /* for each row */
+ for (r = 0; r < h; r++) {
+ /* for each column */
+ for (c = 0; c < width; c += 2) {
+ while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_TXOK));
+
+ /* output 2 pixels */
+ LCD2_BLOCK_DATA = *addr++;
+ }
+ addr += (LCD_WIDTH - width)/2;
+ }
+
+ while (!(LCD2_BLOCK_CTRL & LCD2_BLOCK_READY));
+ LCD2_BLOCK_CONFIG = 0;
+
+ height -= h;
}
- while (--height > 0);
}
/* Update the display.
diff --git a/firmware/target/arm/system-pp502x.c b/firmware/target/arm/system-pp502x.c
index a5ed7b2999..27d11aa815 100644
--- a/firmware/target/arm/system-pp502x.c
+++ b/firmware/target/arm/system-pp502x.c
@@ -365,7 +365,7 @@ void system_init(void)
#elif defined (IPOD_MINI)
/* to be done */
#elif defined (IPOD_MINI2G)
- /* to be done */
+ /* to be done */
#elif defined (MROBE_100)
/* to be done */
#elif defined (ELIO_TPJ1022)
diff --git a/firmware/target/coldfire/memcpy-coldfire.S b/firmware/target/coldfire/memcpy-coldfire.S
index dd1a8a66da..523e1f5ed9 100644
--- a/firmware/target/coldfire/memcpy-coldfire.S
+++ b/firmware/target/coldfire/memcpy-coldfire.S
@@ -38,8 +38,8 @@
* %d0 - destination address (like ANSI version)
*
* register usage:
- * %a1 - current source address
- * %a0 - current dest address
+ * %a0 - current source address
+ * %a1 - current dest address
* %a2 - source end address (in line-copy loops)
* %d0 - data / scratch
* %d1 - source end address (byte and longword copy) / data / scratch
@@ -52,439 +52,11 @@
* if FULLSPEED is undefined.
*/
memcpy:
- move.l (4, %sp), %a1 /* Destination */
- move.l (8, %sp), %a0 /* Source */
- move.l (12, %sp), %d1 /* Length */
+ move.l (4,%sp),%a1 /* Destination */
+ move.l (8,%sp),%a0 /* Source */
+ move.l (12,%sp),%d1 /* Length */
__memcpy_fwd_entry:
-
-#if 1 /* CODE TEST */
-
- cmp.l #5, %d1
- bhs.b .min5
-
- move.l %a1, %d0
- jmp.l (2, %pc, %d1.l*4)
-.bytes_grid:
- rts /* 0 */
- nop
-.bytes_1:
- move.b (%a0)+, (%a1)+ /* 1 */
- rts
- move.w (%a0)+, (%a1)+ /* 2 */
- rts
- move.w (%a0)+, (%a1)+ /* 3 */
- bra.s .bytes_1
- move.l (%a0)+, (%a1)+ /* 4 */
- rts
-
-.min5:
- move.l %a0, %d0
- and.l #3, %d0
- jmp.l (2, %pc, %d0.l*2)
- bra.s .byte1_off0
- bra.s .byte1_off1
- bra.s .byte1_off2
- /* last table entry coincides with target */
-
-.byte1_off3:
- move.b (%a0)+, (%a1)+
- subq.l #1, %d1
- bra.s .byte1_off0
-
-.byte1_off1:
- move.b (%a0)+, (%a1)+
- subq.l #1, %d1
-.byte1_off2:
- move.w (%a0)+, (%a1)+
- subq.l #2, %d1
-.byte1_off0:
-
- move.l %d1, %d0
- cmp.l #16, %d0
- bhs.b .min16
-
-.longs:
- lsr.l #2, %d0 /* in longwords */
- neg.l %d0
- jmp.l (8, %pc, %d0.l*2)
-
- move.l (%a0)+, (%a1)+
- move.l (%a0)+, (%a1)+
- move.l (%a0)+, (%a1)+
- move.l (4, %sp), %d0
- and.l #3, %d1
- jmp.l (.bytes_grid - 2 - ., %pc, %d1.l*4)
-
-.min16:
-#if 0
- lea.l (-44, %sp), %sp
- movem.l %d2-%d7/%a2-%a6, (%sp)
-
-
-.main_do12_start:
- lea.l (main_do12_loop - ., %pc), %a5
- movem.l (%a0), %d6-%d7/%a2-%a3
- bra.b .main_do12_headstore
-
-.main_do8_start:
- lea.l (main_do8_loop - ., %pc), %a5
- movem.l (%a0), %d5-%d7/%a2
- bra.b .main_do8_headstore
-
-.main_do4_start:
- lea.l (main_do4_loop - ., %pc), %a5
- movem.l (%a0), %d4-%d7
-/* .main_do4_headstore: */
- move.l %d4, (%a1)+
-.main_do8_headstore:
- move.l %d5, (%a1)+
-.main_do12_headstore:
- move.l %d6, (%a1)+
- bra.b .main_bo0_check
-
-.main_do12_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- move.l %a3, %d5
- movem.l (%a0), %d6-%d7/%a2-%a3
- bra.b .main_bo0_store
-.main_do8_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- movem.l (%a0), %d5-%d7/%a2
- bra.b .main_bo0_store
-.main_do4_loop:
- move.l %d7, %d3
- movem.l (%a0), %d4-%d7
- bra.b .main_bo0_store
-.main_do0_loop:
- movem.l (%a0), %d3-%d6
-.main_bo0_store:
- lea.l (16, %a0), %a1
- movem.l %d3-%d6, (%a1)
- lea.l (16, %a1), %a1
-.main_do0_start:
-.main_bo0_check:
- sub.l #16, %d1
- blo.b .main_bo0_tail
- jmp (%a5)
-
-.main_bo0_tail:
-
-
-
-.main_do13_start:
- lea.l (main_do13_loop - ., %pc), %a5
- movem.l (%a0), %d7/%a2-%a4
- move.l %d7, %d0
- lsr.l #8, %d0
- swap %d0
- move.b %d0, (%a1)+
- swap %d0
- move.w %d0, (%a1)+
- bra.b .main_bo1_check
-
-.main_do9_start:
- lea.l (main_do9_loop - ., %pc), %a5
- movem.l (%a0), %d6-%d7/%a2-%a3
- move.l %d6, %d0
- lsr.l #8, %d0
- swap %d0
- move.b %d0, (%a1)+
- swap %d0
- move.w %d0, (%a1)+
- bra.b .main_do9_headstore
-
-.main_do5_start:
- lea.l (main_do5_loop - ., %pc), %a5
- movem.l (%a0), %d5-%d7/%a2
- move.l %d5, %d0
- lsr.l #8, %d0
- swap %d0
- move.b %d0, (%a1)+
- swap %d0
- move.w %d0, (%a1)+
- bra.b .main_do5_headstore
-
-.main_do1_start:
- lea.l (main_do1_loop - ., %pc), %a5
- movem.l (%a0), %d4-%d7
- move.l %d4, %d0
- lsr.l #8, %d0
- swap %d0
- move.b %d0, (%a1)+
- swap %d0
- move.w %d0, (%a1)+
-/* .main_do1_headstore: */
- lsl.l %d2, %d4
- move.l %d5, %d0
- lsr.l #8, %d0
- or.l %d0, %d4
- move.l %d4, (%a1)+
-.main_do5_headstore:
- lsl.l %d2, %d5
- move.l %d6, %d0
- lsr.l #8, %d0
- or.l %d0, %d5
- move.l %d5, (%a1)+
-.main_do9_headstore:
- lsl.l %d2, %d6
- move.l %d7, %d0
- lsr.l #8, %d0
- or.l %d0, %d6
- move.l %d6, (%a1)+
- bra.b .main_bo1_check
-
-.main_do13_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- move.l %a3, %d5
- move.l %a4, %d6
- movem.l (%a0), %d7/%a2-%a4
- bra.b .main_bo1_store
-.main_do9_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- move.l %a3, %d5
- movem.l (%a0), %d6-%d7/%a2-%a3
- bra.b .main_bo1_store
-.main_do5_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- movem.l (%a0), %d5-%d7/%a2
- bra.b .main_bo1_store
-.main_do1_loop:
- move.l %d7, %d3
- movem.l (%a0), %d4-%d7
-.main_bo1_store:
- lea.l (16, %a0), %a1
- lsl.l %d2, %d3
- move.l %d4, %d0
- lsr.l #8, %d0
- or.l %d0, %d3
- lsl.l %d2, %d4
- move.l %d5, %d0
- lsr.l #8, %d0
- or.l %d0, %d4
- lsl.l %d2, %d5
- move.l %d6, %d0
- lsr.l #8, %d0
- or.l %d0, %d5
- lsl.l %d2, %d6
- move.l %d7, %d0
- lsr.l #8, %d0
- or.l %d0, %d6
- movem.l %d3-%d6,(%a1)
- lea.l (16, %a1), %a1
-.main_bo1_check:
- sub.l #16, %d1
- blo.b .main_bo1_tail
- jmp (%a5)
-
-
-.main_do14_start:
- lea.l (main_do14_loop - ., %pc), %a5
- movem.l (%a0), %d7/%a2-%a4
- swap %d7
- move.w %d7, (%a1)+
- bra.b .main_bo2_check
-
-.main_do10_start:
- lea.l (main_do10_loop - ., %pc), %a5
- movem.l (%a0), %d6-%d7/%a2-%a3
- swap %d6
- move.w %d6, (%a1)+
- bra.b .main_do10_headstore
-
-.main_do6_start:
- lea.l (main_do6_loop - ., %pc), %a5
- movem.l (%a0), %d5-%d7/%a2
- swap %d5
- move.w %d5, (%a1)+
- bra.b .main_do6_headstore
-
-.main_do2_start:
- lea.l (main_do2_loop - ., %pc), %a5
- movem.l (%a0), %d4-%d7
- swap %d4
- move.w %d4, (%a1)+
-/* .main_do2_headstore: */
- swap %d5
- move.w %d5, %d4
- move.l %d4, (%a1)+
-.main_do6_headstore:
- swap %d6
- move.w %d6, %d5
- move.l %d5, (%a1)+
-.main_do10_headstore:
- swap %d7
- move.w %d7, %d6
- move.l %d6, (%a1)+
- bra.b .main_bo2_check
-
-.main_do14_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- move.l %a3, %d5
- move.l %a4, %d6
- movem.l (%a0), %d7/%a2-%a4
- bra.b .main_bo1_store
-.main_do10_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- move.l %a3, %d5
- movem.l (%a0), %d6-%d7/%a2-%a3
- bra.b .main_bo1_store
-.main_do6_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- movem.l (%a0), %d5-%d7/%a2
- bra.b .main_bo1_store
-.main_do2_loop:
- move.l %d7, %d3
- movem.l (%a0), %d4-%d7
-.main_bo2_store:
- lea.l (16, %a0), %a1
- swap %d4
- move.w %d4,%d3
- swap %d5
- move.w %d5,%d4
- swap %d6
- move.w %d6,%d5
- swap %d7
- move.w %d7,%d6
- movem.l %d3-%d6,(%a1)
- lea.l (16, %a1), %a1
-.main_bo2_check
- sub.l #16, %d1
- blo.b .main_bo2_tail
- jmp (%a5)
-
-
-.main_do15_start:
- lea.l (main_do15_loop - ., %pc), %a5
- movem.l (%a0), %d7/%a2-%a4
- move.l %d7, %d0
- lsr.l %d2, %d0
- move.b %d0, (%a1)+
- bra.b .main_bo3_check
-
-.main_do11_start:
- lea.l (main_do11_loop - ., %pc), %a5
- movem.l (%a0), %d6-%d7/%a2-%a3
- move.l %d6, %d0
- lsr.l %d2, %d0
- move.b %d0, (%a1)+
- bra.b .main_do11_headstore
-
-.main_do7_start:
- lea.l (main_do7_loop - ., %pc), %a5
- movem.l (%a0), %d5-%d7/%a2
- move.l %d5, %d0
- lsr.l %d2, %d0
- move.b %d0, (%a1)+
- bra.b .main_do7_headstore
-
-.main_do3_start:
- lea.l (main_do3_loop - ., %pc), %a5
- movem.l (%a0), %d4-%d7
- move.l %d4, %d0
- lsr.l %d2, %d0
- move.b %d0, (%a1)+
-/* .main_do3_headstore: */
- lsl.l #8, %d4
- move.l %d5, %d0
- lsr.l %d2, %d0
- or.l %d0, %d4
- move.l %d4, (%a1)+
-.main_do7_headstore:
- lsl.l #8, %d5
- move.l %d6, %d0
- lsr.l %d2, %d0
- or.l %d0, %d5
- move.l %d5, (%a1)+
-.main_do11_headstore:
- lsl.l #8, %d6
- move.l %d7, %d0
- lsr.l %d2, %d0
- or.l %d0, %d6
- move.l %d6, (%a1)+
- bra.b .main_bo3_check
-
-.main_do15_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- move.l %a3, %d5
- move.l %a4, %d6
- movem.l (%a0), %d7/%a2-%a4
- bra.b .main_bo1_store
-.main_do11_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- move.l %a3, %d5
- movem.l (%a0), %d6-%d7/%a2-%a3
- bra.b .main_bo1_store
-.main_do7_loop:
- move.l %d7, %d3
- move.l %a2, %d4
- movem.l (%a0), %d5-%d7/%a2
- bra.b .main_bo1_store
-.main_do3_loop:
- move.l %d7, %d3
- movem.l (%a0), %d4-%d7
-.main_bo3_store:
- lea.l (16, %a0), %a1
- lsl.l #8, %d3
- move.l %d4, %d0
- lsr.l %d2, %d0
- or.l %d0, %d3
- lsl.l #8, %d4
- move.l %d5, %d0
- lsr.l %d2, %d0
- or.l %d0, %d4
- lsl.l #8, %d5
- move.l %d6, %d0
- lsr.l %d2, %d0
- or.l %d0, %d5
- lsl.l #8, %d6
- move.l %d7, %d0
- lsr.l %d2, %d0
- or.l %d0, %d6
- movem.l %d3-%d6,(%a1)
- lea.l (16, %a1), %a1
-.main_bo3_check:
- sub.l #16, %d1
- blo.b .main_bo3_tail
- jmp (%a5)
-
-
-
- movem.l (%sp), %d2-%d7/%a2-%a6
- lea.l (44, %sp), %sp
-#else
- lea.l (-16, %sp), %sp
- movem.l %d2-%d5, (%sp)
- sub.l #16, %d1
-
-.main_loop:
- movem.l (%a0), %d2-%d5
- lea.l (16, %a0), %a0
- movem.l %d2-%d5, (%a1)
- lea.l (16, %a1), %a1
- sub.l #16, %d1
- bhs.b .main_loop
-
- add.l #16, %d1
- movem.l (%sp), %d2-%d5
- lea.l (16, %sp), %sp
-#endif
-
- move.l %d1, %d0
- bra.s .longs
-
-#else /* CODE TEST */
-
add.l %a0,%d1 /* %d1 = source end */
move.l %a0,%d0
@@ -1103,8 +675,6 @@ __memcpy_fwd_entry:
.bytes2_end:
move.l (4,%sp),%d0 /* return destination */
rts
-
-#endif /* CODE TEST */
.end:
.size memcpy,.end-memcpy