📄 ibmcam.c
字号:
ibmcam_veio(uvd, 0, 0x01, 0x0108); ibmcam_veio(uvd, 0, 0x03, 0x0112); ibmcam_veio(uvd, 1, 0x00, 0x0115); ibmcam_veio(uvd, 0, 0x06, 0x0115); ibmcam_veio(uvd, 1, 0x00, 0x0116); ibmcam_veio(uvd, 0, 0x44, 0x0116); ibmcam_veio(uvd, 1, 0x00, 0x0116); ibmcam_veio(uvd, 0, 0x40, 0x0116); ibmcam_veio(uvd, 1, 0x00, 0x0115); ibmcam_veio(uvd, 0, 0x0e, 0x0115); ibmcam_veio(uvd, 0, 0x19, 0x012c); ibmcam_Packet_Format1(uvd, 0x00, 0x1e); ibmcam_Packet_Format1(uvd, 0x39, 0x0d); ibmcam_Packet_Format1(uvd, 0x39, 0x09); ibmcam_Packet_Format1(uvd, 0x3b, 0x00); ibmcam_Packet_Format1(uvd, 0x28, 0x22); ibmcam_Packet_Format1(uvd, light_27, 0); ibmcam_Packet_Format1(uvd, 0x2b, 0x1f); ibmcam_Packet_Format1(uvd, 0x39, 0x08); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x2c, 0x00); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x30, 0x14); ibmcam_PacketFormat2(uvd, 0x39, 0x02); ibmcam_PacketFormat2(uvd, 0x01, 0xe1); ibmcam_PacketFormat2(uvd, 0x02, 0xcd); ibmcam_PacketFormat2(uvd, 0x03, 0xcd); ibmcam_PacketFormat2(uvd, 0x04, 0xfa); ibmcam_PacketFormat2(uvd, 0x3f, 0xff); ibmcam_PacketFormat2(uvd, 0x39, 0x00); ibmcam_PacketFormat2(uvd, 0x39, 0x02); ibmcam_PacketFormat2(uvd, 0x0a, 0x37); ibmcam_PacketFormat2(uvd, 0x0b, 0xb8); ibmcam_PacketFormat2(uvd, 0x0c, 0xf3); ibmcam_PacketFormat2(uvd, 0x0d, 0xe3); ibmcam_PacketFormat2(uvd, 0x0e, 0x0d); ibmcam_PacketFormat2(uvd, 0x0f, 0xf2); ibmcam_PacketFormat2(uvd, 0x10, 0xd5); ibmcam_PacketFormat2(uvd, 0x11, 0xba); ibmcam_PacketFormat2(uvd, 0x12, 0x53); ibmcam_PacketFormat2(uvd, 0x3f, 0xff); ibmcam_PacketFormat2(uvd, 0x39, 0x00); ibmcam_PacketFormat2(uvd, 0x39, 0x02); ibmcam_PacketFormat2(uvd, 0x16, 0x00); ibmcam_PacketFormat2(uvd, 0x17, 0x28); ibmcam_PacketFormat2(uvd, 0x18, 0x7d); ibmcam_PacketFormat2(uvd, 0x19, 0xbe); ibmcam_PacketFormat2(uvd, 0x3f, 0xff); ibmcam_PacketFormat2(uvd, 0x39, 0x00); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x00, 0x18); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x13, 0x18); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x14, 0x06); /* This is default brightness */ for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x31, 0x37); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x32, 0x46); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x33, 0x55); ibmcam_Packet_Format1(uvd, 0x2e, 0x04); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x2d, 0x04); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x29, 0x80); ibmcam_Packet_Format1(uvd, 0x2c, 0x01); ibmcam_Packet_Format1(uvd, 0x30, 0x17); ibmcam_Packet_Format1(uvd, 0x39, 0x08); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x34, 0x00); ibmcam_veio(uvd, 0, 0x00, 0x0101); ibmcam_veio(uvd, 0, 0x00, 0x010a); switch (uvd->videosize) { case VIDEOSIZE_128x96: ibmcam_veio(uvd, 0, 0x80, 0x0103); ibmcam_veio(uvd, 0, 0x60, 0x0105); ibmcam_veio(uvd, 0, 0x0c, 0x010b); ibmcam_veio(uvd, 0, 0x04, 0x011b); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x0b, 0x011d); ibmcam_veio(uvd, 0, 0x00, 0x011e); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x00, 0x0129); break; case VIDEOSIZE_176x144: ibmcam_veio(uvd, 0, 0xb0, 0x0103); ibmcam_veio(uvd, 0, 0x8f, 0x0105); ibmcam_veio(uvd, 0, 0x06, 0x010b); ibmcam_veio(uvd, 0, 0x04, 0x011b); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x0d, 0x011d); ibmcam_veio(uvd, 0, 0x00, 0x011e); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x03, 0x0129); break; case VIDEOSIZE_352x288: ibmcam_veio(uvd, 0, 0xb0, 0x0103); ibmcam_veio(uvd, 0, 0x90, 0x0105); ibmcam_veio(uvd, 0, 0x02, 0x010b); ibmcam_veio(uvd, 0, 0x04, 0x011b); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x05, 0x011d); ibmcam_veio(uvd, 0, 0x00, 0x011e); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x00, 0x0129); break; } ibmcam_veio(uvd, 0, 0xff, 0x012b); /* This is another brightness - don't know why */ for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x31, 0xc3); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x32, 0xd2); for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, 0x33, 0xe1); /* Default contrast */ for (i=0; i < ntries; i++) ibmcam_Packet_Format1(uvd, contrast_14, 0x0a); /* Default sharpness */ for (i=0; i < 2; i++) ibmcam_PacketFormat2(uvd, sharp_13, 0x1a); /* Level 4 FIXME */ /* Default lighting conditions */ ibmcam_Packet_Format1(uvd, light_27, lighting); /* 0=Bright 2=Low */ /* Assorted init */ switch (uvd->videosize) { case VIDEOSIZE_128x96: ibmcam_Packet_Format1(uvd, 0x2b, 0x1e); ibmcam_veio(uvd, 0, 0xc9, 0x0119); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x80, 0x0109); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x36, 0x0102); ibmcam_veio(uvd, 0, 0x1a, 0x0104); ibmcam_veio(uvd, 0, 0x04, 0x011a); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x2b, 0x011c); ibmcam_veio(uvd, 0, 0x23, 0x012a); /* Same everywhere */#if 0 ibmcam_veio(uvd, 0, 0x00, 0x0106); ibmcam_veio(uvd, 0, 0x38, 0x0107);#else ibmcam_veio(uvd, 0, 0x02, 0x0106); ibmcam_veio(uvd, 0, 0x2a, 0x0107);#endif break; case VIDEOSIZE_176x144: ibmcam_Packet_Format1(uvd, 0x2b, 0x1e); ibmcam_veio(uvd, 0, 0xc9, 0x0119); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x80, 0x0109); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x04, 0x0102); ibmcam_veio(uvd, 0, 0x02, 0x0104); ibmcam_veio(uvd, 0, 0x04, 0x011a); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x2b, 0x011c); ibmcam_veio(uvd, 0, 0x23, 0x012a); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x01, 0x0106); ibmcam_veio(uvd, 0, 0xca, 0x0107); break; case VIDEOSIZE_352x288: ibmcam_Packet_Format1(uvd, 0x2b, 0x1f); ibmcam_veio(uvd, 0, 0xc9, 0x0119); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x80, 0x0109); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x08, 0x0102); ibmcam_veio(uvd, 0, 0x01, 0x0104); ibmcam_veio(uvd, 0, 0x04, 0x011a); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x2f, 0x011c); ibmcam_veio(uvd, 0, 0x23, 0x012a); /* Same everywhere */ ibmcam_veio(uvd, 0, 0x03, 0x0106); ibmcam_veio(uvd, 0, 0xf6, 0x0107); break; } return (CAMERA_IS_OPERATIONAL(uvd) ? 0 : -EFAULT);}static int ibmcam_model2_setup(struct uvd *uvd){ ibmcam_veio(uvd, 0, 0x0000, 0x0100); /* LED on */ ibmcam_veio(uvd, 1, 0x0000, 0x0116); ibmcam_veio(uvd, 0, 0x0060, 0x0116); ibmcam_veio(uvd, 0, 0x0002, 0x0112); ibmcam_veio(uvd, 0, 0x00bc, 0x012c); ibmcam_veio(uvd, 0, 0x0008, 0x012b); ibmcam_veio(uvd, 0, 0x0000, 0x0108); ibmcam_veio(uvd, 0, 0x0001, 0x0133); ibmcam_veio(uvd, 0, 0x0001, 0x0102); switch (uvd->videosize) { case VIDEOSIZE_176x144: ibmcam_veio(uvd, 0, 0x002c, 0x0103); /* All except 320x240 */ ibmcam_veio(uvd, 0, 0x0000, 0x0104); /* Same */ ibmcam_veio(uvd, 0, 0x0024, 0x0105); /* 176x144, 352x288 */ ibmcam_veio(uvd, 0, 0x00b9, 0x010a); /* Unique to this mode */ ibmcam_veio(uvd, 0, 0x0038, 0x0119); /* Unique to this mode */ ibmcam_veio(uvd, 0, 0x0003, 0x0106); /* Same */ ibmcam_veio(uvd, 0, 0x0090, 0x0107); /* Unique to every mode*/ break; case VIDEOSIZE_320x240: ibmcam_veio(uvd, 0, 0x0028, 0x0103); /* Unique to this mode */ ibmcam_veio(uvd, 0, 0x0000, 0x0104); /* Same */ ibmcam_veio(uvd, 0, 0x001e, 0x0105); /* 320x240, 352x240 */ ibmcam_veio(uvd, 0, 0x0039, 0x010a); /* All except 176x144 */ ibmcam_veio(uvd, 0, 0x0070, 0x0119); /* All except 176x144 */ ibmcam_veio(uvd, 0, 0x0003, 0x0106); /* Same */ ibmcam_veio(uvd, 0, 0x0098, 0x0107); /* Unique to every mode*/ break; case VIDEOSIZE_352x240: ibmcam_veio(uvd, 0, 0x002c, 0x0103); /* All except 320x240 */ ibmcam_veio(uvd, 0, 0x0000, 0x0104); /* Same */ ibmcam_veio(uvd, 0, 0x001e, 0x0105); /* 320x240, 352x240 */ ibmcam_veio(uvd, 0, 0x0039, 0x010a); /* All except 176x144 */ ibmcam_veio(uvd, 0, 0x0070, 0x0119); /* All except 176x144 */ ibmcam_veio(uvd, 0, 0x0003, 0x0106); /* Same */ ibmcam_veio(uvd, 0, 0x00da, 0x0107); /* Unique to every mode*/ break; case VIDEOSIZE_352x288: ibmcam_veio(uvd, 0, 0x002c, 0x0103); /* All except 320x240 */ ibmcam_veio(uvd, 0, 0x0000, 0x0104); /* Same */ ibmcam_veio(uvd, 0, 0x0024, 0x0105); /* 176x144, 352x288 */ ibmcam_veio(uvd, 0, 0x0039, 0x010a); /* All except 176x144 */ ibmcam_veio(uvd, 0, 0x0070, 0x0119); /* All except 176x144 */ ibmcam_veio(uvd, 0, 0x0003, 0x0106); /* Same */ ibmcam_veio(uvd, 0, 0x00fe, 0x0107); /* Unique to every mode*/ break; } return (CAMERA_IS_OPERATIONAL(uvd) ? 0 : -EFAULT);}/* * ibmcam_model1_setup_after_video_if() * * This code adds finishing touches to the video data interface. * Here we configure the frame rate and turn on the LED. */static void ibmcam_model1_setup_after_video_if(struct uvd *uvd){ unsigned short internal_frame_rate; RESTRICT_TO_RANGE(framerate, FRAMERATE_MIN, FRAMERATE_MAX); internal_frame_rate = FRAMERATE_MAX - framerate; /* 0=Fast 6=Slow */ ibmcam_veio(uvd, 0, 0x01, 0x0100); /* LED On */ ibmcam_veio(uvd, 0, internal_frame_rate, 0x0111); ibmcam_veio(uvd, 0, 0x01, 0x0114); ibmcam_veio(uvd, 0, 0xc0, 0x010c);}static void ibmcam_model2_setup_after_video_if(struct uvd *uvd){ unsigned short setup_model2_rg2, setup_model2_sat, setup_model2_yb; ibmcam_veio(uvd, 0, 0x0000, 0x0100); /* LED on */ switch (uvd->videosize) { case VIDEOSIZE_176x144: ibmcam_veio(uvd, 0, 0x0050, 0x0111); ibmcam_veio(uvd, 0, 0x00d0, 0x0111); break; case VIDEOSIZE_320x240: case VIDEOSIZE_352x240: case VIDEOSIZE_352x288: ibmcam_veio(uvd, 0, 0x0040, 0x0111); ibmcam_veio(uvd, 0, 0x00c0, 0x0111); break; } ibmcam_veio(uvd, 0, 0x009b, 0x010f); ibmcam_veio(uvd, 0, 0x00bb, 0x010f); /* * Hardware settings, may affect CMOS sensor; not user controls! * ------------------------------------------------------------- * 0x0004: no effect * 0x0006: hardware effect * 0x0008: no effect * 0x000a: stops video stream, probably important h/w setting * 0x000c: changes color in hardware manner (not user setting) * 0x0012: changes number of colors (does not affect speed) * 0x002a: no effect * 0x002c: hardware setting (related to scan lines) * 0x002e: stops video stream, probably important h/w setting */ ibmcam_model2_Packet1(uvd, 0x000a, 0x005c); ibmcam_model2_Packet1(uvd, 0x0004, 0x0000); ibmcam_model2_Packet1(uvd, 0x0006, 0x00fb); ibmcam_model2_Packet1(uvd, 0x0008, 0x0000); ibmcam_model2_Packet1(uvd, 0x000c, 0x0009); ibmcam_model2_Packet1(uvd, 0x0012, 0x000a); ibmcam_model2_Packet1(uvd, 0x002a, 0x0000); ibmcam_model2_Packet1(uvd, 0x002c, 0x0000); ibmcam_model2_Packet1(uvd, 0x002e, 0x0008); /* * Function 0x0030 pops up all over the place. Apparently * it is a hardware control register, with every bit assigned to * do something. */ ibmcam_model2_Packet1(uvd, 0x0030, 0x0000); /* * Magic control of CMOS sensor. Only lower values like * 0-3 work, and picture shifts left or right. Don't change. */ switch (uvd->videosize) { case VIDEOSIZE_176x144: ibmcam_model2_Packet1(uvd, 0x0014, 0x0002); ibmcam_model2_Packet1(uvd, 0x0016, 0x0002); /* Horizontal shift */ ibmcam_model2_Packet1(uvd, 0x0018, 0x004a); /* Another hardware setting */ break; case VIDEOSIZE_320x240: ibmcam_model2_Packet1(uvd, 0x0014, 0x0009); ibmcam_model2_Packet1(uvd, 0x0016, 0x0005); /* Horizontal shift */ ibmcam_model2_Packet1(uvd, 0x0018, 0x0044); /* Another hardware setting */ break; case VIDEOSIZE_352x240: /* This mode doesn't work as Windows programs it; changed to work */ ibmcam_model2_Packet1(uvd, 0x0014, 0x0009); /* Windows sets this to 8 */ ibmcam_model2_Packet1(uvd, 0x0016, 0x0003); /* Horizontal shift */ ibmcam_model2_Packet1(uvd, 0x0018, 0x0044); /* Windows sets this to 0x0045 */ break; case VIDEOSIZE_352x288: ibmcam_model2_Packet1(uvd, 0x0014, 0x0003); ibmcam_model2_Packet1(uvd, 0x0016, 0x0002); /* Horizontal shift */ ibmcam_model2_Packet1(uvd, 0x0018, 0x004a); /* Another hardware setting */ break; } ibmcam_model2_Packet1(uvd, mod2_brightness, 0x005a); /* * We have our own frame rate setting varying from 0 (slowest) to 6 (fastest). * The camera model 2 allows frame rate in range [0..0x1F] where 0 is also the * slowest setting. However for all practical reasons high settings make no * sense because USB is not fast enough to support high FPS. Be aware that * the picture datastream will be severely disrupted if you ask for * frame rate faster than allowed for the video size - see below: * * Allowable ranges (obtained experimentally on OHCI, K6-3, 450 MHz): * ----------------------------------------------------------------- * 176x144: [6..31] * 320x240: [8..31] * 352x240: [10..31] * 352x288: [16..31] I have to raise lower threshold for stability... * * As usual, slower FPS provides better sensitivity. */ { short hw_fps=31, i_framerate; RESTRICT_TO_RANGE(framerate, FRAMERATE_MIN, FRAMERATE_MAX); i_framerate = FRAMERATE_MAX - framerate + FRAMERATE_MIN; switch (uvd->videosize) { case VIDEOSIZE_176x144: hw_fps = 6 + i_framerate*4; break; case VIDEOSIZE_320x240: hw_fps = 8 + i_framerate*3; break; case VIDEOSIZE_352x240: hw_fps = 10 + i_framerate*2; break; case VIDEOSIZE_352x288: hw_fps = 28 + i_framerate/2; break; } if (uvd->debug > 0) info("Framerate (hardware): %hd.", hw_fps); RESTRICT_TO_RANGE(hw_fps, 0, 31); ibmcam_model2_Packet1(uvd, mod2_set_framerate, hw_fps); } /* * This setting does not visibly affect pictures; left it here * because it was present in Windows USB data stream. This function * does not allow arbitrary values and apparently is a bit mask, to * be activated only at appropriate time. Don't change it randomly! */ switch (uvd->videosize) { case VIDEOSIZE_176x144: ibmcam_model2_Packet1(uvd, 0x0026, 0x00c2); break; case VIDEOSIZE_320x240: ibmcam_model2_Packet1(uvd, 0x0026, 0x0044); break; case VIDEOSIZE_352x240: ibmcam_model2_Packet1(uvd, 0x0026, 0x0046); break; case VIDEOSIZE_352x288: ibmcam_model2_Packet1(uvd, 0x0026, 0x0048); break; } ibmcam_model2_Packet1(uvd, mod2_sensitivity, lighting); if (init_model2_rg2 >= 0) { RESTRICT_TO_RANGE(init_model2_rg2, 0, 255); setup_model2_rg2 = init_model2_rg2; } else setup_model2_rg2 = 0x002f; if (init_model2_sat >= 0) { RESTRICT_TO_RANGE(init_model2_sat, 0, 255); setup_model2_sat = init_model2_sat; } else setup_model2_sat = 0x0034; if (init_model2_yb >= 0) { RESTRICT_TO_RANGE(init_model2_yb, 0, 255); setup_model2_yb = init_model2_yb; } else setup_model2_yb = 0x00a0; ibmcam_model2_Packet1(uvd, mod2_color_balance_rg2, setup_model2_rg2); ibmcam_model2_Packet1(uvd, mod2_saturation, setup_model2_sat); ibmcam_model2_Packet1(uvd, mod2_color_balance_yb, setup_model2_yb); ibmcam_model2_Packet1(uvd, mod2_hue, uvd->vpic.hue >> 9); /* 0 .. 7F */; /* Hardware control command */ ibmcam_model2_Packet1(uvd, 0x0030, 0x0004); ibmcam_veio(uvd, 0, 0x00c0, 0x010c);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -