forked from len0rd/rockbox
Beginning of an M:Robe 500i port. Currently only in the bootloader stage. Needs another piece of code to start the boot process - will be in the wiki.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@14763 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
a80c0e8b83
commit
7b97fe21c0
34 changed files with 2651 additions and 93 deletions
|
@ -33,9 +33,8 @@ start:
|
|||
|
||||
msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ */
|
||||
|
||||
#ifndef BOOTLOADER
|
||||
|
||||
#ifndef DEBUG
|
||||
#if !defined(BOOTLOADER) || (CONFIG_CPU == DM320)
|
||||
#if !defined(DEBUG)
|
||||
/* Copy exception handler code to address 0 */
|
||||
ldr r2, =_vectorsstart
|
||||
ldr r3, =_vectorsend
|
||||
|
@ -52,8 +51,11 @@ start:
|
|||
ldr r0, =fiq_handler
|
||||
str r0, [r1, #28]
|
||||
#endif
|
||||
|
||||
#ifndef STUB
|
||||
#endif
|
||||
|
||||
#if !defined(BOOTLOADER)
|
||||
|
||||
#if !defined(STUB)
|
||||
/* Zero out IBSS */
|
||||
ldr r2, =_iedata
|
||||
ldr r3, =_iend
|
||||
|
@ -98,6 +100,159 @@ start:
|
|||
/* Code for ARM bootloader targets other than iPod go here */
|
||||
|
||||
#if CONFIG_CPU == S3C2440
|
||||
/* Proper initialization pulled from 0x5070 */
|
||||
|
||||
/* BWSCON
|
||||
* Reserved 0
|
||||
* Bank 0:
|
||||
* Bus width 10 (16 bit)
|
||||
* Bank 1:
|
||||
* Buswidth 00 (8 bit)
|
||||
* Disable wait 0
|
||||
* Not using UB/LB 0
|
||||
* Bank 2:
|
||||
* Buswidth 10 (32 bit)
|
||||
* Disable wait 0
|
||||
* Not using UB/LB 0
|
||||
* Bank 3:
|
||||
* Buswidth 10 (32 bit)
|
||||
* Disable wait 0
|
||||
* Use UB/LB 1
|
||||
* Bank 4:
|
||||
* Buswidth 10 (32 bit)
|
||||
* Disable wait 0
|
||||
* Use UB/LB 1
|
||||
* Bank 5:
|
||||
* Buswidth 00 (8 bit)
|
||||
* Disable wait 0
|
||||
* Not using UB/LB 0
|
||||
* Bank 6:
|
||||
* Buswidth 10 (32 bit)
|
||||
* Disable wait 0
|
||||
* Not using UB/LB 0
|
||||
* Bank 7:
|
||||
* Buswidth 00 (8 bit)
|
||||
* Disable wait 0
|
||||
* Not using UB/LB 0
|
||||
*/
|
||||
ldr r2,=0x01055102
|
||||
mov r1, #0x48000000
|
||||
str r2, [r1]
|
||||
|
||||
/* BANKCON0
|
||||
* Pagemode: normal (1 data) 00
|
||||
* Pagemode access cycle: 2 clocks 00
|
||||
* Address hold: 2 clocks 10
|
||||
* Chip selection hold time: 1 clock 10
|
||||
* Access cycle: 8 clocks 101
|
||||
* Chip select setup time: 1 clock 01
|
||||
* Address setup time: 0 clock 00
|
||||
*/
|
||||
ldr r2,=0x00000D60
|
||||
str r2, [r1, #4]
|
||||
|
||||
|
||||
/* BANKCON1
|
||||
* Pagemode: normal (1 data) 00
|
||||
* Pagemode access cycle: 2 clocks 00
|
||||
* Address hold: 0 clocks 00
|
||||
* Chip selection hold time: 0 clock 00
|
||||
* Access cycle: 1 clocks 000
|
||||
* Chip select setup time: 0 clocks 00
|
||||
* Address setup time: 0 clocks 00
|
||||
*/
|
||||
ldr r2,=0x00000000
|
||||
str r2, [r1, #8]
|
||||
|
||||
/* BANKCON2
|
||||
* Pagemode: normal (1 data) 00
|
||||
* Pagemode access cycle: 2 clocks 00
|
||||
* Address hold: 2 clocks 10
|
||||
* Chip selection hold time: 2 clocks 10
|
||||
* Access cycle: 14 clocks 111
|
||||
* Chip select setup time: 4 clocks 11
|
||||
* Address setup time: 0 clocks 00
|
||||
*/
|
||||
ldr r2,=0x00001FA0
|
||||
str r2, [r1, #0xC]
|
||||
|
||||
/* BANKCON3 */
|
||||
ldr r2,=0x00001D80
|
||||
str r2, [r1, #0x10]
|
||||
/* BANKCON4 */
|
||||
str r2, [r1, #0x14]
|
||||
|
||||
/* BANKCON5 */
|
||||
ldr r2,=0x00000000
|
||||
str r2, [r1, #0x18]
|
||||
|
||||
/* BANKCON6/7
|
||||
* SCAN: 9 bit 01
|
||||
* Trcd: 3 clocks 01
|
||||
* Tcah: 0 clock 00
|
||||
* Tcoh: 0 clock 00
|
||||
* Tacc: 1 clock 000
|
||||
* Tcos: 0 clock 00
|
||||
* Tacs: 0 clock 00
|
||||
* MT: Sync DRAM 11
|
||||
*/
|
||||
ldr r2,=0x00018005
|
||||
str r2, [r1, #0x1C]
|
||||
/* BANKCON7 */
|
||||
str r2, [r1, #0x20]
|
||||
|
||||
/* REFRESH */
|
||||
ldr r2,=0x00980501
|
||||
str r2, [r1, #0x24]
|
||||
|
||||
/* BANKSIZE
|
||||
* BK76MAP: 32M/32M 000
|
||||
* Reserved: 0 0 (was 1)
|
||||
* SCLK_EN: always 1 (was 0)
|
||||
* SCKE_EN: disable 0
|
||||
* Reserved: 0 0
|
||||
* BURST_EN: enabled 1
|
||||
*/
|
||||
ldr r2,=0x00000090
|
||||
str r2, [r1, #0x28]
|
||||
|
||||
/* MRSRB6 */
|
||||
ldr r2,=0x00000030
|
||||
str r2, [r1, #0x2C]
|
||||
/* MRSRB7 */
|
||||
str r2, [r1, #0x30]
|
||||
|
||||
#if 0
|
||||
/* This next part I am not sure of the purpose */
|
||||
|
||||
/* GPACON */
|
||||
mov r2,#0x01FFFCFF
|
||||
str r2,=0x56000000
|
||||
|
||||
/* GPADAT */
|
||||
mov r2,#0x01FFFEFF
|
||||
str r2,=0x56000004
|
||||
|
||||
/* MRSRB6 */
|
||||
mov r2,#0x00000000
|
||||
str r2,=0x4800002C
|
||||
|
||||
/* GPADAT */
|
||||
ldr r2,=0x01FFFFFF
|
||||
mov r1, #0x56000000
|
||||
str r2, [r1, #4]
|
||||
|
||||
/* MRSRB6 */
|
||||
mov r2,#0x00000030
|
||||
str r2,=0x4800002C
|
||||
|
||||
/* GPACON */
|
||||
mov r2,#0x01FFFFFF
|
||||
str r2,=0x56000000
|
||||
|
||||
/* End of the unknown */
|
||||
#endif
|
||||
|
||||
/* get the high part of our execute address */
|
||||
ldr r2, =0xffffff00
|
||||
and r4, pc, r2
|
||||
|
@ -116,6 +271,28 @@ start:
|
|||
|
||||
ldr pc, =start_loc /* jump to the relocated start_loc: */
|
||||
|
||||
start_loc:
|
||||
bl main
|
||||
|
||||
#else
|
||||
/* get the high part of our execute address */
|
||||
ldr r2, =0xffffff00
|
||||
and r4, pc, r2
|
||||
|
||||
/* Copy bootloader to safe area - 0x01900000 */
|
||||
mov r5, #0x00900000
|
||||
add r5, r5, #0x01000000
|
||||
ldr r6, = _dataend
|
||||
sub r0, r6, r5 /* length of loader */
|
||||
add r0, r4, r0 /* r0 points to start of loader */
|
||||
1:
|
||||
cmp r5, r6
|
||||
ldrcc r2, [r4], #4
|
||||
strcc r2, [r5], #4
|
||||
bcc 1b
|
||||
|
||||
ldr pc, =start_loc /* jump to the relocated start_loc: */
|
||||
|
||||
start_loc:
|
||||
bl main
|
||||
#endif
|
||||
|
|
|
@ -1,44 +1,44 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2007 by Michael Sevakis
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* void memswap128(void *buf1, void *buf2, size_t len)
|
||||
*/
|
||||
.section .icode, "ax", %progbits
|
||||
.align 2
|
||||
.global memswap128
|
||||
.type memswap128, %function
|
||||
memswap128:
|
||||
@ r0 = buf1
|
||||
@ r1 = buf2
|
||||
@ r2 = len
|
||||
movs r2, r2, lsr #4 @ bytes => lines, len == 0?
|
||||
moveq pc, lr @ not at least a line? leave
|
||||
stmdb sp!, { r4-r10, lr } @ save registers and return address
|
||||
.loop: @
|
||||
ldmia r0, { r3-r6 } @ read four longwords from buf1
|
||||
ldmia r1, { r7-r10 } @ read four longwords from buf2
|
||||
stmia r0!, { r7-r10 } @ write buf2 data to buf1, buf1 += 16
|
||||
stmia r1!, { r3-r6 } @ write buf1 data to buf2, buf2 += 16
|
||||
subs r2, r2, #1 @ len -= 1, len > 0 ?
|
||||
bhi .loop @ yes? keep exchanging
|
||||
ldmia sp!, { r4-r10, pc } @ restore registers and return
|
||||
.end:
|
||||
.size memswap128, .end-memswap128
|
||||
|
||||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id$
|
||||
*
|
||||
* Copyright (C) 2007 by Michael Sevakis
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* void memswap128(void *buf1, void *buf2, size_t len)
|
||||
*/
|
||||
.section .icode, "ax", %progbits
|
||||
.align 2
|
||||
.global memswap128
|
||||
.type memswap128, %function
|
||||
memswap128:
|
||||
@ r0 = buf1
|
||||
@ r1 = buf2
|
||||
@ r2 = len
|
||||
movs r2, r2, lsr #4 @ bytes => lines, len == 0?
|
||||
moveq pc, lr @ not at least a line? leave
|
||||
stmdb sp!, { r4-r10, lr } @ save registers and return address
|
||||
.loop: @
|
||||
ldmia r0, { r3-r6 } @ read four longwords from buf1
|
||||
ldmia r1, { r7-r10 } @ read four longwords from buf2
|
||||
stmia r0!, { r7-r10 } @ write buf2 data to buf1, buf1 += 16
|
||||
stmia r1!, { r3-r6 } @ write buf1 data to buf2, buf2 += 16
|
||||
subs r2, r2, #1 @ len -= 1, len > 0 ?
|
||||
bhi .loop @ yes? keep exchanging
|
||||
ldmia sp!, { r4-r10, pc } @ restore registers and return
|
||||
.end:
|
||||
.size memswap128, .end-memswap128
|
||||
|
||||
|
|
46
firmware/target/arm/olympus/mrobe-500/adc-mr500.c
Normal file
46
firmware/target/arm/olympus/mrobe-500/adc-mr500.c
Normal file
|
@ -0,0 +1,46 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "cpu.h"
|
||||
#include "adc-target.h"
|
||||
#include "kernel.h"
|
||||
|
||||
/* prototypes */
|
||||
static void adc_tick(void);
|
||||
|
||||
void adc_init(void)
|
||||
{
|
||||
/* attach the adc reading to the tick */
|
||||
tick_add_task(adc_tick);
|
||||
}
|
||||
|
||||
/* Called to get the recent ADC reading */
|
||||
inline unsigned short adc_read(int channel)
|
||||
{
|
||||
return (short)channel;
|
||||
}
|
||||
|
||||
/* add this to the tick so that the ADC converts are done in the background */
|
||||
static void adc_tick(void)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
38
firmware/target/arm/olympus/mrobe-500/adc-target.h
Normal file
38
firmware/target/arm/olympus/mrobe-500/adc-target.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef _ADC_TARGET_H_
|
||||
#define _ADC_TARGET_H_
|
||||
|
||||
/* only two channels used by the Gigabeat */
|
||||
#define NUM_ADC_CHANNELS 2
|
||||
|
||||
#define ADC_BATTERY 0
|
||||
#define ADC_HPREMOTE 1
|
||||
#define ADC_UNKNOWN_3 2
|
||||
#define ADC_UNKNOWN_4 3
|
||||
#define ADC_UNKNOWN_5 4
|
||||
#define ADC_UNKNOWN_6 5
|
||||
#define ADC_UNKNOWN_7 6
|
||||
#define ADC_UNKNOWN_8 7
|
||||
|
||||
#define ADC_UNREG_POWER ADC_BATTERY /* For compatibility */
|
||||
#define ADC_READ_ERROR 0xFFFF
|
||||
|
||||
#endif
|
130
firmware/target/arm/olympus/mrobe-500/ata-mr500.c
Normal file
130
firmware/target/arm/olympus/mrobe-500/ata-mr500.c
Normal file
|
@ -0,0 +1,130 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "kernel.h"
|
||||
#include "thread.h"
|
||||
#include "system.h"
|
||||
#include "power.h"
|
||||
#include "panic.h"
|
||||
#include "pcf50606.h"
|
||||
#include "ata-target.h"
|
||||
#include "backlight-target.h"
|
||||
|
||||
/* ARESET on C7C68300 and RESET on ATA interface (Active Low) */
|
||||
#define ATA_RESET_ENABLE return
|
||||
#define ATA_RESET_DISABLE return
|
||||
|
||||
/* ATA_EN on C7C68300 */
|
||||
#define USB_ATA_ENABLE return
|
||||
#define USB_ATA_DISABLE return
|
||||
|
||||
void ata_reset(void)
|
||||
{
|
||||
ATA_RESET_ENABLE;
|
||||
sleep(1); /* > 25us */
|
||||
ATA_RESET_DISABLE;
|
||||
sleep(1); /* > 2ms */
|
||||
}
|
||||
|
||||
/* This function is called before enabling the USB bus */
|
||||
void ata_enable(bool on)
|
||||
{
|
||||
if(on)
|
||||
USB_ATA_DISABLE;
|
||||
else
|
||||
USB_ATA_ENABLE;
|
||||
}
|
||||
|
||||
bool ata_is_coldstart(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void ata_device_init(void)
|
||||
{
|
||||
/* ATA reset */
|
||||
ATA_RESET_DISABLE; /* Set the pin to disable an active low reset */
|
||||
}
|
||||
|
||||
#if !defined(BOOTLOADER)
|
||||
void copy_read_sectors(unsigned char* buf, int wordcount)
|
||||
{
|
||||
__buttonlight_trigger();
|
||||
|
||||
/* Unaligned transfer - slow copy */
|
||||
if ( (unsigned long)buf & 1)
|
||||
{ /* not 16-bit aligned, copy byte by byte */
|
||||
unsigned short tmp = 0;
|
||||
unsigned char* bufend = buf + wordcount*2;
|
||||
do
|
||||
{
|
||||
tmp = ATA_DATA;
|
||||
*buf++ = tmp & 0xff; /* I assume big endian */
|
||||
*buf++ = tmp >> 8; /* and don't use the SWAB16 macro */
|
||||
} while (buf < bufend); /* tail loop is faster */
|
||||
return;
|
||||
}
|
||||
/* This should never happen, but worth watching for */
|
||||
if(wordcount > (1 << 18))
|
||||
panicf("atd-meg-fx.c: copy_read_sectors: too many sectors per read!");
|
||||
|
||||
//#define GIGABEAT_DEBUG_ATA
|
||||
#ifdef GIGABEAT_DEBUG_ATA
|
||||
static int line = 0;
|
||||
static char str[256];
|
||||
snprintf(str, sizeof(str), "ODD DMA to %08x, %d", buf, wordcount);
|
||||
lcd_puts(10, line, str);
|
||||
line = (line+1) % 32;
|
||||
lcd_update();
|
||||
#endif
|
||||
/* Reset the channel */
|
||||
DMASKTRIG0 |= 4;
|
||||
/* Wait for DMA controller to be ready */
|
||||
while(DMASKTRIG0 & 0x2)
|
||||
;
|
||||
while(DSTAT0 & (1 << 20))
|
||||
;
|
||||
/* Source is ATA_DATA, on AHB Bus, Fixed */
|
||||
DISRC0 = (int) 0x18000000;
|
||||
DISRCC0 = 0x1;
|
||||
/* Dest mapped to physical address, on AHB bus, increment */
|
||||
DIDST0 = (int) buf;
|
||||
if(DIDST0 < 0x30000000)
|
||||
DIDST0 += 0x30000000;
|
||||
DIDSTC0 = 0;
|
||||
|
||||
/* DACK/DREQ Sync to AHB, Whole service, No reload, 16-bit transfers */
|
||||
DCON0 = ((1 << 30) | (1<<27) | (1<<22) | (1<<20)) | wordcount;
|
||||
|
||||
/* Activate the channel */
|
||||
DMASKTRIG0 = 0x2;
|
||||
|
||||
invalidate_dcache_range((void *)buf, wordcount*2);
|
||||
|
||||
/* Start DMA */
|
||||
DMASKTRIG0 |= 0x1;
|
||||
|
||||
/* Wait for transfer to complete */
|
||||
while((DSTAT0 & 0x000fffff))
|
||||
priority_yield();
|
||||
/* Dump cache for the buffer */
|
||||
}
|
||||
#endif
|
71
firmware/target/arm/olympus/mrobe-500/ata-target.h
Normal file
71
firmware/target/arm/olympus/mrobe-500/ata-target.h
Normal file
|
@ -0,0 +1,71 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef ATA_TARGET_H
|
||||
#define ATA_TARGET_H
|
||||
|
||||
/* Plain C read & write loops */
|
||||
#define PREFER_C_READING
|
||||
#define PREFER_C_WRITING
|
||||
#if !defined(BOOTLOADER)
|
||||
//#define ATA_OPTIMIZED_READING
|
||||
//void copy_read_sectors(unsigned char* buf, int wordcount);
|
||||
#endif
|
||||
|
||||
#define ATA_IOBASE 0x50000000
|
||||
#define ATA_DATA (*((volatile unsigned short*)(ATA_IOBASE+0xa0)))
|
||||
#define ATA_ERROR (*((volatile unsigned char*)(ATA_IOBASE + 0xa2)))
|
||||
#define ATA_NSECTOR (*((volatile unsigned char*)(ATA_IOBASE + 0x24)))
|
||||
#define ATA_SECTOR (*((volatile unsigned char*)(ATA_IOBASE + 0x26)))
|
||||
#define ATA_LCYL (*((volatile unsigned char*)(ATA_IOBASE + 0x28)))
|
||||
#define ATA_HCYL (*((volatile unsigned char*)(ATA_IOBASE + 0x2A)))
|
||||
#define ATA_SELECT (*((volatile unsigned char*)(ATA_IOBASE + 0x2C)))
|
||||
#define ATA_COMMAND (*((volatile unsigned char*)(ATA_IOBASE + 0x2E)))
|
||||
#define ATA_CONTROL (*((volatile unsigned char*)(ATA_IOBASE + 0x9C)))
|
||||
|
||||
#define STATUS_BSY 0x80
|
||||
#define STATUS_RDY 0x40
|
||||
#define STATUS_DF 0x20
|
||||
#define STATUS_DRQ 0x08
|
||||
#define STATUS_ERR 0x01
|
||||
#define ERROR_ABRT 0x04
|
||||
|
||||
#define WRITE_PATTERN1 0xa5
|
||||
#define WRITE_PATTERN2 0x5a
|
||||
#define WRITE_PATTERN3 0xaa
|
||||
#define WRITE_PATTERN4 0x55
|
||||
|
||||
#define READ_PATTERN1 0xa5
|
||||
#define READ_PATTERN2 0x5a
|
||||
#define READ_PATTERN3 0xaa
|
||||
#define READ_PATTERN4 0x55
|
||||
|
||||
#define READ_PATTERN1_MASK 0xff
|
||||
#define READ_PATTERN2_MASK 0xff
|
||||
#define READ_PATTERN3_MASK 0xff
|
||||
#define READ_PATTERN4_MASK 0xff
|
||||
|
||||
#define SET_REG(reg,val) reg = (val)
|
||||
#define SET_16BITREG(reg,val) reg = (val)
|
||||
|
||||
void ata_reset(void);
|
||||
void ata_device_init(void);
|
||||
bool ata_is_coldstart(void);
|
||||
|
||||
#endif
|
50
firmware/target/arm/olympus/mrobe-500/backlight-mr500.c
Normal file
50
firmware/target/arm/olympus/mrobe-500/backlight-mr500.c
Normal file
|
@ -0,0 +1,50 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "backlight-target.h"
|
||||
#include "backlight.h"
|
||||
#include "lcd.h"
|
||||
#include "power.h"
|
||||
|
||||
void __backlight_on(void)
|
||||
{
|
||||
}
|
||||
|
||||
void __backlight_off(void)
|
||||
{
|
||||
}
|
||||
|
||||
/* Assumes that the backlight has been initialized */
|
||||
void __backlight_set_brightness(int brightness)
|
||||
{
|
||||
(void) brightness;
|
||||
}
|
||||
|
||||
void __backlight_dim(bool dim_now)
|
||||
{
|
||||
(void) dim_now;
|
||||
}
|
||||
|
||||
bool __backlight_init(void)
|
||||
{
|
||||
return true;
|
||||
}
|
31
firmware/target/arm/olympus/mrobe-500/backlight-target.h
Normal file
31
firmware/target/arm/olympus/mrobe-500/backlight-target.h
Normal file
|
@ -0,0 +1,31 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef BACKLIGHT_TARGET_H
|
||||
#define BACKLIGHT_TARGET_H
|
||||
|
||||
bool __backlight_init(void);
|
||||
void __backlight_on(void);
|
||||
void __backlight_off(void);
|
||||
void __backlight_set_brightness(int brightness);
|
||||
|
||||
/* true: backlight fades off - false: backlight fades on */
|
||||
void __backlight_dim(bool dim);
|
||||
|
||||
#endif
|
56
firmware/target/arm/olympus/mrobe-500/button-mr500.c
Normal file
56
firmware/target/arm/olympus/mrobe-500/button-mr500.c
Normal file
|
@ -0,0 +1,56 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "button.h"
|
||||
#include "kernel.h"
|
||||
#include "backlight.h"
|
||||
#include "adc.h"
|
||||
#include "system.h"
|
||||
#include "backlight-target.h"
|
||||
|
||||
static int const remote_buttons[] =
|
||||
{
|
||||
BUTTON_NONE, /* Headphones connected - remote disconnected */
|
||||
BUTTON_RC_PLAY,
|
||||
BUTTON_RC_DSP,
|
||||
BUTTON_RC_REW,
|
||||
BUTTON_RC_FF,
|
||||
BUTTON_RC_VOL_UP,
|
||||
BUTTON_RC_VOL_DOWN,
|
||||
BUTTON_NONE, /* Remote control attached - no buttons pressed */
|
||||
BUTTON_NONE, /* Nothing in the headphone socket */
|
||||
};
|
||||
|
||||
void button_init_device(void)
|
||||
{
|
||||
/* Power, Remote Play & Hold switch */
|
||||
}
|
||||
|
||||
inline bool button_hold(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
int button_read_device(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
99
firmware/target/arm/olympus/mrobe-500/button-target.h
Normal file
99
firmware/target/arm/olympus/mrobe-500/button-target.h
Normal file
|
@ -0,0 +1,99 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef _BUTTON_TARGET_H_
|
||||
#define _BUTTON_TARGET_H_
|
||||
|
||||
#include <stdbool.h>
|
||||
#include "config.h"
|
||||
|
||||
#define HAS_BUTTON_HOLD
|
||||
|
||||
bool button_hold(void);
|
||||
void button_init_device(void);
|
||||
int button_read_device(void);
|
||||
|
||||
/* Toshiba Gigabeat specific button codes */
|
||||
|
||||
#define BUTTON_POWER 0x00000001
|
||||
#define BUTTON_MENU 0x00000002
|
||||
|
||||
#define BUTTON_LEFT 0x00000004
|
||||
#define BUTTON_RIGHT 0x00000008
|
||||
#define BUTTON_UP 0x00000010
|
||||
#define BUTTON_DOWN 0x00000020
|
||||
|
||||
#define BUTTON_VOL_UP 0x00000040
|
||||
#define BUTTON_VOL_DOWN 0x00000080
|
||||
|
||||
#define BUTTON_SELECT 0x00000100
|
||||
#define BUTTON_A 0x00000200
|
||||
|
||||
/* Remote control buttons */
|
||||
|
||||
#define BUTTON_RC_VOL_UP 0x00000400
|
||||
#define BUTTON_RC_VOL_DOWN 0x00000800
|
||||
#define BUTTON_RC_FF 0x00001000
|
||||
#define BUTTON_RC_REW 0x00002000
|
||||
|
||||
#define BUTTON_RC_PLAY 0x00004000
|
||||
#define BUTTON_RC_DSP 0x00008000
|
||||
|
||||
/* Toshiba Gigabeat specific remote button ADC values */
|
||||
/* The remote control uses ADC 1 to emulate button pushes
|
||||
Reading (approx) Button HP plugged in? Remote plugged in?
|
||||
0 N/A Yes No
|
||||
125 Play/Pause Cant tell Yes
|
||||
241 Speaker+ Cant tell Yes
|
||||
369 Rewind Cant tell Yes
|
||||
492 Fast Fwd Cant tell Yes
|
||||
616 Vol + Cant tell Yes
|
||||
742 Vol - Cant tell Yes
|
||||
864 None Cant tell Yes
|
||||
1023 N/A No No
|
||||
*/
|
||||
|
||||
/*
|
||||
Notes:
|
||||
|
||||
Buttons on the remote are translated into equivalent button presses just
|
||||
as if you were pressing them on the Gigabeat itself.
|
||||
|
||||
We cannot tell if the hold is asserted on the remote. The Hold function on
|
||||
the remote is to block the output of the buttons changing.
|
||||
|
||||
Only one button can be sensed at a time. If another is pressed, the button
|
||||
with the lowest reading is dominant. So, if Rewind and Vol + are pressed
|
||||
at the same time, Rewind value is the one that is read.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
#define BUTTON_MAIN (BUTTON_POWER|BUTTON_MENU|BUTTON_LEFT|BUTTON_RIGHT\
|
||||
|BUTTON_UP|BUTTON_DOWN|BUTTON_VOL_UP|BUTTON_VOL_DOWN\
|
||||
|BUTTON_SELECT|BUTTON_A)
|
||||
|
||||
#define BUTTON_REMOTE (BUTTON_RC_VOL_UP|BUTTON_RC_VOL_DOWN|BUTTON_RC_FF\
|
||||
|BUTTON_RC_REW|BUTTON_RC_PLAY|BUTTON_RC_DSP)
|
||||
|
||||
#define POWEROFF_BUTTON BUTTON_POWER
|
||||
#define POWEROFF_COUNT 10
|
||||
|
||||
#endif /* _BUTTON_TARGET_H_ */
|
48
firmware/target/arm/olympus/mrobe-500/kernel-mr500.c
Normal file
48
firmware/target/arm/olympus/mrobe-500/kernel-mr500.c
Normal file
|
@ -0,0 +1,48 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "system.h"
|
||||
#include "kernel.h"
|
||||
#include "timer.h"
|
||||
#include "thread.h"
|
||||
|
||||
extern void (*tick_funcs[MAX_NUM_TICK_TASKS])(void);
|
||||
|
||||
void tick_start(unsigned int interval_in_ms)
|
||||
{
|
||||
(void)interval_in_ms;
|
||||
}
|
||||
|
||||
void TIMER4(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
/* Run through the list of tick tasks */
|
||||
for(i = 0; i < MAX_NUM_TICK_TASKS; i++)
|
||||
{
|
||||
if(tick_funcs[i])
|
||||
{
|
||||
tick_funcs[i]();
|
||||
}
|
||||
}
|
||||
|
||||
current_tick++;
|
||||
|
||||
}
|
206
firmware/target/arm/olympus/mrobe-500/lcd-mr500.c
Normal file
206
firmware/target/arm/olympus/mrobe-500/lcd-mr500.c
Normal file
|
@ -0,0 +1,206 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* Some of this is based on the Cowon A2 Firmware release:
|
||||
* http://www.cowonglobal.com/download/gnu/cowon_pmp_a2_src_1.59_GPL.tar.gz
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "string.h"
|
||||
#include "lcd.h"
|
||||
#include "kernel.h"
|
||||
#include "memory.h"
|
||||
#include "system-target.h"
|
||||
|
||||
static volatile bool lcd_on = true;
|
||||
volatile bool lcd_poweroff = false;
|
||||
/*
|
||||
** These are imported from lcd-16bit.c
|
||||
*/
|
||||
extern unsigned fg_pattern;
|
||||
extern unsigned bg_pattern;
|
||||
|
||||
bool lcd_enabled(void)
|
||||
{
|
||||
return lcd_on;
|
||||
}
|
||||
|
||||
/* LCD init - based on code from ingenient-bsp/bootloader/board/dm320/splash.c
|
||||
* and code by Catalin Patulea from the M:Robe 500i linux port
|
||||
*/
|
||||
void lcd_init_device(void)
|
||||
{
|
||||
unsigned int addr;
|
||||
|
||||
/* Clear the Frame */
|
||||
memset16(FRAME, 0x0000, LCD_WIDTH*LCD_HEIGHT);
|
||||
|
||||
outw(0x00ff, IO_OSD_MODE);
|
||||
outw(0x0002, IO_OSD_VIDWINMD);
|
||||
outw(0x2001, IO_OSD_OSDWINMD0);
|
||||
outw(0x0002, IO_OSD_OSDWINMD1);
|
||||
outw(0x0000, IO_OSD_ATRMD);
|
||||
outw(0x0000, IO_OSD_RECTCUR);
|
||||
|
||||
outw((480*2) / 32, IO_OSD_OSDWIN0OFST);
|
||||
addr = ((int)FRAME-CONFIG_SDRAM_START) / 32;
|
||||
outw(addr >> 16, IO_OSD_OSDWINADH);
|
||||
outw(addr & 0xFFFF, IO_OSD_OSDWIN0ADL);
|
||||
|
||||
outw(80, IO_OSD_BASEPX);
|
||||
outw(2, IO_OSD_BASEPY);
|
||||
|
||||
outw(0, IO_OSD_OSDWIN0XP);
|
||||
outw(0, IO_OSD_OSDWIN0YP);
|
||||
outw(480, IO_OSD_OSDWIN0XL);
|
||||
outw(640, IO_OSD_OSDWIN0YL);
|
||||
}
|
||||
|
||||
/* Update a fraction of the display. */
|
||||
void lcd_update_rect(int x, int y, int width, int height)
|
||||
{
|
||||
fb_data *dst, *src;
|
||||
|
||||
if (!lcd_on)
|
||||
return;
|
||||
|
||||
if (x + width > LCD_WIDTH)
|
||||
width = LCD_WIDTH - x; /* Clip right */
|
||||
if (x < 0)
|
||||
width += x, x = 0; /* Clip left */
|
||||
if (width <= 0)
|
||||
return; /* nothing left to do */
|
||||
|
||||
if (y + height > LCD_HEIGHT)
|
||||
height = LCD_HEIGHT - y; /* Clip bottom */
|
||||
if (y < 0)
|
||||
height += y, y = 0; /* Clip top */
|
||||
if (height <= 0)
|
||||
return; /* nothing left to do */
|
||||
|
||||
dst = (fb_data *)FRAME + LCD_WIDTH*y + x;
|
||||
src = &lcd_framebuffer[y][x];
|
||||
|
||||
/* Copy part of the Rockbox framebuffer to the second framebuffer */
|
||||
if (width < LCD_WIDTH)
|
||||
{
|
||||
int y;
|
||||
/* Not full width - do line-by-line */
|
||||
for(y=0;y<height;y++)
|
||||
{
|
||||
memcpy(dst, src, width*sizeof(fb_data));
|
||||
dst+=LCD_WIDTH;
|
||||
src+=LCD_WIDTH;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Full width - copy as one line */
|
||||
memcpy(dst, src, LCD_WIDTH*height*sizeof(fb_data));
|
||||
}
|
||||
}
|
||||
|
||||
void lcd_enable(bool state)
|
||||
{
|
||||
(void)state;
|
||||
}
|
||||
|
||||
/* Update the display.
|
||||
This must be called after all other LCD functions that change the display. */
|
||||
void lcd_update(void)
|
||||
{
|
||||
if (!lcd_on)
|
||||
return;
|
||||
|
||||
memcpy((fb_data *)FRAME, &lcd_framebuffer[0][0],
|
||||
LCD_WIDTH*LCD_HEIGHT*sizeof(fb_data));
|
||||
}
|
||||
|
||||
/* Line write helper function for lcd_yuv_blit. Write two lines of yuv420. */
|
||||
extern void lcd_write_yuv420_lines(fb_data *dst,
|
||||
unsigned char chroma_buf[LCD_HEIGHT/2*3],
|
||||
unsigned char const * const src[3],
|
||||
int width,
|
||||
int stride);
|
||||
/* Performance function to blit a YUV bitmap directly to the LCD */
|
||||
/* For the Gigabeat - show it rotated */
|
||||
/* So the LCD_WIDTH is now the height */
|
||||
void lcd_yuv_blit(unsigned char * const src[3],
|
||||
int src_x, int src_y, int stride,
|
||||
int x, int y, int width, int height)
|
||||
{
|
||||
/* Caches for chroma data so it only need be recaculated every other
|
||||
line */
|
||||
unsigned char chroma_buf[LCD_HEIGHT/2*3]; /* 480 bytes */
|
||||
unsigned char const * yuv_src[3];
|
||||
off_t z;
|
||||
|
||||
if (!lcd_on)
|
||||
return;
|
||||
|
||||
/* Sorry, but width and height must be >= 2 or else */
|
||||
width &= ~1;
|
||||
height >>= 1;
|
||||
|
||||
fb_data *dst = (fb_data*)FRAME + x * LCD_WIDTH + (LCD_WIDTH - y) - 1;
|
||||
|
||||
z = stride*src_y;
|
||||
yuv_src[0] = src[0] + z + src_x;
|
||||
yuv_src[1] = src[1] + (z >> 2) + (src_x >> 1);
|
||||
yuv_src[2] = src[2] + (yuv_src[1] - src[1]);
|
||||
|
||||
do
|
||||
{
|
||||
lcd_write_yuv420_lines(dst, chroma_buf, yuv_src, width,
|
||||
stride);
|
||||
yuv_src[0] += stride << 1; /* Skip down two luma lines */
|
||||
yuv_src[1] += stride >> 1; /* Skip down one chroma line */
|
||||
yuv_src[2] += stride >> 1;
|
||||
dst -= 2;
|
||||
}
|
||||
while (--height > 0);
|
||||
}
|
||||
|
||||
void lcd_set_contrast(int val) {
|
||||
(void) val;
|
||||
// TODO:
|
||||
}
|
||||
|
||||
void lcd_set_invert_display(bool yesno) {
|
||||
(void) yesno;
|
||||
// TODO:
|
||||
}
|
||||
|
||||
void lcd_blit(const fb_data* data, int bx, int y, int bwidth,
|
||||
int height, int stride)
|
||||
{
|
||||
(void) data;
|
||||
(void) bx;
|
||||
(void) y;
|
||||
(void) bwidth;
|
||||
(void) height;
|
||||
(void) stride;
|
||||
//TODO:
|
||||
}
|
||||
|
||||
void lcd_set_flip(bool yesno) {
|
||||
(void) yesno;
|
||||
// TODO:
|
||||
}
|
||||
|
21
firmware/target/arm/olympus/mrobe-500/lcd-target.h
Normal file
21
firmware/target/arm/olympus/mrobe-500/lcd-target.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
extern void lcd_enable(bool state);
|
||||
|
93
firmware/target/arm/olympus/mrobe-500/power-mr500.c
Normal file
93
firmware/target/arm/olympus/mrobe-500/power-mr500.c
Normal file
|
@ -0,0 +1,93 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include <stdbool.h>
|
||||
#include "kernel.h"
|
||||
#include "system.h"
|
||||
#include "power.h"
|
||||
#include "pcf50606.h"
|
||||
#include "backlight.h"
|
||||
#include "backlight-target.h"
|
||||
|
||||
#ifndef SIMULATOR
|
||||
|
||||
void power_init(void)
|
||||
{
|
||||
/* Initialize IDE power pin */
|
||||
ide_power_enable(true);
|
||||
/* Charger detect */
|
||||
}
|
||||
|
||||
bool charger_inserted(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Returns true if the unit is charging the batteries. */
|
||||
bool charging_state(void) {
|
||||
return false;
|
||||
}
|
||||
|
||||
void ide_power_enable(bool on)
|
||||
{
|
||||
if (on)
|
||||
return;
|
||||
else
|
||||
return;
|
||||
}
|
||||
|
||||
bool ide_powered(void)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void power_off(void)
|
||||
{
|
||||
/* turn off backlight and wait for 1 second */
|
||||
__backlight_off();
|
||||
sleep(HZ);
|
||||
/* set SLEEP bit to on in CLKCON to turn off */
|
||||
// CLKCON |=(1<<3);
|
||||
}
|
||||
|
||||
#else /* SIMULATOR */
|
||||
|
||||
bool charger_inserted(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
void charger_enable(bool on)
|
||||
{
|
||||
(void)on;
|
||||
}
|
||||
|
||||
void power_off(void)
|
||||
{
|
||||
}
|
||||
|
||||
void ide_power_enable(bool on)
|
||||
{
|
||||
(void)on;
|
||||
}
|
||||
|
||||
#endif /* SIMULATOR */
|
||||
|
181
firmware/target/arm/olympus/mrobe-500/system-mr500.c
Normal file
181
firmware/target/arm/olympus/mrobe-500/system-mr500.c
Normal file
|
@ -0,0 +1,181 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "kernel.h"
|
||||
#include "system.h"
|
||||
#include "panic.h"
|
||||
|
||||
#define default_interrupt(name) \
|
||||
extern __attribute__((weak,alias("UIRQ"))) void name (void)
|
||||
|
||||
default_interrupt(TIMER0);
|
||||
default_interrupt(TIMER1);
|
||||
default_interrupt(TIMER2);
|
||||
default_interrupt(TIMER3);
|
||||
default_interrupt(CCD_VD0);
|
||||
default_interrupt(CCD_VD1);
|
||||
default_interrupt(CCD_WEN);
|
||||
default_interrupt(VENC);
|
||||
default_interrupt(SERIAL0);
|
||||
default_interrupt(SERIAL1);
|
||||
default_interrupt(EXT_HOST);
|
||||
default_interrupt(DSPHINT);
|
||||
default_interrupt(UART0);
|
||||
default_interrupt(UART1);
|
||||
default_interrupt(USB_DMA);
|
||||
default_interrupt(USB_CORE);
|
||||
default_interrupt(VLYNQ);
|
||||
default_interrupt(MTC0);
|
||||
default_interrupt(MTC1);
|
||||
default_interrupt(SD_MMC);
|
||||
default_interrupt(SDIO_MS);
|
||||
default_interrupt(GIO0);
|
||||
default_interrupt(GIO1);
|
||||
default_interrupt(GIO2);
|
||||
default_interrupt(GIO3);
|
||||
default_interrupt(GIO4);
|
||||
default_interrupt(GIO5);
|
||||
default_interrupt(GIO6);
|
||||
default_interrupt(GIO7);
|
||||
default_interrupt(GIO8);
|
||||
default_interrupt(GIO9);
|
||||
default_interrupt(GIO10);
|
||||
default_interrupt(GIO11);
|
||||
default_interrupt(GIO12);
|
||||
default_interrupt(GIO13);
|
||||
default_interrupt(GIO14);
|
||||
default_interrupt(GIO15);
|
||||
default_interrupt(PREVIEW0);
|
||||
default_interrupt(PREVIEW1);
|
||||
default_interrupt(WATCHDOG);
|
||||
default_interrupt(I2C);
|
||||
default_interrupt(CLKC);
|
||||
default_interrupt(ICE);
|
||||
default_interrupt(ARMCOM_RX);
|
||||
default_interrupt(ARMCOM_TX);
|
||||
default_interrupt(RESERVED);
|
||||
|
||||
static void (* const irqvector[])(void) =
|
||||
{
|
||||
TIMER0,TIMER1,TIMER2,TIMER3,CCD_VD0,CCD_VD1,
|
||||
CCD_WEN,VENC,SERIAL0,SERIAL1,EXT_HOST,DSPHINT,
|
||||
UART0,UART1,USB_DMA,USB_CORE,VLYNQ,MTC0,MTC1,
|
||||
SD_MMC,SDIO_MS,GIO0,GIO1,GIO2,GIO3,GIO4,GIO5,
|
||||
GIO6,GIO7,GIO8,GIO9,GIO10,GIO11,GIO12,GIO13,
|
||||
GIO14,GIO15,PREVIEW0,PREVIEW1,WATCHDOG,I2C,CLKC,
|
||||
ICE,ARMCOM_RX,ARMCOM_TX,RESERVED
|
||||
};
|
||||
|
||||
static const char * const irqname[] =
|
||||
{
|
||||
"TIMER0","TIMER1","TIMER2","TIMER3","CCD_VD0","CCD_VD1",
|
||||
"CCD_WEN","VENC","SERIAL0","SERIAL1","EXT_HOST","DSPHINT",
|
||||
"UART0","UART1","USB_DMA","USB_CORE","VLYNQ","MTC0","MTC1",
|
||||
"SD_MMC","SDIO_MS","GIO0","GIO1","GIO2","GIO3","GIO4","GIO5",
|
||||
"GIO6","GIO7","GIO8","GIO9","GIO10","GIO11","GIO12","GIO13",
|
||||
"GIO14","GIO15","PREVIEW0","PREVIEW1","WATCHDOG","I2C","CLKC",
|
||||
"ICE","ARMCOM_RX","ARMCOM_TX","RESERVED"
|
||||
};
|
||||
|
||||
static void UIRQ(void)
|
||||
{
|
||||
unsigned int offset = inw(IO_INTC_IRQENTRY0);
|
||||
panicf("Unhandled IRQ %02X: %s", offset, irqname[offset]);
|
||||
}
|
||||
|
||||
void irq_handler(void) __attribute__((interrupt ("IRQ"), naked));
|
||||
void irq_handler(void)
|
||||
{
|
||||
/*
|
||||
* Based on: linux/arch/arm/kernel/entry-armv.S and system-meg-fx.c
|
||||
*/
|
||||
|
||||
asm volatile (
|
||||
"sub lr, lr, #4 \r\n"
|
||||
"stmfd sp!, {r0-r3, ip, lr} \r\n"
|
||||
"mov r0, #0x00030000 \r\n"
|
||||
"ldr r0, [r0, #0x518] \r\n"
|
||||
"ldr r1, =irqvector \r\n"
|
||||
"ldr r1, [r1, r0, lsl #2] \r\n"
|
||||
"mov lr, pc \r\n"
|
||||
"bx r1 \r\n"
|
||||
"ldmfd sp!, {r0-r3, ip, pc}^ \r\n"
|
||||
);
|
||||
}
|
||||
|
||||
void system_reboot(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void system_init(void)
|
||||
{
|
||||
/* taken from linux/arch/arm/mach-itdm320-20/irq.c */
|
||||
|
||||
/* Clearing all FIQs and IRQs. */
|
||||
outw(0xFFFF, IO_INTC_IRQ0);
|
||||
outw(0xFFFF, IO_INTC_IRQ1);
|
||||
outw(0xFFFF, IO_INTC_IRQ2);
|
||||
|
||||
outw(0xFFFF, IO_INTC_FIQ0);
|
||||
outw(0xFFFF, IO_INTC_FIQ1);
|
||||
outw(0xFFFF, IO_INTC_FIQ2);
|
||||
|
||||
/* Masking all Interrupts. */
|
||||
outw(0, IO_INTC_EINT0);
|
||||
outw(0, IO_INTC_EINT1);
|
||||
outw(0, IO_INTC_EINT2);
|
||||
|
||||
/* Setting INTC to all IRQs. */
|
||||
outw(0, IO_INTC_FISEL0);
|
||||
outw(0, IO_INTC_FISEL1);
|
||||
outw(0, IO_INTC_FISEL2);
|
||||
}
|
||||
|
||||
int system_memory_guard(int newmode)
|
||||
{
|
||||
(void)newmode;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef HAVE_ADJUSTABLE_CPU_FREQ
|
||||
|
||||
void set_cpu_frequency(long frequency)
|
||||
{
|
||||
if (frequency == CPUFREQ_MAX)
|
||||
{
|
||||
asm volatile("mov r0, #0\n"
|
||||
"mrc p15, 0, r0, c1, c0, 0\n"
|
||||
"orr r0, r0, #3<<30\n" /* set to Asynchronous mode*/
|
||||
"mcr p15, 0, r0, c1, c0, 0" : : : "r0");
|
||||
|
||||
FREQ = CPUFREQ_MAX;
|
||||
}
|
||||
else
|
||||
{
|
||||
asm volatile("mov r0, #0\n"
|
||||
"mrc p15, 0, r0, c1, c0, 0\n"
|
||||
"bic r0, r0, #3<<30\n" /* set to FastBus mode*/
|
||||
"mcr p15, 0, r0, c1, c0, 0" : : : "r0");
|
||||
|
||||
FREQ = CPUFREQ_NORMAL;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
108
firmware/target/arm/olympus/mrobe-500/timer-mr500.c
Normal file
108
firmware/target/arm/olympus/mrobe-500/timer-mr500.c
Normal file
|
@ -0,0 +1,108 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "timer.h"
|
||||
#include "logf.h"
|
||||
|
||||
/* GPB0/TOUT0 should already have been configured as output so that pin
|
||||
should not be a functional pin and TIMER0 output unseen there */
|
||||
void TIMER0(void)
|
||||
{
|
||||
if (pfn_timer != NULL)
|
||||
pfn_timer();
|
||||
}
|
||||
|
||||
static void stop_timer(void)
|
||||
{
|
||||
}
|
||||
|
||||
bool __timer_set(long cycles, bool start)
|
||||
{
|
||||
/* taken from linux/arch/arm/mach-itdm320-20/time.c and timer-meg-fx.c */
|
||||
|
||||
/* Turn off all timers */
|
||||
/* outw(CONFIG_TIMER0_TMMD_STOP, IO_TIMER0_TMMD);
|
||||
outw(CONFIG_TIMER1_TMMD_STOP, IO_TIMER1_TMMD);
|
||||
outw(CONFIG_TIMER2_TMMD_STOP, IO_TIMER2_TMMD);
|
||||
outw(CONFIG_TIMER3_TMMD_STOP, IO_TIMER3_TMMD);
|
||||
*/
|
||||
/* Turn Timer0 to Free Run mode */
|
||||
// outw(CONFIG_TIMER0_TMMD_FREE_RUN, IO_TIMER0_TMMD);
|
||||
|
||||
bool retval = false;
|
||||
|
||||
/* Find the minimum factor that puts the counter in range 1-65535 */
|
||||
unsigned int prescaler = (cycles + 65534) / 65535;
|
||||
|
||||
/* Test this by writing 1's to registers to see how many bits we have */
|
||||
/* Maximum divider setting is x / 1024 / 65536 = x / 67108864 */
|
||||
{
|
||||
int oldlevel;
|
||||
unsigned int divider;
|
||||
|
||||
if (start && pfn_unregister != NULL)
|
||||
{
|
||||
pfn_unregister();
|
||||
pfn_unregister = NULL;
|
||||
}
|
||||
|
||||
oldlevel = set_irq_level(HIGHEST_IRQ_LEVEL);
|
||||
|
||||
/* Max prescale is 1023+1 */
|
||||
for (divider = 0; prescaler > 1024; prescaler >>= 1, divider++);
|
||||
|
||||
/* Setup the Prescalar */
|
||||
outw(prescaler, IO_TIMER0_TMPRSCL);
|
||||
|
||||
/* Setup the Divisor */
|
||||
outw(divider, IO_TIMER0_TMDIV);
|
||||
|
||||
set_irq_level(oldlevel);
|
||||
|
||||
retval = true;
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
bool __timer_register(void)
|
||||
{
|
||||
bool retval = true;
|
||||
|
||||
int oldstatus = set_interrupt_status(IRQ_FIQ_DISABLED, IRQ_FIQ_STATUS);
|
||||
|
||||
stop_timer();
|
||||
|
||||
/* Turn Timer0 to Free Run mode */
|
||||
outw(0x0002, IO_TIMER0_TMMD);
|
||||
|
||||
set_interrupt_status(oldstatus, IRQ_FIQ_STATUS);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
void __timer_unregister(void)
|
||||
{
|
||||
int oldstatus = set_interrupt_status(IRQ_FIQ_DISABLED, IRQ_FIQ_STATUS);
|
||||
stop_timer();
|
||||
set_interrupt_status(oldstatus, IRQ_FIQ_STATUS);
|
||||
}
|
39
firmware/target/arm/olympus/mrobe-500/timer-target.h
Normal file
39
firmware/target/arm/olympus/mrobe-500/timer-target.h
Normal file
|
@ -0,0 +1,39 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
#ifndef TIMER_TARGET_H
|
||||
#define TIMER_TARGET_H
|
||||
|
||||
/* timer is based on PCLK and minimum division is 2 */
|
||||
#define TIMER_FREQ (49156800/2)
|
||||
|
||||
bool __timer_set(long cycles, bool set);
|
||||
bool __timer_register(void);
|
||||
void __timer_unregister(void);
|
||||
|
||||
#define __TIMER_SET(cycles, set) \
|
||||
__timer_set(cycles, set)
|
||||
|
||||
#define __TIMER_REGISTER(reg_prio, unregister_callback, cycles, \
|
||||
int_prio, timer_callback) \
|
||||
__timer_register()
|
||||
|
||||
#define __TIMER_UNREGISTER(...) \
|
||||
__timer_unregister()
|
||||
|
||||
#endif /* TIMER_TARGET_H */
|
55
firmware/target/arm/olympus/mrobe-500/usb-mr500.c
Normal file
55
firmware/target/arm/olympus/mrobe-500/usb-mr500.c
Normal file
|
@ -0,0 +1,55 @@
|
|||
/***************************************************************************
|
||||
* __________ __ ___.
|
||||
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
||||
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
||||
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||
* \/ \/ \/ \/ \/
|
||||
* $Id: $
|
||||
*
|
||||
* Copyright (C) 2007 by Karl Kurbjun
|
||||
*
|
||||
* All files in this archive are subject to the GNU General Public License.
|
||||
* See the file COPYING in the source tree root for full license agreement.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include "config.h"
|
||||
#include "cpu.h"
|
||||
#include "system.h"
|
||||
#include "kernel.h"
|
||||
#include "ata.h"
|
||||
|
||||
#define USB_RST_ASSERT
|
||||
#define USB_RST_DEASSERT
|
||||
|
||||
#define USB_VPLUS_PWR_ASSERT
|
||||
#define USB_VPLUS_PWR_DEASSERT
|
||||
|
||||
#define USB_UNIT_IS_PRESENT false
|
||||
|
||||
/* The usb detect is one pin to the cpu active low */
|
||||
inline bool usb_detect(void)
|
||||
{
|
||||
return USB_UNIT_IS_PRESENT;
|
||||
}
|
||||
|
||||
void usb_init_device(void)
|
||||
{
|
||||
// ata_enable(true);
|
||||
}
|
||||
|
||||
void usb_enable(bool on)
|
||||
{
|
||||
if (on)
|
||||
{
|
||||
USB_VPLUS_PWR_ASSERT;
|
||||
}
|
||||
else
|
||||
{
|
||||
USB_VPLUS_PWR_DEASSERT;
|
||||
}
|
||||
}
|
|
@ -22,6 +22,15 @@
|
|||
#define nop \
|
||||
asm volatile ("nop")
|
||||
|
||||
//#define outw(v,a) *(volatile unsigned short *)(a+PHY_IO_BASE) = (v)
|
||||
#ifndef outw
|
||||
#define outw(v,p) (*((unsigned short*)(p + PHY_IO_BASE)) = v)
|
||||
#endif
|
||||
|
||||
#ifndef inw
|
||||
#define inw(p) (*((unsigned short*)(p + PHY_IO_BASE)))
|
||||
#endif
|
||||
|
||||
/* This gets too complicated otherwise with all the ARM variation and would
|
||||
have conflicts with another system-target.h elsewhere so include a
|
||||
subheader from here. */
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
#include "system-arm.h"
|
||||
|
||||
#if (CONFIG_CPU == PP5002) || (CONFIG_CPU == PP5022) || (CONFIG_CPU == PP5024)
|
||||
/* TODO: This header is actually portalplayer specific, and should be
|
||||
* moved into an appropriate subdir (or even split in 2). */
|
||||
|
||||
|
@ -90,5 +91,6 @@ static inline void flush_icache(void)
|
|||
}
|
||||
|
||||
#endif /* CONFIG_CPU */
|
||||
#endif
|
||||
|
||||
#endif /* SYSTEM_TARGET_H */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue