Hi Stephen,

On Tue, 15 Jan 2013 19:26:59 -0700, Stephen Warren
<[email protected]> 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 <[email protected]>
> ---
> 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.
_______________________________________________
U-Boot mailing list
[email protected]
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to