Matrox Meteor II cards: Difference between revisions

From LinuxTVWiki
Jump to navigation Jump to search
(provide a bit of description; organize model and board revision stuff)
(move Bayle Shank's user experience to the talk page)
Line 70: Line 70:
Matrox Meteor/PPB/RGB, an RGB color frame grabber with an integrated PCI-to-PCI bridge.
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.
The "PPB" boards were introduced to address compatibility problems with chipsets on early Pentium PRO motherboards.

== 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.
<code>lspci</code> gives:

<pre>
...
0000:03:01.0 ff00: Matrox Graphics, Inc. VIA Framegrabber
...
</pre>

<code>lspci -n</code> gives:

<pre>
...
0000:03:01.0 ff00: 102b:4536
...
</pre>



In order from **oldest** to **newest** here are relevant driver projects that I found. None have been updated in the last year.
In order from **oldest** to **newest** here are relevant driver projects that I found. None have been updated in the last year.
Line 96: Line 76:
* [http://www.emlix.com/index.php?id=158 Emlix driver project] (2003)
* [http://www.emlix.com/index.php?id=158 Emlix driver project] (2003)
* Marcus Furlong's [http://meteor2mc.sourceforge.net/ Sourceforge driver project] (2005)
* Marcus Furlong's [http://meteor2mc.sourceforge.net/ 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:

<pre>
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/meteor2mc login
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/meteor2mc co meteor2mc
</pre>

(2) Made some changes. My changes are contained in the following patch, produced by diff -u:

<pre>
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);
</pre>

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 <code>dmsg</code>:

<pre>
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)
</pre>

(5) So far so good. But <code>v4l2ucp</code> fails with "/dev/video0 is not a V4L2 device". So it's not quite working yet.

<code>xawtv</code> fails with

<pre>
/dev/video0 [v4l]: ioctl VIDIOCGCAP: Invalid argument
no video grabber device available
</pre>


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.
--[[User:BayleShanks|BayleShanks]] 11:24, 26 April 2006 (CEST)

Revision as of 04:47, 22 January 2012

The Matrox Meteor II is a family of frame grabber cards produced by Matrox (in the mid-1990s ?) which utilize the custom Matrox VIA (Video Interface ASIC) PCI interface chipset.

Models(and board revisions of those models)

  • Matrox Meteor-II (aka Matrox Meteor II/Standard)
Part Numbers:
  • METEOR2/4 : 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.
  • MET2-C/4  : 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.
  • MET2+/4  : 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.
  • Matrox Meteor-II/1394, Part Number: METEOR2-1394
  • Matrox Meteor-II/MC (aka Matrox Meteor-II/Multi Channel)
Part Numbers:
  • METEOR2-MC/4C  : 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.
  • MET2-C-MC  : Matrox Meteor-II/Multi-Channel for CompactPCI
  • MET2-MC+/4  : 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.
  • Matrox Meteor-II/DIG (aka Matrox Meteor-II/Digital)
Part Numbers
  • METEOR2-DIG/4/R : Matrox Meteor-II/Digital for PCI, RS-422 digital (METEOR2DIG64R ?)
  • METEOR2-DIG/4/L : Matrox Meteor-II/Digital for PCI, LVDS digital
752-00 rev. A Original version.
752-01 rev. A No functional change.
752-02 rev. A No functional change.
  • MET2-DIG+/R  : Matrox Meteor-II/Digital for PC/104-Plus, RS-422 (METEOR2DIG64L ?)
  • MET2-DIG+/L  : Matrox Meteor-II/Digital for PC/104-Plus, LVDS
7035-01 rev. A Original version
  • Matrox Meteor-II/CL (aka Matrox Meteor-II/Camera Link), Part Number METEOR2-CL/32
Note: 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
Note: 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.

In order from **oldest** to **newest** here are relevant driver projects that I found. None have been updated in the last year.