blob: b564d66eb2af88fbb2fddd3e2c4fed4b8368cb3e [file] [log] [blame]
#ifndef SYS_DEP_H
#define SYS_DEP_H
#include <common.h>
#include <command.h>
#include <net.h>
#include <bzlib.h>
#include <part.h>
typedef long LONG;
typedef unsigned long ULONG;
typedef short WORD;
typedef unsigned short UWORD;
typedef signed char BYTE;
typedef unsigned char UBYTE;
typedef char * STRPTR;
typedef long BSTR;
typedef short BOOL;
typedef void * APTR;
typedef ULONG CPTR; //For Joerg.
#ifndef _SIZE_T
#define _SIZE_T
typedef unsigned int size_t;
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#define NULL ((void *)0)
//The whole bunch of <devices/hardblocks.h>
struct RigidDiskBlock {
ULONG rdb_ID; /* 4 character identifier */
ULONG rdb_SummedLongs; /* size of this checksummed structure */
LONG rdb_ChkSum; /* block checksum (longword sum to zero) */
ULONG rdb_HostID; /* SCSI Target ID of host */
ULONG rdb_BlockBytes; /* size of disk blocks */
ULONG rdb_Flags; /* see below for defines */
/* block list heads */
ULONG rdb_Obsolete1; /* No longer used, was optional bad block list */
ULONG rdb_PartitionList; /* optional first partition block */
ULONG rdb_FileSysHeaderList; /* optional file system header block */
ULONG rdb_DriveInit; /* optional drive-specific init code */
/* DriveInit(lun,rdb,ior): "C" stk & d0/a0/a1 */
ULONG rdb_BootStrapCode; /* Secondary bootstrap code. Uses sector type BOOT */
ULONG rdb_Reserved1[5]; /* set to $ffffffff */
/* physical drive characteristics */
ULONG rdb_Cylinders; /* number of drive cylinders */
ULONG rdb_Sectors; /* sectors per track */
ULONG rdb_Heads; /* number of drive heads */
ULONG rdb_Interleave; /* interleave */
ULONG rdb_Park; /* landing zone cylinder */
ULONG rdb_Reserved2[3];
ULONG rdb_WritePreComp; /* starting cylinder: write precompensation */
ULONG rdb_ReducedWrite; /* starting cylinder: reduced write current */
ULONG rdb_StepRate; /* drive step rate */
ULONG rdb_Reserved3[5];
/* logical drive characteristics */
ULONG rdb_RDBBlocksLo; /* low block of range reserved for hardblocks */
ULONG rdb_RDBBlocksHi; /* high block of range for these hardblocks */
ULONG rdb_LoCylinder; /* low cylinder of partitionable disk area */
ULONG rdb_HiCylinder; /* high cylinder of partitionable data area */
ULONG rdb_CylBlocks; /* number of blocks available per cylinder */
ULONG rdb_AutoParkSeconds; /* zero for no auto park */
ULONG rdb_HighRDSKBlock; /* highest block used by RDSK */
/* (not including replacement bad blocks) */
ULONG rdb_Reserved4;
/* drive identification */
char rdb_DiskVendor[8];
char rdb_DiskProduct[16];
char rdb_DiskRevision[4];
char rdb_ControllerVendor[8];
char rdb_ControllerProduct[16];
char rdb_ControllerRevision[4];
char rdb_DriveInitName[40]; // jdow: Filename for driveinit source
// jdow: as a terminated string.
char rdb_BootStrapName[108];// avallino: Filename for bootstrapper source
// avallino: as a terminated string.
ULONG rdb_Reserved5[37];
};
#define IDNAME_RIGIDDISK 0x5244534B /* 'RDSK' */
#define RDB_LOCATION_LIMIT 16
struct PartitionBlock {
ULONG pb_ID; /* 4 character identifier */
ULONG pb_SummedLongs; /* size of this checksummed structure */
LONG pb_ChkSum; /* block checksum (longword sum to zero) */
ULONG pb_HostID; /* SCSI Target ID of host */
ULONG pb_Next; /* block number of the next PartitionBlock */
ULONG pb_Flags; /* see below for defines */
ULONG pb_Reserved1[2];
ULONG pb_DevFlags; /* preferred flags for OpenDevice */
UBYTE pb_DriveName[32]; /* preferred DOS device name: BSTR form */
/* (not used if this name is in use) */
ULONG pb_Reserved2[15]; /* filler to 32 longwords */
ULONG pb_Environment[20]; /* environment vector for this partition */
ULONG pb_EReserved[12]; /* reserved for future environment vector */
};
#define IDNAME_PARTITION 0x50415254 /* 'PART' */
#define PBFB_BOOTABLE 0 /* this partition is intended to be bootable */
#define PBFF_BOOTABLE 1L /* (expected directories and files exist) */
#define PBFB_NOMOUNT 1 /* do not mount this partition (e.g. manually */
#define PBFF_NOMOUNT 2L /* mounted, but space reserved here) */
struct BootstrapCodeBlock {
ULONG bcb_ID; /* 4 character identifier */
ULONG bcb_SummedLongs; /* size of this checksummed structure */
LONG bcb_ChkSum; /* block checksum (longword sum to zero) */
ULONG bcb_HostID; /* SCSI Target ID of host */
ULONG bcb_Next; /* block number of the next BootstrapCodeBlock */
ULONG bcb_LoadData[123]; /* binary data of the bootstrapper */
/* note [123] assumes 512 byte blocks */
};
#define IDNAME_BOOTSTRAPCODE 0x424f4f54 /* 'BOOT' */
#define DE_TABLESIZE 0 /* minimum value is 11 (includes NumBuffers) */
#define DE_SIZEBLOCK 1 /* in longwords: standard value is 128 */
#define DE_SECORG 2 /* not used; must be 0 */
#define DE_NUMHEADS 3 /* # of heads (surfaces). drive specific */
#define DE_SECSPERBLK 4 /* not used; must be 1 */
#define DE_BLKSPERTRACK 5 /* blocks per track. drive specific */
#define DE_RESERVEDBLKS 6 /* unavailable blocks at start. usually 2 */
#define DE_PREFAC 7 /* not used; must be 0 */
#define DE_INTERLEAVE 8 /* usually 0 */
#define DE_LOWCYL 9 /* starting cylinder. typically 0 */
#define DE_UPPERCYL 10 /* max cylinder. drive specific */
#define DE_NUMBUFFERS 11 /* starting # of buffers. typically 5 */
#define DE_MEMBUFTYPE 12 /* type of mem to allocate for buffers. */
#define DE_BUFMEMTYPE 12 /* same as above, better name
* 1 is public, 3 is chip, 5 is fast */
#define DE_MAXTRANSFER 13 /* Max number bytes to transfer at a time */
#define DE_MASK 14 /* Address Mask to block out certain memory */
#define DE_BOOTPRI 15 /* Boot priority for autoboot */
#define DE_DOSTYPE 16 /* ASCII (HEX) string showing filesystem type;
* 0X444F5300 is old filesystem,
* 0X444F5301 is fast file system */
#define DE_BAUD 17 /* Baud rate for serial handler */
#define DE_CONTROL 18 /* Control word for handler/filesystem */
#define DE_BOOTBLOCKS 19 /* Number of blocks containing boot code */
/* Note well: when the second level bootloader is called, no "system calls" are allowed.
All system interaction is routed through the sbl_callback_context.
*/
//WARNING: the definition below doesn't work under AOS! So if you need to simulate
// an uboot environment, you need to change it radically.
#include "slb/our_lists.h"
#define MinNode mynode
typedef struct uboot_scan_handle
{
struct MinNode ush_link;
UWORD ush_bustype;
UWORD ush_already_scanned;
block_dev_desc_t ush_device;
} * SCAN_HANDLE;
typedef struct old_block_dev_desc {
int if_type; /* type of the interface */
int dev; /* device number */
unsigned char part_type; /* partition type */
unsigned char target; /* target SCSI ID */
unsigned char lun; /* target LUN */
unsigned char type; /* device type */
unsigned long lba; /* number of blocks */
unsigned long blksz; /* block size */
unsigned char vendor[40]; /* IDE model, SCSI Vendor */
unsigned char product[20];/* IDE Serial no, SCSI product */
unsigned char revision[4];/* firmware revision */
SCAN_HANDLE backpointer;
unsigned char removable; /* removable device */
unsigned long (*block_read)(int dev,
unsigned long start,
unsigned long blkcnt,
unsigned long *buffer);
} old_block_dev_desc_t;
typedef struct uboot_old_scan_handle
{
struct MinNode ush_link;
UWORD ush_bustype;
UWORD ush_already_scanned;
old_block_dev_desc_t ush_device;
} * OLD_SCAN_HANDLE;
enum bustype
{
BUSTYPE_VIA_ATA,
BUSTYPE_SCSI,
BUSTYPE_USB,
BUSTYPE_NET,
BUSTYPE_FLOPPY,
BUSTYPE_SIL_PARALLEL,
BUSTYPE_SIL_SERIAL,
BUSTYPE_SIL_4_SERIAL,
#ifdef CONFIG_SAM460EX
BUSTYPE_SATA2_460,
#endif
BUSTYPE_NONE
};
typedef void * uboot_dev_impl;
typedef block_dev_desc_t * internal_uboot_dev_impl;
#define get_lowlevel_handler(scan_handle) (&((scan_handle)->ush_device))
struct dev_access_entry
{
char * dae_identifier;
block_dev_desc_t * (*dae_get_dev)(int index);
UBYTE dae_request_type;
UBYTE dae_max_unitnum;
UBYTE dae_bustype;
UBYTE dae_padding_1;
ULONG dae_padding_2;
};
//extern dev_access_entry * devices_access_table;
extern struct dev_access_entry * find_dae(const char * s);
//These two below are used in dae_request_type and 'type', along with the others
//defined in the uboot includes.
#define DEV_TYPE_NETBOOT 0x81 //Almost a random choice.
#define DEV_TYPE_DUMMY_END 0xff
#ifndef SECOND_LEVEL_BOOTLOADER
extern SCAN_HANDLE start_unit_scan(const void * scan_list, ULONG * const blocksize);
extern SCAN_HANDLE next_unit_scan(SCAN_HANDLE h, ULONG * const blocksize);
extern BOOL open_specific_unit(const SCAN_HANDLE h);
extern void end_unit_scan(SCAN_HANDLE h);
extern void end_global_scan(void);
extern BOOL loadsector(const ULONG sectn, const ULONG sect_size,
const ULONG numb_sects, void * const dest_buf);
extern void * alloc_mem_for_iobuffers(const unsigned long size);
extern void * alloc_mem_for_kickmodule(const unsigned long size);
extern void * alloc_mem_for_execNG(const unsigned long size);
extern void * alloc_mem_for_anythingelse(const unsigned long size);
extern void * alloc_mem_for_bootloader(const unsigned long size);
//extern void * alloc_mem_for_bootloader_ABS(const unsigned long size, void * addr);
// The above function is no longer used.
extern void free_mem(void * const loc);
extern struct sbl_callback_context * build_callback_context(void *context);
extern void degrade_to_old_frigging_interface(struct sbl_callback_context * c);
extern int my_NetLoop(char * fn, void * buff);
#endif //SECOND_LEVEL_BOOTLOADER
//extern void mycopymem(const char * src, char * dest, unsigned long size);
//#define printf_to_user printf
//#define scanf_from_user scanf
#define CALLBACK_VERSION 4
struct sbl_callback_context //This is the context structure passed to the
//second-level bootloader.
//It's essentially a bunch of callbacks and
//some data structures.
{
ULONG ssc_version; //Version of the callback protocol context.
void (* ssc_printf_like)(const char * fmtstring, ...); //printf() like stuff;
int (* ssc_getc_like)(void);
void * ssc_scan_list; //This is the parameter passed to the functions below as 'scan_list'
struct MinList * ssc_devices_list;
SCAN_HANDLE ssc_curr_device;
SCAN_HANDLE (* ssc_start_unit_scan)(const void * scan_list, ULONG * const blocksize);
SCAN_HANDLE (* ssc_next_unit_scan)(SCAN_HANDLE h, ULONG * const blocksize);
BOOL (* ssc_open_specific_unit)(const SCAN_HANDLE h);
void (* ssc_end_unit_scan)(SCAN_HANDLE h);
void (* ssc_end_global_scan)(void);
BOOL (* ssc_loadsector)(const ULONG sectn, const ULONG sect_size,
const ULONG numb_sects, void * const dest_buf);
int (* ssc_my_netloop)(char * filename, void * dump_here);
char * (* ssc_getenv)(uchar *);
void (* ssc_setenv)(char *, char *);
void * (* ssc_alloc_mem_for_iobuffers)(const size_t size);
void * (* ssc_alloc_mem_for_kickmodule)(const size_t size);
void * (* ssc_alloc_mem_for_execNG)(const size_t size);
void * (* ssc_alloc_mem_for_anythingelse)(const size_t size);
void * (* ssc_alloc_mem_for_bootloader)(const size_t size);
void (* ssc_free_mem)(void * const loc);
void * (* ssc_get_board_info)(void);
int (* ssc_BZ2_bzBuffToBuffDecompress) (
char* dest,
unsigned int* destLen,
char* source,
unsigned int sourceLen,
int small,
int verbosity
);
//Video functions (silly EGA style character menus and things.)
void (* ssc_video_clear)(void);
void (* ssc_video_draw_box)(int style, int attr, char *title, int separate, int x, int y, int w, int h);
void (* ssc_video_draw_text)(int x, int y, int attr, char *text, int field);
void (* ssc_video_repeat_char)(int x, int y, int repcnt, int repchar, int attr);
unsigned short (* ssc_set_partial_scroll_limits)(const short start, const short end);
void (* ssc_get_partial_scroll_limits)(short * const start, short * const end);
int (* ssc_video_get_key)(void);
int (* ssc_do_bootm)(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
void * (* ssc_memmove)(void * dest,const void *src,size_t count);
void (* ssc_set_load_addr)(void * const la);
int (* ssc_tstc)(void);
void (* ssc_udelay)(unsigned long);
int (* ssc_sprintf)(char * buf, const char *fmt, ...);
//New to version 4.1 (should be 5....): ext2fs support in uboot.
int (* ssc_ext2fs_set_blk_dev_full)(block_dev_desc_t * const rbdd, disk_partition_t * const p);
int (* ssc_ext2fs_open)(char *filename);
int (* ssc_ext2fs_read)(char *buf, unsigned len);
int (* ssc_ext2fs_mount)(unsigned part_length);
int (* ssc_ext2fs_close)(void);
};
#endif