1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     hioeth.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 12449 $
14  *---------------------------------------------------------------------------*/
15 
16 
17 #ifndef NN_NETWORK_HIOETH_H
18 #define NN_NETWORK_HIOETH_H
19 
20 #include <nnet.h>
21 #include <nnet/nnet_ext.h>
22 
23 #ifdef  __cplusplus
24 extern "C" {
25 #endif
26 
27 /*---------------------------------------------------------------------------*
28  * Definitions
29  *---------------------------------------------------------------------------*/
30 #define HIOETH_DEVICE_1               0           /* このドライバで扱えるI/Fは1つだけ */
31 
32 #define HIOETH_VENDOR_NINTENDO        0x0000
33 #define HIOETH_COMMON_CONF_VERSION    0x1100
34 #define HIOETH_INS_CONF_VERSION       0x2100
35 
36 /**
37  * エラーコード
38  */
39 #define HIOETH_ERROR_BASE                          0xffff9000
40 #define HIOETH_ERROR_CODE(code)                    ((s32)(HIOETH_ERROR_BASE | (code)))
41 enum
42 {
43     HIOETH_ERR_PARAM = HIOETH_ERROR_CODE(1),            /* パラメータエラー */
44     HIOETH_ERR_INIT = HIOETH_ERROR_CODE(2),             /* 初期状態のため実行不可 */
45     HIOETH_ERR_FINISH = HIOETH_ERROR_CODE(3),           /* 終了状態のため実行不可 */
46     HIOETH_ERR_CONFVER = HIOETH_ERROR_CODE(4),          /* 設定のバージョンエラー */
47     HIOETH_ERR_STATE = HIOETH_ERROR_CODE(5),            /* ステートエラー */
48     HIOETH_ERR_EXIST = HIOETH_ERROR_CODE(6),            /* 既に作成済み */
49     HIOETH_ERR_NOMEM = HIOETH_ERROR_CODE(7),            /* メモリ不足 */
50     HIOETH_ERR_TIMEOUT = HIOETH_ERROR_CODE(8),          /* タイムアウト */
51     HIOETH_ERR_IO = HIOETH_ERROR_CODE(8),
52     HIOETH_ERR_NONE = 0                                 /* 正常終了 */
53 };
54 
55 /**
56  * メモリ
57  */
58 #define HIOETH_MEM_BASE                            0x00050000
59 #define HIOETH_MEM_NAME(name)                    ((s32)(HIOETH_MEM_BASE | (name)))
60 enum
61 {
62     HIOETH_MEM_INSTANCE = HIOETH_MEM_NAME(1)
63 };
64 
65 /**
66  * ステート
67  */
68 enum
69 {
70     HIOETH_STATE_INIT = 0,        /* 初期状態 */
71     HIOETH_STATE_ACTIVE,          /* 接続完了状態 */
72     HIOETH_STATE_DESTROY,
73     HIOETH_STATE_ABORT            /* 接続完了状態 */
74 };
75 
76 /*---------------------------------------------------------------------------*
77  * Types/Declarations
78  *---------------------------------------------------------------------------*/
79 
80 /**
81  * インスタンス
82  */
83 #define HIOETH_UPPER_NUM      2                             /* 上位のレイヤ数   */
84 #define HIOETH_MQ_NUM         16                            /* 上位へ渡すキューのサイズ */
85 #define HIOETH_MAX_SEND_LEN   1600
86 #define HIOETH_MAX_RECV_LEN   1600
87 #define HIOETH_STACK_SIZE     4096
88 
89 typedef struct HIOETHQueuePair
90 {
91     NOSMessageQueue mq;                                     /* 上位用の受信キュー */
92     NOSMessage      msg[HIOETH_MQ_NUM];                     /* 上位用の受信キュー実体 */
93 } HIOETHQueuePair;
94 
95 typedef struct HIOETHInstance
96 {
97     NNETInstance        netIns;                             /* 全レイヤ共通に持っているインスタンス情報 */
98     NNETProtocolList    protocolList;
99 
100     HIOETHQueuePair     upper_mq[HIOETH_UPPER_NUM];          /* 上位用の受信キュー */
101     s32 upper_ins_count;
102 
103     s32 state;
104     s32 handleHostToTarget;
105     s32 handleTargetToHost;
106 
107     u8  macaddr[NNET_ETH_ALEN];                             /* 自MACアドレス */
108     u16 pad;
109 
110     u8  sendBuf[HIOETH_MAX_SEND_LEN];                       /* 送信バッファ */
111     u8  recvBuf[HIOETH_MAX_RECV_LEN];
112     u32 recvBufPos;
113     NOSThread   thread;
114     NOSThreadId threadId;
115     u8 stack[HIOETH_STACK_SIZE];
116 
117 } HIOETHInstance;
118 
119 /*
120     WCMのインスタンスからNNETInstanceを取得する
121 */
HIOETH_GetNNETInstance(HIOETHInstance * pHioIns)122 static inline NNETInstance* HIOETH_GetNNETInstance(HIOETHInstance* pHioIns)
123 {
124     return &pHioIns->netIns;
125 }
126 
127 /*
128     NNETInstanceからWCMのインスタンスを取得する
129 */
HIOETH_GetHIOETHInstance(NNETInstance * pNetIns)130 static inline HIOETHInstance* HIOETH_GetHIOETHInstance(NNETInstance* pNetIns)
131 {
132     return (HIOETHInstance*)pNetIns;
133 }
134 
135 /*---------------------------------------------------------------------------*
136  * Function Prototypes
137  *---------------------------------------------------------------------------*/
138 /* HIOETH_main.c */
139 extern s32 HIOETH_Init(const NNETAllocator* allocator);
140 extern s32 HIOETH_Finish(void);
141 extern s32 HIOETH_StartupIns(NNETInstance* ins, s32 timeout);
142 extern s32 HIOETH_CleanupIns(NNETInstance* ins, s32 timeout);
143 extern s32 HIOETH_AbortIns(NNETInstance* ins);
144 extern s32 HIOETH_CreateIns(HIOETHInstance** peth_ins);
145 extern s32 HIOETH_DestroyIns(HIOETHInstance* peth_ins);
146 extern s32 HIOETH_GetStateIns(HIOETHInstance* peth_ins);
147 extern s32 HIOETH_GetUpperAPI(NNETEthernetAPI* wcm_api, HIOETHInstance* peth_ins);
148 extern s32 HIOETH_SetUpper(NNETInstance * ins, NNETInstance * upper_ins, u32* receive_id, u16 entry[]);
149 extern s32 HIOETH_ClearUpper(NNETInstance* ins, NNETInstance* upper_ins);
150 extern s32 HIOETH_GetMacAddr(NNETInstance* ins, u8* macaddr);
151 extern s32 HIOETH_SetMulticastAddr(NNETInstance* ins, u8* macaddr);
152 extern s32 HIOETH_ClearMulticastAddr(NNETInstance* ins, u8* macaddr);
153 extern s32 HIOETH_Send(NNETInstance* ins, u8* dstMAC, NOSMessageBuf* mbuf);
154 extern s32 HIOETH_Receive(NNETInstance* ins, u32 receive_id, NOSMessageBuf** mbuf);
155 extern s32 HIOETH_CancelReceive(NNETInstance* ins, u32 receive_id);
156 
157 
158 #ifdef  __cplusplus
159 }
160 #endif
161 
162 /* NN_NETWORK_HIOETH_H */
163 #endif
164