mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-10-14 10:37:38 -04:00
Gigabeat S: Interrupt enabled bootloader. Miscellaneous integration changes.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@16243 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
7667a865ff
commit
a07c034de7
15 changed files with 283 additions and 194 deletions
|
@ -52,16 +52,27 @@ char buf[MAX_PATH];
|
||||||
char basedir[] = "/Content/0b00/00/"; /* Where files sent via MTP are stored */
|
char basedir[] = "/Content/0b00/00/"; /* Where files sent via MTP are stored */
|
||||||
char model[5];
|
char model[5];
|
||||||
int (*kernel_entry)(void);
|
int (*kernel_entry)(void);
|
||||||
|
extern void reference_system_c(void);
|
||||||
|
|
||||||
|
/* Dummy stub that creates C references for C functions only used by
|
||||||
|
assembly - never called */
|
||||||
|
void reference_files(void)
|
||||||
|
{
|
||||||
|
reference_system_c();
|
||||||
|
}
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
lcd_clear_display();
|
lcd_clear_display();
|
||||||
printf("Hello world!");
|
printf("Hello world!");
|
||||||
printf("Gigabeat S Rockbox Bootloader v.00000002");
|
printf("Gigabeat S Rockbox Bootloader v.00000003");
|
||||||
|
system_init();
|
||||||
kernel_init();
|
kernel_init();
|
||||||
printf("kernel init done");
|
printf("kernel init done");
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
|
set_interrupt_status(IRQ_FIQ_ENABLED, IRQ_FIQ_STATUS);
|
||||||
|
|
||||||
rc = ata_init();
|
rc = ata_init();
|
||||||
if(rc)
|
if(rc)
|
||||||
{
|
{
|
||||||
|
@ -109,11 +120,13 @@ void main(void)
|
||||||
printf("Loading firmware");
|
printf("Loading firmware");
|
||||||
|
|
||||||
unsigned char *loadbuffer = (unsigned char *)0x0;
|
unsigned char *loadbuffer = (unsigned char *)0x0;
|
||||||
int buffer_size = 1024*1024;
|
int buffer_size = 31*1024*1024;
|
||||||
|
|
||||||
rc = load_firmware(loadbuffer, buf, buffer_size);
|
rc = load_firmware(loadbuffer, buf, buffer_size);
|
||||||
if(rc < 0)
|
if(rc < 0)
|
||||||
error(buf, rc);
|
error((int)buf, rc);
|
||||||
|
|
||||||
|
system_prepare_fw_start();
|
||||||
|
|
||||||
if (rc == EOK)
|
if (rc == EOK)
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,7 +41,8 @@ INPUT(target/sh/crt0.o)
|
||||||
#define DRAMSIZE (MEMORYSIZE * 0x100000) - 0x100 - PLUGINSIZE - STUBOFFSET - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
|
#define DRAMSIZE (MEMORYSIZE * 0x100000) - 0x100 - PLUGINSIZE - STUBOFFSET - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
|
||||||
#elif CONFIG_CPU==IMX31L
|
#elif CONFIG_CPU==IMX31L
|
||||||
#include "imx31l.h"
|
#include "imx31l.h"
|
||||||
#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE - TTB_SIZE
|
/* Subtract 1MB for the FRAME/TTB section */
|
||||||
|
#define DRAMSIZE (MEMORYSIZE * 0x100000 - 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE
|
||||||
#elif CONFIG_CPU==DM320
|
#elif CONFIG_CPU==DM320
|
||||||
#include "dm320.h"
|
#include "dm320.h"
|
||||||
#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
|
#define DRAMSIZE (MEMORYSIZE * 0x100000) - PLUGINSIZE - STUBOFFSET - CODECSIZE - LCD_BUFFER_SIZE - TTB_SIZE
|
||||||
|
|
|
@ -80,7 +80,10 @@ INPUT(target/sh/crt0.o)
|
||||||
#define FLASHORIG 0x001f0000
|
#define FLASHORIG 0x001f0000
|
||||||
#define FLASHSIZE 2M
|
#define FLASHSIZE 2M
|
||||||
#elif CONFIG_CPU == IMX31L
|
#elif CONFIG_CPU == IMX31L
|
||||||
#define DRAMORIG 0x80000000
|
#define DRAMORIG (0x02000000-0x00100000)
|
||||||
|
#undef DRAMSIZE
|
||||||
|
#define DRAMSIZE (1 << 20) /* Limit 1 MB for bootloader */
|
||||||
|
#define IRAM DRAM
|
||||||
#define IRAMORIG 0x1FFFC000
|
#define IRAMORIG 0x1FFFC000
|
||||||
#define IRAMSIZE 16K
|
#define IRAMSIZE 16K
|
||||||
#define FLASHORIG 0x0000000
|
#define FLASHORIG 0x0000000
|
||||||
|
@ -115,7 +118,12 @@ MEMORY
|
||||||
#endif
|
#endif
|
||||||
IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
|
IRAM : ORIGIN = IRAMORIG, LENGTH = IRAMSIZE
|
||||||
}
|
}
|
||||||
#elif !defined(CPU_PP) && (CONFIG_CPU!=S3C2440) && (CONFIG_CPU!=IMX31L)
|
#elif CONFIG_CPU == IMX31L
|
||||||
|
MEMORY
|
||||||
|
{
|
||||||
|
DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
|
||||||
|
}
|
||||||
|
#elif !defined(CPU_PP) && (CONFIG_CPU!=S3C2440)
|
||||||
MEMORY
|
MEMORY
|
||||||
{
|
{
|
||||||
DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
|
DRAM : ORIGIN = DRAMORIG, LENGTH = DRAMSIZE
|
||||||
|
@ -302,30 +310,38 @@ SECTIONS
|
||||||
}
|
}
|
||||||
#elif (CONFIG_CPU==IMX31L)
|
#elif (CONFIG_CPU==IMX31L)
|
||||||
{
|
{
|
||||||
#if 0
|
. = DRAMORIG;
|
||||||
.vectors 0x0 :
|
|
||||||
{
|
|
||||||
_vectorsstart = .;
|
|
||||||
*(.vectors);
|
|
||||||
_vectorsend = .;
|
|
||||||
} AT> DRAM
|
|
||||||
#endif
|
|
||||||
. = 0x82000000;
|
|
||||||
|
|
||||||
.text :
|
.text :
|
||||||
{
|
{
|
||||||
*(.init.text)
|
*(.init.text)
|
||||||
*(.text*)
|
*(.text*)
|
||||||
}
|
*(.icode)
|
||||||
|
*(.glue_7)
|
||||||
|
*(.glue_7t)
|
||||||
|
. = ALIGN(0x4);
|
||||||
|
} > DRAM
|
||||||
|
|
||||||
|
.rodata :
|
||||||
|
{
|
||||||
|
*(.rodata) /* problems without this, dunno why */
|
||||||
|
*(.rodata*)
|
||||||
|
*(.rodata.str1.1)
|
||||||
|
*(.rodata.str1.4)
|
||||||
|
. = ALIGN(0x4);
|
||||||
|
|
||||||
|
/* Pseudo-allocate the copies of the data sections */
|
||||||
|
_datacopy = .;
|
||||||
|
} > DRAM
|
||||||
|
|
||||||
.data :
|
.data :
|
||||||
{
|
{
|
||||||
*(.icode)
|
|
||||||
*(.irodata)
|
*(.irodata)
|
||||||
*(.idata)
|
*(.idata)
|
||||||
*(.data*)
|
*(.data*)
|
||||||
|
. = ALIGN(0x4);
|
||||||
_dataend = . ;
|
_dataend = . ;
|
||||||
}
|
} > DRAM
|
||||||
|
|
||||||
.stack :
|
.stack :
|
||||||
{
|
{
|
||||||
|
@ -335,15 +351,25 @@ SECTIONS
|
||||||
. += 0x2000;
|
. += 0x2000;
|
||||||
_stackend = .;
|
_stackend = .;
|
||||||
stackend = .;
|
stackend = .;
|
||||||
}
|
} > IRAM
|
||||||
|
|
||||||
.bss :
|
.bss :
|
||||||
{
|
{
|
||||||
_edata = .;
|
_edata = .;
|
||||||
*(.bss*);
|
*(.bss*);
|
||||||
*(.ibss);
|
*(.ibss);
|
||||||
|
*(COMMON)
|
||||||
_end = .;
|
_end = .;
|
||||||
}
|
} > DRAM
|
||||||
|
|
||||||
|
.vectors 0x0 :
|
||||||
|
{
|
||||||
|
_vectorsstart = .;
|
||||||
|
*(.vectors);
|
||||||
|
KEEP(*(.vectors));
|
||||||
|
_vectorsend = .;
|
||||||
|
} AT > DRAM
|
||||||
|
_vectorscopy = LOADADDR(.vectors);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
|
|
|
@ -23,7 +23,8 @@
|
||||||
#define REG16_PTR_T volatile unsigned short *
|
#define REG16_PTR_T volatile unsigned short *
|
||||||
#define REG32_PTR_T volatile unsigned long *
|
#define REG32_PTR_T volatile unsigned long *
|
||||||
|
|
||||||
#define TTB_BASE_ADDR (0x80000000 + (64*1024*1024)-TTB_SIZE)
|
/* Place in the section with the framebuffer */
|
||||||
|
#define TTB_BASE_ADDR (0x80100000 + 0x00100000 - TTB_SIZE)
|
||||||
#define IRAM_BASE_ADDR 0x1fffc000
|
#define IRAM_BASE_ADDR 0x1fffc000
|
||||||
#define L2CC_BASE_ADDR 0x30000000
|
#define L2CC_BASE_ADDR 0x30000000
|
||||||
|
|
||||||
|
@ -275,6 +276,7 @@
|
||||||
#define INTENABLEL (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x14))
|
#define INTENABLEL (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x14))
|
||||||
#define INTTYPEH (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x18))
|
#define INTTYPEH (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x18))
|
||||||
#define INTTYPEL (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x1C))
|
#define INTTYPEL (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x1C))
|
||||||
|
#define NIPRIORITY(n) (((REG32_PTR_T)(AVIC_BASE_ADDR+0x20))[n])
|
||||||
#define NIPRIORITY7 (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x20))
|
#define NIPRIORITY7 (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x20))
|
||||||
#define NIPRIORITY6 (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x24))
|
#define NIPRIORITY6 (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x24))
|
||||||
#define NIPRIORITY5 (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x28))
|
#define NIPRIORITY5 (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x28))
|
||||||
|
@ -294,7 +296,7 @@
|
||||||
#define FIPNDH (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x60))
|
#define FIPNDH (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x60))
|
||||||
#define FIPNDL (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x64))
|
#define FIPNDL (*(REG32_PTR_T)(AVIC_BASE_ADDR+0x64))
|
||||||
#define VECTOR_BASE_ADDR (AVIC_BASE_ADDR+0x100)
|
#define VECTOR_BASE_ADDR (AVIC_BASE_ADDR+0x100)
|
||||||
#define VECTOR(n) (*(REG32_PTR_T)(VECTOR_BASE_ADDR+((n)*4)))
|
#define VECTOR(n) (((REG32_PTR_T)VECTOR_BASE_ADDR)[n])
|
||||||
|
|
||||||
/* The vectors go all the way up to 63. 4 bytes for each */
|
/* The vectors go all the way up to 63. 4 bytes for each */
|
||||||
#define INTCNTL_ABFLAG (1 << 25)
|
#define INTCNTL_ABFLAG (1 << 25)
|
||||||
|
|
|
@ -157,8 +157,6 @@ struct event
|
||||||
/* We don't enable interrupts in the iPod bootloader, so we need to fake
|
/* We don't enable interrupts in the iPod bootloader, so we need to fake
|
||||||
the current_tick variable */
|
the current_tick variable */
|
||||||
#define current_tick (signed)(USEC_TIMER/10000)
|
#define current_tick (signed)(USEC_TIMER/10000)
|
||||||
#elif (CONFIG_CPU == IMX31L) && defined(BOOTLOADER)
|
|
||||||
#define current_tick (signed)((0xFFFFFFFF - EPITCNT1)/10000)
|
|
||||||
#else
|
#else
|
||||||
extern volatile long current_tick;
|
extern volatile long current_tick;
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -24,9 +24,6 @@
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
#if CONFIG_CPU == IMX31L
|
|
||||||
#include "avic-imx31.h"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Make this nonzero to enable more elaborate checks on objects */
|
/* Make this nonzero to enable more elaborate checks on objects */
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -42,7 +39,7 @@
|
||||||
#define KERNEL_ASSERT(exp, msg...) ({})
|
#define KERNEL_ASSERT(exp, msg...) ({})
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (!defined(CPU_PP) && (CONFIG_CPU != IMX31L)) || !defined(BOOTLOADER)
|
#if !defined(CPU_PP) || !defined(BOOTLOADER)
|
||||||
volatile long current_tick NOCACHEDATA_ATTR = 0;
|
volatile long current_tick NOCACHEDATA_ATTR = 0;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -107,7 +104,7 @@ void sleep(int ticks)
|
||||||
|
|
||||||
void yield(void)
|
void yield(void)
|
||||||
{
|
{
|
||||||
#if ((CONFIG_CPU == S3C2440 || defined(ELIO_TPJ1022) || CONFIG_CPU == IMX31L) && defined(BOOTLOADER))
|
#if ((CONFIG_CPU == S3C2440 || defined(ELIO_TPJ1022)) && defined(BOOTLOADER))
|
||||||
/* Some targets don't like yielding in the bootloader */
|
/* Some targets don't like yielding in the bootloader */
|
||||||
#else
|
#else
|
||||||
switch_thread(NULL);
|
switch_thread(NULL);
|
||||||
|
|
|
@ -273,5 +273,11 @@ void __div0(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BOOTLOADER
|
||||||
|
void reference_system_c(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* CPU_ARM */
|
#endif /* CPU_ARM */
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,16 @@
|
||||||
|
|
||||||
.global start
|
.global start
|
||||||
start:
|
start:
|
||||||
|
/* Exception vectors */
|
||||||
b newstart
|
b newstart
|
||||||
.space 4*12 /* Space for low vectors */
|
b undef_instr_handler
|
||||||
|
b software_int_handler
|
||||||
|
b prefetch_abort_handler
|
||||||
|
b data_abort_handler
|
||||||
|
b reserved_handler
|
||||||
|
b irq_handler
|
||||||
|
b fiq_handler
|
||||||
|
.balign 0x40, 0x6B
|
||||||
|
|
||||||
/* Arm bootloader and startup code based on startup.s from the iPodLinux loader
|
/* Arm bootloader and startup code based on startup.s from the iPodLinux loader
|
||||||
*
|
*
|
||||||
|
@ -34,17 +41,28 @@ start:
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* Initially this code is running at VA 0x8a000000 (PA 0x82000000).
|
||||||
|
* The mapping stub is copied to IRAM (0x1fffc000) and jumps to the final
|
||||||
|
* VA remapping starting at 0x01f00000 because the 1MB section containing
|
||||||
|
* the framebuffer at PA 0x81000000 is skipped in the remapping giving 63MB
|
||||||
|
* of contiguous RAM for the firmware. The TTB is placed at the end of said
|
||||||
|
* section.
|
||||||
|
*
|
||||||
|
* For now this will be done in bootloader, especially if usb will be needed
|
||||||
|
* within the bootloader to load the main firmware file. Interrupts will be
|
||||||
|
* needed for this (whether they be swi or irq).
|
||||||
|
*/
|
||||||
newstart:
|
newstart:
|
||||||
msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */
|
msr cpsr_c, #0xd3 /* enter supervisor mode, disable IRQ/FIQ */
|
||||||
|
|
||||||
#ifdef BOOTLOADER
|
#ifdef BOOTLOADER
|
||||||
ldr r2, =remap_start
|
adr r2, remap_start /* Load PC-relative labels */
|
||||||
ldr r3, =remap_end
|
adr r3, remap_end
|
||||||
ldr r5, =TTB_BASE_ADDR /* TTB pointer */
|
ldr r5, =TTB_BASE_ADDR /* TTB pointer */
|
||||||
ldr r6, =IRAM_BASE_ADDR
|
ldr r6, =IRAM_BASE_ADDR
|
||||||
mov r1, r6
|
mov r1, r6
|
||||||
|
|
||||||
1:
|
1: /* Copy remapping stub to IRAM */
|
||||||
cmp r3, r2
|
cmp r3, r2
|
||||||
ldrhi r4, [r2], #4
|
ldrhi r4, [r2], #4
|
||||||
strhi r4, [r1], #4
|
strhi r4, [r1], #4
|
||||||
|
@ -52,10 +70,12 @@ newstart:
|
||||||
|
|
||||||
mov pc, r6
|
mov pc, r6
|
||||||
|
|
||||||
|
/* Remapping stub. No absolute addresses may be used until after the
|
||||||
|
* remapping is complete. */
|
||||||
remap_start:
|
remap_start:
|
||||||
mrc p15, 0, r3, c1, c0, 0 /* perform writeback if D cache is enabled */
|
mrc p15, 0, r3, c1, c0, 0 /* perform writeback if D cache is enabled */
|
||||||
tst r3, #(1 << 2)
|
tst r3, #(1 << 2) /* dcache? */
|
||||||
tsteq r3, #(1 << 12)
|
tsteq r3, #(1 << 12) /* or icache? */
|
||||||
mcrne p15, 0, r0, c7, c10, 0 /* clean dcache */
|
mcrne p15, 0, r0, c7, c10, 0 /* clean dcache */
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcrne p15, 0, r0, c7, c7, 0 /* invalidate I cache and D cache */
|
mcrne p15, 0, r0, c7, c7, 0 /* invalidate I cache and D cache */
|
||||||
|
@ -77,9 +97,9 @@ remap_start:
|
||||||
str r1, [r0, #L2_CACHE_CTL_REG]
|
str r1, [r0, #L2_CACHE_CTL_REG]
|
||||||
|
|
||||||
/* Disble L1 caches and memory manager */
|
/* Disble L1 caches and memory manager */
|
||||||
bic r3, r3, #(1 << 1)
|
bic r3, r3, #(1 << 12) /* L1 I-cache disabled */
|
||||||
bic r3, r3, #(1 << 2)
|
bic r3, r3, #((1 << 2) | /* L1 D-cache disabled */ \
|
||||||
bic r3, r3, #(1 << 12)
|
(1 << 0)) /* MMU disabled */
|
||||||
mcr p15, 0, r3, c1, c0, 0
|
mcr p15, 0, r3, c1, c0, 0
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -96,92 +116,97 @@ remap_start:
|
||||||
/* Invalidate L2 */
|
/* Invalidate L2 */
|
||||||
mov r1, #0x000000FF
|
mov r1, #0x000000FF
|
||||||
str r1, [r0, #L2_CACHE_INV_WAY_REG]
|
str r1, [r0, #L2_CACHE_INV_WAY_REG]
|
||||||
L2_loop:
|
1:
|
||||||
/* Poll Invalidate By Way register */
|
/* Poll Invalidate By Way register */
|
||||||
ldr r2, [r0, #L2_CACHE_INV_WAY_REG]
|
ldr r1, [r0, #L2_CACHE_INV_WAY_REG]
|
||||||
cmp r2, #0
|
cmp r1, #0
|
||||||
bne L2_loop
|
bne 1b
|
||||||
|
|
||||||
/*** End of L2 operations ***/
|
/*** End of L2 operations ***/
|
||||||
|
|
||||||
/*remap memory as well as exception vectors*/
|
|
||||||
/*for now this will be done in bootloader, especially
|
|
||||||
if usb will be needed within the bootloader to load the
|
|
||||||
main firmware file. Interrupts will be needed for this
|
|
||||||
(whether they be swi or irq)*/
|
|
||||||
|
|
||||||
/* TTB Initialisation */
|
/* TTB Initialisation */
|
||||||
mov r3, r5
|
mov r2, r5
|
||||||
add r2, r3, #TTB_SIZE
|
add r3, r5, #TTB_SIZE
|
||||||
mov r1, #0
|
mov r1, #0
|
||||||
ttbloop:
|
1:
|
||||||
str r1, [r3], #4
|
str r1, [r2], #4
|
||||||
cmp r3, r2
|
cmp r2, r3
|
||||||
bne ttbloop
|
blo 1b
|
||||||
|
|
||||||
/* Set TTB base address */
|
/* Set TTB base address */
|
||||||
mov r3, r5
|
mcr p15, 0, r5, c2, c0, 0
|
||||||
mcr p15, 0, r3, c2, c0, 0
|
|
||||||
/* Set all domains to manager status */
|
/* Set all domains to manager status */
|
||||||
mvn r3, #0
|
mvn r0, #0
|
||||||
mcr p15, 0, r3, c3, c0, 0
|
mcr p15, 0, r0, c3, c0, 0
|
||||||
|
|
||||||
/* Set page tables */
|
/* Set page tables */
|
||||||
|
|
||||||
/* Map each memory loc to itself, no cache */
|
/* Map each memory loc to itself, no cache */
|
||||||
mov r1, #0 /* Physical address */
|
/* Physical address = 0x0 */
|
||||||
mov r3, r5
|
mov r1, #(1 << 10) /* superuser - r/w, user - no access */
|
||||||
add r4, r3, #TTB_SIZE /* End position */
|
orr r1, r1, #((0 << 5) | /* domain 0th */ \
|
||||||
maploop1:
|
(1 << 4) | /* should be "1" */ \
|
||||||
mov r2, r1
|
(1 << 1)) /* Section signature */
|
||||||
orr r2, r2, #(1<<10) /* superuser - r/w, user - no access */
|
mov r2, r5
|
||||||
//orr r2, r2, #(0<<5) /* domain 0th */
|
add r3, r5, #TTB_SIZE /* End position */
|
||||||
orr r2, r2, #(1<<4) /* should be "1" */
|
1:
|
||||||
orr r2, r2, #(1<<1) /* Section signature */
|
str r1, [r2], #4
|
||||||
str r2, [r3], #4
|
add r1, r1, #(1 << 20) /* Next MB */
|
||||||
add r1, r1, #(1<<20)
|
cmp r2, r3
|
||||||
cmp r3, r4
|
blo 1b
|
||||||
bne maploop1
|
sub r1, r1, #TTB_SIZE/4*(1 << 20) /* Back up */
|
||||||
|
|
||||||
/* Map 0x80000000 -> 0x0, cached */
|
/* Map 0x80000000 -> 0x0, cached */
|
||||||
mov r1, #0x80000000 /* Physical address */
|
mov r2, r5 /* TTB pointer */
|
||||||
mov r3, r5 /* TTB pointer */
|
add r3, r5, #63*4 /* End position */
|
||||||
add r4, r3, #64*4 /* End position */
|
orr r1, r1, #0x80000000 /* Physical address */
|
||||||
maploop2:
|
orr r1, r1, #((1 << 3) | /* cache flag */ \
|
||||||
mov r2, r1
|
(1 << 2)) /* buffer flag */
|
||||||
orr r2, r2, #(1<<10) /* superuser - r/w, user - no access */
|
1:
|
||||||
//orr r2, r2, #(0<<5) /* domain 0th */
|
str r1, [r2], #4
|
||||||
orr r2, r2, #(1<<4) /* should be "1" */
|
add r1, r1, #(1 << 20)
|
||||||
orr r2, r2, #(1<<3) /* cache flags */
|
and r4, r1, #0x0ff00000
|
||||||
orr r2, r2, #(1<<2) /* more cache stuff */
|
cmp r4, #0x00100000 /* Skip framebuffer */
|
||||||
orr r2, r2, #(1<<1) /* Section signature */
|
addeq r1, r1, #(1 << 20)
|
||||||
str r2, [r3], #4
|
cmp r2, r3
|
||||||
add r1, r1, #(1<<20)
|
blo 1b
|
||||||
bic r6, r1, #0xf0000000
|
|
||||||
cmp r6, #0x00100000 /* Skip framebuffer */
|
|
||||||
addeq r1, r1, #(1<<20)
|
|
||||||
cmp r3, r4
|
|
||||||
bne maploop2
|
|
||||||
|
|
||||||
/* Enable MMU */
|
/* Enable MMU */
|
||||||
|
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
mcr p15, 0, r0, c8, c7, 0 /* Invalidate TLB */
|
mcr p15, 0, r0, c8, c7, 0 /* Invalidate TLB */
|
||||||
mcr p15, 0, r0, c7, c7, 0 /* Invalidate icache and dcache */
|
mcr p15, 0, r0, c7, c7, 0 /* Invalidate icache and dcache */
|
||||||
#if 1
|
|
||||||
|
/* Auxilliary control register */
|
||||||
mrc p15, 0, r0, c1, c0, 1
|
mrc p15, 0, r0, c1, c0, 1
|
||||||
bic r0, r0, #0x70
|
bic r0, r0, #((1 << 6) | /* Restrict cache size OFF */ \
|
||||||
bic r0, r0, #0x07
|
(1 << 5) | /* Enable block tranfer cache operations */ \
|
||||||
|
(1 << 4) | /* Clean+Invalidate cache operation ON */ \
|
||||||
|
(1 << 3)) /* Round-robin micro TLB replacement */
|
||||||
|
orr r0, r0, #((1 << 2) | /* Static branch prediction ON */ \
|
||||||
|
(1 << 1) | /* Dynamic branch prediction ON */ \
|
||||||
|
(1 << 0)) /* Return stack enabled */
|
||||||
mcr p15, 0, r0, c1, c0, 1
|
mcr p15, 0, r0, c1, c0, 1
|
||||||
#endif
|
|
||||||
|
/* Control register */
|
||||||
mrc p15, 0, r0, c1, c0, 0
|
mrc p15, 0, r0, c1, c0, 0
|
||||||
orr r0, r0, #(1 << 0) /* enable mmu bit */
|
bic r0, r0, #((1 << 29) | /* AF by AP disabled */ \
|
||||||
orr r0, r0, #(1 << 2) /* enable dcache */
|
(1 << 28) | /* TEX remap disabled */ \
|
||||||
bic r0, r0, #(1 << 11) /* no program flow prediction */
|
(1 << 24) | /* Vectored interrupt OFF */ \
|
||||||
orr r0, r0, #(1 << 12) /* enable icache */
|
(1 << 23) | /* Sub AP bits enabled (compatible) */ \
|
||||||
bic r0, r0, #(1 << 13) /* low vectors */
|
(1 << 22)) /* Unaligned access support disabled */
|
||||||
orr r0, r0, #(1 << 14) /* Round-robin */
|
bic r0, r0, #((1 << 21) | /* All performance features enabled */ \
|
||||||
bic r0, r0, #(1 << 21) /* No low latency interrupt */
|
(1 << 15)) /* Loads to PC set T bit */
|
||||||
|
bic r0, r0, #((1 << 13) | /* Low vectors */ \
|
||||||
|
(1 << 11)) /* Program flow prediction disabled (for now) */
|
||||||
|
orr r0, r0, #((1 << 14) | /* Round-robin replacement for I/D caches */ \
|
||||||
|
(1 << 12) | /* L1 I-cache enabled */ \
|
||||||
|
(1 << 9) | /* ROM protection enabled */ \
|
||||||
|
(1 << 8)) /* MMU protection enabled */
|
||||||
|
orr r0, r0, #((1 << 2) | /* L1 D-cache enabled */ \
|
||||||
|
(1 << 1) | /* Strict alignment enabled */ \
|
||||||
|
(1 << 0)) /* MMU enabled */
|
||||||
mcr p15, 0, r0, c1, c0, 0
|
mcr p15, 0, r0, c1, c0, 0
|
||||||
nop
|
nop
|
||||||
nop
|
nop
|
||||||
|
@ -194,8 +219,8 @@ remap_end:
|
||||||
|
|
||||||
#endif /* BOOTLOADER */
|
#endif /* BOOTLOADER */
|
||||||
|
|
||||||
#ifndef BOOTLOADER
|
#ifdef BOOTLOADER
|
||||||
/* Copy exception handler code to address 0 */
|
/* Copy bootloader exception handler code to address 0 */
|
||||||
ldr r2, =_vectorsstart
|
ldr r2, =_vectorsstart
|
||||||
ldr r3, =_vectorsend
|
ldr r3, =_vectorsend
|
||||||
ldr r4, =_vectorscopy
|
ldr r4, =_vectorscopy
|
||||||
|
@ -204,7 +229,7 @@ remap_end:
|
||||||
ldrhi r5, [r4], #4
|
ldrhi r5, [r4], #4
|
||||||
strhi r5, [r2], #4
|
strhi r5, [r2], #4
|
||||||
bhi 1b
|
bhi 1b
|
||||||
|
#else
|
||||||
/* Zero out IBSS */
|
/* Zero out IBSS */
|
||||||
ldr r2, =_iedata
|
ldr r2, =_iedata
|
||||||
ldr r3, =_iend
|
ldr r3, =_iend
|
||||||
|
@ -261,8 +286,8 @@ remap_end:
|
||||||
msr cpsr_c, #0xd3
|
msr cpsr_c, #0xd3
|
||||||
bl main
|
bl main
|
||||||
|
|
||||||
/* Exception handlers. Will be copied to address 0 after memory remapping */
|
#ifdef BOOTLOADER
|
||||||
_vectorstart:
|
/* Exception vectors with absolute jumps for bootloader */
|
||||||
.section .vectors,"aw"
|
.section .vectors,"aw"
|
||||||
ldr pc, [pc, #24]
|
ldr pc, [pc, #24]
|
||||||
ldr pc, [pc, #24]
|
ldr pc, [pc, #24]
|
||||||
|
@ -272,11 +297,7 @@ _vectorstart:
|
||||||
ldr pc, [pc, #24]
|
ldr pc, [pc, #24]
|
||||||
ldr pc, [pc, #24]
|
ldr pc, [pc, #24]
|
||||||
ldr pc, [pc, #24]
|
ldr pc, [pc, #24]
|
||||||
|
.word newstart
|
||||||
/* Exception vectors */
|
|
||||||
.global vectors
|
|
||||||
vectors:
|
|
||||||
.word start
|
|
||||||
.word undef_instr_handler
|
.word undef_instr_handler
|
||||||
.word software_int_handler
|
.word software_int_handler
|
||||||
.word prefetch_abort_handler
|
.word prefetch_abort_handler
|
||||||
|
@ -284,24 +305,22 @@ vectors:
|
||||||
.word reserved_handler
|
.word reserved_handler
|
||||||
.word irq_handler
|
.word irq_handler
|
||||||
.word fiq_handler
|
.word fiq_handler
|
||||||
|
#endif /* BOOTLOADER */
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
.global UIE
|
.global UIE
|
||||||
|
|
||||||
/* All illegal exceptions call into UIE with exception address as first
|
/* All illegal exceptions call into UIE with exception address as first
|
||||||
parameter. This is calculated differently depending on which exception
|
* parameter. This is calculated differently depending on which exception
|
||||||
we're in. Second parameter is exception number, used for a string lookup
|
* we're in. Second parameter is exception number, used for a string lookup
|
||||||
in UIE.
|
* in UIE. */
|
||||||
*/
|
|
||||||
undef_instr_handler:
|
undef_instr_handler:
|
||||||
mov r0, lr
|
mov r0, lr
|
||||||
mov r1, #0
|
mov r1, #0
|
||||||
b UIE
|
b UIE
|
||||||
|
|
||||||
/* We run supervisor mode most of the time, and should never see a software
|
/* We run supervisor mode most of the time, and should never see a software
|
||||||
exception being thrown. Perhaps make it illegal and call UIE?
|
* exception being thrown. Perhaps make it illegal and call UIE? */
|
||||||
*/
|
|
||||||
software_int_handler:
|
software_int_handler:
|
||||||
reserved_handler:
|
reserved_handler:
|
||||||
movs pc, lr
|
movs pc, lr
|
||||||
|
@ -316,11 +335,6 @@ data_abort_handler:
|
||||||
mov r1, #2
|
mov r1, #2
|
||||||
b UIE
|
b UIE
|
||||||
|
|
||||||
#ifdef BOOTLOADER
|
|
||||||
UIE:
|
|
||||||
b UIE
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* 256 words of IRQ stack */
|
/* 256 words of IRQ stack */
|
||||||
.space 256*4
|
.space 256*4
|
||||||
irq_stack:
|
irq_stack:
|
||||||
|
|
|
@ -84,18 +84,24 @@ void __attribute__((naked)) fiq_handler(void)
|
||||||
|
|
||||||
void avic_init(void)
|
void avic_init(void)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
/* Disable all interrupts and set to unhandled */
|
/* Disable all interrupts and set to unhandled */
|
||||||
avic_disable_int(ALL);
|
avic_disable_int(ALL);
|
||||||
|
|
||||||
|
/* Reset AVIC control */
|
||||||
|
INTCNTL = 0;
|
||||||
|
|
||||||
/* Init all interrupts to type IRQ */
|
/* Init all interrupts to type IRQ */
|
||||||
avic_set_int_type(ALL, IRQ);
|
avic_set_int_type(ALL, IRQ);
|
||||||
|
|
||||||
|
/* Set all normal to lowest priority */
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
NIPRIORITY(i) = 0;
|
||||||
|
|
||||||
/* Set NM bit to enable VIC */
|
/* Set NM bit to enable VIC */
|
||||||
INTCNTL |= INTCNTL_NM;
|
INTCNTL |= INTCNTL_NM;
|
||||||
|
|
||||||
/* Enable IRQ/FIQ in imx31 INTCNTL reg */
|
|
||||||
INTCNTL &= ~(INTCNTL_ABFEN | INTCNTL_NIDIS | INTCNTL_FIDIS);
|
|
||||||
|
|
||||||
/* Enable VE bit in CP15 Control reg to enable VIC */
|
/* Enable VE bit in CP15 Control reg to enable VIC */
|
||||||
asm volatile (
|
asm volatile (
|
||||||
"mrc p15, 0, r0, c1, c0, 0 \n"
|
"mrc p15, 0, r0, c1, c0, 0 \n"
|
||||||
|
@ -104,11 +110,20 @@ void avic_init(void)
|
||||||
: : : "r0");
|
: : : "r0");
|
||||||
|
|
||||||
/* Enable normal interrupts at all priorities */
|
/* Enable normal interrupts at all priorities */
|
||||||
NIMASK = 16;
|
NIMASK = 0x1f;
|
||||||
|
}
|
||||||
|
|
||||||
|
void avic_set_int_priority(enum IMX31_INT_LIST ints,
|
||||||
|
unsigned long ni_priority)
|
||||||
|
{
|
||||||
|
volatile unsigned long *reg = &NIPRIORITY((63 - ints) / 8);
|
||||||
|
unsigned int shift = 4*(ints % 8);
|
||||||
|
unsigned long mask = 0xful << shift;
|
||||||
|
*reg = (*reg & ~mask) | ((ni_priority << shift) & mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
void avic_enable_int(enum IMX31_INT_LIST ints, enum INT_TYPE intstype,
|
void avic_enable_int(enum IMX31_INT_LIST ints, enum INT_TYPE intstype,
|
||||||
void (*handler)(void))
|
unsigned long ni_priority, void (*handler)(void))
|
||||||
{
|
{
|
||||||
int oldstatus = set_interrupt_status(IRQ_FIQ_DISABLED,
|
int oldstatus = set_interrupt_status(IRQ_FIQ_DISABLED,
|
||||||
IRQ_FIQ_STATUS);
|
IRQ_FIQ_STATUS);
|
||||||
|
@ -118,6 +133,7 @@ void avic_enable_int(enum IMX31_INT_LIST ints, enum INT_TYPE intstype,
|
||||||
avic_set_int_type(ints, intstype);
|
avic_set_int_type(ints, intstype);
|
||||||
VECTOR(ints) = (long)handler;
|
VECTOR(ints) = (long)handler;
|
||||||
INTENNUM = ints;
|
INTENNUM = ints;
|
||||||
|
avic_set_int_priority(ints, ni_priority);
|
||||||
}
|
}
|
||||||
|
|
||||||
set_interrupt_status(oldstatus, IRQ_FIQ_STATUS);
|
set_interrupt_status(oldstatus, IRQ_FIQ_STATUS);
|
||||||
|
|
|
@ -49,7 +49,9 @@ enum IMX31_INT_LIST
|
||||||
|
|
||||||
void avic_init(void);
|
void avic_init(void);
|
||||||
void avic_enable_int(enum IMX31_INT_LIST ints, enum INT_TYPE intstype,
|
void avic_enable_int(enum IMX31_INT_LIST ints, enum INT_TYPE intstype,
|
||||||
void (*handler)(void));
|
unsigned long ni_priority, void (*handler)(void));
|
||||||
|
void avic_set_int_priority(enum IMX31_INT_LIST ints,
|
||||||
|
unsigned long ni_priority);
|
||||||
void avic_disable_int(enum IMX31_INT_LIST ints);
|
void avic_disable_int(enum IMX31_INT_LIST ints);
|
||||||
void avic_set_int_type(enum IMX31_INT_LIST ints, enum INT_TYPE intstype);
|
void avic_set_int_type(enum IMX31_INT_LIST ints, enum INT_TYPE intstype);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -7,7 +7,6 @@
|
||||||
|
|
||||||
extern void (*tick_funcs[MAX_NUM_TICK_TASKS])(void);
|
extern void (*tick_funcs[MAX_NUM_TICK_TASKS])(void);
|
||||||
|
|
||||||
#ifndef BOOTLOADER
|
|
||||||
static __attribute__((interrupt("IRQ"))) void EPIT1_HANDLER(void)
|
static __attribute__((interrupt("IRQ"))) void EPIT1_HANDLER(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -23,14 +22,11 @@ static __attribute__((interrupt("IRQ"))) void EPIT1_HANDLER(void)
|
||||||
|
|
||||||
current_tick++;
|
current_tick++;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void tick_start(unsigned int interval_in_ms)
|
void tick_start(unsigned int interval_in_ms)
|
||||||
{
|
{
|
||||||
EPITCR1 &= ~(1 << 0); /* Disable the counter */
|
CLKCTL_CGR0 |= (3 << 6); /* EPIT1 module clock ON - before writing regs! */
|
||||||
EPITCR1 |= (1 << 16); /* Reset */
|
EPITCR1 &= ~((1 << 2) | (1 << 0)); /* Disable the counter */
|
||||||
|
|
||||||
CLKCTL_CGR0 |= (0x3 << 6); /* Clock ON */
|
|
||||||
CLKCTL_WIMR0 &= ~(1 << 23); /* Clear wakeup mask */
|
CLKCTL_WIMR0 &= ~(1 << 23); /* Clear wakeup mask */
|
||||||
|
|
||||||
/* NOTE: This isn't really accurate yet but it's close enough to work
|
/* NOTE: This isn't really accurate yet but it's close enough to work
|
||||||
|
@ -39,17 +35,21 @@ void tick_start(unsigned int interval_in_ms)
|
||||||
/* CLKSRC=32KHz, EPIT Output Disconnected, Enabled
|
/* CLKSRC=32KHz, EPIT Output Disconnected, Enabled
|
||||||
* prescale 1/32, Reload from modulus register, Compare interrupt enabled,
|
* prescale 1/32, Reload from modulus register, Compare interrupt enabled,
|
||||||
* Count from load value */
|
* Count from load value */
|
||||||
EPITCR1 = (0x3 << 24) | (1 << 19) | (32 << 4) |
|
EPITCR1 = (3 << 24) | (1 << 19) | (32 << 4) |
|
||||||
(1 << 3) | (1 << 2) | (1 << 1);
|
(1 << 3) | (1 << 2) | (1 << 1);
|
||||||
#ifndef BOOTLOADER
|
|
||||||
EPITLR1 = interval_in_ms;
|
|
||||||
EPITCMPR1 = 0; /* Event when counter reaches 0 */
|
|
||||||
avic_enable_int(EPIT1, IRQ, EPIT1_HANDLER);
|
|
||||||
#else
|
|
||||||
(void)interval_in_ms;
|
|
||||||
#endif
|
|
||||||
EPITSR1 = 1; /* Clear any pending interrupt after
|
|
||||||
enabling the vector */
|
|
||||||
|
|
||||||
|
EPITLR1 = interval_in_ms; /* Count down from interval */
|
||||||
|
EPITCMPR1 = 0; /* Event when counter reaches 0 */
|
||||||
|
EPITSR1 = 1; /* Clear any pending interrupt */
|
||||||
|
avic_enable_int(EPIT1, IRQ, 7, EPIT1_HANDLER);
|
||||||
EPITCR1 |= (1 << 0); /* Enable the counter */
|
EPITCR1 |= (1 << 0); /* Enable the counter */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BOOTLOADER
|
||||||
|
void tick_stop(void)
|
||||||
|
{
|
||||||
|
avic_disable_int(EPIT1); /* Disable insterrupt */
|
||||||
|
EPITCR1 &= ~((1 << 2) | (1 << 0)); /* Disable counter */
|
||||||
|
CLKCTL_CGR0 &= ~(3 << 6); /* EPIT1 module clock OFF */
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include "kernel.h"
|
#include "kernel.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "panic.h"
|
#include "panic.h"
|
||||||
|
#include "avic-imx31.h"
|
||||||
#include "mmu-imx31.h"
|
#include "mmu-imx31.h"
|
||||||
#include "system-target.h"
|
#include "system-target.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
|
@ -19,11 +20,20 @@ void system_reboot(void)
|
||||||
|
|
||||||
void system_init(void)
|
void system_init(void)
|
||||||
{
|
{
|
||||||
#ifndef BOOTLOADER
|
/* MCR WFI enables wait mode */
|
||||||
|
CLKCTL_CCMR &= ~(3 << 14);
|
||||||
avic_init();
|
avic_init();
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef BOOTLOADER
|
||||||
|
void system_prepare_fw_start(void)
|
||||||
|
{
|
||||||
|
set_interrupt_status(IRQ_FIQ_DISABLED, IRQ_FIQ_STATUS);
|
||||||
|
avic_disable_int(ALL);
|
||||||
|
tick_stop();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
inline void dumpregs(void)
|
inline void dumpregs(void)
|
||||||
{
|
{
|
||||||
asm volatile ("mov %0,r0\n\t"
|
asm volatile ("mov %0,r0\n\t"
|
||||||
|
|
|
@ -33,24 +33,28 @@ static inline void udelay(unsigned int usecs)
|
||||||
#define __dbg_hw_info(...) 0
|
#define __dbg_hw_info(...) 0
|
||||||
#define __dbg_ports(...) 0
|
#define __dbg_ports(...) 0
|
||||||
|
|
||||||
|
void system_prepare_fw_start(void);
|
||||||
|
void tick_stop(void);
|
||||||
|
|
||||||
#define HAVE_INVALIDATE_ICACHE
|
#define HAVE_INVALIDATE_ICACHE
|
||||||
static inline void invalidate_icache(void)
|
static inline void invalidate_icache(void)
|
||||||
{
|
{
|
||||||
long rd = 0;
|
|
||||||
asm volatile(
|
asm volatile(
|
||||||
"mcr p15, 0, %0, c7, c10, 0 \n"
|
/* Clean and invalidate entire data cache */
|
||||||
|
"mcr p15, 0, %0, c7, c14, 0 \n"
|
||||||
|
/* Invalidate entire instruction cache */
|
||||||
"mcr p15, 0, %0, c7, c5, 0 \n"
|
"mcr p15, 0, %0, c7, c5, 0 \n"
|
||||||
: : "r"(rd)
|
: : "r"(0)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define HAVE_FLUSH_ICACHE
|
#define HAVE_FLUSH_ICACHE
|
||||||
static inline void flush_icache(void)
|
static inline void flush_icache(void)
|
||||||
{
|
{
|
||||||
long rd = 0;
|
|
||||||
asm volatile (
|
asm volatile (
|
||||||
|
/* Clean entire data cache */
|
||||||
"mcr p15, 0, %0, c7, c10, 0 \n"
|
"mcr p15, 0, %0, c7, c10, 0 \n"
|
||||||
: : "r"(rd)
|
: : "r"(0)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
2
tools/configure
vendored
2
tools/configure
vendored
|
@ -1213,7 +1213,7 @@ EOF
|
||||||
target_id=26
|
target_id=26
|
||||||
modelname="gigabeats"
|
modelname="gigabeats"
|
||||||
target="-DGIGABEAT_S"
|
target="-DGIGABEAT_S"
|
||||||
memory=32 # always
|
memory=64
|
||||||
arm9tdmicc
|
arm9tdmicc
|
||||||
tool="$rootdir/tools/scramble -add=gigs"
|
tool="$rootdir/tools/scramble -add=gigs"
|
||||||
bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
|
bmp2rb_mono="$rootdir/tools/bmp2rb -f 0"
|
||||||
|
|
|
@ -107,7 +107,7 @@ void usage(void)
|
||||||
"\t-add=X Rockbox generic \"add-up\" checksum format\n"
|
"\t-add=X Rockbox generic \"add-up\" checksum format\n"
|
||||||
"\t (X values: h100, h120, h140, h300, ipco, nano, ipvd, mn2g\n"
|
"\t (X values: h100, h120, h140, h300, ipco, nano, ipvd, mn2g\n"
|
||||||
"\t ip3g, ip4g, mini, iax5, h10, h10_5gb, tpj2,\n"
|
"\t ip3g, ip4g, mini, iax5, h10, h10_5gb, tpj2,\n"
|
||||||
"\t c200, e200, giga, m100, m500)\n"
|
"\t c200, e200, giga, gigs, m100, m500)\n"
|
||||||
"\nNo option results in Archos standard player/recorder format.\n");
|
"\nNo option results in Archos standard player/recorder format.\n");
|
||||||
|
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue