📄 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 + -