⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i8255x.inc

📁 MenuetOS是一个用汇编开发的32/64位PC操作系统
💻 INC
📖 第 1 页 / 共 2 页
字号:

   mov      edx, ecx
   shl      edx, 2
   mov      esi, eeprom_data
   add      esi, edx
   mov      [esi], eax

   inc      ecx
   cmp      ecx, 16
   jne      drlp

   ; OK, we have the MAC address.
   ; Now reset the card
   
   mov      edx, [io_addr]
   add      dx, 8         ; SCBPort
   xor      eax, eax      ; The reset cmd == 0
   out      dx, eax

   mov      esi, 10
   call     delay_ms      ; Give the card time to warm up.
   
   mov      eax, lstats
   mov      edx, [io_addr]
   add      edx, 4            ; SCBPointer
   out      dx, eax
   
   mov      eax, 0x0140         ; INT_MASK | CU_STATSADDR
   mov      edx, [io_addr]
   add      edx, 2            ; SCBCmd
   out      dx, ax
   
   call     wait_for_cmd_done

   mov      eax, 0
   mov      edx, [io_addr]
   add      edx, 4            ; SCBPointer
   out      dx, eax

   mov      eax, 0x0106         ; INT_MASK | RX_ADDR_LOAD
   mov      edx, [io_addr]
   add      edx, 2            ; SCBCmd
   out      dx, ax
   
   call     wait_for_cmd_done

   ; build rxrd structure
   mov      ax, 0x0001
   mov      [rxfd_status], ax
   mov      ax, 0x0000
   mov      [rxfd_command], ax

   mov      eax, rxfd_status
   mov      [rxfd_link], eax

   mov      eax, Ether_buffer
   mov      [rxfd_rx_buf_addr], eax
   
   mov      ax, 0
   mov      [rxfd_count], ax
   
   mov      ax, 1528
   mov      [rxfd_size], ax
   
   mov      edx, [io_addr]
   add      edx, 4           ; SCBPointer
   
   mov      eax, rxfd_status
   out      dx, eax
   
   mov      edx, [io_addr]
   add      edx, 2           ; SCBCmd
   
   mov      ax, 0x0101         ; INT_MASK | RX_START
   out      dx, ax
   
   call     wait_for_cmd_done
   
   ; start the reciver
   
   mov      ax, 0
   mov      [rxfd_status], ax
   
   mov      ax, 0xc000
   mov      [rxfd_command], ax
   
   mov      edx, [io_addr]
   add      edx, 4           ; SCBPointer
   
   mov      eax, rxfd_status
   out      dx, eax
   
   mov      edx, [io_addr]
   add      edx, 2           ; SCBCmd
   
   mov      ax, 0x0101         ; INT_MASK | RX_START
   out      dx, ax

   ; Init TX Stuff

   mov      edx, [io_addr]
   add      edx, 4           ; SCBPointer
   
   mov      eax, 0
   out      dx, eax
   
   mov      edx, [io_addr]
   add      edx, 2           ; SCBCmd
   
   mov      ax, 0x0160         ; INT_MASK | CU_CMD_BASE
   out      dx, ax
   
   call     wait_for_cmd_done

   ; Set TX Base address
   
   ; First, set up confcmd values
   
   mov      ax, 2
   mov      [confcmd_command], ax
   mov      eax, txfd
   mov      [confcmd_link], eax
   
   mov      ax, 1
   mov      [txfd_command], ax         ; CmdIASetup
   
   mov      ax, 0
   mov      [txfd_status], ax
   
   mov      eax, confcmd
   mov      [txfd_link], eax
   
   ; ETH_ALEN is 6 bytes

   mov      esi, eeprom_data
   mov      edi, node_addr
   mov      ecx, 3
drp000:
   mov      eax, [esi]
   mov      [edi], al
   shr      eax, 8
   inc      edi
   mov      [edi], al
   inc      edi
   add      esi, 4
   loop     drp000

   ; Hard code your MAC address into node_addr at this point,
   ; If you cannot read the MAC address from the eeprom in the previous step.
   ; You also have to write the mac address into txfd_tx_desc_addr, rather 
   ; than taking data from eeprom_data

   mov      esi, eeprom_data
   mov      edi, txfd_tx_desc_addr
   mov      ecx, 3
drp001:
   mov      eax, [esi]
   mov      [edi], al
   shr      eax, 8
   inc      edi
   mov      [edi], al
   inc      edi
   add      esi, 4
   loop     drp001

   mov      esi, eeprom_data + (6 * 4)
   mov      eax, [esi]
   shr      eax, 8
   and      eax, 0x3f
   cmp      eax, 4            ; DP83840
   je       drp002
   cmp      eax, 10            ; DP83840A
   je       drp002
   jmp      drp003
   
drp002:   
   mov      ebx, [esi]
   and      ebx, 0x1f
   push     ebx
   mov      ecx, 23
   call     mdio_read
   pop      ebx
   or       eax, 0x0422
   mov      ecx, 23
   mov      edx, eax
   call     mdio_write
   
drp003:
   mov      ax, 0x4002         ; Cmdsuspend | CmdConfigure
   mov      [confcmd_command], ax
   mov      ax, 0
   mov      [confcmd_status], ax
   mov      eax, txfd
   mov      [confcmd_link], eax
   mov      ebx, confcmd_data
   mov      al, 0x88         ; fifo of 8 each
   mov      [ebx + 1], al
   mov      al, 0         
   mov      [ebx + 4], al
   mov      al, 0x80
   mov      [ebx + 5], al
   mov      al, 0x48         
   mov      [ebx + 15], al
   mov      al, 0x80         
   mov      [ebx + 19], al
   mov      al, 0x05      
   mov      [ebx + 21], al
   
   mov      eax, txfd
   mov      edx, [io_addr]
   add      edx, 4            ; SCBPointer
   out      dx, eax
   
   mov      eax, 0x0110         ; INT_MASK | CU_START
   mov      edx, [io_addr]
   add      edx, 2            ; SCBCmd
   out      dx, ax
   
   call     wait_for_cmd_done
jmp skip
      
   ; wait for thing to start
drp004:   
   mov      ax, [txfd_status]
   cmp      ax, 0
   je       drp004   

skip:  
   ; Indicate that we have successfully reset the card
   mov      eax, [pci_data]
   mov      [eth_status], eax
      
I8255x_exit:
   ret
   
   
   
;***************************************************************************
; Function
;    I8255x_poll
;
; Description
;    Polls the ethernet card for a received packet
;    Received data, if any, ends up in Ether_buffer
;
;***************************************************************************
I8255x_poll:
   mov      ax, 0      ; assume no data
   mov      [eth_rx_data_len], ax
   
   mov      ax, [rxfd_status]
   cmp      ax, 0
   je       i8p_exit
   
   mov      ax, 0
   mov      [rxfd_status], ax
   
   mov      ax, 0xc000
   mov      [rxfd_command], ax
   
   mov      edx, [io_addr]
   add      edx, 4           ; SCBPointer
   
   mov      eax, rxfd_status
   out      dx, eax
   
   mov      edx, [io_addr]
   add      edx, 2           ; SCBCmd
   
   mov      ax, 0x0101         ; INT_MASK | RX_START
   out      dx, ax
   
   call     wait_for_cmd_done
   
   mov      esi, rxfd_packet
   mov      edi, Ether_buffer
   mov      ecx, 1518
   cld      
   rep      movsb
   
   mov      ax, [rxfd_count]
   and      ax, 0x3fff
   mov      [eth_rx_data_len], ax
   
i8p_exit:
   ret
   
   
   
;***************************************************************************
;   Function
;      I8255x_transmit
;
;   Description
;       Transmits a packet of data via the ethernet card
;          Pointer to 48 bit destination address in edi
;         Type of packet in bx
;         size of packet in ecx
;         pointer to packet data in esi
;
;***************************************************************************
I8255x_transmit:

   mov      [hdr_type], bx
   
   mov      eax, [edi]
   mov      [hdr_dst_addr], eax
   mov      ax, [edi+4]
   mov      [hdr_dst_addr+4], ax

   mov      eax, [node_addr]
   mov      [hdr_src_addr], eax
   mov      ax, [node_addr+4]
   mov      [hdr_src_addr+4], ax
      
   mov      edx, [io_addr]
   in       ax, dx
   and      ax, 0xfc00
   out      dx, ax
   
   xor      ax, ax
   mov      [txfd_status], ax
   mov      ax, 0x400C            ; Cmdsuspend | CmdTx | CmdTxFlex
   mov      [txfd_command], ax
   mov      eax, txfd
   mov      [txfd_link], eax
   mov      eax, 0x02208000
   mov      [txfd_count], eax
   mov      eax, txfd_tx_buf_addr0
   mov      [txfd_tx_desc_addr], eax
   mov      eax, hdr
   mov      [txfd_tx_buf_addr0], eax
   mov      eax, 14   ; sizeof hdr
   mov      [txfd_tx_buf_size0], eax

   ; Copy the buffer address and size in
   mov      eax, esi
   mov      [txfd_tx_buf_addr1], eax
   mov      eax, ecx   
   mov      [txfd_tx_buf_size1], eax
   
   mov      eax, txfd
   mov      edx, [io_addr]
   add      edx, 4            ; SCBPointer
   out      dx, eax
   
   mov      ax, 0x0110         ; INT_MASK | CU_START
   mov      edx, [io_addr]
   add      edx, 2            ; SCBCmd
   out      dx, ax
   
   call     wait_for_cmd_done

   mov      edx, [io_addr]
   in       ax, dx

I8t_001:
   mov      ax, [txfd_status]
   cmp      ax, 0
   je       I8t_001
   
   mov      edx, [io_addr]
   in       ax, dx
   
   ret
   
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -