Как получить MAC адрес из EEPROM ?

Тема в разделе "WASM.ELECTRONICS", создана пользователем dai13, 27 мар 2009.

  1. dai13

    dai13 New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2009
    Сообщения:
    1
    Подскажите, как можно получить Mac адресс сетевой карты используя только средства низкоуровневого программирования. Программа выполняется на контроллере GEFanuc (процессор Pentium III), поэтому использовать более высокий уровень нет возможности.
    Сетевая карта 82551IT Fast Ethernet PCI Controller
    (ее описание http://download.intel.com/design/network/datashts/82551it.pdf)

    Конфигурационное пространство сетевой карты прочитать получается
    Код (Text):
    1.     movl BAR0, %eax
    2.     movl (%eax), %edx
    3.     movl %edx, retl1
    но при обращении к BAR0 программа "вешается"

    Возможно, я не совсем правильно понимаю механизм обращения к PCI устройствам посредством базового адреса.
    Поскажите, как правильно использовать BAR
    Если возможно, приведите код получения MAC адреса из EEPROM


    Код (Text):
    1. unsigned long ret, BAR0, BAR1, BAR2;
    2. int bus, device, function;
    3. unsigned int VendorID, DeviceID;
    4. unsigned long retl1, retl2, retl3, retl4;
    5.  
    6. int GefMain( )
    7. {
    8.     asm("
    9.     movl $0x0CF8, %edx
    10.     xorl %eax, %eax
    11.  
    12.     mov $0, %bl
    13.     mov $11, %bh
    14.     mov $0, %cl
    15.     mov $0, %ch
    16.  
    17.     find:
    18.     mov $0x0CF8, %dx
    19.     xorl %eax, %eax
    20.     mov %bl, %al
    21.     or $0x80, %ah
    22.     shll $16, %eax
    23.     mov %bh, %ah
    24.     shl $3, %ah
    25.     or %cl, %ah
    26.     mov %ch, %al
    27.     and $0x0FC, %al
    28.     outl %eax, %dx
    29.     mov $0x0CFC, %dx
    30.     inl %dx, %eax
    31.  
    32.     cmpl $0x12098086, %eax
    33.     jz found
    34.    
    35.     inc %cl
    36.     cmp $8, %cl
    37.     jnz find
    38.     mov $0, %cl
    39.  
    40.     inc %bh
    41.     cmp $32, %bh
    42.     jnz find
    43.     mov $0, %bh
    44.  
    45.     inc %bl
    46.     cmp $255, %bl
    47.     jz exit
    48.     jmp find
    49.  
    50.     found:
    51.     movl %eax, ret
    52.     mov %bl, bus
    53.     mov %bh, device
    54.     mov %cl, function
    55.  
    56.     exit:
    57.     mov bus, %bl
    58.     mov device, %bh
    59.     mov function, %cl
    60.     mov $0x10, %ch
    61.     mov $0x0CF8, %dx
    62.     xorl %eax, %eax
    63.     mov %bl, %al
    64.     or $0x80, %ah
    65.     shll $16, %eax
    66.     mov %bh, %ah
    67.     shl $3, %ah
    68.     or %cl, %ah
    69.     mov %ch, %al
    70.     and $0x0FC, %al
    71.     outl %eax, %dx
    72.     mov $0x0CFC, %dx
    73.     inl %dx, %eax
    74.     movl %eax, BAR0
    75.  
    76.     mov bus, %bl
    77.     mov device, %bh
    78.     mov function, %cl
    79.     mov $0x14, %ch
    80.     mov $0x0CF8, %dx
    81.     xorl %eax, %eax
    82.     mov %bl, %al
    83.     or $0x80, %ah
    84.     shll $16, %eax
    85.     mov %bh, %ah
    86.     shl $3, %ah
    87.     or %cl, %ah
    88.     mov %ch, %al
    89.     and $0x0FC, %al
    90.     outl %eax, %dx
    91.     mov $0x0CFC, %dx
    92.     inl %dx, %eax
    93.     movl %eax, BAR1
    94.     decl BAR1
    95.  
    96.     mov bus, %bl
    97.     mov device, %bh
    98.     mov function, %cl
    99.     mov $0x18, %ch
    100.     mov $0x0CF8, %dx
    101.     xorl %eax, %eax
    102.     mov %bl, %al
    103.     or $0x80, %ah
    104.     shll $16, %eax
    105.     mov %bh, %ah
    106.     shl $3, %ah
    107.     or %cl, %ah
    108.     mov %ch, %al
    109.     and $0x0FC, %al
    110.     outl %eax, %dx
    111.     mov $0x0CFC, %dx
    112.     inl %dx, %eax
    113.     movl %eax, BAR2
    114.  
    115.     movl BAR0, %eax
    116.     movl (%eax), %edx
    117.     movl %edx, retl1
    118.     ");