diff --git a/hw/arm/prusa/parts/software_pwm.c b/hw/arm/prusa/parts/software_pwm.c index e087d82f96..d39d81e317 100644 --- a/hw/arm/prusa/parts/software_pwm.c +++ b/hw/arm/prusa/parts/software_pwm.c @@ -25,6 +25,8 @@ #include "qemu/osdep.h" #include "qemu/module.h" #include "migration/vmstate.h" +#include "qemu/timer.h" +#include "hw/qdev-properties.h" #include "hw/sysbus.h" #include "hw/irq.h" @@ -43,7 +45,7 @@ typedef struct SoftwarePWMState { uint8_t clock_count; uint8_t last_pwm[LINE_COUNT]; uint16_t line_state; - + bool is_inverted; qemu_irq pwm[LINE_COUNT]; } SoftwarePWMState; @@ -73,7 +75,7 @@ static void software_pwm_tick(void *opaque, int n, int level) if (s->last_pwm[i] != s->state_count[i]) { // printf("Software PWM %d: current %u\n",i, s->state_count[i]); - qemu_set_irq(s->pwm[i], s->state_count[i]); + qemu_set_irq(s->pwm[i], s->is_inverted?(255U - s->state_count[i]) : s->state_count[i]); } s->last_pwm[i] = s->state_count[i]; s->state_count[i] = 0; @@ -127,12 +129,18 @@ static void software_pwm_init(Object *obj) qdev_init_gpio_out(dev, s->pwm, LINE_COUNT); } -static void softwar_pwm_class_init(ObjectClass *klass, void *data) +static Property software_pwm_properties[] = { + DEFINE_PROP_BOOL("is_inverted", SoftwarePWMState, is_inverted, false), + DEFINE_PROP_END_OF_LIST(), +}; + +static void software_pwm_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); dc->reset = software_pwm_reset; dc->vmsd = &vmstate_software_pwm; + device_class_set_props(dc, software_pwm_properties); } static const TypeInfo SOFTWARE_PWM_info = { @@ -140,7 +148,7 @@ static const TypeInfo SOFTWARE_PWM_info = { .parent = TYPE_SYS_BUS_DEVICE, .instance_size = sizeof(SoftwarePWMState), .instance_init = software_pwm_init, - .class_init = softwar_pwm_class_init, + .class_init = software_pwm_class_init, }; static void software_pwm_register_types(void) diff --git a/hw/arm/prusa/prusa-mk4.c b/hw/arm/prusa/prusa-mk4.c index 3549c84233..f526d919ce 100644 --- a/hw/arm/prusa/prusa-mk4.c +++ b/hw/arm/prusa/prusa-mk4.c @@ -511,7 +511,7 @@ static void mk4_init(MachineState *machine) { - int32_t ends[4] = { 100*16*253, 100*16*214, 400*16*(cfg.has_loadcell ? 221: 212),0 }; + int32_t ends[4] = { 100*16*255, 100*16*214, 400*16*(cfg.has_loadcell ? 221: 212),0 }; static int32_t stepsize[4] = { 100*16, 100*16, 400*16, 320*16 }; static const char* links[4] = {"motor[0]","motor[1]","motor[2]","motor[3]"}; if (cfg.is_400step) { @@ -740,11 +740,12 @@ static void mk4_init(MachineState *machine) // hotend = fan1 // print fan = fan0 - uint16_t fan_max_rpms[] = { 6600, 8000 }; + uint16_t fan_max_rpms[] = { 6600, 7000 }; uint8_t fan_pwm_pins[] = { 11, 9}; uint8_t fan_tach_pins[] = { 10, 14}; uint8_t fan_labels[] = {'P','E'}; DeviceState* fanpwm = qdev_new("software-pwm"); + qdev_prop_set_bit(fanpwm, "is_inverted", true); sysbus_realize_and_unref(SYS_BUS_DEVICE(fanpwm),&error_fatal); qdev_connect_gpio_out_named(stm32_soc_get_periph(dev_soc, STM32_P_TIM14), "timer", 0, qdev_get_gpio_in_named(fanpwm, "tick-in", 0)); for (int i=0; i<2; i++) @@ -755,7 +756,7 @@ static void mk4_init(MachineState *machine) dev = qdev_new("fan"); qdev_prop_set_uint8(dev,"label",fan_labels[i]); qdev_prop_set_uint32(dev, "max_rpm",fan_max_rpms[i]); - qdev_prop_set_bit(dev, "is_nonlinear", i); // E is nonlinear. + //qdev_prop_set_bit(dev, "is_nonlinear", i); // E is nonlinear. sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal); qdev_connect_gpio_out_named(dev, "tach-out",0,qdev_get_gpio_in(stm32_soc_get_periph(dev_soc, STM32_P_GPIOE),fan_tach_pins[i])); qemu_irq split_fan = qemu_irq_split( qdev_get_gpio_in_named(dev, "pwm-in",0), qdev_get_gpio_in_named(db2, "fan-pwm",i));