Skip to content

Commit

Permalink
Add software PWM inversion property
Browse files Browse the repository at this point in the history
  • Loading branch information
vintagepc committed Jan 15, 2024
1 parent e8c45dd commit b672444
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 7 deletions.
16 changes: 12 additions & 4 deletions hw/arm/prusa/parts/software_pwm.c
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -127,20 +129,26 @@ 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 = {
.name = TYPE_SOFTWARE_PWM,
.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)
Expand Down
7 changes: 4 additions & 3 deletions hw/arm/prusa/prusa-mk4.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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++)
Expand All @@ -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));
Expand Down

0 comments on commit b672444

Please sign in to comment.