@@ -18,27 +18,39 @@ namespace CommandLineUtilities {
1818namespace Alf {
1919
2020namespace Registers {
21- constexpr size_t BASE_INDEX = 0x4224000 / 4 ;
22- constexpr int WRITE_DATA (0x20 / 4 );
23- constexpr int WRITE_COMMAND (0x24 / 4 );
24- constexpr int CONTROL (0x28 / 4 );
25- constexpr int READ_DATA (0x30 / 4 );
26- constexpr int READ_COMMAND (0x34 / 4 );
27- constexpr int READ_BUSY (0x38 / 4 );
28- constexpr int READ_TIME (0x3c / 4 );
21+ constexpr int CRU_BASE_INDEX = 0x4224000 / 4 ;
22+ constexpr int CRU_LINK_OFFSET = 0x20000 / 4 ;
23+ constexpr int CRU_MAX_LINKS = 7 ;
24+ constexpr int CRORC_BASE_INDEX = 0x30 / 4 ;
25+ constexpr int CRORC_LINK_OFFSET = 0x50 / 4 ;
26+ constexpr int CRORC_MAX_LINKS = 2 ;
27+ constexpr int WRITE_DATA = 0x20 / 4 ;
28+ constexpr int WRITE_COMMAND = 0x24 / 4 ;
29+ constexpr int CONTROL = 0x28 / 4 ;
30+ constexpr int READ_DATA = 0x30 / 4 ;
31+ constexpr int READ_COMMAND = 0x34 / 4 ;
32+ constexpr int READ_BUSY = 0x38 / 4 ;
33+ constexpr int READ_TIME = 0x3c / 4 ;
2934} // namespace Registers
3035
3136constexpr auto BUSY_TIMEOUT = std::chrono::milliseconds(10 );
3237constexpr auto CHANNEL_BUSY_TIMEOUT = std::chrono::milliseconds(10 );
3338
34- Sca::Sca (RegisterReadWriteInterface &bar2, CardType::type cardType, int link) : bar2 (bar2)
39+ Sca::Sca (RegisterReadWriteInterface &bar2, CardType::type cardType, int link) : mBar2 (bar2)
3540{
41+ auto setOffset = [&](auto base, auto offset, auto maxLinks) {
42+ if (link >= maxLinks ) {
43+ BOOST_THROW_EXCEPTION (ScaException () << ErrorInfo::Message (" Maximum link number exceeded" ));
44+ }
45+ mOffset = base + link * offset;
46+ };
47+
3648 if (cardType == CardType::Cru) {
37- offset = 0x04224000 + link * 0x20000 ;
49+ setOffset (Registers::CRU_BASE_INDEX, Registers::CRU_LINK_OFFSET, Registers::CRU_MAX_LINKS) ;
3850 } else if (cardType == CardType::Crorc) {
39- offset = 0x1a0 ;
51+ setOffset (Registers::CRORC_BASE_INDEX, Registers::CRORC_LINK_OFFSET, Registers::CRORC_MAX_LINKS) ;
4052 } else if (cardType == CardType::Dummy){
41- offset = 0 ;
53+ setOffset ( 0 , 0x100 , 6 ) ;
4254 } else {
4355 throw std::runtime_error (" Unknown card type, could not calculate SCA offset" );
4456 }
@@ -183,12 +195,12 @@ auto Sca::gpioRead() -> ReadResult
183195
184196void Sca::barWrite (int index, uint32_t data)
185197{
186- bar2 .writeRegister (index + offset , data);
198+ mBar2 .writeRegister (index + mOffset , data);
187199}
188200
189201uint32_t Sca::barRead (int index)
190202{
191- return bar2 .readRegister (index + offset );
203+ return mBar2 .readRegister (index + mOffset );
192204}
193205
194206void Sca::executeCommand ()
0 commit comments