qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH v2] allwinner-a10: add config script support


From: liguang
Subject: [Qemu-devel] [PATCH v2] allwinner-a10: add config script support
Date: Thu, 26 Dec 2013 14:47:18 +0800

sunxi-linux kernel parses a special config
script to do hardware configuration, bootloader
loads script into fixed RAM address, then
kernel will learn from it.

this script is transformed from a text script
into binary by a tool.

reference:
http://linux-sunxi.org/Sunxi-tools

script file address:
http://dl.dbank.com/c00aonvlmw

Signed-off-by: liguang <address@hidden>
---
 hw/arm/allwinner-a10.c         |   27 +++++++++++++++++++++++++++
 hw/arm/cubieboard.c            |    2 ++
 include/hw/arm/allwinner-a10.h |    5 +++++
 3 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/hw/arm/allwinner-a10.c b/hw/arm/allwinner-a10.c
index 4658e19..f65b40b 100644
--- a/hw/arm/allwinner-a10.c
+++ b/hw/arm/allwinner-a10.c
@@ -18,6 +18,33 @@
 #include "hw/sysbus.h"
 #include "hw/devices.h"
 #include "hw/arm/allwinner-a10.h"
+#include "hw/loader.h"
+#include "sysemu/sysemu.h"
+
+void aw_a10_load_script(void)
+{
+    char *file_name;
+    int file_size;
+
+    if  (bios_name == NULL) {
+        bios_name = AW_CONFIG_SCRIPT;
+    }
+
+    file_name = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
+    if (file_name == NULL) {
+        error_report("can't find %s\n", bios_name);
+        return;
+    }
+    file_size = get_image_size(file_name);
+    if (file_size < 0) {
+        error_report("can't get file size of %s\n", file_name);
+        return;
+    }
+    if (load_image_targphys(file_name, AW_SCRIPT_ADDR, file_size) < 0) {
+        error_report("can't load %s\n", file_name);
+        return;
+    }
+}
 
 static void aw_a10_init(Object *obj)
 {
diff --git a/hw/arm/cubieboard.c b/hw/arm/cubieboard.c
index 3fcb6d2..8482974 100644
--- a/hw/arm/cubieboard.c
+++ b/hw/arm/cubieboard.c
@@ -48,6 +48,8 @@ static void cubieboard_init(QEMUMachineInitArgs *args)
     memory_region_add_subregion(get_system_memory(), AW_A10_SDRAM_BASE,
                                 &s->sdram);
 
+    aw_a10_load_script();
+
     cubieboard_binfo.ram_size = args->ram_size;
     cubieboard_binfo.kernel_filename = args->kernel_filename;
     cubieboard_binfo.kernel_cmdline = args->kernel_cmdline;
diff --git a/include/hw/arm/allwinner-a10.h b/include/hw/arm/allwinner-a10.h
index da36647..ad20659 100644
--- a/include/hw/arm/allwinner-a10.h
+++ b/include/hw/arm/allwinner-a10.h
@@ -17,6 +17,9 @@
 
 #define AW_A10_SDRAM_BASE       0x40000000
 
+#define AW_CONFIG_SCRIPT        "script.bin"
+#define AW_SCRIPT_ADDR          0x43000000
+
 #define TYPE_AW_A10 "allwinner-a10"
 #define AW_A10(obj) OBJECT_CHECK(AwA10State, (obj), TYPE_AW_A10)
 
@@ -31,5 +34,7 @@ typedef struct AwA10State {
     AwA10PICState intc;
 } AwA10State;
 
+void aw_a10_load_script(void);
+
 #define ALLWINNER_H_
 #endif
-- 
1.7.2.5




reply via email to

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