📄 video-driver.c
字号:
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 + -