Talk:Matrox Meteor II cards

From LinuxTVWiki
Jump to navigation Jump to search

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)