File: SpiDev.cpp

package info (click to toggle)
libexadrums 0.7.0-1.1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 652 kB
  • sloc: cpp: 6,970; ansic: 220; makefile: 160; sh: 12
file content (76 lines) | stat: -rw-r--r-- 1,353 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
 * Spi.cpp
 *
 *  Created on: 2 May 2017
 *      Author: jeremy
 */

#include "SpiDev.h"


#include <fcntl.h>
#include <linux/spi/spidev.h>
#include <sys/ioctl.h>

namespace IO
{


	SpiDev::SpiDev(const std::string& name, size_t dev, size_t cs, size_t bits, uint8_t channels)
	: name{name}, bus{dev}, cs{cs}, nBits{bits}, nChannels{channels}
	{
		this->devicePath = spiDevPath + std::to_string(dev) + "." + std::to_string(cs);
	}

	void SpiDev::Open(size_t freq, int mode) noexcept
	{

		this->clkFreq = freq;

		this->fd = open(devicePath.c_str(), O_RDWR);

	  	mode &= 3;


		ioctl(this->fd, SPI_IOC_WR_MODE, &mode);
		ioctl(this->fd, SPI_IOC_WR_BITS_PER_WORD, &bitsPerWord);
		ioctl(this->fd, SPI_IOC_WR_MAX_SPEED_HZ, &this->clkFreq);
		
	}

	void SpiDev::Close() noexcept
	{

		if(fd != -1)
		{
			close(this->fd);
			fd = -1;
		}

		return;
	}

	

	int SpiDev::DataRW(uint8_t* data, size_t len) const noexcept
	{

		spi_ioc_transfer spiData{};

		spiData.tx_buf = reinterpret_cast<decltype(spiData.tx_buf)>(data);
		spiData.rx_buf = reinterpret_cast<decltype(spiData.rx_buf)>(data);

		spiData.len = len ;
		spiData.speed_hz = this->clkFreq;

		spiData.delay_usecs = 0;
		spiData.bits_per_word = SpiDev::bitsPerWord;
		spiData.cs_change = 0;
		spiData.pad = 0;

		return ioctl(this->fd, SPI_IOC_MESSAGE(1), &spiData);
	}



} /* namespace IO */