Skip to content

Commit b672444

Browse files
committed
Add software PWM inversion property
1 parent e8c45dd commit b672444

File tree

2 files changed

+16
-7
lines changed

2 files changed

+16
-7
lines changed

hw/arm/prusa/parts/software_pwm.c

+12-4
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
#include "qemu/osdep.h"
2626
#include "qemu/module.h"
2727
#include "migration/vmstate.h"
28+
#include "qemu/timer.h"
29+
#include "hw/qdev-properties.h"
2830
#include "hw/sysbus.h"
2931
#include "hw/irq.h"
3032

@@ -43,7 +45,7 @@ typedef struct SoftwarePWMState {
4345
uint8_t clock_count;
4446
uint8_t last_pwm[LINE_COUNT];
4547
uint16_t line_state;
46-
48+
bool is_inverted;
4749
qemu_irq pwm[LINE_COUNT];
4850

4951
} SoftwarePWMState;
@@ -73,7 +75,7 @@ static void software_pwm_tick(void *opaque, int n, int level)
7375
if (s->last_pwm[i] != s->state_count[i])
7476
{
7577
// printf("Software PWM %d: current %u\n",i, s->state_count[i]);
76-
qemu_set_irq(s->pwm[i], s->state_count[i]);
78+
qemu_set_irq(s->pwm[i], s->is_inverted?(255U - s->state_count[i]) : s->state_count[i]);
7779
}
7880
s->last_pwm[i] = s->state_count[i];
7981
s->state_count[i] = 0;
@@ -127,20 +129,26 @@ static void software_pwm_init(Object *obj)
127129
qdev_init_gpio_out(dev, s->pwm, LINE_COUNT);
128130
}
129131

130-
static void softwar_pwm_class_init(ObjectClass *klass, void *data)
132+
static Property software_pwm_properties[] = {
133+
DEFINE_PROP_BOOL("is_inverted", SoftwarePWMState, is_inverted, false),
134+
DEFINE_PROP_END_OF_LIST(),
135+
};
136+
137+
static void software_pwm_class_init(ObjectClass *klass, void *data)
131138
{
132139
DeviceClass *dc = DEVICE_CLASS(klass);
133140

134141
dc->reset = software_pwm_reset;
135142
dc->vmsd = &vmstate_software_pwm;
143+
device_class_set_props(dc, software_pwm_properties);
136144
}
137145

138146
static const TypeInfo SOFTWARE_PWM_info = {
139147
.name = TYPE_SOFTWARE_PWM,
140148
.parent = TYPE_SYS_BUS_DEVICE,
141149
.instance_size = sizeof(SoftwarePWMState),
142150
.instance_init = software_pwm_init,
143-
.class_init = softwar_pwm_class_init,
151+
.class_init = software_pwm_class_init,
144152
};
145153

146154
static void software_pwm_register_types(void)

hw/arm/prusa/prusa-mk4.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -511,7 +511,7 @@ static void mk4_init(MachineState *machine)
511511

512512
{
513513

514-
int32_t ends[4] = { 100*16*253, 100*16*214, 400*16*(cfg.has_loadcell ? 221: 212),0 };
514+
int32_t ends[4] = { 100*16*255, 100*16*214, 400*16*(cfg.has_loadcell ? 221: 212),0 };
515515
static int32_t stepsize[4] = { 100*16, 100*16, 400*16, 320*16 };
516516
static const char* links[4] = {"motor[0]","motor[1]","motor[2]","motor[3]"};
517517
if (cfg.is_400step) {
@@ -740,11 +740,12 @@ static void mk4_init(MachineState *machine)
740740

741741
// hotend = fan1
742742
// print fan = fan0
743-
uint16_t fan_max_rpms[] = { 6600, 8000 };
743+
uint16_t fan_max_rpms[] = { 6600, 7000 };
744744
uint8_t fan_pwm_pins[] = { 11, 9};
745745
uint8_t fan_tach_pins[] = { 10, 14};
746746
uint8_t fan_labels[] = {'P','E'};
747747
DeviceState* fanpwm = qdev_new("software-pwm");
748+
qdev_prop_set_bit(fanpwm, "is_inverted", true);
748749
sysbus_realize_and_unref(SYS_BUS_DEVICE(fanpwm),&error_fatal);
749750
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));
750751
for (int i=0; i<2; i++)
@@ -755,7 +756,7 @@ static void mk4_init(MachineState *machine)
755756
dev = qdev_new("fan");
756757
qdev_prop_set_uint8(dev,"label",fan_labels[i]);
757758
qdev_prop_set_uint32(dev, "max_rpm",fan_max_rpms[i]);
758-
qdev_prop_set_bit(dev, "is_nonlinear", i); // E is nonlinear.
759+
//qdev_prop_set_bit(dev, "is_nonlinear", i); // E is nonlinear.
759760
sysbus_realize(SYS_BUS_DEVICE(dev), &error_fatal);
760761
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]));
761762
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));

0 commit comments

Comments
 (0)