⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sp5xxfw2.h

📁 LINUX下的万能摄象头驱动
💻 H
📖 第 1 页 / 共 2 页
字号:
    }    return spca50x->colour;}static int sp5xxfw2_config(struct usb_spca50x *spca50x){    switch (spca50x->bridge) {    case BRIDGE_SPCA504B:    case BRIDGE_SPCA504:    case BRIDGE_SPCA536:	memset(spca50x->mode_cam, 0x00, TOTMODE * sizeof(struct mwebcam));	spca50x->mode_cam[VGA].width = 640;	spca50x->mode_cam[VGA].height = 480;	spca50x->mode_cam[VGA].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[VGA].pipe = 1023;	spca50x->mode_cam[VGA].method = 0;	spca50x->mode_cam[VGA].mode = 1;	spca50x->mode_cam[PAL].width = 384;	spca50x->mode_cam[PAL].height = 288;	spca50x->mode_cam[PAL].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[PAL].pipe = 1023;	spca50x->mode_cam[PAL].method = 1;	spca50x->mode_cam[PAL].mode = 1;	spca50x->mode_cam[SIF].width = 352;	spca50x->mode_cam[SIF].height = 288;	spca50x->mode_cam[SIF].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[SIF].pipe = 1023;	spca50x->mode_cam[SIF].method = 1;	spca50x->mode_cam[SIF].mode = 1;	spca50x->mode_cam[CIF].width = 320;	spca50x->mode_cam[CIF].height = 240;	spca50x->mode_cam[CIF].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[CIF].pipe = 896;	spca50x->mode_cam[CIF].method = 0;	spca50x->mode_cam[CIF].mode = 2;	spca50x->mode_cam[QPAL].width = 192;	spca50x->mode_cam[QPAL].height = 144;	spca50x->mode_cam[QPAL].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[QPAL].pipe = 896;	spca50x->mode_cam[QPAL].method = 1;	spca50x->mode_cam[QPAL].mode = 2;	spca50x->mode_cam[QSIF].width = 176;	spca50x->mode_cam[QSIF].height = 144;	spca50x->mode_cam[QSIF].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[QSIF].pipe = 896;	spca50x->mode_cam[QSIF].method = 1;	spca50x->mode_cam[QSIF].mode = 2;	break;    case BRIDGE_SPCA533:	memset(spca50x->mode_cam, 0x00, TOTMODE * sizeof(struct mwebcam));	spca50x->mode_cam[CUSTOM].width = 464;	spca50x->mode_cam[CUSTOM].height = 480;	spca50x->mode_cam[CUSTOM].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[CUSTOM].pipe = 1023;	spca50x->mode_cam[CUSTOM].method = 0;	spca50x->mode_cam[CUSTOM].mode = 1;	spca50x->mode_cam[PAL].width = 384;	spca50x->mode_cam[PAL].height = 288;	spca50x->mode_cam[PAL].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[PAL].pipe = 1023;	spca50x->mode_cam[PAL].method = 1;	spca50x->mode_cam[PAL].mode = 1;	spca50x->mode_cam[SIF].width = 352;	spca50x->mode_cam[SIF].height = 288;	spca50x->mode_cam[SIF].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[SIF].pipe = 1023;	spca50x->mode_cam[SIF].method = 1;	spca50x->mode_cam[SIF].mode = 1;	spca50x->mode_cam[CIF].width = 320;	spca50x->mode_cam[CIF].height = 240;	spca50x->mode_cam[CIF].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[CIF].pipe = 1023;	spca50x->mode_cam[CIF].method = 0;	spca50x->mode_cam[CIF].mode = 2;	spca50x->mode_cam[QPAL].width = 192;	spca50x->mode_cam[QPAL].height = 144;	spca50x->mode_cam[QPAL].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[QPAL].pipe = 1023;	spca50x->mode_cam[QPAL].method = 1;	spca50x->mode_cam[QPAL].mode = 2;	spca50x->mode_cam[QSIF].width = 176;	spca50x->mode_cam[QSIF].height = 144;	spca50x->mode_cam[QSIF].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[QSIF].pipe = 1023;	spca50x->mode_cam[QSIF].method = 1;	spca50x->mode_cam[QSIF].mode = 2;	break;    case BRIDGE_SPCA504C:	memset(spca50x->mode_cam, 0x00, TOTMODE * sizeof(struct mwebcam));	spca50x->mode_cam[VGA].width = 640;	spca50x->mode_cam[VGA].height = 480;	spca50x->mode_cam[VGA].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[VGA].pipe = 1023;	spca50x->mode_cam[VGA].method = 0;	spca50x->mode_cam[VGA].mode = 1;	spca50x->mode_cam[PAL].width = 384;	spca50x->mode_cam[PAL].height = 288;	spca50x->mode_cam[PAL].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[PAL].pipe = 1023;	spca50x->mode_cam[PAL].method = 1;	spca50x->mode_cam[PAL].mode = 1;	spca50x->mode_cam[SIF].width = 352;	spca50x->mode_cam[SIF].height = 288;	spca50x->mode_cam[SIF].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[SIF].pipe = 1023;	spca50x->mode_cam[SIF].method = 0;	spca50x->mode_cam[SIF].mode = 2;	spca50x->mode_cam[CIF].width = 320;	spca50x->mode_cam[CIF].height = 240;	spca50x->mode_cam[CIF].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[CIF].pipe = 896;	spca50x->mode_cam[CIF].method = 0;	spca50x->mode_cam[CIF].mode = 3;	spca50x->mode_cam[QPAL].width = 192;	spca50x->mode_cam[QPAL].height = 144;	spca50x->mode_cam[QPAL].t_palette =	    P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[QPAL].pipe = 896;	spca50x->mode_cam[QPAL].method = 1;	spca50x->mode_cam[QPAL].mode = 3;	spca50x->mode_cam[QSIF].width = 176;	spca50x->mode_cam[QSIF].height = 144;	spca50x->mode_cam[QSIF].t_palette =	    P_JPEG | P_RAW | P_YUV420 | P_RGB32 | P_RGB24 | P_RGB16;	spca50x->mode_cam[QSIF].pipe = 768;	spca50x->mode_cam[QSIF].method = 0;	spca50x->mode_cam[QSIF].mode = 4;	break;    }    spca50x->qindex = 5;    return 0;}/****************************************************************************************/static void spca504B_SetSizeType(struct usb_spca50x *spca50x){    __u8 Size;    __u8 Type;    int rc;    Size = spca50x->mode;    Type = 0;    switch (spca50x->bridge) {    case BRIDGE_SPCA533:{	    spca5xxRegWrite(spca50x->dev, 0x31, 0, 0, NULL, 0);	    spca504B_WaitCmdStatus(spca50x);	    rc = spca504B_PollingDataReady(spca50x->dev);	    spca50x_GetFirmware(spca50x);	    Type = 2;	    spca5xxRegWrite(spca50x->dev, 0x24, 0, 8, &Type, 1);	    spca5xxRegRead(spca50x->dev, 0x24, 0, 8, &Type, 1);	    spca5xxRegWrite(spca50x->dev, 0x25, 0, 4, &Size, 1);	    spca5xxRegRead(spca50x->dev, 0x25, 0, 4, &Size, 1);	    rc = spca504B_PollingDataReady(spca50x->dev);	    /* Init the cam width height with some values get on init ? */	    spca5xxRegWrite(spca50x->dev, 0x31, 0, 4, NULL, 0);	    spca504B_WaitCmdStatus(spca50x);	    rc = spca504B_PollingDataReady(spca50x->dev);	}	break;    case BRIDGE_SPCA504B:    case BRIDGE_SPCA536:	{	    Type = 6;	    spca5xxRegWrite(spca50x->dev, 0x25, 0, 4, &Size, 1);	    spca5xxRegRead(spca50x->dev, 0x25, 0, 4, &Size, 1);	    spca5xxRegWrite(spca50x->dev, 0x27, 0, 0, &Type, 1);	    spca5xxRegRead(spca50x->dev, 0x27, 0, 0, &Type, 1);	    rc = spca504B_PollingDataReady(spca50x->dev);	}	break;    case BRIDGE_SPCA504:	Size += 3;	if (spca50x->desc == AiptekMiniPenCam13) {	    /* spca504a aiptek */	    spca504A_acknowledged_command(spca50x, 0x8, Size, 0,					  (0x80 | (Size & 0x0F)), 1);	    spca504A_acknowledged_command(spca50x, 1, 3, 0, 0x9F, 0);	} else {	    spca504_acknowledged_command(spca50x, 0x8, Size, 0);	}	break;    case BRIDGE_SPCA504C:	spca50x_reg_write(spca50x->dev, 0xa0, (0x0500 | (Size & 0x0F)), 0x0);	// capture mode	spca50x_reg_write(spca50x->dev, 0x20, 0x1,			  (0x0500 | (Size & 0x0F)));	break;    }    return;}static voidspca504_acknowledged_command(struct usb_spca50x *spca50x,			     __u16 reg, __u16 idx, __u16 val){    __u8 notdone = 0;    spca50x_reg_write(spca50x->dev, reg, idx, val);    notdone = spca50x_reg_read(spca50x->dev, 0x01, 0x0001, 1);    spca50x_reg_write(spca50x->dev, reg, idx, val);    PDEBUG(5, "before wait 0x%x", notdone);    wait_ms(200);    notdone = spca50x_reg_read(spca50x->dev, 0x01, 0x0001, 1);    PDEBUG(5, "after wait 0x%x", notdone);    return;}static voidspca504A_acknowledged_command(struct usb_spca50x *spca50x,			      __u16 reg,			      __u16 idx, __u16 val, __u8 stat, __u8 count){    __u8 status;    __u8 endcode;    spca50x_reg_write(spca50x->dev, reg, idx, val);    status = spca50x_reg_read(spca50x->dev, 0x01, 0x0001, 1);    endcode = stat;    PDEBUG(5, "Status 0x%x Need 0x%x", status, stat);    if (count) {	while (1) {	    wait_ms(10);	    /* gsmart mini2 write a each wait setting 1 ms is enought */	    //spca50x_reg_write(spca50x->dev,reg,idx,val);	    status = spca50x_reg_read(spca50x->dev, 0x01, 0x0001, 1);	    if (status == endcode) {		PDEBUG(5, "status 0x%x after wait 0x%x", status, count);		break;	    }	    count++;	    if (count > 200)		break;	}    }    return;}static void spca504_wait_status(struct usb_spca50x *spca50x){    int ret = 256;    do {	/* With this we get the status, when return 0 it's all ok */	ret = spca50x_reg_read(spca50x->dev, 0x06, 0x00, 1);    } while (ret--);}static void spca50x_GetFirmware(struct usb_spca50x *spca50x){    __u8 FW[5] = { 0, 0, 0, 0, 0 };    __u8 ProductInfo[64];    spca5xxRegRead(spca50x->dev, 0x20, 0, 0, FW, 5);    PDEBUG(0, "FirmWare : %d %d %d %d %d ", FW[0], FW[1], FW[2], FW[3],	   FW[4]);    spca5xxRegRead(spca50x->dev, 0x23, 0, 0, ProductInfo, 64);    spca5xxRegRead(spca50x->dev, 0x23, 0, 1, ProductInfo, 64);    return;}static int spca504B_PollingDataReady(struct usb_device *dev){    __u8 DataReady = 0;    int count = 0;    while (1) {	spca5xxRegRead(dev, 0x21, 0, 0, &DataReady, 1);	if ((DataReady & 0x01) == 0)	    break;	wait_ms(10);	count++;	if (count > 10)	    break;    }    return DataReady;}static void spca504B_WaitCmdStatus(struct usb_spca50x *spca50x){    __u8 DataReady = 0;    int ReqDone;    int count = 0;    while (1) {	spca5xxRegRead(spca50x->dev, 0x21, 0, 1, &DataReady, 1);	if (DataReady) {	    DataReady = 0;	    spca5xxRegWrite(spca50x->dev, 0x21, 0, 1, &DataReady, 1);	    spca5xxRegRead(spca50x->dev, 0x21, 0, 1, &DataReady, 1);	    ReqDone = spca504B_PollingDataReady(spca50x->dev);	    break;	}	wait_ms(10);	count++;	if (count > 50)	    break;    }    return;}static void spca504B_setQtable(struct usb_spca50x *spca50x){    __u8 Data = 3;    int rc;    spca5xxRegWrite(spca50x->dev, 0x26, 0, 0, &Data, 1);    spca5xxRegRead(spca50x->dev, 0x26, 0, 0, &Data, 1);    rc = spca504B_PollingDataReady(spca50x->dev);    return;}static void sp5xx_initContBrigHueRegisters(struct usb_spca50x *spca50x){    int rc;    int pollreg = 1;    switch (spca50x->bridge) {    case BRIDGE_SPCA504:    case BRIDGE_SPCA504C:	pollreg = 0;    case BRIDGE_SPCA533:    case BRIDGE_SPCA504B:	spca5xxRegWrite(spca50x->dev, 0, 0, 0x21a7, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0x20, 0x21a8, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0, 0x21ad, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 1, 0x21ac, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0x20, 0x21ae, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0, 0x21a3, NULL, 0);	break;    case BRIDGE_SPCA536:	spca5xxRegWrite(spca50x->dev, 0, 0, 0x20f0, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0x21, 0x20f1, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0x40, 0x20f5, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 1, 0x20f4, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0x40, 0x20f6, NULL, 0);	spca5xxRegWrite(spca50x->dev, 0, 0, 0x2089, NULL, 0);	break;    }    if (pollreg)	rc = spca504B_PollingDataReady(spca50x->dev);    return;}#endif				//SP5XXFW2

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -