123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- #include<linux/string.h>
- #include "defines.h"
- #include "kspi.h"
- #include "kfile.h"
- #include "ktiva.h"
- #include "ksync.h"
- /////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////
- int kspi_write_mode(struct file *pf, unsigned char mode)
- {
- int ret;
- ret = kf_ioctl(pf, SPI_IOC_WR_MODE, (unsigned long)&mode);
-
- if(ret < 0)
- {
- KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
- }
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_read_mode(struct file *pf, unsigned char *mode)
- {
- int ret;
- ret = kf_ioctl(pf, SPI_IOC_RD_MODE, (unsigned long)mode);
- if(ret < 0)
- {
- KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
- }
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_write_bits_per_word(struct file *pf, unsigned char bits)
- {
- int ret;
- ret = kf_ioctl(pf, SPI_IOC_WR_BITS_PER_WORD, (unsigned long)&bits);
- if(ret < 0)
- {
- KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
- }
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_read_bits_per_word(struct file *pf, unsigned char *bits)
- {
- int ret;
- ret = kf_ioctl(pf, SPI_IOC_RD_BITS_PER_WORD, (unsigned long)bits);
- if(ret < 0)
- {
- KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
- }
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_write_max_speed_hz(struct file *pf, unsigned int speed)
- {
- int ret;
- ret = kf_ioctl(pf, SPI_IOC_WR_MAX_SPEED_HZ, (unsigned long)&speed);
- if(ret < 0)
- {
- KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
- }
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_read_max_speed_hz(struct file *pf, unsigned int *speed)
- {
- int ret;
- ret = kf_ioctl(pf, SPI_IOC_RD_MAX_SPEED_HZ, (unsigned long)speed);
- if(ret < 0)
- {
- KALERT("%s: kf_ioctl failed: %d\n", __FUNCTION__, ret);
- }
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////
- /////////////////////////////////////////////////////////////////////////////
- int kspi_tx(struct file *pf, const void *pData, size_t nCbData)
- {
- int ret;
- struct spi_ioc_transfer tr =
- {
- .tx_buf = (unsigned long)pData,
- .rx_buf = 0,
- .len = nCbData,
- // .delay_usecs = 0,
- // .speed_hz = _SPI_SPEED_HZ,
- // .bits_per_word = _SPI_BITS_PER_WORD,
- };
- ret = kf_ioctl(pf, SPI_IOC_MESSAGE(1), (unsigned long)&tr);
- if(ret < 0)
- KALERT("%s failed: %d\n", __FUNCTION__, ret);
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_rx(struct file *pf, void *pData, size_t nCbData)
- {
- int ret;
- struct spi_ioc_transfer tr =
- {
- .tx_buf = 0,
- .rx_buf = (unsigned long)pData,
- .len = nCbData,
- // .delay_usecs = 0,
- // .speed_hz = _SPI_SPEED_HZ,
- // .bits_per_word = _SPI_BITS_PER_WORD,
- };
- ret = kf_ioctl(pf, SPI_IOC_MESSAGE(1), (unsigned long)&tr);
- if(ret < 0)
- KALERT("%s failed: %d\n", __FUNCTION__, ret);
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_tx_rx(struct file *pf, const void *pTx, void *pRx, size_t nCb)
- {
- int ret;
- struct spi_ioc_transfer tr =
- {
- .tx_buf = (unsigned long)pTx,
- .rx_buf = (unsigned long)pRx,
- .len = nCb,
- // .delay_usecs = 0,
- // .speed_hz = _SPI_SPEED_HZ,
- // .bits_per_word = _SPI_BITS_PER_WORD,
- };
- ret = kf_ioctl(pf, SPI_IOC_MESSAGE(1), (unsigned long)&tr);
- if(ret < 0)
- KALERT("%s failed: %d\n", __FUNCTION__, ret);
- return ret;
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_rx_byte(struct file *pf, unsigned char *rx)
- {
- return kspi_rx(pf, rx, 1);
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_tx_byte(struct file *pf, unsigned char tx)
- {
- return kspi_tx(pf, &tx, 1);
- }
- /////////////////////////////////////////////////////////////////////////////
- int kspi_tx_rx_byte(struct file *pf, unsigned char tx, unsigned char *rx)
- {
- return kspi_tx_rx(pf, &tx, rx, 1);
- }
- /////////////////////////////////////////////////////////////////////////////
- bool KSpiInit(struct file *pf)
- {
- bool bRet = false;
- uint8_t mode = 0;
- uint8_t bits = 0;
- uint32_t speed = 0;
- do
- {
- if(kspi_write_mode(pf, SPI_MODE_3) < 0)
- {
- KALERT("%s: kspi_write_mode failed!\n", __FUNCTION__);
- break;
- }
- if(kspi_read_mode(pf, &mode) < 0)
- {
- KALERT("%s: kspi_read_mode failed!\n", __FUNCTION__);
- break;
- }
- if(mode != SPI_MODE_3)
- {
- KALERT("%s: Invalid mode!\n", __FUNCTION__);
- break;
- }
- /////////////////////////////////////////////////////////////////
- if(kspi_write_bits_per_word(pf, _SPI_BITS_PER_WORD) < 0)
- {
- KALERT("%s: kspi_write_bits_per_word failed!\n", __FUNCTION__);
- break;
- }
- if(kspi_read_bits_per_word(pf, &bits) < 0)
- {
- KALERT("%s: kspi_read_bits_per_word failed!\n", __FUNCTION__);
- break;
- }
- if(bits != _SPI_BITS_PER_WORD)
- {
- KALERT("%s: Invalid bits per word!\n", __FUNCTION__);
- break;
- }
- /////////////////////////////////////////////////////////////////
- if(kspi_write_max_speed_hz(pf, _SPI_SPEED_HZ) < 0)
- {
- KALERT("%s: kspi_write_max_speed_hz failed!\n", __FUNCTION__);
- break;
- }
- if(kspi_read_max_speed_hz(pf, &speed) < 0)
- {
- KALERT("%s: kspi_read_max_speed_hz failed!\n", __FUNCTION__);
- break;
- }
- if(speed != _SPI_SPEED_HZ)
- {
- KALERT("%s: Invalid max. speed!\n", __FUNCTION__);
- break;
- }
- bRet = true;
- }
- while(false);
- return bRet;
- }
- void KSpiExit(void)
- {
- }
|