1
0
mirror of git://projects.qi-hardware.com/xburst-tools.git synced 2024-11-26 23:56:15 +02:00

qi-introduce-ui-indicators.patch

Allow a board to "indicate" events if it likes on whatever it has

On GTA02 we light AUX during boot and run the vibrator briefly when we
skip a partition or device.

Signed-off-by: Andy Green <andy@openmoko.com>
This commit is contained in:
Andy Green 2008-12-01 01:26:06 +00:00 committed by Andy Green
parent 40edd785a7
commit 710f2dbb6e
3 changed files with 78 additions and 1 deletions

View File

@ -47,6 +47,21 @@ enum ui_actions {
UI_ACTION_SKIPKERNEL = (1 << 1), UI_ACTION_SKIPKERNEL = (1 << 1),
}; };
enum ui_indication {
UI_IND_UPDATE_ONLY,
UI_IND_MOUNT_PART,
UI_IND_MOUNT_FAIL,
UI_IND_SKIPPING,
UI_IND_KERNEL_PULL,
UI_IND_KERNEL_PULL_OK,
UI_IND_KERNEL_PULL_FAIL,
UI_IND_INITRAMFS_PULL,
UI_IND_INITRAMFS_PULL_OK,
UI_IND_INITRAMFS_PULL_FAIL,
UI_IND_KERNEL_START,
UI_IND_MEM_TEST
};
/* describes a source for getting kernel image */ /* describes a source for getting kernel image */
struct kernel_source { struct kernel_source {
@ -89,6 +104,7 @@ struct board_api {
void (*putc)(char); void (*putc)(char);
void (*close)(void); void (*close)(void);
u8 (*get_ui_keys)(void); u8 (*get_ui_keys)(void);
void (*set_ui_indication)(enum ui_indication);
struct kernel_source kernel_source[8]; struct kernel_source kernel_source[8];
}; };

View File

@ -396,6 +396,40 @@ static u8 get_ui_keys_gta02(void)
return ret; return ret;
} }
static void set_ui_indication_gta02(enum ui_indication ui_indication)
{
switch (ui_indication) {
case UI_IND_UPDATE_ONLY:
break;
case UI_IND_MOUNT_PART:
case UI_IND_KERNEL_PULL_OK:
case UI_IND_INITRAMFS_PULL_OK:
rGPBDAT |= 4;
break;
case UI_IND_KERNEL_PULL_FAIL:
case UI_IND_SKIPPING:
case UI_IND_INITRAMFS_PULL_FAIL:
case UI_IND_MOUNT_FAIL:
rGPBDAT &= ~4;
rGPBDAT |= 8;
udelay(2000000);
rGPBDAT &= ~8;
udelay(200000);
break;
case UI_IND_KERNEL_START:
case UI_IND_MEM_TEST:
case UI_IND_KERNEL_PULL:
case UI_IND_INITRAMFS_PULL:
rGPBDAT &= ~4;
break;
}
}
/* /*
* our API for bootloader on this machine * our API for bootloader on this machine
*/ */
@ -412,6 +446,7 @@ const struct board_api board_api_gta02 = {
.putc = putc_gta02, .putc = putc_gta02,
.close = close_gta02, .close = close_gta02,
.get_ui_keys = get_ui_keys_gta02, .get_ui_keys = get_ui_keys_gta02,
.set_ui_indication = set_ui_indication_gta02,
.commandline_board = "mtdparts=physmap-flash:-(nor);" \ .commandline_board = "mtdparts=physmap-flash:-(nor);" \
"neo1973-nand:" \ "neo1973-nand:" \
"0x00040000(qi)," \ "0x00040000(qi)," \

View File

@ -37,11 +37,18 @@ struct kernel_source const * this_kernel = 0;
const int INITRD_OFFSET = (8 * 1024 * 1024); const int INITRD_OFFSET = (8 * 1024 * 1024);
int raise(int n) int raise(int n)
{ {
return 0; return 0;
} }
void indicate(enum ui_indication ui_indication)
{
if (this_board->set_ui_indication)
(this_board->set_ui_indication)(ui_indication);
}
int read_file(const char * filepath, u8 * destination, int size) int read_file(const char * filepath, u8 * destination, int size)
{ {
int len = size; int len = size;
@ -51,6 +58,7 @@ int read_file(const char * filepath, u8 * destination, int size)
case FS_EXT2: case FS_EXT2:
if (!ext2fs_mount()) { if (!ext2fs_mount()) {
puts("Unable to mount ext2 filesystem\n"); puts("Unable to mount ext2 filesystem\n");
indicate(UI_IND_MOUNT_FAIL);
return -1; return -1;
} }
puts(" EXT2 open: "); puts(" EXT2 open: ");
@ -120,12 +128,15 @@ void bootloader_second_phase(void)
puts(this_kernel->name); puts(this_kernel->name);
puts("\n"); puts("\n");
indicate(UI_IND_MOUNT_PART);
/* if this device needs initializing, try to init it */ /* if this device needs initializing, try to init it */
if (this_kernel->block_init) if (this_kernel->block_init)
if ((this_kernel->block_init)()) { if ((this_kernel->block_init)()) {
puts("block device init failed\n"); puts("block device init failed\n");
this_kernel = &this_board-> this_kernel = &this_board->
kernel_source[kernel++]; kernel_source[kernel++];
indicate(UI_IND_MOUNT_FAIL);
continue; continue;
} }
@ -140,6 +151,7 @@ void bootloader_second_phase(void)
puts("Bad partition read\n"); puts("Bad partition read\n");
this_kernel = &this_board-> this_kernel = &this_board->
kernel_source[kernel++]; kernel_source[kernel++];
indicate(UI_IND_MOUNT_FAIL);
continue; continue;
} }
@ -147,6 +159,7 @@ void bootloader_second_phase(void)
puts("partition signature missing\n"); puts("partition signature missing\n");
this_kernel = &this_board-> this_kernel = &this_board->
kernel_source[kernel++]; kernel_source[kernel++];
indicate(UI_IND_MOUNT_FAIL);
continue; continue;
} }
@ -181,6 +194,7 @@ void bootloader_second_phase(void)
puts(this_board->noboot); puts(this_board->noboot);
puts(")\n"); puts(")\n");
this_kernel = &this_board->kernel_source[kernel++]; this_kernel = &this_board->kernel_source[kernel++];
indicate(UI_IND_SKIPPING);
continue; continue;
} }
@ -190,6 +204,8 @@ void bootloader_second_phase(void)
read_file(this_board->append, (u8 *)commandline_rootfs_append, read_file(this_board->append, (u8 *)commandline_rootfs_append,
512); 512);
indicate(UI_IND_KERNEL_PULL);
/* pull the kernel image */ /* pull the kernel image */
if (read_file(this_kernel->filepath, kernel_dram, 4096) < 0) { if (read_file(this_kernel->filepath, kernel_dram, 4096) < 0) {
@ -219,19 +235,26 @@ void bootloader_second_phase(void)
if (read_file(this_kernel->filepath, kernel_dram, if (read_file(this_kernel->filepath, kernel_dram,
kernel_size) < 0) { kernel_size) < 0) {
this_kernel = &this_board->kernel_source[kernel++]; this_kernel = &this_board->kernel_source[kernel++];
indicate(UI_IND_KERNEL_PULL_FAIL);
continue; continue;
} }
indicate(UI_IND_KERNEL_PULL_OK);
/* initramfs if needed */ /* initramfs if needed */
if (this_kernel->initramfs_filepath) { if (this_kernel->initramfs_filepath) {
indicate(UI_IND_INITRAMFS_PULL);
initramfs_len = read_file(this_kernel->initramfs_filepath, initramfs_len = read_file(this_kernel->initramfs_filepath,
(u8 *)this_board->linux_mem_start + INITRD_OFFSET, 16 * 1024 * 1024); (u8 *)this_board->linux_mem_start + INITRD_OFFSET,
16 * 1024 * 1024);
if (initramfs_len < 0) { if (initramfs_len < 0) {
puts("initramfs load failed\n"); puts("initramfs load failed\n");
this_kernel = &this_board->kernel_source[kernel++]; this_kernel = &this_board->kernel_source[kernel++];
indicate(UI_IND_INITRAMFS_PULL_FAIL);
continue; continue;
} }
indicate(UI_IND_INITRAMFS_PULL_OK);
} }
/* /*
@ -329,6 +352,7 @@ void bootloader_second_phase(void)
(this_board->close)(); (this_board->close)();
puts ("Starting --->\n\n"); puts ("Starting --->\n\n");
indicate(UI_IND_KERNEL_START);
/* /*
* ooh that's it, we're gonna try boot this image! * ooh that's it, we're gonna try boot this image!
@ -355,6 +379,8 @@ void bootloader_second_phase(void)
* to provoke memory test. * to provoke memory test.
*/ */
indicate(UI_IND_MEM_TEST);
memory_test((void *)this_board->linux_mem_start, memory_test((void *)this_board->linux_mem_start,
this_board->linux_mem_size); this_board->linux_mem_size);