|
|
/*------------------------------------------------------------------------------
|
|
|
#-- This file is a part of the libuc, microcontroler library
|
|
|
#-- Copyright (C) 2011, Alexis Jeandet
|
|
|
#--
|
|
|
#-- This program is free software; you can redistribute it and/or modify
|
|
|
#-- it under the terms of the GNU General Public License as published by
|
|
|
#-- the Free Software Foundation; either version 3 of the License, or
|
|
|
#-- (at your option) any later version.
|
|
|
#--
|
|
|
#-- This program is distributed in the hope that it will be useful,
|
|
|
#-- but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
#-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
#-- GNU General Public License for more details.
|
|
|
#--
|
|
|
#-- You should have received a copy of the GNU General Public License
|
|
|
#-- along with this program; if not, write to the Free Software
|
|
|
#-- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
#-------------------------------------------------------------------------------
|
|
|
#-- Author : Alexis Jeandet
|
|
|
#-- Mail : alexis.jeandet@member.fsf.org
|
|
|
#-------------------------------------------------------------------------------*/
|
|
|
#include <VS10XX.h>
|
|
|
#include <core.h>
|
|
|
#include <stdio.h>
|
|
|
|
|
|
void vs10XXopen(vs10XXDev *codec, spi_t dev, void (*setxCS)(char), void (*setxRST)(char), void (*setxDCS)(char), int (*getDREQ)())
|
|
|
{
|
|
|
codec->SPIdev = dev;
|
|
|
codec->setxCS = setxCS;
|
|
|
codec->setxDCS = setxDCS;
|
|
|
codec->setxRST = setxRST;
|
|
|
codec->getDREQ = getDREQ;
|
|
|
codec->setxDCS(1);
|
|
|
codec->setxCS(1);
|
|
|
codec->setxRST(0);
|
|
|
delay_100us(2);
|
|
|
codec->setxRST(1);
|
|
|
int status;
|
|
|
do{
|
|
|
status= vs10XXcmdread(codec,VSSTATUS);
|
|
|
}while (status==0xc);
|
|
|
printf("Status=0x%x\n",status);
|
|
|
status = (status>>4) & 0xF;
|
|
|
switch (status) {
|
|
|
case 0:
|
|
|
codec->VERSION = VS1001;
|
|
|
break;
|
|
|
case 1:
|
|
|
codec->VERSION = VS1011;
|
|
|
break;
|
|
|
case 2:
|
|
|
codec->VERSION = VS1002;
|
|
|
break;
|
|
|
case 3:
|
|
|
codec->VERSION = VS1003;
|
|
|
break;
|
|
|
case 4:
|
|
|
codec->VERSION = VS1053;
|
|
|
break;
|
|
|
case 5:
|
|
|
codec->VERSION = VS1033;
|
|
|
break;
|
|
|
case 7:
|
|
|
codec->VERSION = VS1103;
|
|
|
break;
|
|
|
default:
|
|
|
codec->VERSION = UNKNOWN;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
void vs10XXsoftreset(vs10XXDev* dev)
|
|
|
{
|
|
|
vs10XXcmdwrite(dev,VSMODE,(1<<2));
|
|
|
}
|
|
|
|
|
|
void vs10XXsetCansel(vs10XXDev* dev)
|
|
|
{
|
|
|
int mode=vs10XXcmdread(dev,VSMODE);
|
|
|
vs10XXcmdwrite(dev,VSMODE,mode|8);
|
|
|
}
|
|
|
|
|
|
void vs10XXsoftReset(vs10XXDev* dev)
|
|
|
{
|
|
|
int mode=vs10XXcmdread(dev,VSMODE);
|
|
|
vs10XXcmdwrite(dev,VSMODE,mode|4);
|
|
|
}
|
|
|
|
|
|
int vs10XXcanselAccepted(vs10XXDev* dev)
|
|
|
{
|
|
|
int mode=vs10XXcmdread(dev,VSMODE);
|
|
|
return ((mode & 8)!=8);
|
|
|
}
|
|
|
|
|
|
int vs10XXcmdread(vs10XXDev* dev,char address)
|
|
|
{
|
|
|
int result;
|
|
|
while(!dev->getDREQ());
|
|
|
dev->setxCS(0);
|
|
|
spiputw(dev->SPIdev,3);
|
|
|
spiputw(dev->SPIdev,address);
|
|
|
result = (0xFF00 & (spigetw(dev->SPIdev)<<8)) + (0xFF & spigetw(dev->SPIdev));
|
|
|
dev->setxCS(1);
|
|
|
return result;
|
|
|
}
|
|
|
|
|
|
|
|
|
void vs10XXcmdwrite(vs10XXDev* dev,char address,int value)
|
|
|
{
|
|
|
while(!dev->getDREQ());
|
|
|
dev->setxCS(0);
|
|
|
spiputw(dev->SPIdev,2<<8);
|
|
|
spiputw(dev->SPIdev,address);
|
|
|
spiputw(dev->SPIdev,value>>8);
|
|
|
spiputw(dev->SPIdev,value);
|
|
|
dev->setxCS(1);
|
|
|
}
|
|
|
|
|
|
|
|
|
void vs10XXstream32bytes(vs10XXDev* dev,char* buffer)
|
|
|
{
|
|
|
while(!dev->getDREQ());
|
|
|
dev->setxCS(1);
|
|
|
dev->setxDCS(0);
|
|
|
spiputnc(dev->SPIdev,buffer,32);
|
|
|
dev->setxDCS(1);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|