// First byte data received on Endpoint 0 (control byte) enum TYPE_USB_REQUEST { REQUEST_UNUSED_0 = 0, REQUEST_DOWNLOAD, REQUEST_I2C_READ, REQUEST_I2C_WRITE, REQUEST_POLL_RC, REQUEST_DISCONNECT, REQUEST_GET_GPIO, REQUEST_SET_IOCTL, REQUEST_JUMPRAM, REQUEST_AHB_READ, REQUEST_AHB_WRITE, REQUEST_SET_CLOCK, REQUEST_SET_GPIO, REQUEST_SET_PWM, REQUEST_SET_ANA_MODE, REQUEST_ENABLE_VIDEO, REQUEST_SET_I2C_PARAM, REQUEST_SET_RC, REQUEST_NEW_I2C_READ, REQUEST_NEW_I2C_WRITE, REQUEST_SET_SUSP_PARAM, REQUEST_GET_VERSION, REQUEST_SRAM_READ_SMALL, REQUEST_SRAM_READ_BIG, REQUEST_SRAM_WRITE, REQUEST_MAX }; static int dib0700_set_streaming(struct dibBusAdapter *ctrl, struct dibStreamingRequest *request) { struct dib0700_state *state = ctrl->priv; uint8_t mode = 0, sub_mode; uint8_t ch1_en; uint8_t ch2_en; if (state->sram_sdio_active) /* in case of SRAM enabled don't do any set_streaming request */ return DIB_RETURN_SUCCESS; if (request->mode & MODE_DIGITAL) mode = 0; else if (request->mode & MODE_ANALOG) mode = 1; else if (request->mode & MODE_ANALOG_ADC) mode = 2; if (request->video_standard == AnalogVideo_None) request->video_standard = state->current_standard; else state->current_standard = request->video_standard; if ((mode == 1 && (request->video_standard & AnalogVideo_NTSC_Mask) != 0)) sub_mode = 0x00; // (0x01 << 4) == Ntsc mode, 0x01 == channel enabled else sub_mode = 0x01; // (0x01 << 4) == Pal mode, 0x01 == channel enabled dbgpl(&dib0700_dbg, "modifying (%d) streaming state for %d", request->onoff, request->id); if (request->id == 0) ch1_en = request->onoff; else ch1_en = !request->onoff; ch2_en = !ch1_en; return dib0700_video_enable(state, request->onoff, mode, sub_mode, ch1_en, ch2_en); } static int dib0700_set_scaling(struct dibBusAdapter* ctrl, struct dibVideoConfig * video_config, struct dibVideoTransitions * video_transitions) { struct dib0700_state *state = ctrl->priv; uint8_t b[21]; //For now, we get the nb of the line in the SAV and always get VBI informations b[ 0] = (((video_config->Standard == 625)?1:0)<<7) | (1<<6) | (1<<5) | (1<<4); // bit shifted by 6 = SAV enable // bit shifted by 5 = VBI is present // bit shifted by 4 = insertion of line Number b[ 1] = (uint8_t)(video_config->HwVideoLineSize+4)&0xff; b[ 2] = (uint8_t)((video_config->HwVideoLineSize+4)>>8)&0xff; b[ 3] = (uint8_t)(video_config->HwVbiLineSize+4)&0xff; b[ 4] = (uint8_t)((video_config->HwVbiLineSize+4)>>8)&0xff; b[ 5] = (uint8_t)state->desc->urb_max_size&0xff; b[ 6] = (uint8_t)(state->desc->urb_max_size>>8)&0xff; b[ 7] = (uint8_t)video_transitions->StartOfOddField&0xff; b[ 8] = (uint8_t)(video_transitions->StartOfOddField>>8)&0xff; b[ 9] = (uint8_t)video_transitions->StartOfEvenField&0xff; b[10] = (uint8_t)(video_transitions->StartOfEvenField>>8)&0xff; b[11] = (uint8_t)video_transitions->StartOfActiveOdd&0xff; b[12] = (uint8_t)(video_transitions->StartOfActiveOdd>>8)&0xff; b[13] = (uint8_t)video_transitions->EndOfActiveOdd&0xff; b[14] = (uint8_t)(video_transitions->EndOfActiveOdd>>8)&0xff; b[15] = (uint8_t)video_transitions->StartOfActiveEven&0xff; b[16] = (uint8_t)(video_transitions->StartOfActiveEven>>8)&0xff; b[17] = (uint8_t)video_transitions->EndOfActiveEven&0xff; b[18] = (uint8_t)(video_transitions->EndOfActiveEven>>8)&0xff; b[19] = ((uint8_t)video_transitions->TotalNumberOfLines)&0xff; b[20] = ((uint8_t)(video_transitions->TotalNumberOfLines>>8))&0xff; dbgpl(&dib0700_dbg, "data for scaling: %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x %2x",b[0],b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15], b[16], b[17], b[18], b[19], b[20]); return dib0700_ctrl_write(state, REQUEST_SET_ANA_MODE, b, 21); } /* and the calls to set_scaling */ static void setup_hook_analog_video_config(struct dibBoard *board, int num_of_lines, int use_hook_line_numbering) { struct dibVideoConfig cfg; struct dibVideoTransitions trans; struct dibVideoFraming framing; uint16_t num_active_lines; if (num_of_lines != 525 && num_of_lines != 625) return; /* TODO correct for scaling */ num_active_lines = num_of_lines == 525 ? 480 : 576; cfg.HwVideoLineSize = 1440; cfg.HwNbActiveLines = num_active_lines; cfg.HwVbiLineSize = 1440; cfg.Standard = num_of_lines; if (num_of_lines == 525) { uint32_t NbRealActiveLines; debug_printf("-D- NTSC\n"); if (cfg.HwNbActiveLines == 480) NbRealActiveLines = 487; else NbRealActiveLines = 243; trans.StartOfOddField = 4; trans.StartOfActiveOdd = 21; trans.EndOfActiveOdd = trans.StartOfActiveOdd + NbRealActiveLines/2; //265 trans.StartOfEvenField = trans.EndOfActiveOdd + 2; //266 trans.StartOfActiveEven = trans.StartOfEvenField + 18; //283 trans.EndOfActiveEven = trans.StartOfActiveEven + NbRealActiveLines/2; //525 trans.TotalNumberOfLines = trans.EndOfActiveEven; //525 framing.VbiLines = 12; framing.VbiF0Start = 9; framing.VbiF0Stop = 20; framing.VbiF1Start = trans.StartOfEvenField + 5;//273; framing.VbiF1Stop = framing.VbiF1Start +11;//284; framing.VideoF0Start= trans.StartOfActiveOdd; framing.VideoF0Stop = framing.VideoF0Start + num_active_lines/2-1; //261 // 240 lines (261 included) framing.VideoF1Start= trans.StartOfActiveEven;//285; framing.VideoF1Stop = framing.VideoF1Start + num_active_lines/2 -1 ;//524; } else { debug_printf("-D- PAL/SECAM\n"); #if 01 trans.StartOfOddField = 1; trans.StartOfActiveOdd = 23; trans.EndOfActiveOdd = trans.StartOfActiveOdd + num_active_lines/2; //311 trans.StartOfEvenField = trans.EndOfActiveOdd + 2; //312 trans.StartOfActiveEven = trans.StartOfEvenField + 23; //335 trans.EndOfActiveEven = trans.StartOfActiveEven + num_active_lines/2; //623 trans.TotalNumberOfLines = trans.EndOfActiveEven + 2; //625 #else trans.StartOfOddField = 1; trans.StartOfActiveOdd = 100; trans.EndOfActiveOdd = 400;//trans.StartOfActiveOdd + num_active_lines/2; //311 trans.StartOfEvenField = 500; //trans.EndOfActiveOdd + 2; //312 trans.StartOfActiveEven = 600; //trans.StartOfEvenField + 23; //335 trans.EndOfActiveEven = 900; //trans.StartOfActiveEven + num_active_lines/2; //623 trans.TotalNumberOfLines = 1000; //625 #endif framing.VbiLines = 17; framing.VbiF0Start = 6; framing.VbiF0Stop = 22; framing.VideoF0Start= trans.StartOfActiveOdd ; // Clip first 1/2 line framing.VideoF0Stop = trans.EndOfActiveOdd -1; //310 framing.VbiF1Start = trans.StartOfEvenField + 6; //319 framing.VbiF1Stop = framing.VbiF1Start + 16; //335 framing.VideoF1Start= trans.StartOfActiveEven; //336 framing.VideoF1Stop = trans.EndOfActiveEven-1; //623 } debug_printf("-D- Framing: %d, %d, %d, %d, %d, %d, %d, %d, %d\n", framing.VbiLines,framing.VbiF0Start ,framing.VbiF0Stop, framing.VideoF0Start,framing.VideoF0Stop ,framing.VbiF1Start ,framing.VbiF1Stop ,framing.VideoF1Start,framing.VideoF1Stop); debug_printf("-D- Transition: %d, %d, %d, %d, %d, %d, %d\n", trans.StartOfOddField, trans.StartOfEvenField, trans.StartOfActiveOdd, trans.EndOfActiveOdd, trans.StartOfActiveEven, trans.EndOfActiveEven, trans.TotalNumberOfLines); debug_printf("-D- Config: %d, %d, %d, %d\n", cfg.HwVbiLineSize, cfg.HwVideoLineSize, cfg.HwNbActiveLines, cfg.Standard); board_set_scaling(board, &cfg, &trans); }