drivers/spi/spi_bitbang.c: Fix typos and nxstyle complaints.
This commit is contained in:
parent
bd82486f1c
commit
530cad304f
@ -93,7 +93,7 @@
|
|||||||
|
|
||||||
/* Calibration value for timing loop */
|
/* Calibration value for timing loop */
|
||||||
|
|
||||||
#define SPI_BITBAND_LOOPSPERMSEC CONFIG_BOARD_LOOPSPERMSEC
|
#define SPI_BITBANG_LOOPSPERMSEC CONFIG_BOARD_LOOPSPERMSEC
|
||||||
|
|
||||||
/* SPI_PERBIT_NSEC is the minimum time to transfer one bit. This determines
|
/* SPI_PERBIT_NSEC is the minimum time to transfer one bit. This determines
|
||||||
* the maximum frequency and is also used to calculate delays to achieve
|
* the maximum frequency and is also used to calculate delays to achieve
|
||||||
@ -275,7 +275,8 @@ int sam_sdinitialize(int minor)
|
|||||||
ret = mmcsd_spislotinitialize(minor, SAM34_MMCSDSLOTNO, spi);
|
ret = mmcsd_spislotinitialize(minor, SAM34_MMCSDSLOTNO, spi);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
ferr("ERROR: Failed to bind bit bang SPI device to MMC/SD slot %d: %d\n",
|
ferr("ERROR: Failed to bind bit bang SPI device"
|
||||||
|
" to MMC/SD slot %d: %d\n",
|
||||||
SAM34_MMCSDSLOTNO, ret);
|
SAM34_MMCSDSLOTNO, ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -108,7 +108,7 @@
|
|||||||
|
|
||||||
/* Calibration value for timing loop */
|
/* Calibration value for timing loop */
|
||||||
|
|
||||||
#define SPI_BITBAND_LOOPSPERMSEC CONFIG_BOARD_LOOPSPERMSEC
|
#define SPI_BITBANG_LOOPSPERMSEC CONFIG_BOARD_LOOPSPERMSEC
|
||||||
|
|
||||||
/* SPI_PERBIT_NSEC is the minimum time to transfer one bit. This determines
|
/* SPI_PERBIT_NSEC is the minimum time to transfer one bit. This determines
|
||||||
* the maximum frequency and is also used to calculate delays to achieve
|
* the maximum frequency and is also used to calculate delays to achieve
|
||||||
|
@ -55,8 +55,8 @@
|
|||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* This file holds the static, device-independ portion of the generica SPI-
|
/* This file holds the static, device-independent portion of the generic
|
||||||
* bit-bang driver. The full driver consists of 5 files:
|
* SPI-bit-bang driver. The full driver consists of 5 files:
|
||||||
*
|
*
|
||||||
* 1. drivers/spi/spi_bitbang.c: This file. This file holds the basic
|
* 1. drivers/spi/spi_bitbang.c: This file. This file holds the basic
|
||||||
* SPI driver framework and not perform any direct bit-bang operations.
|
* SPI driver framework and not perform any direct bit-bang operations.
|
||||||
@ -68,17 +68,17 @@
|
|||||||
* 3. boards/<arch>/<chip>/<board>/src/<file>: The implementation of the
|
* 3. boards/<arch>/<chip>/<board>/src/<file>: The implementation of the
|
||||||
* low-level bit-bang logic resides in some file in the board source
|
* low-level bit-bang logic resides in some file in the board source
|
||||||
* directory. This board-specific logic includes the bit-bang skeleton
|
* directory. This board-specific logic includes the bit-bang skeleton
|
||||||
* logic provided in include/nuttx/spi/spi_bitband.c.
|
* logic provided in include/nuttx/spi/spi_bitbang.c.
|
||||||
* 4. include/nuttx/spi/spi_bitband.c. Despite the .c extension, this
|
* 4. include/nuttx/spi/spi_bitbang.c. Despite the .c extension, this is
|
||||||
* really an included file. It is used in this way: 1) The board-
|
* really an included file. It is used in this way: 1) The board-
|
||||||
* specific logic in boards/<arch>/<chip>/<board>/src/<file> provides
|
* specific logic in boards/<arch>/<chip>/<board>/src/<file> provides
|
||||||
* some definitions then 2) includes include/nuttx/spi/spi_bitband.c.
|
* some definitions then 2) includes include/nuttx/spi/spi_bitbang.c.
|
||||||
* That file will then use those definitions to implement the low-level
|
* That file will then use those definitions to implement the low-level
|
||||||
* bit-bang logic. the board-specific logic then calls
|
* bit-bang logic. The board-specific logic then calls
|
||||||
* spi_create_bitbang() in this file to instantiate the complete SPI
|
* spi_create_bitbang() in this file to instantiate the complete SPI
|
||||||
* driver.
|
* driver.
|
||||||
*
|
*
|
||||||
* See include/nuttx/spi/spi_bitband.c for more detailed usage
|
* See include/nuttx/spi/spi_bitbang.c for more detailed usage
|
||||||
* information.
|
* information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -44,7 +44,9 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/* Usage ********************************************************************/
|
/* Usage ********************************************************************/
|
||||||
|
|
||||||
/* To use this logic, you should provide a C file that does the following:
|
/* To use this logic, you should provide a C file that does the following:
|
||||||
*
|
*
|
||||||
* - Defines SPI_SETSCK and SPI_CLRSCK to set and clear the SCK signal
|
* - Defines SPI_SETSCK and SPI_CLRSCK to set and clear the SCK signal
|
||||||
@ -53,12 +55,12 @@
|
|||||||
* - Defines SPI_PERBIT_NSEC which is the minimum time to transfer one bit.
|
* - Defines SPI_PERBIT_NSEC which is the minimum time to transfer one bit.
|
||||||
* This determines the maximum frequency.
|
* This determines the maximum frequency.
|
||||||
* - Other configuration options:
|
* - Other configuration options:
|
||||||
* SPI_BITBAND_LOOPSPERMSEC - Delay loop calibration
|
* SPI_BITBANG_LOOPSPERMSEC - Delay loop calibration
|
||||||
* SPI_BITBANG_DISABLEMODE0 - Define to disable Mode 0 support
|
* SPI_BITBANG_DISABLEMODE0 - Define to disable Mode 0 support
|
||||||
* SPI_BITBANG_DISABLEMODE1 - Define to disable Mode 1 support
|
* SPI_BITBANG_DISABLEMODE1 - Define to disable Mode 1 support
|
||||||
* SPI_BITBANG_DISABLEMODE2 - Define to disable Mode 2 support
|
* SPI_BITBANG_DISABLEMODE2 - Define to disable Mode 2 support
|
||||||
* SPI_BITBANG_DISABLEMODE3 - Define to disable Mode 3 support
|
* SPI_BITBANG_DISABLEMODE3 - Define to disable Mode 3 support
|
||||||
* - Provide implementations of spi_select(), spi_status(), and spi_cmddata().
|
* - Provide implementations of spi_select(), spi_status() and spi_cmddata().
|
||||||
* - Then include this file
|
* - Then include this file
|
||||||
* - Provide an initialization function that initializes the GPIO pins used
|
* - Provide an initialization function that initializes the GPIO pins used
|
||||||
* in the bit bang interface and calls spi_create_bitbang().
|
* in the bit bang interface and calls spi_create_bitbang().
|
||||||
@ -115,6 +117,7 @@ static const struct spi_bitbang_ops_s g_spiops =
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: spi_delay
|
* Name: spi_delay
|
||||||
*
|
*
|
||||||
@ -122,10 +125,10 @@ static const struct spi_bitbang_ops_s g_spiops =
|
|||||||
* Delay for a specified number of loops
|
* Delay for a specified number of loops
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* count - The number of loops
|
* holdtime - The number of loops
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* Returns the actual frequency selected
|
* None.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@ -143,7 +146,7 @@ static void spi_delay(uint32_t holdtime)
|
|||||||
* Set the SPI frequency.
|
* Set the SPI frequency.
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - Device-specific state data
|
* priv - Device-specific state data
|
||||||
* frequency - The SPI frequency requested
|
* frequency - The SPI frequency requested
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
@ -151,7 +154,8 @@ static void spi_delay(uint32_t holdtime)
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static uint32_t spi_setfrequency(FAR struct spi_bitbang_s *priv, uint32_t frequency)
|
static uint32_t spi_setfrequency(FAR struct spi_bitbang_s *priv,
|
||||||
|
uint32_t frequency)
|
||||||
{
|
{
|
||||||
uint32_t pnsec;
|
uint32_t pnsec;
|
||||||
|
|
||||||
@ -160,11 +164,14 @@ static uint32_t spi_setfrequency(FAR struct spi_bitbang_s *priv, uint32_t freque
|
|||||||
* wait, set low, wait, set high, wait, etc.
|
* wait, set low, wait, set high, wait, etc.
|
||||||
*
|
*
|
||||||
* Here we calcalute the half period of the frequency in nanoseconds (i.e.,
|
* Here we calcalute the half period of the frequency in nanoseconds (i.e.,
|
||||||
* the amount of time that the clock should remain in the high or low state).
|
* the amount of time that the clock should remain in the high or low
|
||||||
|
* state).
|
||||||
*
|
*
|
||||||
* frequency = psec / 1 sec psec = full period in seconds
|
* frequency = psec / 1 sec
|
||||||
|
* psec = full period in seconds
|
||||||
* psec = 1 sec / frequency
|
* psec = 1 sec / frequency
|
||||||
* pnsec = 1000000000 nsec / (2 * frequency) pnsec = full period in nsec
|
* pnsec = 1000000000 nsec / (2 * frequency)
|
||||||
|
* pnsec = full period in nsec
|
||||||
*
|
*
|
||||||
* As examples:
|
* As examples:
|
||||||
* 1) frequency = 400KHz; SPI_PERBIT_NSEC = 100
|
* 1) frequency = 400KHz; SPI_PERBIT_NSEC = 100
|
||||||
@ -190,41 +197,43 @@ static uint32_t spi_setfrequency(FAR struct spi_bitbang_s *priv, uint32_t freque
|
|||||||
|
|
||||||
pnsec = (pnsec + 1) >> 1;
|
pnsec = (pnsec + 1) >> 1;
|
||||||
|
|
||||||
/* But what we really want is the hold time in loop counts. We know that
|
/* But what we really want is the hold time in loop counts. We know that
|
||||||
* SPI_BITBAND_LOOPSPERMSEC is the number of times through a delay loop
|
* SPI_BITBANG_LOOPSPERMSEC is the number of times through a delay loop
|
||||||
* to get 1 millisecond.
|
* to get 1 millisecond.
|
||||||
*
|
*
|
||||||
* SPI_BITBAND_LOOPSPERMSEC / 1000000 is then the number of counts
|
* SPI_BITBANG_LOOPSPERMSEC / 1000000 is then the number of counts
|
||||||
* to get 1 nanosecond. In reality, this is a number less than zero. But
|
* to get 1 nanosecond. In reality, this is a number less than zero. But
|
||||||
* then we can use this to calculate:
|
* then we can use this to calculate:
|
||||||
*
|
*
|
||||||
* holdtime loops/hold = pnsec nsec/hold * (SPI_BITBAND_LOOPSPERMSEC / 1000000) loops/nsec
|
* holdtime loops/hold = pnsec nsec/hold * (SPI_BITBANG_LOOPSPERMSEC /
|
||||||
|
* 1000000) loops/nsec
|
||||||
*
|
*
|
||||||
* As examples:
|
* As examples:
|
||||||
* 1) frequency = 400KHz; SPI_PERBIT_NSEC = 100; pnsec = 1200;
|
* 1) frequency = 400KHz; SPI_PERBIT_NSEC = 100; pnsec = 1200;
|
||||||
* SPI_BITBAND_LOOPSPERMSEC = 5000
|
* SPI_BITBANG_LOOPSPERMSEC = 5000
|
||||||
* holdtime = (1200 * 5000 + 500000) / 1000000 = 6
|
* holdtime = (1200 * 5000 + 500000) / 1000000 = 6
|
||||||
* 2) frequency = 20MHz; SPI_PERBIT_NSEC = 100; pnsec = 0;
|
* 2) frequency = 20MHz; SPI_PERBIT_NSEC = 100; pnsec = 0;
|
||||||
* SPI_BITBAND_LOOPSPERMSEC = 5000
|
* SPI_BITBANG_LOOPSPERMSEC = 5000
|
||||||
* holdtime = (0 * 5000 + 500000) / 1000000 = 0
|
* holdtime = (0 * 5000 + 500000) / 1000000 = 0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
priv->holdtime = (pnsec * SPI_BITBAND_LOOPSPERMSEC + 500000) / 1000000;
|
priv->holdtime = (pnsec * SPI_BITBANG_LOOPSPERMSEC + 500000) / 1000000;
|
||||||
|
|
||||||
/* Let's do our best to calculate the actual frequency
|
/* Let's do our best to calculate the actual frequency
|
||||||
*
|
*
|
||||||
* As examples:
|
* As examples:
|
||||||
* 1) frequency = 400KHz; SPI_PERBIT_NSEC = 100;
|
* 1) frequency = 400KHz; SPI_PERBIT_NSEC = 100;
|
||||||
* SPI_BITBAND_LOOPSPERMSEC = 5000; holdtime = 6
|
* SPI_BITBANG_LOOPSPERMSEC = 5000; holdtime = 6
|
||||||
* pnsec = 2 * 1000000 * 6 / 5000 + 100 = 2500 nsec
|
* pnsec = 2 * 1000000 * 6 / 5000 + 100 = 2500 nsec
|
||||||
* frequency = 400KHz
|
* frequency = 400KHz
|
||||||
* 2) frequency = 20MHz; SPI_PERBIT_NSEC = 100; holdtime = 0
|
* 2) frequency = 20MHz; SPI_PERBIT_NSEC = 100; holdtime = 0
|
||||||
* SPI_BITBAND_LOOPSPERMSEC = 5000; holdtime = 0
|
* SPI_BITBANG_LOOPSPERMSEC = 5000; holdtime = 0
|
||||||
* pnsec = 2 * 0 * 6 / 5000 + 100 = 100 nsec
|
* pnsec = 2 * 0 * 6 / 5000 + 100 = 100 nsec
|
||||||
* frequency = 10MHz
|
* frequency = 10MHz
|
||||||
*/
|
*/
|
||||||
|
|
||||||
pnsec = 2 * 1000000 * priv->holdtime / SPI_BITBAND_LOOPSPERMSEC + SPI_PERBIT_NSEC;
|
pnsec = 2 * 1000000 * priv->holdtime / SPI_BITBANG_LOOPSPERMSEC +
|
||||||
|
SPI_PERBIT_NSEC;
|
||||||
frequency = 1000000000ul / pnsec;
|
frequency = 1000000000ul / pnsec;
|
||||||
return frequency;
|
return frequency;
|
||||||
}
|
}
|
||||||
@ -236,8 +245,8 @@ static uint32_t spi_setfrequency(FAR struct spi_bitbang_s *priv, uint32_t freque
|
|||||||
* Select the current SPI mode
|
* Select the current SPI mode
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* dev - Device-specific state data
|
* priv - Device-specific state data
|
||||||
* mode - the new SPI mode
|
* mode - The new SPI mode
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* None
|
* None
|
||||||
@ -466,8 +475,8 @@ static uint16_t spi_bitexchange2(uint16_t dataout, uint32_t holdtime)
|
|||||||
{
|
{
|
||||||
uint16_t datain;
|
uint16_t datain;
|
||||||
|
|
||||||
/* Here the clock is is in the resting set (high). Set MOSI output and wait
|
/* Here the clock is is in the resting set (high). Set MOSI output and
|
||||||
* for the hold time
|
* wait for the hold time
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (dataout != 0)
|
if (dataout != 0)
|
||||||
@ -568,7 +577,7 @@ static uint16_t spi_bitexchange3(uint16_t dataout, uint32_t holdtime)
|
|||||||
* Name: spi_exchange
|
* Name: spi_exchange
|
||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Exahange on word of data on SPI
|
* Exahange one word of data on SPI
|
||||||
*
|
*
|
||||||
* Input Parameters:
|
* Input Parameters:
|
||||||
* priv - Device-specific state data
|
* priv - Device-specific state data
|
||||||
@ -580,7 +589,8 @@ static uint16_t spi_bitexchange3(uint16_t dataout, uint32_t holdtime)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#ifdef CONFIG_SPI_BITBANG_VARWIDTH
|
#ifdef CONFIG_SPI_BITBANG_VARWIDTH
|
||||||
static uint16_t spi_exchange(FAR struct spi_bitbang_s *priv, uint16_t dataout)
|
static uint16_t spi_exchange(FAR struct spi_bitbang_s *priv,
|
||||||
|
uint16_t dataout)
|
||||||
{
|
{
|
||||||
bitexchange_t exchange = priv->exchange;
|
bitexchange_t exchange = priv->exchange;
|
||||||
uint32_t holdtime = priv->holdtime;
|
uint32_t holdtime = priv->holdtime;
|
||||||
@ -609,7 +619,8 @@ static uint16_t spi_exchange(FAR struct spi_bitbang_s *priv, uint16_t dataout)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static uint16_t spi_exchange(FAR struct spi_bitbang_s *priv, uint16_t dataout)
|
static uint16_t spi_exchange(FAR struct spi_bitbang_s *priv,
|
||||||
|
uint16_t dataout)
|
||||||
{
|
{
|
||||||
bitexchange_t exchange = priv->exchange;
|
bitexchange_t exchange = priv->exchange;
|
||||||
uint32_t holdtime = priv->holdtime;
|
uint32_t holdtime = priv->holdtime;
|
||||||
|
Loading…
Reference in New Issue
Block a user