void xs_gpt_stop(xsMachine *the) { mc_gpt_t *gpt = xsGetHostData(xsThis); mdev_t *mdev; if ((mdev = gpt_drv_open(gpt->id)) == NULL) return; gpt_drv_stop(mdev); gpt_drv_close(mdev); gpt->running = 0; xsSetTrue(xsResult); }
void xs_gpt_start(xsMachine *the) { mc_gpt_t *gpt = xsGetHostData(xsThis); uint32_t interval = xsToInteger(xsArg(0)); mdev_t *mdev; if ((mdev = gpt_drv_open(gpt->id)) == NULL) return; gpt_drv_set(mdev, interval); gpt_drv_start(mdev); gpt_drv_close(mdev); gpt->running++; xsSetTrue(xsResult); }
void xs_gpt_pwm(xsMachine *the) { mc_gpt_t *gpt = xsGetHostData(xsThis); uint32_t on = xsToInteger(xsArg(0)); /* in ms */ uint32_t off = xsToInteger(xsArg(1)); /* ditto */ mdev_t *mdev; if ((mdev = gpt_drv_open(gpt->id)) == NULL) return; gpt_drv_set(mdev, 0xffffffff/50); gpt_drv_pwm(mdev, gpt->channel, on * 50000, off * 50000); /* @ 50MHz? */ gpt_drv_start(mdev); gpt_drv_close(mdev); gpt->running++; xsSetTrue(xsResult); }
void xs_i2c_write(xsMachine *the) { wm_i2c *i2c = xsGetHostData(xsThis); int ac = xsToInteger(xsArgc); int reg; uint8_t *data; int datasize; uint8_t num; uint8_t *allocated = NULL; if (ac < 2) return; #if I2C_SUPPORT_CONCURRENCY if (i2c->slave_addr != i2c_current_slave_addr) i2c_config(i2c); #endif switch (xsTypeOf(xsArg(0))) { case xsNumberType: case xsIntegerType: reg = xsToInteger(xsArg(0)); break; default: reg = -1; break; } switch (xsTypeOf(xsArg(1))) { case xsIntegerType: case xsNumberType: num = (uint8_t)xsToInteger(xsArg(1)); data = # datasize = 1; break; case xsReferenceType: if (xsIsInstanceOf(xsArg(1), xsArrayPrototype)) { int i; xsVars(1); xsGet(xsVar(0), xsArg(1), xsID("length")); datasize = xsToInteger(xsVar(0)); if ((allocated = mc_malloc(datasize)) == NULL) mc_xs_throw(the, "no mem"); for (i = 0; i < datasize; i++) { xsGet(xsVar(0), xsArg(1), (xsIndex)i); allocated[i] = (uint8_t)xsToInteger(xsVar(0)); } data = allocated; } else { datasize = xsGetArrayBufferLength(xsArg(1)); data = xsToArrayBuffer(xsArg(1)); } break; default: mc_xs_throw(the, "args"); return; /* NOT REACHED */ } if (ac > 2) { int n = xsToInteger(xsArg(2)); if (datasize > n) datasize = n; } if (!i2c_wait_for_ack(i2c, i2c->txtout)) mc_log_debug("I2C: write: no ack!\n"); if (!i2c_write_bytes(i2c, reg, data, datasize)) goto bail; (void)i2c_wait_tx_fifo(i2c); /* send the stop sequence */ if (allocated != NULL) mc_free(allocated); xsSetTrue(xsResult); bail: return; }