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

l1394_csrrom.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002                           l1394csrrom.cpp  -  description
00003                              -------------------
00004     begin                : Thu Sep 21 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_csrrom.h"
00019 namespace L1394{
00020 namespace internal{
00021 CsrRom::CsrRom(Node* parent_node)
00022 {
00023   parent          = parent_node;
00024   root_directory  = NULL;
00025   node_bus_info    = NULL;
00026   actual_directory = NULL;
00027 }
00028 
00029 CsrRom::~CsrRom()
00030 {
00031   delete root_directory;
00032   delete actual_directory;
00033   delete node_bus_info;
00034 }
00035 
00036 
00037 void CsrRom::readInfoBlock()
00038 {
00039   Quadlet buffer;
00040   int length = 0;
00041 
00042   parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+0x0, &buffer) ;
00043   length = buffer.getBitRange(24,31);
00044 
00045 
00046   QArray rom_info_block(length);
00047 
00048   for (int i = 0; i < length; i++)
00049   {
00050      parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+0x4+(0x4*i), &buffer);
00051     rom_info_block.insert(buffer, i);
00052   }
00053 
00054   node_bus_info = new BusInfo(&rom_info_block);
00055 }
00056 
00057 
00058 
00059 void CsrRom::readDirectory()
00060 {
00061   Quadlet tmp;
00062   int dirOffset  = 0;
00063   int length    = 0;
00064   parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+0x0, &tmp);
00065   dirOffset      = (tmp.getBitRange(24,31) +1)*4;
00066   parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+dirOffset, &tmp);
00067   length        = tmp.getBitRange(16,31);
00068 
00069   root_directory    = new CsrDirectory(length, NULL);
00070   actual_directory  = root_directory;
00071 
00072   for (int i = 0; i<length;i++)
00073     storeDirectoryValues(dirOffset+4+(i*4));
00074 }
00075 
00076 void CsrRom::storeDirectoryValues(int offset)
00077 {
00078   int key = 0;int key_id = 0; int key_value = 0;
00079 
00080   Quadlet tmp, value;
00081 
00082   parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+offset, &tmp);
00083   key      = tmp.getBitRange(24,31);
00084   key_id  = key >> 6;
00085   key_value = key & 0x3F;
00086   value.fromInt(tmp.getBitRange(0,23));
00087   DNode *d;
00088   QArray *q = NULL;
00089   switch(key_id)
00090   {
00091     case 0 : //cout << "Immediate value" << endl;
00092              q = new QArray(1);
00093              q->insert(value,0);
00094               d = new DNode(key, q);
00095              actual_directory->attach(d);
00096              break;
00097     case 1 : //cout << "Offset Value" << endl;
00098              parent->read(CSR_REGISTER_BASE+value.toInt(), &tmp);
00099              q = new QArray(1);
00100              q->insert(tmp,0);
00101               d = new DNode(key, q);
00102              actual_directory->attach(d);
00103              break;
00104     case 2 : //cout << "It's a Leaf" << endl;
00105              storeLeaf(offset+ value.toInt() *4, key);
00106              break;
00107     case 3 : //cout << "It's a SubDir with type : " << key << endl;
00108              storeDirectory(offset+value.toInt() * 4, key);
00109   }
00110   delete q;
00111 }
00112 
00113 void CsrRom::storeLeaf(int offset, int key) {
00114 
00115   Quadlet tmp ; int length = 0;
00116   int key_id, key_value;
00117 
00118   parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+offset, &tmp);
00119   length = tmp.getBitRange(16,31);
00120 
00121   key_id = key >> 6;
00122   key_value = key & 0x3F;
00123 
00124   DNode *d;
00125   switch (key_value) {
00126 
00127    default :
00128         parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+offset, &tmp);
00129         QArray *textinfo = new QArray(length);
00130         for (int k = 0; k< length ;k++)
00131           {
00132             offset = offset+4;
00133             parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+offset, &tmp);
00134             textinfo->insert(tmp,k);
00135           }
00136         d = new DNode(key, textinfo);
00137         actual_directory->attach(d);
00138         break;
00139     }
00140 }
00141 
00142 void CsrRom::storeDirectory(int offset, int key){
00143 
00144   Quadlet tmp; int length = 0;
00145 
00146   parent->read(CSR_REGISTER_BASE+CSR_CONFIG_ROM+offset, &tmp);
00147   length = tmp.getBitRange(16,31);
00148 
00149   CsrDirectory *sub_dir  = new CsrDirectory(length, actual_directory);
00150    DNode *sub_leaf        = new DNode(key, sub_dir);
00151   actual_directory->attach(sub_leaf);
00152   actual_directory      = sub_dir;
00153 
00154   for (int i = 0; i<length;i++)
00155     storeDirectoryValues(offset+4+(i*4));
00156 
00157   actual_directory = sub_dir->getParent();
00158 }
00159 
00160 }
00161 
00162 }

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