유영창님이 마소잡지에 연재하신 네트워크 구현에서 cs8900초기화를 mds의 s3c2440에 직접 디바이스 드라이버를 구현하여 올렸습니다.
그런데 첫번째 칩 ID는 630e가 제대로 나오는데 두번째 칩id도 630e가 나오고 다른 Mac주소와 Rx, Tx등을 초기화하려 하는데 초기화한 값을 확인하면 전부 0x300이란 값만 나옵니다.그리고 PPPTR은 3000에서 3101이란 값으로 바뀌어 있습니다.
아무리 인터넷을 보구 DATASHEET를 보아도 머가 잘못된지를 잘 모르겠습니다.
혹시 밑에 있는 코드를 보시구 왜 안되는지 아시면 이유를 가르쳐 주셨으면 합니다.
지금 이 디바이스 드라이버 때매 프로젝트가 2주째 멈춰있습니다.
그리고 CS8900_ENABLE_WORD;는 S3C2440보드에선 해도 그만 안해도 그만 인듯합니다..
SHBE라고 마소에선 설명하셨는데 MDS보드에선 SBHE로 되어있던데 이게 맞는지 모르겠습니다.
그리고 왜 CS8900_BASE + 0x00000001인지 이유를 모르겠더군요. 제가 datasheet를 잘 볼줄 몰라서..ㅡㅡ;


int cs8900_init()
{
        int lp;

        unsigned int DectectID;
        unsigned short ChipIDLow;
        unsigned short ChipIDHigh;

        unsigned short MacData;

        uart_puts("cs8900 init................n");

        Local_MacAddress[0] = 0x00;
        Local_MacAddress[1] = 0x11;
        Local_MacAddress[2] = 0x22;
        Local_MacAddress[3] = 0x33;
        Local_MacAddress[4] = 0x44;
        Local_MacAddress[5] = 0xdd;

        uart_puts("Mac Address : n");

        CS8900_ENABLE_WORD;

        DectectID = CS8900_PPPTR;

        uart_puts("Dectect value MASK : ");
        uart_puthexnl(CS8900_DECTECT_MASK);
        uart_puthexnl(DectectID & CS8900_DECTECT_MASK);
        uart_puts("Dectect value : ");
        uart_puthexnl(DectectID);

        if((DectectID & CS8900_DECTECT_MASK) != CS8900_DECTECT_MASK)
        {
                uart_puts("Can't access to Memory of CS8900A.n");
                return 0;
        }

        ChipIDLow = CS8900_ReadFromPPR(PP_ChipID_LOW);
        ChipIDHigh = CS8900_ReadFromPPR(PP_ChipID_HIGH);

        ChipIDHigh = SWAP16(ChipIDHigh);
        ChipIDLow = SWAP16(ChipIDLow);

        uart_puts("HIGH Chip ID : ");
        uart_puthexnl(ChipIDHigh);
        uart_puts("LOW Chip ID : ");
        uart_puthexnl(ChipIDLow);

        if(ChipIDHigh != CHECK_CHIP_ID_HIGH)
        {
                uart_puts("Ethernet Chip is not CS8900A. Are you use CS8900A.n");
                return 0;
        }

        CS8900_WriteToPPR(PP_LineCTL, 0x0000);

        CS8900_WriteToPPR(PP_CS8900_ISAINT, INTRQ_HIGH_IMPEDENCE);
        CS8900_WriteToPPR(PP_CS8900_ISADMA, DMRQ_HIGH_IMPEDENCE);

        CS8900_WriteToPPR(PP_RxCFG, RX_OK_ENBL | RX_CRC_ERROR_ENBL);
        CS8900_WriteToPPR(PP_RxCTL, RX_OK_ACCEPT | RX_MULTICAST_ACCEPT | RX_IA_ACCEPT | RX_BROADCAST_ACCEPT);
        CS8900_WriteToPPR(PP_TxCFG, TX_LOST_CRS_ENBL | TX_SQE_ERROR_ENBL | TX_OK_ENBL | TX_LATE_COL_ENBL | TX_JBR_ENBL | TX_ANY_COL_ENBL);
        CS8900_WriteToPPR(PP_TxCMD, TX_START_ALL_BYTES);
        CS8900_WriteToPPR(PP_BufCFG, 0x0000);
        CS8900_WriteToPPR(PP_BusCTL, ENABLE_IRQ | IO_CHANNEL_READY_ON);
        CS8900_WriteToPPR(PP_TestCTL, 0x0000);

        CS8900_WriteToPPR(PP_TxCommand, 0x00c0);

        for(lp=0; lp<4; lp++) CS8900_WriteToPPR(PP_LAF+lp*2, 0xffff);
        for(lp=0; lp<3; lp++) CS8900_WriteToPPR(PP_IA+lp*2, *((unsigned short*)&(Local_MacAddress[lp*2])));

        uart_puts("Mac Address [][][][][][][][][][][][][][][][][][][][][][]n");
        for(lp=0; lp<3; lp++){
                CS8900_PPPTR=PP_IA+lp*2;
                uart_puthexnl(CS8900_PPDATA);
        }
        uart_puts("Mac Address [][][][][][][][][][][][][][][][][][][][][][]n");

        CS8900_WriteToPPR(PP_LineCTL, SERIAL_RX_ON | SERIAL_TX_ON);

        uart_puts("cs8900_init end...................n");

        return 1;
}