Matrox Meteor II cards
The Matrox Meteor II consists of the custom Matrox VIA (Video Interface ASIC) which connects to the PCI bus.
There are different models:
Matrox Meteor-II (aka Matrox Meteor II/Standard) Part Numbers: METEOR2/4 : PCI MET2-C/4 : CompactPCI MET2+/4 : PC/104-Plus Matrox Meteor-II/1394, Part Number: METEOR2-1394 Matrox Meteor-II/MC (aka Matrox Meteor-II/Multi Channel) Part Numbers: METEOR2-MC/4C : PCI MET2-C-MC : CompactPCI MET2-MC+/4 : PC/104-Plu Matrox Meteor-II/DIG (aka Matrox Meteor-II/Digital) Part Numbers METEOR2-DIG/4/R : PCI, RS-422 digital (METEOR2DIG64R ?) METEOR2-DIG/4/L : PCI, LVDS digital MET2-DIG+/R : PC/104-Plus, RS-422 (METEOR2DIG64L ?) MET2-DIG+/L : PC/104-Plus, LVDS Matrox Meteor-II/CL (aka Matrox Meteor-II/Camera Link), Part Number METEOR2-CL/32
Note 1: The Meteor II is the successor of the Meteor, Meteor/RGB, Meteor/PPB, and Meteor/RGB/PPB boards. Matrox Meteor comes in four versions: Matrox Meteor, a standard monochrome and color frame grabber. Matrox Meteor/PPB, a standard monochrome and color frame grabber with an integrated PCI-to-PCI bridge. Matrox Meteor/RGB, an RGB color frame grabber. Matrox Meteor/PPB/RGB, an RGB color frame grabber with an integrated PCI-to-PCI bridge. The "PPB" boards were introduced to address compatibility problems with chipsets on early Pentium PRO motherboards.
Note 2: There is also a card called Meteor-II/Display, but this is not a framgrabber !!! MET2-C-DISP/AD Graphics adapter for CompactPCI with one analog VGA and one digital VGA (DVI) output MET2-C-DISP/A24 Graphics adapter for CompactPCI with two analog VGA outputs MET2-C-DISP/D24 Graphics adapter for CompactPCI with two digital VGA (DVI) outputs
Revisions of Matrox Meteor-II/Standard
Board Version Description Matrox Meteor-II/Standard for PCI 750-00 rev. A Original version. 750-01 rev. A No functional change. 750-02 rev. A Added expansion connectors, moved up from 4 to 7 inputs. 750-02 rev. B No functional change. 750-0201 rev. A Support for KS0127 rev. B video decoder, and moved up from 7 to 12 inputs. Note that MJPEG module support has been removed for some boards with this revision number. This is due to the discontinuation of this module. Matrox Meteor-II/Standard for CompactPCI 807-00 rev. A Original version. 807-00 rev. B No functional changes. 807-0001 rev. A Support for KS0127 rev. B video decoder. Note that MJPEG module support has been removed for some boards with this revision number. This is due to the discontinuation of this module. Matrox Meteor-II/Standard for PC/104-Plus 885-00 rev. A Original version. 885-00 rev. B No functional change. 885-00 rev. C No functional change. 885-0001 rev. A Support for KS0127 rev. B video decoder. 885-01 rev. A Replaced expansion connectors (for 896-01). Note that MJPEG module support has been removed for some boards with this revision number. This is due to the discontinuation of this module.
Revisions of Matrox Meteor-II /Multi-Channel
Board Version Description Matrox Meteor-II/Multi-Channel for PCI 751-00 rev. A Original version. 751-01 rev. A No functional change. 751-02 rev. A No functional change. 751-0201 rev. A No functional change. Note that MJPEG module support has been removed for some boards with this revision number. This is due to the discontinuation of this module. 751-03 rev. A VMChannel removed. MJPEG module support removed for all boards. Board now fits in a half-length PCI slot. 751-0301 rev. A No functional change. Matrox Meteor-II/Multi-Channel for PC/104-Plus 886-00 rev. A Original version. 886-00 rev. B No functional change. 886-01 rev. A Replaced expansion connectors (for 896-01). Note that MJPEG module support has been removed for some boards with this revision number. This is due to the discountinuation of this module.
Revisions of Matrox Meteor-II /Digital
Board Version Description Matrox Meteor-II/Digital for PCI 752-00 rev. A Original version. 752-01 rev. A No functional change. 752-02 rev. A No functional change. Matrox Meteor-II/Digital for PC/104-Plus 7035-01 rev. A Original version
User experience
I have what I think is a Matrox Meteor II Multichannel card. I have had no luck getting it to work with v4l2, but here's how far I have gotten, in case it helps anyone out.
lspci
gives:
... 0000:03:01.0 ff00: Matrox Graphics, Inc. VIA Framegrabber ...
lspci -n
gives:
... 0000:03:01.0 ff00: 102b:4536 ...
In order from **oldest** to **newest** here are relevant driver projects that I found. None have been updated in the last year.
- K-Team driver project (2002)
- Emlix driver project (2003)
- Marcus Furlong's Sourceforge driver project (2005)
The best I was able to do (as of Apr 26 2006) was:
(1) Download the latest version from the Sourceforge project CVS:
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/meteor2mc login cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/meteor2mc co meteor2mc
(2) Made some changes. My changes are contained in the following patch, produced by diff -u:
diff -u meteor2mc/Makefile meteor2mcMe/Makefile --- meteor2mc/Makefile 2005-03-10 19:16:31.000000000 -0800 +++ meteor2mcMe/Makefile 2006-04-26 01:29:29.000000000 -0700 @@ -20,7 +20,7 @@ ############################################################################## obj-y := -obj-m := $(MOD_NAME).o +obj-m := via-init.o via-io.o $(MOD_NAME).o export-objs := list-multi := $(MOD_NAME).o Common subdirectories: meteor2mc/utils and meteor2mcMe/utils diff -u meteor2mc/via-io.c meteor2mcMe/via-io.c --- meteor2mc/via-io.c 2004-04-18 04:13:11.000000000 -0700 +++ meteor2mcMe/via-io.c 2006-04-26 01:30:27.000000000 -0700 @@ -117,7 +117,7 @@ /* merge bits from insert into master (according to bitmask) */ -static inline u32 +static u32 merge_data (u32 master, u32 insert, u32 bitmask) { #if 0 @@ -133,7 +133,7 @@ /* returns index of reg in list ([0,...]) or REG_NOT_FOUND */ -static inline int +static int get_list_index (const struct io_reg_list *list, u32 reg) { int i = 0; @@ -154,7 +154,7 @@ /* returns index of reg in list ([0,...]) or REG_NOT_FOUND */ -static inline int +static int get_bitmask (const struct io_reg_list *list, u32 reg, u32 *bitmask) { int idx; @@ -191,7 +191,7 @@ #ifdef NEW_REG_HANDLING -inline void + void via_write (struct via_card *card, unsigned reg, u32 val) { int idx; @@ -202,7 +202,7 @@ writel (val, card->via_regs + reg); } -inline u32 + u32 via_read (const struct via_card *card, unsigned reg) { u32 val, bitmask; @@ -218,13 +218,13 @@ #else -inline void + void via_write (const struct via_card *card, unsigned reg, u32 val) { writel (val, card->via_regs + reg); } -inline u32 + u32 via_read (const struct via_card *card, unsigned reg) { return readl (card->via_regs + reg); @@ -239,13 +239,13 @@ /* ------------------------------------------------------------------- * external registers (8 bit, mapped as 64 bit resources) * ------------------------------------------------------------------- */ -inline void + void ext_write (const struct via_card *card, unsigned reg, u32 val) { writel ((val & VIA_BYTE), card->ext_regs + reg); } -inline u32 + u32 ext_read (const struct via_card *card, unsigned reg) { return (readl (card->ext_regs + reg) & VIA_BYTE); @@ -258,7 +258,7 @@ /* ------------------------------------------------------------------- * threshold registers (mapped as 32 bit resources) * ------------------------------------------------------------------- */ -inline void + void thr_write (const struct via_card *card, unsigned reg, u32 val) { writel (val, card->thr_regs + reg); @@ -281,7 +281,7 @@ #ifdef NEW_REG_HANDLING -inline void + void psg_write (struct via_card *card, unsigned reg, u32 val) { if (CHECK_PSG_REG (reg)) { @@ -299,7 +299,7 @@ return; } -inline u32 + u32 psg_read (struct via_card *card, unsigned reg) { u32 val, bitmask; @@ -326,7 +326,7 @@ #else /* NEW_REG_HANDLING */ -inline void + void psg_write (struct via_card *card, unsigned reg, u32 val) { if (CHECK_PSG_REG (reg)) { @@ -349,7 +349,7 @@ return; } -inline u32 + u32 psg_read (struct via_card *card, unsigned reg) { u32 tmp; @@ -380,7 +380,7 @@ * LUT registers (8 bit, mapped as 64 bit resources) * ------------------------------------------------------------------- */ -inline void + void lut_write (struct via_card *card, unsigned reg, u32 val) { if (CHECK_LUT_REG (reg)) { @@ -399,7 +399,7 @@ writel (val, card->lut_regs + reg); } -inline u32 + u32 lut_read (const struct via_card *card, unsigned reg) { if (CHECK_LUT_REG (reg)) { @@ -419,7 +419,7 @@ * ICS1522 registers * ------------------------------------------------------------------- */ -static inline void +static void ics1522_write_bit (struct via_card *card, unsigned select, u8 bit) { CLEAR_BIT (TMP_SERINT, (PSG_SERINT_SERSDATA | @@ -440,7 +440,7 @@ return; } -inline void + void ics1522_write (struct via_card *card, unsigned reg, u32 val) { int i; @@ -489,7 +489,7 @@ #ifdef TRY_TO_READ_FROM_ICS1522 -static inline u32 +static u32 ics1522_read_bit (struct via_card *card, unsigned state) { u32 tmp; @@ -515,7 +515,7 @@ return tmp & PSG_SERINT_SERSDATA; } -inline u32 + u32 ics1522_read (const struct via_card *card, unsigned reg) { u32 tmp, r, d; @@ -578,7 +578,7 @@ #else /* TRY_TO_READ_FROM_ICS1522 */ -inline u32 + u32 ics1522_read (const struct via_card *card, unsigned reg) { reg &= ICS1522_REG_MASK; @@ -604,13 +604,13 @@ /* * I2C bus between VIA and KS0127 */ -static inline void +static void via_i2c_write (struct via_card *card, unsigned reg, u32 val) { /* FIXME */ } -inline void +void ks0127_write (struct via_card *card, unsigned reg, u32 val) { via_i2c_write (card, reg, val); @@ -624,7 +624,7 @@ ks0127_write (card, KS0127_CMDD, card->regs.ks0127_cmdd); } -inline u32 + u32 ks0127_read (const struct via_card *card, unsigned reg) { /* FIXME */ @@ -640,7 +640,7 @@ * DAC8800 registers * ------------------------------------------------------------------- */ -static inline void +static void dac8800_write_bit (struct via_card *card, u8 set) { CLEAR_BIT (TMP_SERINT, (PSG_SERINT_SERSDATA | PSG_SERINT_SERSCLK)); @@ -658,7 +658,7 @@ BIT_DEBUG; } -inline void + void dac8800_write (struct via_card *card, unsigned reg, u32 val) { int i; @@ -781,7 +781,7 @@ } -inline u32 + u32 dac8800_read (struct via_card *card, unsigned reg) { if (CHECK_DAC8800_REG (reg)) { @@ -801,7 +801,7 @@ * DS1020 Delay line * ------------------------------------------------------------------- */ -static inline void +static void ds1020_write_bit (struct via_card *card, u8 set) { if (set) @@ -821,7 +821,7 @@ BIT_DEBUG; } -inline void + void ds1020_write (struct via_card *card, u32 val) { int i; @@ -853,7 +853,7 @@ } -inline u32 + u32 ds1020_read (struct via_card *card) { /* we can't read from hw, always use the shadow value */ diff -u meteor2mc/via-stream.c meteor2mcMe/via-stream.c --- meteor2mc/via-stream.c 2005-03-10 19:16:31.000000000 -0800 +++ meteor2mcMe/via-stream.c 2006-04-26 01:35:56.000000000 -0700 @@ -347,7 +347,9 @@ phys = card->himem_base + sbuf->vbuf.m.offset; via_debug(VIA_DBG_MMAP, "remapping 0x%lx bytes @ 0x%lx (phys)\n", size, phys); - if (io_remap_page_range(vma,vma->vm_start, phys, size, PAGE_SHARED /* vma->vm_page_prot */)) { + // BAYLE: changed based on http://www.4front-tech.com/forum/viewtopic.php?p=2225&sid=0ba0ebb50ad4bdfa68a3ef8d94ef40fa + // if (io_remap_page_range(vma,vma->vm_start, phys, size, PAGE_SHARED /* vma->vm_page_prot */)) { + if (remap_pfn_range(vma,vma->vm_start, (phys) >> PAGE_SHIFT, size, PAGE_SHARED /* vma->vm_page_prot */)) { via_error("io_remap_page_range() failed\n"); ret = -EAGAIN; goto err_out; diff -u meteor2mc/via.c meteor2mcMe/via.c --- meteor2mc/via.c 2005-03-10 19:16:31.000000000 -0800 +++ meteor2mcMe/via.c 2006-04-26 01:06:51.000000000 -0700 @@ -3272,7 +3272,7 @@ strcpy(cap->driver,card->vdev.name); strncpy(cap->card,card->vdev.name,sizeof(cap->card)); - sprintf(cap->bus_info,"PCI:%s",card->pdev->slot_name); + sprintf(cap->bus_info,"PCI:%s",card->pdev->dev.bus_id); cap->version = KERNEL_VERSION(1,1,10); cap->capabilities =V4L2_CAP_VIDEO_CAPTURE; return 0; diff -u meteor2mc/via.h meteor2mcMe/via.h --- meteor2mc/via.h 2005-03-10 18:29:07.000000000 -0800 +++ meteor2mcMe/via.h 2006-04-26 01:30:13.000000000 -0700 @@ -960,43 +960,43 @@ /* VIA registers (mapped as 64 bit resources) */ -extern inline void via_write (struct via_card *card, unsigned reg, u32 val); -extern inline u32 via_read (const struct via_card *card, unsigned reg); +extern void via_write (struct via_card *card, unsigned reg, u32 val); +extern u32 via_read (const struct via_card *card, unsigned reg); /* external registers (mapped as 64 bit resources) */ -extern inline void ext_write (const struct via_card *card, unsigned reg, +extern void ext_write (const struct via_card *card, unsigned reg, u32 val); -extern inline u32 ext_read (const struct via_card *card, unsigned reg); +extern u32 ext_read (const struct via_card *card, unsigned reg); /* threshold registers (mapped as 32 bit resources) */ -extern inline void thr_write (const struct via_card *card, unsigned reg, +extern void thr_write (const struct via_card *card, unsigned reg, u32 val); /* PSG registers (mapped as 64 bit resources) */ -extern inline void psg_write (struct via_card *card, unsigned reg, u32 val); -extern inline u32 psg_read (struct via_card *card, unsigned reg); +extern void psg_write (struct via_card *card, unsigned reg, u32 val); +extern u32 psg_read (struct via_card *card, unsigned reg); /* LUT registers (mapped as 64 bit resources) */ -extern inline void lut_write (struct via_card *card, unsigned reg, u32 val); -extern inline u32 lut_read (const struct via_card *card, unsigned reg); +extern void lut_write (struct via_card *card, unsigned reg, u32 val); +extern u32 lut_read (const struct via_card *card, unsigned reg); /* ICS1522 registers */ -extern inline void ics1522_write (struct via_card *card, unsigned reg, +extern void ics1522_write (struct via_card *card, unsigned reg, u32 val); -extern inline u32 ics1522_read (const struct via_card *card, unsigned reg); +extern u32 ics1522_read (const struct via_card *card, unsigned reg); /* KS0127 registers */ -extern inline void ks0127_write (struct via_card *card, unsigned reg, u32 val); -extern inline u32 ks0127_read (const struct via_card *card, unsigned reg); +extern void ks0127_write (struct via_card *card, unsigned reg, u32 val); +extern u32 ks0127_read (const struct via_card *card, unsigned reg); -extern inline void via_i2c_init (struct via_card *card); +extern void via_i2c_init (struct via_card *card); -extern inline u32 dac8800_read (struct via_card *card, unsigned reg); -extern inline void dac8800_write (struct via_card *card, unsigned reg, +extern u32 dac8800_read (struct via_card *card, unsigned reg); +extern void dac8800_write (struct via_card *card, unsigned reg, u32 val); -extern inline u32 ds1020_read (struct via_card *card); -extern inline void ds1020_write (struct via_card *card, u32 val); +extern u32 ds1020_read (struct via_card *card); +extern void ds1020_write (struct via_card *card, u32 val); /* via-init.c */ extern int via_init_all (struct via_card *card);
Basically, I made everything non-inline (there were recursive inline problems), changed io_remap_page_range to remap_pfn_range, changed card->pdev->slot_name to card->pdev->dev.bus_id, and modified the Makefile. Maybe I did something else too, I don't remember.
(3) Compiled on Debian with kernel linux-image-2.6.16-1-686 (and the matching kernel-headers package installed), and gcc-4.0.
(4) Tried "modprobe meteor2mc" which succeeded and left the following messages in dmsg
:
meteor2mc: Unknown symbol io_remap_page_range meteor2mc [via_module_init]: loading driver (dmask: 0x0, himem_offset 0, max_himem_mb: 16) videodev: "meteor2mc (#0)" has no release callback. Please fix your driver for proper sysfs support, see http://lwn.net/Articles/36850/ meteor2mc [via_v4l2_initialize]: initialize called meteor2mc [via_irq_init]: requested irq 5 and request_irq returned 0 meteor2mc [via_set_format]: unsupported color mode: 0 meteor2mc [via_set_channel]: FIXME: pcf_write (card, PCF8574_VIDSEL, 1) meteor2mc [via_v4l2_initialize]: initialize succeeded meteor2mc [via_module_init]: 1 Matrox VIA card(s) found. meteor2mc [via_module_init]: card 0: Meteor-II/Std, IRQ 5, minor 0, 480 kB himem @ 0x3f688000 (phys)
(5) So far so good. But v4l2ucp
fails with "/dev/video0 is not a V4L2 device". So it's not quite working yet.
xawtv
fails with
/dev/video0 [v4l]: ioctl VIDIOCGCAP: Invalid argument no video grabber device available
Please be aware that I am not a kernel guy and just hacked my way through this; I had no idea what I was doing, so it's possible that some of my patches weren't right.
--BayleShanks 11:24, 26 April 2006 (CEST)