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; }
/* 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; }
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; }