📄 psoc.c.bak
字号:
/*
* INVENTEC corporation (c)2007 all rights reserved.
* Description: PSoC driver for gladius
*
* Update:
* Revision Date Author Reason
* ======== ========== =================== ==================
* 1.0.0 2007-11-22 Liu.Fang-dong(ED) Create
*
* Known issues:None
*
* Support Chip:
* CY8C27143 CY8C27243 CY8C27443 CY8C27543 CY8C27643
* CY8C24123 CY8C24223 CY8C24423
* CY8C22113 CY8C22213
* CY8C21123 CY8C21223 CY8C21323
* CY8C21234 CY8C21334 CY8C21434 CY8C21534 CY8C21634
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <string.h>
#include "fx2.h"
#include "fx2regs.h"
#include "absacc.h"
#include "serial.h"
#include "scmain.h"
#include "cmdlist.h"
#include "PSoC.h"
#ifndef __USE_USB__
#include "serial.h"
#endif
//vectors used by PSoc
xdata char* vector_init_1 = "110010100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000110111101110000000011111011110110000000001111001111100000111010111100111110010000001111111011110101000000001111101111010000000011111100111110111000000011111011111001001100001111101111101001000000111110111100000000100111111011111000000000001111101111111100010010111";
xdata char* vector_init_2 = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000000001111110111100000000011011111011111000000000001111101111111100010010111";
xdata char* vector_init_3_3v = "11011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001010001111110111110011111100011111011111010001100001111101111111100010010111000000000000000000000011011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001100000111110111110011110101011111011111010001100001111101111011100010000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000101000111111011111001111110011111101111101000110000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000110000011111011111001111010001111101111101000110000111110111101110001000011111011111111000100101110000000000000000000000";
xdata char* vector_init_3_5v = "11011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001010001111110111110011111110011111011111010001100001111101111111100010010111000000000000000000000011011110111000000001111101111010000000011111110111101010000000011111011110110000010001111101111100001100000111110111110011110101011111011111010001100001111101111011100010000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000101000111111011111001111111011111101111101000110000111110111111110001001011100000000000000000000001101111011100000000111110111101000000001111111011110101000000001111101111011000001000111110111110000110000011111011111001111010001111101111101000110000111110111101110001000011111011111111000100101110000000000000000000000";
xdata char* vector_checksum_setup_CY8C27xxx = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000000000111110111100000000011111111011111000000000001111101111111100010010111";
//xdata char* vector_checksum_setup_CY8C21x23_24xxx = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101001000000111110111100000000011111111011111000000000001111101111111100010010111";
//xdata char* vector_checksum_setup_CY8C21x34 = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101100000000111110111110010011000011111011111010010000001111001111101010000000111110111100000000011111111011111000000000001111101111111100010010111";
//xdata char* vector_checksum_setup_CY8C22xxx = "1101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000100000111110111100000000011111111011111000000000001111101111111100010010111";
xdata char* vector_verify_setup = "110111101110000000011111011110110000000001111001111100000111010111100111110010000001111111011110101000000001111101111010000000011111100111110111000000011111011111001001100001111101111101001000000111110111100000000000111111011111000000000001111101111111100010010111";
xdata char* vector_ID_setup = "110111101110001000011111011100000000000101111101111011100000000111110111101100000000011110011111000001110101111001111100100000011111110111101010000000011111011110100000000111111001111101110000000111110111110010011000011111011111010010000001111001111101000000000111110111100000000011011111011111000000000001111101111111100010010111";
xdata char* vector_40zero = "0000000000000000000000000000000000000000";
//-----------------------------------------------------------------------------
//list for command
//-----------------------------------------------------------------------------
const struct command_name xdata psoc_cmd[] = {
{"select", do_psoc_init},
{"getchecksum", GetCheckSum},
{"sgpiotest", SgpioTest},
{"psocreset", PsocReset},
{0, 0}
};
//-----------------------------------------------------------------------------
//extern function
//-----------------------------------------------------------------------------
extern int mydef_strcasecmp(char *dst, char *src);
extern int (*lookup_command_func(struct command_name *pcmd,char * cmd_str))();
extern char *get_current_cmd(char * buff);
extern char *lookup_return_str(int ret_cmd);
extern int lookup_return_val(struct command_param *pm, char * cmd_str);
extern struct command_list * add_to_retlist(char * cmd);
extern void (*fp_blinking)(BYTE);
int do_psoc_init()
{
return RET_OK;
}
int PsocReset(void)
{
SETOUT_PD(0);
PSOC_RESET(HIGH);
EZUSB_Delay(1);
PSOC_RESET(LOW);
EZUSB_Delay(10);
return RET_OK;
}
void PsocDelay(int count)
{
int i = 0;
for(i = 0; i < 5*count; i++)
{
}
}
//*****************************************************************************
// function name: WriteBit()/ReadBit()
// description: send only one bit to SDATA
// return: none
// note :
//*****************************************************************************
void WriteBit(char p)
{
p &= 0x01;
if(0 == p)
PSOC_DOUT(LOW);
else
PSOC_DOUT(HIGH);
}
BYTE ReadBit(void)
{
return PSOC_DIN;
}
//*****************************************************************************
// function name: /Readbyte()
// description: send/read a byte
// return: none
// note :
//*****************************************************************************
BYTE ReadByte(void)
{
BYTE returnValue = 0;
BYTE tmp = 0;
int n = 0;
SET_DIN;
EZUSB_Delay(1);
for (n = 7; n >= 0;n--)
{
PSOC_CLK(HIGH);
//PsocDelay(1);
PSOC_CLK(LOW);
//PsocDelay(1);
returnValue |=( (tmp = ReadBit())<<n);
}
SET_DOUT;
EZUSB_Delay(1);
return returnValue;
}
//*****************************************************************************
// function name: WriteVector()
// description: send/read a byte
// return: none
// note :
//*****************************************************************************
void WriteVector(char* vector)
{
int n = 0;
while (vector[n] != '\0')
{
PSOC_CLK(HIGH);
WriteBit(vector[n]);
PSOC_CLK(LOW);
n++;
}
}
//*****************************************************************************
// function name: WaitSingle()
// description: wait the single given bye psoc that shows we can give next
// vector or we can read back from psoc
// return: none
// note :
//*****************************************************************************
void WaitSingle(void)
{
int delay = 100000;
SET_DIN;
EZUSB_Delay(1);
//wait HIGH single
while(delay--)
{
if(HIGH == ReadBit())
{
break;
}
else
{
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
}
}
//wait LOW single
delay = 100000;
while(delay--)
{
if(LOW == ReadBit())
{
SET_DOUT;
EZUSB_Delay(1);
WriteVector(vector_40zero);
break;
}
else
{
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
}
}
SET_DOUT;
EZUSB_Delay(1);
}
//*****************************************************************************
// function name: GetCheckSum()
// description: Get psoc checksum
// return: 0 success -1 fail
// note :
//*****************************************************************************
int GetCheckSum(void)
{
BYTE psocId = 0;
int checksum = 0;
xdata char param[4];
memset (param, '\0', sizeof (param));
//input output init for psoc checksum
SETOUT_PD(0);//RESET
SETOUT_PD(1);//CLK
SETOUT_PD(2);//DATA
//clean the disturb caused by sgpio
PSOC_CLK(LOW);
PSOC_DOUT(LOW);
PSOC_RESET(LOW);
//3.3v pull, down for psoc, up for sgpio
_3V_PULL_DOWN_ ;
EZUSB_Delay(3);
EA = 0;//disable interrupt
//psoc init for psoc programme
PSOC_RESET(HIGH);
EZUSB_Delay(1);
PSOC_RESET(LOW);
WriteVector(vector_init_1);
WaitSingle();
EA = 1;//enable interrupt
WriteVector(vector_init_2);
WaitSingle();
WriteVector(vector_init_3_3v);
EZUSB_Delay(1);
//for get psoc ID
WriteVector(vector_ID_setup);
WaitSingle();
WriteVector("10111111000");
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
ReadByte();
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
WriteVector("110111111001");
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
psocId = ReadByte();
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
WriteVector("1");
switch(psocId)
{
case PSoC_CY8C27143_ID:
case PSoC_CY8C27243_ID:
case PSoC_CY8C27443_ID:
case PSoC_CY8C27543_ID:
case PSoC_CY8C27643_ID:
WriteVector(vector_checksum_setup_CY8C27xxx);
break;
/*
case PSoC_CY8C21123_ID:
case PSoC_CY8C21223_ID:
case PSoC_CY8C21323_ID:
case PSoC_CY8C24123_ID:
case PSoC_CY8C24223_ID:
case PSoC_CY8C24423_ID:
WriteVector(vector_checksum_setup_CY8C21x23_24xxx);
break;
case PSoC_CY8C21234_ID:
case PSoC_CY8C21334_ID:
case PSoC_CY8C21434_ID:
case PSoC_CY8C21534_ID:
case PSoC_CY8C21634_ID:
WriteVector(vector_checksum_setup_CY8C21x34);
break;
case PSoC_CY8C22113_ID:
case PSoC_CY8C22213_ID:
WriteVector(vector_checksum_setup_CY8C22xxx);
break;
*/
default:
break;
}
WaitSingle();
WriteVector("10111111001");
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
checksum |= (ReadByte()<<8);
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
WriteVector("110111111000");
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
checksum |= ReadByte();
sprintf(param," %04x",checksum);
add_to_retlist(param);
PSOC_CLK(HIGH);
PSOC_CLK(LOW);
WriteVector("1");
return RET_DONE;
}
//=============================================================================-
//test sgpio
//=============================================================================-
int SgpioTest()
{
int i = 0;
int val = 0;
int result = 0;
BYTE tmp = 0;
BYTE param[16];
memset (param, '\0', sizeof (param));
if (get_current_cmd(param)==NULL)
{
return RET_ERROR;
}
val = strtol(param,NULL,16);
if (val > 0xfff || val <0 )
{
return RET_ERROR;
}
//input output init for sgpio
SETOUT_PD(2);//START
SETOUT_PD(3);//CLK
SETOUT_PD(4);//DIN
SETIN_PD(1);//DOUT
//clean the disturb caused by psoc
SGPIO_START(LOW);
SGPIO_CLK(LOW);
SGPIO_DIN(LOW);
EZUSB_Delay(1);
//3.3v pull, down for psoc, up for sgpio
_3V_PULL_UP_ ;
EZUSB_Delay(1);
//EA = 0; // disable 8051 interrupts
//clear start
SGPIO_START(LOW);
for(i=0; i<8; i++)
{
SGPIO_CLK(HIGH);
PsocDelay(1);
SGPIO_CLK(LOW);
PsocDelay(1);
}
//set start 1-0
SGPIO_START(HIGH);
SGPIO_CLK(HIGH);
PsocDelay(1);
SGPIO_CLK(LOW);
PsocDelay(1);
SGPIO_START(LOW);
//set data
for (i=0; i<12; i++)
{
//PUT DATAOUT
if (val & (1<<i))
{
SGPIO_DIN(HIGH);
PsocDelay(1);
}
else
{
SGPIO_DIN(LOW);
PsocDelay(1);
}
SGPIO_CLK(HIGH);
PsocDelay(1);
SGPIO_CLK(LOW);
PsocDelay(1);
//GET DATAIN
tmp = SGPIO_DOUT & 0x01;
result |= (tmp<<i);
}
//clear start
SGPIO_START(0);
PsocDelay(1);
for (i=0; i<8; i++)
{
SGPIO_CLK(HIGH);
PsocDelay(1);
SGPIO_CLK(LOW);
PsocDelay(1);
}
//EA = 1; // Enable 8051 interrupts
sprintf(param,"(%bX)",result);
add_to_retlist(param);
return RET_DONE;
}
//=============================================================================-
//do_psoc_entry
//=============================================================================-
int do_psoc_entry(char *cmd)
{
int (*cmd_func) ();
int ret=0;
cmd_func=lookup_command_func(psoc_cmd,cmd);
if (cmd_func!=NULL)
{
ret=(*cmd_func)();
return(ret);
}
return RET_ERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -