mirror of
https://github.com/Fishwaldo/u-boot.git
synced 2025-03-17 12:41:32 +00:00
ARM: rpi_b: enable SD controller, add related env/cmds
Enable the SD controller driver for the Raspberry Pi. Enable a number of useful MMC, partition, and filesystem-related commands. Set up the environment to provide standard locations for loading a kernel, DTB, etc. Provide a boot command that loads and executes boot.scr.uimg from the SD card; this is written considering future extensibilty to USB storage. Signed-off-by: Stephen Warren <swarren@wwwdotorg.org>
This commit is contained in:
parent
9a4fbe4fbd
commit
131a1e603b
3 changed files with 117 additions and 3 deletions
|
@ -144,6 +144,32 @@ struct bcm2835_mbox_tag_get_arm_mem {
|
|||
} body;
|
||||
};
|
||||
|
||||
#define BCM2835_MBOX_TAG_GET_CLOCK_RATE 0x00030002
|
||||
|
||||
#define BCM2835_MBOX_CLOCK_ID_EMMC 1
|
||||
#define BCM2835_MBOX_CLOCK_ID_UART 2
|
||||
#define BCM2835_MBOX_CLOCK_ID_ARM 3
|
||||
#define BCM2835_MBOX_CLOCK_ID_CORE 4
|
||||
#define BCM2835_MBOX_CLOCK_ID_V3D 5
|
||||
#define BCM2835_MBOX_CLOCK_ID_H264 6
|
||||
#define BCM2835_MBOX_CLOCK_ID_ISP 7
|
||||
#define BCM2835_MBOX_CLOCK_ID_SDRAM 8
|
||||
#define BCM2835_MBOX_CLOCK_ID_PIXEL 9
|
||||
#define BCM2835_MBOX_CLOCK_ID_PWM 10
|
||||
|
||||
struct bcm2835_mbox_tag_get_clock_rate {
|
||||
struct bcm2835_mbox_tag_hdr tag_hdr;
|
||||
union {
|
||||
struct {
|
||||
u32 clock_id;
|
||||
} req;
|
||||
struct {
|
||||
u32 clock_id;
|
||||
u32 rate_hz;
|
||||
} resp;
|
||||
} body;
|
||||
};
|
||||
|
||||
#define BCM2835_MBOX_TAG_ALLOCATE_BUFFER 0x00040001
|
||||
|
||||
struct bcm2835_mbox_tag_allocate_buffer {
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
|
||||
#include <common.h>
|
||||
#include <asm/arch/mbox.h>
|
||||
#include <asm/arch/sdhci.h>
|
||||
#include <asm/global_data.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
@ -26,6 +27,12 @@ struct msg_get_arm_mem {
|
|||
u32 end_tag;
|
||||
};
|
||||
|
||||
struct msg_get_clock_rate {
|
||||
struct bcm2835_mbox_hdr hdr;
|
||||
struct bcm2835_mbox_tag_get_clock_rate get_clock_rate;
|
||||
u32 end_tag;
|
||||
};
|
||||
|
||||
int dram_init(void)
|
||||
{
|
||||
ALLOC_ALIGN_BUFFER(struct msg_get_arm_mem, msg, 1, 16);
|
||||
|
@ -51,3 +58,22 @@ int board_init(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int board_mmc_init(void)
|
||||
{
|
||||
ALLOC_ALIGN_BUFFER(struct msg_get_clock_rate, msg_clk, 1, 16);
|
||||
int ret;
|
||||
|
||||
BCM2835_MBOX_INIT_HDR(msg_clk);
|
||||
BCM2835_MBOX_INIT_TAG(&msg_clk->get_clock_rate, GET_CLOCK_RATE);
|
||||
msg_clk->get_clock_rate.body.req.clock_id = BCM2835_MBOX_CLOCK_ID_EMMC;
|
||||
|
||||
ret = bcm2835_mbox_call_prop(BCM2835_MBOX_PROP_CHAN, &msg_clk->hdr);
|
||||
if (ret) {
|
||||
printf("bcm2835: Could not query eMMC clock rate\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return bcm2835_sdhci_init(BCM2835_SDHCI_BASE,
|
||||
msg_clk->get_clock_rate.body.resp.rate_hz);
|
||||
}
|
||||
|
|
|
@ -51,6 +51,7 @@
|
|||
#define CONFIG_SYS_MALLOC_LEN SZ_4M
|
||||
#define CONFIG_SYS_MEMTEST_START 0x00100000
|
||||
#define CONFIG_SYS_MEMTEST_END 0x00200000
|
||||
#define CONFIG_LOADADDR 0x00200000
|
||||
|
||||
/* Flash */
|
||||
#define CONFIG_SYS_NO_FLASH
|
||||
|
@ -70,6 +71,13 @@
|
|||
#define CONFIG_VIDEO_BCM2835
|
||||
#define CONFIG_SYS_WHITE_ON_BLACK
|
||||
|
||||
/* SD/MMC configuration */
|
||||
#define CONFIG_GENERIC_MMC
|
||||
#define CONFIG_MMC
|
||||
#define CONFIG_SDHCI
|
||||
#define CONFIG_MMC_SDHCI_IO_ACCESSORS
|
||||
#define CONFIG_BCM2835_SDHCI
|
||||
|
||||
/* Console UART */
|
||||
#define CONFIG_PL011_SERIAL
|
||||
#define CONFIG_PL011_CLOCK 3000000
|
||||
|
@ -85,12 +93,59 @@
|
|||
/* Environment */
|
||||
#define CONFIG_ENV_SIZE SZ_16K
|
||||
#define CONFIG_ENV_IS_NOWHERE
|
||||
#define CONFIG_ENV_VARS_UBOOT_CONFIG
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x1000000
|
||||
#define CONFIG_CONSOLE_MUX
|
||||
#define CONFIG_SYS_CONSOLE_IS_IN_ENV
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS "stdin=serial\0" \
|
||||
"stderr=serial,lcd\0" \
|
||||
"stdout=serial,lcd\0"
|
||||
/*
|
||||
* Memory layout for where various images get loaded by boot scripts:
|
||||
*
|
||||
* scriptaddr can be pretty much anywhere that doesn't conflict with something
|
||||
* else. Put it low in memory to avoid conflicts.
|
||||
*
|
||||
* kernel_addr_r must be within the first 128M of RAM in order for the
|
||||
* kernel's CONFIG_AUTO_ZRELADDR option to work. Since the kernel will
|
||||
* decompress itself to 0x8000 after the start of RAM, kernel_addr_r
|
||||
* should not overlap that area, or the kernel will have to copy itself
|
||||
* somewhere else before decompression. Similarly, the address of any other
|
||||
* data passed to the kernel shouldn't overlap the start of RAM. Pushing
|
||||
* this up to 16M allows for a sizable kernel to be decompressed below the
|
||||
* compressed load address.
|
||||
*
|
||||
* fdt_addr_r simply shouldn't overlap anything else. Choosing 32M allows for
|
||||
* the compressed kernel to be up to 16M too.
|
||||
*
|
||||
* ramdisk_addr_r simply shouldn't overlap anything else. Choosing 33M allows
|
||||
* for the FDT/DTB to be up to 1M, which is hopefully plenty.
|
||||
*/
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"stdin=serial\0" \
|
||||
"stderr=serial,lcd\0" \
|
||||
"stdout=serial,lcd\0" \
|
||||
"scriptaddr=0x00000000\0" \
|
||||
"kernel_addr_r=0x01000000\0" \
|
||||
"fdt_addr_r=0x02000000\0" \
|
||||
"ramdisk_addr_r=0x02100000\0" \
|
||||
"boot_targets=mmc0\0" \
|
||||
\
|
||||
"script_boot=" \
|
||||
"if fatload ${devtype} ${devnum}:1 " \
|
||||
"${scriptaddr} boot.scr.uimg; then " \
|
||||
"source ${scriptaddr}; " \
|
||||
"fi;\0" \
|
||||
\
|
||||
"mmc_boot=" \
|
||||
"setenv devtype mmc; " \
|
||||
"if mmc dev ${devnum}; then " \
|
||||
"run script_boot; " \
|
||||
"fi\0" \
|
||||
\
|
||||
"bootcmd_mmc0=setenv devnum 0; run mmc_boot\0" \
|
||||
|
||||
#define CONFIG_BOOTCOMMAND \
|
||||
"for target in ${boot_targets}; do run bootcmd_${target}; done"
|
||||
|
||||
#define CONFIG_BOOTDELAY 2
|
||||
|
||||
/* Shell */
|
||||
#define CONFIG_SYS_HUSH_PARSER
|
||||
|
@ -105,6 +160,13 @@
|
|||
#include <config_cmd_default.h>
|
||||
#define CONFIG_CMD_BOOTZ
|
||||
#define CONFIG_CMD_GPIO
|
||||
#define CONFIG_CMD_MMC
|
||||
#define CONFIG_DOS_PARTITION
|
||||
#define CONFIG_PARTITION_UUIDS
|
||||
#define CONFIG_CMD_PART
|
||||
#define CONFIG_CMD_FS_GENERIC
|
||||
#define CONFIG_CMD_FAT
|
||||
#define CONFIG_CMD_EXT
|
||||
/* Some things don't make sense on this HW or yet */
|
||||
#undef CONFIG_CMD_FPGA
|
||||
#undef CONFIG_CMD_NET
|
||||
|
|
Loading…
Add table
Reference in a new issue