Talk:Matrox Meteor II cards
From LinuxTVWiki
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 ...
The best I was able to do (as of Apr 26 2006) was:
(1) Download the latest version from Marcus Furlong's Meteor-II Multi-Channel Linux Driver 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)