📄 mcsi.c
字号:
/******************************************************************************
TEXAS INSTRUMENTS INCORPORATED PROPRIETARY INFORMATION
Property of Texas Instruments -- For Unrestricted Internal Use Only
Unauthorized reproduction and/or distribution is strictly prohibited. This
product is protected under copyright law and trade secret law as an
unpublished work. Created 1987, (C) Copyright 1997 Texas Instruments. All
rights reserved.
Filename : mcsi.c
Description : MCSI driver
Project : Helen
Author : smunsch@tif.ti.com Sylvain Munsch.
modifyed by for samson p-monteil@ti.com Patrice Monteil
Modified for Helen by Jean-Philippe Ulpiano : jp_ulpiano@ti.com
*******************************************************************************/
#include "mcsi.h"
/******************************************************************************
NAME : MCSI_TestMcsiReg
SYNOPSIS : int MCSI_TestMcsiReg(int mcsi_base_address)
DESCRIPTION : Check read/write registers access
RETURN VALUE : Return the result of the test OK or BAD
PARAMETERS :
LIMITATIONS :
******************************************************************************/
int MCSI_TestMcsiReg(int mcsi_base_address)
{
int i, dataIoport, res=0;
/*---------------------------------------------------------------------
Check that the value of the control and status
registers after H/W reset is correct
--------------------------------------------------------------------*/
dataIoport = MCSI_CONTROL_REG(mcsi_base_address);
if (dataIoport != 0x0000) {
res = 2;
}
dataIoport = MCSI_MAIN_PARAM_REG(mcsi_base_address);
if (dataIoport != 0x0000) {
res = 3;
}
dataIoport = MCSI_INTERRUPTS_REG(mcsi_base_address);
if (dataIoport != 0x0000) {
res = 4;
}
dataIoport = MCSI_CHANNEL_USED_REG(mcsi_base_address);
if (dataIoport != 0x0000) {
res = 5;
}
dataIoport = MCSI_OVER_CLOCK_REG(mcsi_base_address);
if (dataIoport != 0x0000) {
res = 6;
}
dataIoport = MCSI_CLOCK_FREQUENCY_REG(mcsi_base_address);
if (dataIoport != 0x0000) {
res = 7;
}
dataIoport = MCSI_STATUS_REG(mcsi_base_address);
if (dataIoport != 0x0000) {
res = 8;
}
/*---------------------------------------------------------------------
Check that the value written to a control register can
be read back and is not reset after a S/W reset
--------------------------------------------------------------------*/
MCSI_MAIN_PARAM_REG(mcsi_base_address) = 0x0a10; /* write the values */
MCSI_INTERRUPTS_REG(mcsi_base_address) = 0x0520;
MCSI_CHANNEL_USED_REG(mcsi_base_address) = 0x5a30;
MCSI_OVER_CLOCK_REG(mcsi_base_address) = 0x0330;
MCSI_CLOCK_FREQUENCY_REG(mcsi_base_address) = 0x0630;
MCSI_CONTROL_REG(mcsi_base_address) = 0x0001;
MCSI_CONTROL_REG(mcsi_base_address) = 0x0005;
/* read them back and check */
dataIoport = MCSI_CONTROL_REG(mcsi_base_address);
if (dataIoport != 0x0005) {
res = 1;
}
dataIoport = MCSI_MAIN_PARAM_REG(mcsi_base_address);
if (dataIoport != 0x2a10) {
res = 9;
}
dataIoport = MCSI_INTERRUPTS_REG(mcsi_base_address);
if (dataIoport != 0x0520) {
res = 10;
}
dataIoport = MCSI_CHANNEL_USED_REG(mcsi_base_address);
if (dataIoport != 0x5a30) {
res = 11;
}
dataIoport = MCSI_OVER_CLOCK_REG(mcsi_base_address);
if (dataIoport != 0x0330) {
res = 12;
}
dataIoport = MCSI_CLOCK_FREQUENCY_REG(mcsi_base_address);
if (dataIoport != 0x0630) {
res = 13;
}
dataIoport = 0x0005;
dataIoport |= 0x0002; /* S/W reset */
MCSI_CONTROL_REG(mcsi_base_address) = dataIoport;
dataIoport = 0x0004;
dataIoport &= ~0x0002;
MCSI_CONTROL_REG(mcsi_base_address) = dataIoport;
dataIoport = MCSI_CONTROL_REG(mcsi_base_address); /* read values after S/W reset and check */
if (dataIoport != 0x0000) {
res = 14;
}
dataIoport = MCSI_MAIN_PARAM_REG(mcsi_base_address);
if (dataIoport != 0x2a10) {
res = 15;
}
dataIoport = MCSI_INTERRUPTS_REG(mcsi_base_address);
if (dataIoport != 0x0520) {
res = 16;
}
dataIoport = MCSI_CHANNEL_USED_REG(mcsi_base_address);
if (dataIoport != 0x5a30) {
res = 17;
}
dataIoport = MCSI_OVER_CLOCK_REG(mcsi_base_address);
if (dataIoport != 0x0330) {
res = 18;
}
dataIoport = MCSI_CLOCK_FREQUENCY_REG(mcsi_base_address);
if (dataIoport != 0x0630) {
res = 19;
}
if (res)
return res;
return 1;
}
/*-------------------------------------------------------------------------------
NAME : MCSI_WriteChannel
SYNOPSIS : void MCSI_WriteChannel(int mcsi_base_address,int channel, int data, int nb_bits)
DESCRIPTION : Write to an MCSI channel
PARAMETERS :
RETURN VALUE :
LIMITATIONS :
-----------------------------------------------------------------------------*/
void MCSI_WriteChannel(int mcsi_base_address,int channel, int data, int nb_bits)
{
data = data << (16-nb_bits);
switch(channel)
{
case 0: MCSI_TX0_REG(mcsi_base_address) = data; break;
case 1: MCSI_TX1_REG(mcsi_base_address) = data; break;
case 2: MCSI_TX2_REG(mcsi_base_address) = data; break;
case 3: MCSI_TX3_REG(mcsi_base_address) = data; break;
case 4: MCSI_TX4_REG(mcsi_base_address) = data; break;
case 5: MCSI_TX5_REG(mcsi_base_address) = data; break;
case 6: MCSI_TX6_REG(mcsi_base_address) = data; break;
case 7: MCSI_TX7_REG(mcsi_base_address) = data; break;
case 8: MCSI_TX8_REG(mcsi_base_address) = data; break;
case 9: MCSI_TX9_REG(mcsi_base_address) = data; break;
case 10: MCSI_TX10_REG(mcsi_base_address) = data; break;
case 11: MCSI_TX11_REG(mcsi_base_address) = data; break;
case 12: MCSI_TX12_REG(mcsi_base_address) = data; break;
case 13: MCSI_TX13_REG(mcsi_base_address) = data; break;
case 14: MCSI_TX14_REG(mcsi_base_address) = data; break;
case 15: MCSI_TX15_REG(mcsi_base_address) = data; break;
}
}
/*-------------------------------------------------------------------------------
NAME : MCSI_ReadChannel
SYNOPSIS : int MCSI_ReadChannel(int mcsi_base_address, int channel, int nb_bits)
DESCRIPTION : Read from an MCSI channel
PARAMETERS :
RETURN VALUE :
LIMITATIONS :
-----------------------------------------------------------------------------*/
int MCSI_ReadChannel(int mcsi_base_address, int channel, int nb_bits)
{
int dataIoport;
switch(channel) {
case 0: dataIoport = MCSI_RX0_REG(mcsi_base_address); break;
case 1: dataIoport = MCSI_RX1_REG(mcsi_base_address); break;
case 2: dataIoport = MCSI_RX2_REG(mcsi_base_address); break;
case 3: dataIoport = MCSI_RX3_REG(mcsi_base_address); break;
case 4: dataIoport = MCSI_RX4_REG(mcsi_base_address); break;
case 5: dataIoport = MCSI_RX5_REG(mcsi_base_address); break;
case 6: dataIoport = MCSI_RX6_REG(mcsi_base_address); break;
case 7: dataIoport = MCSI_RX7_REG(mcsi_base_address); break;
case 8: dataIoport = MCSI_RX8_REG(mcsi_base_address); break;
case 9: dataIoport = MCSI_RX9_REG(mcsi_base_address); break;
case 10: dataIoport = MCSI_RX10_REG(mcsi_base_address); break;
case 11: dataIoport = MCSI_RX11_REG(mcsi_base_address); break;
case 12: dataIoport = MCSI_RX12_REG(mcsi_base_address); break;
case 13: dataIoport = MCSI_RX13_REG(mcsi_base_address); break;
case 14: dataIoport = MCSI_RX14_REG(mcsi_base_address); break;
case 15: dataIoport = MCSI_RX15_REG(mcsi_base_address); break;
}
dataIoport = dataIoport >> (16-nb_bits);
return dataIoport;
}
/*-------------------------------------------------------------------------------
NAME : MCSI_ReadAllChannels
SYNOPSIS : void MCSI_ReadAllChannels(int mcsi_base_address, UWORD16 *ptr_rcv_area)
DESCRIPTION : Read from an MCSI channel
PARAMETERS :
RETURN VALUE :
LIMITATIONS :
-----------------------------------------------------------------------------*/
void MCSI_ReadAllChannels(int mcsi_base_address, UWORD16 *ptr_rcv_area)
{
int dataIoport;
dataIoport = MCSI_RX0_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX1_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX2_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX3_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX4_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX5_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX6_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX7_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX8_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX9_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX10_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX11_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX12_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX13_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX14_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
dataIoport = MCSI_RX15_REG(mcsi_base_address);
* ptr_rcv_area++ = dataIoport;
}
/*-------------------------------------------------------------------------------
NAME : MCSI_ReadTxMem
SYNOPSIS : int MCSI_ReadTxMem(int mcsi_base_address, int channel, int nb_bits)
DESCRIPTION : Read from Tx memory area
PARAMETERS :
RETURN VALUE :
LIMITATIONS :
-----------------------------------------------------------------------------*/
int MCSI_ReadTxMem(int mcsi_base_address, int channel, int nb_bits)
{
int dataIoport;
switch(channel) {
case 0: dataIoport = MCSI_TX0_REG(mcsi_base_address); break;
case 1: dataIoport = MCSI_TX1_REG(mcsi_base_address); break;
case 2: dataIoport = MCSI_TX2_REG(mcsi_base_address); break;
case 3: dataIoport = MCSI_TX3_REG(mcsi_base_address); break;
case 4: dataIoport = MCSI_TX4_REG(mcsi_base_address); break;
case 5: dataIoport = MCSI_TX5_REG(mcsi_base_address); break;
case 6: dataIoport = MCSI_TX6_REG(mcsi_base_address); break;
case 7: dataIoport = MCSI_TX7_REG(mcsi_base_address); break;
case 8: dataIoport = MCSI_TX8_REG(mcsi_base_address); break;
case 9: dataIoport = MCSI_TX9_REG(mcsi_base_address); break;
case 10: dataIoport = MCSI_TX10_REG(mcsi_base_address); break;
case 11: dataIoport = MCSI_TX11_REG(mcsi_base_address); break;
case 12: dataIoport = MCSI_TX12_REG(mcsi_base_address); break;
case 13: dataIoport = MCSI_TX13_REG(mcsi_base_address); break;
case 14: dataIoport = MCSI_TX14_REG(mcsi_base_address); break;
case 15: dataIoport = MCSI_TX15_REG(mcsi_base_address); break;
}
dataIoport = dataIoport >> (16-nb_bits);
return dataIoport;
}
/*-------------------------------------------------------------------------------
NAME : MCSI_enable
SYNOPSIS : void MCSI_enable(int mcsi_base_address)
DESCRIPTION : Enable MCSI clock
PARAMETERS :
RETURN VALUE :
LIMITATIONS :
-----------------------------------------------------------------------------*/
void MCSI_enable(int mcsi_base_address)
{
MCSI_CONTROL_REG(mcsi_base_address) |= 0x01;
}
/*-------------------------------------------------------------------------------
NAME : MCSI_disable
SYNOPSIS : void MCSI_disable(int mcsi_base_address)
DESCRIPTION : Disable MCSI clock
PARAMETERS :
RETURN VALUE :
LIMITATIONS :
-----------------------------------------------------------------------------*/
void MCSI_disable(int mcsi_base_address)
{
MCSI_CONTROL_REG(mcsi_base_address) &= 0xFE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -