You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
1.8 KiB
C
76 lines
1.8 KiB
C
16 years ago
|
/* Platform-specific operations for the Cisco 1700 Series router
|
||
|
* (c) 2009 Philippe Vachon <philippe@cowpig.ca>
|
||
|
*
|
||
|
* Licensed under the GNU General Public License v.2.0. See the COPYING
|
||
|
* file in the root directory of this source distribution for more info.
|
||
|
*/
|
||
|
#include <types.h>
|
||
|
#include <mach/c1700/platform.h>
|
||
|
#include <mach/c1700/platio.h>
|
||
|
#include <printf.h>
|
||
|
|
||
|
/**
|
||
|
* perform hardware-specifc initialization for this platform
|
||
|
*/
|
||
|
void platform_init()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Perform a sanity check on flash
|
||
|
* @returns 0 if no flash found, number of flash devices found otherwise
|
||
|
*/
|
||
|
uint32_t check_flash()
|
||
|
{
|
||
|
uint32_t *ptr = (uint32_t *)FLASH_BASE;
|
||
|
|
||
|
if (*ptr != FS_FILE_MAGIC) {
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return 1;
|
||
|
/* TODO: add support for PCMCIA flash */
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* print a directory listing of the 'main' flash device in the system
|
||
|
*/
|
||
|
|
||
|
void flash_directory()
|
||
|
{
|
||
|
struct fs_ent *f = (struct fs_ent *)FLASH_BASE;
|
||
|
uint32_t offset = 0;
|
||
|
|
||
|
/* Iterate over the files; f->magic is 0 if an invalid file is found. */
|
||
|
while (f->magic == FS_FILE_MAGIC) {
|
||
|
printf("%s\n", f->filename);
|
||
|
offset += sizeof(struct fs_ent) + f->length;
|
||
|
f = (struct fs_ent *)(FLASH_BASE + offset);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Locate the stage two loader for CiscoLoad for this particular platform
|
||
|
* returns 0 if not found, 1 if found
|
||
|
*/
|
||
|
uint32_t locate_stage_two()
|
||
|
{
|
||
|
return platio_find_file("ciscoload.two");
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Kick into the stage two loader.
|
||
|
*/
|
||
|
void stage_two(uint32_t kern_off, uint32_t kern_entry, uint32_t kern_size,
|
||
|
uint32_t kern_loadpt)
|
||
|
{
|
||
|
uint32_t s2addr = ((uint32_t)find_file("ciscoload.two", FLASH_BASE)) +
|
||
|
sizeof(struct fs_ent);
|
||
|
|
||
|
|
||
|
((void (*)(uint32_t data_offset, uint32_t data_length, uint32_t entry_pt,
|
||
|
uint32_t load_offset)) (s2addr))
|
||
|
(kern_off, kern_size, kern_entry, kern_loadpt);
|
||
|
|
||
|
}
|