Fix: mbox output
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,3 +1,4 @@
|
|||||||
**.o
|
**.o
|
||||||
**.img
|
**.img
|
||||||
**.elf
|
**.elf
|
||||||
|
**.cpio
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
48
lib/mbox.c
48
lib/mbox.c
@@ -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];
|
||||||
|
}
|
||||||
|
|||||||
27
lib/shell.c
27
lib/shell.c
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user