Main Page | Modules | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members

l1394_bustopology.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           l1394bustopology.cpp  -  description
00003                              -------------------
00004     begin                : Thu Jul 20 2000
00005     copyright            : (C) 2000-2004 by Michael Repplinger
00006     email                : repplinger@cs.uni-sb.de
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
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; //delete old rom_info values
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 // start test how many selfid's has a node and make portinfo
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; // a value that cloud never be a valid phy_id
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; // a value that cloud never be a valid phy_id
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;  // a value that cloud never be a valid phy_id
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 //       message->debugStream() << l1 << endl;
00136       new_node->setPortStatus(k,l1.getBitRange(6-(k*2),7-(k*2)));
00137 //       message->debugStream() << "port : " << l1.getBitRange(6-(k*2),7-(k*2))<< endl;
00138     }
00139   }
00140 
00141 // end test how many selfid's has a node
00142   new_node->setNodeInfo(&l1);
00143 /* if root_node is not set then set root_node
00144  * need for the first call of this function*/
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 }

Generated on Wed Aug 24 00:36:39 2005 for L1394 by doxygen 1.4.2
L1394 library (NMM) grahics.cs.uni-sb.de/~repplix/l1394_home/