9
0
Fork 0

raspberry-pi: mac address detection support

increase the mbox timeout as it take more time to retreive the mac

fix led register too

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2015-01-19 13:29:44 +01:00 committed by Sascha Hauer
parent f72725e352
commit eb4a932c77
3 changed files with 50 additions and 10 deletions

View File

@ -22,6 +22,7 @@
#include <envfs.h>
#include <malloc.h>
#include <gpio.h>
#include <net.h>
#include <led.h>
#include <asm/armlinux.h>
#include <generated/mach-types.h>
@ -47,6 +48,12 @@ struct msg_get_board_rev {
u32 end_tag;
};
struct msg_get_mac_address {
struct bcm2835_mbox_hdr hdr;
struct bcm2835_mbox_tag_get_mac_address get_mac_address;
u32 end_tag;
};
static int rpi_get_arm_mem(u32 *size)
{
BCM2835_MBOX_STACK_ALIGN(struct msg_get_arm_mem, msg);
@ -88,6 +95,23 @@ static int rpi_register_clkdev(u32 clock_id, const char *name)
return 0;
}
static void rpi_set_usbethaddr(void)
{
BCM2835_MBOX_STACK_ALIGN(struct msg_get_mac_address, msg);
int ret;
BCM2835_MBOX_INIT_HDR(msg);
BCM2835_MBOX_INIT_TAG(&msg->get_mac_address, GET_MAC_ADDRESS);
ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg->hdr);
if (ret) {
printf("bcm2835: Could not query MAC address\n");
/* Ignore error; not critical */
return;
}
eth_register_ethaddr(0, msg->get_mac_address.body.resp.mac);
}
static struct gpio_led leds[] = {
{
@ -124,12 +148,14 @@ static void rpi_b_plus_init(void)
{
leds[0].gpio = 47;
leds[1].gpio = 35;
rpi_set_usbethaddr();
}
static void rpi_b_init(void)
{
leds[0].gpio = 16;
leds[0].active_low = 1;
rpi_set_usbethaddr();
}
#define RPI_MODEL(_id, _name, _init) \
@ -143,18 +169,18 @@ static const struct {
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_B_I2C0_2, "Model B (no P5)", rpi_b_init),
RPI_MODEL(BCM2835_BOARD_REV_B_I2C0_3, "Model B (no P5)", rpi_b_init),
RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_4, "Model B", rpi_b_init),
RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_5, "Model B", rpi_b_init),
RPI_MODEL(BCM2835_BOARD_REV_B_I2C1_6, "Model B", rpi_b_init),
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_B_REV2_d, "Model B rev2", rpi_b_init),
RPI_MODEL(BCM2835_BOARD_REV_B_REV2_e, "Model B rev2", rpi_b_init),
RPI_MODEL(BCM2835_BOARD_REV_B_REV2_f, "Model B rev2", rpi_b_init),
RPI_MODEL(BCM2835_BOARD_REV_B_PLUS, "Model B+", rpi_b_plus_init),
RPI_MODEL(BCM2835_BOARD_REV_CM, "Compute Module", NULL),
RPI_MODEL(BCM2835_BOARD_REV_A_PLUS, "Model A+", NULL),
};

View File

@ -158,6 +158,20 @@ struct bcm2835_mbox_tag_get_board_rev {
} body;
};
#define BCM2835_MBOX_TAG_GET_MAC_ADDRESS 0x00010003
struct bcm2835_mbox_tag_get_mac_address {
struct bcm2835_mbox_tag_hdr tag_hdr;
union {
struct {
} req;
struct {
u8 mac[6];
u8 pad[2];
} resp;
} body;
};
#define BCM2835_MBOX_TAG_GET_ARM_MEMORY 0x00010005
struct bcm2835_mbox_tag_get_arm_mem {

View File

@ -13,7 +13,7 @@
#include <mach/mbox.h>
#define TIMEOUT (MSECOND * 100) /* 100mS */
#define TIMEOUT (MSECOND * 1000)
static int bcm2835_mbox_call_raw(u32 chan, struct bcm2835_mbox_hdr *buffer,
u32 *recv)