IEEE 1394 Configuration ROM Decoder
by William F. Alexander


Listing One

Raw Data Dump of the Configuration ROM from device number 1 (id=00A0B800)

1394 Addr Off    Data
-------------    --------  --------  --------  -------- 
FFFF:F0000400    042E19A8  31333934  00FF5000  00A0B800  
FFFF:F0000410    00005000  00067A52  0C0083C0  0300A0B8  
FFFF:F0000420    8100000F  0400500A  81000015  D1000001  
FFFF:F0000430    00067752  1200609E  13010483  5400C000  
FFFF:F0000440    3A401E08  14000000  D4000001  000329A2  
FFFF:F0000450    0400500A  8100000A  8200000E  0007BD5D  
FFFF:F0000460    00000000  00000000  53594D42  494F5320  
FFFF:F0000470    4C4F4749  432C2049  4E432E00  00044469  
FFFF:F0000480    00000000  00000000  53594D42  494F5300  
FFFF:F0000490    000AE09E  00000000  00000000  53594D31  
FFFF:F00004A0    33465735  30302D44  49534B20  44524956  
FFFF:F00004B0    45000000  00000000  00000000  

Decode of the Configuration ROM from device number 1 (id=00A0B800)

1394 Addr Off Quadlet  Meaning
------------- -------- --------------------------------------------------

Confiruation ROM Header
FFFF:F0000400 042E19A8 info_length=04, crc_length=2E, rom_crc_value=19A8

Bus_Info_Block
FFFF:F0000404 31333934 bus_name=31333934 ("1394")
FFFF:F0000408 00FF5000 irmc=0, cmc=0, isc=0, bmc=0, cyc_clk_acc=FF, max_rec=5
FFFF:F000040C 00A0B800 node_vendor_id=00A0B8, chip_id_hi=00
FFFF:F0000410 00005000 chip_id_lo=00005000

Root_Directory
FFFF:F0000414 00067A52 length=0006, crc=7A52
FFFF:F0000418 0C0083C0 Node_Capabilities spt 64 fix lst drg 
FFFF:F000041C 0300A0B8 Module_Vendor_Id 00A0B8
FFFF:F0000420 8100000F Textual_Descriptor leaf ind_off=00000F (FFFF:F000045C)
FFFF:F0000424 0400500A Module_Hw_Version 00500A
FFFF:F0000428 81000015 Textual_Descriptor leaf ind_off=000015 (FFFF:F000047C)
FFFF:F000042C D1000001 Unit_Directory directory ind_off=000001 (FFFF:F0000430)

Unit_Directory directory referenced from FFFF:F000042C
FFFF:F0000430 00067752 length=0006, crc=7752
FFFF:F0000434 1200609E Unit_Spec_Id 00609E
FFFF:F0000438 13010483 Unit_Sw_Version 010483
FFFF:F000043C 5400C000 Management_Agent crc_offset=00C000 (FFFF:F0030000)
FFFF:F0000440 3A401E08 Unit_Characteristics 401E08
FFFF:F0000444 14000000 Logical_Unit_Number o=0, device_type=00, lun=0000
FFFF:F0000448 D4000001 Logical_Unit_Directory 
                                  directory ind_off=000001 (FFFF:F000044C)

Logical_Unit_Directory directory referenced from FFFF:F0000448
FFFF:F000044C 000329A2 length=0003, crc=29A2
FFFF:F0000450 0400500A Module_Hw_Version 00500A
FFFF:F0000454 8100000A Textual_Descriptor leaf ind_off=00000A (FFFF:F000047C)
FFFF:F0000458 8200000E Bus_Dependent_Info leaf ind_off=00000E (FFFF:F0000490)

Textual_Descriptor leaf referenced from FFFF:F0000420
FFFF:F000045C 0007BD5D length=0007, crc=BD5D
FFFF:F0000460 00000000 ....
FFFF:F0000464 00000000 ....
FFFF:F0000468 53594D42 SYMB
FFFF:F000046C 494F5320 IOS 
FFFF:F0000470 4C4F4749 LOGI
FFFF:F0000474 432C2049 C, I
FFFF:F0000478 4E432E00 NC..

Textual_Descriptor leaf referenced from FFFF:F0000454
FFFF:F000047C 00044469 length=0004, crc=4469
FFFF:F0000480 00000000 ....
FFFF:F0000484 00000000 ....
FFFF:F0000488 53594D42 SYMB
FFFF:F000048C 494F5300 IOS.

Bus_Dependent_Info leaf referenced from FFFF:F0000458
FFFF:F0000490 000AE09E length=000A, crc=E09E
FFFF:F0000494 00000000 ....
FFFF:F0000498 00000000 ....
FFFF:F000049C 53594D31 SYM1
FFFF:F00004A0 33465735 3FW5
FFFF:F00004A4 30302D44 00-D
FFFF:F00004A8 49534B20 ISK 
FFFF:F00004AC 44524956 DRIV
FFFF:F00004B0 45000000 E...
FFFF:F00004B4 00000000 ....
FFFF:F00004B8 00000000 ....


Listing Two

BOOL ReadQuadlet(cls1394HANDLE hDev, LARGE_INTEGER liAddress, QUADLET *qValue)
{
clsAsyncRead aw;
BOOL rc;

// Setup request structure
aw.DestinationAddress = &liAddress;
aw.nNumberOfBytesToRead = sizeof(QUADLET);
aw.nBlockSize = 0;
aw.fulFlags = 0;
aw.lpBuffer = qValue;
    // Call driver
rc = lpfnCls1394DeviceIoControl(hDev,CLS_REQUEST_ASYNC_READ,
                                     &aw,sizeof(clsAsyncRead),0,0,0,0);
return (rc);
}

Listing Three
// Block Types
#define BT_NONE        0
#define BT_DIRECTORY   1
#define BT_LEAF        2

// Block Information Structuretypedef struct BlockInfoStruct
{
    DWORD       BlockType;             // NONE, DIRECTORY or LEAF
    DirEntryT   ReferringDirEntry;     // Copy of the directory entry quadlet
    DWORD       ReferringDirEntryIdx;  //Quadlet offset from 0xFFFF:F0000400
} BlockInfoT, *PBlockInfoT;






3


