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};
69  Data out;
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 
167 Request* reQueueRequest(Request* head, Request* request);
168 
169 } // namespace HSPI
Definition: Common.h:34
volatile uint8_t busy
Request in progress.
Definition: HardwareSPI/src/include/HSPI/Request.h:86
uint8_t task
Controller will execute this request in task mode.
Definition: HardwareSPI/src/include/HSPI/Request.h:85
bool(*)(Request &request) Callback
SPI completion callback routine.
Definition: HardwareSPI/src/include/HSPI/Request.h:63
Device * device
Target device for this request.
Definition: HardwareSPI/src/include/HSPI/Request.h:80
Request()
Definition: HardwareSPI/src/include/HSPI/Request.h:96
void setAddress(uint32_t address, uint8_t bitCount)
Definition: HardwareSPI/src/include/HSPI/Request.h:144
void setAddress24(uint32_t address)
Set 24-bit address.
Definition: HardwareSPI/src/include/HSPI/Request.h:154
uint8_t sizeAlign
Required size alignment of each transaction (if split up)
Definition: HardwareSPI/src/include/HSPI/Request.h:90
Callback callback
Completion routine.
Definition: HardwareSPI/src/include/HSPI/Request.h:93
Data in
Incoming data.
Definition: HardwareSPI/src/include/HSPI/Request.h:92
Data out
Outgoing data.
Definition: HardwareSPI/src/include/HSPI/Request.h:91
Request * next
Controller uses this to queue requests.
Definition: HardwareSPI/src/include/HSPI/Request.h:81
uint8_t addrLen
Address bits, 0 - 32.
Definition: HardwareSPI/src/include/HSPI/Request.h:88
void setCommand8(uint8_t command)
Set 8-bit command.
Definition: HardwareSPI/src/include/HSPI/Request.h:119
void setCommand16(uint16_t command)
Set 16-bit command.
Definition: HardwareSPI/src/include/HSPI/Request.h:128
uint8_t dummyLen
Dummy read bits between address and read data, 0 - 255.
Definition: HardwareSPI/src/include/HSPI/Request.h:89
uint32_t addr
Address value.
Definition: HardwareSPI/src/include/HSPI/Request.h:87
uint16_t cmd
Command value.
Definition: HardwareSPI/src/include/HSPI/Request.h:82
void setAsync(Callback callback=nullptr, void *param=nullptr)
Set request to asynchronous execution with optional callback.
Definition: HardwareSPI/src/include/HSPI/Request.h:164
void * param
User parameter.
Definition: HardwareSPI/src/include/HSPI/Request.h:94
uint8_t async
Set for asynchronous operation.
Definition: HardwareSPI/src/include/HSPI/Request.h:84
uint8_t cmdLen
Command bits, 0 - 16.
Definition: HardwareSPI/src/include/HSPI/Request.h:83
Request * reQueueRequest(Request *head, Request *request)
Support function for fast request re-queuing.
void setCommand(uint16_t command, uint8_t bitCount)
Definition: HardwareSPI/src/include/HSPI/Request.h:109