rockbox/bootloader/common.c
Aidan MacDonald 3a57f2f721 Add "rbfs" prefix to native filesystem functions
Most of the churn here occurs because 'filesize' is one of
the redefined filesystem functions, but some of the structs
used by the native FS code also include a 'filesize' member
variable which gets renamed by the macro in some but not all
source files.

It's easier to rename 'filesize()' to 'ffilesize()' rather
than try to clean up the macro mess or renaming the struct
members.

There is weirdness with root_realpath() which now breaks on
native builds because it was assumed to be unprefixed there.
dir_get_info() was unprefixed everywhere but this just seems
inconsistent; make it follow the FS_PREFIX() convention too.

Change-Id: Ic3700c6234ea45f32679c1a8429d70fdb8f4088a
2026-09-17 16:22:31 -04:00

181 lines
4.7 KiB
C

/***************************************************************************
* __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/
*
* Copyright (C) 2005 by Linus Nielsen Feltzing
*
* 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.
*
****************************************************************************/
#include "lcd.h"
#include "lcd-remote.h"
#include "font.h"
#include "system.h"
#include <stdarg.h>
#include <stdio.h>
#include <stdbool.h>
#include "cpu.h"
#include "common.h"
#include "power.h"
#include "kernel.h"
#include "config.h"
#include "logf.h"
#include "button.h"
#include "string.h"
#include "usb.h"
#include "file.h"
#include "loader_strerror.h"
#if defined(MI4_FORMAT)
#include "mi4-loader.h"
#elif defined(RKW_FORMAT)
#include "rkw-loader.h"
#else
#include "rb-loader.h"
#endif
#include "disk.h"
/* TODO: Other bootloaders need to be adjusted to set this variable to true
on a button press - currently only the ipod, H10, Vibe 500, Sansa, and xDuoo x3 versions do. */
#if defined(IPOD_ARCH) || defined(IRIVER_H10) || defined(IRIVER_H10_5GB) \
|| defined(SANSA_E200) || defined(SANSA_C200) || defined(GIGABEAT_F) \
|| (CONFIG_CPU == AS3525) || (CONFIG_CPU == AS3525v2) || defined(COWON_D2) \
|| defined(MROBE_100) || defined(MROBE_500) \
|| defined(SAMSUNG_YH925) || defined(SAMSUNG_YH920) \
|| defined(SAMSUNG_YH820) || defined(PHILIPS_SA9200) \
|| defined(PHILIPS_HDD1630) || defined(PHILIPS_HDD6330) \
|| defined(ONDA_VX747) || defined(PBELL_VIBE500) \
|| defined(TOSHIBA_GIGABEAT_S) || defined(XDUOO_X3) \
|| defined(IHIFI770) || defined(IHIFI770C) || defined(IHIFI800)
bool verbose = false;
#else
bool verbose = true;
#endif
#if !(CONFIG_PLATFORM & PLATFORM_HOSTED)
int line = 0;
#ifdef HAVE_REMOTE_LCD
int remote_line = 0;
#endif
void reset_screen(void)
{
lcd_clear_display();
line = 0;
#ifdef HAVE_REMOTE_LCD
lcd_remote_clear_display();
remote_line = 0;
#endif
}
int printf(const char *format, ...)
{
static char printfbuf[256];
int len;
unsigned char *ptr;
va_list ap;
va_start(ap, format);
ptr = printfbuf;
len = vsnprintf(ptr, sizeof(printfbuf), format, ap);
va_end(ap);
lcd_puts(0, line++, ptr);
if (verbose)
lcd_update();
if(line >= LCD_HEIGHT/SYSFONT_HEIGHT)
line = 0;
#ifdef HAVE_REMOTE_LCD
lcd_remote_puts(0, remote_line++, ptr);
if (verbose)
lcd_remote_update();
if(remote_line >= LCD_REMOTE_HEIGHT/SYSFONT_HEIGHT)
remote_line = 0;
#endif
return len;
}
#endif
void error(int errortype, int error, bool shutdown)
{
switch(errortype)
{
case EATA:
printf("ATA error: %d", error);
break;
case EDISK: {
printf("No partition found");
#if !(CONFIG_PLATFORM & PLATFORM_HOSTED)
for (int i = 0 ; i < NUM_VOLUMES ; i++) {
struct partinfo pinfo;
disk_partinfo(i, &pinfo);
if (pinfo.type)
printf("P%d T%02x S%llx",
i, pinfo.type, (unsigned long long)pinfo.size);
}
#endif
break;
}
case EBOOTFILE:
printf(loader_strerror(error));
break;
}
lcd_update();
sleep(5*HZ);
if(shutdown)
power_off();
}
/* Load raw binary image. */
int load_raw_firmware(unsigned char* buf, char* firmware, int buffer_size)
{
int fd;
int rc;
int len;
char filename[MAX_PATH];
snprintf(filename,sizeof(filename),"%s",firmware);
fd = open(filename, O_RDONLY);
if(fd < 0)
{
return EFILE_NOT_FOUND;
}
len = ffilesize(fd);
if (len > buffer_size)
return EFILE_TOO_BIG;
rc = read(fd, buf, len);
if(rc < len)
return EREAD_IMAGE_FAILED;
close(fd);
return len;
}
#if (!defined(MISC_H) && CONFIG_PLATFORM & PLATFORM_HOSTED)
/* open but with a builtin printf for assembling the path */
int open_pathfmt(char *buf, size_t size, int oflag, const char *pathfmt, ...)
{
va_list ap;
va_start(ap, pathfmt);
vsnprintf(buf, size, pathfmt, ap);
va_end(ap);
if ((oflag & O_PATH) == O_PATH)
return -1;
return open(buf, oflag, 0666);
}
#endif