⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mvp_main.c

📁 利用Ti公司的TMSvc320c6711开发板的基础上搭建的移动视频电话系统。程序中主要实现3个功能:实时捕捉视频和音频数据;能够对视频和音频数据进行解码和存储;能够通过GPRS通信口传输音/视频压缩
💻 C
字号:
/*
* File: MVPmain.c
*
* Author: Elliot Hill
*
* Description: This is the main controlling source file for the
* Mobile VideoPhone (MVP) Thesis. It is intended to run
* on the TMS320C6701 EVM, and controls the MVP
* daughterboard attached to it.
*
* Last Modified: 27 September 2001
*/
#include <common.h>
#include <mcbsp.h>
#include "MVP_dma.h"
/*
* Defines
*/
#define CLKGDIVIDE 0
#define FWID1 1
#define FPER1 0xFF
#define SIZE_OF_UART_BLOCK11
#define NUM_BYTES_IN_UINT 4
/*
* Function prototypes
*/
int audio_init();
int serial_data_init();
void send_audio(uint data[], int numints);
void send_serial_data(uint dataaddr[], int numints);
/*
* main() -
*
* This is the main controlling function, from which all other
* functions are called.
*/
int main()
{
/*
* For the hardware side of the Mobile Videophone,
* all that is required here is to initialise the DMA and
* the McBSP ports. It is up to the codec when to
* initialise and use the DMA for that purpose.
*/
	audio_init();
	serial_data_init();
	initialise_DMA(0x02000000,0x02200000);
	DMA_START(AUDIO_DMA);
	DMA_START(DATA_DMA);
	DMA_START(INT_DATA_DMA);
	XCTRL1_HIGH();
}
/*
* audio_init() -
*
* This function initialises the McBSP 1 for interfacing to the
* VBAP.
*/
int audio_init()
{
/*
* The first item to be completed is to set up the
* SRGR (Sample Rate Generator Register).
*/
	LOAD_FIELD(MCBSP_SRGR_ADDR(1), CLKGDIVIDE, CLKGDV, CLKGDV_SZ);
	LOAD_FIELD(MCBSP_SRGR_ADDR(1), FWID1, FWID, FWID_SZ);
	LOAD_FIELD(MCBSP_SRGR_ADDR(1), FPER1, FPER, FPER_SZ);
	LOAD_FIELD(MCBSP_SRGR_ADDR(1), CLK_MODE_CLKS, CLKSM, 1);
	LOAD_FIELD(MCBSP_SRGR_ADDR(1), CLKS_POL_RISING, CLKSP, 1);
	LOAD_FIELD(MCBSP_SRGR_ADDR(1), GSYNC_OFF, GSYNC, 1);
	LOAD_FIELD(MCBSP_SRGR_ADDR(1), FSX_FSG, FSGM, 1);
/*
* Pin Control Register (PCR field) for the audio McBSP channel
*/
	LOAD_FIELD(MCBSP_PCR_ADDR(1), FSYNC_POL_HIGH, FSXP, 1);
	LOAD_FIELD(MCBSP_PCR_ADDR(1), 1, CLKXM, 1);
	LOAD_FIELD(MCBSP_PCR_ADDR(1), FSYNC_MODE_INT, FSXM, 1);
	LOAD_FIELD(MCBSP_PCR_ADDR(1), FSYNC_POL_HIGH, FSRP, 1);
	LOAD_FIELD(MCBSP_PCR_ADDR(1), 1, CLKRM, 1);
	LOAD_FIELD(MCBSP_PCR_ADDR(1), FSYNC_MODE_INT, FSRM, 1);
/*
* XCR programming for audio McBSP channel
*/
	LOAD_FIELD(MCBSP_XCR_ADDR(1), SINGLE_PHASE, XPHASE, 1);
	LOAD_FIELD(MCBSP_XCR_ADDR(1), WORD_LENGTH_8, XWDLEN1, XWDLEN1_SZ);
	LOAD_FIELD(MCBSP_XCR_ADDR(1), 0, XFRLEN1, XFRLEN1_SZ);
	LOAD_FIELD(MCBSP_XCR_ADDR(1), DATA_DELAY1, XDATDLY, XDATDLY_SZ);
	LOAD_FIELD(MCBSP_XCR_ADDR(1), COMPAND_ULAW, XCOMPAND,
	XCOMPAND_SZ);
/*
* Receive Control Register (RCR) for the audio McBSP. Note that this
* includes setting up the companding bit for u law companding.
*/
LOAD_FIELD(MCBSP_RCR_ADDR(1), SINGLE_PHASE, RPHASE, 1);
LOAD_FIELD(MCBSP_RCR_ADDR(1), WORD_LENGTH_8, RWDLEN1, RWDLEN1_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(1), 0, RFRLEN1, RFRLEN1_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(1), DATA_DELAY1, RDATDLY, RDATDLY_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(1), COMPAND_ULAW, RCOMPAND,
RCOMPAND_SZ);
/*
* SPCR for the audio section, note that the only field set from default is the
* one making the data right justified and zero filled.
*/
LOAD_FIELD(MCBSP_SPCR_ADDR(1), RXJUST_RJZF, RJUST, RJUST_SZ);
return 0;
}
/*
* serial_data_init() -
*
* The aim of this function is to initialise the McBSP port 0 for
* interfacing with the UART.
*/
int serial_data_init()
{
/*
* Setting up the Pin Control Register, with low polarities
* for the frame synchronisation (used for the start bit)
*/
LOAD_FIELD(MCBSP_SPCR_ADDR(0), FSYNC_MODE_INT , FSXM , 1);
LOAD_FIELD(MCBSP_SPCR_ADDR(0), FSYNC_MODE_EXT , FSRM , 1);
LOAD_FIELD(MCBSP_SPCR_ADDR(0), CLK_MODE_INT , CLKXM, 1);
LOAD_FIELD(MCBSP_SPCR_ADDR(0), CLK_MODE_INT , CLKRM, 1);
LOAD_FIELD(MCBSP_SPCR_ADDR(0), FSYNC_POL_LOW , FSXP , 1);
LOAD_FIELD(MCBSP_SPCR_ADDR(0), FSYNC_POL_LOW , FSRP , 1);
LOAD_FIELD(MCBSP_SPCR_ADDR(0), CLKX_POL_RISING , CLKXP, 1);
LOAD_FIELD(MCBSP_SPCR_ADDR(0), CLKR_POL_RISING, CLKRP, 1);
/* Set up Receive Control Register */
LOAD_FIELD(MCBSP_RCR_ADDR(0), DUAL_PHASE , RPHASE, 1);
LOAD_FIELD(MCBSP_RCR_ADDR(0), FRAME_IGNORE , RFIG , 1);
LOAD_FIELD(MCBSP_RCR_ADDR(0), DATA_DELAY0 , RDATDLY, RDATDLY_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(0), 8 , RFRLEN1, RFRLEN1_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(0), 1 , RFRLEN2, RFRLEN2_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(0), WORD_LENGTH_16 , RWDLEN1,
RWDLEN1_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(0), WORD_LENGTH_8 , RWDLEN2, RWDLEN2_SZ);
LOAD_FIELD(MCBSP_RCR_ADDR(0), NO_COMPAND_MSB_1ST , RCOMPAND,
RCOMPAND_SZ);
/* Set up Transmit Control Register */
LOAD_FIELD(MCBSP_XCR_ADDR(0), DUAL_PHASE , XPHASE, 1);
LOAD_FIELD(MCBSP_XCR_ADDR(0), FRAME_IGNORE , XFIG , 1);
LOAD_FIELD(MCBSP_XCR_ADDR(0), DATA_DELAY0 , XDATDLY, XDATDLY_SZ);
LOAD_FIELD(MCBSP_XCR_ADDR(0), 8 , XFRLEN1, XFRLEN1_SZ);
LOAD_FIELD(MCBSP_XCR_ADDR(0), 1 , XFRLEN2, XFRLEN2_SZ);
LOAD_FIELD(MCBSP_XCR_ADDR(0), WORD_LENGTH_16 , XWDLEN1,
XWDLEN1_SZ);
LOAD_FIELD(MCBSP_XCR_ADDR(0), WORD_LENGTH_8 , XWDLEN2,
XWDLEN2_SZ);
LOAD_FIELD(MCBSP_XCR_ADDR(0), NO_COMPAND_MSB_1ST, XCOMPAND,
XCOMPAND_SZ);
/*
* Setting up Sample Rate Generator Register.
*/
extra_time = 16;
period = 10*16 + extra_time;
SET_BIT(MCBSP_SRGR_ADDR(0), CLKSM);
LOAD_FIELD(MCBSP_SRGR_ADDR(0), FSX_FSG , FSGM , 1);
LOAD_FIELD(MCBSP_SRGR_ADDR(0), 223 , CLKGDV , CLKGDV_SZ);
LOAD_FIELD(MCBSP_SRGR_ADDR(0), period , FPER , FPER_SZ);
}
/*
* send_audio() -
*
* This function is used to send audio data through to the speaker
* from the codec. Data[] is the array of data, with the numints
* determining how many elements are in the array.
*/
void send_audio(uint data[], int numints)
{
int i;
/*
* Go through the array, and send the data out, polling for
* the transmit ready signal between each sending.
*/
for (i = 0; i < numints; i++) {
LOAD_FIELD(MCBSP_DXR_ADDR(1),data[i],0,32);
/*
* Now poll the XRDY bit in the SPCR to see when
* the McBSP is ready for another transmission
*/
while (GET_FIELD(MCBSP_SPCR_ADDR(1),XRDY,1) == 0) {
;
}
}
}
/*
* send_serial_data() -
*
* This function is used to send data to the other Mobile VideoPhone via the
* serial communications link. A block of uint (32-bit) data is passed
* to the function, along with the size of the block of data.
*/
void send_serial_data(uint dataaddr[], int numints) -
{
unsigned short uartblock[SIZE_OF_UART_BLOCK];
short cnt = -1;
unsigned char xmit_char;
uint transuint;
uint curruint;
int i, j, k;
/*
* In order to convert this data into the format required by
* the UART design, we have to move through each uint in the
* block of data to be sent, and further split that into
* byte blocks.
*/
for (i = 0; i < numints; i++) {
curruint = dataaddr[i];
for (j = 0; j < NUM_BYTES_IN_UINT; j++) {
xmit_char = curruint >> (j * 8);
/*
* Now go through the byte and convert it into
* the correct format.
*/
for (cnt = -1; cnt < 10; cnt++) {
if (cnt == -1) { // Start bit
uartblock[cnt+1] = 0x0000;
} else if (cnt == 8 || cnt == 9) {
uartblock[cnt+1] = 0xffff;
} else if (xmit_char & (1 << cnt)) {
// bit is a one
uartblock[cnt+1] = 0xffff;
} else {
// bit is a zero
uartblock[cnt+1] = 0x0000;
}
}
/* now we have our data stream for that byte, so
* send it out 16-bits at a time.
*/
for (k = 0; k < SIZE_OF_UART_BLOCK; k++) {
LOAD_FIELD(MCBSP_DXR_ADDR(0),uartblock[k],0,16);
/*
* Now poll the XRDY bit in the SPCR to see when
* the McBSP is ready for another transmission
*/
while (GET_FIELD(MCBSP_SPCR_ADDR(0),XRDY,1) == 0) {
;
}
}
}
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -