rockbox/firmware/target/mips/ingenic_x1000/spl-x1000.h
Aidan MacDonald 01d1eb4258 FiiO M3K/X1000: Do system clock initialization in the SPL
Initializing the clocks in the SPL brings Rockbox in line with
how the FiiO M3K's original SPL works. It's likely other X1000
devices do this too.

There was a logic error in the previous setup: the code falsely
assumed that DDR memory would always be running from MPLL, but
it would be switched to APLL by the bootloader. Rockbox would
then try to re-init APLL, albeit with the same parameters. Maybe
this was the cause of the boot hang on some units.

Change-Id: I64064585e491bbdf1e95fe9428c91a9314f2a917
2021-04-17 20:24:07 +00:00

55 lines
2 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
* $Id$
*
* Copyright (C) 2021 Aidan MacDonald
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
*
****************************************************************************/
#ifndef __SPL_X1000_H__
#define __SPL_X1000_H__
#include "spl-x1000-defs.h"
#define SPL_ARGUMENTS ((struct x1000_spl_arguments*)SPL_ARGUMENTS_ADDRESS)
#define SPL_STATUS ((struct x1000_spl_status*)SPL_STATUS_ADDRESS)
struct spl_boot_option {
uint32_t nand_addr;
uint32_t nand_size;
uint32_t load_addr;
uint32_t exec_addr;
const char* cmdline; /* for Linux */
};
/* Defined by target, indices are 0 = ROCKBOX, 1 = ORIG_FW, etc... */
extern const struct spl_boot_option spl_boot_options[];
/* Called on a fatal error */
extern void spl_error(void) __attribute__((noreturn));
/* When SPL boots with SPL_BOOTOPTION_CHOOSE, this function is invoked
* to let the target figure out the boot option based on buttons the
* user is pressing */
extern int spl_get_boot_option(void);
/* Do any setup/initialization needed for the given boot option, this
* will be called right before flushing caches + jumping to the image.
* Typical use is to set up system clocks, etc.
*/
extern void spl_handle_pre_boot(int bootopt);
#endif /* __SPL_X1000_H__ */