Cat
UsbSpiBus.cpp
Go to the documentation of this file.
1 // $Id: $
2 // Include files
3 
4 
5 // local
6 #include "UsbSpiBus.h"
7 
8 //-----------------------------------------------------------------------------
9 // Implementation file for class : UsbSpiBus
10 //
11 // 2006-10-23 :
12 //-----------------------------------------------------------------------------
13 
14 //=============================================================================
15 // Standard constructor, initializes variables
16 //=============================================================================
18  setName("UsbSpiBus");
19  setType("UsbSpiBus");
20 
21  m_dataLength=32;
22  m_aSS = true;
23  m_lSBFirst = true;
24  m_txNeg = true;
25  m_rxNeg = true;
26 
27  m_regCtrl = new Register();
29  m_regSlaveSelect = new Register();
30  m_regRxData = new Register();
31  m_regTxData = new Register();
32 
33  m_regCtrl ->setName("CtrlReg");
34  m_regClockDivider->setName("ClockDividerReg");
35  m_regSlaveSelect ->setName("SlaveSelectReg");
36  m_regRxData ->setName("RxDataReg");
37  m_regTxData ->setName("TxDataReg");
38 
39  m_regCtrl ->io()->defDataU8(4);
42  m_regRxData ->io()->defDataU8(4);
43  m_regTxData ->io()->defDataU8(4);
44 
45  m_regCtrl ->io()->setAddress(64);
48  m_regRxData ->io()->setAddress(67);
49  m_regTxData ->io()->setAddress(67);
50 
56 
62 }
63 //=============================================================================
64 // Destructor
65 //=============================================================================
67 // delete m_regData;
68 // delete m_regAddress;
69 }
70 
71 //=============================================================================
72 //
73 //=============================================================================
75  if (0==m_connection){
76  if (0==this->parent()){
77  fatal("Cannot define connection for "+type()+". No parent found.",
78  "UsbSpiBus::init");
79  return StatusCode::FAILURE;
80  }
81  return setConnection(this->parent());
82  }
83  else return StatusCode::SUCCESS;
84 }
85 
86 //=============================================================================
87 //
88 //=============================================================================
89 void UsbSpiBus::ctrlWd(U8 length) {
90  U8* buffer=m_regCtrl->io()->dataU8();
91  buffer[0]=m_dataLength;
92  buffer[1]=
93  (m_aSS<<5)+
94  (m_lSBFirst<<3)+
95  (m_txNeg<<2)+
96  (m_rxNeg<<1)+
97  1;
98  buffer[2]=length&0x1;
99  buffer[3]=length&0x3F;
100 }
101 
102 //=============================================================================
103 //
104 //=============================================================================
106  Interface* connection = dynamic_cast<Interface*> (m_connection);
107  U8* buffer=m_regClockDivider->io()->dataU8();
108  buffer[0]= value&0xFF;
109  buffer[1]= (value>>8)&0xFF;
110  buffer[2]= (value>>16)&0xFF;
111  buffer[3]= (value>>24)&0xFF;
112  if (connection->write(m_regClockDivider->io()).isFailure()){
113  warning("Cannot write ClockDivider register on UsbSpiBus",
114  "UsbSpiBus::setClockDivider");
115  return StatusCode::FAILURE;
116  }
117  if (value!=clockDivider()){
118  warning("ClockDivider read/write mismatch.","UsbSpiBus::setClockDivider");
119  return StatusCode::FAILURE;
120  };
121  return StatusCode::SUCCESS;
122 }
123 
124 //=============================================================================
125 //
126 //=============================================================================
127 unsigned int long UsbSpiBus::clockDivider(){
128  Interface* connection = dynamic_cast<Interface*> (m_connection);
129  U8* buffer=m_regClockDivider->io()->dataU8();
130  if (connection->read(m_regClockDivider->io()).isFailure()){
131  warning("Cannot read ClockDivider register on UsbSpiBus",
132  "UsbSpiBus::clockDivider");
133  return StatusCode::FAILURE;
134  }
135  m_clockDivider=(buffer[0]+(buffer[1]<<8)+(buffer[1]<<16)+(buffer[1]<<24));
136  return m_clockDivider;
137 }
138 
139 //=============================================================================
140 //
141 //=============================================================================
143  Interface* connection = dynamic_cast<Interface*> (m_connection);
144  U8* buffer=m_regSlaveSelect->io()->dataU8();
145  buffer[0]=(U8)(io->address());
146  buffer[1]=(U8)(0);
147  buffer[2]=(U8)(0);
148  buffer[3]=(U8)(0);
149  info("1) chipselect register:");
150  m_regSlaveSelect->io()->dump(0);
151  if (connection->write(m_regSlaveSelect->io()).isFailure()){
152  warning("Cannot write SlaveSelect register on UsbSpiBus",
153  "UsbSpiBus::read");
154  return StatusCode::FAILURE;
155  }
156  m_dataLength=8*io->length();
157  buffer=m_regTxData->io()->dataU8();
158  // for (int i=0; i<(io->length()-1); ++i) buffer[i]=10;
159  buffer[io->length()-1]=io->dataU8(io->length()-1);
160  m_regTxData->io()->dump(0);
161  if (connection->write(m_regTxData->io()).isFailure()){
162  warning("Cannot write TxData register on UsbSpiBus","UsbSpiBus::write");
163  return StatusCode::FAILURE;
164  }
165  info("2) spi read length (header included): "+itos(m_dataLength));
167  info("3) Control word:");
168  m_regCtrl->io()->dump(0);
169  if (connection->write(m_regCtrl->io()).isFailure()){
170  warning("Cannot write Ctrl register on UsbSpiBus","UsbSpiBus::write");
171  return StatusCode::FAILURE;
172  }
173  if (connection->read(m_regRxData->io()).isFailure()){
174  warning("Cannot read RxData register on UsbSpiBus",
175  "UsbSpiBus::read"); ;
176  return StatusCode::FAILURE;
177  }
178  info("4) spi data read:");
179  m_regRxData->io()->dump(0);
180  buffer=io->dataU8();
181  for (unsigned int i=0; i<io->length()-1; ++i){
182  if (i>3) {
183  warning("Not implemented yet: cannot read more than 32 bits.",
184  "UsbSpiBus::write");
185  return StatusCode::FAILURE;
186  }
187  buffer[i]=m_regRxData->io()->dataU8(i);
188  }
189  return StatusCode::SUCCESS;
190 }
191 
192 //=============================================================================
193 //
194 //=============================================================================
196  U8* buffer=m_regSlaveSelect->io()->dataU8();
197  buffer[0]=(U8)(io->address());
198  buffer[1]=(U8)(0);
199  buffer[2]=(U8)(0);
200  buffer[3]=(U8)(0);
201  m_dataLength=8*io->length();
202  info("1) spi write length (header included): "+itos(m_dataLength));
203  Interface* connection = dynamic_cast<Interface*> (m_connection);
204  info("2) chip select register:");
205  m_regSlaveSelect->io()->dump(0);
206  if (connection->write(m_regSlaveSelect->io()).isFailure()){
207  warning("Cannot write SlaveSelect register on UsbSpiBus",
208  "UsbSpiBus::write");
209  return StatusCode::FAILURE;
210  }
211  info("3) spi data to be sent:");
212  buffer=m_regTxData->io()->dataU8();
213  for (unsigned int i=0; i<io->length(); ++i) {
214  if (i>3) {
215  warning("Not implemented yet: cannot send more than 32 bits.",
216  "UsbSpiBus::write");
217  return StatusCode::FAILURE;
218  }
219  buffer[i]=io->dataU8(i);
220  }
221  m_regTxData->io()->dump(0);
222  if (connection->write(m_regTxData->io()).isFailure()){
223  warning("Cannot write TxData register on UsbSpiBus","UsbSpiBus::write");
224  return StatusCode::FAILURE;
225  }
226  info("4) Control word:");
228  m_regCtrl->io()->dump(0);
229  if (connection->write(m_regCtrl->io()).isFailure()){
230  warning("Cannot write Ctrl register on UsbSpiBus","UsbSpiBus::write");
231  return StatusCode::FAILURE;
232  }
233  info("5) Spi transmission done.");
234  return StatusCode::SUCCESS;
235 }
236 
237 //=============================================================================
void info(std::string mymsg)
Definition: Object.h:38
std::string itos(int)
Definition: Tools.cpp:46
virtual ~UsbSpiBus()
Destructor.
Definition: UsbSpiBus.cpp:66
Hierarchy * connection()
Definition: Element.cpp:84
Hierarchy * m_connection
Definition: Element.h:70
StatusCode setConnection(Hierarchy *)
Definition: Element.cpp:55
Register * m_regCtrl
Definition: UsbSpiBus.h:117
U32 address()
Definition: IOdata.h:59
bool m_txNeg
Definition: UsbSpiBus.h:114
virtual StatusCode read(IOdata *)=0
void setName(std::string name)
Definition: Object.h:51
char m_dataLength
Definition: UsbSpiBus.h:111
unsigned long U32
Definition: UsbSpiBus.h:19
Register * m_regSlaveSelect
Definition: UsbSpiBus.h:119
Hierarchy * parent()
Definition: Hierarchy.h:28
void dump(unsigned int printout=0)
Definition: IOdata.cpp:94
virtual StatusCode init()
Definition: UsbSpiBus.cpp:74
void fatal(std::string mymsg)
Definition: Object.h:41
void ctrlWd(U8)
Definition: UsbSpiBus.cpp:89
Register * m_regTxData
Definition: UsbSpiBus.h:121
U32 clockDivider()
Definition: UsbSpiBus.cpp:127
void setType(std::string type)
Definition: Object.h:52
virtual StatusCode write(IOdata *)=0
bool m_lSBFirst
Definition: UsbSpiBus.h:113
bool m_rxNeg
Definition: UsbSpiBus.h:115
StatusCode setAddress(U32 address)
Definition: IOdata.h:51
unsigned char U8
Definition: UsbSpiBus.h:21
U32 length()
Definition: IOdata.h:175
virtual StatusCode read(IOdata *)
Definition: UsbSpiBus.cpp:142
Definition: IOdata.h:17
UsbSpiBus()
Standard constructor.
Definition: UsbSpiBus.cpp:17
bool m_aSS
Definition: UsbSpiBus.h:112
U8 * dataU8()
Definition: IOdata.h:214
Register * m_regClockDivider
Definition: UsbSpiBus.h:118
Register * m_regRxData
Definition: UsbSpiBus.h:120
virtual StatusCode write(IOdata *)
Definition: UsbSpiBus.cpp:195
virtual void addChild(Hierarchy *element)
Definition: Hierarchy.cpp:83
StatusCode setWordSize(IOdata::WordSize wordSize)
Definition: IOdata.h:126
U32 m_clockDivider
Definition: UsbSpiBus.h:116
std::string type()
Definition: Object.h:29
void defDataU8(unsigned long size)
Definition: IOdata.h:179
void warning(std::string mymsg)
Definition: Object.h:39
IOdata * io()
Definition: IOobject.h:66
StatusCode setClockDivider(U32)
Definition: UsbSpiBus.cpp:105