Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -161,3 +161,7 @@ trace-dtrace-root.dtrace
trace-ust-all.h
trace-ust-all.c
/target/arm/decode-sve.inc.c
storage-daemon/
qemu-storage-daemon
roms
/build
15 changes: 15 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
cmake_minimum_required(VERSION 3.3)
project(qemu_dev)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

file(GLOB_RECURSE src "*.c" "*.h")

set(SOURCES ${src})
add_executable(qemu_dev ${SOURCES} )
target_include_directories(qemu_dev PUBLIC "include" "target/arm" "")

add_custom_target(qemu ALL
make -j4
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/build"
)
13 changes: 13 additions & 0 deletions hw/arm/Makefile.objs
Original file line number Diff line number Diff line change
Expand Up @@ -54,3 +54,16 @@ obj-$(CONFIG_FSL_IMX7) += fsl-imx7.o mcimx7d-sabre.o
obj-$(CONFIG_ARM_SMMUV3) += smmu-common.o smmuv3.o
obj-$(CONFIG_FSL_IMX6UL) += fsl-imx6ul.o mcimx6ul-evk.o
obj-$(CONFIG_NRF51_SOC) += nrf51_soc.o
obj-y += amazfit.o
obj-y += stm32l467_soc.o
obj-y += stm32l476_flash.o
obj-y += stm32l476_lptim.o
obj-y += stm32l476_pwr.o
obj-y += stm32l476_rcc.o
obj-y += stm32l476_dma.o
obj-y += stm32l476_spi.o
obj-y += stm32l476_qspi.o
obj-y += stm32l476_gpio.o
obj-y += stm32l476_syscfg.o
obj-y += stm32l476_i2c.o
obj-y += it7259.o
57 changes: 57 additions & 0 deletions hw/arm/amazfit.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@

#include "qemu/osdep.h"
#include "qapi/error.h"
#include "hw/boards.h"
#include "hw/qdev-properties.h"
#include "hw/arm/stm32l467_soc.h"
#include "hw/arm/boot.h"
#include "hw/loader.h"
#include "hw/ssi/ssi.h"
#include "hw/i2c/i2c.h"

static uint32_t readu32(hwaddr addr) {
uint32_t ret;
ARMCPU *cpu = ARM_CPU(first_cpu);
cpu_memory_rw_debug(cpu, addr, &ret, 4, false);

return ret;
}

static void bip_init(MachineState *machine) {

STM32L467State *dev = STM32L467_SOC(qdev_create(NULL, TYPE_STM32L467_SOC));
object_property_set_bool(OBJECT(dev), true, "realized", &error_fatal);

SSIBus* spi_bus = (SSIBus *)qdev_get_child_bus(&dev->spi[2], "ssi"); // SPI3
DeviceState * display = ssi_create_slave_no_init(spi_bus, "jdi-lpm013m126c");
qdev_init_nofail(display);

/* --- QSPI Flash --------------------------------------------- */
SSIBus * qspi = (SSIBus *)qdev_get_child_bus(&dev->qspi, "qspi");
DeviceState *qspi_flash = ssi_create_slave_no_init(qspi, "w25q64fw");

DriveInfo *dinfo = drive_get(IF_MTD, 0, 0);
BlockBackend *blk = dinfo ? blk_by_legacy_dinfo(dinfo) : NULL;
qdev_prop_set_drive(qspi_flash, "drive", blk, &error_fatal);
qdev_init_nofail(qspi_flash);

qemu_irq mx25u_cs = qdev_get_gpio_in_named(qspi_flash, SSI_GPIO_CS, 0);
sysbus_connect_irq(SYS_BUS_DEVICE(&dev->qspi), 1, mx25u_cs);

load_image_targphys("/Users/Marijn/Downloads/bip/image.bin",
// load_image_targphys("/Users/Marijn/Projects/_pebble/Amazfitbip-FreeRTOS/bin/lcd_test.bin",
0,
FLASH_SIZE);

I2CBus *i2c = (I2CBus *) qdev_get_child_bus(&dev->i2c[0], "i2c");
i2c_create_slave(i2c, "it7259", 0x46);

armv7m_load_kernel(ARM_CPU(first_cpu), NULL, 0);
}

static void bip_machine_init(MachineClass *mc) {
mc->desc = "Amazfit Bip";
mc->init = bip_init;
}

DEFINE_MACHINE("amazfitbip", bip_machine_init)
74 changes: 74 additions & 0 deletions hw/arm/it7259.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
#include "qemu/osdep.h"
#include "hw/i2c/i2c.h"
#include "hw/irq.h"
#include "migration/vmstate.h"
#include "qemu/module.h"
#include "qemu/timer.h"
#include "ui/console.h"

#define TYPE_IT7259 "it7259"
#define IT7259(obj) OBJECT_CHECK(IT7259State, (obj), TYPE_IT7259)

typedef struct
{
I2CSlave parent_obj;

} IT7259State;

static int
it7259_event(I2CSlave *i2c, enum i2c_event event)
{
IT7259State *s = IT7259(i2c);

return 0;
}

static uint8_t
it7259_rx(I2CSlave *i2c)
{
IT7259State *s = IT7259(i2c);

return 0;
}

static int
it7259_tx(I2CSlave *i2c, uint8_t data)
{
IT7259State *s = IT7259(i2c);
printf("I2C: 0x%02X\n", data);

return 0;
}

static void
it7259_realize(DeviceState *dev, Error **errp)
{
IT7259State *s = IT7259(dev);
}

static void
it7259_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
I2CSlaveClass *k = I2C_SLAVE_CLASS(klass);

dc->realize = it7259_realize;
k->event = it7259_event;
k->recv = it7259_rx;
k->send = it7259_tx;
}

static const TypeInfo it7259_info = {
.name = TYPE_IT7259,
.parent = TYPE_I2C_SLAVE,
.instance_size = sizeof(IT7259State),
.class_init = it7259_class_init,
};

static void
it7259_register_types(void)
{
type_register_static(&it7259_info);
}

type_init(it7259_register_types)
Loading