📄 dssdsk6711.c
字号:
/*
* Copyright 2001 by Texas Instruments Incorporated.
* All rights reserved. Property of Texas Instruments Incorporated.
* Restricted rights to use, duplicate or disclose this code are
* granted through contract.
* U.S. Patent Nos. 5,283,900 5,392,448
*/
/* "@(#) XDAS 2.12 05-21-01 (__imports)" */
/*
* ======== dssdsk6711.c ========
*
*/
#include <std.h>
#include <log.h>
#include <c6x.h>
#include <dss.h>
#include <edma.h>
#include "c6711dsk.h"
#define MCSP_RXINT_BIT 0x00000800 /* bitmask McBSP interrupt */
#define DSP_6711_EDMA_INT_BIT 0x00000100 /* bitmask EDMA interrupt */
/* function prototypes ... */
Uns codecControlRead(Uns reg);
Void codecControlWrite(Uns reg, Uns data);
Void codecError(Int id);
Void codecInit(Void);
Void mcbsp0Init(Void);
Uns mcbsp0Read(Void);
Void mcbsp0Write(Uns data);
/*
* ======== DSS_init ========
*/
Void DSS_init(Void)
{
#ifdef _EDMA_
EDMA_init();
/* Enable EDMA interrupt */
IER |= DSP_6711_EDMA_INT_BIT;
#else
/* Enable McBSP interrupt */
IER |= MCSP_RXINT_BIT;
#endif
mcbsp0Init();
codecInit();
}
/*
* ======== mcbsp0Init ========
*/
Void mcbsp0Init(Void)
{
*(volatile Uns *) McBSP0_SPCR = 0x0;
*(volatile Uns *) McBSP0_PCR = 0x0;
/* set RX and TX control registers to 16 bit data/frame */
*(volatile Uns *) McBSP0_RCR = 0x10040;
*(volatile Uns *) McBSP0_XCR = 0x10040;
/* setup SP control register */
*(volatile Uns *) McBSP0_SPCR = 0x00010001;
}
/*
* ======== mcbsp0Write ========
*/
Void mcbsp0Write(Uns data)
{
while ((*(volatile Uns *) McBSP0_SPCR & 0x20000) == 0);
*(volatile Uns *) McBSP0_DXR = data;
}
/*
* ======== mcbsp0Read ========
*/
Uns mcbsp0Read(void)
{
while ((*(volatile Uns *) McBSP0_SPCR & 0x2) == 0);
return (*(volatile Uns *) McBSP0_DRR);
}
/*
* ======== codecInit ========
*/
Void codecInit(Void)
{
Uns temp_variable;
/* Perform Voice Channel Initialisation of TLC320AD535 Codec */
/* AD535 has 2 serial port channels - Data, Voice */
/* Data Channel Controlled by Registers 1,2 (Reg 0 = NOP) */
/* Voice Channel Controlled by Registers 3,4,5,6 */
/* Only Voice channel used on DSK 6711 */
/* Set-Up Register 0 (NOP) - Dummy Read/Write Codec */
codecControlWrite(0, 0);
temp_variable = codecControlRead(0);
/* Set-Up Register 1 / 2 - Only Used by Data Serial Port -NA */
/* Set-Up Register 3 - S/W Reset + Power Down + No loop / gain=0dB */
codecControlWrite(3, 0x00C6); // + With Reset
codecControlWrite(3, 0x0006); // + Without Reset
temp_variable = codecControlRead(3);
if ( (temp_variable & 0x00ff) != 0x0006) {
codecError(3);
}
/* Set-Up Register 4 - Voice ADC gain = 0dB */
codecControlWrite(4, 0x0000);
temp_variable = codecControlRead(4);
if ( (temp_variable & 0x00ff) != 0x0000) {
codecError(4);
}
/* Set-Up Register 5 - Spkr L/R gain = 0dB */
codecControlWrite(5, 0x0002);
temp_variable = codecControlRead(5);
if ( (temp_variable & 0x00fe) != 0x0002) {
codecError(5);
}
/* Set-Up Register 6 - Handset gain = 0dB */
codecControlWrite(6, 0x0000);
temp_variable = codecControlRead(6);
if ( (temp_variable & 0x0080) != 0x0000) {
codecError(6);
}
/* Set-Up Register - (NOP) */
codecControlWrite(0, 0);
temp_variable = codecControlRead(0);
#if 0
for (;;) {
/* Codec Loopback Test Code */
mcbsp0Write((mcbsp0Read() & 0xfffe));
}
#endif
}
/*
* ======== codecControlRead ========
*/
Uns codecControlRead(Uns reg)
{
Uns regTemp = 0;
regTemp = ( ((reg & 0x001F) << 8) | 0x2000);
mcbsp0Write(0);
mcbsp0Read ( );
mcbsp0Write(1);
mcbsp0Read ( );
mcbsp0Write(regTemp);
regTemp = mcbsp0Read ( );
mcbsp0Write(0);
mcbsp0Read ( );
return (regTemp);
}
/*
* ======== codecControlWrite ========
*/
Void codecControlWrite(Uns reg, Uns data)
{
Uns regTemp = 0;
regTemp = ( (reg & 0x001F) << 8) | (data & 0x00ff);
mcbsp0Write(0);
mcbsp0Read ( );
mcbsp0Write(1);
mcbsp0Read ( );
mcbsp0Write(regTemp);
mcbsp0Read ( );
mcbsp0Write(0);
mcbsp0Read ( );
}
/*
* ======== codecError ========
*/
Void codecError(id)
{
LOG_error("Error setting up register %d", id);
for (;;) {
/* loop forever */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -