qemu-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]