[PATCH V5 REPOST 7/7] ARM: rpi_b: enable SD controller, add related env/cmds
Albert ARIBAUD
albert.u.boot at aribaud.net
Wed Mar 20 11:31:57 EDT 2013
Hi Stephen,
On Tue, 15 Jan 2013 19:26:59 -0700, Stephen Warren
<swarren at wwwdotorg.org> wrote:
> 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 at wwwdotorg.org>
> ---
> v5: No change.
> v4:
> * Merged with video patch series due to dependencies in rpi_b.h.
> * Rebased onto latest u-boot-arm/master; no real changes.
> v3: No such version was posted.
> v2: No change.
> ---
> arch/arm/include/asm/arch-bcm2835/mbox.h | 26 ++++++++++++
> board/raspberrypi/rpi_b/rpi_b.c | 26 ++++++++++++
> include/configs/rpi_b.h | 68 ++++++++++++++++++++++++++++--
> 3 files changed, 117 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-bcm2835/mbox.h b/arch/arm/include/asm/arch-bcm2835/mbox.h
> index 4752091..b07c4a0 100644
> --- a/arch/arm/include/asm/arch-bcm2835/mbox.h
> +++ b/arch/arm/include/asm/arch-bcm2835/mbox.h
> @@ -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 {
> diff --git a/board/raspberrypi/rpi_b/rpi_b.c b/board/raspberrypi/rpi_b/rpi_b.c
> index 3c654a1..6b3e095 100644
> --- a/board/raspberrypi/rpi_b/rpi_b.c
> +++ b/board/raspberrypi/rpi_b/rpi_b.c
> @@ -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);
> +}
> diff --git a/include/configs/rpi_b.h b/include/configs/rpi_b.h
> index e485a06..3d55d36 100644
> --- a/include/configs/rpi_b.h
> +++ b/include/configs/rpi_b.h
> @@ -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
Applied to u-boot-arm/master, thanks!
Amicalement,
--
Albert.
More information about the linux-rpi-kernel
mailing list