📄 spi_cmd.c
字号:
#include "rtl_types.h"#include "asicRegs.h"#include "gpio.h"#include "spi.h"#include "rtl_cle.h" #include "cle_utility.h"#include "slic.h"#include "../pcm2.h"#include <voip_support.h>static int32 _rtl8651_gpioCmd(uint32 userId, int32 argc,int8 **saved) { int32 size; int8 *nextToken; cle_getNextCmdToken(&nextToken,&size,saved); if (strcmp(nextToken, "init") == 0) { uint32 port; uint32 pinMask; int32 pin; int32 retval; enum GPIO_PERIPHERAL type; enum GPIO_DIRECTION dir; cle_getNextCmdToken(&nextToken,&size,saved); /* 'port' */ cle_getNextCmdToken(&nextToken,&size,saved); /* port number */ port = U32_value( nextToken ); cle_getNextCmdToken(&nextToken,&size,saved); /* 'pin' */ if (strcmp(nextToken, "pin") == 0) { cle_getNextCmdToken(&nextToken,&size,saved); /* pin number */ pin = U32_value( nextToken ); pinMask = (uint32)1 << pin; cle_getNextCmdToken(&nextToken,&size,saved); /* 'type' */ } else pinMask = 0xff; /* pin0~pin7 */ cle_getNextCmdToken(&nextToken,&size,saved); /* gpio|peri0|peri1 */ if (strcmp(nextToken, "gpio") == 0) type = GPIO_PERI_GPIO; else if (strcmp(nextToken, "peri0") == 0) type = GPIO_PERI_TYPE0; else if (strcmp(nextToken, "peri1") == 0) type = GPIO_PERI_TYPE1; else return FAILED; cle_getNextCmdToken(&nextToken,&size,saved); /* 'direction' */ cle_getNextCmdToken(&nextToken,&size,saved); /* in/out */ if (strcmp(nextToken, "in") == 0) dir = GPIO_DIR_IN; else if (strcmp(nextToken, "out") == 0) dir = GPIO_DIR_OUT; else return FAILED; for( pin = 7; pin >= 0; pin-- ) { if ( pinMask & ((uint32)1<<pin) ) { rtlglue_printf( "GPIO[Port%c:%d] is type:%s dir:%s ...", port+'A', pin, type==GPIO_PERI_GPIO?"GPIO": type==GPIO_PERI_TYPE0?"Type 0":"Type 1", dir==GPIO_DIR_IN?"IN":"OUT"); retval = _rtl865x_initGpioPin( GPIO_ID(port, pin), type, dir, GPIO_INT_DISABLE ); if ( retval != SUCCESS ) return retval; rtlglue_printf( "OK\n" ); } } } else if (strcmp(nextToken, "get") == 0) { uint32 port; int32 pin; int32 retval; uint32 data; uint32 pinMask; cle_getNextCmdToken(&nextToken,&size,saved); /* 'port' */ cle_getNextCmdToken(&nextToken,&size,saved); /* port number */ port = U32_value( nextToken ); cle_getNextCmdToken(&nextToken,&size,saved); /* 'pin' */ if (strcmp(nextToken, "pin") == 0) { cle_getNextCmdToken(&nextToken,&size,saved); /* pin number */ pin = U32_value( nextToken ); pinMask = (uint32)1 << pin; } else pinMask = 0xff; for( pin = 7; pin >= 0; pin-- ) { if ( pinMask & ((uint32)1<<pin) ) { rtlglue_printf( "GPIO[Port%c:%d] = ", port+'A', pin ); retval = _rtl865x_getGpioDataBit( GPIO_ID(port,pin), &data ); if ( retval != SUCCESS ) return retval; rtlglue_printf( "%d\n", data ); } } } else if (strcmp(nextToken, "set") == 0) { uint32 port; int32 pin; int32 retval; uint32 data; uint32 pinMask; cle_getNextCmdToken(&nextToken,&size,saved); /* 'port' */ cle_getNextCmdToken(&nextToken,&size,saved); /* port number */ port = U32_value( nextToken ); cle_getNextCmdToken(&nextToken,&size,saved); /* 'pin' */ if (strcmp(nextToken, "pin") == 0) { cle_getNextCmdToken(&nextToken,&size,saved); /* pin number */ pin = I32_value( nextToken ); pinMask = (uint32)1 << pin; cle_getNextCmdToken(&nextToken,&size,saved); /* 'data' */ cle_getNextCmdToken(&nextToken,&size,saved); /* data */ data = U32_value( nextToken ) << pin; } else { pinMask = 0xff; cle_getNextCmdToken(&nextToken,&size,saved); /* data */ data = U32_value( nextToken ); } for( pin = 7; pin >= 0; pin-- ) { if ( pinMask & ((uint32)1<<pin) ) { rtlglue_printf( "GPIO[Port%c:%d] = %d ... ", port+'A', pin, (data>>pin)&0x1 ); retval = _rtl865x_setGpioDataBit( GPIO_ID(port,pin), (data>>pin)&0x1 ); if ( retval != SUCCESS ) return retval; rtlglue_printf( "OK\n" ); } } } else return FAILED; return SUCCESS;}static int32 _rtl8651_Si3210Cmd(uint32 userId, int32 argc,int8 **saved) { int32 nRet = SUCCESS; int32 size; int8 *nextToken; cle_getNextCmdToken(&nextToken,&size,saved); if (strcmp(nextToken, "init") == 0) { int32 maxspeed; int32 resetDelay; int module; int chid = 0; cle_getNextCmdToken(&nextToken,&size,saved); /* 'onboard' or 'module' */ if (strcmp(nextToken, "onboard") == 0 ) module = 0; else if (strcmp(nextToken, "module") == 0 ) module = 1; else return FAILED; cle_getNextCmdToken(&nextToken,&size,saved); /* 'max_speed' */ cle_getNextCmdToken(&nextToken,&size,saved); /* max speed */ maxspeed = I32_value( nextToken ); cle_getNextCmdToken(&nextToken,&size,saved); /* channel */ chid = I32_value( nextToken ); cle_getNextCmdToken(&nextToken,&size,saved); /* 'reset_delay' */ if (strcmp(nextToken, "reset_delay") == 0) { cle_getNextCmdToken(&nextToken,&size,saved); /* reset delay */ resetDelay = I32_value( nextToken ); } else { resetDelay = 200000000 / 4; /* 250ms */ } /* Enable PCM to generate Frame Sync and Clock from 865xB to SLIC. */ rtlglue_printf("Enable PCM to generate Frame Sync and Clock from 865xB to SLIC.\n"); REG32(0xbd017000) |= 0x00001800; /* Configure GPIO_PortB as PCM port */ rtlglue_printf("Configure GPIO_PortB as PCM port.\n"); _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 0), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_FSYNC */ _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 1), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_CLK */ _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 2), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_SDOUT */ _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 3), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_SDIN */ _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 4), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_DS0 */ _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 5), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_DS1 */ _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 6), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_DS2 */ _rtl865x_initGpioPin( GPIO_ID(GPIO_PORT_B, 7), GPIO_PERI_TYPE0, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* PCM_DS3 */ /* RESET Si3210 */ if ( module ) {#if 0 _rtl865x_initGpioPin(GPIO_ID(GPIO_PORT_D,3), GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* CS_ */ _rtl865x_initGpioPin(GPIO_ID(GPIO_PORT_D,6), GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* RESET_ */ _rtl865x_initGpioPin(GPIO_ID(GPIO_PORT_D,7), GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* TEST */ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( GPIO_ID(GPIO_PORT_D, 3), 1 ); /* CS_ */ _rtl865x_setGpioDataBit( GPIO_ID(GPIO_PORT_D, 6), 1 ); /* RESET_ */ _rtl865x_setGpioDataBit( GPIO_ID(GPIO_PORT_D, 7), 1 ); /* TEST */ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( GPIO_ID(GPIO_PORT_D, 6), 0 ); /* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( GPIO_ID(GPIO_PORT_D, 6), 1 ); /* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_spi_init( &spiDev[chid], GPIO_ID(GPIO_PORT_D, 2), GPIO_ID(GPIO_PORT_D, 3), GPIO_ID(GPIO_PORT_D, 0), GPIO_ID(GPIO_PORT_D, 1), maxspeed );#endif } else {#ifdef CONFIG_RTL865X_PCM int i; _rtl865x_initGpioPin(PIN_RELAY, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE); /* Relay */ if(chid ==0){ _rtl865x_initGpioPin(PIN_CS1, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* CS_ */ _rtl865x_initGpioPin(PIN_RESET1, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( PIN_CS1, 1 ); /* CS_ */ _rtl865x_setGpioDataBit( PIN_RESET1, 1 ); /* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( PIN_RESET1, 0 ); /* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( PIN_RESET1, 1 ); /* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_spi_init( &spiDev[chid], GPIO_ID(GPIO_PORT_E, 4), GPIO_ID(GPIO_PORT_E, 3), GPIO_ID(GPIO_PORT_E, 5), GPIO_ID(GPIO_PORT_E, 6), maxspeed ); } if( chid == 1) { /* Slic's another channel */ _rtl865x_initGpioPin(PIN_CS2, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* CS_ */ _rtl865x_initGpioPin(PIN_RESET2, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );/* RESET_ */ for( i = resetDelay; i > 0; i-- ); /* 5MHz ~= 25ms*/ _rtl865x_setGpioDataBit( PIN_CS2, 1 ); /* CS_ preset to high state*/ _rtl865x_setGpioDataBit( PIN_RESET2, 1 );/* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( PIN_RESET2, 0 );/* RESET_ Hold RESET_ low PCLK and FS is present and stable*/ for( i = resetDelay; i > 0; i-- ); _rtl865x_setGpioDataBit( PIN_RESET2, 1 );/* RESET_ */ for( i = resetDelay; i > 0; i-- ); _rtl865x_spi_init( &spiDev[chid], GPIO_ID(GPIO_PORT_E, 4),/*SLIC1: SPI CLK*/ GPIO_ID(GPIO_PORT_C, 0),/*SLIC1: CS*/ GPIO_ID(GPIO_PORT_E, 5),/*SLIC1: Data out from 865x*/ GPIO_ID(GPIO_PORT_E, 6),/*SLIC1: Data in to 865x*/ maxspeed ); } _rtl865x_setGpioDataBit(PIN_RELAY, 1);#endif } } else if (strcmp(nextToken, "read") == 0) /* read direct register */ { uint32 reg = 0; int chid = 0; cle_getNextCmdToken(&nextToken,&size,saved); /* register number */ reg = U32_value(nextToken); cle_getNextCmdToken(&nextToken,&size,saved); /* slic channel id */ chid = U32_value(nextToken);#ifdef CONFIG_RTL865X_PCM uint8 regVal; regVal = _slic_read_DirectReg(reg, chid); rtlglue_printf("slic %d register %d value %02x\n", chid, reg, regVal);#endif } else if (strcmp(nextToken, "write") == 0) /* write direct register */ { uint32 reg; uint32 data; int chid = 0; cle_getNextCmdToken(&nextToken,&size,saved); /* register number */ reg = U32_value( nextToken ); cle_getNextCmdToken(&nextToken,&size,saved); /* 'data' */ cle_getNextCmdToken(&nextToken,&size,saved); /* data */ data = U32_value( nextToken ); cle_getNextCmdToken(&nextToken,&size,saved); /* slic channel */ chid = U32_value( nextToken );#ifdef CONFIG_RTL865X_PCM uint8 regVal; _slic_write_DirectReg(reg, data, chid); rtlglue_printf("slic %d register %d ", chid, reg); regVal = _slic_read_DirectReg(reg, chid); rtlglue_printf("written %02x\n", regVal);#endif } else if (strcmp(nextToken, "pclk") == 0) {#ifdef CONFIG_RTL865X_PCM uint32 slic_channel; cle_getNextCmdToken(&nextToken,&size,saved); /* slic channel */ slic_channel = U32_value( nextToken ); /* Init GPIO pins for each channel */ slic_read_PCMCLK(slic_channel); /* init interface */#endif } else if (strcmp(nextToken, "gpio") == 0) {#ifdef CONFIG_RTL865X_PCM uint32 slic_channel; cle_getNextCmdToken(&nextToken,&size,saved); /* slic channel */ slic_channel = U32_value( nextToken ); /* Init GPIO pins for each channel */ slic_init_GPIO(slic_channel); /* init interface */#endif } else if (strcmp(nextToken, "start") == 0) {#ifdef CONFIG_RTL865X_PCM uint32 slic_channel, pcm_mode; cle_getNextCmdToken(&nextToken,&size,saved); /* slic channel */ slic_channel = U32_value( nextToken );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -