1
0
Fork 0
forked from len0rd/rockbox

Fix mrobe500 svn:*

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@18482 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Maurus Cuelenaere 2008-09-10 19:35:15 +00:00
parent c104c24887
commit 1ff9ce202d

564
bootloader/mrobe500.c Executable file → Normal file
View file

@ -1,282 +1,282 @@
/*************************************************************************** /***************************************************************************
* __________ __ ___. * __________ __ ___.
* Open \______ \ ____ ____ | | _\_ |__ _______ ___ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
* \/ \/ \/ \/ \/ * \/ \/ \/ \/ \/
* $Id: $ * $Id$
* *
* Copyright (C) 2007 by Karl Kurbjun * Copyright (C) 2007 by Karl Kurbjun
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 * as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version. * of the License, or (at your option) any later version.
* *
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied. * KIND, either express or implied.
* *
****************************************************************************/ ****************************************************************************/
#include "inttypes.h" #include "inttypes.h"
#include "string.h" #include "string.h"
#include "cpu.h" #include "cpu.h"
#include "system.h" #include "system.h"
#include "lcd.h" #include "lcd.h"
#include "kernel.h" #include "kernel.h"
#include "thread.h" #include "thread.h"
#include "ata.h" #include "ata.h"
#include "fat.h" #include "fat.h"
#include "disk.h" #include "disk.h"
#include "font.h" #include "font.h"
#include "adc.h" #include "adc.h"
#include "backlight.h" #include "backlight.h"
#include "backlight-target.h" #include "backlight-target.h"
#include "button.h" #include "button.h"
#include "panic.h" #include "panic.h"
#include "power.h" #include "power.h"
#include "file.h" #include "file.h"
#include "common.h" #include "common.h"
#include "rbunicode.h" #include "rbunicode.h"
#include "usb.h" #include "usb.h"
#include "spi.h" #include "spi.h"
#include "uart-target.h" #include "uart-target.h"
#include "tsc2100.h" #include "tsc2100.h"
#include "time.h" #include "time.h"
#include "system-arm.h" #include "system-arm.h"
#define MRDEBUG #define MRDEBUG
#if defined(MRDEBUG) #if defined(MRDEBUG)
extern int line; extern int line;
#if 0 #if 0
struct touch_calibration_point tl, br; struct touch_calibration_point tl, br;
void touchscreen_get_one_point(struct touch_calibration_point *p) void touchscreen_get_one_point(struct touch_calibration_point *p)
{ {
int data = 0; int data = 0;
int start = current_tick; int start = current_tick;
while (TIME_AFTER(start+(HZ/3), current_tick)) while (TIME_AFTER(start+(HZ/3), current_tick))
{ {
if (button_read_device()&BUTTON_TOUCHSCREEN) if (button_read_device()&BUTTON_TOUCHSCREEN)
{ {
data = button_get_last_touch(); data = button_get_last_touch();
p->val_x = data>>16; p->val_x = data>>16;
p->val_y = data&0xffff; p->val_y = data&0xffff;
start = current_tick; start = current_tick;
} }
else if (data == 0) else if (data == 0)
start = current_tick; start = current_tick;
} }
} }
#define MARGIN 25 #define MARGIN 25
#define LEN 7 #define LEN 7
void touchscreen_calibrate_screen(void) void touchscreen_calibrate_screen(void)
{ {
reset_screen(); reset_screen();
printf("touch the center of the crosshairs to calibrate"); printf("touch the center of the crosshairs to calibrate");
/* get the topleft value */ /* get the topleft value */
lcd_hline(MARGIN-LEN, MARGIN+LEN, MARGIN); lcd_hline(MARGIN-LEN, MARGIN+LEN, MARGIN);
lcd_vline(MARGIN, MARGIN-LEN, MARGIN+LEN); lcd_vline(MARGIN, MARGIN-LEN, MARGIN+LEN);
lcd_update(); lcd_update();
tl.px_x = MARGIN; tl.px_y = MARGIN; tl.px_x = MARGIN; tl.px_y = MARGIN;
touchscreen_get_one_point(&tl); touchscreen_get_one_point(&tl);
reset_screen(); reset_screen();
printf("touch the center of the crosshairs to calibrate"); printf("touch the center of the crosshairs to calibrate");
/* get the topright value */ /* get the topright value */
lcd_hline(LCD_WIDTH-MARGIN-LEN, LCD_WIDTH-MARGIN+LEN, LCD_HEIGHT-MARGIN); lcd_hline(LCD_WIDTH-MARGIN-LEN, LCD_WIDTH-MARGIN+LEN, LCD_HEIGHT-MARGIN);
lcd_vline(LCD_WIDTH-MARGIN, LCD_HEIGHT-MARGIN-LEN, LCD_HEIGHT-MARGIN+LEN); lcd_vline(LCD_WIDTH-MARGIN, LCD_HEIGHT-MARGIN-LEN, LCD_HEIGHT-MARGIN+LEN);
lcd_update(); lcd_update();
br.px_x = LCD_WIDTH-MARGIN; br.px_y = LCD_HEIGHT-MARGIN; br.px_x = LCD_WIDTH-MARGIN; br.px_y = LCD_HEIGHT-MARGIN;
touchscreen_get_one_point(&br); touchscreen_get_one_point(&br);
reset_screen(); reset_screen();
line++; line++;
printf("tl %d %d", tl.val_x, tl.val_y); printf("tl %d %d", tl.val_x, tl.val_y);
printf("br %d %d", br.val_x, br.val_y); printf("br %d %d", br.val_x, br.val_y);
line++; line++;
set_calibration_points(&tl, &br); set_calibration_points(&tl, &br);
} }
#endif #endif
static uint8_t bl_command[] = {0xa4, 0x00, 0x00, 0xbb}; static uint8_t bl_command[] = {0xa4, 0x00, 0x00, 0xbb};
int brightness = 0; int brightness = 0;
void mrdebug(void) void mrdebug(void)
{ {
int button=0; int button=0;
#if 0 #if 0
use_calibration(false); use_calibration(false);
touchscreen_calibrate_screen(); touchscreen_calibrate_screen();
use_calibration(true); use_calibration(true);
#endif #endif
while(true) while(true)
{ {
#if 0 #if 0
struct tm *t = get_time(); struct tm *t = get_time();
printf("%d:%d:%d %d %d %d", t->tm_hour, t->tm_min, t->tm_sec, t->tm_mday, t->tm_mon, t->tm_year); printf("%d:%d:%d %d %d %d", t->tm_hour, t->tm_min, t->tm_sec, t->tm_mday, t->tm_mon, t->tm_year);
printf("time: %d", mktime(t)); printf("time: %d", mktime(t));
#endif #endif
button = button_get(false); button = button_get(false);
if (button == BUTTON_POWER) if (button == BUTTON_POWER)
{ {
printf("reset"); printf("reset");
IO_GIO_BITSET1|=1<<10; IO_GIO_BITSET1|=1<<10;
} }
if (button==BUTTON_RC_VOL_DOWN) if (button==BUTTON_RC_VOL_DOWN)
{ {
brightness = (brightness - 5) & 0x7f; brightness = (brightness - 5) & 0x7f;
bl_command[2] = brightness; bl_command[2] = brightness;
spi_block_transfer(SPI_target_BACKLIGHT, bl_command, 4, 0, 0); spi_block_transfer(SPI_target_BACKLIGHT, bl_command, 4, 0, 0);
} }
else if (button==BUTTON_RC_VOL_UP) else if (button==BUTTON_RC_VOL_UP)
{ {
brightness = (brightness + 5) & 0x7f; brightness = (brightness + 5) & 0x7f;
bl_command[2] = brightness; bl_command[2] = brightness;
spi_block_transfer(SPI_target_BACKLIGHT, bl_command, 4, 0, 0); spi_block_transfer(SPI_target_BACKLIGHT, bl_command, 4, 0, 0);
} }
// { // {
// short x,y,z1,z2; // short x,y,z1,z2;
// tsc2100_read_values(&x, &y, &z1, &z2); // tsc2100_read_values(&x, &y, &z1, &z2);
// printf("x: %04x y: %04x z1: %04x z2: %04x", x, y, z1, z2); // printf("x: %04x y: %04x z1: %04x z2: %04x", x, y, z1, z2);
// printf("tsadc: %4x", tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS)&0xffff); // printf("tsadc: %4x", tsc2100_readreg(TSADC_PAGE, TSADC_ADDRESS)&0xffff);
// // tsc2100_keyclick(); /* doesnt work :( */ // // tsc2100_keyclick(); /* doesnt work :( */
// line -= 6; // line -= 6;
// } // }
else if (button == BUTTON_RC_HEART) else if (button == BUTTON_RC_HEART)
{ {
printf("POINT"); printf("POINT");
touchscreen_set_mode(TOUCHSCREEN_POINT); touchscreen_set_mode(TOUCHSCREEN_POINT);
} }
else if (button == BUTTON_RC_MODE) else if (button == BUTTON_RC_MODE)
{ {
printf("BUTTON"); printf("BUTTON");
touchscreen_set_mode(TOUCHSCREEN_BUTTON); touchscreen_set_mode(TOUCHSCREEN_BUTTON);
} }
#if 1 #if 1
else if (button&BUTTON_TOUCHSCREEN) else if (button&BUTTON_TOUCHSCREEN)
{ {
if (button&BUTTON_REL) if (button&BUTTON_REL)
continue; continue;
unsigned int data = button_get_data(); unsigned int data = button_get_data();
int x = (data&0xffff0000)>>16, y = data&0x0000ffff; int x = (data&0xffff0000)>>16, y = data&0x0000ffff;
reset_screen(); reset_screen();
line = 9; line = 9;
printf("BB: %x %d %d", button, x,y); printf("BB: %x %d %d", button, x,y);
lcd_hline(x-5, x+5, y); lcd_hline(x-5, x+5, y);
lcd_vline(x, y-5, y+5); lcd_vline(x, y-5, y+5);
lcd_update(); lcd_update();
} }
else if (button == BUTTON_RC_PLAY) else if (button == BUTTON_RC_PLAY)
{ {
reset_screen(); reset_screen();
} }
else if (button) else if (button)
{ {
// if (button&BUTTON_REL) // if (button&BUTTON_REL)
{ {
printf("%08x %s\n", button, (button&BUTTON_REL)?"yes":"no"); printf("%08x %s\n", button, (button&BUTTON_REL)?"yes":"no");
} }
} }
#endif #endif
} }
} }
#endif #endif
void main(void) void main(void)
{ {
unsigned char* loadbuffer; unsigned char* loadbuffer;
int buffer_size; int buffer_size;
int rc; int rc;
int(*kernel_entry)(void); int(*kernel_entry)(void);
power_init(); power_init();
lcd_init(); lcd_init();
system_init(); system_init();
kernel_init(); kernel_init();
enable_irq(); enable_irq();
enable_fiq(); enable_fiq();
adc_init(); adc_init();
button_init(); button_init();
backlight_init(); backlight_init();
font_init(); font_init();
lcd_setfont(FONT_SYSFIXED); lcd_setfont(FONT_SYSFIXED);
/* Show debug messages if button is pressed */ /* Show debug messages if button is pressed */
// if(button_read_device()) // if(button_read_device())
verbose = true; verbose = true;
printf("Rockbox boot loader"); printf("Rockbox boot loader");
printf("Version %s", APPSVERSION); printf("Version %s", APPSVERSION);
usb_init(); usb_init();
/* Enter USB mode without USB thread */ /* Enter USB mode without USB thread */
if(usb_detect() == USB_INSERTED) if(usb_detect() == USB_INSERTED)
{ {
const char msg[] = "Bootloader USB mode"; const char msg[] = "Bootloader USB mode";
reset_screen(); reset_screen();
lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * strlen(msg))) / 2, lcd_putsxy( (LCD_WIDTH - (SYSFONT_WIDTH * strlen(msg))) / 2,
(LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg); (LCD_HEIGHT - SYSFONT_HEIGHT) / 2, msg);
lcd_update(); lcd_update();
ide_power_enable(true); ide_power_enable(true);
ata_enable(false); ata_enable(false);
sleep(HZ/20); sleep(HZ/20);
usb_enable(true); usb_enable(true);
while (usb_detect() == USB_INSERTED) while (usb_detect() == USB_INSERTED)
{ {
ata_spin(); /* Prevent the drive from spinning down */ ata_spin(); /* Prevent the drive from spinning down */
sleep(HZ); sleep(HZ);
} }
usb_enable(false); usb_enable(false);
reset_screen(); reset_screen();
lcd_update(); lcd_update();
} }
#if defined(MRDEBUG) #if defined(MRDEBUG)
mrdebug(); mrdebug();
#endif #endif
printf("ATA"); printf("ATA");
rc = ata_init(); rc = ata_init();
if(rc) if(rc)
{ {
reset_screen(); reset_screen();
error(EATA, rc); error(EATA, rc);
} }
printf("disk"); printf("disk");
disk_init(); disk_init();
printf("mount"); printf("mount");
rc = disk_mount_all(); rc = disk_mount_all();
if (rc<=0) if (rc<=0)
{ {
error(EDISK,rc); error(EDISK,rc);
} }
printf("Loading firmware"); printf("Loading firmware");
loadbuffer = (unsigned char*) 0x00900000; loadbuffer = (unsigned char*) 0x00900000;
buffer_size = (unsigned char*)0x01900000 - loadbuffer; buffer_size = (unsigned char*)0x01900000 - loadbuffer;
rc = load_firmware(loadbuffer, BOOTFILE, buffer_size); rc = load_firmware(loadbuffer, BOOTFILE, buffer_size);
if(rc < 0) if(rc < 0)
error(EBOOTFILE, rc); error(EBOOTFILE, rc);
if (rc == EOK) if (rc == EOK)
{ {
kernel_entry = (void*) loadbuffer; kernel_entry = (void*) loadbuffer;
rc = kernel_entry(); rc = kernel_entry();
} }
} }