📄 play_capture_board_specific.c
字号:
#if 1#define LOCALDBG ENABLE#else#define LOCALDBG DISABLE#endif#include "sample_os.h"#define ALLOW_OS_CODE 1#include "../rua/include/rua.h"#include "../rua/include/rua_property.h"#include "../dcc/include/dcc.h"#include "../dcc/include/dcc_macros.h"#include "../rmcore/include/rmstatustostring.h"#include "../rmlibcw/include/rmlibcw.h"#include "../emhwlib_hal/pll/include/pll_hal.h"#include "command_ids.h"#include "get_key.h"#include "common.h"#include "cmdline_options.h"#include "play_capture_board_specific.h"#include "play_capture_TW9919.h"#define I2C_ADDR_SiI9031 0x60#define I2C_ADDR_AD9380 0x98#define I2C_ADDR_SAA7119 0x40#define I2C_ADDR_WM8775 0x34#define I2C_ADDR_MSP34x5 0x80#define I2C_ADDR_TW9919 0x88// User have to create this input map and chip info /* ******************************************************************************** * DTV8634 board set configuration *********************************************************************************/struct capsam_video_input_map DTV8634_VideoInputMapSample[capsam_video_input_last-1] = { {capsam_video_input_tuner1, capsam_chip_TW9919}, {capsam_video_input_tuner2, capsam_chip_none}, {capsam_video_input_cvbs1, capsam_chip_TW9919}, {capsam_video_input_cvbs2, capsam_chip_TW9919}, {capsam_video_input_svideo1, capsam_chip_TW9919}, {capsam_video_input_svideo2, capsam_chip_TW9919}, {capsam_video_input_component1, capsam_chip_AD9380}, {capsam_video_input_component2, capsam_chip_AD9380}, {capsam_video_input_scart1, capsam_chip_TW9919}, {capsam_video_input_scart2, capsam_chip_TW9919}, {capsam_video_input_vga, capsam_chip_AD9380}, {capsam_video_input_dvi, capsam_chip_AD9380}, {capsam_video_input_hdmi1, capsam_chip_AD9380}, {capsam_video_input_hdmi2, capsam_chip_AD9380}, {capsam_video_input_hdmi3, capsam_chip_AD9380},};struct capsam_audio_input_map DTV8634_AudioInputMapSample[capsam_audio_input_last-1] = { {capsam_audio_input_tuner1,capsam_chip_MSP34x5}, {capsam_audio_input_tuner2,capsam_chip_MSP34x5}, {capsam_audio_input_stereo1,capsam_chip_MSP34x5}, {capsam_audio_input_stereo2,capsam_chip_MSP34x5}, {capsam_audio_input_stereo3,capsam_chip_MSP34x5}, {capsam_audio_input_hdmi1, capsam_chip_AD9380}, {capsam_audio_input_hdmi2, capsam_chip_AD9380}, {capsam_audio_input_hdmi3, capsam_chip_AD9380},};struct capsam_chip_info DTV8634_VideoChipInfoSample[MAX_NUMBER_OF_VIDEO_CHIPS] = { { chip: capsam_chip_AD9380, I2CModuleID: I2C, I2CDevice: { APIVersion: 1, Clock: GPIOId_Sys_0, Data: GPIOId_Sys_1, DevAddr: I2C_ADDR_AD9380, Delay: 0, Speed: 100 } }, { chip: capsam_chip_TW9919, I2CModuleID: I2C, I2CDevice:{ APIVersion: 1, // set to 1 Clock: GPIOId_Sys_0, // GPIO of the I2C data line Data: GPIOId_Sys_1, // GPIO of the I2C clock line DevAddr: I2C_ADDR_TW9919, // I2C device address (write uses DevAddr, read uses DevAddr + 1) Delay: 0, // I2C delay, in uSec Speed: 100 } },};struct capsam_chip_info DTV8634_AudioChipInfoSample[MAX_NUMBER_OF_AUDIO_CHIPS] = { { chip: capsam_chip_MSP34x5, I2CModuleID: I2C, I2CDevice:{ APIVersion: 1, // set to 1 Clock: GPIOId_Sys_0, // GPIO of the I2C data line Data: GPIOId_Sys_1, // GPIO of the I2C clock line DevAddr: I2C_ADDR_MSP34x5, // I2C device address (write uses DevAddr, read uses DevAddr + 1) Delay: 0, // I2C delay, in uSec Speed: 100 } },};struct capsam_board_info DTV8634_BoardInfoSample = { board: capsam_sigmaDTV8634, clock: 2700000, p_video_input_map: DTV8634_VideoInputMapSample, p_video_chip_info: DTV8634_VideoChipInfoSample, p_audio_chip_info: DTV8634_AudioChipInfoSample,};/* ******************************************************************************** * DTV8624 board set configuration *********************************************************************************/struct capsam_video_input_map DTV8624_VideoInputMapSample[capsam_video_input_last-1] = { {capsam_video_input_tuner1, capsam_chip_none}, {capsam_video_input_tuner2, capsam_chip_none}, {capsam_video_input_cvbs1, capsam_chip_SAA7119}, {capsam_video_input_cvbs2, capsam_chip_none}, {capsam_video_input_svideo1, capsam_chip_SAA7119}, {capsam_video_input_svideo2, capsam_chip_none}, {capsam_video_input_component1, capsam_chip_SAA7119}, {capsam_video_input_component2, capsam_chip_none}, {capsam_video_input_scart1, capsam_chip_none}, {capsam_video_input_scart2, capsam_chip_none}, {capsam_video_input_vga, capsam_chip_AD9883}, {capsam_video_input_dvi, capsam_chip_SiI9031}, {capsam_video_input_hdmi1, capsam_chip_SiI9031}, {capsam_video_input_hdmi2, capsam_chip_SiI9031}, {capsam_video_input_hdmi3, capsam_chip_none},};struct capsam_audio_input_map DTV8624_AudioInputMapSample[capsam_audio_input_last-1] = { {capsam_audio_input_tuner1,capsam_chip_MSP34x5}, {capsam_audio_input_tuner2,capsam_chip_MSP34x5}, {capsam_audio_input_stereo1,capsam_chip_WM8775}, {capsam_audio_input_stereo2,capsam_chip_WM8775}, {capsam_audio_input_stereo3,capsam_chip_WM8775}, {capsam_audio_input_hdmi1, capsam_chip_AD9380}, {capsam_audio_input_hdmi2, capsam_chip_AD9380}, {capsam_audio_input_hdmi3, capsam_chip_AD9380},};struct capsam_chip_info DTV8624_VideoChipInfoSample[MAX_NUMBER_OF_VIDEO_CHIPS] = { { chip: capsam_chip_SiI9031,// capture chip specification I2CModuleID: I2C, // emhwlib Module ID of the I2C bus access I2CDevice: { APIVersion: 1, // set to 1 Clock: GPIOId_Sys_0, // GPIO of the I2C data line Data: GPIOId_Sys_1, // GPIO of the I2C clock line DevAddr: I2C_ADDR_SiI9031, // I2C device address (write uses DevAddr, read uses DevAddr + 1) Delay: 0, // I2C delay, in uSec Speed: 100 // frequency of the I2C bit transfer, in kHz (e.g. 100 or 400) } }, { chip: capsam_chip_SAA7119, I2CModuleID: I2C, I2CDevice:{ APIVersion: 1, // set to 1 Clock: GPIOId_Sys_0, // GPIO of the I2C data line Data: GPIOId_Sys_1, // GPIO of the I2C clock line DevAddr: I2C_ADDR_SAA7119, // I2C device address (write uses DevAddr, read uses DevAddr + 1) Delay: 0, // I2C delay, in uSec Speed: 100 } },};struct capsam_chip_info DTV8624_AudioChipInfoSample[MAX_NUMBER_OF_AUDIO_CHIPS] = { { chip: capsam_chip_MSP34x5, I2CModuleID: I2C, I2CDevice:{ APIVersion: 1, // set to 1 Clock: GPIOId_Sys_0, // GPIO of the I2C data line Data: GPIOId_Sys_1, // GPIO of the I2C clock line DevAddr: I2C_ADDR_MSP34x5, // I2C device address (write uses DevAddr, read uses DevAddr + 1) Delay: 0, // I2C delay, in uSec Speed: 100 } }, { chip: capsam_chip_WM8775, I2CModuleID: I2C, I2CDevice:{ APIVersion: 1, // set to 1 Clock: GPIOId_Sys_0, // GPIO of the I2C data line Data: GPIOId_Sys_1, // GPIO of the I2C clock line DevAddr: I2C_ADDR_WM8775, // I2C device address (write uses DevAddr, read uses DevAddr + 1) Delay: 0, // I2C delay, in uSec Speed: 100 } },};struct capsam_board_info DTV8624_BoardInfoSample = { board: capsam_sigma844e1dtv, clock: 2700000, p_video_input_map: DTV8624_VideoInputMapSample, p_video_chip_info: DTV8624_VideoChipInfoSample, p_audio_chip_info: DTV8624_AudioChipInfoSample,};/* ******************************************************************************** * board specific function *********************************************************************************/RMstatus capsam_board_specific_setup(struct capsam_main_instance *pCapture, struct RUA* pRUA, struct capsam_board_info* p_board_info, enum capsam_video_input current_video_input){ struct SystemBlock_GPIO_type gpio; RMstatus err = RM_OK; // this is board specific setting - have to figure out how to handle for multiple board. if(p_board_info->board == capsam_sigma844e1dtv){ gpio.Bit = GPIOId_Sys_15; gpio.Data = FALSE; // select HDMI audio RUASetProperty(pRUA, SystemBlock, RMSystemBlockPropertyID_GPIO, &gpio, sizeof(gpio), 0); } if(p_board_info->board == capsam_sigmaDTV8634){ struct SystemBlock_GPIO_type gpio; struct SystemBlock_GPIO_type gpio_16, gpio_17, gpio_18; // 0. power up AD9380 gpio.Bit = GPIOId_Eth_34; gpio.Data = TRUE; // power up RUASetProperty(pRUA, SystemBlock, RMSystemBlockPropertyID_GPIO, &gpio, sizeof(gpio), 0); // 1. audio input MUX setting gpio.Bit = GPIOId_Eth_23; gpio.Data = FALSE; // route HDMI audio to I2S input RUASetProperty(pRUA, SystemBlock, RMSystemBlockPropertyID_GPIO, &gpio, sizeof(gpio), 0); // 2. HDMI input MUX setting gpio_16.Bit = GPIOId_Eth_18; gpio_16.Data = FALSE; // route analog audio to I2S input gpio_17.Bit = GPIOId_Eth_19; gpio_17.Data = FALSE; // route analog audio to I2S input gpio_18.Bit = GPIOId_Eth_20; gpio_18.Data = FALSE; // route analog audio to I2S input switch(current_video_input){ case capsam_video_input_hdmi1: gpio_16.Data = TRUE; // route analog audio to I2S input break; case capsam_video_input_hdmi2: gpio_17.Data = TRUE; // route analog audio to I2S input break; case capsam_video_input_hdmi3: gpio_18.Data = TRUE; // route analog audio to I2S input break; default: break; } RUASetProperty(pRUA, SystemBlock, RMSystemBlockPropertyID_GPIO, &gpio_16, sizeof(gpio_16), 0); RUASetProperty(pRUA, SystemBlock, RMSystemBlockPropertyID_GPIO, &gpio_17, sizeof(gpio_17), 0); RUASetProperty(pRUA, SystemBlock, RMSystemBlockPropertyID_GPIO, &gpio_18, sizeof(gpio_18), 0); // DTV8634 board gets MCLK from TW9919 // analog video chip should be power on to feed MCLK { struct capsam_TW9919_instance* pTW9919; pTW9919 = (struct capsam_TW9919_instance*)capsam_main_get_chip_handle(pCapture, capsam_chip_TW9919); if(pTW9919){ capsam_TW9919_setup_audio_mclk(pTW9919); } } } return err;}/* ******************************************************************************** * helper functions *********************************************************************************/enum capsam_chip capsam_get_video_capture_chip(enum capsam_video_input input, struct capsam_video_input_map* p_input_map)//RMuint32 capsam_get_video_capture_chip(enum capsam_video_input input, struct capsam_video_input_map* p_input_map){ int i = 0; if(!p_input_map){ printf("error\n"); } for(i=0; i<(capsam_video_input_last-1); i++){ if(input == p_input_map[i].input){ return p_input_map[i].chip; break; } } return 0;}enum capsam_chip capsam_get_audio_capture_chip(enum capsam_audio_input input, struct capsam_audio_input_map* p_input_map)//RMuint32 capsam_get_audio_capture_chip(enum capsam_audio_input input, struct capsam_audio_input_map* p_input_map){ int i = 0; if(!p_input_map){ printf("error\n"); } for(i=0; i<(capsam_audio_input_last-1); i++){ if(input == p_input_map[i].input){ return p_input_map[i].chip; break; } } return 0;}struct capsam_chip_info* capsam_get_video_chip_info(enum capsam_chip chip, struct capsam_chip_info* p_chip_info)//void* capsam_get_video_chip_info(enum capsam_chip chip, struct capsam_chip_info* p_chip_info){ int i = 0; if(!p_chip_info){ printf("error!\n"); } //printf("%d %d\n", sizeof(*p_chip_info), sizeof(p_chip_info)); for(i=0; i<MAX_NUMBER_OF_VIDEO_CHIPS; i++){ if(p_chip_info[i].chip == chip){ return &p_chip_info[i]; } } return 0;}struct capsam_chip_info* capsam_get_audio_chip_info(enum capsam_chip chip, struct capsam_chip_info* p_chip_info)//void* capsam_get_audio_chip_info(enum capsam_chip chip, struct capsam_chip_info* p_chip_info){ int i = 0; if(!p_chip_info){ printf("error!\n"); } //printf("%d %d\n", sizeof(*p_chip_info), sizeof(p_chip_info)); for(i=0; i<MAX_NUMBER_OF_AUDIO_CHIPS; i++){ if(p_chip_info[i].chip == chip){ return &p_chip_info[i]; } } return p_chip_info;}RMstatus capsam_get_I2CInfo(enum capsam_chip chip, struct capsam_chip_info* p_chip_info, RMuint32 *pout_I2CModuleID, struct EMhwlibI2CDeviceParameter **ppout_I2CDevice){ int i = 0; if(!p_chip_info){ printf("error!\n"); return RM_ERROR; } if(!pout_I2CModuleID){ printf("error!\n"); return RM_ERROR; } if(!ppout_I2CDevice){ printf("error!\n"); return RM_ERROR; } //printf("%d %d\n", sizeof(*p_chip_info), sizeof(p_chip_info)); for(i=0; i<MAX_NUMBER_OF_VIDEO_CHIPS; i++){ if(p_chip_info[i].chip == chip){ *pout_I2CModuleID = p_chip_info[i].I2CModuleID; *ppout_I2CDevice = &(p_chip_info[i].I2CDevice); return RM_OK; } } for(i=0; i<MAX_NUMBER_OF_AUDIO_CHIPS; i++){ if(p_chip_info[i].chip == chip){ *pout_I2CModuleID = p_chip_info[i].I2CModuleID; *ppout_I2CDevice = &(p_chip_info[i].I2CDevice); return RM_OK; } } return RM_ERROR; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -