SPI sending function The Next CEO of Stack OverflowSPI to soft UARTMonitor/Debug SPI using another GPIO Pin?SPI sclk no outputHelp understanding + hacking spi-bcm2708.cCan Raspberry PI function as SPI slave?SPI device errorfilenotfounderror with SPI functionConnect SPI display to raspberry pi zeroWhat's wrong with my SPI interface?How could I write a C function using the wiringPi SPI library to read the X and Y measurements from this 2-axis inclinometer?
What was the first Unix version to run on a microcomputer?
How many extra stops do monopods offer for tele photographs?
Running a General Election and the European Elections together
Domestic-to-international connection at Orlando (MCO)
Won the lottery - how do I keep the money?
Where do students learn to solve polynomial equations these days?
Why is information "lost" when it got into a black hole?
No sign flipping while figuring out the emf of voltaic cell?
Can we say or write : "No, it'sn't"?
Can MTA send mail via a relay without being told so?
RigExpert AA-35 - Interpreting The Information
Bartok - Syncopation (1): Meaning of notes in between Grand Staff
Are police here, aren't itthey?
How do I align (1) and (2)?
What is the value of α and β in a triangle?
is it ok to reduce charging current for li ion 18650 battery?
How to install OpenCV on Raspbian Stretch?
Why the difference in type-inference over the as-pattern in two similar function definitions?
Is it okay to majorly distort historical facts while writing a fiction story?
Some questions about different axiomatic systems for neighbourhoods
Is it ever safe to open a suspicious HTML file (e.g. email attachment)?
How a 64-bit process virtual address space is divided in Linux?
What steps are necessary to read a Modern SSD in Medieval Europe?
Newlines in BSD sed vs gsed
SPI sending function
The Next CEO of Stack OverflowSPI to soft UARTMonitor/Debug SPI using another GPIO Pin?SPI sclk no outputHelp understanding + hacking spi-bcm2708.cCan Raspberry PI function as SPI slave?SPI device errorfilenotfounderror with SPI functionConnect SPI display to raspberry pi zeroWhat's wrong with my SPI interface?How could I write a C function using the wiringPi SPI library to read the X and Y measurements from this 2-axis inclinometer?
I'm currently reworking a project from someone who graduated a few years back and I'm supposed to change the function of his work for a bit.
I have trouble understanding these few lines from SPI communication, how does this work? :
*ptr = (3<<4) | (1<<7); //clear
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
while (!(*ptr & (1 << 16))); // Transfer DONE
*ptr &= ~(1<<7);
*ptr = (3<<4) | (1<<7) | (1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
To explain what I know: The function 'send' expects 2 float values in interval <-1;1> and through circuits it changes output voltage from minimum of -12.5V to maximum of 12.5V.
When I tried to send various values to function from interval it got stuck on:
while (!(*ptr & (1 << 16)));
As I investigated the code more I realized that either I'm dumb or the person who wrote this is dumb because how does this work ?
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
Any help is appreciated.
Thank you.
If needed the whole code is below.
SPI.h:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef _SPI
#define _SPI
#define IOBASE 0x20000000
#define GPIO_BASE (IOBASE + 0x200000)
#define SPI0_BASE (IOBASE + 0x204000)
#define TIMER_BASE (IOBASE + 0x3000)
//SPI
#define SPI_CS 0
#define SPI_FIFO 1
#define SPI_CLK 2
#define SPI_DLEN 3
#define SPI_LTOH 4
#define SPI_DC 5
class SPI
int fd;
volatile unsigned int* ptr;
volatile unsigned int* uk_GPIO;
public:
SPI();
~SPI();
void inline send(float, float);
int connected(void);
;
#endif
SPI.cpp:
#include "SPI.h"
#include <cstdlib>
SPI::SPI()
void inline SPI::send(float data1, float data2)
(1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
//printf ("read %2.2x%2.2x n", *(ptr + SPI_FIFO), *(ptr + SPI_FIFO));
SPI::~SPI()
munmap((void*)ptr,4096);
close(fd);
int SPI::connected(void)
gpio spi c++ c
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
I'm currently reworking a project from someone who graduated a few years back and I'm supposed to change the function of his work for a bit.
I have trouble understanding these few lines from SPI communication, how does this work? :
*ptr = (3<<4) | (1<<7); //clear
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
while (!(*ptr & (1 << 16))); // Transfer DONE
*ptr &= ~(1<<7);
*ptr = (3<<4) | (1<<7) | (1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
To explain what I know: The function 'send' expects 2 float values in interval <-1;1> and through circuits it changes output voltage from minimum of -12.5V to maximum of 12.5V.
When I tried to send various values to function from interval it got stuck on:
while (!(*ptr & (1 << 16)));
As I investigated the code more I realized that either I'm dumb or the person who wrote this is dumb because how does this work ?
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
Any help is appreciated.
Thank you.
If needed the whole code is below.
SPI.h:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef _SPI
#define _SPI
#define IOBASE 0x20000000
#define GPIO_BASE (IOBASE + 0x200000)
#define SPI0_BASE (IOBASE + 0x204000)
#define TIMER_BASE (IOBASE + 0x3000)
//SPI
#define SPI_CS 0
#define SPI_FIFO 1
#define SPI_CLK 2
#define SPI_DLEN 3
#define SPI_LTOH 4
#define SPI_DC 5
class SPI
int fd;
volatile unsigned int* ptr;
volatile unsigned int* uk_GPIO;
public:
SPI();
~SPI();
void inline send(float, float);
int connected(void);
;
#endif
SPI.cpp:
#include "SPI.h"
#include <cstdlib>
SPI::SPI()
void inline SPI::send(float data1, float data2)
(1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
//printf ("read %2.2x%2.2x n", *(ptr + SPI_FIFO), *(ptr + SPI_FIFO));
SPI::~SPI()
munmap((void*)ptr,4096);
close(fd);
int SPI::connected(void)
gpio spi c++ c
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
I'm currently reworking a project from someone who graduated a few years back and I'm supposed to change the function of his work for a bit.
I have trouble understanding these few lines from SPI communication, how does this work? :
*ptr = (3<<4) | (1<<7); //clear
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
while (!(*ptr & (1 << 16))); // Transfer DONE
*ptr &= ~(1<<7);
*ptr = (3<<4) | (1<<7) | (1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
To explain what I know: The function 'send' expects 2 float values in interval <-1;1> and through circuits it changes output voltage from minimum of -12.5V to maximum of 12.5V.
When I tried to send various values to function from interval it got stuck on:
while (!(*ptr & (1 << 16)));
As I investigated the code more I realized that either I'm dumb or the person who wrote this is dumb because how does this work ?
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
Any help is appreciated.
Thank you.
If needed the whole code is below.
SPI.h:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef _SPI
#define _SPI
#define IOBASE 0x20000000
#define GPIO_BASE (IOBASE + 0x200000)
#define SPI0_BASE (IOBASE + 0x204000)
#define TIMER_BASE (IOBASE + 0x3000)
//SPI
#define SPI_CS 0
#define SPI_FIFO 1
#define SPI_CLK 2
#define SPI_DLEN 3
#define SPI_LTOH 4
#define SPI_DC 5
class SPI
int fd;
volatile unsigned int* ptr;
volatile unsigned int* uk_GPIO;
public:
SPI();
~SPI();
void inline send(float, float);
int connected(void);
;
#endif
SPI.cpp:
#include "SPI.h"
#include <cstdlib>
SPI::SPI()
void inline SPI::send(float data1, float data2)
(1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
//printf ("read %2.2x%2.2x n", *(ptr + SPI_FIFO), *(ptr + SPI_FIFO));
SPI::~SPI()
munmap((void*)ptr,4096);
close(fd);
int SPI::connected(void)
gpio spi c++ c
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
I'm currently reworking a project from someone who graduated a few years back and I'm supposed to change the function of his work for a bit.
I have trouble understanding these few lines from SPI communication, how does this work? :
*ptr = (3<<4) | (1<<7); //clear
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
while (!(*ptr & (1 << 16))); // Transfer DONE
*ptr &= ~(1<<7);
*ptr = (3<<4) | (1<<7) | (1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
To explain what I know: The function 'send' expects 2 float values in interval <-1;1> and through circuits it changes output voltage from minimum of -12.5V to maximum of 12.5V.
When I tried to send various values to function from interval it got stuck on:
while (!(*ptr & (1 << 16)));
As I investigated the code more I realized that either I'm dumb or the person who wrote this is dumb because how does this work ?
*(ptr +SPI_FIFO) = udata2>>8;
*(ptr +SPI_FIFO) = udata2;
Any help is appreciated.
Thank you.
If needed the whole code is below.
SPI.h:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#ifndef _SPI
#define _SPI
#define IOBASE 0x20000000
#define GPIO_BASE (IOBASE + 0x200000)
#define SPI0_BASE (IOBASE + 0x204000)
#define TIMER_BASE (IOBASE + 0x3000)
//SPI
#define SPI_CS 0
#define SPI_FIFO 1
#define SPI_CLK 2
#define SPI_DLEN 3
#define SPI_LTOH 4
#define SPI_DC 5
class SPI
int fd;
volatile unsigned int* ptr;
volatile unsigned int* uk_GPIO;
public:
SPI();
~SPI();
void inline send(float, float);
int connected(void);
;
#endif
SPI.cpp:
#include "SPI.h"
#include <cstdlib>
SPI::SPI()
void inline SPI::send(float data1, float data2)
(1<<0); //clear
*(ptr +SPI_FIFO) = udata1>>8;
*(ptr +SPI_FIFO) = udata1;
while (!(*ptr & (1<<16))); // Transfer DONE
*ptr &= ~(1<<7);
//printf ("read %2.2x%2.2x n", *(ptr + SPI_FIFO), *(ptr + SPI_FIFO));
SPI::~SPI()
munmap((void*)ptr,4096);
close(fd);
int SPI::connected(void)
gpio spi c++ c
gpio spi c++ c
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
edited 12 hours ago
Dominik Ficek
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
asked 12 hours ago
Dominik FicekDominik Ficek
62
62
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
New contributor
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
Dominik Ficek is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
You need to refer to the BCM2835 ARM Peripherals document.
It specifies many of the Pi's hardware interfaces.
In this case SPI appears to be the main SPI device documented from page 148.
*ptr = (3<<4) | (1<<7); // 1
*(ptr +SPI_FIFO) = udata2>>8; // 2
*(ptr +SPI_FIFO) = udata2; // 3
while (!(*ptr & (1 << 16))); // 4
ptr is a word pointer(32 bits) to the base of the SPI registers (the CS register).
- clears the FIFOs and starts SPI.
- writes the MSB of udata2 to the hardware FIFO.
- writes the LSB of udata2 to the hardware FIFO.
- spins until the CS register indicates the transfer is complete.
Note that writing to the hardware FIFO address adds a byte to the transmit FIFO, reading from the hardware FIFO address removes a byte from the receive FIFO.
It may be worthwhile to point out that this code may have been written before the availability of the Pi Linux SPI driver. I would suggest you now use the Linux SPI driver.
Thank you this is certainly helpful. I have one more question, what is it that changes the value of CS register so it indicates the completion of transfer? I'm clearly stuck at that, I never leave the 4th point.
– Dominik Ficek
10 hours ago
Bit 16 being set in the CS register indicates the transfer is complete. See page 154. The hardware sets it.
– joan
10 hours ago
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
return StackExchange.using("schematics", function ()
StackExchange.schematics.init();
);
, "cicuitlab");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "447"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Dominik Ficek is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fraspberrypi.stackexchange.com%2fquestions%2f95968%2fspi-sending-function%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You need to refer to the BCM2835 ARM Peripherals document.
It specifies many of the Pi's hardware interfaces.
In this case SPI appears to be the main SPI device documented from page 148.
*ptr = (3<<4) | (1<<7); // 1
*(ptr +SPI_FIFO) = udata2>>8; // 2
*(ptr +SPI_FIFO) = udata2; // 3
while (!(*ptr & (1 << 16))); // 4
ptr is a word pointer(32 bits) to the base of the SPI registers (the CS register).
- clears the FIFOs and starts SPI.
- writes the MSB of udata2 to the hardware FIFO.
- writes the LSB of udata2 to the hardware FIFO.
- spins until the CS register indicates the transfer is complete.
Note that writing to the hardware FIFO address adds a byte to the transmit FIFO, reading from the hardware FIFO address removes a byte from the receive FIFO.
It may be worthwhile to point out that this code may have been written before the availability of the Pi Linux SPI driver. I would suggest you now use the Linux SPI driver.
Thank you this is certainly helpful. I have one more question, what is it that changes the value of CS register so it indicates the completion of transfer? I'm clearly stuck at that, I never leave the 4th point.
– Dominik Ficek
10 hours ago
Bit 16 being set in the CS register indicates the transfer is complete. See page 154. The hardware sets it.
– joan
10 hours ago
add a comment |
You need to refer to the BCM2835 ARM Peripherals document.
It specifies many of the Pi's hardware interfaces.
In this case SPI appears to be the main SPI device documented from page 148.
*ptr = (3<<4) | (1<<7); // 1
*(ptr +SPI_FIFO) = udata2>>8; // 2
*(ptr +SPI_FIFO) = udata2; // 3
while (!(*ptr & (1 << 16))); // 4
ptr is a word pointer(32 bits) to the base of the SPI registers (the CS register).
- clears the FIFOs and starts SPI.
- writes the MSB of udata2 to the hardware FIFO.
- writes the LSB of udata2 to the hardware FIFO.
- spins until the CS register indicates the transfer is complete.
Note that writing to the hardware FIFO address adds a byte to the transmit FIFO, reading from the hardware FIFO address removes a byte from the receive FIFO.
It may be worthwhile to point out that this code may have been written before the availability of the Pi Linux SPI driver. I would suggest you now use the Linux SPI driver.
Thank you this is certainly helpful. I have one more question, what is it that changes the value of CS register so it indicates the completion of transfer? I'm clearly stuck at that, I never leave the 4th point.
– Dominik Ficek
10 hours ago
Bit 16 being set in the CS register indicates the transfer is complete. See page 154. The hardware sets it.
– joan
10 hours ago
add a comment |
You need to refer to the BCM2835 ARM Peripherals document.
It specifies many of the Pi's hardware interfaces.
In this case SPI appears to be the main SPI device documented from page 148.
*ptr = (3<<4) | (1<<7); // 1
*(ptr +SPI_FIFO) = udata2>>8; // 2
*(ptr +SPI_FIFO) = udata2; // 3
while (!(*ptr & (1 << 16))); // 4
ptr is a word pointer(32 bits) to the base of the SPI registers (the CS register).
- clears the FIFOs and starts SPI.
- writes the MSB of udata2 to the hardware FIFO.
- writes the LSB of udata2 to the hardware FIFO.
- spins until the CS register indicates the transfer is complete.
Note that writing to the hardware FIFO address adds a byte to the transmit FIFO, reading from the hardware FIFO address removes a byte from the receive FIFO.
It may be worthwhile to point out that this code may have been written before the availability of the Pi Linux SPI driver. I would suggest you now use the Linux SPI driver.
You need to refer to the BCM2835 ARM Peripherals document.
It specifies many of the Pi's hardware interfaces.
In this case SPI appears to be the main SPI device documented from page 148.
*ptr = (3<<4) | (1<<7); // 1
*(ptr +SPI_FIFO) = udata2>>8; // 2
*(ptr +SPI_FIFO) = udata2; // 3
while (!(*ptr & (1 << 16))); // 4
ptr is a word pointer(32 bits) to the base of the SPI registers (the CS register).
- clears the FIFOs and starts SPI.
- writes the MSB of udata2 to the hardware FIFO.
- writes the LSB of udata2 to the hardware FIFO.
- spins until the CS register indicates the transfer is complete.
Note that writing to the hardware FIFO address adds a byte to the transmit FIFO, reading from the hardware FIFO address removes a byte from the receive FIFO.
It may be worthwhile to point out that this code may have been written before the availability of the Pi Linux SPI driver. I would suggest you now use the Linux SPI driver.
answered 11 hours ago
joanjoan
50.3k35182
50.3k35182
Thank you this is certainly helpful. I have one more question, what is it that changes the value of CS register so it indicates the completion of transfer? I'm clearly stuck at that, I never leave the 4th point.
– Dominik Ficek
10 hours ago
Bit 16 being set in the CS register indicates the transfer is complete. See page 154. The hardware sets it.
– joan
10 hours ago
add a comment |
Thank you this is certainly helpful. I have one more question, what is it that changes the value of CS register so it indicates the completion of transfer? I'm clearly stuck at that, I never leave the 4th point.
– Dominik Ficek
10 hours ago
Bit 16 being set in the CS register indicates the transfer is complete. See page 154. The hardware sets it.
– joan
10 hours ago
Thank you this is certainly helpful. I have one more question, what is it that changes the value of CS register so it indicates the completion of transfer? I'm clearly stuck at that, I never leave the 4th point.
– Dominik Ficek
10 hours ago
Thank you this is certainly helpful. I have one more question, what is it that changes the value of CS register so it indicates the completion of transfer? I'm clearly stuck at that, I never leave the 4th point.
– Dominik Ficek
10 hours ago
Bit 16 being set in the CS register indicates the transfer is complete. See page 154. The hardware sets it.
– joan
10 hours ago
Bit 16 being set in the CS register indicates the transfer is complete. See page 154. The hardware sets it.
– joan
10 hours ago
add a comment |
Dominik Ficek is a new contributor. Be nice, and check out our Code of Conduct.
Dominik Ficek is a new contributor. Be nice, and check out our Code of Conduct.
Dominik Ficek is a new contributor. Be nice, and check out our Code of Conduct.
Dominik Ficek is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Raspberry Pi Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fraspberrypi.stackexchange.com%2fquestions%2f95968%2fspi-sending-function%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown