Example #1
0
static int
gpio_driver_open(struct inode *dev_node, struct file *instance)
{
	SD *data = NULL;

	int accmode = (instance->f_flags & O_ACCMODE);
	bool read_mode  = (accmode == O_RDONLY);
	bool write_mode = (accmode == O_WRONLY);

	if (!read_mode && !write_mode) {
		dev_err(drv_dev, "only O_RDONLY or O_WRONLY allowed\n");
		return -EIO;
	}

	if (write_mode)
		if (config_pin(DEF_PIN_WRITE, true, &data) == -1)
			return -EIO;

	if (read_mode)
		if (config_pin(DEF_PIN_READ, false, &data) == -1)
			return -EIO;

	instance->private_data = (void *) data;

	/* some useful info */
	dev_info(drv_dev, "open values:\n");
	dev_info(drv_dev, "name = %s\n", data->name);
	dev_info(drv_dev, "pin = %d\n", data->pin);

	return 0;
}
Example #2
0
static long
gpio_driver_ioctl(struct file *instance, unsigned int cmd,
		  unsigned long __user arg)
{
	unsigned int value = 0;

	SD *data = NULL;
	SD *tmp_data = NULL;

	if (get_user(value, (int __user *) arg)) {
		dev_err(drv_dev, "could not copy from userspace\n");
		return -EFAULT;
	}

	if (value <= 0) {
		dev_err(drv_dev, "a value below <=0 makes no sense\n");
		return -EINVAL;
	} else {
		dev_info(drv_dev, "value from userspace is %d\n", value);
	}

	switch(cmd) {
	case IOCTL_SET_WRITE_PIN:
		if (config_pin(value, true, &data) == -1)
			return -EIO;
		break;
	case IOCTL_SET_READ_PIN:
		if (config_pin(value, false, &data) == -1)
			return -EIO;
		break;
	default:
		dev_err(drv_dev, "unknown ioctl 0x%x\n", cmd);
		return -EINVAL;
	}

	if (instance->private_data) {
		tmp_data = (SD *) instance->private_data;

		gpio_free(tmp_data->pin);

		kfree(tmp_data->name);
		kfree(instance->private_data);

	} else {
		dev_err(drv_dev, "ioctl: instance->private_data == NULL\n");
	}

	instance->private_data = (void *) data;

	/* some useful info  */
	dev_info(drv_dev, "ioctl values:\n");
	dev_info(drv_dev, "name = %s\n", data->name);
	dev_info(drv_dev, "pin = %d\n", data->pin);

	return 0;
}
Example #3
0
/**
 * db8500_config_pins - configure several pins at once
 * @cfgs: array of pin configurations
 * @num: number of elments in the array
 *
 * Configures several pins using config_pin(). Refer to that function for
 * further information.
 */
void db8500_gpio_config_pins(pin_cfg_t *cfgs, size_t num)
{
    size_t i;

    for (i = 0; i < num; i++)
        config_pin(cfgs[i]);
}
Example #4
0
static ssize_t store_pins_config(struct device *dev,
				    struct device_attribute *attr,
				    const char *buf, size_t size) {

    int pin = buf[0]-48;
    int config = buf[1]-48;
    int value = buf[2]-48;

    printk("pin %d\nconfig %d\nvalue %d\n", pin, config, value);
    if(pin >=0 && pin <=9 && config >= 0 && config <= 3 && debug_sw > 0) {
        config_pin(pin, config, value);
        return size;
    }

    printk("pins config error\n");
    return size;
}
Example #5
0
static int alloc(struct vidsrc_st **stp, const struct vidsrc *vs,
		 struct media_ctx **ctx, struct vidsrc_prm *prm,
		 const struct vidsz *size,
		 const char *fmt, const char *dev,
		 vidsrc_frame_h *frameh,
		 vidsrc_error_h *errorh, void *arg)
{
	struct vidsrc_st *st;
	IEnumPins *pin_enum = NULL;
	IPin *pin = NULL;
	HRESULT hr;
	int err;
	(void)ctx;
	(void)errorh;

	if (!stp || !vs || !prm || !size)
		return EINVAL;

	st = (struct vidsrc_st *) mem_zalloc(sizeof(*st), destructor);
	if (!st)
		return ENOMEM;

	err = get_device(st, dev);
	if (err)
		goto out;

	st->vs = vs;

	st->size   = *size;
	st->frameh = frameh;
	st->arg    = arg;

	st->grab = new Grabber(st);
	if (!st->grab) {
		err = ENOMEM;
		goto out;
	}

	hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC,
                              IID_IGraphBuilder, (void **) &st->graph);
	if (FAILED(hr)) {
		warning("dshow: alloc: IID_IGraphBuilder failed: %ld\n", hr);
		err = ENODEV;
		goto out;
	}

	hr = CoCreateInstance(CLSID_CaptureGraphBuilder2 , NULL,
			      CLSCTX_INPROC, IID_ICaptureGraphBuilder2,
			      (void **) &st->capture);
	if (FAILED(hr)) {
		warning("dshow: alloc: IID_ICaptureGraphBuilder2: %ld\n", hr);
		err = ENODEV;
		goto out;
	}

	hr = st->capture->SetFiltergraph(st->graph);
	if (FAILED(hr)) {
		warning("dshow: alloc: SetFiltergraph failed: %ld\n", hr);
		err = ENODEV;
		goto out;
	}

	hr = st->dev_moniker->BindToObject(NULL, NULL, IID_IBaseFilter,
				    (void **) &st->dev_filter);
	if (FAILED(hr)) {
		warning("dshow: alloc: bind to base filter failed: %ld\n", hr);
		err = ENODEV;
		goto out;
	}

	hr = st->graph->AddFilter(st->dev_filter, L"Video Capture");
	if (FAILED(hr)) {
		warning("dshow: alloc: VideoCapture failed: %ld\n", hr);
		err = ENODEV;
		goto out;
	}

	hr = st->dev_filter->EnumPins(&pin_enum);
	if (pin_enum) {
		pin_enum->Reset();
		hr = pin_enum->Next(1, &pin, NULL);
	}

	add_sample_grabber(st);
	err = config_pin(st, pin);
	pin->Release();
	if (err)
		goto out;

	hr = st->capture->RenderStream(&PIN_CATEGORY_CAPTURE,
				       &MEDIATYPE_Video,
				       st->dev_filter,
				       NULL, st->grabber_filter);
	if (FAILED(hr)) {
		warning("dshow: alloc: RenderStream failed\n");
		err = ENODEV;
		goto out;
	}

	hr = st->graph->QueryInterface(IID_IMediaControl,
				       (void **) &st->mc);
	if (FAILED(hr)) {
		warning("dshow: alloc: IMediaControl failed\n");
		err = ENODEV;
		goto out;
	}

	hr = st->mc->Run();
	if (FAILED(hr)) {
		warning("dshow: alloc: Run failed\n");
		err = ENODEV;
		goto out;
	}

 out:
	if (err)
		mem_deref(st);
	else
		*stp = st;

	return err;
}
Example #6
0
int process_framework_event(int cmd) {
    int ret = 0;
    unsigned char data[256]={0};

    switch(cmd) {

        case CMD_REQUEST_PIN:
            ret = vdev_socket_recv(data, 3);
            if(ret < 3) {
                printk("vdev socket recv error\n");
                ret = FAILED;
                break;
            }
            ret = config_pin(data[0], data[1], data[2]);
            break;

        case CMD_GET_PIN_CONFIG:
            ret = vdev_socket_recv(data, 1);
            if(ret < 1) {
                printk("vdev socket recv error\n");
                ret = FAILED;
                break;
            }
            if(data[0] < 0 || data[0] > 9) {
                printk("vdev get pin config param error\n");
                ret = FAILED;
            }
            ret = pin_type[data[0]];
            break;

        case CMD_SET_PIN_LEVEL:
            ret = vdev_socket_recv(data, 2);
            if(ret < 2) {
                printk("vdev socket recv error\n");
                ret = FAILED;
                break;
            }
            if(data[0] < 0 || data[0] > 9) {
                printk("vdev get pin config param error\n");
                ret = FAILED;
                break;
            }
            if(pin_type[data[0]] != PIN_TYPE_OUT) {
                ret = FAILED;
                break;
            }
            printk("pin %d = %d\n", data[0], data[1]>0?1:0);
            gpio_set_value(pin[data[0]], data[1]>0?1:0);
            ret = SUCCESS;
            break;

        case CMD_GET_PIN_LEVEL:
            ret = vdev_socket_recv(data, 1);
            if(ret < 1) {
                printk("vdev socket recv error\n");
                ret = FAILED;
                break;
            }
            if(data[0] < 0 || data[0] > 9) {
                printk("vdev get pin config param error\n");
                ret = FAILED;
                break;
            }
            if(pin_type[data[0]] != PIN_TYPE_IN) {
                ret = FAILED;
                break;
            }
            ret = gpio_get_value(pin[data[0]]);
            break;

        case CMD_FREE_PIN:
            ret = vdev_socket_recv(data, 1);
            if(ret < 1) {
                printk("vdev socket recv error\n");
                ret = FAILED;
                break;
            }
            if(data[0] < 0 || data[0] > 9) {
                printk("vdev get pin config param error\n");
                ret = FAILED;
                break;
            }
            ret = config_pin(data[0], PIN_TYPE_NULL, 0);
            if(ret <0) {
                ret = FAILED;
            } else {
                ret = SUCCESS;
            }
            break;

        case CMD_READ_I2C:
        case CMD_WRITE_I2C:
        default:
            ret = FAILED;
            break;

    }

    return framework_event_rsp(cmd, data[0], ret);
}