⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 spi_cmd.c

📁 linux下的SPI总线驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#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 + -