113 lines
2.3 KiB
C
113 lines
2.3 KiB
C
/*
|
|
* Copyright (C) 2012 Free Electrons
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License as
|
|
* published by the Free Software Foundation; either version 2 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include <common.h>
|
|
|
|
#include <environment.h>
|
|
#include <fcntl.h>
|
|
#include <fs.h>
|
|
#include <globalvar.h>
|
|
#include <libbb.h>
|
|
#include <magicvar.h>
|
|
|
|
#include <asm/armlinux.h>
|
|
|
|
enum board_type {
|
|
BOARD_ID_CFA10036 = 0,
|
|
BOARD_ID_CFA10037 = 1,
|
|
BOARD_ID_CFA10049 = 2,
|
|
BOARD_ID_CFA10055 = 3,
|
|
BOARD_ID_CFA10056 = 4,
|
|
BOARD_ID_CFA10057 = 5,
|
|
BOARD_ID_CFA10058 = 6,
|
|
};
|
|
|
|
struct cfa_eeprom_info {
|
|
u8 board_id;
|
|
}__attribute__ ((packed));
|
|
|
|
static int cfa10036_read_eeprom(const char *file, struct cfa_eeprom_info *info)
|
|
{
|
|
int fd;
|
|
int ret;
|
|
|
|
fd = open(file, O_RDONLY);
|
|
if (fd < 0) {
|
|
ret = fd;
|
|
goto err;
|
|
}
|
|
|
|
ret = read_full(fd, info, sizeof(*info));
|
|
if (ret < 0)
|
|
goto err_open;
|
|
|
|
ret = 0;
|
|
|
|
err_open:
|
|
close(fd);
|
|
err:
|
|
if (ret)
|
|
pr_err("can not read eeprom %s (%s)\n", file, strerror(ret));
|
|
return ret;
|
|
}
|
|
|
|
void cfa10036_detect_hw(void)
|
|
{
|
|
enum board_type cfa_type;
|
|
struct cfa_eeprom_info info;
|
|
char *board_name;
|
|
int ret;
|
|
|
|
ret = cfa10036_read_eeprom("/dev/eeprom0", &info);
|
|
if (ret)
|
|
cfa_type = BOARD_ID_CFA10036;
|
|
else
|
|
cfa_type = info.board_id;
|
|
|
|
switch (cfa_type) {
|
|
case BOARD_ID_CFA10036:
|
|
board_name = "cfa10036";
|
|
break;
|
|
case BOARD_ID_CFA10037:
|
|
board_name = "cfa10037";
|
|
break;
|
|
case BOARD_ID_CFA10049:
|
|
board_name = "cfa10049";
|
|
break;
|
|
case BOARD_ID_CFA10055:
|
|
board_name = "cfa10055";
|
|
break;
|
|
case BOARD_ID_CFA10056:
|
|
board_name = "cfa10056";
|
|
break;
|
|
case BOARD_ID_CFA10057:
|
|
board_name = "cfa10057";
|
|
break;
|
|
case BOARD_ID_CFA10058:
|
|
board_name = "cfa10058";
|
|
break;
|
|
default:
|
|
pr_err("Board ID not supported\n");
|
|
return;
|
|
}
|
|
|
|
globalvar_add_simple("board.variant", board_name);
|
|
|
|
pr_info("Booting on a CFA10036 with %s\n", board_name);
|
|
}
|
|
|
|
BAREBOX_MAGICVAR_NAMED(global_board_variant, global.board.variant, "The board variant");
|