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

📄 spi.c

📁 linux下的SPI总线驱动程序
💻 C
字号:
#include <linux/autoconf.h>#include <asicRegs.h>#include <rtl8651_tblAsicDrv.h>#include "rtl_glue.h"#include "rtl_types.h"#include "rtl_errno.h"#include "assert.h"#include "gpio.h"#include "spi.h"/*@func int32 | _rtl865x_spi_init | Initialize SPI device@parm rtl8651_spi_dev_t* | pDev | Structure to store device information@parm uint32 | gpioSCLK | GPIO ID of SCLK@parm uint32 | gpioCS_ | GPIO ID of CS_@parm uint32 | gpioSDI | GPIO ID of SDI@parm uint32 | gpioSDO | GPIO ID of SDO@parm uint32 | maxSpeed | how fast SPI driver can generate the SCLK signal (unit: HZ)@rvalue SUCCESS | success.@rvalue FAILED | failed. Parameter error.@comm*/int32 _rtl865x_spi_init( rtl8651_spi_dev_t* pDev, 	gpioID gpioSCLK, 	gpioID gpioCS_, 	gpioID gpioSDI, 	gpioID gpioSDO, int32 maxSpeed ){	pDev->gpioSCLK = gpioSCLK;	pDev->gpioCS_ = gpioCS_;	pDev->gpioSDI = gpioSDI;	pDev->gpioSDO = gpioSDO;	pDev->SClkDelayLoop = GetSysClockRate() / maxSpeed;	rtlglue_printf("SCLK = %d\n", pDev->SClkDelayLoop);	_rtl865x_initGpioPin( gpioSCLK, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );	_rtl865x_initGpioPin( gpioCS_, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );	_rtl865x_initGpioPin( gpioSDI, GPIO_PERI_GPIO, GPIO_DIR_OUT, GPIO_INT_DISABLE );	_rtl865x_initGpioPin( gpioSDO, GPIO_PERI_GPIO, GPIO_DIR_IN, GPIO_INT_DISABLE );		return SUCCESS;}/*@func int32 | _rtl865x_spi_rawRead | Read several bits from SPI@parm rtl8651_spi_dev_t* | pDev | Structure containing device information@parm uint32* | pData | Pointer to store data@parm uint32 | bits | Number bits of data wanted to read@rvalue SUCCESS | success.@rvalue FAILED | failed. Parameter error.@comm*/int32 _rtl865x_spi_rawRead( rtl8651_spi_dev_t* pDev, void* pData, int32 bits ){	uint32 delayLoop;	uint8* pch = pData;		if ( pData == NULL ) return FAILED;		_rtl865x_setGpioDataBit( pDev->gpioCS_, 1 ); /* raise the CS_ */	_rtl865x_setGpioDataBit( pDev->gpioSCLK, 1 ); /* raise the SCLK */	for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */	_rtl865x_setGpioDataBit( pDev->gpioCS_, 0 ); /* fall down the CS_ */	for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */	for( bits--; bits >= 0; bits-- )	{		uint32 buf;		_rtl865x_setGpioDataBit( pDev->gpioSCLK, 0 ); /* fall down the SCLK */		for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */		pch[bits/8] &= ~((uint8)1<<(bits&0x7));		_rtl865x_getGpioDataBit( pDev->gpioSDO, &buf );		pch[bits/8] |= buf?((uint8)1<<(bits&0x7)):0;				_rtl865x_setGpioDataBit( pDev->gpioSCLK, 1 ); /* raising up the SCLK */		for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */	}			_rtl865x_setGpioDataBit( pDev->gpioCS_, 1 ); /* raise the CS_ */		return SUCCESS;}/*@func int32 | _rtl865x_spi_rawWrite | Write several bits from SPI@parm rtl8651_spi_dev_t* | pDev | Structure containing device information@parm uint32* | pData | Pointer to data@parm uint32 | bits | Number bits of data wanting to write@rvalue SUCCESS | success.@rvalue FAILED | failed. Parameter error.@comm*/int32 _rtl865x_spi_rawWrite( rtl8651_spi_dev_t* pDev, void* pData, int32 bits ){	uint32 delayLoop;	uint8* pch = pData;		if ( pData == NULL ) return FAILED;		_rtl865x_setGpioDataBit( pDev->gpioCS_, 1 );  /* raise the CS_ */	_rtl865x_setGpioDataBit( pDev->gpioSCLK, 1 ); /* raise the SCLK */	for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */	_rtl865x_setGpioDataBit( pDev->gpioCS_, 0 ); /* fall down the CS_ */	for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */	for( bits-- ; bits >= 0; bits-- )	{		_rtl865x_setGpioDataBit( pDev->gpioSDI, (pch[bits/8]&((uint32)1<<(bits&0x7)))?1:0 );		_rtl865x_setGpioDataBit( pDev->gpioSCLK, 0 ); /* fall down the SCLK */		for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */		_rtl865x_setGpioDataBit( pDev->gpioSCLK, 1 ); /* raising up the SCLK */		for( delayLoop = pDev->SClkDelayLoop; delayLoop > 0 ; delayLoop-- ); /* delay for a while */	}			_rtl865x_setGpioDataBit( pDev->gpioCS_, 1 ); /* raise the CS_ */		return SUCCESS;}/*@func int32 | _rtl865x_spi_exit | Called when a SPI device is released@parm rtl8651_spi_dev_t* | pDev | Structure containing device information@rvalue SUCCESS | success.@rvalue FAILED | failed. Parameter error.@comm*/int32 _rtl865x_spi_exit( rtl8651_spi_dev_t* pDev ){	return SUCCESS;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -