diff options
Diffstat (limited to 'arch/arm/boards/raspberry-pi')
-rw-r--r-- | arch/arm/boards/raspberry-pi/env/init/ps1 | 7 | ||||
-rw-r--r-- | arch/arm/boards/raspberry-pi/rpi.c | 82 |
2 files changed, 88 insertions, 1 deletions
diff --git a/arch/arm/boards/raspberry-pi/env/init/ps1 b/arch/arm/boards/raspberry-pi/env/init/ps1 new file mode 100644 index 0000000000..f8948466d3 --- /dev/null +++ b/arch/arm/boards/raspberry-pi/env/init/ps1 @@ -0,0 +1,7 @@ +#!/bin/sh + +if [ ${global.allow_color} = "true" ]; then + export PS1="\e[1;32mbarebox@\e[1;36m\h:\w\e[0m\n# " +else + export PS1="barebox@\h:\w\n# " +fi diff --git a/arch/arm/boards/raspberry-pi/rpi.c b/arch/arm/boards/raspberry-pi/rpi.c index 03a16d7561..6efbf48be4 100644 --- a/arch/arm/boards/raspberry-pi/rpi.c +++ b/arch/arm/boards/raspberry-pi/rpi.c @@ -20,6 +20,7 @@ #include <linux/clk.h> #include <linux/clkdev.h> #include <envfs.h> +#include <malloc.h> #include <asm/armlinux.h> #include <generated/mach-types.h> @@ -38,6 +39,12 @@ struct msg_get_clock_rate { u32 end_tag; }; +struct msg_get_board_rev { + struct bcm2835_mbox_hdr hdr; + struct bcm2835_mbox_tag_get_board_rev get_board_rev; + u32 end_tag; +}; + static int rpi_get_arm_mem(u32 *size) { BCM2835_MBOX_STACK_ALIGN(struct msg_get_arm_mem, msg); @@ -79,6 +86,79 @@ static int rpi_register_clkdev(u32 clock_id, const char *name) return 0; } + +#define RPI_MODEL(_id, _name, _init) \ + [_id] = { \ + .name = _name,\ + .init = _init,\ + } +/* See comments in mbox.h for data source */ +static const struct { + const char *name; + void (*init)(void); +} models[] = { + RPI_MODEL(0, "Unknown model", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C0_2, "Model B (no P5)", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C0_3, "Model B (no P5)", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_4, "Model B", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_5, "Model B", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_6, "Model B", NULL), + RPI_MODEL(BCM2835_BOARD_REV_A_7, "Model A", NULL), + RPI_MODEL(BCM2835_BOARD_REV_A_8, "Model A", NULL), + RPI_MODEL(BCM2835_BOARD_REV_A_9, "Model A", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_REV2_d, "Model B rev2", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_REV2_e, "Model B rev2", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_REV2_f, "Model B rev2", NULL), + RPI_MODEL(BCM2835_BOARD_REV_B_PLUS, "Model B+", NULL), + RPI_MODEL(BCM2835_BOARD_REV_CM, "Compute Module", NULL), + RPI_MODEL(BCM2835_BOARD_REV_A_PLUS, "Model A+", NULL), +}; + +static int rpi_board_rev = 0; + +static void rpi_get_board_rev(void) +{ + int ret; + char *name; + + BCM2835_MBOX_STACK_ALIGN(struct msg_get_board_rev, msg); + BCM2835_MBOX_INIT_HDR(msg); + BCM2835_MBOX_INIT_TAG(&msg->get_board_rev, GET_BOARD_REV); + + ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr); + if (ret) { + printf("bcm2835: Could not query board revision\n"); + /* Ignore error; not critical */ + return; + } + + rpi_board_rev = msg->get_board_rev.body.resp.rev; + if (rpi_board_rev >= ARRAY_SIZE(models)) { + printf("RPI: Board rev %u outside known range\n", + rpi_board_rev); + goto unknown_rev; + } + + if (!models[rpi_board_rev].name) { + printf("RPI: Board rev %u unknown\n", rpi_board_rev); + goto unknown_rev; + } + + if (!rpi_board_rev) + goto unknown_rev; + + name = asprintf("RaspberryPi %s (BCM2835/ARM1176JZF-S)", + models[rpi_board_rev].name); + barebox_set_model(name); + free(name); + + return; + +unknown_rev: + rpi_board_rev = 0; + barebox_set_model("RaspberryPi (BCM2835/ARM1176JZF-S)"); +} + static int rpi_mem_init(void) { u32 size = 0; @@ -96,7 +176,7 @@ mem_initcall(rpi_mem_init); static int rpi_console_init(void) { - barebox_set_model("RaspberryPi (BCM2835/ARM1176JZF-S)"); + rpi_get_board_rev(); barebox_set_hostname("rpi"); bcm2835_register_uart(); |