123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794 |
- /*
- * SPCA508 chip based cameras subdriver
- *
- * V4L2 by Jean-Francois Moine <http://moinejf.free.fr>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
- #define MODULE_NAME "spca508"
- #include "gspca.h"
- #define DRIVER_VERSION_NUMBER KERNEL_VERSION(2, 1, 5)
- static const char version[] = "2.1.5";
- MODULE_AUTHOR("Michel Xhaard <mxhaard@users.sourceforge.net>");
- MODULE_DESCRIPTION("GSPCA/SPCA508 USB Camera Driver");
- MODULE_LICENSE("GPL");
- /* specific webcam descriptor */
- struct sd {
- struct gspca_dev gspca_dev; /* !! must be the first item */
- int buflen;
- unsigned char tmpbuf[352 * 288 * 3 / 2]; /* YUVY per line */
- unsigned char tmpbuf2[352 * 288 * 2]; /* YUYV */
- unsigned char brightness;
- char subtype;
- #define CreativeVista 0
- #define HamaUSBSightcam 1
- #define HamaUSBSightcam2 2
- #define IntelEasyPCCamera 3
- #define MicroInnovationIC200 4
- #define ViewQuestVQ110 5
- };
- /* V4L2 controls supported by the driver */
- static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val);
- static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val);
- static struct ctrl sd_ctrls[] = {
- {
- {
- .id = V4L2_CID_BRIGHTNESS,
- .type = V4L2_CTRL_TYPE_INTEGER,
- .name = "Brightness",
- .minimum = 0,
- .maximum = 255,
- .step = 1,
- #define BRIGHTNESS_DEF 128
- .default_value = BRIGHTNESS_DEF,
- },
- .set = sd_setbrightness,
- .get = sd_getbrightness,
- },
- };
- static struct v4l2_pix_format sif_mode[] = {
- {160, 120, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
- .bytesperline = 160 * 2,
- .sizeimage = 160 * 120 * 2,
- .colorspace = V4L2_COLORSPACE_SRGB,
- .priv = 3},
- {176, 144, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
- .bytesperline = 176 * 2,
- .sizeimage = 176 * 144 * 2,
- .colorspace = V4L2_COLORSPACE_SRGB,
- .priv = 2},
- {320, 240, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
- .bytesperline = 320 * 2,
- .sizeimage = 320 * 240 * 2,
- .colorspace = V4L2_COLORSPACE_SRGB,
- .priv = 1},
- {352, 288, V4L2_PIX_FMT_YUYV, V4L2_FIELD_NONE,
- .bytesperline = 352 * 2,
- .sizeimage = 352 * 288 * 2,
- .colorspace = V4L2_COLORSPACE_SRGB,
- .priv = 0},
- };
- /* Frame packet header offsets for the spca508 */
- #define SPCA508_OFFSET_TYPE 1
- #define SPCA508_OFFSET_COMPRESS 2
- #define SPCA508_OFFSET_FRAMSEQ 8
- #define SPCA508_OFFSET_WIN1LUM 11
- #define SPCA508_OFFSET_DATA 37
- #define SPCA508_SNAPBIT 0x20
- #define SPCA508_SNAPCTRL 0x40
- /*************** I2c ****************/
- #define SPCA508_INDEX_I2C_BASE 0x8800
- /*
- * Initialization data: this is the first set-up data written to the
- * device (before the open data).
- */
- static const __u16 spca508_init_data[][3] =
- #define IGN(x) /* nothing */
- {
- /* line URB value, index */
- /* 44274 1804 */ {0x0000, 0x870b},
- /* 44299 1805 */ {0x0020, 0x8112},
- /* Video drop enable, ISO streaming disable */
- /* 44324 1806 */ {0x0003, 0x8111},
- /* Reset compression & memory */
- /* 44349 1807 */ {0x0000, 0x8110},
- /* Disable all outputs */
- /* 44372 1808 */ /* READ {0x0000, 0x8114} -> 0000: 00 */
- /* 44398 1809 */ {0x0000, 0x8114},
- /* SW GPIO data */
- /* 44423 1810 */ {0x0008, 0x8110},
- /* Enable charge pump output */
- /* 44527 1811 */ {0x0002, 0x8116},
- /* 200 kHz pump clock */
- /* 44555 1812 */
- /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE:) */
- /* 44590 1813 */ {0x0003, 0x8111},
- /* Reset compression & memory */
- /* 44615 1814 */ {0x0000, 0x8111},
- /* Normal mode (not reset) */
- /* 44640 1815 */ {0x0098, 0x8110},
- /* Enable charge pump output, sync.serial,external 2x clock */
- /* 44665 1816 */ {0x000d, 0x8114},
- /* SW GPIO data */
- /* 44690 1817 */ {0x0002, 0x8116},
- /* 200 kHz pump clock */
- /* 44715 1818 */ {0x0020, 0x8112},
- /* Video drop enable, ISO streaming disable */
- /* --------------------------------------- */
- /* 44740 1819 */ {0x000f, 0x8402},
- /* memory bank */
- /* 44765 1820 */ {0x0000, 0x8403},
- /* ... address */
- /* --------------------------------------- */
- /* 0x88__ is Synchronous Serial Interface. */
- /* TBD: This table could be expressed more compactly */
- /* using spca508_write_i2c_vector(). */
- /* TBD: Should see if the values in spca50x_i2c_data */
- /* would work with the VQ110 instead of the values */
- /* below. */
- /* 44790 1821 */ {0x00c0, 0x8804},
- /* SSI slave addr */
- /* 44815 1822 */ {0x0008, 0x8802},
- /* 375 Khz SSI clock */
- /* 44838 1823 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 44862 1824 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 44888 1825 */ {0x0008, 0x8802},
- /* 375 Khz SSI clock */
- /* 44913 1826 */ {0x0012, 0x8801},
- /* SSI reg addr */
- /* 44938 1827 */ {0x0080, 0x8800},
- /* SSI data to write */
- /* 44961 1828 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 44985 1829 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45009 1830 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 45035 1831 */ {0x0008, 0x8802},
- /* 375 Khz SSI clock */
- /* 45060 1832 */ {0x0012, 0x8801},
- /* SSI reg addr */
- /* 45085 1833 */ {0x0000, 0x8800},
- /* SSI data to write */
- /* 45108 1834 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45132 1835 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45156 1836 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 45182 1837 */ {0x0008, 0x8802},
- /* 375 Khz SSI clock */
- /* 45207 1838 */ {0x0011, 0x8801},
- /* SSI reg addr */
- /* 45232 1839 */ {0x0040, 0x8800},
- /* SSI data to write */
- /* 45255 1840 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45279 1841 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45303 1842 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 45329 1843 */ {0x0008, 0x8802},
- /* 45354 1844 */ {0x0013, 0x8801},
- /* 45379 1845 */ {0x0000, 0x8800},
- /* 45402 1846 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45426 1847 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45450 1848 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 45476 1849 */ {0x0008, 0x8802},
- /* 45501 1850 */ {0x0014, 0x8801},
- /* 45526 1851 */ {0x0000, 0x8800},
- /* 45549 1852 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45573 1853 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45597 1854 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 45623 1855 */ {0x0008, 0x8802},
- /* 45648 1856 */ {0x0015, 0x8801},
- /* 45673 1857 */ {0x0001, 0x8800},
- /* 45696 1858 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45720 1859 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45744 1860 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 45770 1861 */ {0x0008, 0x8802},
- /* 45795 1862 */ {0x0016, 0x8801},
- /* 45820 1863 */ {0x0003, 0x8800},
- /* 45843 1864 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45867 1865 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 45891 1866 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 45917 1867 */ {0x0008, 0x8802},
- /* 45942 1868 */ {0x0017, 0x8801},
- /* 45967 1869 */ {0x0036, 0x8800},
- /* 45990 1870 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46014 1871 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46038 1872 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 46064 1873 */ {0x0008, 0x8802},
- /* 46089 1874 */ {0x0018, 0x8801},
- /* 46114 1875 */ {0x00ec, 0x8800},
- /* 46137 1876 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46161 1877 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46185 1878 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 46211 1879 */ {0x0008, 0x8802},
- /* 46236 1880 */ {0x001a, 0x8801},
- /* 46261 1881 */ {0x0094, 0x8800},
- /* 46284 1882 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46308 1883 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46332 1884 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 46358 1885 */ {0x0008, 0x8802},
- /* 46383 1886 */ {0x001b, 0x8801},
- /* 46408 1887 */ {0x0000, 0x8800},
- /* 46431 1888 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46455 1889 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46479 1890 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 46505 1891 */ {0x0008, 0x8802},
- /* 46530 1892 */ {0x0027, 0x8801},
- /* 46555 1893 */ {0x00a2, 0x8800},
- /* 46578 1894 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46602 1895 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46626 1896 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 46652 1897 */ {0x0008, 0x8802},
- /* 46677 1898 */ {0x0028, 0x8801},
- /* 46702 1899 */ {0x0040, 0x8800},
- /* 46725 1900 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46749 1901 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46773 1902 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 46799 1903 */ {0x0008, 0x8802},
- /* 46824 1904 */ {0x002a, 0x8801},
- /* 46849 1905 */ {0x0084, 0x8800},
- /* 46872 1906 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46896 1907 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 46920 1908 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 46946 1909 */ {0x0008, 0x8802},
- /* 46971 1910 */ {0x002b, 0x8801},
- /* 46996 1911 */ {0x00a8, 0x8800},
- /* 47019 1912 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47043 1913 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47067 1914 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 47093 1915 */ {0x0008, 0x8802},
- /* 47118 1916 */ {0x002c, 0x8801},
- /* 47143 1917 */ {0x00fe, 0x8800},
- /* 47166 1918 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47190 1919 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47214 1920 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 47240 1921 */ {0x0008, 0x8802},
- /* 47265 1922 */ {0x002d, 0x8801},
- /* 47290 1923 */ {0x0003, 0x8800},
- /* 47313 1924 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47337 1925 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47361 1926 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 47387 1927 */ {0x0008, 0x8802},
- /* 47412 1928 */ {0x0038, 0x8801},
- /* 47437 1929 */ {0x0083, 0x8800},
- /* 47460 1930 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47484 1931 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47508 1932 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 47534 1933 */ {0x0008, 0x8802},
- /* 47559 1934 */ {0x0033, 0x8801},
- /* 47584 1935 */ {0x0081, 0x8800},
- /* 47607 1936 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47631 1937 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47655 1938 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 47681 1939 */ {0x0008, 0x8802},
- /* 47706 1940 */ {0x0034, 0x8801},
- /* 47731 1941 */ {0x004a, 0x8800},
- /* 47754 1942 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47778 1943 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47802 1944 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 47828 1945 */ {0x0008, 0x8802},
- /* 47853 1946 */ {0x0039, 0x8801},
- /* 47878 1947 */ {0x0000, 0x8800},
- /* 47901 1948 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47925 1949 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 47949 1950 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 47975 1951 */ {0x0008, 0x8802},
- /* 48000 1952 */ {0x0010, 0x8801},
- /* 48025 1953 */ {0x00a8, 0x8800},
- /* 48048 1954 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48072 1955 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48096 1956 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 48122 1957 */ {0x0008, 0x8802},
- /* 48147 1958 */ {0x0006, 0x8801},
- /* 48172 1959 */ {0x0058, 0x8800},
- /* 48195 1960 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48219 1961 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48243 1962 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 48269 1963 */ {0x0008, 0x8802},
- /* 48294 1964 */ {0x0000, 0x8801},
- /* 48319 1965 */ {0x0004, 0x8800},
- /* 48342 1966 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48366 1967 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48390 1968 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 48416 1969 */ {0x0008, 0x8802},
- /* 48441 1970 */ {0x0040, 0x8801},
- /* 48466 1971 */ {0x0080, 0x8800},
- /* 48489 1972 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48513 1973 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48537 1974 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 48563 1975 */ {0x0008, 0x8802},
- /* 48588 1976 */ {0x0041, 0x8801},
- /* 48613 1977 */ {0x000c, 0x8800},
- /* 48636 1978 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48660 1979 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48684 1980 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 48710 1981 */ {0x0008, 0x8802},
- /* 48735 1982 */ {0x0042, 0x8801},
- /* 48760 1983 */ {0x000c, 0x8800},
- /* 48783 1984 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48807 1985 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48831 1986 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 48857 1987 */ {0x0008, 0x8802},
- /* 48882 1988 */ {0x0043, 0x8801},
- /* 48907 1989 */ {0x0028, 0x8800},
- /* 48930 1990 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48954 1991 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 48978 1992 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 49004 1993 */ {0x0008, 0x8802},
- /* 49029 1994 */ {0x0044, 0x8801},
- /* 49054 1995 */ {0x0080, 0x8800},
- /* 49077 1996 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49101 1997 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49125 1998 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 49151 1999 */ {0x0008, 0x8802},
- /* 49176 2000 */ {0x0045, 0x8801},
- /* 49201 2001 */ {0x0020, 0x8800},
- /* 49224 2002 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49248 2003 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49272 2004 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 49298 2005 */ {0x0008, 0x8802},
- /* 49323 2006 */ {0x0046, 0x8801},
- /* 49348 2007 */ {0x0020, 0x8800},
- /* 49371 2008 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49395 2009 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49419 2010 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 49445 2011 */ {0x0008, 0x8802},
- /* 49470 2012 */ {0x0047, 0x8801},
- /* 49495 2013 */ {0x0080, 0x8800},
- /* 49518 2014 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49542 2015 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49566 2016 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 49592 2017 */ {0x0008, 0x8802},
- /* 49617 2018 */ {0x0048, 0x8801},
- /* 49642 2019 */ {0x004c, 0x8800},
- /* 49665 2020 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49689 2021 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49713 2022 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 49739 2023 */ {0x0008, 0x8802},
- /* 49764 2024 */ {0x0049, 0x8801},
- /* 49789 2025 */ {0x0084, 0x8800},
- /* 49812 2026 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49836 2027 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49860 2028 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 49886 2029 */ {0x0008, 0x8802},
- /* 49911 2030 */ {0x004a, 0x8801},
- /* 49936 2031 */ {0x0084, 0x8800},
- /* 49959 2032 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 49983 2033 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 50007 2034 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 50033 2035 */ {0x0008, 0x8802},
- /* 50058 2036 */ {0x004b, 0x8801},
- /* 50083 2037 */ {0x0084, 0x8800},
- /* 50106 2038 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* --------------------------------------- */
- /* 50132 2039 */ {0x0012, 0x8700},
- /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
- /* 50157 2040 */ {0x0000, 0x8701},
- /* CKx1 clock delay adj */
- /* 50182 2041 */ {0x0000, 0x8701},
- /* CKx1 clock delay adj */
- /* 50207 2042 */ {0x0001, 0x870c},
- /* CKOx2 output */
- /* --------------------------------------- */
- /* 50232 2043 */ {0x0080, 0x8600},
- /* Line memory read counter (L) */
- /* 50257 2044 */ {0x0001, 0x8606},
- /* reserved */
- /* 50282 2045 */ {0x0064, 0x8607},
- /* Line memory read counter (H) 0x6480=25,728 */
- /* 50307 2046 */ {0x002a, 0x8601},
- /* CDSP sharp interpolation mode,
- * line sel for color sep, edge enhance enab */
- /* 50332 2047 */ {0x0000, 0x8602},
- /* optical black level for user settng = 0 */
- /* 50357 2048 */ {0x0080, 0x8600},
- /* Line memory read counter (L) */
- /* 50382 2049 */ {0x000a, 0x8603},
- /* optical black level calc mode: auto; optical black offset = 10 */
- /* 50407 2050 */ {0x00df, 0x865b},
- /* Horiz offset for valid pixels (L)=0xdf */
- /* 50432 2051 */ {0x0012, 0x865c},
- /* Vert offset for valid lines (L)=0x12 */
- /* The following two lines seem to be the "wrong" resolution. */
- /* But perhaps these indicate the actual size of the sensor */
- /* rather than the size of the current video mode. */
- /* 50457 2052 */ {0x0058, 0x865d},
- /* Horiz valid pixels (*4) (L) = 352 */
- /* 50482 2053 */ {0x0048, 0x865e},
- /* Vert valid lines (*4) (L) = 288 */
- /* 50507 2054 */ {0x0015, 0x8608},
- /* A11 Coef ... */
- /* 50532 2055 */ {0x0030, 0x8609},
- /* 50557 2056 */ {0x00fb, 0x860a},
- /* 50582 2057 */ {0x003e, 0x860b},
- /* 50607 2058 */ {0x00ce, 0x860c},
- /* 50632 2059 */ {0x00f4, 0x860d},
- /* 50657 2060 */ {0x00eb, 0x860e},
- /* 50682 2061 */ {0x00dc, 0x860f},
- /* 50707 2062 */ {0x0039, 0x8610},
- /* 50732 2063 */ {0x0001, 0x8611},
- /* R offset for white balance ... */
- /* 50757 2064 */ {0x0000, 0x8612},
- /* 50782 2065 */ {0x0001, 0x8613},
- /* 50807 2066 */ {0x0000, 0x8614},
- /* 50832 2067 */ {0x005b, 0x8651},
- /* R gain for white balance ... */
- /* 50857 2068 */ {0x0040, 0x8652},
- /* 50882 2069 */ {0x0060, 0x8653},
- /* 50907 2070 */ {0x0040, 0x8654},
- /* 50932 2071 */ {0x0000, 0x8655},
- /* 50957 2072 */ {0x0001, 0x863f},
- /* Fixed gamma correction enable, USB control,
- * lum filter disable, lum noise clip disable */
- /* 50982 2073 */ {0x00a1, 0x8656},
- /* Window1 size 256x256, Windows2 size 64x64,
- * gamma look-up disable, new edge enhancement enable */
- /* 51007 2074 */ {0x0018, 0x8657},
- /* Edge gain high thresh */
- /* 51032 2075 */ {0x0020, 0x8658},
- /* Edge gain low thresh */
- /* 51057 2076 */ {0x000a, 0x8659},
- /* Edge bandwidth high threshold */
- /* 51082 2077 */ {0x0005, 0x865a},
- /* Edge bandwidth low threshold */
- /* -------------------------------- */
- /* 51107 2078 */ {0x0030, 0x8112},
- /* Video drop enable, ISO streaming enable */
- /* 51130 2079 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 51154 2080 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 51180 2081 */ {0xa908, 0x8802},
- /* 51205 2082 */ {0x0034, 0x8801},
- /* SSI reg addr */
- /* 51230 2083 */ {0x00ca, 0x8800},
- /* SSI data to write */
- /* 51253 2084 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 51277 2085 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 51301 2086 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 51327 2087 */ {0x1f08, 0x8802},
- /* 51352 2088 */ {0x0006, 0x8801},
- /* 51377 2089 */ {0x0080, 0x8800},
- /* 51400 2090 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* ----- Read back coefs we wrote earlier. */
- /* 51424 2091 */ /* READ { 0, 0x0000, 0x8608 } -> 0000: 15 */
- /* 51448 2092 */ /* READ { 0, 0x0000, 0x8609 } -> 0000: 30 */
- /* 51472 2093 */ /* READ { 0, 0x0000, 0x860a } -> 0000: fb */
- /* 51496 2094 */ /* READ { 0, 0x0000, 0x860b } -> 0000: 3e */
- /* 51520 2095 */ /* READ { 0, 0x0000, 0x860c } -> 0000: ce */
- /* 51544 2096 */ /* READ { 0, 0x0000, 0x860d } -> 0000: f4 */
- /* 51568 2097 */ /* READ { 0, 0x0000, 0x860e } -> 0000: eb */
- /* 51592 2098 */ /* READ { 0, 0x0000, 0x860f } -> 0000: dc */
- /* 51616 2099 */ /* READ { 0, 0x0000, 0x8610 } -> 0000: 39 */
- /* 51640 2100 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 51664 2101 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 08 */
- /* 51690 2102 */ {0xb008, 0x8802},
- /* 51715 2103 */ {0x0006, 0x8801},
- /* 51740 2104 */ {0x007d, 0x8800},
- /* 51763 2105 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* This chunk is seemingly redundant with */
- /* earlier commands (A11 Coef...), but if I disable it, */
- /* the image appears too dark. Maybe there was some kind of */
- /* reset since the earlier commands, so this is necessary again. */
- /* 51789 2106 */ {0x0015, 0x8608},
- /* 51814 2107 */ {0x0030, 0x8609},
- /* 51839 2108 */ {0xfffb, 0x860a},
- /* 51864 2109 */ {0x003e, 0x860b},
- /* 51889 2110 */ {0xffce, 0x860c},
- /* 51914 2111 */ {0xfff4, 0x860d},
- /* 51939 2112 */ {0xffeb, 0x860e},
- /* 51964 2113 */ {0xffdc, 0x860f},
- /* 51989 2114 */ {0x0039, 0x8610},
- /* 52014 2115 */ {0x0018, 0x8657},
- /* 52039 2116 */ {0x0000, 0x8508},
- /* Disable compression. */
- /* Previous line was:
- * 52039 2116 * { 0, 0x0021, 0x8508 }, * Enable compression. */
- /* 52064 2117 */ {0x0032, 0x850b},
- /* compression stuff */
- /* 52089 2118 */ {0x0003, 0x8509},
- /* compression stuff */
- /* 52114 2119 */ {0x0011, 0x850a},
- /* compression stuff */
- /* 52139 2120 */ {0x0021, 0x850d},
- /* compression stuff */
- /* 52164 2121 */ {0x0010, 0x850c},
- /* compression stuff */
- /* 52189 2122 */ {0x0003, 0x8500},
- /* *** Video mode: 160x120 */
- /* 52214 2123 */ {0x0001, 0x8501},
- /* Hardware-dominated snap control */
- /* 52239 2124 */ {0x0061, 0x8656},
- /* Window1 size 128x128, Windows2 size 128x128,
- * gamma look-up disable, new edge enhancement enable */
- /* 52264 2125 */ {0x0018, 0x8617},
- /* Window1 start X (*2) */
- /* 52289 2126 */ {0x0008, 0x8618},
- /* Window1 start Y (*2) */
- /* 52314 2127 */ {0x0061, 0x8656},
- /* Window1 size 128x128, Windows2 size 128x128,
- * gamma look-up disable, new edge enhancement enable */
- /* 52339 2128 */ {0x0058, 0x8619},
- /* Window2 start X (*2) */
- /* 52364 2129 */ {0x0008, 0x861a},
- /* Window2 start Y (*2) */
- /* 52389 2130 */ {0x00ff, 0x8615},
- /* High lum thresh for white balance */
- /* 52414 2131 */ {0x0000, 0x8616},
- /* Low lum thresh for white balance */
- /* 52439 2132 */ {0x0012, 0x8700},
- /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
- /* 52464 2133 */ {0x0012, 0x8700},
- /* Clock speed 48Mhz/(2+2)/2= 6 Mhz */
- /* 52487 2134 */ /* READ { 0, 0x0000, 0x8656 } -> 0000: 61 */
- /* 52513 2135 */ {0x0028, 0x8802},
- /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
- /* 52536 2136 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 52560 2137 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 28 */
- /* 52586 2138 */ {0x1f28, 0x8802},
- /* 375 Khz SSI clock, SSI r/w sync with VSYNC */
- /* 52611 2139 */ {0x0010, 0x8801},
- /* SSI reg addr */
- /* 52636 2140 */ {0x003e, 0x8800},
- /* SSI data to write */
- /* 52659 2141 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 52685 2142 */ {0x0028, 0x8802},
- /* 52708 2143 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 52732 2144 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 28 */
- /* 52758 2145 */ {0x1f28, 0x8802},
- /* 52783 2146 */ {0x0000, 0x8801},
- /* 52808 2147 */ {0x001f, 0x8800},
- /* 52831 2148 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 52857 2149 */ {0x0001, 0x8602},
- /* optical black level for user settning = 1 */
- /* Original: */
- /* 52882 2150 */ {0x0023, 0x8700},
- /* Clock speed 48Mhz/(3+2)/4= 2.4 Mhz */
- /* 52907 2151 */ {0x000f, 0x8602},
- /* optical black level for user settning = 15 */
- /* 52932 2152 */ {0x0028, 0x8802},
- /* 52955 2153 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 52979 2154 */ /* READ { 0, 0x0001, 0x8802 } -> 0000: 28 */
- /* 53005 2155 */ {0x1f28, 0x8802},
- /* 53030 2156 */ {0x0010, 0x8801},
- /* 53055 2157 */ {0x007b, 0x8800},
- /* 53078 2158 */ /* READ { 0, 0x0001, 0x8803 } -> 0000: 00 */
- /* 53104 2159 */ {0x002f, 0x8651},
- /* R gain for white balance ... */
- /* 53129 2160 */ {0x0080, 0x8653},
- /* 53152 2161 */ /* READ { 0, 0x0000, 0x8655 } -> 0000: 00 */
- /* 53178 2162 */ {0x0000, 0x8655},
- /* 53203 2163 */ {0x0030, 0x8112},
- /* Video drop enable, ISO streaming enable */
- /* 53228 2164 */ {0x0020, 0x8112},
- /* Video drop enable, ISO streaming disable */
- /* 53252 2165 */
- /* UNKNOWN DIRECTION (URB_FUNCTION_SELECT_INTERFACE: (ALT=0) ) */
- {}
- };
- /*
- * Initialization data for Intel EasyPC Camera CS110
- */
- static const __u16 spca508cs110_init_data[][3] = {
- {0x0000, 0x870b}, /* Reset CTL3 */
- {0x0003, 0x8111}, /* Soft Reset compression, memory, TG & CDSP */
- {0x0000, 0x8111}, /* Normal operation on reset */
- {0x0090, 0x8110},
- /* External Clock 2x & Synchronous Serial Interface Output */
- {0x0020, 0x8112}, /* Video Drop packet enable */
- {0x0000, 0x8114}, /* Software GPIO output data */
- {0x0001, 0x8114},
- {0x0001, 0x8114},
- {0x0001, 0x8114},
- {0x0003, 0x8114},
- /* Initial sequence Synchronous Serial Interface */
- {0x000f, 0x8402}, /* Memory bank Address */
- {0x0000, 0x8403}, /* Memory bank Address */
- {0x00ba, 0x8804}, /* SSI Slave address */
- {0x0010, 0x8802}, /* 93.75kHz SSI Clock Two DataByte */
- {0x0010, 0x8802}, /* 93.75kHz SSI Clock two DataByte */
- {0x0001, 0x8801},
- {0x000a, 0x8805},/* a - NWG: Dunno what this is about */
- {0x0000, 0x8800},
- {0x0010, 0x8802},
- {0x0002, 0x8801},
- {0x0000, 0x8805},
- {0x0000, 0x8800},
- {0x0010, 0x8802},
- {0x0003, 0x8801},
- {0x0027, 0x8805},
- {0x0001, 0x8800},
- {0x0010, 0x8802},
- {0x0004, 0x8801},
- {0x0065, 0x8805},
- {0x0001, 0x8800},
- {0x0010, 0x8802},
- {0x0005, 0x8801},
- {0x0003, 0x8805},
- {0x0000, 0x8800},
- {0x0010, 0x8802},
- {0x0006, 0x8801},
- {0x001c, 0x8805},
- {0x0000, 0x8800},
- {0x0010, 0x8802},
- {0x0007, 0x8801},
- {0x002a, 0x8805},
- {0x0000, 0x8800},
- {0x0010, 0x8802},
- {0x0002, 0x8704}, /* External input CKIx1 */
- {0x0001, 0x8606}, /* 1 Line memory Read Counter (H) Result: (d)410 */
- {0x009a, 0x8600}, /* Line memory Read Counter (L) */
- {0x0001, 0x865b}, /* 1 Horizontal Offset for Valid Pixel(L) */
- {0x0003, 0x865c}, /* 3 Vertical Offset for Valid Lines(L) */
- {0x0058, 0x865d}, /* 58 Horizontal Valid Pixel Window(L) */
- {0x0006, 0x8660}, /* Nibble data + input order */
- {0x000a, 0x8602}, /* Optical black level set to 0x0a */
- /* 1945 */ {0x0000, 0x8603}, /* Optical black level Offset */
- /* 1962 * {0, 0x0000, 0x8611}, * 0 R Offset for white Balance */
- /* 1963 * {0, 0x0000, 0x8612}, * 1 Gr Offset for white Balance */
- /* 1964 * {0, 0x0000, 0x8613}, * 1f B Offset for white Balance */
- /* 1965 * {0, 0x0000, 0x8614}, * f0 Gb Offset for white Balance */
- {0x0040, 0x8651}, /* 2b BLUE gain for white balance good at all 60 */
- {0x0030, 0x8652}, /* 41 Gr Gain for white Balance (L) */
- {0x0035, 0x8653}, /* 26 RED gain for white balance */
- {0x0035, 0x8654}, /* 40Gb Gain for white Balance (L) */
- {0x0041, 0x863f},
- /* Fixed Gamma correction enabled (makes colours look better) */
- /* 2422 */ {0x0000, 0x8655},
- /* High bits for white balance*****brightness control*** */
- {}
- };
- static const __u16 spca508_sightcam_init_data[][3] = {
- /* This line seems to setup the frame/canvas */
- /*368 */ {0x000f, 0x8402},
- /* Theese 6 lines are needed to startup the webcam */
- /*398 */ {0x0090, 0x8110},
- /*399 */ {0x0001, 0x8114},
- /*400 */ {0x0001, 0x8114},
- /*401 */ {0x0001, 0x8114},
- /*402 */ {0x0003, 0x8114},
- /*403 */ {0x0080, 0x8804},
- /* This part seems to make the pictures darker? (autobrightness?) */
- /*436 */ {0x0001, 0x8801},
- /*437 */ {0x0004, 0x8800},
- /*439 */ {0x0003, 0x8801},
- /*440 */ {0x00e0, 0x8800},
- /*442 */ {0x0004, 0x8801},
- /*443 */ {0x00b4, 0x8800},
- /*445 */ {0x0005, 0x8801},
- /*446 */ {0x0000, 0x8800},
- /*448 */ {0x0006, 0x8801},
- /*449 */ {0x00e0, 0x8800},
- /*451 */ {0x0007, 0x8801},
- /*452 */ {0x000c, 0x8800},
- /* This section is just needed, it probably
- * does something like the previous section,
- * but the cam won't start if it's not included.
- */
- /*484 */ {0x0014, 0x8801},
- /*485 */ {0x0008, 0x8800},
- /*487 */ {0x0015, 0x8801},
- /*488 */ {0x0067, 0x8800},
- /*490 */ {0x0016, 0x8801},
- /*491 */ {0x0000, 0x8800},
- /*493 */ {0x0017, 0x8801},
- /*494 */ {0x0020, 0x8800},
- /*496 */ {0x0018, 0x8801},
- /*497 */ {0x0044, 0x8800},
- /* Makes the picture darker - and the
- * cam won't start if not included
- */
- /*505 */ {0x001e, 0x8801},
- /*506 */ {0x00ea, 0x8800},
- /*508 */ {0x001f, 0x8801},
- /*509 */ {0x0001, 0x8800},
- /*511 */ {0x0003, 0x8801},
- /*512 */ {0x00e0, 0x8800},
- /* seems to place the colors ontop of each other #1 */
- /*517 */ {0x0006, 0x8704},
- /*518 */ {0x0001, 0x870c},
- /*519 */ {0x0016, 0x8600},
- /*520 */ {0x0002, 0x8606},
- /* if not included the pictures becomes _very_ dark */
- /*521 */ {0x0064, 0x8607},
- /*522 */ {0x003a, 0x8601},
- /*523 */ {0x0000, 0x8602},
- /* seems to place the colors ontop of each other #2 */
- /*524 */ {0x0016, 0x8600},
- /*525 */ {0x0018, 0x8617},
- /*526 */ {0x0008, 0x8618},
- /*527 */ {0x00a1, 0x8656},
- /* webcam won't start if not included */
- /*528 */ {0x0007, 0x865b},
- /*529 */ {0x0001, 0x865c},
- /*530 */ {0x0058, 0x865d},
- /*531 */ {0x0048, 0x865e},
- /* adjusts the colors */
- /*541 */ {0x0049, 0x8651},
- /*542 */ {0x0040, 0x8652},
- /*543 */ {0x004c, 0x8653},
- /*544 */ {0x0040, 0x8654},
- {}
- };
- static const __u16 spca508_sightcam2_init_data[][3] = {
- /* 35 */ {0x0020, 0x8112},
- /* 36 */ {0x000f, 0x8402},
- /* 37 */ {0x0000, 0x8403},
- /* 38 */ {0x0008, 0x8201},
- /* 39 */ {0x0008, 0x8200},
- /* 40 */ {0x0001, 0x8200},
- /* 43 */ {0x0009, 0x8201},
- /* 44 */ {0x0008, 0x8200},
- /* 45 */ {0x0001, 0x8200},
- /* 48 */ {0x000a, 0x8201},
- /* 49 */ {0x0008, 0x8200},
- /* 50 */ {0x0001, 0x8200},
- /* 53 */ {0x000b, 0x8201},
- /* 54 */ {0x0008, 0x8200},
- /* 55 */ {0x0001, 0x8200},
- /* 58 */ {0x000c, 0x8201},
- /* 59 */ {0x0008, 0x8200},
- /* 60 */ {0x0001, 0x8200},
- /* 63 */ {0x000d, 0x8201},
- /* 64 */ {0x0008, 0x8200},
- /* 65 */ {0x0001, 0x8200},
- /* 68 */ {0x000e, 0x8201},
- /* 69 */ {0x0008, 0x8200},
- /* 70 */ {0x0001, 0x8200},
- /* 73 */ {0x0007, 0x8201},
- /* 74 */ {0x0008, 0x8200},
- /* 75 */ {0x0001, 0x8200},
- /* 78 */ {0x000f, 0x8201},
- /* 79 */ {0x0008, 0x8200},
- /* 80 */ {0x0001, 0x8200},
- /* 84 */ {0x0018, 0x8660},
- /* 85 */ {0x0010, 0x8201},
- /* 86 */ {0x0008, 0x8200},
- /* 87 */ {0x0001, 0x8200},
- /* 90 */ {0x0011, 0x8201},
- /* 91 */ {0x0008, 0x8200},
- /* 92 */ {0x0001, 0x8200},
- /* 95 */ {0x0000, 0x86b0},
- /* 96 */ {0x0034, 0x86b1},
- /* 97 */ {0x0000, 0x86b2},
- /* 98 */ {0x0049, 0x86b3},
- /* 99 */ {0x0000, 0x86b4},
- /* 100 */ {0x0000, 0x86b4},
- /* 101 */ {0x0012, 0x8201},
- /* 102 */ {0x0008, 0x8200},
- /* 103 */ {0x0001, 0x8200},
- /* 106 */ {0x0013, 0x8201},
- /* 107 */ {0x0008, 0x8200},
- /* 108 */ {0x0001, 0x8200},
- /* 111 */ {0x0001, 0x86b0},
- /* 112 */ {0x00aa, 0x86b1},
- /* 113 */ {0x0000, 0x86b2},
- /* 114 */ {0x00e4, 0x86b3},
- /* 115 */ {0x0000, 0x86b4},
- /* 116 */ {0x0000, 0x86b4},
- /* 118 */ {0x0018, 0x8660},
- /* 119 */ {0x0090, 0x8110},
- /* 120 */ {0x0001, 0x8114},
- /* 121 */ {0x0001, 0x8114},
- /* 122 */ {0x0001, 0x8114},
- /* 123 */ {0x0003, 0x8114},
- /* 124 */ {0x0080, 0x8804},
- /* 157 */ {0x0003, 0x8801},
- /* 158 */ {0x0012, 0x8800},
- /* 160 */ {0x0004, 0x8801},
- /* 161 */ {0x0005, 0x8800},
- /* 163 */ {0x0005, 0x8801},
- /* 164 */ {0x0000, 0x8800},
- /* 166 */ {0x0006, 0x8801},
- /* 167 */ {0x0000, 0x8800},
- /* 169 */ {0x0007, 0x8801},
- /* 170 */ {0x0000, 0x8800},
- /* 172 */ {0x0008, 0x8801},
- /* 173 */ {0x0005, 0x8800},
- /* 175 */ {0x000a, 0x8700},
- /* 176 */ {0x000e, 0x8801},
- /* 177 */ {0x0004, 0x8800},
- /* 179 */ {0x0005, 0x8801},
- /* 180 */ {0x0047, 0x8800},
- /* 182 */ {0x0006, 0x8801},
- /* 183 */ {0x0000, 0x8800},
- /* 185 */ {0x0007, 0x8801},
- /* 186 */ {0x00c0, 0x8800},
- /* 188 */ {0x0008, 0x8801},
- /* 189 */ {0x0003, 0x8800},
- /* 191 */ {0x0013, 0x8801},
- /* 192 */ {0x0001, 0x8800},
- /* 194 */ {0x0009, 0x8801},
- /* 195 */ {0x0000, 0x8800},
- /* 197 */ {0x000a, 0x8801},
- /* 198 */ {0x0000, 0x8800},
- /* 200 */ {0x000b, 0x8801},
- /* 201 */ {0x0000, 0x8800},
- /* 203 */ {0x000c, 0x8801},
- /* 204 */ {0x0000, 0x8800},
- /* 206 */ {0x000e, 0x8801},
- /* 207 */ {0x0004, 0x8800},
- /* 209 */ {0x000f, 0x8801},
- /* 210 */ {0x0000, 0x8800},
- /* 212 */ {0x0010, 0x8801},
- /* 213 */ {0x0006, 0x8800},
- /* 215 */ {0x0011, 0x8801},
- /* 216 */ {0x0006, 0x8800},
- /* 218 */ {0x0012, 0x8801},
- /* 219 */ {0x0000, 0x8800},
- /* 221 */ {0x0013, 0x8801},
- /* 222 */ {0x0001, 0x8800},
- /* 224 */ {0x000a, 0x8700},
- /* 225 */ {0x0000, 0x8702},
- /* 226 */ {0x0000, 0x8703},
- /* 227 */ {0x00c2, 0x8704},
- /* 228 */ {0x0001, 0x870c},
- /* 229 */ {0x0044, 0x8600},
- /* 230 */ {0x0002, 0x8606},
- /* 231 */ {0x0064, 0x8607},
- /* 232 */ {0x003a, 0x8601},
- /* 233 */ {0x0008, 0x8602},
- /* 234 */ {0x0044, 0x8600},
- /* 235 */ {0x0018, 0x8617},
- /* 236 */ {0x0008, 0x8618},
- /* 237 */ {0x00a1, 0x8656},
- /* 238 */ {0x0004, 0x865b},
- /* 239 */ {0x0002, 0x865c},
- /* 240 */ {0x0058, 0x865d},
- /* 241 */ {0x0048, 0x865e},
- /* 242 */ {0x0012, 0x8608},
- /* 243 */ {0x002c, 0x8609},
- /* 244 */ {0x0002, 0x860a},
- /* 245 */ {0x002c, 0x860b},
- /* 246 */ {0x00db, 0x860c},
- /* 247 */ {0x00f9, 0x860d},
- /* 248 */ {0x00f1, 0x860e},
- /* 249 */ {0x00e3, 0x860f},
- /* 250 */ {0x002c, 0x8610},
- /* 251 */ {0x006c, 0x8651},
- /* 252 */ {0x0041, 0x8652},
- /* 253 */ {0x0059, 0x8653},
- /* 254 */ {0x0040, 0x8654},
- /* 255 */ {0x00fa, 0x8611},
- /* 256 */ {0x00ff, 0x8612},
- /* 257 */ {0x00f8, 0x8613},
- /* 258 */ {0x0000, 0x8614},
- /* 259 */ {0x0001, 0x863f},
- /* 260 */ {0x0000, 0x8640},
- /* 261 */ {0x0026, 0x8641},
- /* 262 */ {0x0045, 0x8642},
- /* 263 */ {0x0060, 0x8643},
- /* 264 */ {0x0075, 0x8644},
- /* 265 */ {0x0088, 0x8645},
- /* 266 */ {0x009b, 0x8646},
- /* 267 */ {0x00b0, 0x8647},
- /* 268 */ {0x00c5, 0x8648},
- /* 269 */ {0x00d2, 0x8649},
- /* 270 */ {0x00dc, 0x864a},
- /* 271 */ {0x00e5, 0x864b},
- /* 272 */ {0x00eb, 0x864c},
- /* 273 */ {0x00f0, 0x864d},
- /* 274 */ {0x00f6, 0x864e},
- /* 275 */ {0x00fa, 0x864f},
- /* 276 */ {0x00ff, 0x8650},
- /* 277 */ {0x0060, 0x8657},
- /* 278 */ {0x0010, 0x8658},
- /* 279 */ {0x0018, 0x8659},
- /* 280 */ {0x0005, 0x865a},
- /* 281 */ {0x0018, 0x8660},
- /* 282 */ {0x0003, 0x8509},
- /* 283 */ {0x0011, 0x850a},
- /* 284 */ {0x0032, 0x850b},
- /* 285 */ {0x0010, 0x850c},
- /* 286 */ {0x0021, 0x850d},
- /* 287 */ {0x0001, 0x8500},
- /* 288 */ {0x0000, 0x8508},
- /* 289 */ {0x0012, 0x8608},
- /* 290 */ {0x002c, 0x8609},
- /* 291 */ {0x0002, 0x860a},
- /* 292 */ {0x0039, 0x860b},
- /* 293 */ {0x00d0, 0x860c},
- /* 294 */ {0x00f7, 0x860d},
- /* 295 */ {0x00ed, 0x860e},
- /* 296 */ {0x00db, 0x860f},
- /* 297 */ {0x0039, 0x8610},
- /* 298 */ {0x0012, 0x8657},
- /* 299 */ {0x000c, 0x8619},
- /* 300 */ {0x0004, 0x861a},
- /* 301 */ {0x00a1, 0x8656},
- /* 302 */ {0x00c8, 0x8615},
- /* 303 */ {0x0032, 0x8616},
- /* 306 */ {0x0030, 0x8112},
- /* 313 */ {0x0020, 0x8112},
- /* 314 */ {0x0020, 0x8112},
- /* 315 */ {0x000f, 0x8402},
- /* 316 */ {0x0000, 0x8403},
- /* 317 */ {0x0090, 0x8110},
- /* 318 */ {0x0001, 0x8114},
- /* 319 */ {0x0001, 0x8114},
- /* 320 */ {0x0001, 0x8114},
- /* 321 */ {0x0003, 0x8114},
- /* 322 */ {0x0080, 0x8804},
- /* 355 */ {0x0003, 0x8801},
- /* 356 */ {0x0012, 0x8800},
- /* 358 */ {0x0004, 0x8801},
- /* 359 */ {0x0005, 0x8800},
- /* 361 */ {0x0005, 0x8801},
- /* 362 */ {0x0047, 0x8800},
- /* 364 */ {0x0006, 0x8801},
- /* 365 */ {0x0000, 0x8800},
- /* 367 */ {0x0007, 0x8801},
- /* 368 */ {0x00c0, 0x8800},
- /* 370 */ {0x0008, 0x8801},
- /* 371 */ {0x0003, 0x8800},
- /* 373 */ {0x000a, 0x8700},
- /* 374 */ {0x000e, 0x8801},
- /* 375 */ {0x0004, 0x8800},
- /* 377 */ {0x0005, 0x8801},
- /* 378 */ {0x0047, 0x8800},
- /* 380 */ {0x0006, 0x8801},
- /* 381 */ {0x0000, 0x8800},
- /* 383 */ {0x0007, 0x8801},
- /* 384 */ {0x00c0, 0x8800},
- /* 386 */ {0x0008, 0x8801},
- /* 387 */ {0x0003, 0x8800},
- /* 389 */ {0x0013, 0x8801},
- /* 390 */ {0x0001, 0x8800},
- /* 392 */ {0x0009, 0x8801},
- /* 393 */ {0x0000, 0x8800},
- /* 395 */ {0x000a, 0x8801},
- /* 396 */ {0x0000, 0x8800},
- /* 398 */ {0x000b, 0x8801},
- /* 399 */ {0x0000, 0x8800},
- /* 401 */ {0x000c, 0x8801},
- /* 402 */ {0x0000, 0x8800},
- /* 404 */ {0x000e, 0x8801},
- /* 405 */ {0x0004, 0x8800},
- /* 407 */ {0x000f, 0x8801},
- /* 408 */ {0x0000, 0x8800},
- /* 410 */ {0x0010, 0x8801},
- /* 411 */ {0x0006, 0x8800},
- /* 413 */ {0x0011, 0x8801},
- /* 414 */ {0x0006, 0x8800},
- /* 416 */ {0x0012, 0x8801},
- /* 417 */ {0x0000, 0x8800},
- /* 419 */ {0x0013, 0x8801},
- /* 420 */ {0x0001, 0x8800},
- /* 422 */ {0x000a, 0x8700},
- /* 423 */ {0x0000, 0x8702},
- /* 424 */ {0x0000, 0x8703},
- /* 425 */ {0x00c2, 0x8704},
- /* 426 */ {0x0001, 0x870c},
- /* 427 */ {0x0044, 0x8600},
- /* 428 */ {0x0002, 0x8606},
- /* 429 */ {0x0064, 0x8607},
- /* 430 */ {0x003a, 0x8601},
- /* 431 */ {0x0008, 0x8602},
- /* 432 */ {0x0044, 0x8600},
- /* 433 */ {0x0018, 0x8617},
- /* 434 */ {0x0008, 0x8618},
- /* 435 */ {0x00a1, 0x8656},
- /* 436 */ {0x0004, 0x865b},
- /* 437 */ {0x0002, 0x865c},
- /* 438 */ {0x0058, 0x865d},
- /* 439 */ {0x0048, 0x865e},
- /* 440 */ {0x0012, 0x8608},
- /* 441 */ {0x002c, 0x8609},
- /* 442 */ {0x0002, 0x860a},
- /* 443 */ {0x002c, 0x860b},
- /* 444 */ {0x00db, 0x860c},
- /* 445 */ {0x00f9, 0x860d},
- /* 446 */ {0x00f1, 0x860e},
- /* 447 */ {0x00e3, 0x860f},
- /* 448 */ {0x002c, 0x8610},
- /* 449 */ {0x006c, 0x8651},
- /* 450 */ {0x0041, 0x8652},
- /* 451 */ {0x0059, 0x8653},
- /* 452 */ {0x0040, 0x8654},
- /* 453 */ {0x00fa, 0x8611},
- /* 454 */ {0x00ff, 0x8612},
- /* 455 */ {0x00f8, 0x8613},
- /* 456 */ {0x0000, 0x8614},
- /* 457 */ {0x0001, 0x863f},
- /* 458 */ {0x0000, 0x8640},
- /* 459 */ {0x0026, 0x8641},
- /* 460 */ {0x0045, 0x8642},
- /* 461 */ {0x0060, 0x8643},
- /* 462 */ {0x0075, 0x8644},
- /* 463 */ {0x0088, 0x8645},
- /* 464 */ {0x009b, 0x8646},
- /* 465 */ {0x00b0, 0x8647},
- /* 466 */ {0x00c5, 0x8648},
- /* 467 */ {0x00d2, 0x8649},
- /* 468 */ {0x00dc, 0x864a},
- /* 469 */ {0x00e5, 0x864b},
- /* 470 */ {0x00eb, 0x864c},
- /* 471 */ {0x00f0, 0x864d},
- /* 472 */ {0x00f6, 0x864e},
- /* 473 */ {0x00fa, 0x864f},
- /* 474 */ {0x00ff, 0x8650},
- /* 475 */ {0x0060, 0x8657},
- /* 476 */ {0x0010, 0x8658},
- /* 477 */ {0x0018, 0x8659},
- /* 478 */ {0x0005, 0x865a},
- /* 479 */ {0x0018, 0x8660},
- /* 480 */ {0x0003, 0x8509},
- /* 481 */ {0x0011, 0x850a},
- /* 482 */ {0x0032, 0x850b},
- /* 483 */ {0x0010, 0x850c},
- /* 484 */ {0x0021, 0x850d},
- /* 485 */ {0x0001, 0x8500},
- /* 486 */ {0x0000, 0x8508},
- /* 487 */ {0x0012, 0x8608},
- /* 488 */ {0x002c, 0x8609},
- /* 489 */ {0x0002, 0x860a},
- /* 490 */ {0x0039, 0x860b},
- /* 491 */ {0x00d0, 0x860c},
- /* 492 */ {0x00f7, 0x860d},
- /* 493 */ {0x00ed, 0x860e},
- /* 494 */ {0x00db, 0x860f},
- /* 495 */ {0x0039, 0x8610},
- /* 496 */ {0x0012, 0x8657},
- /* 497 */ {0x0064, 0x8619},
- /* This line starts it all, it is not needed here */
- /* since it has been build into the driver */
- /* jfm: don't start now */
- /* 590 * {0x0030, 0x8112}, */
- {}
- };
- /*
- * Initialization data for Creative Webcam Vista
- */
- static const __u16 spca508_vista_init_data[][3] = {
- {0x0008, 0x8200}, /* Clear register */
- {0x0000, 0x870b}, /* Reset CTL3 */
- {0x0020, 0x8112}, /* Video Drop packet enable */
- {0x0003, 0x8111}, /* Soft Reset compression, memory, TG & CDSP */
- {0x0000, 0x8110}, /* Disable everything */
- {0x0000, 0x8114}, /* Software GPIO output data */
- {0x0000, 0x8114},
- {0x0003, 0x8111},
- {0x0000, 0x8111},
- {0x0090, 0x8110}, /* Enable: SSI output, External 2X clock output */
- {0x0020, 0x8112},
- {0x0000, 0x8114},
- {0x0001, 0x8114},
- {0x0001, 0x8114},
- {0x0001, 0x8114},
- {0x0003, 0x8114},
- {0x000f, 0x8402}, /* Memory bank Address */
- {0x0000, 0x8403}, /* Memory bank Address */
- {0x00ba, 0x8804}, /* SSI Slave address */
- {0x0010, 0x8802}, /* 93.75kHz SSI Clock Two DataByte */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802}, /* Will write 2 bytes (DATA1+DATA2) */
- {0x0020, 0x8801}, /* Register address for SSI read/write */
- {0x0044, 0x8805}, /* DATA2 */
- {0x0004, 0x8800}, /* DATA1 -> write triggered */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0009, 0x8801},
- {0x0042, 0x8805},
- {0x0001, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x003c, 0x8801},
- {0x0001, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0001, 0x8801},
- {0x000a, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0002, 0x8801},
- {0x0000, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0003, 0x8801},
- {0x0027, 0x8805},
- {0x0001, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0004, 0x8801},
- {0x0065, 0x8805},
- {0x0001, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0005, 0x8801},
- {0x0003, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0006, 0x8801},
- {0x001c, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0007, 0x8801},
- {0x002a, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x000e, 0x8801},
- {0x0000, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0028, 0x8801},
- {0x002e, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0039, 0x8801},
- {0x0013, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x003b, 0x8801},
- {0x000c, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0035, 0x8801},
- {0x0028, 0x8805},
- {0x0000, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- /* READ { 0, 0x0001, 0x8802 } ->
- 0000: 10 */
- {0x0010, 0x8802},
- {0x0009, 0x8801},
- {0x0042, 0x8805},
- {0x0001, 0x8800},
- /* READ { 0, 0x0001, 0x8803 } ->
- 0000: 00 */
- {0x0050, 0x8703},
- {0x0002, 0x8704}, /* External input CKIx1 */
- {0x0001, 0x870C}, /* Select CKOx2 output */
- {0x009A, 0x8600}, /* Line memory Read Counter (L) */
- {0x0001, 0x8606}, /* 1 Line memory Read Counter (H) Result: (d)410 */
- {0x0023, 0x8601},
- {0x0010, 0x8602},
- {0x000A, 0x8603},
- {0x009A, 0x8600},
- {0x0001, 0x865B}, /* 1 Horizontal Offset for Valid Pixel(L) */
- {0x0003, 0x865C}, /* Vertical offset for valid lines (L) */
- {0x0058, 0x865D}, /* Horizontal valid pixels window (L) */
- {0x0048, 0x865E}, /* Vertical valid lines window (L) */
- {0x0000, 0x865F},
- {0x0006, 0x8660},
- /* Enable nibble data input, select nibble input order */
- {0x0013, 0x8608}, /* A11 Coeficients for color correction */
- {0x0028, 0x8609},
- /* Note: these values are confirmed at the end of array */
- {0x0005, 0x860A}, /* ... */
- {0x0025, 0x860B},
- {0x00E1, 0x860C},
- {0x00FA, 0x860D},
- {0x00F4, 0x860E},
- {0x00E8, 0x860F},
- {0x0025, 0x8610}, /* A33 Coef. */
- {0x00FC, 0x8611}, /* White balance offset: R */
- {0x0001, 0x8612}, /* White balance offset: Gr */
- {0x00FE, 0x8613}, /* White balance offset: B */
- {0x0000, 0x8614}, /* White balance offset: Gb */
- {0x0064, 0x8651}, /* R gain for white balance (L) */
- {0x0040, 0x8652}, /* Gr gain for white balance (L) */
- {0x0066, 0x8653}, /* B gain for white balance (L) */
- {0x0040, 0x8654}, /* Gb gain for white balance (L) */
- {0x0001, 0x863F}, /* Enable fixed gamma correction */
- {0x00A1, 0x8656}, /* Size - Window1: 256x256, Window2: 128x128 */
- /* UV division: UV no change, Enable New edge enhancement */
- {0x0018, 0x8657}, /* Edge gain high threshold */
- {0x0020, 0x8658}, /* Edge gain low threshold */
- {0x000A, 0x8659}, /* Edge bandwidth high threshold */
- {0x0005, 0x865A}, /* Edge bandwidth low threshold */
- {0x0064, 0x8607}, /* UV filter enable */
- {0x0016, 0x8660},
- {0x0000, 0x86B0}, /* Bad pixels compensation address */
- {0x00DC, 0x86B1}, /* X coord for bad pixels compensation (L) */
- {0x0000, 0x86B2},
- {0x0009, 0x86B3}, /* Y coord for bad pixels compensation (L) */
- {0x0000, 0x86B4},
- {0x0001, 0x86B0},
- {0x00F5, 0x86B1},
- {0x0000, 0x86B2},
- {0x00C6, 0x86B3},
- {0x0000, 0x86B4},
- {0x0002, 0x86B0},
- {0x001C, 0x86B1},
- {0x0001, 0x86B2},
- {0x00D7, 0x86B3},
- {0x0000, 0x86B4},
- {0x0003, 0x86B0},
- {0x001C, 0x86B1},
- {0x0001, 0x86B2},
- {0x00D8, 0x86B3},
- {0x0000, 0x86B4},
- {0x0004, 0x86B0},
- {0x001D, 0x86B1},
- {0x0001, 0x86B2},
- {0x00D8, 0x86B3},
- {0x0000, 0x86B4},
- {0x001E, 0x8660},
- /* READ { 0, 0x0000, 0x8608 } ->
- 0000: 13 */
- /* READ { 0, 0x0000, 0x8609 } ->
- 0000: 28 */
- /* READ { 0, 0x0000, 0x8610 } ->
- 0000: 05 */
- /* READ { 0, 0x0000, 0x8611 } ->
- 0000: 25 */
- /* READ { 0, 0x0000, 0x8612 } ->
- 0000: e1 */
- /* READ { 0, 0x0000, 0x8613 } ->
- 0000: fa */
- /* READ { 0, 0x0000, 0x8614 } ->
- 0000: f4 */
- /* READ { 0, 0x0000, 0x8615 } ->
- 0000: e8 */
- /* READ { 0, 0x0000, 0x8616 } ->
- 0000: 25 */
- {}
- };
- static int reg_write(struct usb_device *dev,
- __u16 index, __u16 value)
- {
- int ret;
- ret = usb_control_msg(dev,
- usb_sndctrlpipe(dev, 0),
- 0, /* request */
- USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- value, index, NULL, 0, 500);
- PDEBUG(D_USBO, "reg write i:0x%04x = 0x%02x",
- index, value);
- if (ret < 0)
- PDEBUG(D_ERR|D_USBO, "reg write: error %d", ret);
- return ret;
- }
- /* read 1 byte */
- /* returns: negative is error, pos or zero is data */
- static int reg_read(struct usb_device *dev,
- __u16 index) /* wIndex */
- {
- int ret;
- __u8 data;
- ret = usb_control_msg(dev,
- usb_rcvctrlpipe(dev, 0),
- 0, /* register */
- USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
- (__u16) 0, /* value */
- index,
- &data, 1,
- 500); /* timeout */
- PDEBUG(D_USBI, "reg read i:%04x --> %02x", index, data);
- if (ret < 0) {
- PDEBUG(D_ERR|D_USBI, "reg_read err %d", ret);
- return ret;
- }
- return data;
- }
- static int write_vector(struct gspca_dev *gspca_dev,
- const __u16 data[][3])
- {
- struct usb_device *dev = gspca_dev->dev;
- int ret, i = 0;
- while (data[i][1] != 0) {
- ret = reg_write(dev, data[i][1], data[i][0]);
- if (ret < 0)
- return ret;
- i++;
- }
- return 0;
- }
- /* this function is called at probe time */
- static int sd_config(struct gspca_dev *gspca_dev,
- const struct usb_device_id *id)
- {
- struct sd *sd = (struct sd *) gspca_dev;
- struct usb_device *dev = gspca_dev->dev;
- struct cam *cam;
- __u16 vendor;
- __u16 product;
- int data1, data2;
- vendor = id->idVendor;
- product = id->idProduct;
- switch (vendor) {
- case 0x0130: /* Clone webcam */
- /* switch (product) { */
- /* case 0x0130: */
- sd->subtype = HamaUSBSightcam; /* same as Hama 0010 */
- /* break; */
- /* } */
- break;
- case 0x041e: /* Creative cameras */
- /* switch (product) { */
- /* case 0x4018: */
- sd->subtype = CreativeVista;
- /* break; */
- /* } */
- break;
- case 0x0461: /* MicroInnovation */
- /* switch (product) { */
- /* case 0x0815: */
- sd->subtype = MicroInnovationIC200;
- /* break; */
- /* } */
- break;
- case 0x0733: /* Rebadged ViewQuest (Intel) and ViewQuest cameras */
- /* switch (product) { */
- /* case 0x110: */
- sd->subtype = ViewQuestVQ110;
- /* break; */
- /* } */
- break;
- case 0x0af9: /* Hama cameras */
- switch (product) {
- case 0x0010:
- sd->subtype = HamaUSBSightcam;
- break;
- case 0x0011:
- sd->subtype = HamaUSBSightcam2;
- break;
- }
- break;
- case 0x8086: /* Intel */
- /* switch (product) { */
- /* case 0x0110: */
- sd->subtype = IntelEasyPCCamera;
- /* break; */
- /* } */
- break;
- }
- /* Read from global register the USB product and vendor IDs, just to
- * prove that we can communicate with the device. This works, which
- * confirms at we are communicating properly and that the device
- * is a 508. */
- data1 = reg_read(dev, 0x8104);
- data2 = reg_read(dev, 0x8105);
- PDEBUG(D_PROBE, "Webcam Vendor ID: 0x%02x%02x", data2, data1);
- data1 = reg_read(dev, 0x8106);
- data2 = reg_read(dev, 0x8107);
- PDEBUG(D_PROBE, "Webcam Product ID: 0x%02x%02x", data2, data1);
- data1 = reg_read(dev, 0x8621);
- PDEBUG(D_PROBE, "Window 1 average luminance: %d", data1);
- cam = &gspca_dev->cam;
- cam->dev_name = (char *) id->driver_info;
- cam->epaddr = 0x01;
- cam->cam_mode = sif_mode;
- cam->nmodes = ARRAY_SIZE(sif_mode);
- sd->brightness = BRIGHTNESS_DEF;
- switch (sd->subtype) {
- case ViewQuestVQ110:
- if (write_vector(gspca_dev, spca508_init_data))
- return -1;
- break;
- default:
- /* case MicroInnovationIC200: */
- /* case IntelEasyPCCamera: */
- if (write_vector(gspca_dev, spca508cs110_init_data))
- return -1;
- break;
- case HamaUSBSightcam:
- if (write_vector(gspca_dev, spca508_sightcam_init_data))
- return -1;
- break;
- case HamaUSBSightcam2:
- if (write_vector(gspca_dev, spca508_sightcam2_init_data))
- return -1;
- break;
- case CreativeVista:
- if (write_vector(gspca_dev, spca508_vista_init_data))
- return -1;
- break;
- }
- return 0; /* success */
- }
- /* this function is called at open time */
- static int sd_open(struct gspca_dev *gspca_dev)
- {
- /* write_vector(gspca_dev, spca508_open_data); */
- return 0;
- }
- static void sd_start(struct gspca_dev *gspca_dev)
- {
- int mode;
- mode = gspca_dev->cam.cam_mode[(int) gspca_dev->curr_mode].priv;
- reg_write(gspca_dev->dev, 0x8500, mode);
- switch (mode) {
- case 0:
- case 1:
- reg_write(gspca_dev->dev, 0x8700, 0x28); /* clock */
- break;
- default:
- /* case 2: */
- /* case 3: */
- reg_write(gspca_dev->dev, 0x8700, 0x23); /* clock */
- break;
- }
- reg_write(gspca_dev->dev, 0x8112, 0x10 | 0x20);
- }
- static void sd_stopN(struct gspca_dev *gspca_dev)
- {
- /* Video ISO disable, Video Drop Packet enable: */
- reg_write(gspca_dev->dev, 0x8112, 0x20);
- }
- static void sd_stop0(struct gspca_dev *gspca_dev)
- {
- }
- /* this function is called at close time */
- static void sd_close(struct gspca_dev *gspca_dev)
- {
- }
- /* convert YUVY per line to YUYV (YUV 4:2:2) */
- static void yuvy_decode(unsigned char *out,
- unsigned char *in,
- int width,
- int height)
- {
- unsigned char *Ui, *Vi, *yi, *yi1;
- unsigned char *out1;
- int i, j;
- yi = in;
- for (i = height / 2; --i >= 0; ) {
- out1 = out + width * 2; /* next line */
- Ui = yi + width;
- Vi = Ui + width / 2;
- yi1 = Vi + width / 2;
- for (j = width / 2; --j >= 0; ) {
- *out++ = 128 + *yi++;
- *out++ = 128 + *Ui;
- *out++ = 128 + *yi++;
- *out++ = 128 + *Vi;
- *out1++ = 128 + *yi1++;
- *out1++ = 128 + *Ui++;
- *out1++ = 128 + *yi1++;
- *out1++ = 128 + *Vi++;
- }
- yi += width * 2;
- out = out1;
- }
- }
- static void sd_pkt_scan(struct gspca_dev *gspca_dev,
- struct gspca_frame *frame, /* target */
- __u8 *data, /* isoc packet */
- int len) /* iso packet length */
- {
- struct sd *sd = (struct sd *) gspca_dev;
- switch (data[0]) {
- case 0: /* start of frame */
- if (gspca_dev->last_packet_type == FIRST_PACKET) {
- yuvy_decode(sd->tmpbuf2, sd->tmpbuf,
- gspca_dev->width,
- gspca_dev->height);
- frame = gspca_frame_add(gspca_dev,
- LAST_PACKET,
- frame,
- sd->tmpbuf2,
- gspca_dev->width
- * gspca_dev->height
- * 2);
- }
- gspca_frame_add(gspca_dev, FIRST_PACKET, frame,
- data, 0);
- data += SPCA508_OFFSET_DATA;
- len -= SPCA508_OFFSET_DATA;
- if (len > 0)
- memcpy(sd->tmpbuf, data, len);
- else
- len = 0;
- sd->buflen = len;
- return;
- case 0xff: /* drop */
- /* gspca_dev->last_packet_type = DISCARD_PACKET; */
- return;
- }
- data += 1;
- len -= 1;
- memcpy(&sd->tmpbuf[sd->buflen], data, len);
- sd->buflen += len;
- }
- static void setbrightness(struct gspca_dev *gspca_dev)
- {
- struct sd *sd = (struct sd *) gspca_dev;
- __u8 brightness = sd->brightness;
- /* MX seem contrast */
- reg_write(gspca_dev->dev, 0x8651, brightness);
- reg_write(gspca_dev->dev, 0x8652, brightness);
- reg_write(gspca_dev->dev, 0x8653, brightness);
- reg_write(gspca_dev->dev, 0x8654, brightness);
- }
- static void getbrightness(struct gspca_dev *gspca_dev)
- {
- struct sd *sd = (struct sd *) gspca_dev;
- sd->brightness = reg_read(gspca_dev->dev, 0x8651);
- }
- static int sd_setbrightness(struct gspca_dev *gspca_dev, __s32 val)
- {
- struct sd *sd = (struct sd *) gspca_dev;
- sd->brightness = val;
- if (gspca_dev->streaming)
- setbrightness(gspca_dev);
- return 0;
- }
- static int sd_getbrightness(struct gspca_dev *gspca_dev, __s32 *val)
- {
- struct sd *sd = (struct sd *) gspca_dev;
- getbrightness(gspca_dev);
- *val = sd->brightness;
- return 0;
- }
- /* sub-driver description */
- static const struct sd_desc sd_desc = {
- .name = MODULE_NAME,
- .ctrls = sd_ctrls,
- .nctrls = ARRAY_SIZE(sd_ctrls),
- .config = sd_config,
- .open = sd_open,
- .start = sd_start,
- .stopN = sd_stopN,
- .stop0 = sd_stop0,
- .close = sd_close,
- .pkt_scan = sd_pkt_scan,
- };
- /* -- module initialisation -- */
- #define DVNM(name) .driver_info = (kernel_ulong_t) name
- static const __devinitdata struct usb_device_id device_table[] = {
- {USB_DEVICE(0x0130, 0x0130), DVNM("Clone Digital Webcam 11043")},
- {USB_DEVICE(0x041e, 0x4018), DVNM("Creative Webcam Vista (PD1100)")},
- {USB_DEVICE(0x0461, 0x0815), DVNM("Micro Innovation IC200")},
- {USB_DEVICE(0x0733, 0x0110), DVNM("ViewQuest VQ110")},
- {USB_DEVICE(0x0af9, 0x0010), DVNM("Hama USB Sightcam 100")},
- {USB_DEVICE(0x0af9, 0x0011), DVNM("Hama USB Sightcam 100")},
- {USB_DEVICE(0x8086, 0x0110), DVNM("Intel Easy PC Camera")},
- {}
- };
- MODULE_DEVICE_TABLE(usb, device_table);
- /* -- device connect -- */
- static int sd_probe(struct usb_interface *intf,
- const struct usb_device_id *id)
- {
- return gspca_dev_probe(intf, id, &sd_desc, sizeof(struct sd),
- THIS_MODULE);
- }
- static struct usb_driver sd_driver = {
- .name = MODULE_NAME,
- .id_table = device_table,
- .probe = sd_probe,
- .disconnect = gspca_disconnect,
- };
- /* -- module insert / remove -- */
- static int __init sd_mod_init(void)
- {
- if (usb_register(&sd_driver) < 0)
- return -1;
- PDEBUG(D_PROBE, "v%s registered", version);
- return 0;
- }
- static void __exit sd_mod_exit(void)
- {
- usb_deregister(&sd_driver);
- PDEBUG(D_PROBE, "deregistered");
- }
- module_init(sd_mod_init);
- module_exit(sd_mod_exit);
|