📄 bt819.c
字号:
switch (*iarg) { case VIDEO_MODE_NTSC: bt819_setbit(client, 0x01, 0, 1); bt819_setbit(client, 0x01, 1, 0); bt819_setbit(client, 0x01, 5, 0); bt819_write(client, 0x18, 0x68); bt819_write(client, 0x19, 0x5d); //bt819_setbit(client, 0x1a, 5, 1); timing = &timing_data[VIDEO_MODE_NTSC]; break; case VIDEO_MODE_PAL: bt819_setbit(client, 0x01, 0, 1); bt819_setbit(client, 0x01, 1, 1); bt819_setbit(client, 0x01, 5, 1); bt819_write(client, 0x18, 0x7f); bt819_write(client, 0x19, 0x72); //bt819_setbit(client, 0x1a, 5, 0); timing = &timing_data[VIDEO_MODE_PAL]; break; case VIDEO_MODE_AUTO: bt819_setbit(client, 0x01, 0, 0); bt819_setbit(client, 0x01, 1, 0); break; default: dprintk(1, KERN_ERR "%s: unsupported norm %d\n", I2C_NAME(client), *iarg); return -EINVAL; } if (timing) { bt819_write(client, 0x03, (((timing->vdelay >> 8) & 0x03) << 6) | (((timing->vactive >> 8) & 0x03) << 4) | (((timing->hdelay >> 8) & 0x03) << 2) | ((timing->hactive >> 8) & 0x03) ); bt819_write(client, 0x04, timing->vdelay & 0xff); bt819_write(client, 0x05, timing->vactive & 0xff); bt819_write(client, 0x06, timing->hdelay & 0xff); bt819_write(client, 0x07, timing->hactive & 0xff); bt819_write(client, 0x08, (timing->hscale >> 8) & 0xff); bt819_write(client, 0x09, timing->hscale & 0xff); } decoder->norm = *iarg; } break; case DECODER_SET_INPUT: { int *iarg = arg; dprintk(1, KERN_INFO "%s: set input %x\n", I2C_NAME(client), *iarg); if (*iarg < 0 || *iarg > 7) { return -EINVAL; } if (decoder->input != *iarg) { decoder->input = *iarg; /* select mode */ if (decoder->input == 0) { bt819_setbit(client, 0x0b, 6, 0); bt819_setbit(client, 0x1a, 1, 1); } else { bt819_setbit(client, 0x0b, 6, 1); bt819_setbit(client, 0x1a, 1, 0); } } } break; case DECODER_SET_OUTPUT: { int *iarg = arg; dprintk(1, KERN_INFO "%s: set output %x\n", I2C_NAME(client), *iarg); /* not much choice of outputs */ if (*iarg != 0) { return -EINVAL; } } break; case DECODER_ENABLE_OUTPUT: { int *iarg = arg; int enable = (*iarg != 0); dprintk(1, KERN_INFO "%s: enable output %x\n", I2C_NAME(client), *iarg); if (decoder->enable != enable) { decoder->enable = enable; if (decoder->enable) { bt819_setbit(client, 0x16, 7, 0); } else { bt819_setbit(client, 0x16, 7, 1); } } } break; case DECODER_SET_PICTURE: { struct video_picture *pic = arg; dprintk(1, KERN_INFO "%s: set picture brightness %d contrast %d colour %d\n", I2C_NAME(client), pic->brightness, pic->contrast, pic->colour); if (decoder->bright != pic->brightness) { /* We want -128 to 127 we get 0-65535 */ decoder->bright = pic->brightness; bt819_write(client, 0x0a, (decoder->bright >> 8) - 128); } if (decoder->contrast != pic->contrast) { /* We want 0 to 511 we get 0-65535 */ decoder->contrast = pic->contrast; bt819_write(client, 0x0c, (decoder->contrast >> 7) & 0xff); bt819_setbit(client, 0x0b, 2, ((decoder->contrast >> 15) & 0x01)); } if (decoder->sat != pic->colour) { /* We want 0 to 511 we get 0-65535 */ decoder->sat = pic->colour; bt819_write(client, 0x0d, (decoder->sat >> 7) & 0xff); bt819_setbit(client, 0x0b, 1, ((decoder->sat >> 15) & 0x01)); temp = (decoder->sat * 201) / 237; bt819_write(client, 0x0e, (temp >> 7) & 0xff); bt819_setbit(client, 0x0b, 0, (temp >> 15) & 0x01); } if (decoder->hue != pic->hue) { /* We want -128 to 127 we get 0-65535 */ decoder->hue = pic->hue; bt819_write(client, 0x0f, 128 - (decoder->hue >> 8)); } } break; default: return -EINVAL; } return 0;}/* ----------------------------------------------------------------------- *//* * Generic i2c probe * concerning the addresses: i2c wants 7 bit (without the r/w bit), so '>>1' */static unsigned short normal_i2c[] = { I2C_BT819 >> 1, I2C_CLIENT_END,};static unsigned short ignore = I2C_CLIENT_END; static struct i2c_client_address_data addr_data = { .normal_i2c = normal_i2c, .probe = &ignore, .ignore = &ignore,};static struct i2c_driver i2c_driver_bt819;static intbt819_detect_client (struct i2c_adapter *adapter, int address, int kind){ int i, id; struct bt819 *decoder; struct i2c_client *client; dprintk(1, KERN_INFO "saa7111.c: detecting bt819 client on address 0x%x\n", address << 1); /* Check if the adapter supports the needed features */ if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return 0; client = kmalloc(sizeof(struct i2c_client), GFP_KERNEL); if (client == 0) return -ENOMEM; memset(client, 0, sizeof(struct i2c_client)); client->addr = address; client->adapter = adapter; client->driver = &i2c_driver_bt819; client->flags = I2C_CLIENT_ALLOW_USE; decoder = kmalloc(sizeof(struct bt819), GFP_KERNEL); if (decoder == NULL) { kfree(client); return -ENOMEM; } memset(decoder, 0, sizeof(struct bt819)); decoder->norm = VIDEO_MODE_NTSC; decoder->input = 0; decoder->enable = 1; decoder->bright = 32768; decoder->contrast = 32768; decoder->hue = 32768; decoder->sat = 32768; decoder->initialized = 0; i2c_set_clientdata(client, decoder); id = bt819_read(client, 0x17); switch (id & 0xf0) { case 0x70: strlcpy(I2C_NAME(client), "bt819a", sizeof(I2C_NAME(client))); break; case 0x60: strlcpy(I2C_NAME(client), "bt817a", sizeof(I2C_NAME(client))); break; case 0x20: strlcpy(I2C_NAME(client), "bt815a", sizeof(I2C_NAME(client))); break; default: dprintk(1, KERN_ERR "bt819: unknown chip version 0x%x (ver 0x%x)\n", id & 0xf0, id & 0x0f); kfree(decoder); kfree(client); return 0; } i = i2c_attach_client(client); if (i) { kfree(client); kfree(decoder); return i; } i = bt819_init(client); if (i < 0) { dprintk(1, KERN_ERR "%s_attach: init status %d\n", I2C_NAME(client), i); } else { dprintk(1, KERN_INFO "%s_attach: chip version 0x%x at address 0x%x\n", I2C_NAME(client), id & 0x0f, client->addr << 1); } return 0;}static intbt819_attach_adapter (struct i2c_adapter *adapter){ return i2c_probe(adapter, &addr_data, &bt819_detect_client);}static intbt819_detach_client (struct i2c_client *client){ struct bt819 *decoder = i2c_get_clientdata(client); int err; err = i2c_detach_client(client); if (err) { return err; } kfree(decoder); kfree(client); return 0;}/* ----------------------------------------------------------------------- */static struct i2c_driver i2c_driver_bt819 = { .owner = THIS_MODULE, .name = "bt819", .id = I2C_DRIVERID_BT819, .flags = I2C_DF_NOTIFY, .attach_adapter = bt819_attach_adapter, .detach_client = bt819_detach_client, .command = bt819_command,};static int __initbt819_init_module (void){ return i2c_add_driver(&i2c_driver_bt819);}static void __exitbt819_exit (void){ i2c_del_driver(&i2c_driver_bt819);}module_init(bt819_init_module);module_exit(bt819_exit);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -