📄 zoran_card.c
字号:
.gpio = { 2, 1, -1, 3, 7, 0, 4, 5 }, .gpio_pol = { 0, 0, 0, 1, 0, 0, 0, 0 }, .gpcs = { -1, 0 }, .vfe_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, .gws_not_connected = 0, .init = &dc10_init, }, { .type = LML33, .name = "LML33", .i2c_decoder = I2C_DRIVERID_BT819, .i2c_encoder = I2C_DRIVERID_BT856, .video_codec = CODEC_TYPE_ZR36060, .inputs = 2, .input = { { 0, "Composite" }, { 7, "S-Video" } }, .norms = 2, .tvn = { &f50ccir601_lml33, &f60ccir601_lml33, NULL }, .jpeg_int = ZR36057_ISR_GIRQ1, .vsync_int = ZR36057_ISR_GIRQ0, .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 }, .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 }, .gpcs = { 3, 1 }, .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 }, .gws_not_connected = 1, .init = &lml33_init, }, { .type = LML33R10, .name = "LML33R10", .vendor_id = PCI_VENDOR_ID_ELECTRONICDESIGNGMBH, .device_id = PCI_DEVICE_ID_LML_33R10, .i2c_decoder = I2C_DRIVERID_SAA7114, .i2c_encoder = I2C_DRIVERID_ADV7170, .video_codec = CODEC_TYPE_ZR36060, .inputs = 2, .input = { { 0, "Composite" }, { 7, "S-Video" } }, .norms = 2, .tvn = { &f50ccir601_lm33r10, &f60ccir601_lm33r10, NULL }, .jpeg_int = ZR36057_ISR_GIRQ1, .vsync_int = ZR36057_ISR_GIRQ0, .gpio = { 1, -1, 3, 5, 7, -1, -1, -1 }, .gpio_pol = { 0, 0, 0, 0, 1, 0, 0, 0 }, .gpcs = { 3, 1 }, .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 }, .gws_not_connected = 1, .init = &lml33_init, }, { .type = BUZ, .name = "Buz", .vendor_id = PCI_VENDOR_ID_IOMEGA, .device_id = PCI_DEVICE_ID_IOMEGA_BUZ, .i2c_decoder = I2C_DRIVERID_SAA7111A, .i2c_encoder = I2C_DRIVERID_SAA7185B, .video_codec = CODEC_TYPE_ZR36060, .inputs = 2, .input = { { 3, "Composite" }, { 7, "S-Video" } }, .norms = 3, .tvn = { &f50ccir601, &f60ccir601, &f50ccir601 }, .jpeg_int = ZR36057_ISR_GIRQ1, .vsync_int = ZR36057_ISR_GIRQ0, .gpio = { 1, -1, 3, -1, -1, -1, -1, -1 }, .gpio_pol = { 0, 0, 0, 0, 0, 0, 0, 0 }, .gpcs = { 3, 1 }, .vfe_pol = { 1, 1, 0, 0, 0, 1, 0, 0 }, .gws_not_connected = 1, .init = &buz_init, }};/* * I2C functions *//* software I2C functions */static intzoran_i2c_getsda (void *data){ struct zoran *zr = (struct zoran *) data; return (btread(ZR36057_I2CBR) >> 1) & 1;}static intzoran_i2c_getscl (void *data){ struct zoran *zr = (struct zoran *) data; return btread(ZR36057_I2CBR) & 1;}static voidzoran_i2c_setsda (void *data, int state){ struct zoran *zr = (struct zoran *) data; if (state) zr->i2cbr |= 2; else zr->i2cbr &= ~2; btwrite(zr->i2cbr, ZR36057_I2CBR);}static voidzoran_i2c_setscl (void *data, int state){ struct zoran *zr = (struct zoran *) data; if (state) zr->i2cbr |= 1; else zr->i2cbr &= ~1; btwrite(zr->i2cbr, ZR36057_I2CBR);}static intzoran_i2c_client_register (struct i2c_client *client){ struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter); int res = 0; dprintk(2, KERN_DEBUG "%s: i2c_client_register() - driver id = %d\n", ZR_DEVNAME(zr), client->driver->id); down(&zr->resource_lock); if (zr->user > 0) { /* we're already busy, so we keep a reference to * them... Could do a lot of stuff here, but this * is easiest. (Did I ever mention I'm a lazy ass?) */ res = -EBUSY; goto clientreg_unlock_and_return; } if (client->driver->id == zr->card.i2c_decoder) zr->decoder = client; else if (client->driver->id == zr->card.i2c_encoder) zr->encoder = client; else { res = -ENODEV; goto clientreg_unlock_and_return; }clientreg_unlock_and_return: up(&zr->resource_lock); return res;}static intzoran_i2c_client_unregister (struct i2c_client *client){ struct zoran *zr = (struct zoran *) i2c_get_adapdata(client->adapter); int res = 0; dprintk(2, KERN_DEBUG "%s: i2c_client_unregister()\n", ZR_DEVNAME(zr)); down(&zr->resource_lock); if (zr->user > 0) { res = -EBUSY; goto clientunreg_unlock_and_return; } /* try to locate it */ if (client == zr->encoder) { zr->encoder = NULL; } else if (client == zr->decoder) { zr->decoder = NULL; snprintf(ZR_DEVNAME(zr), sizeof(ZR_DEVNAME(zr)), "MJPEG[%d]", zr->id); }clientunreg_unlock_and_return: up(&zr->resource_lock); return res;}static struct i2c_algo_bit_data zoran_i2c_bit_data_template = { .setsda = zoran_i2c_setsda, .setscl = zoran_i2c_setscl, .getsda = zoran_i2c_getsda, .getscl = zoran_i2c_getscl, .udelay = 10, .mdelay = 0, .timeout = 100,};static struct i2c_adapter zoran_i2c_adapter_template = { .name = "zr36057", .id = I2C_HW_B_ZR36067, .algo = NULL, .client_register = zoran_i2c_client_register, .client_unregister = zoran_i2c_client_unregister,};static intzoran_register_i2c (struct zoran *zr){ memcpy(&zr->i2c_algo, &zoran_i2c_bit_data_template, sizeof(struct i2c_algo_bit_data)); zr->i2c_algo.data = zr; memcpy(&zr->i2c_adapter, &zoran_i2c_adapter_template, sizeof(struct i2c_adapter)); strncpy(I2C_NAME(&zr->i2c_adapter), ZR_DEVNAME(zr), sizeof(I2C_NAME(&zr->i2c_adapter)) - 1); i2c_set_adapdata(&zr->i2c_adapter, zr); zr->i2c_adapter.algo_data = &zr->i2c_algo; return i2c_bit_add_bus(&zr->i2c_adapter);}static voidzoran_unregister_i2c (struct zoran *zr){ i2c_bit_del_bus((&zr->i2c_adapter));}/* Check a zoran_params struct for correctness, insert default params */intzoran_check_jpg_settings (struct zoran *zr, struct zoran_jpg_settings *settings){ int err = 0, err0 = 0; dprintk(4, KERN_DEBUG "%s: check_jpg_settings() - dec: %d, Hdcm: %d, Vdcm: %d, Tdcm: %d\n", ZR_DEVNAME(zr), settings->decimation, settings->HorDcm, settings->VerDcm, settings->TmpDcm); dprintk(4, KERN_DEBUG "%s: check_jpg_settings() - x: %d, y: %d, w: %d, y: %d\n", ZR_DEVNAME(zr), settings->img_x, settings->img_y, settings->img_width, settings->img_height); /* Check decimation, set default values for decimation = 1, 2, 4 */ switch (settings->decimation) { case 1: settings->HorDcm = 1; settings->VerDcm = 1; settings->TmpDcm = 1; settings->field_per_buff = 2; settings->img_x = 0; settings->img_y = 0; settings->img_width = BUZ_MAX_WIDTH; settings->img_height = BUZ_MAX_HEIGHT / 2; break; case 2: settings->HorDcm = 2; settings->VerDcm = 1; settings->TmpDcm = 2; settings->field_per_buff = 1; settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0; settings->img_y = 0; settings->img_width = (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH; settings->img_height = BUZ_MAX_HEIGHT / 2; break; case 4: if (zr->card.type == DC10_new) { dprintk(1, KERN_DEBUG "%s: check_jpg_settings() - HDec by 4 is not supported on the DC10\n", ZR_DEVNAME(zr)); err0++; break; } settings->HorDcm = 4; settings->VerDcm = 2; settings->TmpDcm = 2; settings->field_per_buff = 1; settings->img_x = (BUZ_MAX_WIDTH == 720) ? 8 : 0; settings->img_y = 0; settings->img_width = (BUZ_MAX_WIDTH == 720) ? 704 : BUZ_MAX_WIDTH; settings->img_height = BUZ_MAX_HEIGHT / 2; break; case 0: /* We have to check the data the user has set */ if (settings->HorDcm != 1 && settings->HorDcm != 2 && (zr->card.type == DC10_new || settings->HorDcm != 4)) err0++; if (settings->VerDcm != 1 && settings->VerDcm != 2) err0++; if (settings->TmpDcm != 1 && settings->TmpDcm != 2) err0++; if (settings->field_per_buff != 1 && settings->field_per_buff != 2) err0++; if (settings->img_x < 0) err0++; if (settings->img_y < 0) err0++; if (settings->img_width < 0) err0++; if (settings->img_height < 0) err0++; if (settings->img_x + settings->img_width > BUZ_MAX_WIDTH) err0++; if (settings->img_y + settings->img_height > BUZ_MAX_HEIGHT / 2) err0++; if (settings->HorDcm && settings->VerDcm) { if (settings->img_width % (16 * settings->HorDcm) != 0) err0++; if (settings->img_height % (8 * settings->VerDcm) != 0) err0++; } if (err0) { dprintk(1, KERN_ERR "%s: check_jpg_settings() - error in params for decimation = 0\n", ZR_DEVNAME(zr)); err++; } break; default: dprintk(1, KERN_ERR "%s: check_jpg_settings() - decimation = %d, must be 0, 1, 2 or 4\n", ZR_DEVNAME(zr), settings->decimation); err++; break; } if (settings->jpg_comp.quality > 100) settings->jpg_comp.quality = 100; if (settings->jpg_comp.quality < 5) settings->jpg_comp.quality = 5; if (settings->jpg_comp.APPn < 0) settings->jpg_comp.APPn = 0; if (settings->jpg_comp.APPn > 15) settings->jpg_comp.APPn = 15; if (settings->jpg_comp.APP_len < 0) settings->jpg_comp.APP_len = 0; if (settings->jpg_comp.APP_len > 60) settings->jpg_comp.APP_len = 60; if (settings->jpg_comp.COM_len < 0) settings->jpg_comp.COM_len = 0; if (settings->jpg_comp.COM_len > 60) settings->jpg_comp.COM_len = 60; if (err) return -EINVAL; return 0;}voidzoran_open_init_params (struct zoran *zr){ int i; /* User must explicitly set a window */ zr->overlay_settings.is_set = 0; zr->overlay_mask = NULL; zr->overlay_active = ZORAN_FREE; zr->v4l_memgrab_active = 0; zr->v4l_overlay_active = 0; zr->v4l_grab_frame = NO_GRAB_ACTIVE; zr->v4l_grab_seq = 0; zr->v4l_settings.width = 192; zr->v4l_settings.height = 144; zr->v4l_settings.format = &zoran_formats[4]; /* YUY2 - YUV-4:2:2 packed */ zr->v4l_settings.bytesperline = zr->v4l_settings.width * ((zr->v4l_settings.format->depth + 7) / 8); /* DMA ring stuff for V4L */ zr->v4l_pend_tail = 0; zr->v4l_pend_head = 0; zr->v4l_sync_tail = 0; zr->v4l_buffers.active = ZORAN_FREE; for (i = 0; i < VIDEO_MAX_FRAME; i++) { zr->v4l_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */ } zr->v4l_buffers.allocated = 0; for (i = 0; i < BUZ_MAX_FRAME; i++) { zr->jpg_buffers.buffer[i].state = BUZ_STATE_USER; /* nothing going on */ } zr->jpg_buffers.active = ZORAN_FREE; zr->jpg_buffers.allocated = 0; /* Set necessary params and call zoran_check_jpg_settings to set the defaults */ zr->jpg_settings.decimation = 1; zr->jpg_settings.jpg_comp.quality = 50; /* default compression factor 8 */ if (zr->card.type != BUZ) zr->jpg_settings.odd_even = 1; else zr->jpg_settings.odd_even = 0; zr->jpg_settings.jpg_comp.APPn = 0; zr->jpg_settings.jpg_comp.APP_len = 0; /* No APPn marker */ memset(zr->jpg_settings.jpg_comp.APP_data, 0, sizeof(zr->jpg_settings.jpg_comp.APP_data)); zr->jpg_settings.jpg_comp.COM_len = 0; /* No COM marker */ memset(zr->jpg_settings.jpg_comp.COM_data, 0, sizeof(zr->jpg_settings.jpg_comp.COM_data)); zr->jpg_settings.jpg_comp.jpeg_markers = JPEG_MARKER_DHT | JPEG_MARKER_DQT; i = zoran_check_jpg_settings(zr, &zr->jpg_settings); if (i) dprintk(1, KERN_ERR "%s: zoran_open_init_params() internal error\n", ZR_DEVNAME(zr)); clear_interrupt_counters(zr); zr->testing = 0;}static void __devinittest_interrupts (struct zoran *zr){ DEFINE_WAIT(wait); int timeout, icr; clear_interrupt_counters(zr); zr->testing = 1; icr = btread(ZR36057_ICR); btwrite(0x78000000 | ZR36057_ICR_IntPinEn, ZR36057_ICR); prepare_to_wait(&zr->test_q, &wait, TASK_INTERRUPTIBLE); timeout = schedule_timeout(HZ); finish_wait(&zr->test_q, &wait); btwrite(0, ZR36057_ICR); btwrite(0x78000000, ZR36057_ISR); zr->testing = 0; dprintk(5, KERN_INFO "%s: Testing interrupts...\n", ZR_DEVNAME(zr)); if (timeout) { dprintk(1, ": time spent: %d\n", 1 * HZ - timeout); } if (*zr_debug > 1) print_interrupts(zr); btwrite(icr, ZR36057_ICR);}static int __devinitzr36057_init (struct zoran *zr){ unsigned long mem; void *vdev; unsigned mem_needed; int j; int two = 2; int zero = 0; dprintk(1, KERN_INFO "%s: zr36057_init() - initializing card[%d], zr=%p\n", ZR_DEVNAME(zr), zr->id, zr); /* default setup of all parameters which will persist between opens */ zr->user = 0; init_waitqueue_head(&zr->v4l_capq); init_waitqueue_head(&zr->jpg_capq); init_waitqueue_head(&zr->test_q); zr->jpg_buffers.allocated = 0; zr->v4l_buffers.allocated = 0; zr->buffer.base = (void *) vidmem; zr->buffer.width = 0; zr->buffer.height = 0; zr->buffer.depth = 0; zr->buffer.bytesperline = 0; /* Avoid nonsense settings from user for default input/norm */ if (default_norm < VIDEO_MODE_PAL && default_norm > VIDEO_MODE_SECAM) default_norm = VIDEO_MODE_PAL; zr->norm = default_norm; if (!(zr->timing = zr->card.tvn[zr->norm])) { dprintk(1, KERN_WARNING "%s: zr36057_init() - default TV standard not supported by hardware. PAL will be used.\n", ZR_DEVNAME(zr)); zr->norm = VIDEO_MODE_PAL; zr->timing = zr->card.tvn[zr->norm]; } zr->input = default_input = (default_input ? 1 : 0); /* Should the following be reset at every open ? */ zr->hue = 32768; zr->contrast = 32768; zr->saturation = 32768; zr->brightness = 32768; /* default setup (will be repeated at every open) */ zoran_open_init_params(zr); /* allocate memory *before* doing anything to the hardware * in case allocation fails */ mem_needed = BUZ_NUM_STAT_COM * 4; mem = (unsigned long) kmalloc(mem_needed, GFP_KERNEL); vdev = (void *) kmalloc(sizeof(struct video_device), GFP_KERNEL); if (!mem || !vdev) { dprintk(1,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -