[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/2] versatiblepb: add NOR flash support
From: |
Eric Bénard |
Subject: |
[Qemu-devel] [PATCH 2/2] versatiblepb: add NOR flash support |
Date: |
Thu, 12 Apr 2012 09:51:47 +0200 |
- add support for the 64MB NOR CFI01 flash available at
0x34000000 on the versatilepb board
http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0225d/BBAJIHEC.html
- give the possibility to boot from the flash if no kernel
is provided to qemu
- initial idea from
http://lists.gnu.org/archive/html/qemu-devel/2008-10/msg00350.html
- tested with barebox bootloader
Signed-off-by: Eric Bénard <address@hidden>
---
hw/versatilepb.c | 38 ++++++++++++++++++++++++++++++++------
1 files changed, 32 insertions(+), 6 deletions(-)
diff --git a/hw/versatilepb.c b/hw/versatilepb.c
index 25afb1e..9a187b7 100644
--- a/hw/versatilepb.c
+++ b/hw/versatilepb.c
@@ -16,6 +16,11 @@
#include "boards.h"
#include "blockdev.h"
#include "exec-memory.h"
+#include "flash.h"
+
+#define VERSATILE_FLASH_ADDR 0x34000000
+#define VERSATILE_FLASH_SIZE (64 * 1024 * 1024)
+#define VERSATILE_FLASH_SECT_SIZE (256 * 1024)
/* Primary interrupt controller. */
@@ -180,6 +185,8 @@ static void versatile_init(ram_addr_t ram_size,
NICInfo *nd;
int n;
int done_smc = 0;
+ int fl_idx = 0;
+ DriveInfo *dinfo;
if (!cpu_model)
cpu_model = "arm926";
@@ -310,13 +317,32 @@ static void versatile_init(ram_addr_t ram_size,
/* 0x101f2000 UART1. */
/* 0x101f3000 UART2. */
/* 0x101f4000 SSPI. */
+ /* 0x34000000 NOR Flash */
+
+ dinfo = drive_get(IF_PFLASH, 0, 0);
+ if (! pflash_cfi01_register(VERSATILE_FLASH_ADDR, NULL, "versatile.flash",
+ VERSATILE_FLASH_SIZE, dinfo ? dinfo->bdrv : NULL,
+ VERSATILE_FLASH_SECT_SIZE,
+ VERSATILE_FLASH_SIZE /
VERSATILE_FLASH_SECT_SIZE,
+ 4, 0x0089, 0x0018, 0x0000, 0x0, 0)) {
+ fprintf(stderr, "qemu: Error registering flash memory.\n");
+ } else {
+ fl_idx++;
+ }
- versatile_binfo.ram_size = ram_size;
- versatile_binfo.kernel_filename = kernel_filename;
- versatile_binfo.kernel_cmdline = kernel_cmdline;
- versatile_binfo.initrd_filename = initrd_filename;
- versatile_binfo.board_id = board_id;
- arm_load_kernel(env, &versatile_binfo);
+ if (kernel_filename) {
+ versatile_binfo.ram_size = ram_size;
+ versatile_binfo.kernel_filename = kernel_filename;
+ versatile_binfo.kernel_cmdline = kernel_cmdline;
+ versatile_binfo.initrd_filename = initrd_filename;
+ versatile_binfo.board_id = board_id;
+ arm_load_kernel(env, &versatile_binfo);
+ } else if (fl_idx) {
+ env->regs[15] = VERSATILE_FLASH_ADDR;
+ } else {
+ fprintf(stderr, "Kernel or Flash image must be specified\n");
+ exit(1);
+ }
}
static void vpb_init(ram_addr_t ram_size,
--
1.7.7.6