diff --git a/.gitignore b/.gitignore index 99314f1..d4d99f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ **.o **.img **.elf +**.cpio diff --git a/include/mbox.h b/include/mbox.h index 563c2d9..605a549 100644 --- a/include/mbox.h +++ b/include/mbox.h @@ -40,9 +40,12 @@ extern volatile unsigned int mbox[36]; #define MBOX_CH_PROP 8 /* tags */ -#define MBOX_TAG_GETSERIAL 0x10004 #define MBOX_TAG_LAST 0 #define MBOX_TAG_BOARD_REVISION 0x00010002 +#define MBOX_TAG_GETSERIAL 0x00010004 +#define MBOX_TAG_ARM_MEMORY 0x00010005 int mbox_call(unsigned char ch); unsigned int get_board_revision(void); +unsigned int get_memory_base_addr(void); +unsigned int get_memory_size(void); diff --git a/kernel/Start.S b/kernel/Start.S index df2cb8f..4d2b7f0 100644 --- a/kernel/Start.S +++ b/kernel/Start.S @@ -17,13 +17,9 @@ _start: mov sp, x1 // clear bss - ldr x1, =__bss_start - ldr w2, =__bss_size -3: - cbz w2, 4f - str xzr, [x1], #8 - sub w2, w2, #1 - cbnz w2, 3b + adr x0, __bss_start + adr x1, __bss_end + bl memzero 4: // jump to C code, should not return diff --git a/lib/mbox.c b/lib/mbox.c index ac3f4fd..a0240de 100644 --- a/lib/mbox.c +++ b/lib/mbox.c @@ -42,11 +42,9 @@ volatile unsigned int __attribute__((aligned(16))) mbox[36]; #define MAILBOX_BASE MMIO_BASE + 0xb880 -#define REQUEST_CODE 0x00000000 #define REQUEST_SUCCEED 0x80000000 #define REQUEST_FAILED 0x80000001 -#define TAG_REQUEST_CODE 0x00000000 -#define END_TAG 0x00000000 +#define TAG_MBOX_REQUEST 0x00000000 /** * Make a mailbox call. Returns 0 on failure, non-zero on success @@ -73,17 +71,55 @@ int mbox_call(unsigned char ch) unsigned int get_board_revision(void) { mbox[0] = 36 * 4; - mbox[1] = REQUEST_CODE; + mbox[1] = MBOX_REQUEST; // tags mbox[2] = MBOX_TAG_BOARD_REVISION; mbox[3] = 4; - mbox[4] = TAG_REQUEST_CODE; + mbox[4] = TAG_MBOX_REQUEST; mbox[5] = 0; // value buffer - mbox[6] = END_TAG; + mbox[6] = MBOX_TAG_LAST; mbox_call(MBOX_CH_PROP); return mbox[5]; } + +unsigned int get_memory_base_addr(void) +{ + mbox[0] = 36 * 4; + mbox[1] = MBOX_REQUEST; + + // tags + mbox[2] = MBOX_TAG_ARM_MEMORY; + mbox[3] = 8; + mbox[4] = 8; + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + + mbox_call(MBOX_CH_PROP); + + return mbox[5]; +} + +unsigned int get_memory_size(void) +{ + mbox[0] = 36 * 4; + mbox[1] = MBOX_REQUEST; + + // tags + mbox[2] = MBOX_TAG_ARM_MEMORY; + mbox[3] = 8; + mbox[4] = 8; + mbox[5] = 0; + mbox[6] = 0; + + mbox[7] = MBOX_TAG_LAST; + + mbox_call(MBOX_CH_PROP); + + return mbox[6]; +} diff --git a/lib/shell.c b/lib/shell.c index ab7a4d9..bd951ce 100644 --- a/lib/shell.c +++ b/lib/shell.c @@ -6,6 +6,11 @@ #define INPUT_BUFLEN 1000 +#define PM_PASSWORD 0x5a000000 + +#define PM_RSTC 0x3F10001c +#define PM_WDOG 0x3F100024 + void help (void) { uart_puts( @@ -23,16 +28,24 @@ void hello (void) void hwinfo (void) { - unsigned int val = get_board_revision(); - uart_puts("hwinfo: "); - uart_hex(val); + uart_puts( + "hwinfo: " ENDL + "board revision: " + ); + uart_hex(get_board_revision()); + uart_puts( + ENDL + "memory base addr: " + ); + uart_hex(get_memory_base_addr()); + uart_puts( + ENDL + "memory size: " + ); + uart_hex(get_memory_size()); uart_puts(ENDL); } -#define PM_PASSWORD 0x5a000000 -#define PM_RSTC 0x3F10001c -#define PM_WDOG 0x3F100024 - void set(long addr, unsigned int value) { volatile unsigned int* point = (unsigned int*)addr; *point = value;