00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include "l1394_bustopology.h"
00019 #include "libraw1394/csr.h"
00020
00021 namespace L1394{
00022 namespace internal{
00023
00024 BusTopology::BusTopology(Node* parent_node)
00025 {
00026 message = SMessage::getInstance();
00027 rom_length = 0;
00028 root_node = NULL;
00029 rom_info = NULL;
00030 parent = parent_node;
00031 }
00032
00033
00034 BusTopology::~BusTopology()
00035 {
00036 delete root_node;
00037 delete rom_info;
00038 }
00039
00040 internal::TopoNode* BusTopology::getRootNode()
00041 {
00042 if(root_node != NULL)
00043 delete root_node;
00044 readTopoMap();
00045 return makeTree(root_node);
00046 }
00047
00048 QArray* BusTopology::readTopoMap()
00049 {
00050
00051 delete rom_info;
00052
00053 Quadlet tmp;
00054
00055 parent->read(CSR_REGISTER_BASE+CSR_TOPOLOGY_MAP, &tmp);
00056 rom_length = tmp.getBitRange(16,31)-2;
00057
00058 start = rom_length-1;
00059
00060 QArray *temp_info = new QArray(rom_length);
00061
00062 for (int i = 0; i<rom_length; i++)
00063 {
00064 parent->read(CSR_REGISTER_BASE+CSR_TOPOLOGY_MAP+0x0c+i*4, &tmp);
00065 temp_info->insert(tmp,i);
00066 }
00067
00068 rom_info = temp_info;
00069
00070 message->debugStream() << endl << "L1394 DEBUG_MESSAGE : L1394::internal::BusTopology > start of new topomap" << endl;
00071 message->debugStream() << *rom_info;
00072 message->debugStream() << endl << "L1394 DEBUG_MESSAGE : L1394::internal::BusTopology > end of new topomap" << endl;
00073
00074
00075 return rom_info;
00076 }
00077
00078 internal::TopoNode* BusTopology::makeTree(internal::TopoNode *actual_parent)
00079 {
00080 int id, id_next, id_next_next;
00081 id_next = 0; id_next_next = 0; id = 0;
00082
00083 internal::TopoNode *new_node;
00084 Quadlet l1, l2, l3;
00085
00086
00087
00088 if (start >= 0)
00089 {
00090 id = rom_info->getQuadlet(start).getBitRange(24,31);
00091 l1 = rom_info->getQuadlet(start);
00092 }
00093 else id = 0xDF;
00094
00095 if (start-1>=0)
00096 {
00097 id_next = rom_info->getQuadlet(start-1).getBitRange(24,31);
00098 l2 = rom_info->getQuadlet(start-1);
00099 }
00100 else id_next = 0xEF;
00101
00102 if (start-2>=0)
00103 {
00104 id_next_next = rom_info->getQuadlet(start-2).getBitRange(24,31);
00105 l3 = rom_info->getQuadlet(start-2);
00106 }
00107 else id_next_next = 0xFF;
00108
00109 if (id_next == id)
00110 {
00111 if(id_next_next == id)
00112 {
00113 new_node = new internal::TopoNode(16,actual_parent);
00114 for (int k = 2; k >= 0; k--)
00115 new_node->setPortStatus(k,l3.getBitRange(6-(k*2),7-(k*2)));
00116 for (int k = 7; k >= 0; k--)
00117 new_node->setPortStatus(k+3,l2.getBitRange(16-(k*2),17-(k*2)));
00118 for (int k = 4; k >= 0; k--)
00119 new_node->setPortStatus(k+11,l1.getBitRange(16-(k*2),17-(k*2)));
00120 }
00121 else
00122 {
00123 new_node = new internal::TopoNode(11,actual_parent);
00124 for (int k = 2; k >=0; k--)
00125 new_node->setPortStatus(k,l2.getBitRange(6-(k*2),7-(k*2)));
00126 for (int k = 7; k >=0; k--)
00127 new_node->setPortStatus(k+3, l1.getBitRange(16-(k*2),17-(k*2)));
00128 }
00129 }
00130 else
00131 {
00132 new_node = new internal::TopoNode(3, actual_parent);
00133 for (int k = 2; k >= 0; k--)
00134 {
00135
00136 new_node->setPortStatus(k,l1.getBitRange(6-(k*2),7-(k*2)));
00137
00138 }
00139 }
00140
00141
00142 new_node->setNodeInfo(&l1);
00143
00144
00145 if (root_node == NULL) root_node = new_node;
00146
00147 for (int i = 0; i < new_node->getMaxPort();i++)
00148 {
00149 int temp = new_node->getPortStatus(i);
00150
00151 switch (temp)
00152 {
00153 case 0: new_node->setChild(i, NULL); break;
00154
00155 case 1: new_node->setChild(i, NULL); break;
00156
00157 case 2: new_node->setChild(i, NULL); break;
00158
00159 case 3:
00160 switch(new_node->getMaxPort())
00161 {
00162 case 3: start = start-1;new_node->setChild(i, makeTree(new_node)); break;
00163 case 11: start = start-2;new_node->setChild(i, makeTree(new_node)); break;
00164 case 16: start = start-3;new_node->setChild(i, makeTree(new_node)); break;
00165 }; break;
00166 }
00167 }
00168 return new_node;
00169 }
00170
00171
00172
00173 void BusTopology::print()
00174 {
00175 if (root_node == NULL) { message->debugStream() << "nix gespeichert" ; return ;}
00176 else root_node->printNode();
00177 }
00178 }
00179 }