Пример #1
0
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;
}
Пример #2
0
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);
}
Пример #3
0
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;
}
Пример #4
0
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
	}
}