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; }
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; }
/** * 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]); }
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; }
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; }
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); }