This is Webservice SDK for mbed. LPCXpresso1769/LPC1768/FRDM-K64F/LPC4088

Dependents:   MbedFileServer_1768MiniDK2 RedWireBridge IssueDebug_gcc MiMicRemoteMCU-for-Mbed ... more

libMiMic(MiMic library for mbed)は、WebService機能を提供するSDKです。 mbedでWebAPIに対応したネットワークデバイスを簡単に作ることが出来ます。

libMiMicはMiMic projectで開発しています。MiMic projectについてはこちらをご覧ください。 http://nyatla.jp/mimic/wp/

構成

libMiMicはmbedRTOS上で動作し、ユーザアプリケーションにAPIを提供します。コアAPIはC言語で記述されていますが、使用頻度の高いものについてはmbed向けのC++APIが準備されています。

/media/uploads/nyatla/libmimic-sdk.png

※libMiMicはmbedの標準イーサネットドライバをしようしていません。

標準イーサネットドライバと同時に使用することはできません。

  • MiMicIP - IPv4スタックです。レテンシとメモリ消費量を抑えたuipベースのライブラリです。
  • ARP/ICMP/UDP/TCP - 基礎的なソケットAPIを提供します。APIは独自です。
  • HTTP/1.1 Server - HTTP/1.1に対応したサーバです。マルチセッション・Chunked・持続性接続に対応しています。
  • HTTP Modules - HTTP/1.1の機能モジュールです。以下のモジュールがあります。
    • ROM file provider - ROMに格納したファイルイメージを公開します。
    • File system provider - mbedファイルシステムを公開します。
    • Onchip configuration - プログラムフラッシュを利用して設定を保存します。
    • MiMicVM processor - RPCリクエスト(MiMicVM)を処理します。
    • FileUpload - ファイルアップロードを受け取ります。
    • URL decoder - HTTPリクエストを解析します。
    • UPnP handler -UPnPメッセージを処理します。
    • WebSocket - Websocketサーバです。
  • mDNS - マルチキャストDNSサービスです。
  • UPnP - UPnP/1.0の機能を提供します。UPnP handlerと協調して動作します。(現在はデバイス探索(SSDP)・デスクリプション(Description)のみ実装してあります。)
  • DHCP/APIPA - ゼロコンフィギュレーション用のモジュールです。
  • HTTP/1.1 Client
  • mbed C++ class library - mbed向けのC++CPIです。C言語のものより簡単です。

対応機種

  • mbed(mbed LPC1768)
  • LPCXpresso1769

プログラム

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

サンプル

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

チュートリアル

English

libMiMic(MiMic library for mbed) is SDK which provides Webservice functions. It can be created networking device easily using mbed.

See more MiMic information, See MiMic project website. http://nyatla.jp/mimic/wp/

Structure

libMiMic run on mbed RTOS and provides networking API to user application. This library has C++ class API for the mbed, and low-level C language API.

/media/uploads/nyatla/libmimic-sdk.png

For WebService general, it can be written in a simple C + + API.

libMiMic does not have the standard Ethernet driver of mbed. It is not possible that will be used with the standard Ethernet driver.

  • MiMicIP - IPv4 protocol stack. This is based uip which is reduced memory and latency.
  • ARP / ICMP / UDP / TCP - Those are provide basic IP protocols.
  • HTTP/1.1 Server - The Http server compatible HTTP/1.1. It supports multi-session, chunked transport, persistent connection.
  • HTTP Modules - There are addon-module for HTTP server. The following modules.
    • ROM file module - Publish the file images in ROM.
    • File system module - Publish thefiles in mbed file system.
    • Onchip configuration module - To save the network settings to the program flash via REST.
    • MiMicVM module - To handle the (MiMicVM) RPC request.
    • FileUpload module - Accept a file via HTTP POST.
    • URL dedoce module - A versatility URL decoder.
    • UPnP handle module - To handle UPnP messages.
    • UPnP - This provides UPnP/1.0 device functions. It works together with UPnP handler.
    • Websocket - websocket (version13) server
  • mDNS Service - DNS-SD protocol server.
  • UPnP - This provides UPnP/1.0 device functions which works with UPnP handler. (You have been implemented (SSDP) ? description only (Description) device search now.) It is a module zero configuration for - DHCP / APIPA. mbed C + + class library - C of mbed for + + is the CPI. It is simple than that of the C language.
  • DHCP/APIPA - It support zero-cpnfigulation.
  • mbed C++ class library. Almost APIs for Web applications are available.
  • HTTP/1.1 Client

Supported target

  • mbed(mbed LPC1768)
  • LPCXpresso1769

Application

Import programMiMicRemoteMCU-for-Mbed

MiMic RemoteMCU for mbed. This program provides MCU control API over REST API. It can control MCU from Javascript,PHP or any HTTP rest client directly. And, The application has self development environment.

Import programMbedFileServer

The program publishes files at local directory and SD filesystem. It is a full-fledged webServer somewhat.

Sample

Import programMiMicSimpleHttpd

This is a simplest HTTP server made ​​of libMiMic. It will echo back a request path.

Import programUPnPBasicDevice

Simplest UPnP basic device example. This program to run UPnP basic device on the mbed.

Import programWebSocketSample

MiMicSDK Websocket module sample program.

Import programHttpClientSamlpe

A http client sample program.

Import programTcpSocketClientSamlpe

MiMicSDK Tcp client socket sample program.

Import programUdpSocketSamlpe

Udp socket sample program. This program will send back the received packet.

Tutorial

Committer:
nyatla
Date:
Sun Apr 28 12:23:11 2013 +0000
Revision:
21:f2a70f15301f
Parent:
20:3b0b444b4deb
Child:
37:fc4b4fd6a649
changed default number of HTTP thread to 4.; changed HTTP thread stack size to 2000byte(1900byte free).; restrictd ModLocalFS transport speed to 80KB/s;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nyatla 0:142ee8b12fef 1 /*********************************************************************************
nyatla 0:142ee8b12fef 2 * PROJECT: MiMic
nyatla 0:142ee8b12fef 3 * --------------------------------------------------------------------------------
nyatla 0:142ee8b12fef 4 *
nyatla 0:142ee8b12fef 5 * This file is part of MiMic
nyatla 0:142ee8b12fef 6 * Copyright (C)2011 Ryo Iizuka
nyatla 0:142ee8b12fef 7 *
nyatla 0:142ee8b12fef 8 * MiMic is free software: you can redistribute it and/or modify
nyatla 0:142ee8b12fef 9 * it under the terms of the GNU Lesser General Public License as published
nyatla 0:142ee8b12fef 10 * by the Free Software Foundation, either version 3 of the License, or
nyatla 0:142ee8b12fef 11 * (at your option) any later version.
nyatla 0:142ee8b12fef 12 *
nyatla 0:142ee8b12fef 13 * This program is distributed in the hope that it will be useful,
nyatla 0:142ee8b12fef 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
nyatla 0:142ee8b12fef 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
nyatla 0:142ee8b12fef 16 * GNU General Public License for more details.
nyatla 0:142ee8b12fef 17 *
nyatla 0:142ee8b12fef 18 * You should have received a copy of the GNU Lesser General Public License
nyatla 0:142ee8b12fef 19 * along with this program. If not, see <http://www.gnu.org/licenses/>.
nyatla 0:142ee8b12fef 20 *
nyatla 0:142ee8b12fef 21 * For further information please contact.
nyatla 0:142ee8b12fef 22 * http://nyatla.jp/
nyatla 0:142ee8b12fef 23 * <airmail(at)ebony.plala.or.jp> or <nyatla(at)nyatla.jp>
nyatla 0:142ee8b12fef 24 *
nyatla 0:142ee8b12fef 25 *
nyatla 0:142ee8b12fef 26 * Parts of this file were leveraged from uIP:
nyatla 0:142ee8b12fef 27 *
nyatla 0:142ee8b12fef 28 * Copyright (c) 2001-2003, Adam Dunkels.
nyatla 0:142ee8b12fef 29 * All rights reserved.
nyatla 0:142ee8b12fef 30 *
nyatla 0:142ee8b12fef 31 * Redistribution and use in source and binary forms, with or without
nyatla 0:142ee8b12fef 32 * modification, are permitted provided that the following conditions
nyatla 0:142ee8b12fef 33 * are met:
nyatla 0:142ee8b12fef 34 * 1. Redistributions of source code must retain the above copyright
nyatla 0:142ee8b12fef 35 * notice, this list of conditions and the following disclaimer.
nyatla 0:142ee8b12fef 36 * 2. Redistributions in binary form must reproduce the above copyright
nyatla 0:142ee8b12fef 37 * notice, this list of conditions and the following disclaimer in the
nyatla 0:142ee8b12fef 38 * documentation and/or other materials provided with the distribution.
nyatla 0:142ee8b12fef 39 * 3. The name of the author may not be used to endorse or promote
nyatla 0:142ee8b12fef 40 * products derived from this software without specific prior
nyatla 0:142ee8b12fef 41 * written permission.
nyatla 0:142ee8b12fef 42 *
nyatla 0:142ee8b12fef 43 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
nyatla 0:142ee8b12fef 44 * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
nyatla 0:142ee8b12fef 45 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
nyatla 0:142ee8b12fef 46 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
nyatla 0:142ee8b12fef 47 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nyatla 0:142ee8b12fef 48 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
nyatla 0:142ee8b12fef 49 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
nyatla 0:142ee8b12fef 50 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
nyatla 0:142ee8b12fef 51 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
nyatla 0:142ee8b12fef 52 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
nyatla 0:142ee8b12fef 53 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nyatla 0:142ee8b12fef 54 */
nyatla 2:b96c1e90d120 55 #include "NyLPC_cIPv4IComp_protected.h"
nyatla 0:142ee8b12fef 56 #include "NyLPC_cTcpListener_protected.h"
nyatla 0:142ee8b12fef 57 #include "NyLPC_stdlib.h"
nyatla 0:142ee8b12fef 58 #include "NyLPC_uip.h"
nyatla 0:142ee8b12fef 59
nyatla 2:b96c1e90d120 60
nyatla 2:b96c1e90d120 61
nyatla 2:b96c1e90d120 62
nyatla 0:142ee8b12fef 63
nyatla 0:142ee8b12fef 64 /****************************************************
nyatla 0:142ee8b12fef 65 * UipServiceに関する宣言:タスクメッセージ
nyatla 0:142ee8b12fef 66 ***************************************************/
nyatla 0:142ee8b12fef 67
nyatla 0:142ee8b12fef 68 #define TTaskMsg_NOP 0
nyatla 0:142ee8b12fef 69 #define TTaskMsg_START 1
nyatla 0:142ee8b12fef 70 #define TTaskMsg_STOP 2
nyatla 0:142ee8b12fef 71
nyatla 0:142ee8b12fef 72 /**
nyatla 0:142ee8b12fef 73 * サービスの起動メッセージです。
nyatla 0:142ee8b12fef 74 */
nyatla 0:142ee8b12fef 75 struct TTaskMsg{
nyatla 0:142ee8b12fef 76 NyLPC_TUInt16 msg;
nyatla 0:142ee8b12fef 77 union{
nyatla 0:142ee8b12fef 78 struct{
nyatla 0:142ee8b12fef 79 const NyLPC_TcIPv4Config_t* ref_config;
nyatla 0:142ee8b12fef 80 }start;
nyatla 0:142ee8b12fef 81 };
nyatla 0:142ee8b12fef 82 };
nyatla 0:142ee8b12fef 83
nyatla 0:142ee8b12fef 84 /****************************************************
nyatla 0:142ee8b12fef 85 * UipServiceに関する宣言:その他
nyatla 0:142ee8b12fef 86 ***************************************************/
nyatla 0:142ee8b12fef 87 /**
nyatla 0:142ee8b12fef 88 * イーサネットフレームの読み出し構造体
nyatla 0:142ee8b12fef 89 */
nyatla 0:142ee8b12fef 90 struct TEthPacket
nyatla 0:142ee8b12fef 91 {
nyatla 0:142ee8b12fef 92 struct NyLPC_TEthernetIIHeader header;
nyatla 0:142ee8b12fef 93 union{
nyatla 0:142ee8b12fef 94 struct NyLPC_TArpHeader arp;
nyatla 0:142ee8b12fef 95 struct NyLPC_TIPv4Header ipv4;
nyatla 0:142ee8b12fef 96 }data;
nyatla 0:142ee8b12fef 97 };
nyatla 0:142ee8b12fef 98
nyatla 0:142ee8b12fef 99
nyatla 0:142ee8b12fef 100
nyatla 0:142ee8b12fef 101 /**
nyatla 0:142ee8b12fef 102 * サービスインスタンスのポインタ。サービスが稼働中はインスタンスのポインタが有効です。
nyatla 0:142ee8b12fef 103 */
nyatla 0:142ee8b12fef 104 NyLPC_TcUipService_t* _NyLPC_TcUipService_inst=NULL;
nyatla 0:142ee8b12fef 105
nyatla 0:142ee8b12fef 106 /**
nyatla 0:142ee8b12fef 107 * 唯一のインスタンス
nyatla 0:142ee8b12fef 108 */
nyatla 0:142ee8b12fef 109 static NyLPC_TcUipService_t _service_instance;
nyatla 0:142ee8b12fef 110
nyatla 0:142ee8b12fef 111
nyatla 0:142ee8b12fef 112
nyatla 0:142ee8b12fef 113
nyatla 0:142ee8b12fef 114 /**
nyatla 0:142ee8b12fef 115 * uipタスク
nyatla 0:142ee8b12fef 116 */
nyatla 0:142ee8b12fef 117 static int uipTask(void *pvParameters);
nyatla 0:142ee8b12fef 118
nyatla 0:142ee8b12fef 119 //--------------------------------------------------------------
nyatla 0:142ee8b12fef 120
nyatla 0:142ee8b12fef 121
nyatla 0:142ee8b12fef 122 static NyLPC_TBool sendIPv4Tx(struct NyLPC_TTxBufferHeader* i_eth_buf);
nyatla 0:142ee8b12fef 123 static void copyAndSendIPv4Tx(const struct TEthPacket* i_buf);
nyatla 0:142ee8b12fef 124 static void sendArpReqest(const struct TEthPacket* i_eth_packet);
nyatla 0:142ee8b12fef 125 static void sendRawEthFrame(void* i_buf,NyLPC_TUInt16 i_len);
nyatla 0:142ee8b12fef 126 static void emacIsrHandler(unsigned long i_status);
nyatla 0:142ee8b12fef 127
nyatla 0:142ee8b12fef 128 /**メッセージなし*/
nyatla 0:142ee8b12fef 129 #define TTaskMessage_MSG_NULL 0x0000
nyatla 0:142ee8b12fef 130 /**uipコアタスクに、開始要求する*/
nyatla 0:142ee8b12fef 131 #define TTaskMessage_MSG_RUN 0x0001
nyatla 0:142ee8b12fef 132 /**uipコアタスクに、停止要求する*/
nyatla 0:142ee8b12fef 133 #define TTaskMessage_MSG_STOP 0x0002
nyatla 0:142ee8b12fef 134
nyatla 0:142ee8b12fef 135
nyatla 0:142ee8b12fef 136 NyLPC_TcThread_t th;
nyatla 0:142ee8b12fef 137
nyatla 0:142ee8b12fef 138 NyLPC_TBool NyLPC_cUipService_initialize(void)
nyatla 0:142ee8b12fef 139 {
nyatla 2:b96c1e90d120 140
nyatla 0:142ee8b12fef 141 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 142 //サービスは停止している事。 - Service must be uninitialized.
nyatla 0:142ee8b12fef 143 NyLPC_Assert(!NyLPC_TcUipService_isInitService());
nyatla 0:142ee8b12fef 144 //IP処理部分の初期化
nyatla 0:142ee8b12fef 145 NyLPC_cIPv4_initialize(&(inst->_tcpv4));
nyatla 0:142ee8b12fef 146 //EMACからの割込処理
nyatla 1:9f6a78395432 147 NyLPC_cIsr_setEnetISR(emacIsrHandler);
nyatla 0:142ee8b12fef 148 //EMAC割込セマフォ
nyatla 0:142ee8b12fef 149 NyLPC_cSemaphore_initialize(&inst->_emac_semapho);
nyatla 0:142ee8b12fef 150
nyatla 0:142ee8b12fef 151 inst->_task_cmd=NULL;
nyatla 0:142ee8b12fef 152 inst->_status=NyLPC_TcUipService_STATUS_STOP;
nyatla 0:142ee8b12fef 153 NyLPC_cStopwatch_initialize(&(inst->_arp_sw));
nyatla 0:142ee8b12fef 154 NyLPC_cStopwatch_initialize(&(inst->_periodic_sw));
nyatla 0:142ee8b12fef 155 NyLPC_cIPv4_initialize(&(inst->_tcpv4));
nyatla 0:142ee8b12fef 156 NyLPC_AbortIfNot(NyLPC_cMutex_initialize(&(inst->_mutex)));
nyatla 0:142ee8b12fef 157
nyatla 0:142ee8b12fef 158 _NyLPC_TcUipService_inst=inst;
nyatla 0:142ee8b12fef 159 inst->stx.h.is_lock=NyLPC_TUInt8_FALSE;
nyatla 0:142ee8b12fef 160 inst->stx.h.ref=0;
nyatla 0:142ee8b12fef 161 //タスク起動
nyatla 0:142ee8b12fef 162 NyLPC_cThread_initialize(&th,NyLPC_TcUipService_config_STACK_SIZE,NyLPC_TcThread_PRIORITY_SERVICE);
nyatla 0:142ee8b12fef 163 NyLPC_cThread_start(&th,uipTask,NULL);
nyatla 0:142ee8b12fef 164 // NyLPC_AbortIfNot(pdPASS==xTaskCreate(
nyatla 0:142ee8b12fef 165 // uipTask,
nyatla 0:142ee8b12fef 166 // (signed char*)NyLPC_TcUipService_config_TASK_NAME,
nyatla 0:142ee8b12fef 167 // NyLPC_TcUipService_config_STACK_SIZE,
nyatla 0:142ee8b12fef 168 // ( void * ) NULL,
nyatla 0:142ee8b12fef 169 // NyLPC_TcUipService_config_TASK_PRIORITY,
nyatla 0:142ee8b12fef 170 // (void*)_NyLPC_TcUipService_inst));
nyatla 0:142ee8b12fef 171 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 172 }
nyatla 0:142ee8b12fef 173
nyatla 0:142ee8b12fef 174
nyatla 0:142ee8b12fef 175
nyatla 0:142ee8b12fef 176
nyatla 0:142ee8b12fef 177
nyatla 0:142ee8b12fef 178
nyatla 0:142ee8b12fef 179
nyatla 0:142ee8b12fef 180 /**
nyatla 0:142ee8b12fef 181 * UIP処理を開始します。
nyatla 0:142ee8b12fef 182 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 0:142ee8b12fef 183 * @param i_ref_config
nyatla 0:142ee8b12fef 184 * このコンフィギュレーションは、stopを実行するまでの間、インスタンスから参照します。外部で保持してください。
nyatla 0:142ee8b12fef 185 */
nyatla 0:142ee8b12fef 186 void NyLPC_cUipService_start(const NyLPC_TcIPv4Config_t* i_ref_config)
nyatla 0:142ee8b12fef 187 {
nyatla 0:142ee8b12fef 188 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 189 struct TTaskMsg msg;
nyatla 0:142ee8b12fef 190 NyLPC_Assert(NyLPC_TcUipService_isInitService());
nyatla 0:142ee8b12fef 191 if(!NyLPC_cUipService_isRun())
nyatla 0:142ee8b12fef 192 {
nyatla 0:142ee8b12fef 193 //はじめて起動するときに1度だけデバイス取得(タスクスイッチが動いてないと動かないからここで。)
nyatla 0:142ee8b12fef 194 if(inst->_ethif==NULL){
nyatla 0:142ee8b12fef 195 inst->_ethif=getEthernetDevicePnP();
nyatla 0:142ee8b12fef 196 }
nyatla 0:142ee8b12fef 197 //コマンドセット
nyatla 0:142ee8b12fef 198 msg.msg=TTaskMsg_START;
nyatla 0:142ee8b12fef 199 msg.start.ref_config=i_ref_config;
nyatla 0:142ee8b12fef 200 _NyLPC_TcUipService_inst->_task_cmd=&msg;
nyatla 0:142ee8b12fef 201 //状態が変わるまでループ
nyatla 0:142ee8b12fef 202 while(!NyLPC_cUipService_isRun()){
nyatla 0:142ee8b12fef 203 NyLPC_cThread_sleep(10);
nyatla 0:142ee8b12fef 204 }
nyatla 0:142ee8b12fef 205 }
nyatla 0:142ee8b12fef 206 //コマンドクリア
nyatla 0:142ee8b12fef 207 _NyLPC_TcUipService_inst->_task_cmd=NULL;
nyatla 0:142ee8b12fef 208 return;
nyatla 0:142ee8b12fef 209 }
nyatla 0:142ee8b12fef 210 /**
nyatla 0:142ee8b12fef 211 * UIP処理を停止します。
nyatla 0:142ee8b12fef 212 * この関数はリエントラントではありません。複数のタスクから共有するときには、排他ロックを掛けてください。
nyatla 0:142ee8b12fef 213 * いまのところ、ストップシーケンスの実装は良くありません。
nyatla 0:142ee8b12fef 214 * 再設計が必要。
nyatla 0:142ee8b12fef 215 */
nyatla 0:142ee8b12fef 216 void NyLPC_cUipService_stop(void)
nyatla 0:142ee8b12fef 217 {
nyatla 0:142ee8b12fef 218 struct TTaskMsg msg;
nyatla 0:142ee8b12fef 219 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 220 NyLPC_Assert(NyLPC_TcUipService_isInitService());
nyatla 0:142ee8b12fef 221 if(NyLPC_cUipService_isRun())
nyatla 0:142ee8b12fef 222 {
nyatla 0:142ee8b12fef 223 //コマンドセット
nyatla 0:142ee8b12fef 224 msg.msg=TTaskMsg_STOP;
nyatla 0:142ee8b12fef 225 _NyLPC_TcUipService_inst->_task_cmd=&msg;
nyatla 0:142ee8b12fef 226 //状態が変わるまでループ
nyatla 0:142ee8b12fef 227 while(NyLPC_cUipService_isRun()){
nyatla 0:142ee8b12fef 228 NyLPC_cThread_sleep(10);
nyatla 0:142ee8b12fef 229 }
nyatla 0:142ee8b12fef 230 NyLPC_cIPv4_stop(&(inst->_tcpv4));
nyatla 0:142ee8b12fef 231
nyatla 0:142ee8b12fef 232 }
nyatla 0:142ee8b12fef 233 //コマンドクリア
nyatla 0:142ee8b12fef 234 _NyLPC_TcUipService_inst->_task_cmd=NULL;
nyatla 0:142ee8b12fef 235 return;
nyatla 0:142ee8b12fef 236 }
nyatla 0:142ee8b12fef 237
nyatla 0:142ee8b12fef 238
nyatla 0:142ee8b12fef 239 const char* NyLPC_cUipService_refDeviceName(void)
nyatla 0:142ee8b12fef 240 {
nyatla 0:142ee8b12fef 241 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 242 return NyLPC_cUipService_isRun()?inst->_ethif->device_name:NULL;
nyatla 0:142ee8b12fef 243 }
nyatla 21:f2a70f15301f 244 const NyLPC_TcIPv4Config_t* NyLPC_cUipService_refCurrentConfig(void)
nyatla 21:f2a70f15301f 245 {
nyatla 21:f2a70f15301f 246 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 21:f2a70f15301f 247 return inst->_ref_config;
nyatla 21:f2a70f15301f 248 }
nyatla 0:142ee8b12fef 249 /**********************************************************************
nyatla 0:142ee8b12fef 250 *
nyatla 0:142ee8b12fef 251 * </HWコールバックに関わる宣言>
nyatla 0:142ee8b12fef 252 *
nyatla 0:142ee8b12fef 253 *********************************************************************/
nyatla 0:142ee8b12fef 254
nyatla 0:142ee8b12fef 255 /**
nyatla 0:142ee8b12fef 256 * EMACからのハンドラ
nyatla 0:142ee8b12fef 257 */
nyatla 0:142ee8b12fef 258 static void emacIsrHandler(unsigned long i_status)
nyatla 0:142ee8b12fef 259 {
nyatla 0:142ee8b12fef 260 NyLPC_TcUipService_t* inst=&_service_instance;
nyatla 0:142ee8b12fef 261
nyatla 0:142ee8b12fef 262 if( i_status & INT_RX_DONE )
nyatla 0:142ee8b12fef 263 {
nyatla 0:142ee8b12fef 264 //受信系のセマフォブロックの解除
nyatla 0:142ee8b12fef 265 NyLPC_cSemaphore_giveFromISR(&inst->_emac_semapho);
nyatla 0:142ee8b12fef 266 }
nyatla 0:142ee8b12fef 267 if( i_status & INT_TX_DONE )
nyatla 0:142ee8b12fef 268 {
nyatla 0:142ee8b12fef 269 }
nyatla 0:142ee8b12fef 270 }
nyatla 0:142ee8b12fef 271
nyatla 0:142ee8b12fef 272
nyatla 0:142ee8b12fef 273 //PERIODIC rate
nyatla 0:142ee8b12fef 274 #define PERIODIC_TIMER (1*200)
nyatla 0:142ee8b12fef 275 #define ARP_TIMER (60*1000*10)
nyatla 0:142ee8b12fef 276
nyatla 0:142ee8b12fef 277 /**
nyatla 0:142ee8b12fef 278 * 操作キューを確認して、タスクのステータスをアップデートします。
nyatla 0:142ee8b12fef 279 * 高速化のため、Proc-Callerを使用していません。複雑なタスク操作をするときには、書き換えてください。
nyatla 0:142ee8b12fef 280 */
nyatla 0:142ee8b12fef 281 static void updateTaskStatus()
nyatla 0:142ee8b12fef 282 {
nyatla 0:142ee8b12fef 283 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 284
nyatla 0:142ee8b12fef 285 struct TTaskMsg* msg=(struct TTaskMsg*)(inst->_task_cmd);
nyatla 0:142ee8b12fef 286
nyatla 0:142ee8b12fef 287 //コマンドが設定されていない時は、何もしない。
nyatla 0:142ee8b12fef 288 if(msg==NULL){
nyatla 0:142ee8b12fef 289 return;
nyatla 0:142ee8b12fef 290 }
nyatla 0:142ee8b12fef 291 switch(msg->msg)
nyatla 0:142ee8b12fef 292 {
nyatla 0:142ee8b12fef 293 //何もしない。
nyatla 0:142ee8b12fef 294 case TTaskMsg_NOP:
nyatla 0:142ee8b12fef 295 break;
nyatla 0:142ee8b12fef 296 //開始操作
nyatla 0:142ee8b12fef 297 case TTaskMsg_START:
nyatla 0:142ee8b12fef 298 //状態チェック
nyatla 0:142ee8b12fef 299 if(NyLPC_cUipService_isRun()){
nyatla 0:142ee8b12fef 300 break;
nyatla 0:142ee8b12fef 301 }
nyatla 0:142ee8b12fef 302 inst->_ref_config=msg->start.ref_config;
nyatla 0:142ee8b12fef 303 //TCP,ICOMPの初期化
nyatla 0:142ee8b12fef 304 NyLPC_cIPv4_start(&(inst->_tcpv4),inst->_ref_config);
nyatla 0:142ee8b12fef 305 NyLPC_cIPv4IComp_initialize(&(inst->_icomp),inst->_ref_config);
nyatla 0:142ee8b12fef 306 //uip_arp_init(msg->start.ref_config);
nyatla 0:142ee8b12fef 307 NyLPC_cIPv4Arp_initialize(&(inst->_arp),inst->_ref_config);
nyatla 0:142ee8b12fef 308 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),1);//1度ARPを起動するため。
nyatla 0:142ee8b12fef 309 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 0:142ee8b12fef 310 while(!inst->_ethif->start(&(inst->_ref_config->eth_mac)));
nyatla 0:142ee8b12fef 311 inst->_status=NyLPC_TcUipService_STATUS_RUN;
nyatla 0:142ee8b12fef 312 break;
nyatla 0:142ee8b12fef 313 //終了操作
nyatla 0:142ee8b12fef 314 case TTaskMsg_STOP:
nyatla 0:142ee8b12fef 315 //状態チェック
nyatla 0:142ee8b12fef 316 if(!NyLPC_cUipService_isRun()){
nyatla 0:142ee8b12fef 317 break;
nyatla 0:142ee8b12fef 318 }
nyatla 0:142ee8b12fef 319 //停止操作
nyatla 0:142ee8b12fef 320 inst->_ethif->stop();
nyatla 0:142ee8b12fef 321 NyLPC_cIPv4_stop(&(inst->_tcpv4));
nyatla 0:142ee8b12fef 322 NyLPC_cIPv4IComp_finalize(&(inst->_icomp));
nyatla 0:142ee8b12fef 323 inst->_status=NyLPC_TcUipService_STATUS_STOP;
nyatla 0:142ee8b12fef 324 break;
nyatla 0:142ee8b12fef 325 default:
nyatla 0:142ee8b12fef 326 //実行してはいけない。
nyatla 0:142ee8b12fef 327 NyLPC_Abort();
nyatla 0:142ee8b12fef 328 }
nyatla 0:142ee8b12fef 329 //コマンドを無効化
nyatla 0:142ee8b12fef 330 inst->_task_cmd=TTaskMsg_NOP;
nyatla 0:142ee8b12fef 331 return;
nyatla 0:142ee8b12fef 332 }
nyatla 0:142ee8b12fef 333
nyatla 0:142ee8b12fef 334 /**
nyatla 0:142ee8b12fef 335 * uipタスクのメインループ
nyatla 0:142ee8b12fef 336 */
nyatla 0:142ee8b12fef 337 static int uipTask(void *pvParameters)
nyatla 0:142ee8b12fef 338 {
nyatla 0:142ee8b12fef 339 NyLPC_TUInt16 rx_len,tx_len;
nyatla 0:142ee8b12fef 340 struct TEthPacket* ethbuf;
nyatla 0:142ee8b12fef 341 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 342 NyLPC_TBool r;
nyatla 0:142ee8b12fef 343 (void)pvParameters;
nyatla 0:142ee8b12fef 344 for( ;; )
nyatla 0:142ee8b12fef 345 {
nyatla 0:142ee8b12fef 346 //タスク状態の更新
nyatla 0:142ee8b12fef 347 updateTaskStatus();
nyatla 0:142ee8b12fef 348 if(inst->_status!=NyLPC_TcUipService_STATUS_RUN)
nyatla 0:142ee8b12fef 349 {
nyatla 0:142ee8b12fef 350 //RUNステータス以外の時は、ここで終了する。
nyatla 0:142ee8b12fef 351 NyLPC_cThread_sleep(50);
nyatla 0:142ee8b12fef 352 continue;
nyatla 0:142ee8b12fef 353 }
nyatla 0:142ee8b12fef 354 //イーサネットフレームの取得
nyatla 0:142ee8b12fef 355 //Ethernet Device Lock(ARPを含む)
nyatla 2:b96c1e90d120 356 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 0:142ee8b12fef 357 ethbuf= (struct TEthPacket*)inst->_ethif->getRxEthFrame(&rx_len);
nyatla 0:142ee8b12fef 358 tx_len=0;
nyatla 0:142ee8b12fef 359 while(ethbuf != NULL){
nyatla 0:142ee8b12fef 360 if(rx_len>0)
nyatla 0:142ee8b12fef 361 {
nyatla 0:142ee8b12fef 362 //ペイロードサイズを計算
nyatla 0:142ee8b12fef 363 rx_len-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 0:142ee8b12fef 364 switch(ethbuf->header.type)
nyatla 0:142ee8b12fef 365 {
nyatla 0:142ee8b12fef 366 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IP):
nyatla 0:142ee8b12fef 367 //ARPテーブルの更新
nyatla 0:142ee8b12fef 368 //uip_arp_ipin(&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 0:142ee8b12fef 369 NyLPC_cIPv4Arp_incomingIp(&inst->_arp,&(ethbuf->header),ethbuf->data.ipv4.srcipaddr);
nyatla 0:142ee8b12fef 370 //Ethernet Device UnLock(パケット解析の為に一時的な解除)
nyatla 0:142ee8b12fef 371 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 372 //IPパケットの処理
nyatla 0:142ee8b12fef 373 r=NyLPC_cIPv4_rx(&(inst->_tcpv4),&(ethbuf->data.ipv4),rx_len);
nyatla 0:142ee8b12fef 374 //ロックの復帰
nyatla 0:142ee8b12fef 375 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 0:142ee8b12fef 376 if(!r){
nyatla 0:142ee8b12fef 377 //応答データは存在しない。
nyatla 0:142ee8b12fef 378 break;
nyatla 0:142ee8b12fef 379 }
nyatla 0:142ee8b12fef 380 //IPパケットをTxバッファに転写して送信
nyatla 0:142ee8b12fef 381 copyAndSendIPv4Tx(ethbuf);
nyatla 0:142ee8b12fef 382 ethbuf=NULL;
nyatla 0:142ee8b12fef 383 break;
nyatla 0:142ee8b12fef 384 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_ARP):
nyatla 0:142ee8b12fef 385 //if(uip_arp_arpin(&(ethbuf->data.arp),rx_len)){
nyatla 0:142ee8b12fef 386 if(NyLPC_cIPv4Arp_incomingArp(&inst->_arp,&(ethbuf->data.arp),rx_len)){
nyatla 0:142ee8b12fef 387 tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_ref_config->eth_mac));
nyatla 0:142ee8b12fef 388 }
nyatla 0:142ee8b12fef 389 if(tx_len>0){
nyatla 0:142ee8b12fef 390 sendRawEthFrame(ethbuf,tx_len);
nyatla 0:142ee8b12fef 391 }
nyatla 0:142ee8b12fef 392 break;
nyatla 0:142ee8b12fef 393 case NyLPC_HTONS(NyLPC_TEthernetIIHeader_TYPE_IPV6):
nyatla 0:142ee8b12fef 394 //uip_process_ipv6();
nyatla 0:142ee8b12fef 395 break;
nyatla 0:142ee8b12fef 396 default:
nyatla 0:142ee8b12fef 397 break;
nyatla 0:142ee8b12fef 398 }
nyatla 0:142ee8b12fef 399 }
nyatla 2:b96c1e90d120 400 //受信キューを進行。
nyatla 0:142ee8b12fef 401 inst->_ethif->nextRxEthFrame();
nyatla 0:142ee8b12fef 402 //受信処理
nyatla 0:142ee8b12fef 403 ethbuf= (struct TEthPacket*)inst->_ethif->getRxEthFrame(&rx_len);
nyatla 0:142ee8b12fef 404 }
nyatla 0:142ee8b12fef 405 //データが無い。
nyatla 0:142ee8b12fef 406 if(NyLPC_cStopwatch_isExpired(&(inst->_arp_sw))){
nyatla 0:142ee8b12fef 407 //uip_arp_timer();
nyatla 0:142ee8b12fef 408 NyLPC_cIPv4Arp_periodic(&inst->_arp);
nyatla 0:142ee8b12fef 409 NyLPC_cStopwatch_startExpire(&(inst->_arp_sw),ARP_TIMER);
nyatla 2:b96c1e90d120 410 }
nyatla 0:142ee8b12fef 411 if(NyLPC_cStopwatch_isExpired(&(inst->_periodic_sw))){
nyatla 0:142ee8b12fef 412 NyLPC_cIPv4_periodec(&(inst->_tcpv4));
nyatla 0:142ee8b12fef 413 NyLPC_cStopwatch_startExpire(&(inst->_periodic_sw),PERIODIC_TIMER);
nyatla 0:142ee8b12fef 414 }
nyatla 0:142ee8b12fef 415 //リソースロックの解除
nyatla 0:142ee8b12fef 416 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 417 //割込によるセマフォの解除か、タイムアウトで再開する。(タイムアウト値は周期関数の実行レート以下にすること。)
nyatla 0:142ee8b12fef 418 NyLPC_cSemaphore_take(&(_NyLPC_TcUipService_inst->_emac_semapho),PERIODIC_TIMER);
nyatla 0:142ee8b12fef 419 }
nyatla 0:142ee8b12fef 420 return 0;
nyatla 0:142ee8b12fef 421 }
nyatla 0:142ee8b12fef 422
nyatla 0:142ee8b12fef 423
nyatla 0:142ee8b12fef 424
nyatla 0:142ee8b12fef 425
nyatla 0:142ee8b12fef 426 /**
nyatla 0:142ee8b12fef 427 * allocTxBufで取得したメモリを"IPパケットとして"送信します。
nyatla 0:142ee8b12fef 428 * @param i_eth_payload
nyatla 0:142ee8b12fef 429 * [NyLPC_TTxBufferHeader][NyLPC_TEthernetIIHeader][payload]メモリの、[payload]のアドレスを指定します。
nyatla 0:142ee8b12fef 430 * 通常は、NyLPC_cUipService_allocTxBufの返却したメモリを指定します。
nyatla 0:142ee8b12fef 431 */
nyatla 0:142ee8b12fef 432
nyatla 0:142ee8b12fef 433 void NyLPC_cUipService_sendIPv4Tx(void* i_eth_payload)
nyatla 0:142ee8b12fef 434 {
nyatla 0:142ee8b12fef 435 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 436 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 0:142ee8b12fef 437 //IPパケットの送信を試行
nyatla 0:142ee8b12fef 438 if(!sendIPv4Tx(((struct NyLPC_TTxBufferHeader*)(((struct NyLPC_TEthernetIIHeader*)i_eth_payload)-1))-1)){
nyatla 0:142ee8b12fef 439 //ARPリクエストを代わりに送信
nyatla 0:142ee8b12fef 440 sendArpReqest(((struct TEthPacket*)i_eth_payload)-1);
nyatla 0:142ee8b12fef 441 }
nyatla 0:142ee8b12fef 442 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 443 return;
nyatla 0:142ee8b12fef 444 }
nyatla 0:142ee8b12fef 445
nyatla 0:142ee8b12fef 446
nyatla 0:142ee8b12fef 447
nyatla 0:142ee8b12fef 448
nyatla 0:142ee8b12fef 449 /**
nyatla 0:142ee8b12fef 450 * 送信ペイロードメモリを返します。
nyatla 0:142ee8b12fef 451 * この関数は、リエントラントを許容します。
nyatla 0:142ee8b12fef 452 * @param i_hint
nyatla 0:142ee8b12fef 453 * 取得したいメモリサイズを指定します。(このサイズは、イーサネットヘッダのサイズを含みません。)
nyatla 0:142ee8b12fef 454 * このサイズよりも小さなサイズが割り当てられることがあります。
nyatla 0:142ee8b12fef 455 * @return
nyatla 20:3b0b444b4deb 456 * 成功:IPペイロードのためのメモリブロックを返します。/失敗:NULL
nyatla 0:142ee8b12fef 457 */
nyatla 0:142ee8b12fef 458 void* NyLPC_cUipService_allocTxBuf(NyLPC_TUInt16 i_hint,NyLPC_TUInt16* o_size)
nyatla 0:142ee8b12fef 459 {
nyatla 0:142ee8b12fef 460 //排他処理をして、メモリを取得する。
nyatla 0:142ee8b12fef 461 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 462 struct NyLPC_TTxBufferHeader* ethbuf;
nyatla 0:142ee8b12fef 463 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 0:142ee8b12fef 464 ethbuf=(struct NyLPC_TTxBufferHeader*)inst->_ethif->allocTxBuf(i_hint+sizeof(struct NyLPC_TEthernetIIHeader),o_size);
nyatla 0:142ee8b12fef 465 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 20:3b0b444b4deb 466 if(ethbuf==NULL){
nyatla 20:3b0b444b4deb 467 return NULL;
nyatla 0:142ee8b12fef 468 }
nyatla 20:3b0b444b4deb 469 //イーサネットバッファのサイズを計算
nyatla 20:3b0b444b4deb 470 *o_size-=sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 20:3b0b444b4deb 471 //イーサネットバッファのアドレスを計算
nyatla 20:3b0b444b4deb 472 return &(((struct TEthPacket*)(ethbuf+1))->data);
nyatla 0:142ee8b12fef 473 }
nyatla 0:142ee8b12fef 474
nyatla 0:142ee8b12fef 475
nyatla 0:142ee8b12fef 476 void* NyLPC_cUipService_releaseTxBuf(void* i_buf)
nyatla 0:142ee8b12fef 477 {
nyatla 0:142ee8b12fef 478 //排他処理をして、メモリを開放する。
nyatla 0:142ee8b12fef 479 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 480 NyLPC_cMutex_lock(&(inst->_mutex));
nyatla 0:142ee8b12fef 481 //ペイロードの位置から、メモリブロックを再生。
nyatla 0:142ee8b12fef 482 inst->_ethif->releaseTxBuf(((struct NyLPC_TTxBufferHeader*)(((struct NyLPC_TEthernetIIHeader*)i_buf)-1))-1);
nyatla 0:142ee8b12fef 483 NyLPC_cMutex_unlock(&(inst->_mutex));
nyatla 0:142ee8b12fef 484 return NULL;
nyatla 0:142ee8b12fef 485 }
nyatla 0:142ee8b12fef 486
nyatla 0:142ee8b12fef 487
nyatla 0:142ee8b12fef 488
nyatla 0:142ee8b12fef 489
nyatla 0:142ee8b12fef 490
nyatla 0:142ee8b12fef 491
nyatla 0:142ee8b12fef 492
nyatla 0:142ee8b12fef 493
nyatla 0:142ee8b12fef 494 /**********
nyatla 0:142ee8b12fef 495 * イーサネットHWのコントロール関数
nyatla 0:142ee8b12fef 496 */
nyatla 0:142ee8b12fef 497
nyatla 0:142ee8b12fef 498 /**
nyatla 0:142ee8b12fef 499 * 新たにメモリを確保して、"IPv4パケットを格納した"イーサフレームを送信します。
nyatla 0:142ee8b12fef 500 * コール前に、必ずロックしてから呼び出してください。
nyatla 0:142ee8b12fef 501 */
nyatla 0:142ee8b12fef 502 static void copyAndSendIPv4Tx(const struct TEthPacket* i_buf)
nyatla 0:142ee8b12fef 503 {
nyatla 0:142ee8b12fef 504 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 505 NyLPC_TUInt16 s;
nyatla 0:142ee8b12fef 506 //ACK送信用の自己バッファが空くまで待つ
nyatla 0:142ee8b12fef 507 while(inst->stx.h.is_lock){
nyatla 0:142ee8b12fef 508 inst->_ethif->processTx();
nyatla 0:142ee8b12fef 509 }
nyatla 0:142ee8b12fef 510 //送信する。
nyatla 0:142ee8b12fef 511 s=NyLPC_htons(i_buf->data.ipv4.len16)+sizeof(struct NyLPC_TEthernetIIHeader);
nyatla 0:142ee8b12fef 512 memcpy(inst->stx.buf,i_buf,s);
nyatla 0:142ee8b12fef 513 if(!sendIPv4Tx(&(inst->stx.h))){
nyatla 0:142ee8b12fef 514 //失敗した場合はARPリクエストに変換して再送
nyatla 0:142ee8b12fef 515 sendArpReqest(i_buf);
nyatla 0:142ee8b12fef 516 }
nyatla 0:142ee8b12fef 517 return;
nyatla 0:142ee8b12fef 518 }
nyatla 0:142ee8b12fef 519 /**
nyatla 0:142ee8b12fef 520 * IPv4パケットのpeerIPを問い合わせるARPパケットを送信します。
nyatla 0:142ee8b12fef 521 */
nyatla 0:142ee8b12fef 522 static void sendArpReqest(const struct TEthPacket* i_eth_packet)
nyatla 0:142ee8b12fef 523 {
nyatla 0:142ee8b12fef 524 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 525 NyLPC_TUInt16 tx_len;
nyatla 0:142ee8b12fef 526 struct TEthPacket* ethbuf;
nyatla 0:142ee8b12fef 527 //ACK送信用の自己バッファが空くまで待つ
nyatla 0:142ee8b12fef 528 while(inst->stx.h.is_lock){
nyatla 0:142ee8b12fef 529 inst->_ethif->processTx();
nyatla 0:142ee8b12fef 530 }
nyatla 0:142ee8b12fef 531 //ARPパケットを作る。
nyatla 0:142ee8b12fef 532 ethbuf=(struct TEthPacket*)(inst->stx.buf);
nyatla 0:142ee8b12fef 533 NyLPC_TArpHeader_setArpRequest(&(ethbuf->data.arp),inst->_ref_config->ip_addr,&(inst->_ref_config->eth_mac),i_eth_packet->data.ipv4.destipaddr);
nyatla 0:142ee8b12fef 534 tx_len=NyLPC_TEthernetIIHeader_setArpTx(&(ethbuf->header),&(inst->_ref_config->eth_mac));
nyatla 0:142ee8b12fef 535 //送信
nyatla 0:142ee8b12fef 536 inst->_ethif->sendTxEthFrame(&(inst->stx.h),tx_len);
nyatla 0:142ee8b12fef 537 }
nyatla 0:142ee8b12fef 538
nyatla 0:142ee8b12fef 539 /**
nyatla 0:142ee8b12fef 540 * uipタスクが所有するTXバッファを使用してデータを送信します。
nyatla 0:142ee8b12fef 541 * この関数は、i_bufをコピーします。
nyatla 0:142ee8b12fef 542 * @i_buf
nyatla 0:142ee8b12fef 543 * イーサネットフレームを格納したメモリです。
nyatla 0:142ee8b12fef 544 * @i_len
nyatla 0:142ee8b12fef 545 * イーサネットペイロードのサイズです。
nyatla 0:142ee8b12fef 546 */
nyatla 0:142ee8b12fef 547 static void sendRawEthFrame(void* i_buf,NyLPC_TUInt16 i_len)
nyatla 0:142ee8b12fef 548 {
nyatla 0:142ee8b12fef 549 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 550
nyatla 0:142ee8b12fef 551 //ACK送信用の自己バッファが空くまで待つ
nyatla 0:142ee8b12fef 552 while(inst->stx.h.is_lock){
nyatla 0:142ee8b12fef 553 inst->_ethif->processTx();
nyatla 0:142ee8b12fef 554 }
nyatla 0:142ee8b12fef 555 //64バイトを超えるとかありえない。
nyatla 0:142ee8b12fef 556 if(i_len+sizeof(struct NyLPC_TEthernetIIHeader)>NyLPC_TcUipService_SIZE_OF_REPLY_BUF){
nyatla 0:142ee8b12fef 557 return;
nyatla 0:142ee8b12fef 558 }
nyatla 0:142ee8b12fef 559 //送信する。
nyatla 0:142ee8b12fef 560 memcpy(inst->stx.buf,i_buf,i_len);
nyatla 0:142ee8b12fef 561 inst->_ethif->sendTxEthFrame(&(inst->stx.h),i_len);
nyatla 0:142ee8b12fef 562 return;
nyatla 0:142ee8b12fef 563 }
nyatla 0:142ee8b12fef 564
nyatla 0:142ee8b12fef 565
nyatla 0:142ee8b12fef 566 /**
nyatla 0:142ee8b12fef 567 * ペイロードをIPパケットとしてネットワークへ送出します。
nyatla 0:142ee8b12fef 568 * コール前に、必ずロックしてから呼び出してください。
nyatla 0:142ee8b12fef 569 * @param i_eth_payload
nyatla 0:142ee8b12fef 570 * allocTxBufで確保したメモリを指定してください。
nyatla 0:142ee8b12fef 571 * ペイロードには、TCP/IPパケットを格納します。
nyatla 0:142ee8b12fef 572 */
nyatla 0:142ee8b12fef 573 static NyLPC_TBool sendIPv4Tx(struct NyLPC_TTxBufferHeader* i_eth_buf)
nyatla 0:142ee8b12fef 574 {
nyatla 0:142ee8b12fef 575 NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 576 NyLPC_TUInt16 tx_len;
nyatla 0:142ee8b12fef 577 struct TEthPacket* ethbuf=(struct TEthPacket*)(i_eth_buf+1);
nyatla 0:142ee8b12fef 578 NyLPC_Trace();
nyatla 0:142ee8b12fef 579 //ペイロードのアドレスから、イーサネットフレームバッファのアドレスを復元
nyatla 0:142ee8b12fef 580 //const struct NyLPC_TEthAddr* eth_dest=uip_arp_IPv4toEthAddr(ethbuf->data.ipv4.destipaddr);
nyatla 0:142ee8b12fef 581 const struct NyLPC_TEthAddr* eth_dest=NyLPC_cIPv4Arp_IPv4toEthAddr(&inst->_arp,ethbuf->data.ipv4.destipaddr);
nyatla 0:142ee8b12fef 582 //IP->MAC変換をテスト。
nyatla 0:142ee8b12fef 583 if(eth_dest==NULL){
nyatla 0:142ee8b12fef 584 //失敗
nyatla 0:142ee8b12fef 585 NyLPC_Trace();
nyatla 0:142ee8b12fef 586 return NyLPC_TBool_FALSE;
nyatla 0:142ee8b12fef 587 }
nyatla 0:142ee8b12fef 588 NyLPC_Trace();
nyatla 0:142ee8b12fef 589 //変換可能なら、イーサネットヘッダを更新して、送信処理へ。
nyatla 0:142ee8b12fef 590 tx_len=NyLPC_TEthernetIIHeader_setIPv4Tx(&(ethbuf->header),&(inst->_ref_config->eth_mac),eth_dest);
nyatla 0:142ee8b12fef 591 inst->_ethif->sendTxEthFrame(i_eth_buf,tx_len);
nyatla 0:142ee8b12fef 592 NyLPC_Trace();
nyatla 0:142ee8b12fef 593 return NyLPC_TBool_TRUE;
nyatla 0:142ee8b12fef 594 }
nyatla 0:142ee8b12fef 595
nyatla 0:142ee8b12fef 596
nyatla 0:142ee8b12fef 597
nyatla 0:142ee8b12fef 598 //static void startEther()
nyatla 0:142ee8b12fef 599 //{
nyatla 0:142ee8b12fef 600 // NyLPC_TcUipService_t* inst=_NyLPC_TcUipService_inst;
nyatla 0:142ee8b12fef 601 //
nyatla 0:142ee8b12fef 602 // //Ethernetの起動待ち
nyatla 0:142ee8b12fef 603 // while(lEMACInit(_NyLPC_TcUipService_inst->_emac_semapho,&(inst->_ref_config->eth_mac))!= pdPASS )
nyatla 0:142ee8b12fef 604 // {
nyatla 0:142ee8b12fef 605 // vTaskDelay( 100 / portTICK_RATE_MS );
nyatla 0:142ee8b12fef 606 // }
nyatla 0:142ee8b12fef 607 // //Ethernetの割込み開始設定
nyatla 0:142ee8b12fef 608 // portENTER_CRITICAL();
nyatla 0:142ee8b12fef 609 // {
nyatla 0:142ee8b12fef 610 // LPC_EMAC->IntEnable = ( INT_RX_DONE | INT_TX_DONE );
nyatla 0:142ee8b12fef 611 // /* Set the interrupt priority to the max permissible to cause some
nyatla 0:142ee8b12fef 612 // interrupt nesting. */
nyatla 0:142ee8b12fef 613 // NVIC_SetPriority( ENET_IRQn, configEMAC_INTERRUPT_PRIORITY );
nyatla 0:142ee8b12fef 614 //
nyatla 0:142ee8b12fef 615 // /* Enable the interrupt. */
nyatla 0:142ee8b12fef 616 // NVIC_EnableIRQ( ENET_IRQn );
nyatla 0:142ee8b12fef 617 // }
nyatla 0:142ee8b12fef 618 // portEXIT_CRITICAL();
nyatla 0:142ee8b12fef 619 //}
nyatla 0:142ee8b12fef 620 //
nyatla 0:142ee8b12fef 621 //static void stopEther()
nyatla 0:142ee8b12fef 622 //{
nyatla 0:142ee8b12fef 623 // portENTER_CRITICAL();
nyatla 0:142ee8b12fef 624 // {
nyatla 0:142ee8b12fef 625 // LPC_EMAC->IntEnable = (~(INT_RX_DONE|INT_TX_DONE))&LPC_EMAC->IntEnable;
nyatla 0:142ee8b12fef 626 // NVIC_DisableIRQ( ENET_IRQn );
nyatla 0:142ee8b12fef 627 // }
nyatla 0:142ee8b12fef 628 // portEXIT_CRITICAL();
nyatla 20:3b0b444b4deb 629 //}
nyatla 20:3b0b444b4deb 630