static void handler_status(struct wiimote_data *wdata, const __u8 *payload) { handler_keys(wdata, payload); /* on status reports the drm is reset so we need to resend the drm */ wiiproto_req_drm(wdata, WIIPROTO_REQ_NULL); }
static void ext_enable(struct wiimote_ext *ext, bool motionp, __u8 ext_type) { unsigned long flags; __u8 wmem; int ret; if (motionp) { if (wiimote_cmd_acquire(ext->wdata)) return; if (ext_type == WIIEXT_CLASSIC) wmem = 0x07; else if (ext_type == WIIEXT_NUNCHUCK) wmem = 0x05; else wmem = 0x04; ret = wiimote_cmd_write(ext->wdata, 0xa600fe, &wmem, sizeof(wmem)); wiimote_cmd_release(ext->wdata); if (ret) return; } spin_lock_irqsave(&ext->wdata->state.lock, flags); ext->motionp = motionp; ext->ext_type = ext_type; wiiproto_req_drm(ext->wdata, WIIPROTO_REQ_NULL); spin_unlock_irqrestore(&ext->wdata->state.lock, flags); }
/* diable all extensions */ static void ext_disable(struct wiimote_ext *ext) { unsigned long flags; __u8 wmem = 0x55; if (!wiimote_cmd_acquire(ext->wdata)) { wiimote_cmd_write(ext->wdata, 0xa400f0, &wmem, sizeof(wmem)); wiimote_cmd_release(ext->wdata); } spin_lock_irqsave(&ext->wdata->state.lock, flags); ext->motionp = false; ext->ext_type = WIIEXT_NONE; wiiproto_req_drm(ext->wdata, WIIPROTO_REQ_NULL); spin_unlock_irqrestore(&ext->wdata->state.lock, flags); }
static ssize_t wiidebug_drm_write(struct file *f, const char __user *u, size_t s, loff_t *off) { struct seq_file *sf = f->private_data; struct wiimote_debug *dbg = sf->private; unsigned long flags; char buf[16]; ssize_t len; int i; if (s == 0) return -EINVAL; len = min((size_t) 15, s); if (copy_from_user(buf, u, len)) return -EFAULT; buf[len] = 0; for (i = 0; i < WIIPROTO_REQ_MAX; ++i) { if (!wiidebug_drmmap[i]) continue; if (!strcasecmp(buf, wiidebug_drmmap[i])) break; } if (i == WIIPROTO_REQ_MAX) i = simple_strtoul(buf, NULL, 16); spin_lock_irqsave(&dbg->wdata->state.lock, flags); dbg->wdata->state.flags &= ~WIIPROTO_FLAG_DRM_LOCKED; wiiproto_req_drm(dbg->wdata, (__u8) i); if (i != WIIPROTO_REQ_NULL) dbg->wdata->state.flags |= WIIPROTO_FLAG_DRM_LOCKED; spin_unlock_irqrestore(&dbg->wdata->state.lock, flags); return len; }