ssize_t dvb_ringbuffer_pkt_write(struct dvb_ringbuffer *rbuf, u8* buf, size_t len) { int status; ssize_t oldpwrite = rbuf->pwrite; DVB_RINGBUFFER_WRITE_BYTE(rbuf, len >> 8); DVB_RINGBUFFER_WRITE_BYTE(rbuf, len & 0xff); DVB_RINGBUFFER_WRITE_BYTE(rbuf, PKT_READY); status = dvb_ringbuffer_write(rbuf, buf, len); if (status < 0) rbuf->pwrite = oldpwrite; return status; }
void ci_get_data(struct dvb_ringbuffer *cibuf, u8 *data, int len) { if (dvb_ringbuffer_free(cibuf) < len + 2) return; DVB_RINGBUFFER_WRITE_BYTE(cibuf, len >> 8); DVB_RINGBUFFER_WRITE_BYTE(cibuf, len & 0xff); dvb_ringbuffer_write(cibuf, data, len); wake_up_interruptible(&cibuf->queue); }
static ssize_t ci_ll_write(struct dvb_ringbuffer *cibuf, struct file *file, const char __user *buf, size_t count, loff_t *ppos) { int free; int non_blocking = file->f_flags & O_NONBLOCK; u8 *page = (u8 *)__get_free_page(GFP_USER); int res; if (!page) return -ENOMEM; res = -EINVAL; if (count > 2048) goto out; res = -EFAULT; if (copy_from_user(page, buf, count)) goto out; free = dvb_ringbuffer_free(cibuf); if (count + 2 > free) { res = -EWOULDBLOCK; if (non_blocking) goto out; res = -ERESTARTSYS; if (wait_event_interruptible(cibuf->queue, (dvb_ringbuffer_free(cibuf) >= count + 2))) goto out; } DVB_RINGBUFFER_WRITE_BYTE(cibuf, count >> 8); DVB_RINGBUFFER_WRITE_BYTE(cibuf, count & 0xff); res = dvb_ringbuffer_write(cibuf, page, count); out: free_page((unsigned long)page); return res; }
void scan_key(void) { int i, j; u32 key_data = 0; unsigned char key_buf[5]; memset(key_buf, 0, sizeof(key_buf)); command(0x42); /*command2 read key data to Display increment mode*/ stpio_set_pin(kfront->data, 1); for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { stpio_set_pin(kfront->clk, 1); delay(1); stpio_set_pin(kfront->clk, 0); delay(1); if (stpio_get_pin(kfront->data)) { key_buf[i] |= (1 << j); } } } #if 0 for (i = 0; i < 5; i++) { for (j = 0; j < 8; j++) { dprintk("%d ", (key_buf[i] >> j) & 0x01); } dprintk("\n"); } dprintk("\n"); #endif stpio_set_pin(kfront->clk, 1); /* parse key */ if (key_buf[0] & 0x01) /* exit */ key_data = FRONT_EXIT; else if (key_buf[0] & 0x08) /* ok */ key_data = FRONT_OK; else if (key_buf[1] & 0x01) /* vol+ */ key_data = FRONT_VolUp; else if (key_buf[1] & 0x08) /* vol- */ key_data = FRONT_VolDn; else if (key_buf[2] & 0x01) /* power */ key_data = FRONT_STBY; else if (key_buf[2] & 0x08) /* ch- */ key_data = FRONT_PgDn; else if (key_buf[3] & 0x01) /* menu */ key_data = FRONT_Menu; else if (key_buf[3] & 0x08) /* ch+ */ key_data = FRONT_PgUp; if (key_data) { int key; #ifdef REPEAT_KEY_SUPPORT #ifdef REPEAT_DEACCEL_SUPPORT if (prev_key_data != key_data) repeat_key_count = 0; repeat_key_count++; #endif if (is_repeat_key(key_data)) { #ifdef REPEAT_DEACCEL_SUPPORT if (repeat_key_count > 1 && repeat_key_count <= MSEC_TO_LOOP_CNT(500)) return; #endif } else { if (prev_key_data == key_data) return; } prev_key_data = key_data; prev_loop_count = cur_loop_count; #endif // event subsystem passing key = translate_fp_key(key_data, 5); if (key) { input_report_key(fp_button_dev, key, 1); input_sync(fp_button_dev); msleep(100); input_report_key(fp_button_dev, key, 0); input_sync(fp_button_dev); //FIXME: Add delay to not report one key press ducplicated } DVB_RINGBUFFER_WRITE_BYTE(&ci_rbuffer, key_data); wake_up_interruptible(&ci_rbuffer.queue); } else { #ifdef REPEAT_KEY_SUPPORT /* delete chattering */ if ((prev_loop_count + MSEC_TO_LOOP_CNT(200)) <= cur_loop_count) { prev_key_data = 0; #ifdef REPEAT_DEACCEL_SUPPORT repeat_key_count = 0; #endif } #endif } }