Example #1
3
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;
}
int cmpb(int addr, int addrs) {
	int n, z, v, c;
	int diff;

	diff = *get_byte_from_memory(addrs) - *get_byte_from_memory(addr);

	VBYTE(v, diff);
	CBYTE(c, diff);
	NBYTE(n, diff);
	Z(z, diff);

	set_flags(n, z, v, c); 

	return 0;
}
Example #3
0
/* this dispatchers forwards RPC calls to the destination functions */
INT rpc_dispatch(INT index, void *prpc_param[])
{
   INT status;

   switch (index) {
   case RPC_MYTEST:
      status = rpc_mytest(CBYTE(0), CWORD(1), CINT(2), CFLOAT(3), CDOUBLE(4),
                          CPBYTE(5), CPWORD(6), CPINT(7), CPFLOAT(8), CPDOUBLE(9));
      break;

   default:
      cm_msg(MERROR, "rpc_dispatch", "received unrecognized command");
   }

   return status;
}
Example #4
0
int server_execute(int index, void *prpc_param[])
{
   int status;

   switch (index) {
   default:
      abort();
      break;

   case RPC_MSCB_INIT:
      status = mscb_init(CSTRING(0), CINT(1), CINT(2));
      break;

   case RPC_MSCB_EXIT:
      status = mscb_exit(CINT(0));
      break;

   case RPC_MSCB_REBOOT:
      status = mscb_reboot(CINT(0), CINT(1));
      break;

   case RPC_MSCB_RESET:
      status = mscb_reset(CINT(0));
      break;

   case RPC_MSCB_PING:
      status = mscb_ping(CINT(0), CINT(1));
      break;

   case RPC_MSCB_INFO:
      status = mscb_info(CINT(0), CINT(1), CARRAY(2));
      break;

   case RPC_MSCB_INFO_VARIABLE:
      status = mscb_info_variable(CINT(0), CINT(1), CINT(2), CARRAY(3));
      break;

   case RPC_MSCB_SET_ADDR:
      status = mscb_set_addr(CINT(0), CINT(1), CINT(2), CINT(3));
      break;

   case RPC_MSCB_SET_NAME:
      status = mscb_set_name(CINT(0), CINT(1), CSTRING(2));
      break;

   case RPC_MSCB_WRITE_GROUP:
      status = mscb_write_group(CINT(0), CINT(1), CBYTE(2), CARRAY(3), CINT(4));
      break;

   case RPC_MSCB_WRITE:
      status = mscb_write(CINT(0), CINT(1), CBYTE(2), CARRAY(3), CINT(4));
      break;

   case RPC_MSCB_FLASH:
      status = mscb_flash(CINT(0), CINT(1));
      break;

   case RPC_MSCB_UPLOAD:
      status = mscb_upload(CINT(0), CINT(1), CARRAY(2), CINT(3), CINT(4));
      break;

   case RPC_MSCB_READ:
      status = mscb_read(CINT(0), CINT(1), CBYTE(2), CARRAY(3), CPINT(4));
      break;

   case RPC_MSCB_READ_RANGE:
      status = mscb_read_range(CINT(0), CINT(1), CBYTE(2), CBYTE(3), CARRAY(4), CPINT(5));
      break;

   case RPC_MSCB_ECHO:
      status = mscb_echo(CINT(0), CINT(1), CBYTE(2), CPBYTE(3));
      break;

   case RPC_MSCB_USER:
      status = mscb_user(CINT(0), CINT(1), CARRAY(2), CINT(3), CARRAY(4), CPINT(5));
      break;

   case RPC_MSCB_ADDR:
      status = mscb_addr(CINT(0), CINT(1), CINT(2), CINT(3), CINT(4));
      break;
   }

   return status;
}