HardwareSPI/src/include/HSPI/Request.h
Go to the documentation of this file.
1 /****
2  * Request.h
3  *
4  * Copyright 2018 mikee47 <mike@sillyhouse.net>
5  *
6  * This file is part of the HardwareSPI Library
7  *
8  * This library is free software: you can redistribute it and/or modify it under the terms of the
9  * GNU General Public License as published by the Free Software Foundation, version 3 or later.
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License along with this library.
16  * If not, see <https://www.gnu.org/licenses/>.
17  *
18  * @author: 11 December 2018 - mikee47 <mike@sillyhouse.net>
19  *
20  * Definitions for an SPI Request Packet containing data and settings for a transfer.
21  * A single transfer may use 1 or more transactions.
22  *
23  ****/
24 
25 #pragma once
26 
27 #include "Data.h"
28 #include <cstddef>
29 
30 namespace HSPI
31 {
32 class Device;
33 struct Request;
34 
41 using Callback = bool (*)(Request& request);
42 
57 struct Request {
58  Device* device{nullptr};
59  Request* next{nullptr};
60  uint16_t cmd{0};
61  uint8_t cmdLen{0};
62  uint8_t async : 1;
63  uint8_t task : 1;
64  volatile uint8_t busy : 1;
65  uint32_t addr{0};
66  uint8_t addrLen{0};
67  uint8_t dummyLen{0};
68  uint8_t sizeAlign{0};
70  Data in;
71  Callback callback{nullptr};
72  void* param{nullptr};
73 
74  Request() : async(false), task(false), busy(false)
75  {
76  }
77 
87  __forceinline void setCommand(uint16_t command, uint8_t bitCount)
88  {
89  cmd = command;
90  cmdLen = bitCount;
91  }
92 
97  __forceinline void setCommand8(uint8_t command)
98  {
99  setCommand(command, 8);
100  }
101 
106  __forceinline void setCommand16(uint16_t command)
107  {
108  setCommand(command, 16);
109  }
110 
122  __forceinline void setAddress(uint32_t address, uint8_t bitCount)
123  {
124  addr = address;
125  addrLen = bitCount;
126  }
127 
132  __forceinline void setAddress24(uint32_t address)
133  {
134  setAddress(address, 24);
135  }
136 
142  void setAsync(Callback callback = nullptr, void* param = nullptr)
143  {
144  async = true;
145  this->callback = callback;
146  this->param = param;
147  }
148 };
149 
168 
169 } // namespace HSPI
Manages a specific SPI device instance attached to a controller.
Definition: Libraries/HardwareSPI/src/include/HSPI/Device.h:45
bool(*)(Request &request) Callback
SPI completion callback routine.
Definition: HardwareSPI/src/include/HSPI/Request.h:41
Definition: Common.h:35
Request * reQueueRequest(Request *head, Request *request)
Support function for fast request re-queuing.
Specifies a block incoming or outgoing data.
Definition: Data.h:43
Defines an SPI Request Packet.
Definition: HardwareSPI/src/include/HSPI/Request.h:57
Device * device
Target device for this request.
Definition: HardwareSPI/src/include/HSPI/Request.h:58
void * param
User parameter.
Definition: HardwareSPI/src/include/HSPI/Request.h:72
Request * next
Controller uses this to queue requests.
Definition: HardwareSPI/src/include/HSPI/Request.h:59
Data in
Incoming data.
Definition: HardwareSPI/src/include/HSPI/Request.h:70
uint16_t cmd
Command value.
Definition: HardwareSPI/src/include/HSPI/Request.h:60
Callback callback
Completion routine.
Definition: HardwareSPI/src/include/HSPI/Request.h:71
Data out
Outgoing data.
Definition: HardwareSPI/src/include/HSPI/Request.h:69
uint8_t async
Set for asynchronous operation.
Definition: HardwareSPI/src/include/HSPI/Request.h:62
uint8_t addrLen
Address bits, 0 - 32.
Definition: HardwareSPI/src/include/HSPI/Request.h:66
void setAddress(uint32_t address, uint8_t bitCount)
Definition: HardwareSPI/src/include/HSPI/Request.h:122
void setCommand16(uint16_t command)
Set 16-bit command.
Definition: HardwareSPI/src/include/HSPI/Request.h:106
void setAsync(Callback callback=nullptr, void *param=nullptr)
Set request to asynchronous execution with optional callback.
Definition: HardwareSPI/src/include/HSPI/Request.h:142
uint8_t sizeAlign
Required size alignment of each transaction (if split up)
Definition: HardwareSPI/src/include/HSPI/Request.h:68
uint8_t dummyLen
Dummy read bits between address and read data, 0 - 255.
Definition: HardwareSPI/src/include/HSPI/Request.h:67
Request()
Definition: HardwareSPI/src/include/HSPI/Request.h:74
volatile uint8_t busy
Request in progress.
Definition: HardwareSPI/src/include/HSPI/Request.h:64
uint8_t cmdLen
Command bits, 0 - 16.
Definition: HardwareSPI/src/include/HSPI/Request.h:61
void setAddress24(uint32_t address)
Set 24-bit address.
Definition: HardwareSPI/src/include/HSPI/Request.h:132
uint32_t addr
Address value.
Definition: HardwareSPI/src/include/HSPI/Request.h:65
void setCommand(uint16_t command, uint8_t bitCount)
Definition: HardwareSPI/src/include/HSPI/Request.h:87
uint8_t task
Controller will execute this request in task mode.
Definition: HardwareSPI/src/include/HSPI/Request.h:63
void setCommand8(uint8_t command)
Set 8-bit command.
Definition: HardwareSPI/src/include/HSPI/Request.h:97