помогите с AHCI командами сидирому

Тема в разделе "WASM.ELECTRONICS", создана пользователем Wawan, 30 июн 2008.

  1. Wawan

    Wawan Владимир

    Публикаций:
    0
    Регистрация:
    30 июн 2008
    Сообщения:
    1
    Адрес:
    Воронеж
    хочу сделать чтение с сидирома в AHCI режиме, программу запускаю в DOS-е. сейчас для тестов пробую послать команду выдвигания лотка сидирома, но безуспешно.

    вот часть кода
    Код (Text):
    1. typedef struct _ComandHead
    2. {
    3.     word CFL:5;
    4.     word A:1;
    5.     word W:1;
    6.     word P:1;
    7.     word R:1;
    8.     word B:1;
    9.     word C:1;
    10.     word RR:1;
    11.     word PMP:4;
    12.     word PRDT_Length:16;
    13.     dword PRD_Byte_Count;
    14.     dword CTBALo;
    15.     dword CTBAHi;
    16.     dword dw4;
    17.     dword dw5;
    18.     dword dw6;
    19.     dword dw7;
    20. }   ComandHead;
    21.  
    22.  
    23. typedef struct _PRDT
    24. {
    25.     dword Base_addressLo;
    26.     dword Base_addressHi;
    27.     dword r;       
    28.     word Byte_CountLo;
    29.     word Byte_CountHi:6;
    30.     word r1:9;     
    31.     word Interrupt:1;  
    32. } PRDT;
    33.  
    34.  
    35. typedef struct _Command_Table
    36. {
    37.     byte CFIS[64];     
    38.     byte ACMD[16];     
    39.     byte Reserv[0x30];
    40.     PRDT prdt[1];  
    41. } Command_Table;
    42.  
    43.  
    44. int cdrom( void )
    45. {
    46.     void *          CommandTableOrig;
    47.     Command_Table *     CommandTable;
    48.     void *          ComandListOrig;
    49.     ComandHead *        ComandList;
    50.     void *          FISOrig;
    51.     void *          FIS;
    52.     dword           t;
    53.  
    54.     GetPciList();
    55.     DiskInfo();
    56.     ToUnrealMode();
    57.     FindCDroms();
    58.  
    59.     ComandListOrig      =   malloc( sizeof( ComandHead ) * 32 + 1023 );
    60.     ComandList      =   (void*)( ( (dword)ComandListOrig + 1023 ) & ( ~(dword)1023 ) );
    61.  
    62.     CommandTableOrig    =   malloc( sizeof( Command_Table ) + 127 );
    63.     CommandTable        =   (void*)( ( (dword)CommandTableOrig + 127 ) & ( ~(dword)127 ) );
    64.  
    65.     FISOrig         =   malloc( 256 + 4095 );
    66.     FIS         =   (void*)( ( (dword)FISOrig + 4095 ) & ( ~(dword)4095 ) );
    67.  
    68.     memset( ComandList, 0, sizeof( ComandHead ) * 32 );
    69.     memset( CommandTable, 0, sizeof( Command_Table ) );
    70.     memset( FIS, 0, 256 );
    71.  
    72.     ComandList[ 0 ].PRDT_Length =   1;
    73.     ComandList[ 0 ].CTBALo      =   (dword)CommandTable;
    74.  
    75.     CommandTable->ACMD[ 0 ]     =   0x1B;
    76.     CommandTable->ACMD[ 4 ]     =   0x02; // 2 - open, 3 - close
    77.  
    78.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x18, 0x0104000D );
    79.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x2C, 1 );
    80.  
    81.     sleep( 1 );
    82.  
    83.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x18, 0x0104000E );
    84.  
    85.     sleep( 1 );
    86.  
    87.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x00, (dword)ComandList );
    88.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x04, 0 );
    89.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x08, (dword)FIS );
    90.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x0C, 0 );
    91.  
    92.     sleep( 1 );
    93.  
    94.     memWrite4( g_ABAR[ 0 ] + 0x100 + 0 * 0x80 + 0x38, 0x00000001 );
    95.  
    96.     sleep( 1 );
    97.  
    98.     return  g_CDCount;
    99. }
    помогите плз разобраться что я тут делаю не так, спецификации у меня есть, курю я их уже пару недель, но пока безуспешно, нехватает небольшого примера работы в этом режиме, сорцы линуха, опенсоляриса и бсд я смотрел, но там много написано, сложно понять где что происходит, а я хочу начать с малого чтобы разобраться.