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 <lig.f...@cn.fujitsu.com> --- 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