Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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 = &num;
		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;
}