/* This prototype is set up to be compatible with the cx2341x_mbox_funcprototypeincx2341x.h,whichshouldbein kernels2.6.18orlater.Wedothissothatwecanenable cx2341x.kotowritetoourencoder(byhandingitapointertothis
function). For earlier kernels this doesn't really matter. */ staticint pvr2_encoder_cmd(void *ctxt,
u32 cmd, int arg_cnt_send, int arg_cnt_recv,
u32 *argp)
{ unsignedint poll_count; unsignedint try_count = 0; int retry_flag; int ret = 0; unsignedint idx; /* These sizes look to be limited by the FX2 firmware implementation */
u32 wrData[16];
u32 rdData[16]; struct pvr2_hdw *hdw = (struct pvr2_hdw *)ctxt;
/* This implements some extra setup for the encoder that seems to be
specific to the PVR USB2 hardware. */ staticint pvr2_encoder_prep_config(struct pvr2_hdw *hdw)
{ int ret = 0; int encMisc3Arg = 0;
#if0 /* This inexplicable bit happens in the Hauppauge windows driver(forboth24xxxand29xxxdevices).HoweverI currentlyseenodifferenceinbehaviorwithorwithout thisstuff.Leavethishereasanoteofitsexistence,
but don't use it. */
LOCK_TAKE(hdw->ctl_lock); do {
u32 dat[1];
dat[0] = 0x80000640;
pvr2_encoder_write_words(hdw,0x01fe,dat,1);
pvr2_encoder_write_words(hdw,0x023e,dat,1);
} while(0); LOCK_GIVE(hdw->ctl_lock); #endif
/* Mike Isely <isely@pobox.com> 26-Jan-2006 The windows driver sendsthefollowinglistofENC_MISCcommands(forboth 24xxxand29xxxdevices).Meaningsarenotentirelyclear, howeverwithouttheENC_MISC(3,1)commandthenwerisk randomperpetualvideocorruptionwheneverthevideoinput
breaks up for a moment (like when switching channels). */
#if0 /* This ENC_MISC(5,0) command seems to hurt 29xxx sync performanceonchannelchanges,butisnotaproblemon
24xxx devices. */
ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 5,0,0,0); #endif
/* This ENC_MISC(3,encMisc3Arg) command is critical - without ittherewilleventuallybevideocorruption.Also,the saa7115caseisstrange-theWindowsdriverispassing1 regardlessofdevicetypebutifwehave1forsaa7115
devices the video turns sluggish. */ if (hdw->hdw_desc->flag_has_cx25840) {
encMisc3Arg = 1;
} else {
encMisc3Arg = 0;
}
ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 3,
encMisc3Arg,0,0);
ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 8,0,0,0);
#if0 /* This ENC_MISC(4,1) command is poisonous, so it is commented out.ButI'mleavingithereanywaytodocumentits existenceintheWindowsdriver.Theeffectofthis commandisthatappsdisplayingthestreambecomesluggish
with stuttering video. */
ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 4,1,0,0); #endif
ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 0,3,0,0);
ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4,15,0,0,0);
/* prevent the PTSs from slowly drifting away in the generated
MPEG stream */
ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC, 2, 4, 1);
return ret;
}
int pvr2_encoder_adjust(struct pvr2_hdw *hdw)
{ int ret;
ret = cx2341x_update(hdw,pvr2_encoder_cmd,
(hdw->enc_cur_valid ? &hdw->enc_cur_state : NULL),
&hdw->enc_ctl_state); if (ret) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "Error from cx2341x module code=%d",ret);
} else {
hdw->enc_cur_state = hdw->enc_ctl_state;
hdw->enc_cur_valid = !0;
} return ret;
}
/* saa7115: 0xf0 */
val = 0xf0; if (hdw->hdw_desc->flag_has_cx25840) { /* ivtv cx25840: 0x140 */
val = 0x140;
}
if (!ret) ret = pvr2_encoder_vcmd(
hdw,CX2341X_ENC_SET_NUM_VSYNC_LINES, 2,
val, val);
/* setup firmware to notify us about some events (don't know why...) */ if (!ret) ret = pvr2_encoder_vcmd(
hdw,CX2341X_ENC_SET_EVENT_NOTIFICATION, 4, 0, 0, 0x10000000, 0xffffffff);
if (!ret) ret = pvr2_encoder_vcmd(
hdw,CX2341X_ENC_SET_VBI_LINE, 5, 0xffffffff,0,0,0,0);
if (ret) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "Failed to configure cx23416"); return ret;
}
ret = pvr2_encoder_adjust(hdw); if (ret) return ret;
ret = pvr2_encoder_vcmd(
hdw, CX2341X_ENC_INITIALIZE_INPUT, 0);
if (ret) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, "Failed to initialize cx23416 video input"); return ret;
}
return0;
}
int pvr2_encoder_start(struct pvr2_hdw *hdw)
{ int status;
/* unmask some interrupts */
pvr2_write_register(hdw, 0x0048, 0xbfffffff);
switch (hdw->active_stream_type) { case pvr2_config_vbi:
status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2, 0x01,0x14); break; case pvr2_config_mpeg:
status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2, 0,0x13); break; default: /* Unhandled cases for now */
status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_START_CAPTURE,2, 0,0x13); break;
} return status;
}
int pvr2_encoder_stop(struct pvr2_hdw *hdw)
{ int status;
/* mask all interrupts */
pvr2_write_register(hdw, 0x0048, 0xffffffff);
switch (hdw->active_stream_type) { case pvr2_config_vbi:
status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3, 0x01,0x01,0x14); break; case pvr2_config_mpeg:
status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3, 0x01,0,0x13); break; default: /* Unhandled cases for now */
status = pvr2_encoder_vcmd(hdw,CX2341X_ENC_STOP_CAPTURE,3, 0x01,0,0x13); break;
}
return status;
}
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.13 Sekunden
(vorverarbeitet am 2026-10-11)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.