diff --git a/src/add-ons/accelerants/nvidia/ProposeDisplayMode.c b/src/add-ons/accelerants/nvidia/ProposeDisplayMode.c index 7129155364..9387b30a20 100644 --- a/src/add-ons/accelerants/nvidia/ProposeDisplayMode.c +++ b/src/add-ons/accelerants/nvidia/ProposeDisplayMode.c @@ -4,7 +4,7 @@ Other authors for NV driver: Mark Watson, - Rudolf Cornelissen 9/2002-2/2005 + Rudolf Cornelissen 9/2002-10/2005 */ #define MODULE_BIT 0x00400000 @@ -503,15 +503,9 @@ status_t PROPOSE_DISPLAY_MODE(display_mode *target, const display_mode *low, con } /* set TV_CAPABLE if suitable: pixelclock is not important (defined by TVstandard) */ - //fixme: modify for G100 and G200 TVout later on... - if (target->flags & DUALHEAD_CAPABLE) + if (si->ps.tvout && BT_check_tvmode(*target)) { - if (si->ps.tvout && - (target->timing.h_display <= 1024) && - (target->timing.v_display <= 768)) - { - target->flags |= TV_CAPABLE; - } + target->flags |= TV_CAPABLE; } /* set HARDWARE_CURSOR mode if suitable */ diff --git a/src/add-ons/accelerants/nvidia/SetDisplayMode.c b/src/add-ons/accelerants/nvidia/SetDisplayMode.c index 8521cc7fbc..5200f0b28d 100644 --- a/src/add-ons/accelerants/nvidia/SetDisplayMode.c +++ b/src/add-ons/accelerants/nvidia/SetDisplayMode.c @@ -6,7 +6,7 @@ Other authors: Mark Watson, Apsed, - Rudolf Cornelissen 11/2002-6/2005 + Rudolf Cornelissen 11/2002-10/2005 */ #define MODULE_BIT 0x00200000 @@ -112,7 +112,8 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set) LOG(1,("SETMODE: setting DUALHEAD mode\n")); /* validate flags for secondary TVout */ - if ((i2c_sec_tv_adapter() != B_OK) && (target2.flags & TV_BITS)) + //fixme: remove or block on autodetect fail. (is now shutoff) + if ((0) && (target2.flags & TV_BITS)) { target.flags &= ~TV_BITS;//still needed for some routines... target2.flags &= ~TV_BITS; @@ -209,6 +210,7 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set) } /* check if we are doing interlaced TVout mode */ + //fixme: we don't support interlaced mode? si->interlaced_tv_mode = false; /* if ((target2.flags & TV_BITS) && (si->ps.card_type >= G450)) si->interlaced_tv_mode = true; @@ -242,7 +244,7 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set) if (!(target2.flags & TV_BITS)) result = head2_set_timing(target2); /* TVout support: setup CRTC2 and it's pixelclock */ - if (si->ps.tvout && (target2.flags & TV_BITS)) maventv_init(target2); + if (si->ps.tvout && (target2.flags & TV_BITS)) BT_setmode(target2); } else /* single head mode */ { @@ -306,7 +308,10 @@ status_t SET_DISPLAY_MODE(display_mode *mode_to_set) head1_set_display_start(startadd,colour_depth1); /* set the timing */ - head1_set_timing(target); + if (!(target.flags & TV_BITS)) head1_set_timing(target); + + /* TVout support: setup CRTC and it's pixelclock */ + if (si->ps.tvout && (target.flags & TV_BITS)) BT_setmode(target); //fixme: shut-off the videoPLL if it exists... } diff --git a/src/add-ons/accelerants/nvidia/engine/nv_brooktreetv.c b/src/add-ons/accelerants/nvidia/engine/nv_brooktreetv.c index 139bf5cc4c..a506155ab1 100644 --- a/src/add-ons/accelerants/nvidia/engine/nv_brooktreetv.c +++ b/src/add-ons/accelerants/nvidia/engine/nv_brooktreetv.c @@ -1,6 +1,6 @@ /* Author: - Rudolf Cornelissen 4/2002-9/2005 + Rudolf Cornelissen 4/2002-10/2005 */ #define MODULE_BIT 0x00100000 @@ -15,7 +15,7 @@ //fixme: remove rubbish.. enum { // TVoutput mode to set - NOT_USED = 0, + NOT_SUPPORTED = 0, NTSC640_TST, NTSC640, NTSC800, @@ -1268,20 +1268,86 @@ static uint8 BT_killclk_blackout(void) return stat; }//end BT_killclk_blackout. -//fixme: resetup for brooktreetv, should cover all supported encoders later on.. -int maventv_init(display_mode target) +uint8 BT_check_tvmode(display_mode target) { + uint8 status = NOT_SUPPORTED; + uint32 mode = ((target.timing.h_display) | ((target.timing.v_display) << 16)); + + switch (mode) + { + case (640 | (480 << 16)): + if ((target.flags & TV_BITS) == TV_PAL) + { + if (!(target.flags & TV_VIDEO)) status = PAL640; + } + if ((target.flags & TV_BITS) == TV_NTSC) + { + if (!(target.flags & TV_VIDEO)) status = NTSC640; + else status = NTSC640_OS; + } + break; + case (800 | (600 << 16)): + if ((target.flags & TV_BITS) == TV_PAL) + { + if (!(target.flags & TV_VIDEO)) status = PAL800; + else status = PAL800_OS; + } + if ((target.flags & TV_BITS) == TV_NTSC) + { + if (!(target.flags & TV_VIDEO)) status = NTSC800; + } + break; + case (720 | (480 << 16)): + if (((target.flags & TV_BITS) == TV_NTSC) && (target.flags & TV_VIDEO)) + status = NTSC720; + break; + case (720 | (576 << 16)): + if (((target.flags & TV_BITS) == TV_PAL) && (target.flags & TV_VIDEO)) + status = PAL720; + break; + } + + return status; +}//end BT_check_tvmode. + +status_t BT_setmode(display_mode target) +{ + uint8 tvmode; + /* use a display_mode copy because we might tune it for TVout compatibility */ display_mode tv_target = target; /* preset new TVout mode */ - if ((tv_target.flags & TV_BITS) == TV_PAL) + tvmode = BT_check_tvmode(tv_target); + if (!tvmode) return B_ERROR; + +//fixme: only testing singlehead cards for now... +if (si->ps.secondary_head) +{ + head1_set_timing(tv_target); + return B_ERROR; +} + + switch (tvmode) { - LOG(4, ("MAVENTV: PAL TVout\n")); - } - else - { - LOG(4, ("MAVENTV: NTSC TVout\n")); + case NTSC640: + case NTSC640_TST: + break; + case NTSC800: + break; + case PAL640: + break; + case PAL800: + case PAL800_TST: + break; + case NTSC640_OS: + break; + case PAL800_OS: + break; + case NTSC720: + break; + case PAL720: + break; } /* tune new TVout mode */ @@ -1295,9 +1361,9 @@ int maventv_init(display_mode target) /* program new TVout mode */ /* setup CRTC timing */ - head2_set_timing(tv_target); + head1_set_timing(tv_target); /* start whole thing if needed */ - return 0; + return B_OK; } diff --git a/src/add-ons/accelerants/nvidia/engine/nv_i2c.c b/src/add-ons/accelerants/nvidia/engine/nv_i2c.c index 641e478f65..8cb8b02944 100644 --- a/src/add-ons/accelerants/nvidia/engine/nv_i2c.c +++ b/src/add-ons/accelerants/nvidia/engine/nv_i2c.c @@ -2,42 +2,13 @@ * i2c interface. * Bus should be run at max. 100kHz: see original Philips I2C specification * - * Rudolf Cornelissen 12/2002-9/2005 + * Rudolf Cornelissen 12/2002-10/2005 */ #define MODULE_BIT 0x00004000 #include "nv_std.h" -status_t i2c_sec_tv_adapter() -{ - status_t result = B_ERROR; - - /* The secondary DDC channel only exist on dualhead cards */ - if (!si->ps.secondary_head) return result; - - /* make sure the output lines will be active-low when enabled - * (they will be pulled 'passive-high' when disabled) */ -// DXIW(GENIODATA,0x00); - /* send out B_STOP condition on secondary head DDC channel and use it to - * check for 'shortcut', indicating the Matrox VGA->TV adapter is connected */ - - /* make sure SDA is low */ -// DXIW(GENIOCTRL, (DXIR(GENIOCTRL) | DDC2_DATA)); - snooze(2); - /* make sure SCL should be high */ -// DXIW(GENIOCTRL, (DXIR(GENIOCTRL) & ~DDC2_CLK)); - snooze(2); - /* if SCL is low then the bus is blocked by a TV adapter */ -// if (!(DXIR(GENIODATA) & DDC2_CLK)) result = B_OK; - snooze(5); - /* set SDA while SCL should be set (generates actual bus-stop condition) */ -// DXIW(GENIOCTRL, (DXIR(GENIOCTRL) & ~DDC2_DATA)); - snooze(5); - - return result; -} - char i2c_flag_error (char ErrNo) //error code list: //0 - OK status diff --git a/src/add-ons/accelerants/nvidia/engine/nv_proto.h b/src/add-ons/accelerants/nvidia/engine/nv_proto.h index 3fbf185e02..1f5c7e1d74 100644 --- a/src/add-ons/accelerants/nvidia/engine/nv_proto.h +++ b/src/add-ons/accelerants/nvidia/engine/nv_proto.h @@ -60,7 +60,8 @@ status_t nv_dac2_set_pix_pll(display_mode target); /* Brooktree TV functions */ bool BT_probe(void); -int maventv_init(display_mode target); +uint8 BT_check_tvmode(display_mode target); +status_t BT_setmode(display_mode target); /* CRTC1 functions */ status_t nv_crtc_update_fifo(void);