INOS
cinoscopmaster.h
Go to the documentation of this file.
1//******************************************************************************
27//******************************************************************************
28
29#ifndef INC_CINOSCOPMASTER_H
30#define INC_CINOSCOPMASTER_H
31
32
33//------------------------------------------------------------------------------
34// defines
35//------------------------------------------------------------------------------
36//
37// commands
38#define DF_COP_CMD_READ 0x80003000
39#define DF_COP_CMD_WRITE 0x80007000
40//
41// blink job
42#define DF_COP_BLINK_JOB0 0x80005FFC
43#define DF_COP_BLINK_JOB1 0x00010192
44// port communication job
45#define DF_COP_PORTCOMM_JOB0 0x80003F00
46#define DF_COP_PORTCOMM_JOB1 0x00010000
47
48// eeprom commands
49#define DF_COP_EEPROM_CMD 0x10000000
50#define DF_COP_EEPROM_CMD_READ 0x11000000
51#define DF_COP_EEPROM_CMD_WRITE 0x12000000
52#define DF_COP_CMD_MASK 0x0F000000
53
54// spi commands
55#define DF_COP_SPI_CMD 0x30000000
56#define DF_COP_SPI_CMD_COMM 0x31000000
57
59#define DF_COP_INTERNAL_ADDRESS 8
61#define DF_COP_MASTER_ADDRESS 9
62
64#define ER_COP_CONFIG_MISMATCH 0x00000001
65
67#define DF_COP_MOD_XDB "xcfg-mod-cop"
68
69
70//------------------------------------------------------------------------------
71// includes
72//------------------------------------------------------------------------------
73//
74// system
75#include <inos_lib.h>
76#include <inos_xml.h>
77#include <cincocopdevice.h>
78
79// C++
80
81// project
82#include <cinoscopmodule.h>
83
84
85//------------------------------------------------------------------------------
86// helper macros
87//------------------------------------------------------------------------------
88
90#define DPR_OFFSET(aMember) inos_offsetof(SINOSCOPMaster, aMember)
92#define DPR_MAX_OFFSET(aMember) (inos_offsetof(SINOSCOPMaster, aMember) + sizeofm(SINOSCOPMaster, aMember))
94#define DPR_OFFSET8K(aMember) inos_offsetof(SINOSCOPMaster8K, aMember)
96#define DPR_MAX_OFFSET8K(aMember) (inos_offsetof(SINOSCOPMaster8K, aMember) + sizeofm(SINOSCOPMaster8K, aMember))
97
98
99//------------------------------------------------------------------------------
100// structures
101//------------------------------------------------------------------------------
102
105{
107 uint8 m_uMisc1[0x1C0];
111 uint8 m_uMisc2[0x300-0x1C0-4];
115 uint32 m_uReserved[2];
120 uint16 m_uGlTlgCounter;
126 uint32 m_uCmdJob;
128 uint32 m_uBlinkJob[2];
130 uint8 m_uMasterTable[(0xA00-0x320)-2*4];
132 uint8 m_uTransData[0x200-4*4];
138 uint8 m_uReceiveData0[0x200];
140 uint8 m_uReceiveData1[0x200];
141
144};
145
148{
150 uint8 m_uMisc1[0x1C0];
154 uint8 m_uMisc2[0x300-0x1C0-4];
158 uint32 m_uReserved[2];
163 uint16 m_uGlTlgCounter;
169 uint32 m_uCmdJob;
171 uint32 m_uBlinkJob[2];
173 uint8 m_uMasterTable[(0x800-0x328)];
175 uint8 m_uTransData[0x600-4*4];
181 uint8 m_uTransInco[0x200];
183 uint8 m_uReserved2[0x7000];
185 uint8 m_uReceiveData0[0x600];
187 uint8 m_uReceiveInco0[0x200];
189 uint8 m_uReceiveData1[0x600];
191 uint8 m_uReceiveInco1[0x200];
192
195};
196
197
228
231{
232 enum {
233 eMaxCode = 0x100,
234 };
236 uint32 m_uId;
238 uint32 m_uIndex;
240 uint32 m_uCode[eMaxCode];
243};
244
245//------------------------------------------------------------------------------
246// class definition
247//------------------------------------------------------------------------------
248
251{
252 //--- user interface ---------------------------------------------------
253
254 public :
261 eNone = 0,
262
263 eEepromRead = (1<<0),
264 eEepromWrite = (1<<1),
265 eSpiRead = (1<<2),
266 eSpiWrite = (1<<3),
267
268 e8kLayout = (1<<4), // 8k layout
269 eActive = (1<<5), // running on active master
270 // CopBus is running as a parasite in the following situation:
271 // 1. we're running on core 0
272 // 2. we're running on a asymmetric system
273 // 3. core 1 is also running a CopBus instance
274 eParasite = (1<<6),
275 // CopBus is running as a chief in the following situation:
276 // 1. we're running on core 1
277 // 2. we're running on a asymmetric system
278 eChief = (1<<7),
279
280 eAll = (eEepromRead | eEepromWrite | eSpiRead | eSpiWrite)
281 };
282
283 // constants
284 enum {
285 eIrqMax = 8, // max. number of interrupt vectors
286 eIrqMain = 1, // main interrupt number
287 eIrqCore1 = 2, // core 1 interrupt number
288 eIrqMotor = 2, // motor control interrupt number
289 eIrqOverrun = 8,// overrun interrupt number
290 };
291
293 void Reset();
295 void BusScan(XMLNode aConfigNode);
298
300 void SeqStart(uint32 auCycleTimeNs, uint32 auSyncPage=0, bool abSoftSync = false);
302 void SeqStop();
304 void SeqWatchdog(uint32 auBusControl, int16 aiCycleAdjust);
308 void SeqClear();
310 void SeqWrite(uint32* apTable, bool abForceIrq = false, SINOSCOPSubroutine* apSubChain = 0);
314 uint32 SeqGetTime(uint32 uSubCycle=0);
315
316 // modules
317
320 return m_pModules;
321 };
324 return apModule->GetNext();
325 };
327 CINOSCOPModule* GetModule(uint32 auAddress);
332 CINOSCOPModule* GetModule(const char* apName);
333
338 bool HasModuleType(const char* apType);
339
340 // misc
341
343 void* GetDprAddress(uint16 auDprOffset) {
344 return m_pDevice->GetDprAddress(auDprOffset);
345 };
347 CINCOCOPDevice* GetDevice() {
348 return m_pDevice;
349 };
350
358 bool ReadModuleSpiData(uint32 auNumber, uint32 auCount, uint8* apBuffer,
359 uint32 auBufferSize);
360
367 bool WriteModuleSpiData(uint32 auNumber, uint32 auCount, uint8* apBuffer);
368
369
370 //--- internals --------------------------------------------------------
371
372 friend class CGINModuleActive;
373 friend class CINOSMcTargetFieldbusMasterCopBus;
374
375 // public member functions but just for internal use
376 public :
378 CINOSCOPMaster(CINCOCOPDevice* apDevice, bool abCopPas = false);
381
385 uint32 GetError() {
386 return m_uErrors;
387 }
388
390 bool ReadModuleEeprom(uint32 auNumber, SINOSCOPModuleEeprom& aEeprom, uint32 auSize);
391
397 bool WriteModuleEeprom(uint32 auNumber, SINOSCOPModuleEeprom& aEeprom, uint32 auSize);
398
402 uint32* GetSeqTable() {
403 return m_uSeqTable;
404 }
409 return m_uSeqTableSize;
410 }
411
417 bool CheckRangeCondition(const char* apModule, CINOSBusPortHandlerRangeCondition* apCond);
418
422 void CreateModules(XMLNode aConfigNode);
423
432 CINOSCOPModule* CreateModule(XMLNode xCard, const char* apModName,
433 uint32 auAddress, uint32 auAppRev, uint32 auProductCode);
434
439
446 void SetOptionalFeatures(uint32 auFeatures) {
447 m_uOptionalFeatures = auFeatures;
448 }
449
453 void AddOptionalFeatures(uint32 auFeature) {
454 m_uOptionalFeatures |= auFeature;
455 }
456
460 return (m_uOptionalFeatures & aeFeature);
461 }
462
464 bool IsParasite() const {
465 return (m_uOptionalFeatures & eParasite);
466 }
467
469 bool IsChief() const {
470 return (m_uOptionalFeatures & eChief);
471 }
472
474 uint32 GetCycleTimer() const;
475
476 // private methods
477 private :
479 void uSleep(uint32 auMicroseconds);
480
482 static const char* GetXmlFile(const char* apcProductCode);
483
493 static EXmlError GetModuleConfig(const char* apModuleXml, SINOSCOPModuleEeprom& aEeprom,
494 uint32 auType, uint32 auAddress, XMLNode aParentNode, XMLNode& axDestNode);
495
502 static XMLNode GetSystemModuleConfig(const char* apcProductCode,
503 uint8 auType, bool abConfigLib);
504
506 void StartReadModuleEeprom(uint32 auNumber, uint32 auSize);
508 void StartWriteModuleEeprom(uint32 auNumber, SINOSCOPModuleEeprom& aEeprom, uint32 auSize);
510 void GetEepromData(SINOSCOPModuleEeprom& aEeprom);
511
513 bool ReadModuleSpi(uint32 auNumber, uint32 auAddress, uint32 auCount,
514 uint8* apBuffer, uint32 auBufferSize);
515
524 void StartModuleSpiComm(uint32 auNumber, uint32 auAddress, uint32 auSize,
525 uint32 auCommand, uint32 auCmdSize, bool abRound);
526
534 bool WriteModuleSpi(uint32 auNumber, uint32 auAddress, uint32 auCount,
535 uint8* apBuffer);
536
541 uint32 SpiGetFlashStatus(uint32 auNumber);
542
547 bool SpiEnableWrite(uint32 auNumber);
548
553 bool SpiUnlock(uint32 auNumber);
554
559 bool SpiLock(uint32 auNumber);
560
565 bool SpiWaitForCompletion(uint32 auNumber);
566
572 bool SpiDoEraseSectorAt(uint32 auNumber, uint32 auSectorAddress);
573
575 void StopModuleSpiAccess();
577 void GetSpiData(uint8* apBuffer, uint32 auBufferSize);
579 void PutSpiData(uint8* apBuffer, uint32 auBufferSize);
580
582 bool IsCmdRunning();
583
585 void SetSupportedModules(const char* apModules)
586 {
587 // set string
588 inos_strncpy(m_cSupportedModules, apModules, sizeof(m_cSupportedModules));
589 }
590
591 // private members
592 private :
594 CINCOCOPDevice* m_pDevice;
596 CINOSCOPModule* m_pModules;
598 uint32 m_uSeqTable[1024];
600 uint32 m_uSeqTableSize;
602 uint32 m_uWatchdog;
604 volatile uint32* m_pWatchdog;
606 uint32 m_uErrors;
608 uint32 m_uOptionalFeatures;
609
611 enum {
612 eFlgForceMainIrq = 0x00000001,
613 eFlgTableValid = 0x00000002,
614 };
615 uint32 m_uFlags;
616
618 #ifdef INOSV
619 class CINOSSharedMemoryCopBus* m_pShared = 0;
620 uint8* m_pScanData = 0;
621 uint32 m_uScanDataIndex = 0;
622 #endif
623
625 char m_cSupportedModules[256] = {0};
626
629};
630
631
632//------------------------------------------------------------------------------
633
634#endif // INC_CINOSCOPMASTER_H
635
636
637//------------------------------------------------------------------------------
638// end of file
COP slave definition.
#define DECLARE_DYNAMIC(aClass)
Definition cinospartitionmemory.h:328
The main class handling a COP bus, local or remote (GinLink passive).
Definition cinoscopmaster.h:251
void SeqStart(uint32 auCycleTimeNs, uint32 auSyncPage=0, bool abSoftSync=false)
start sequencer
CINOSCOPModule * GetNext(CINOSCOPModule *apModule)
get next module
Definition cinoscopmaster.h:323
CINOSCOPModule * GetModule(const char *apName)
Get module by name.
CINOSCOPModule * GetFirst()
get first module
Definition cinoscopmaster.h:319
bool IsChief() const
Definition cinoscopmaster.h:469
CINOSCOPModule * GetModule(uint32 auAddress)
Get module by address.
void * GetDprAddress(uint16 auDprOffset)
get dpr address
Definition cinoscopmaster.h:343
void SetOptionalFeatures(uint32 auFeatures)
Definition cinoscopmaster.h:446
void SeqStop()
stop sequencer
bool ReadModuleEeprom(uint32 auNumber, SINOSCOPModuleEeprom &aEeprom, uint32 auSize)
Complete sequence to read a module's eeprom.
bool CheckRangeCondition(const char *apModule, CINOSBusPortHandlerRangeCondition *apCond)
Check if the condition of a range is met.
uint32 GetError()
Get errors of cop bus master.
Definition cinoscopmaster.h:385
bool IsModuleOnline()
Return online state of device's bus module.
uint32 SeqGetTime(uint32 uSubCycle=0)
get table length [ns]
CINOSCOPMaster(CINCOCOPDevice *apDevice, bool abCopPas=false)
Constructor.
void ToggleWatchdog()
toggle watchdog (only on active master)
bool IsParasite() const
Definition cinoscopmaster.h:464
void BusScan(XMLNode aConfigNode)
scan bus
uint32 GetSeqTableSize()
Get size of sequence table in uint32 units.
Definition cinoscopmaster.h:408
virtual ~CINOSCOPMaster()
Destructor.
void BusStartup()
call startup actions of all modules
CINOSCOPModule * CreateModule(XMLNode xCard, const char *apModName, uint32 auAddress, uint32 auAppRev, uint32 auProductCode)
Create a module with the given information.
void CreateModules(XMLNode aConfigNode)
Create modules with given xml config file.
CINCOCOPDevice * GetDevice()
get pointer to cop device
Definition cinoscopmaster.h:347
void SeqWatchdog(uint32 auBusControl, int16 aiCycleAdjust)
handle watchdog (only on active master)
uint32 GetCycleTimer() const
bool ReadModuleSpiData(uint32 auNumber, uint32 auCount, uint8 *apBuffer, uint32 auBufferSize)
Read some data from a module's spi flash (fixed memory address).
void SeqClear()
clear sequencer table
void AddOptionalFeatures(uint32 auFeature)
Definition cinoscopmaster.h:453
bool WriteModuleSpiData(uint32 auNumber, uint32 auCount, uint8 *apBuffer)
Write some data into a module's spi flash (fixed memory address).
bool IsOptionalFeatureEnabled(EOptionalFeatures aeFeature) const
Definition cinoscopmaster.h:459
bool HasModuleType(const char *apType)
Return true if copbus has a module of the given type.
void SeqWrite(uint32 *apTable, bool abForceIrq=false, SINOSCOPSubroutine *apSubChain=0)
write sequencer table
EOptionalFeatures
Definition cinoscopmaster.h:260
void Reset()
reset bus
uint32 * GetSeqTable()
Get pointer to sequence backup table.
Definition cinoscopmaster.h:402
void SeqEnableIrq()
enable irq
bool WriteModuleEeprom(uint32 auNumber, SINOSCOPModuleEeprom &aEeprom, uint32 auSize)
Write a module's eeprom.
The class handling a single COP module.
Definition cinoscopmodule.h:214
CINOSCOPModule * GetNext()
module pointer to next cop module
Definition cinoscopmodule.h:291
General xml functions.
EXmlError
Errors that can occur while handling xml data.
Definition inos_xml.h:586
COP layout for master with an 8K area.
Definition cinoscopmaster.h:148
uint8 m_uReserved2[0x7000]
reserved
Definition cinoscopmaster.h:183
uint8 m_uTransInco[0x200]
Transmit data for inco. // 0x0E00.
Definition cinoscopmaster.h:181
uint8 m_uReceiveData0[0x600]
receive data 0 // 0x8000
Definition cinoscopmaster.h:185
uint8 m_uMisc1[0x1C0]
misc
Definition cinoscopmaster.h:150
uint32 m_uCmdDesc
command desc // 0x0318
Definition cinoscopmaster.h:167
uint32 m_uCmdJob
eeprom/jtag/spi // 0x031C
Definition cinoscopmaster.h:169
uint32 m_uRevision
revision // 0x01C0
Definition cinoscopmaster.h:152
uint32 m_uBlinkJob[2]
blink job // 0x0320
Definition cinoscopmaster.h:171
uint32 m_uCycleTimer
cycle timer // 0x0300
Definition cinoscopmaster.h:156
uint8 m_uMasterTable[(0x800-0x328)]
busmaster table // 0x0328
Definition cinoscopmaster.h:173
uint8 m_uTransData[0x600-4 *4]
trans data // 0x0800
Definition cinoscopmaster.h:175
uint8 m_uReceiveInco1[0x200]
Receive data 1 for inco. // 0x8E00.
Definition cinoscopmaster.h:191
uint32 m_uPortCommWrite[2]
port communication 'write' part // 0x0DF8
Definition cinoscopmaster.h:179
uint16 m_uGlTlgTime
GinLink Tlg-Cnt / Tlg-Time // 0x0310.
Definition cinoscopmaster.h:162
uint32 m_uPortCommRead[2]
port communication // 0x0DF0
Definition cinoscopmaster.h:177
DECLARE_DYNAMIC(SINOSCOPMaster8K)
Support dynamic object handling.
uint8 m_uReceiveData1[0x600]
receive data 1 // 0x8800
Definition cinoscopmaster.h:189
uint8 m_uReceiveInco0[0x200]
Receive data 0 for inco. // 0x8600.
Definition cinoscopmaster.h:187
uint32 m_uReserved[2]
reserved
Definition cinoscopmaster.h:158
uint8 m_uMisc2[0x300-0x1C0-4]
misc
Definition cinoscopmaster.h:154
uint32 m_uReserved1
reserved // 0x0314
Definition cinoscopmaster.h:165
uint32 m_uCycleCount
cycle counter // 0x030C
Definition cinoscopmaster.h:160
COP layout for master with a small area.
Definition cinoscopmaster.h:105
uint32 m_uBlinkJob[2]
blink job // 0x0320
Definition cinoscopmaster.h:128
uint8 m_uMisc1[0x1C0]
misc
Definition cinoscopmaster.h:107
uint8 m_uReceiveData1[0x200]
receive data 1 // 0x0E00
Definition cinoscopmaster.h:140
uint8 m_uTransData[0x200-4 *4]
trans data // 0x0A00
Definition cinoscopmaster.h:132
uint8 m_uMasterTable[(0xA00-0x320) -2 *4]
busmaster table // 0x0328
Definition cinoscopmaster.h:130
uint8 m_uReceiveData0[0x200]
receive data 0 // 0x0C00
Definition cinoscopmaster.h:138
uint32 m_uReserved[2]
reserved
Definition cinoscopmaster.h:115
uint8 m_uMisc2[0x300-0x1C0-4]
misc
Definition cinoscopmaster.h:111
uint16 m_uGlTlgTime
GinLink Tlg-Cnt / Tlg-Time // 0x0310.
Definition cinoscopmaster.h:119
uint32 m_uCycleCount
cycle counter // 0x030C
Definition cinoscopmaster.h:117
DECLARE_DYNAMIC(SINOSCOPMaster)
Support dynamic object handling.
uint32 m_uReserved1
reserved // 0x0314
Definition cinoscopmaster.h:122
uint32 m_uCycleTimer
cycle timer // 0x0300
Definition cinoscopmaster.h:113
uint32 m_uRevision
revision // 0x01C0
Definition cinoscopmaster.h:109
uint32 m_uPortCommWrite[2]
port communication 'write' part // 0x0BF8
Definition cinoscopmaster.h:136
uint32 m_uCmdDesc
command desc // 0x0318
Definition cinoscopmaster.h:124
uint32 m_uPortCommRead[2]
port communication 'read' part // 0x0BF0
Definition cinoscopmaster.h:134
uint32 m_uCmdJob
eeprom/jtag/spi // 0x031C
Definition cinoscopmaster.h:126
Struct of the eeprom data of a COP module.
Definition cinoscopmodule.h:174
Struct to hold info about scanned or configured modules.
Definition cinoscopmaster.h:199
XMLNode m_xCard
The parsed xml file.
Definition cinoscopmaster.h:215
uint32 m_uEepromSize
Eeprom size.
Definition cinoscopmaster.h:213
bool m_bNameUnique
Flag if the module name is unique (no need to add address)
Definition cinoscopmaster.h:221
bool m_bCreateModule
Flag if the module should be created in the software.
Definition cinoscopmaster.h:217
bool m_bOnline
Flag if the module is online (scanned) or not.
Definition cinoscopmaster.h:219
SINOSCOPModuleEeprom m_Eeprom
The content of the module's eeprom.
Definition cinoscopmaster.h:209
uint32 m_uProductCode
The product code from the eeprom or xml file.
Definition cinoscopmaster.h:211
const char * m_pModName
The module name from the xml file or eeprom.
Definition cinoscopmaster.h:203
bool m_bEeprom
Flag if the module's eeprom is valid.
Definition cinoscopmaster.h:207
bool m_bModXmlValid
Flag if the module's xml file is valid.
Definition cinoscopmaster.h:205
DECLARE_DYNAMIC(SINOSCOPScanMod)
Support dynamic object handling.
uint16 m_uAppRev
The application revision as read from the module.
Definition cinoscopmaster.h:201
const char * m_pModXml
Module's xml file.
Definition cinoscopmaster.h:223
COP bus subroutines.
Definition cinoscopmaster.h:231
uint32 m_uCode[eMaxCode]
Subroutine code (max. 1kB).
Definition cinoscopmaster.h:240
uint32 m_uIndex
Subroutine index.
Definition cinoscopmaster.h:238
SINOSCOPSubroutine * m_pNext
Pointer to next subroutine.
Definition cinoscopmaster.h:242
uint32 m_uId
Subroutine id.
Definition cinoscopmaster.h:236