示例#1
3
文件: w99685.c 项目: LucidOne/Rovio
int w99685_v4l1_ioctl(w685cf_t *priv, unsigned int cmd, void * buf)
{
	
	int err = 0;
	CmdParameters_t *paramsp = NULL;
	CmdReturns_t *retsp = NULL;
	Firmware_t ifirmware;
	UINT8 *datap;
	int i;
#ifdef 	W865THREAD
	int whichselect;
	ImageContainer_t *containerp = priv->images;
#endif

	if (down_interruptible2(&priv->lock)) {
		printk("Device has been locked\n");
		err = -EINTR;
		goto out;
	} 
	
	
	
	//printk("Cmd: %x, getclass: %x, IOCTLSETFW_CAMERA = %x\n", cmd, IOCTLGETCLASS,IOCTLSETFW_CAMERA);
	if(cmd == IOCTLGETCLASS)
	{
		if(!buf) {
			printk("Illegal buffer address\n");
			err = -EINVAL;
			goto outup;
		}	
		
		if(copy_to_user(buf, DEVICECLALSS, (strlen(DEVICECLALSS)+1)))
		{
			printk("Cannot put data to user\n");
			err = -EFAULT;
		}
		err = (strlen(DEVICECLALSS)+1);
		printk("Get Class name: %s\n", DEVICECLALSS);
		goto outup;
	}
	else if(cmd == IOCTLGETSTATUS)
	{
		if(!buf) {
			printk("Illegal buffer address\n");
			err = -EINVAL;
			goto outup;
		}	
		
		if(copy_to_user(buf, (char *)&(FREG7), sizeof(FREG7)))
		{
			printk("Cannot put data to user\n");
			err = -EFAULT;
		}
		goto outup;
	}
	else if(cmd == IOCTLSETFW_CAMERA)
	{
		diag_printf("IOCTLSETFW_CAMERA = %x\n",IOCTLSETFW_CAMERA);
		if(copy_from_user(&ifirmware, (void *)buf, sizeof(Firmware_t))) {
			printk("Cannot copy data from user\n");
			err = -EFAULT;
 			goto outup;
		}
		printk("Firmware size: %d, %x\n", ifirmware.Length, ifirmware.Data);
		
		datap = (UINT8 *)malloc(ifirmware.Length*sizeof(UINT8));
		diag_printf("datap %p\n",datap);
		if(!datap)
		{
			printk("No enough memory\n");
			err = -ENOMEM;
 			goto outup;
		}
		if(copy_from_user(datap, (void *)ifirmware.Data, ifirmware.Length*sizeof(UINT8))) {
			printk("Cannot copy data from user\n");
			free(datap);
			err = -EFAULT;
 			goto outup;
		}
		InitCFI(0);
		DownLoadFirmware2Camera(datap, ifirmware.Length);
		free(datap);
		for(i=0;i<100;i++)
			wait_ms(20);
		
		printk("DownLoad Firmware ok\n");
		InitCFI(0);
		wait_ms(40);
		//CardDection();
		//W99685CMD_Suspand();
		//wait_ms(40);	
#if 1//ndef __OUTPUT2TV__
		W99685CMD_SetOpMode(OP_SINGLE, PPC_YUV422, 0);

		W99685CMD_SetLCMNums(LCD1_ON_685,LCD_BUS_16);
		//KDEBUG("Have set LCMNUMS");
		W99685CMD_SelectLCM(LCM_1ST);
		//KDEBUG("Have selected LCM\n");
		W99685CMD_SetLCMRes(128, 161);
		//KDEBUG("Have set LCM resolution\n");

		LCM_FillChar(lcm_buf, LEN_LCMBF);
		//wait_ms(100000);
		//memset(lcm_buf, 0xff, LEN_LCMBF);
		//LCM_FillChar(lcm_buf, LEN_LCMBF);
		//KDEBUG("Have Filled LCM with char\n");

		W99685CMD_SetLCMWndPos(0, 32);

		W99685CMD_SetLCMWndSize(128, 96);
#endif
		goto outup;
	}
	else if(cmd == IOCTLSETFW_USBBRIDGE)
	{
		DownLoadFirmware2Camera(W685BRIDGEFW, sizeof(W685BRIDGEFW));
		printk("Have DownLoad Bridge Firmware to W99685\n");
		goto outup;
	}
	else if(cmd == IOCTLDRAWINBYPASS) 
	{
#if 1
		if(copy_from_user(&ifirmware, (void *)buf, sizeof(Firmware_t))) {
			diag_printf("Cannot copy data from user\n");
			err = -EFAULT;
 			goto outup;
		}
		printk("Image size: %d\n", ifirmware.Length);
		
		datap = (UINT8 *)malloc(ifirmware.Length*sizeof(UINT8));
		if(!datap)
		{
			printk("No enough memory\n");
			err = -ENOMEM;
 			goto outup;
		}
		if(copy_from_user(datap, (void *)ifirmware.Data, ifirmware.Length*sizeof(UINT8))) {
			printk("Cannot copy data from user\n");
			free(datap);
			err = -EFAULT;
 			goto outup;
		}
		InitCFI(1);
		wait_ms(20);
		DrawInByPassMode(datap, ifirmware.Length);
		InitCFI(0);
		wait_ms(20);
		free(datap);
#else
		InitCFI(1);
		wait_ms(20);
		ByPass_Test();
		InitCFI(0);
		wait_ms(20);
#endif	
		goto outup;
	}
	
	
	
	
	if (copy_from_user(&priv->m_req, (void *)buf, sizeof(CmdReq_t))) {
		diag_printf("Cannot copy data from user\n");
		err = -EFAULT;
 		goto outup;
 	}

	
	
	if(priv->m_req.cmd_params)
	{
		if (copy_from_user(&priv->m_cmdparams, (void *)priv->m_req.cmd_params, sizeof(CmdParameters_t))) {
			diag_printf("Cannot copy data from user\n");
			err = -EFAULT;
 			goto outup;
 		}
 		paramsp = &priv->m_cmdparams;
	}
	
// allow no parameters
//	else {
//		printk("Command has not parameters\n");
//		err = -EINVAL;
//		goto outup;
//	}
	
	//printk("priv->m_req.cmd_rets: %x, %d\n", priv->m_req.cmd_rets, __LINE__);	
	if(priv->m_req.cmd_rets)
	{
		retsp = &priv->m_cmdrets;
		memset(retsp, 0, sizeof(CmdReturns_t));
	}
//	printk("priv->m_req.cmd_rets: %x, %d\n", priv->m_req.cmd_rets, __LINE__);
//	CommandDump(&priv->m_req, &priv->m_cmdparams);
	
#ifdef 	W865THREAD
	if(priv->m_req.subcmd == CMD_GETJPGBITS)
	{
		err = GetImageLenFromContainer(containerp);	
		TDEBUG("Get Image len: %d, which: %d", err, containerp->reading);
		if(err >= 0) {
			RETVAL4(retsp) = ABYTE(err);
			RETVAL3(retsp) = BBYTE(err);
			RETVAL2(retsp) = CBYTE(err);
			RETVAL1(retsp) = DBYTE(err);
		}
		
		if(priv->m_req.cmd_rets)
		{
			if(copy_to_user(priv->m_req.cmd_rets, retsp, sizeof(CmdReturns_t)))
			{
				err = -EFAULT;
				goto outup;
			}
		}
		up(&priv->lock);
		
		return err;
	}
#endif
	
//	printk("subcmd: 0x%x, priv->m_req.cmd_rets: %x, %d\n", priv->m_req.subcmd, priv->m_req.cmd_rets, __LINE__);
	err = SendCommand2W685(cmd, priv->m_req.subcmd, paramsp, retsp, priv->m_req.flag, NULL);
	
	if(err < 0)
	{
		printf("W99685: send command erro\n");
		goto outup;
	}

	if(priv->m_req.cmd_rets)
	{
//		printk("Copy to user retvals: %x, val: %x, %x, %x, %x\n", priv->m_req.cmd_rets,\
//				RETVAL4(retsp), RETVAL3(retsp), RETVAL2(retsp), RETVAL1(retsp));
		if(copy_to_user(priv->m_req.cmd_rets, retsp, sizeof(CmdReturns_t)))
		{
			diag_printf("Cannot copy data to user\n");
			err = -EFAULT;
			goto outup;
		}
	}
outup:
	
	
	up(&priv->lock);
	
	
//	printk("return value: %d\n", err);
out:
	return err;
}
示例#2
0
/**
 * Checks if given stroke colour is already set in PDF gstate and if not,
 * update the gstate accordingly.
 * \param page	PDF page where the update needs to happen.
 * \param col	Wanted stroke colour.
 */
void pdfw_gs_strokecolour(HPDF_Page page, colour col)
{
	if (col == pdfw_gs[pdfw_gs_level].strokeColour)
		return;
	pdfw_gs[pdfw_gs_level].strokeColour = col;
	if (RBYTE(col) == GBYTE(col) && GBYTE(col) == BBYTE(col))
		HPDF_Page_SetGrayStroke(pdf_page, R(col));
	else
		HPDF_Page_SetRGBStroke(pdf_page, R(col), G(col), B(col));
}
示例#3
0
/**
 * Checks if given fill colour is already set in PDF gstate and if not,
 * update the gstate accordingly.
 * \param page	PDF page where the update needs to happen.
 * \param col	Wanted fill colour.
 */
void pdfw_gs_fillcolour(HPDF_Page page, colour col)
{
	if (col == pdfw_gs[pdfw_gs_level].fillColour)
		return;
	pdfw_gs[pdfw_gs_level].fillColour = col;
	if (RBYTE(col) == GBYTE(col) && GBYTE(col) == BBYTE(col))
		HPDF_Page_SetGrayFill(pdf_page, R(col));
	else
		HPDF_Page_SetRGBFill(pdf_page, R(col), G(col), B(col));
}