Talk:Matrox Meteor II cards

From LinuxTVWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

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)