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

📄 video-driver.c

📁 it s a source code for how to integrate your tvp5150 decoder with driver and how to capture an image
💻 C
📖 第 1 页 / 共 2 页
字号:
    printk("\tCICOTAREA 0x%08X  \n", rCICOTAREA);    printk("\tCICOSTATUS 0x%8X \n", rCICOSTATUS);    printk("\tCIIMGCPT 0x%08X  \n", rCIIMGCPT);		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin}#endifstatic int camif_release(struct inode *inode, struct file *file){    camif_cfg_t * cfg = get_camif(MINOR(inode->i_rdev));	DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    	if (cfg->dma_type & CAMIF_PREVIEW) {        if(down_interruptible(&cfg->gc->lock))            return -ERESTARTSYS;        cfg->gc->status &= ~PWANT2START;        cfg->gc->status |= PNOTWORKING;        up(&cfg->gc->lock);    }     else {        cfg->gc->status &= ~CWANT2START; /* No need semaphore */    }    camif_dynamic_close(cfg);    camif_release_irq(cfg);    video_exclusive_release(inode,file);    camif_p_stop(cfg);    //cfg->gc->sensor->driver->command(cfg->gc->sensor, USER_EXIT, NULL);    cfg->gc->user--;    cfg->status = CAMIF_STOPPED;    // additional setting for video setting    // It setting GPIO, GPG7 to Low    //rGPGDAT &= ~(1 << 7);    //printk("camera_if release GPG7 Setting --\n");    //printk("GPGDAT is 0x%08x\n", rGPGDAT);    // turn off camera on wallpad    //printk("turn off camera of wallpad power\n");    //rGPEDAT &= ~( 1 << 11 );		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin    return 0;}static void fimc_config(camif_cfg_t *cfg,u32 x, u32 y, int bpp){    cfg->target_x = x;    cfg->target_y = y;		DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    switch (bpp) {    case 16:        cfg->fmt = CAMIF_RGB16;        break;    case 24:        cfg->fmt = CAMIF_RGB24;        break;    case 420:        cfg->fmt = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR420;         break;    case 422:        cfg->fmt = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR422;         break;    default:         panic("Wrong BPP \n");    }		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin}static int camif_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){    int ret = 0;    camif_cfg_t *cfg  = file->private_data;    camif_param_t par;		DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    switch (cmd) {        case CMD_CAMERA_INIT:            if (copy_from_user(&par,(camif_param_t *)arg,                        sizeof(camif_param_t)))                return -EFAULT;            fimc_config(cfg,par.dst_x, par.dst_y, par.bpp);                // cfg狼 target_x, target_y甫 涝仿罐篮 蔼栏肺 荐沥茄促.            if (camif_dynamic_open(cfg)) {                printk(" Eror Happens \n");                ret = -1;            }		#if 0			rSRCPND	|= (1<<6);			rINTMOD = 0x0;			rINTMSK = 0x27f3b6bd;			rPRIORITY = 0x12033d;			rINTPND = 0x0;			rINTOFFSET = 0x0;			rSUBSRCPND = 0x92;			rINTSUBMSK = 0x6df2;			printk("\t\trSRCPND %x\n",rSRCPND); // lovejin			printk("\t\trintMOD %x\n",rINTMOD); // lovejin			printk("\t\trINTMSK %x\n",rINTMSK); // lovejin			printk("\t\trPRIORITY %x\n",rPRIORITY); // lovejin			printk("\t\trINTPND %x\n",rINTPND); // lovejin			printk("\t\trINTOFFSET %x\n",rINTOFFSET); // lovejin			printk("\t\trSUBSRCPND %x\n",rSUBSRCPND); // lovejin			printk("\t\trINTSUBMSK %x\n",rINTSUBMSK); // lovejin		#endif            switch (par.flip) {            case 3 :                 cfg->flip = CAMIF_FLIP_MIRROR;                break;            case 1 :                 cfg->flip = CAMIF_FLIP_X;                break;            case 2 :                 cfg->flip = CAMIF_FLIP_Y;                break;            case 0 :             default:                cfg->flip = CAMIF_FLIP;            }            break;        case CMD_DECODER_VIDEO_A:            cfg->gc->decoder->driver->command(cfg->gc->decoder,                                             DECODER_VIDEO_A, NULL);            break;        case CMD_DECODER_VIDEO_B:            cfg->gc->decoder->driver->command(cfg->gc->decoder,                                             DECODER_VIDEO_B, NULL);            break;    /* Todo        case CMD_SENSOR_BRIGHTNESS:            cfg->gc->sensor->driver->command(cfg->gc->sensor, SENSOR_BRIGHTNESS, NULL);            break;    */        default:            ret = -EINVAL;            break;    }		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin    return ret;}#if 0static int camif_ioctl(struct inode *inode, struct file *file,              unsigned int cmd, unsigned long arg){//  camif_cfg_t *cfg  = file->private_data;    switch (cmd) {/*  case Some_other_action */    default:        return video_usercopy(inode, file, cmd, arg, camif_do_ioctl);    }}#endifstatic struct file_operations camif_c_fops ={    .owner    = THIS_MODULE,    .open     = camif_open,    .release  = camif_release,    .ioctl    = camif_ioctl,    .read     = camif_c_read,    .write    = camif_write,};static struct file_operations camif_p_fops ={    .owner    = THIS_MODULE,    .open     = camif_open,    .release  = camif_release,    .ioctl    = camif_ioctl,    .read     = camif_p_read,    .write    = camif_write,};static struct video_device codec_template ={    .name     = "CODEC_IF",    .type     = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES,    .hardware = VID_HARDWARE_SAMSUNG_FIMC20,    .fops     = &camif_c_fops,//  .release  = camif_release    .minor    = -1,};static struct video_device preview_template ={    .name     = "PREVIEW_IF",    .type     = VID_TYPE_CAPTURE|VID_TYPE_CLIPPING|VID_TYPE_SCALES,    .hardware = VID_HARDWARE_SAMSUNG_FIMC20,    .fops     = &camif_p_fops,    .minor    = -1,};static int preview_init(camif_cfg_t *cfg){    char name[32]="HELIOS CAM_PREVIEW";		DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    memset(cfg, 0, sizeof(camif_cfg_t));    cfg->target_x = 640;    cfg->target_y = 480;    //cfg->target_x = 648;    //cfg->target_y = 486;    cfg->pp_num   = 4;    cfg->dma_type = CAMIF_PREVIEW;    cfg->fmt      = CAMIF_RGB16;    //cfg->flip     = CAMIF_FLIP_Y;    cfg->flip     = CAMIF_FLIP;    cfg->v        = &preview_template;    init_MUTEX(&cfg->v->lock);//  cfg->irq       = IRQ_CAM_P; /* Helios 2.4 侩 */  	cfg->irq       = IRQ_S3C2440_CAM_P; /* Helios 2.6 侩 by lovejin*/        strcpy(cfg->shortname,name);    init_waitqueue_head(&cfg->waitq);    cfg->status = CAMIF_STOPPED;	printk("\tpreview_init() IRQ %d\n",cfg->irq); // lovejin		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin    return cfg->status;}static int codec_init(camif_cfg_t *cfg){    char name[32]="HELIOS CAM_CODEC";		DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    memset(cfg, 0, sizeof(camif_cfg_t));    cfg->target_x = 176;    cfg->target_y = 144;    cfg->pp_num   = 4;     cfg->dma_type = CAMIF_CODEC;    cfg->fmt      = CAMIF_IN_YCBCR422|CAMIF_OUT_YCBCR420;    cfg->flip     = CAMIF_FLIP_X;    cfg->v        = &codec_template;    init_MUTEX(&cfg->v->lock);//  cfg->irq       = IRQ_CAM_C; /* Helios 2.4 侩 */    cfg->irq       = IRQ_S3C2440_CAM_C; /* Helios 2.6 侩 by lovejin */    strcpy(cfg->shortname,name);    init_waitqueue_head(&cfg->waitq);    cfg->status = CAMIF_STOPPED;		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin   	return cfg->status;}static void camif_init(void){	DEBUG0("[ %s() S\n",__FUNCTION__); // lovejin    	camif_setup_sensor();	DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin}static void print_version(void){	DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin   	printk(KERN_INFO"FIMC built:"__DATE__ " "__TIME__"\n%s\n%s\n%s\n",             fimc_version, driver_version,fsm_version);		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin}static int camif_m_in(void){    int ret = 0;    camif_cfg_t * cfg;	DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    camif_init();       	    cfg = get_camif(CODEC_MINOR);    codec_init(cfg);    if (video_register_device(cfg->v,0,CODEC_MINOR)!=0) {            DPRINTK("Couldn't register codec driver.\n");        return 0;    }    cfg = get_camif(PREVIEW_MINOR);    preview_init(cfg);    if (video_register_device(cfg->v,0,PREVIEW_MINOR)!=0) {            DPRINTK("Couldn't register preview driver.\n");        return 0;    }        print_version();    //printk("end of video-driver.c\n");    register_default_decoder();	    // additional setting for video setting    // It setting GPIO, GPG7 to Low -> Initial Value    //rGPGCON &= ~(11 << 14);    //rGPGCON |= (1 << 14);    //rGPGDAT &= ~(1 << 7);    //printk("camera if open GPG7 Setting --\n");    //printk("GPGCON is 0x%08x\n", rGPGCON);    //printk("GPGDAT is 0x%08x\n", rGPGDAT);		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin   	return ret;}static void unconfig_device(camif_cfg_t *cfg){	DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin   	video_unregister_device(cfg->v);    camif_hw_close(cfg);    //memset(cfg, 0, sizeof(camif_cfg_t));		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin}static void camif_m_out(void)   /* module out */{    camif_cfg_t *cfg;		DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    cfg = get_camif(CODEC_MINOR);    unconfig_device(cfg);    cfg = get_camif(PREVIEW_MINOR);    unconfig_device(cfg);		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin    return;}void camif_register_decoder(struct i2c_client *ptr){    camif_cfg_t *cfg;    printk("---------------camif_register_decoder called!!!\n");/* 捞 何盒捞 弥措狼 抄利捞 瞪 巴 鞍促. 2.6 俊辑绰 ptr->data 何盒捞 绝绰单  * 捞 单捞磐甫 捞侩秦辑 叼官捞胶甫 殿废窍促聪....  */	DEBUG0("[ %s() S ]\n",__FUNCTION__);    	cfg =get_camif(CODEC_MINOR);    cfg->gc = (camif_gc_t *)(ptr->data);    cfg =get_camif(PREVIEW_MINOR);    cfg->gc = (camif_gc_t *)(ptr->data);    sema_init(&cfg->gc->lock,1); /* global lock for both Codec and Preview */    cfg->gc->status |= PNOTWORKING; /* Default Value */    camif_hw_open(cfg->gc);		DEBUG0("[ %s() E ]\n",__FUNCTION__); }void register_default_decoder(){    camif_cfg_t *cfg;	DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin    cfg =get_camif(CODEC_MINOR);    cfg->gc = &default_data;     cfg =get_camif(PREVIEW_MINOR);    cfg->gc = &default_data;    sema_init(&cfg->gc->lock,1); /* global lock for both Codec and Preview */    cfg->gc->status |= PNOTWORKING; /* Default Value */    camif_hw_open(cfg->gc);		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin}void camif_unregister_decoder(struct i2c_client *ptr){		DEBUG0("[ %s() S ]\n",__FUNCTION__); // lovejin   	camif_gc_t *gc;            gc = (camif_gc_t *)(ptr->data);     gc->init_sensor = 0; /* need to modify */		DEBUG0("[ %s() E ]\n",__FUNCTION__); // lovejin}module_init(camif_m_in);module_exit(camif_m_out);EXPORT_SYMBOL(default_data);EXPORT_SYMBOL(camif_register_decoder);EXPORT_SYMBOL(camif_unregister_decoder);MODULE_AUTHOR("SW.LEE <hitchcar@sec.samsung.com>");MODULE_DESCRIPTION("Video-Driver For Fimc2.0 MISC Drivers");MODULE_LICENSE("GPL");/* * Local variables: * c-basic-offset: 8 * End: */

⌨️ 快捷键说明

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