75 lines
1.4 KiB
C
75 lines
1.4 KiB
C
|
/*
|
||
|
* Bright Star Engineering Inc.
|
||
|
*
|
||
|
* code for readng parameters from the
|
||
|
* parameter blocks of the boot block
|
||
|
* flash memory
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
static int strcmp(const char *s1, const char *s2)
|
||
|
{
|
||
|
while (*s1 != '\0' && *s1 == *s2)
|
||
|
{
|
||
|
s1++;
|
||
|
s2++;
|
||
|
}
|
||
|
|
||
|
return (*(unsigned char *) s1) - (*(unsigned char *) s2);
|
||
|
}
|
||
|
|
||
|
struct pblk_t {
|
||
|
char type;
|
||
|
unsigned short size;
|
||
|
};
|
||
|
|
||
|
static char *bse_getflashparam(char *name) {
|
||
|
unsigned int esize;
|
||
|
char *q,*r;
|
||
|
unsigned char *p,*e;
|
||
|
struct pblk_t *thepb = (struct pblk_t *) 0x00004000;
|
||
|
struct pblk_t *altpb = (struct pblk_t *) 0x00006000;
|
||
|
if (thepb->type&1) {
|
||
|
if (altpb->type&1) {
|
||
|
/* no valid param block */
|
||
|
return (char*)0;
|
||
|
} else {
|
||
|
/* altpb is valid */
|
||
|
struct pblk_t *tmp;
|
||
|
tmp = thepb;
|
||
|
thepb = altpb;
|
||
|
altpb = tmp;
|
||
|
}
|
||
|
}
|
||
|
p = (char*)thepb + sizeof(struct pblk_t);
|
||
|
e = p + thepb->size;
|
||
|
while (p < e) {
|
||
|
q = p;
|
||
|
esize = *p;
|
||
|
if (esize == 0xFF) break;
|
||
|
if (esize == 0) break;
|
||
|
if (esize > 127) {
|
||
|
esize = (esize&0x7F)<<8 | p[1];
|
||
|
q++;
|
||
|
}
|
||
|
q++;
|
||
|
r=q;
|
||
|
if (*r && ((name == 0) || (!strcmp(name,r)))) {
|
||
|
while (*q++) ;
|
||
|
return q;
|
||
|
}
|
||
|
p+=esize;
|
||
|
}
|
||
|
return (char*)0;
|
||
|
}
|
||
|
|
||
|
void bse_setup(void) {
|
||
|
/* extract the linux cmdline from flash */
|
||
|
char *name=bse_getflashparam("linuxboot");
|
||
|
char *x = (char *)0xc0000100;
|
||
|
if (name) {
|
||
|
while (*name) *x++=*name++;
|
||
|
}
|
||
|
*x=0;
|
||
|
}
|