Fix: mbox output

This commit is contained in:
2025-03-11 17:52:11 +08:00
parent 73c9fc1423
commit bfcb951628
5 changed files with 70 additions and 21 deletions

1
.gitignore vendored
View File

@@ -1,3 +1,4 @@
**.o **.o
**.img **.img
**.elf **.elf
**.cpio

View File

@@ -40,9 +40,12 @@ extern volatile unsigned int mbox[36];
#define MBOX_CH_PROP 8 #define MBOX_CH_PROP 8
/* tags */ /* tags */
#define MBOX_TAG_GETSERIAL 0x10004
#define MBOX_TAG_LAST 0 #define MBOX_TAG_LAST 0
#define MBOX_TAG_BOARD_REVISION 0x00010002 #define MBOX_TAG_BOARD_REVISION 0x00010002
#define MBOX_TAG_GETSERIAL 0x00010004
#define MBOX_TAG_ARM_MEMORY 0x00010005
int mbox_call(unsigned char ch); int mbox_call(unsigned char ch);
unsigned int get_board_revision(void); unsigned int get_board_revision(void);
unsigned int get_memory_base_addr(void);
unsigned int get_memory_size(void);

View File

@@ -17,13 +17,9 @@ _start:
mov sp, x1 mov sp, x1
// clear bss // clear bss
ldr x1, =__bss_start adr x0, __bss_start
ldr w2, =__bss_size adr x1, __bss_end
3: bl memzero
cbz w2, 4f
str xzr, [x1], #8
sub w2, w2, #1
cbnz w2, 3b
4: 4:
// jump to C code, should not return // jump to C code, should not return

View File

@@ -42,11 +42,9 @@ volatile unsigned int __attribute__((aligned(16))) mbox[36];
#define MAILBOX_BASE MMIO_BASE + 0xb880 #define MAILBOX_BASE MMIO_BASE + 0xb880
#define REQUEST_CODE 0x00000000
#define REQUEST_SUCCEED 0x80000000 #define REQUEST_SUCCEED 0x80000000
#define REQUEST_FAILED 0x80000001 #define REQUEST_FAILED 0x80000001
#define TAG_REQUEST_CODE 0x00000000 #define TAG_MBOX_REQUEST 0x00000000
#define END_TAG 0x00000000
/** /**
* Make a mailbox call. Returns 0 on failure, non-zero on success * 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) unsigned int get_board_revision(void)
{ {
mbox[0] = 36 * 4; mbox[0] = 36 * 4;
mbox[1] = REQUEST_CODE; mbox[1] = MBOX_REQUEST;
// tags // tags
mbox[2] = MBOX_TAG_BOARD_REVISION; mbox[2] = MBOX_TAG_BOARD_REVISION;
mbox[3] = 4; mbox[3] = 4;
mbox[4] = TAG_REQUEST_CODE; mbox[4] = TAG_MBOX_REQUEST;
mbox[5] = 0; // value buffer mbox[5] = 0; // value buffer
mbox[6] = END_TAG; mbox[6] = MBOX_TAG_LAST;
mbox_call(MBOX_CH_PROP); mbox_call(MBOX_CH_PROP);
return mbox[5]; 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];
}

View File

@@ -6,6 +6,11 @@
#define INPUT_BUFLEN 1000 #define INPUT_BUFLEN 1000
#define PM_PASSWORD 0x5a000000
#define PM_RSTC 0x3F10001c
#define PM_WDOG 0x3F100024
void help (void) void help (void)
{ {
uart_puts( uart_puts(
@@ -23,16 +28,24 @@ void hello (void)
void hwinfo (void) void hwinfo (void)
{ {
unsigned int val = get_board_revision(); uart_puts(
uart_puts("hwinfo: "); "hwinfo: " ENDL
uart_hex(val); "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); uart_puts(ENDL);
} }
#define PM_PASSWORD 0x5a000000
#define PM_RSTC 0x3F10001c
#define PM_WDOG 0x3F100024
void set(long addr, unsigned int value) { void set(long addr, unsigned int value) {
volatile unsigned int* point = (unsigned int*)addr; volatile unsigned int* point = (unsigned int*)addr;
*point = value; *point = value;