$(OBJS_DIR)/lan9118drv_write.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_write.c $(COMMON_HEADERS)
$(OBJS_DIR)/lan9118drv_flush.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_flush.c $(COMMON_HEADERS)
$(OBJS_DIR)/lan9118drv_isr.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_isr.c $(COMMON_HEADERS)
+$(OBJS_DIR)/lan9118drv_getmacaddress.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_getmacaddress.c $(COMMON_HEADERS)
+$(OBJS_DIR)/lan9118drv_csrregread.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_csrregread.c $(COMMON_HEADERS)
+$(OBJS_DIR)/lan9118drv_csrregwrite.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_csrregwrite.c $(COMMON_HEADERS)
+$(OBJS_DIR)/lan9118drv_phyregread.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_phyregread.c $(COMMON_HEADERS)
+$(OBJS_DIR)/lan9118drv_phyregwrite.$(EXT_OBJ): $(LAN9118_DIR)/lan9118drv_phyregwrite.c $(COMMON_HEADERS)
$(OBJS_DIR)/pc16550drv_create.$(EXT_OBJ): $(PC16550_DIR)/pc16550drv_create.c $(COMMON_HEADERS)
$(OBJS_DIR)/pc16550drv_delete.$(EXT_OBJ): $(PC16550_DIR)/pc16550drv_delete.c $(COMMON_HEADERS)
$(OBJS_DIR)/pc16550drv_open.$(EXT_OBJ): $(PC16550_DIR)/pc16550drv_open.c $(COMMON_HEADERS)
CSRCS += $(LAN9118_DIR)/lan9118drv_write.c
CSRCS += $(LAN9118_DIR)/lan9118drv_flush.c
CSRCS += $(LAN9118_DIR)/lan9118drv_isr.c
+CSRCS += $(LAN9118_DIR)/lan9118drv_getmacaddress.c
+CSRCS += $(LAN9118_DIR)/lan9118drv_csrregread.c
+CSRCS += $(LAN9118_DIR)/lan9118drv_csrregwrite.c
+CSRCS += $(LAN9118_DIR)/lan9118drv_phyregread.c
+CSRCS += $(LAN9118_DIR)/lan9118drv_phyregwrite.c
endif
$(OBJS_DIR)\lan9118drv_write.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_write.c $(COMMON_HEADERS)
$(OBJS_DIR)\lan9118drv_flush.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_flush.c $(COMMON_HEADERS)
$(OBJS_DIR)\lan9118drv_isr.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_isr.c $(COMMON_HEADERS)
+$(OBJS_DIR)\lan9118drv_getmacaddress.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_getmacaddress.c $(COMMON_HEADERS)
+$(OBJS_DIR)\lan9118drv_csrregread.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_csrregread.c $(COMMON_HEADERS)
+$(OBJS_DIR)\lan9118drv_csrregwrite.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_csrregwrite.c $(COMMON_HEADERS)
+$(OBJS_DIR)\lan9118drv_phyregread.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_phyregread.c $(COMMON_HEADERS)
+$(OBJS_DIR)\lan9118drv_phyregwrite.$(EXT_OBJ): $(OBJS_DIR)\lan9118drv_phyregwrite.c $(COMMON_HEADERS)
$(OBJS_DIR)\pc16550drv_create.$(EXT_OBJ): $(OBJS_DIR)\pc16550drv_create.c $(COMMON_HEADERS)
$(OBJS_DIR)\pc16550drv_delete.$(EXT_OBJ): $(OBJS_DIR)\pc16550drv_delete.c $(COMMON_HEADERS)
OBJS = $(OBJS) $(OBJS_DIR)\lan9118drv_flush.$(EXT_OBJ)
CSRCS = $(CSRCS) $(LAN9118_DIR)\lan9118drv_isr.c
OBJS = $(OBJS) $(OBJS_DIR)\lan9118drv_isr.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(LAN9118_DIR)\lan9118drv_getmacaddress.c
+OBJS = $(OBJS) $(OBJS_DIR)\lan9118drv_getmacaddress.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(LAN9118_DIR)\lan9118drv_csrregread.c
+OBJS = $(OBJS) $(OBJS_DIR)\lan9118drv_csrregread.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(LAN9118_DIR)\lan9118drv_csrregwrite.c
+OBJS = $(OBJS) $(OBJS_DIR)\lan9118drv_csrregwrite.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(LAN9118_DIR)\lan9118drv_phyregread.c
+OBJS = $(OBJS) $(OBJS_DIR)\lan9118drv_phyregread.$(EXT_OBJ)
+CSRCS = $(CSRCS) $(LAN9118_DIR)\lan9118drv_phyregwrite.c
+OBJS = $(OBJS) $(OBJS_DIR)\lan9118drv_phyregwrite.$(EXT_OBJ)
# 16550A
"lan9118drv_write.c",
"lan9118drv_flush.c",
"lan9118drv_isr.c",
+ "lan9118drv_getmacaddress.c",
+ "lan9118drv_csrregread.c",
+ "lan9118drv_csrregwrite.c",
+ "lan9118drv_phyregread.c",
+ "lan9118drv_phyregwrite.c",
],
[
"16550A",
ulLow = Lan9118Drv_CsrRegRead(self, 3);
/* 格納 */
- ubAddr[0] = ((ulHi >> 8) & 0xff);
- ubAddr[1] = ((ulHi >> 0) & 0xff);
- ubAddr[2] = ((ulLow >> 24) & 0xff);
- ubAddr[3] = ((ulLow >> 16) & 0xff);
- ubAddr[4] = ((ulLow >> 8) & 0xff);
- ubAddr[5] = ((ulLow >> 0) & 0xff);
+ ubAddr[0] = ((ulLow >> 0) & 0xff);
+ ubAddr[1] = ((ulLow >> 8) & 0xff);
+ ubAddr[2] = ((ulLow >> 16) & 0xff);
+ ubAddr[3] = ((ulLow >> 24) & 0xff);
+ ubAddr[4] = ((ulHi >> 0) & 0xff);
+ ubAddr[5] = ((ulHi >> 8) & 0xff);
}
#include "lan9118drv.h"
+#define LAN9118_RX_DATA_FIFO 0x00
+#define LAN9118_TX_DATA_FIFO 0x20
+#define LAN9118_RX_STATUS_FIFO 0x40
+#define LAN9118_TX_STATUS_FIFO 0x48
#define LAN9118_ID_REV 0x50
#define LAN9118_IRQ_CFG 0x54
+
#ifdef __cplusplus
extern "C" {
#endif
{
C_LAN9118DRV *self;
C_CHRFILE *pFile;
+ unsigned short uhStatus;
int i;
/* upper cast */
Lan9118Drv_PhyRegWrite(self, 0, 0x1200); /* ネゴシエーション開始 */
SysTim_Wait(3000);
- /* Lan9118Drv_PhyRegRead(); */
+ /* ゴシエーション完了チェック */
+ if ( !(Lan9118Drv_PhyRegRead(self, 1) & 0x0020) )
+ {
+ return HANDLE_NULL;
+ }
+ uhStatus = Lan9118Drv_PhyRegRead(self, 31) & 0x00ff;
+
+ if ( ((uhStatus & 0x0058) == 0x0058) || ((uhStatus & 0x0048) == 0x0048))
+ {
+ /* Full Duplex */
+ Lan9118Drv_CsrRegWrite(self, 1, Lan9118Drv_CsrRegRead(self, 1) | 0x00900000 );
+ }
+ else
+ {
+ /* Half Duplex */
+ Lan9118Drv_CsrRegWrite(self, 1, Lan9118Drv_CsrRegRead(self, 1) & ~0x00100000 );
+ }
SysInt_Enable(self->iIntNum);
}
}
+
/* end of file */
C_LAN9118DRV *self;
C_CHRFILE *pFile;
unsigned char *pubBuf;
+ unsigned long uwData;
+ int iSize;
FILE_SIZE i;
- int c;
+
/* upper cast */
self = (C_LAN9118DRV *)pDrvObj;
/* クリティカルセクションに入る */
SysMtx_Lock(self->hMtxRecv);
+ /* 受信チェック */
+ if ( !(Lan9118Drv_RegRead(self, LAN9118_INT_STS) & 0x00000008) )
+ {
+ /* ブロッキングなら受信イベントを待つ */
+ SysMtx_Unlock(self->hMtxRecv);
+ if ( ChrDrv_WaitReadSignal(&self->ChrDrv, pFile) != FILE_ERR_OK )
+ {
+ return 0;
+ }
+ SysMtx_Lock(self->hMtxRecv);
+ }
+
+ /* 受信サイズ取得 */
+ uwData = Lan9118Drv_RegRead(self, LAN9118_RX_STATUS_FIFO);
+ iSize = (uwData >> 16);
+
+ /* 受信エラーチェック */
+ if ( uwData & 0x00008000 )
+ {
+ Lan9118Drv_RegWrite(self, LAN9118_RX_DP_CTL, 0x80000000);
+ while ( (Lan9118Drv_RegRead(self, LAN9118_RX_DP_CTL) & 0x80000000) != 0 )
+ ;
+
+ SysMtx_Unlock(self->hMtxRecv); /* クリティカルセクションを出る */
+ return 0;
+ }
+
+ /* データ受信 */
+ for( i = 0; i < (iSize + 5) / 4; i++ )
+ {
+ uwData = Lan9118Drv_RegRead(self, LAN9118_RX_DATA_FIFO);
+
+ *pubBuf++ = ((uwData >> 0) & 0xff);
+ *pubBuf++ = ((uwData >> 8) & 0xff);
+ *pubBuf++ = ((uwData >> 16) & 0xff);
+ *pubBuf++ = ((uwData >> 24) & 0xff);
+ }
+
+ /* 受信ステータス割込み要因をクリア */
+ Lan9118Drv_RegWrite(self, LAN9118_INT_STS, 0x00000008);
+
/* クリティカルセクションを出る */
SysMtx_Unlock(self->hMtxRecv);
-
- return i;
+
+ return iSize;
}
/* デバイスドライバ */
/*************************/
-#if 0
+#if 1
/* LAN9118デバドラ生成 (/dev/eth0 に登録) */
Lan9118Drv_Create(&g_Lan9118Drv[0], (void *)0x40000000, 24);
File_AddDevice("eth0", (C_DRVOBJ *)&g_Lan9118Drv[0]);