您的位置:首页 > 其它

S5PC100中DM9000AEP网卡芯片驱动移植

2010-02-08 10:58 274 查看
平台:三星C100,DM9000AEP,中断信号接EINT0引脚。

1. Config.bib中,添加如下配置信息:

ETHNET 98000000 00100000 RESERVED ; 1MB used for DM9000

2. Platform.bib中,添加如下信息:

dm9isa.dll $(_FLATRELEASEDIR)/dm9isa.dll NK SHMK

3. Platform.reg中,添加如下内容:

;--------------DM9000A driver-------------------------------------------------
[HKEY_LOCAL_MACHINE/Comm/DM9CE]
"DisplayName"="DM9000A ISA Fast Ethernet Adapter"
"Group"="NDIS"
"ImagePath"="dm9isa.dll"

[HKEY_LOCAL_MACHINE/Comm/DM9CE/Linkage]
"Route"=multi_sz:"DM9CE1"

[HKEY_LOCAL_MACHINE/Comm/DM9CE1]
"DisplayName"="DM9000A ISA Fast Ethernet Adapter"
"Group"="NDIS"
"ImagePath"="dm9isa.dll"

[HKEY_LOCAL_MACHINE/Comm/Tcpip/Linkage]
"Bind"="DM9CE1"

[HKEY_LOCAL_MACHINE/Comm/DM9CE1/Parms]
"BusNumber"=dword:0
"BusType"=dword:1
"XmitBuffer"=dword:20
"RecvBuffer"=dword:20
"IrqNumber"=dword:0
"SysIntr"=dword:12 ; 0x12, SYSINT_FIRMWARE+2=18
"IoAddress"=dword:88000000
"NetworkAddress"="e0aac8de6352"

[HKEY_LOCAL_MACHINE/Comm/DM9CE1/Parms/TcpIp]
"EnableDHCP"=dword:1
"UseZeroBroadcast"=dword:0
; "IpAddress"="159.99.249.238"
; "Subnetmask"="255.255.255.0"
; "DefaultGateway"="159.99.249.1"
; "DNS"="10.192.2.45"
; "WINS"="0.0.0.0"
;------------------------------------------------------------------------------

4. dm9isa.cpp中,更改CONFIG_PARAMETER:

C/C++ code
CONFIG_PARAMETER    g_szDm9ConfigParams[] =
{
    { CID_CONNECTION_TYPE, -1, NDIS_STRING_CONST("ConnectionType") },
    { CID_SLOT_NUMBER, -1, NDIS_STRING_CONST("SlotNumber")},
    { CID_BUFFER_PHYSICAL_ADDRESS, 0, NDIS_STRING_CONST("BufferPhysicalAddress")},
    { CID_TXBUFFER_NUMBER, 0x20, NDIS_STRING_CONST("XmitBuffer")},
    { CID_RXBUFFER_NUMBER, 0x10, NDIS_STRING_CONST("RecvBuffer")},
    { CID_ADAPTER_NUMBER, 0, NDIS_STRING_CONST("AdapterNumber")},
    { CID_IO_BASE_ADDRESS, 0x88000000, NDIS_STRING_CONST("IoAddress")},
    { CID_IO_RANGE, 0x10, NDIS_STRING_CONST("IoRange")},
    { CID_IRQ_NUMBER, 0, NDIS_STRING_CONST("IrqNumber")},
    { -1,-1,NULL}
};


5. bsp_config.h中,添加系统中断号:

C/C++ code
#define SYSINTR_ETH            (SYSINTR_FIRMWARE+2)    // for DM9000, value is 16+2=18, 0x12


6. oemaddrtap_cfg.inc中,添加如下内容:

DCD 0x98000000, 0x88000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1

7. 在init.c中,添加如下内容:

C/C++ code
#define DM9000A_Tacs    (0x0)    // 0clk
#define DM9000A_Tcos    (0x0)    // 0clk
#define DM9000A_Tacc    (0x7)    // 14clk
#define DM9000A_Tcoh    (0x0)    // 0clk
#define DM9000A_Tah     (0x0)    // 0clk
#define DM9000A_Tacp    (0x0)    // 0clk
#define DM9000A_PMC     (0x0)    // normal(1data)

static void InitializeGPIO(void)
{
    volatile S5PC100_SROMCON_REG *pSROMREG = (S5PC100_SROMCON_REG *)OALPAtoVA(S5PC100_BASE_REG_PA_SMC, FALSE);

    pSROMREG->SROM_BW = (pSROMREG->SROM_BW & ~(0xF<<4)) |
        (1<<7)| // nWBE/nBE(for UB/LB) control for Memory Bank1(0=Not using UB/LB, 1=Using UB/LB)
        (1<<6)| // Wait enable control for Memory Bank1 (0=WAIT disable, 1=WAIT enable)
        (1<<5)| // Select SMC Address base(0=half word(16bits), 1=byte(8bits))
        (1<<4); // Data bus width control for Memory Bank1 (0=8-bit, 1=16-bit)

    pSROMREG->SROM_BC1 = ((DM9000A_Tacs<<28)+(DM9000A_Tcos<<24)+(DM9000A_Tacc<<16)+(DM9000A_Tcoh<<12)+(DM9000A_Tah<<8)+(DM9000A_Tacp<<4)+(DM9000A_PMC));

}


8. 在intr.c中,添加如下内容:

C/C++ code
extern BOOL OALIntrEnableIrqs(UINT32 count, const UINT32 *pIrqs);

volatile static S5PC100_GPIO_REG * pGPIOReg = NULL;

//------------------------------------------------------------------------------
//
//  Function:  BSPIntrInit
//
BOOL BSPIntrInit()
{
    UINT32 value = 0;
    pGPIOReg = (S5PC100_GPIO_REG *)OALPAtoVA(S5PC100_BASE_REG_PA_GPIO, FALSE);

    // EINT0(GPH0:0)->IRQ_LAN
    pGPIOReg->GPH0CON = (pGPIOReg->GPH0CON & ~(0x3<<0)) | (0x2<<0);    // IRQ_LAN by EINT0 (GPH0:0)
    pGPIOReg->GPH0PUD = (pGPIOReg->GPH0PUD & ~(0x3<<0)) | (0x0<<0);    // pull-up/down disabled
    pGPIOReg->GPIO_INT_CON.GPIO_INT0_CON = (pGPIOReg->GPIO_INT_CON.GPIO_INT0_CON & ~(0x7<<0)) | (0x0<<0); // Low level triggered

    OALIntrStaticTranslate(SYSINTR_OHCI, IRQ_UHOST);        // for USB Host 1.1

    OALIntrStaticTranslate(SYSINTR_ETH, IRQ_EINT0);
    value = IRQ_EINT0;
    OALIntrEnableIrqs(1, &value);

    return TRUE;
}


9. 在intr.c中,OALIntrEnableIrqs函数中添加如下内容:

C/C++ code
//------------------------------------------------------------------------------
//
//  Function:  OALIntrEnableIrqs
//
BOOL OALIntrEnableIrqs(UINT32 count, const UINT32 *pIrqs)
{
    BOOL bRet = TRUE;
    UINT32 VirtualIRQ;
    UINT32 PhysicalIRQ;
    UINT32 i;

    OALMSG(OAL_INTR&&OAL_FUNC, (L"+OALIntrEnableIrqs(%d, 0x%08x)/r/n", count, pIrqs));

    for (i = 0; i < count; i++)
    {
#ifndef OAL_BSP_CALLBACKS
        VirtualIRQ = pIrqs[i];
#else
        // Give BSP chance to enable irq on subordinate interrupt controller
        VirtualIRQ = BSPIntrEnableIrq(pIrqs[i]);
#endif

        if (VirtualIRQ == OAL_INTR_IRQ_UNDEFINED) continue;

        // Translate to Physical IRQ
        PhysicalIRQ = g_VirIrq2PhyIrq[VirtualIRQ];

/////////////////// Added by Brian Liu ////////////////////////////////////
        if(PhysicalIRQ == PHYIRQ_EINT0)
        {
            g_pGPIOReg->GPIO_INT_MASK.GPIO_INT0_MASK &= ~(1<<VirtualIRQ);
        }
//////////////////////////////////////////////////////////////////////////

        if (PhysicalIRQ < VIC1_BIT_OFFSET)
        {
            g_pVIC0Reg->VICINTENABLE = (0x1<<PhysicalIRQ);
        }
        // add for c100.. by shin..
        else if (PhysicalIRQ < VIC2_BIT_OFFSET)
        {
            g_pVIC1Reg->VICINTENABLE = (0x1<<(PhysicalIRQ-VIC1_BIT_OFFSET));
        }

        else if (PhysicalIRQ < PHYIRQ_MAX_S5PC100)
        {
            g_pVIC2Reg->VICINTENABLE = (0x1<<(PhysicalIRQ-VIC2_BIT_OFFSET));
        }
        else
        {
            bRet = FALSE;
        }
    }

    OALMSG(OAL_INTR&&OAL_FUNC, (L"-OALIntrEnableIrqs(rc = %d)/r/n", bRet));

    return bRet;
}


PS:

1. 一定要注意中断控制寄存器的配置(Wakeup Interrupt)。

2. 注意16bits还是8bits模式。地址是Half Word?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: