00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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 :
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 :
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 :
00105 storeLeaf(offset+ value.toInt() *4, key);
00106 break;
00107 case 3 :
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 }