static void adapter_property_change(GDBusProxy *proxy, const char *name, DBusMessageIter *iter, void *user_data) { struct connman_device *device; const char *path; bool adapter_powered, device_powered; if (strcmp(name, "Powered") != 0) return; path = g_dbus_proxy_get_path(proxy); device = g_hash_table_lookup(devices, path); adapter_powered = proxy_get_bool(proxy, "Powered"); device_powered = connman_device_get_powered(device); DBG("device %p %s device powered %d adapter powered %d", device, path, device_powered, adapter_powered); if (device_powered != adapter_powered) { if (adapter_powered) enable_device(device, path); else disable_device(device, path); } }
// device should be disabled static void detect_device(uint port, uchar enable, uchar test, uchar mask) { ps2_device * ps2d; uchar check = 0; ushort type = 0; if (get_config() & mask) { outb(PS2_CMND, enable); if (!(get_config() & mask)) { outb(PS2_CMND, test); do_assert(wait_read()); if (!inb(PS2_DATA)) { ps2_command(port, 0xFF, &check, 1); if (check == 0xAA) { ps2_command(port, 0xF5, NULL, 0); ps2_command(port, 0xF2, (uchar *)(&type), 2); if (type == PS2_NO_DEVICE) { type = PS2_KB_NORMAL; } if (type == PS2_KB_NORMAL || type == PS2_KB_MF2) { ps2_devs[port] = create_stream( sizeof(unsigned), ps2_kb_enable, ps2_kb_disable, ps2_kb_read, NULL ); ps2d = kalloc(sizeof(ps2_device)); ps2d->type = type; ps2d->port = port; ps2_devs[port]->data = ps2d; reg_dev(DEVICE_INPUT, ps2_devs[port]->hndl); enable_device(ps2_devs[port]); } else { ps2_devs[port] = NULL; //TODO: implement } kprintf("PS/2 Device %x detected.\n", type); } } else { outb(PS2_CMND, enable - 1); } } } }
/*capture() * * 完成视频采集的函数,采集到的数据以祯的形式,存放到video_cap指定的 * 数据结构中相应的域buffer(缓冲区),以供调用者进一步处理祯数据。 * * video_cap 这个结构既有格式信息,又会报存采集到的每一祯的视频信息 */ int capture(struct vd_capture *vd_cap) { int rval=0, capturedsize=0; if (!vd_cap->streaming) if (enable_device(vd_cap)) goto errcap; memset(&vd_cap->buf, 0, sizeof(struct v4l2_buffer)); vd_cap->buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; vd_cap->buf.memory = V4L2_MEMORY_MMAP; rval = ioctl(vd_cap->fd, VIDIOC_DQBUF, &vd_cap->buf); if (rval < 0) { printf("error when dequeue the buffer: %d \n", errno); goto errcap; } //开始采集视频数据 capturedsize=vd_cap->buf.bytesused; if (capturedsize > vd_cap->framesize) capturedsize=vd_cap->framesize; switch (vd_cap->format) { case V4L2_PIX_FMT_MJPEG: if (vd_cap->buf.bytesused<0xaf) return 0; //memcpy(vd_cap->framebuffer, vd_cap->mem[vd_cap->buf.index], (size_t) vd_cap->buf.bytesused); /*if(jpeg_decode(&vd_cap->decbuffer, vd_cap->tmpbuffer, &vd_cap->width, &vd_cap->height)<0) { printf("Error when decode the jpeg pic\n"); goto errcap; } yuv422to420p(vd_cap->decbuffer, vd_cap->framebuffer, vd_cap->width, vd_cap->height);*/ //break; case V4L2_PIX_FMT_YUYV: if (vd_cap->buf.bytesused > vd_cap->framesize) memcpy(vd_cap->framebuffer, vd_cap->mem[vd_cap->buf.index], (size_t) vd_cap->framesize); else memcpy(vd_cap->framebuffer, vd_cap->mem[vd_cap->buf.index], (size_t)vd_cap->buf.bytesused); break; default: goto errcap; break; }; rval = ioctl(vd_cap->fd, VIDIOC_QBUF, &vd_cap->buf); if (rval < 0) { printf("error when requeue the buffer: %d \n", errno); goto errcap; } return capturedsize; errcap: vd_cap->quit=0; return -1; }
static void device_enable_cb(const DBusError *error, void *user_data) { char *path = user_data; struct connman_device *device; device = g_hash_table_lookup(devices, path); if (!device) { DBG("device already removed"); goto out; } if (dbus_error_is_set(error)) { connman_warn("Bluetooth device %s not enabled %s", path, error->message); goto out; } enable_device(device, path); out: g_free(path); }
void HardwareCAN::begin(CANFrequency frequency, uint32 options, uint32 mode) { options |= CAN_TX_FIFO; mode |= CAN_MODE_LOOPBACK | CAN_MODE_SILENT; uint32 ier_options = 0; enable_device(this->can_d, frequency, options, ier_options, mode); }