📄 codec_main.c
字号:
/******************************************************************************/
/*main.c */
/* */
/* This is proprietary information, not to be published -- DIGIPRO DATA */
/* Copyright (C) 2002, DigiPro Information Co.,Ltd. All Rights Reserved. */
/* */
/* Author: Wu DingMing & Li Fayue */
/* Date: August 12-28, 2002 */
/******************************************************************************/
#include <stdio.h>
#include "mmdrv.h"
#include "mcbsp.h"
#include "cpu_reg.h"
#include "lcd_86.h"
ioport unsigned portefff;
#define IO_374 portefff
void init_exint1_interrupt();
void init_GPIO(void);
void mic_bypass(void);
void line_in_bypass(void);
void mic_record(void);
void line_in_record(void);
void codec_play(void);
void DEAL_RX(unsigned int i);
unsigned int DEAL_TX(void);
void stop_interrupt(); //stop receive & tranmit interrupt
unsigned int flag=0xffff;
unsigned long secter_num;
unsigned int ping_buf1[0x2000];
unsigned int ping_buf2[0x2000];
unsigned int enc_flag=0;
unsigned int input_flag =0;
unsigned int rl_flag=0;
unsigned int count1=0 ;
#define max_secter_num 33
#define init_secter_num 0
void main(void)
{
unsigned int i,j;
unsigned int key_val;
SWWSR = 0x7fff;
SWCR = 0x0001;
BSCR = 0x8006;
CLKMD = PLL_DIV_INIT;
waitloop( 0x0400 );
CLKMD = PLL_LOCK_INIT_X(9);
waitloop( 0x0400 );
PMST = 0x0168;
Init_MCBSP_codec();
init_codec_linein();
init_exint1_interrupt();
init_GPIO();
init_lcd();
LCD_clear(0);
cur_row=2;
cur_col=20;
LCD_pr_chars("RECORD_PLAY TEST",16);
cur_row=3;
cur_col=1;
LCD_pr_chars("=======================",23);
IO_374=0xffff; //374 enable
Close_LED_Data();
Close_LED_Traf();
Close_LED_sign();
waitloop( 0x0400 );
while(1)
{
i=Get_Key();
waitloop( 0x04000 );
j=Get_Key();
if(i==j)
{
flag=0xffff;
key_val=j; /*Save key_val*/
switch(key_val)
{
default:
break;
case 1:
cur_row=4;
cur_col=10;
LCD_pr_chars(" Mic_Bypass ",17);
cur_row=5;
cur_col=15;
LCD_pr_chars(" ",17);
mic_bypass();
break;
case 2:
cur_row=4;
cur_col=10;
LCD_pr_chars(" Line_In_Bypass ",17);
cur_row=5;
cur_col=15;
LCD_pr_chars(" ",17);
line_in_bypass();
break;
case 3:
cur_row=4;
cur_col=10;
LCD_pr_chars("Mic_Rec_Loopback ",17);
cur_row=5;
cur_col=15;
LCD_pr_chars(" ",17);
mic_record();
break;
case 4:
cur_row=4;
cur_col=10;
LCD_pr_chars("Line_Rec_Loopback",17);
cur_row=5;
cur_col=15;
LCD_pr_chars(" ",17);
line_in_record();
break;
case 6:
cur_row=4;
cur_col=10;
LCD_pr_chars(" codec_play ",17);
cur_row=5;
cur_col=15;
LCD_pr_chars(" ",17);
codec_play();
break;
}
}
}
}
void init_exint1_interrupt()
{
IFR =0xffff;
IMR =0x0002; //EXINT1=IMR.1
asm("\trsbx\tintm ");
}
void init_tx_interrupt() //transmit interrupt
{
IFR =0xffff;
IMR =0x22; //BXINT0=IMR.5=1, BXINT0=IMR.4=0,EXINT1=IMR.1=1
asm("\trsbx\tintm ");
}
void init_re_interrupt() //receive interrupt
{
IFR =0xffff;
IMR =0x12; //BXINT0=IMR.5=0, BXINT0=IMR.4=1,EXINT1=IMR.1=1
asm("\trsbx\tintm ");
}
void stop_interrupt() //stop receive & tranmit interrupt
{
IFR =0xffff;
IMR =0x0002; //EXINT1=IMR.1
asm("\trsbx\tintm ");
}
interrupt void BRINT0_isr(void)
{
unsigned int i;
i = MCBSP0_DRR1; /* DRR1 = txdata */
MCBSP0_DXR1 = i;
DEAL_RX(i);
}
interrupt void BXINT0_isr()
{
MCBSP0_DXR1 = DEAL_TX();
}
interrupt void EXINT1_isr()
{
unsigned int i;
IO_374=0xffff; //374 enable
Close_LED_Data();
Close_LED_Traf();
Close_LED_sign();
IFR =0xffff;
// while(!(GPIOSR&0x01))
{
asm("\tnop");
asm("\tnop");
}
flag=0; //~flag;
cur_row=5;
cur_col=15;
LCD_pr_chars("Codecr_Stop_play ",17);
for(i=0;i<8;i++)
{
Disp_LED_sign(0,i);
}
}
void init_GPIO(void)
{
GPIOCR =0xfffe; //EXINT1=GPIO.0=input=0,nand_cs=GPIO.6=output=1
GPIOSR =0x0040; //GPIO.6=output=1
}
void mic_bypass(void)
{
unsigned int data;
Init_MCBSP_codec();
init_codec_mic();
while(flag)
{
data=mcbsp0_codec_rx_data();
mcbsp0_codec_tx_data(data);
}
init_codec_linein();
}
void line_in_bypass(void)
{
unsigned int sign_bit=0;
unsigned int sign_state=1;//1
unsigned int data;
// Init_MCBSP_codec();
// init_codec_linein();
while(flag)
{
data=mcbsp0_codec_rx_data();
mcbsp0_codec_tx_data(data);
Disp_LED_sign((sign_state&0x01),sign_bit);
sign_bit++;
if(sign_bit==0x7f0)
{
sign_bit=0;
sign_state =~sign_state;
}
}
}
void mic_record(void)
{
unsigned int sign_bit=0;
unsigned int sign_state=1;
Init_MCBSP_codec();
init_codec_mic();
init_re_interrupt(); //receive interrupt
enc_flag=0;
secter_num=init_secter_num;
count1 =0;
MCBSP0_DXR1 = MCBSP0_DRR1; /* DRR1 = txdata */
while(flag)
{
if(enc_flag)
{
Disp_LED_sign((sign_state&0x01),sign_bit);
sign_bit++;
if(sign_bit==8)
{
sign_bit=0;
sign_state =~sign_state;
}
enc_flag=0;
if(input_flag)
{
erase_nand_flash(secter_num);
Write_nand_flash_block(secter_num,ping_buf2,0);
}
else
{
erase_nand_flash(secter_num);
Write_nand_flash_block(secter_num,ping_buf1,0);
}
secter_num +=32;
if(secter_num>32*max_secter_num)
{
asm("\tnop");
asm("\tnop");
asm("\tnop");
secter_num=init_secter_num;
break;
}
}
}
Close_LED_Data();
Close_LED_Traf();
Close_LED_sign();
cur_row=5;
cur_col=15;
LCD_pr_chars("Codecr_Stop_play ",17);
stop_interrupt(); //stop receive & tranmit interrupt
init_codec_linein();
}
void line_in_record(void)
{
unsigned int sign_bit=0;
unsigned int sign_state=1;
enc_flag=0;
secter_num=init_secter_num;
count1 =0;
Init_MCBSP_codec();
// init_codec_linein();
init_re_interrupt(); //receive interrupt
MCBSP0_DXR1 = MCBSP0_DRR1; /* DRR1 = txdata */
while(flag)
{
if(enc_flag)
{
Disp_LED_sign((sign_state&0x01),sign_bit);
sign_bit++;
if(sign_bit==8)
{
sign_bit=0;
sign_state =~sign_state;
}
enc_flag=0;
if(input_flag)
{
erase_nand_flash(secter_num);
Write_nand_flash_block(secter_num,ping_buf2,0);
}
else
{
erase_nand_flash(secter_num);
Write_nand_flash_block(secter_num,ping_buf1,0);
}
secter_num +=32;
if(secter_num>32*max_secter_num)
{
asm("\tnop");
asm("\tnop");
asm("\tnop");
secter_num=init_secter_num;
break;
}
}
}
Close_LED_Data();
Close_LED_Traf();
Close_LED_sign();
cur_row=5;
cur_col=15;
LCD_pr_chars("Codecr_Stop_play ",17);
stop_interrupt(); //stop receive & tranmit interrupt
}
void codec_play(void)
{
unsigned int sign_bit=0;
unsigned int sign_state=1;
enc_flag=0;
secter_num=init_secter_num+32;
input_flag = 1;
count1 =0;
Init_MCBSP_codec();
read_nand_flash_block(secter_num,ping_buf2,0);
secter_num +=32;
count1 =0;
// init_tx_interrupt();
MCBSP0_DXR1 = 0; /* DRR1 = txdata */
while(flag)
{
mcbsp0_codec_tx_data(DEAL_TX());
if(enc_flag)
{
Disp_LED_sign((sign_state&0x01),sign_bit);
sign_bit++;
if(sign_bit==8)
{
sign_bit=0;
sign_state =~sign_state;
}
enc_flag=0;
if(input_flag)
{
read_nand_flash_block(secter_num,ping_buf2,0);
}
else
{
read_nand_flash_block(secter_num,ping_buf1,0);
}
secter_num +=32;
if(secter_num>32*max_secter_num)
{
asm("\tnop");
asm("\tnop");
asm("\tnop");
secter_num=init_secter_num;
break;
}
}
}
Close_LED_Data();
Close_LED_Traf();
Close_LED_sign();
cur_row=5;
cur_col=15;
LCD_pr_chars("Codecr_Stop_play ",17);
stop_interrupt(); //stop receive & tranmit interrupt
}
void DEAL_RX(unsigned int i)
{
if(rl_flag&1)
{
if(input_flag)
{
ping_buf2[count1] = i;
}
else
{
ping_buf1[count1] = i;
}
count1 ++;
if(count1 ==0x2000)
{
if(input_flag)
{
input_flag =0;
}
else
{
input_flag =1;
}
count1 =0;
enc_flag=1; //writer data to nand_flash
}
}
rl_flag++;
}
unsigned int DEAL_TX(void)
{
unsigned int i;
if(input_flag)
{
i= ping_buf2[count1] ;
}
else
{
i= ping_buf1[count1] ;
}
if(rl_flag&1)
{
count1 ++;
if(count1 ==0x2000)
{
if(input_flag)
{
input_flag =0;
}
else
{
input_flag =1;
}
count1 =0;
enc_flag=1; //writer data to nand_flash
}
}
rl_flag++;
return i;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -