source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tinet/netdev/if_btusb/if_btusb.c@ 374

Last change on this file since 374 was 374, checked in by coas-nagasima, 5 years ago

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 17.7 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2009 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 * Copyright (C) 2014-2017 by Cores Co., Ltd. Japan
7 *
8 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
9 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
10 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
11 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
12 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
13 * スコード中に含まれていること.
14 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
15 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
16 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
17 * の無保証規定を掲載すること.
18 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
19 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
20 * と.
21 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
22 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
23 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
24 * 報告すること.
25 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
26 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
28 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
29 * 免責すること.
30 *
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
33 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
34 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
35 * の責任を負わない.
36 *
37 * @(#) $Id$
38 */
39
40/*
41 * Copyright (c) 1995, David Greenman
42 * All rights reserved.
43 *
44 * Redistribution and use in source and binary forms, with or without
45 * modification, are permitted provided that the following conditions
46 * are met:
47 * 1. Redistributions of source code must retain the above copyright
48 * notice unmodified, this list of conditions, and the following
49 * disclaimer.
50 * 2. Redistributions in binary form must reproduce the above copyright
51 * notice, this list of conditions and the following disclaimer in the
52 * documentation and/or other materials provided with the distribution.
53 *
54 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
55 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
56 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
57 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
58 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
59 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
60 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
61 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
62 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
63 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
64 * SUCH DAMAGE.
65 *
66 * $FreeBSD: src/sys/i386/isa/if_ed.c,v 1.148.2.4 1999/09/25 13:08:18 nyan Exp $
67 */
68
69#define __BTSTACK_FILE__ "if_btusb.c"
70
71#ifdef TARGET_KERNEL_ASP
72
73#define CAST(type, val) ((type)(val))
74
75#include <kernel.h>
76#include <sil.h>
77#include <t_syslog.h>
78#include "kernel_cfg.h"
79#include "kernel/kernel_impl.h"
80#include "btstack/utils.h"
81#include "bt_main.h"
82#include "usb_hbth.h"
83//#include "hal_cpu.h"
84//#include "hal_tick.h"
85#include "hci.h"
86#include "debug.h"
87
88#endif /* of #ifdef TARGET_KERNEL_ASP */
89
90#ifdef TARGET_KERNEL_JSP
91
92#include <s_services.h>
93#include <t_services.h>
94#include "kernel_id.h"
95
96#endif /* of #ifdef TARGET_KERNEL_JSP */
97
98#include <tinet_defs.h>
99#include <tinet_config.h>
100
101#include <net/if.h>
102#include <net/ethernet.h>
103#include <net/if_arp.h>
104#include <net/net.h>
105#include <net/net_timer.h>
106#include <net/net_count.h>
107#include <net/net_buf.h>
108#include "if_btusb.h"
109
110#include <string.h>
111
112#ifdef _MSC_VER
113#include <stdlib.h>
114#endif
115
116#ifndef TMO_IF_BTUSB_GET_NET_BUF
117#define TMO_IF_BTUSB_GET_NET_BUF ULONG_C(1000000) /* [us] */
118#endif
119
120uint8_t mac_addr[ETHER_ADDR_LEN];
121static void (*btstack_network_send_packet_callback)(uint16_t bnep_cid, const uint8_t * packet, uint16_t size);
122
123int btstack_network_input_spos = 0;
124int btstack_network_input_rpos = 0;
125T_NET_BUF *btstack_network_input[NUM_IF_BTUSB_RXBUF];
126
127int btstack_network_output_spos = 0;
128int btstack_network_output_rpos = 0;
129T_NET_BUF *btstack_network_output[NUM_IF_BTUSB_TXBUF];
130
131/*
132 * ネットワークインタフェースに依存するソフトウェア情報
133 */
134
135typedef struct t_btusb_softc {
136 uint16_t bnep_cid;
137 char bnep_name[10];
138 bool_t over_flow;
139} T_BTUSB_SOFTC;
140
141/*
142 * ネットワークインタフェースのソフトウェア情報
143 */
144
145/* ネットワークインタフェースに依存するソフトウェア情報 */
146
147static T_BTUSB_SOFTC btusb_softc;
148
149/* ネットワークインタフェースに依存しないソフトウェア情報 */
150
151T_IF_SOFTC if_softc = {
152 {{0,}}, /* ネットワークインタフェースのアドレス */
153 0, /* 送信タイムアウト */
154 &btusb_softc, /* ディバイス依存のソフトウェア情報 */
155 SEM_IF_BTUSB_SBUF_READY, /* 送信セマフォ */
156 SEM_IF_BTUSB_RBUF_READY, /* 受信セマフォ */
157
158#ifdef SUPPORT_INET6
159
160 IF_MADDR_INIT, /* マルチキャストアドレスリスト */
161
162#endif /* of #ifdef SUPPORT_INET6 */
163};
164
165/*
166 * 局所変数
167 */
168
169static void btusb_stop (T_BTUSB_SOFTC *sc);
170static void btusb_init_sub (T_IF_SOFTC *ic);
171
172#ifdef SUPPORT_INET6
173
174static uint32_t ds_crc (uint8_t *addr);
175static void ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf);
176
177/*
178 * ds_crc -- イーサネットアドレスの CRC を計算する。
179 */
180
181#define POLYNOMIAL 0x04c11db6
182
183static uint32_t
184ds_crc (uint8_t *addr)
185{
186 uint32_t crc = ULONG_C(0xffffffff);
187 int_t carry, len, bit;
188 uint8_t byte;
189
190 for (len = ETHER_ADDR_LEN; len -- > 0; ) {
191 byte = *addr ++;
192 for (bit = 8; bit -- > 0; ) {
193 carry = ((crc & ULONG_C(0x80000000)) ? 1 : 0) ^ (byte & UINT_C(0x01));
194 crc <<= 1;
195 byte >>= 1;
196 if (carry)
197 crc = (crc ^ POLYNOMIAL) | carry;
198 }
199 }
200 return crc;
201}
202
203#undef POLYNOMIAL
204
205/*
206 * ds_getmcaf -- マルチキャストアドレスのリストからマルチキャストアドレス
207 * フィルタを計算する。
208 */
209
210static void
211ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf)
212{
213 uint32_t count, index;
214 uint8_t *af = (uint8_t*)mcaf;
215
216 mcaf[0] = mcaf[1] = 0;
217
218 for (count = MAX_IF_MADDR_CNT; count -- > 0; ) {
219 index = ds_crc(ic->maddrs[count].lladdr) >> 26;
220 af[index >> 3] |= 1 << (index & 7);
221 }
222}
223
224/*
225 * btusb_setrcr -- 受信構成レジスタ (RCR) を設定する。
226 */
227
228static void
229btusb_setrcr (T_IF_SOFTC *ic)
230{
231}
232
233/*
234 * btusb_addmulti -- マルチキャストアドレスを追加する。
235 */
236
237ER
238btusb_addmulti (T_IF_SOFTC *ic)
239{
240 btusb_setrcr(ic);
241 return E_OK;
242}
243
244#endif /* of #ifdef SUPPORT_INET6 */
245
246void btstack_network_init(void (*send_packet_callback)(uint16_t bnep_cid, const uint8_t * packet, uint16_t size))
247{
248 btstack_network_send_packet_callback = send_packet_callback;
249}
250
251void btstack_network_up(uint16_t bnep_cid, bd_addr_t local_addr, bd_addr_t remote_addr)
252{
253 T_BTUSB_SOFTC *sc = if_softc.sc;
254
255 sc->bnep_cid = bnep_cid;
256
257 /* MACアドレスを更新 */
258 memcpy(if_softc.ifaddr.lladdr, local_addr, sizeof(if_softc.ifaddr.lladdr));
259
260 snprintf(sc->bnep_name, sizeof(sc->bnep_name), "BNEP%04x", bnep_cid);
261
262 ether_set_link_up();
263}
264
265const char * btstack_network_get_name(uint16_t bnep_cid)
266{
267 T_BTUSB_SOFTC *sc = if_softc.sc;
268
269 return sc->bnep_name;
270}
271
272int btstack_network_down(uint16_t bnep_cid)
273{
274 T_BTUSB_SOFTC *sc = if_softc.sc;
275
276 if (sc->bnep_cid != bnep_cid)
277 log_info("btstack_network_down(bnep_cid=%d)", bnep_cid);
278
279 ether_set_link_down();
280
281 sc->bnep_cid = 0;
282
283 return 0;
284}
285
286/*
287 * btusb_stop -- ネットワークインタフェースを停止する。
288 *
289 * 注意: NIC 割り込み禁止状態で呼び出すこと。
290 */
291
292static void
293btusb_stop (T_BTUSB_SOFTC *sc)
294{
295}
296
297void btusb_bus_init() {}
298void btusb_inter_init() {}
299
300/*
301 * btusb_init_sub -- ネットワークインタフェースの初期化
302 *
303 * 注意: NIC 割り込み禁止状態で呼び出すこと。
304 */
305
306static void
307btusb_init_sub (T_IF_SOFTC *ic)
308{
309#if defined(TARGET_KERNEL_ASP)
310
311 /* ターゲット依存部の割込み初期化 */
312 btusb_inter_init();
313
314#endif /* of #if defined(TARGET_KERNEL_ASP) */
315
316#if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u /* JSP-1.4.2 以降 */
317
318 /* ターゲット依存部の割込み初期化 */
319 btusb_inter_init();
320
321#endif /* of #if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u */
322}
323
324/*
325 * btusb_reset -- ネットワークインタフェースをリセットする。
326 */
327
328void
329btusb_reset (T_IF_SOFTC *ic)
330{
331 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_RESETS], 1);
332 btusb_stop(ic->sc);
333 btusb_init_sub(ic);
334}
335
336/*
337 * get_btusb_softc -- ネットワークインタフェースのソフトウェア情報を返す。
338 */
339
340T_IF_SOFTC *
341btusb_get_softc (void)
342{
343 return &if_softc;
344}
345
346/*
347 * btusb_watchdog -- ネットワークインタフェースのワッチドッグタイムアウト
348 */
349
350void
351btusb_watchdog (T_IF_SOFTC *ic)
352{
353 btusb_reset(ic);
354}
355
356/*
357 * btusb_probe -- ネットワークインタフェースの検出
358 */
359
360void
361btusb_probe (T_IF_SOFTC *ic)
362{
363 int i;
364#if defined(TARGET_KERNEL_ASP)
365
366 /* ターゲット依存部のバスの初期化 */
367 btusb_bus_init();
368
369#endif /* of #if defined(TARGET_KERNEL_ASP) */
370#if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u /* JSP-1.4.2 以降 */
371
372 /* ターゲット依存部のバスの初期化 */
373 btusb_bus_init();
374
375#endif /* of #if defined(TARGET_KERNEL_JSP) && TKERNEL_PRVER >= 0x1042u */
376
377 for(i = 0; i < ETHER_ADDR_LEN; i++){
378 ic->ifaddr.lladdr[i] = mac_addr[i];
379 }
380}
381
382/*
383 * btusb_init -- ネットワークインタフェースの初期化
384 */
385
386void
387btusb_init (T_IF_SOFTC *ic)
388{
389 /* btusb_init 本体を呼び出す。*/
390 btusb_init_sub(ic);
391}
392
393/*
394 * btstack_network_process_packet -- btstackからフレームの受信
395 */
396
397void
398btstack_network_process_packet(uint16_t bnep_cid, const uint8_t * packet, uint16_t size)
399{
400 T_BTUSB_SOFTC *sc = if_softc.sc;
401 T_NET_BUF *input = NULL;
402 uint16_t align;
403 uint8_t *dst;
404 ER error;
405
406 if (sc->bnep_cid != bnep_cid)
407 log_info("btstack_network_process_packet(bnep_cid=%d)", bnep_cid);
408
409 // 受信バッファがいっぱい
410 if (btstack_network_input[btstack_network_input_spos] != NULL) {
411 sc->over_flow = true;
412 return;
413 }
414
415 /*
416 * +-----------+--------+---------+---------+
417 * | Ehter HDR | IP HDR | TCP HDR | TCP SDU |
418 * +-----------+--------+---------+---------+
419 * 14 20 20 n
420 * <----------------- len ---------------->
421 * ^
422 * t_net_buf で 4 オクテット境界にアラインされている。
423 *
424 * tcp_input と udp_input では、擬似ヘッダと SDU でチェックサムを
425 * 計算するが、n が 4 オクテット境界になるように SDU の後ろに 0 を
426 * パッディングする。その分を考慮して net_buf を獲得しなければならない。
427 */
428 align = ((((size - sizeof(T_IF_HDR)) + 3) >> 2) << 2) + sizeof(T_IF_HDR);
429
430 if ((error = tget_net_buf(&input, align, TMO_IF_BTUSB_GET_NET_BUF)) == E_OK && input != NULL) {
431 dst = input->buf + IF_ETHER_NIC_HDR_ALIGN;
432 memcpy(dst, (void *)packet, size);
433
434 loc_cpu();
435
436 btstack_network_input[btstack_network_input_spos] = input;
437 btstack_network_input_spos++;
438 if (btstack_network_input_spos == NUM_IF_BTUSB_RXBUF)
439 btstack_network_input_spos = 0;
440
441 unl_cpu();
442
443 sig_sem(if_softc.semid_rxb_ready);
444 }
445}
446
447/*
448 * btusb_read -- フレームの読み込み
449 */
450
451T_NET_BUF *
452btusb_read (T_IF_SOFTC *ic)
453{
454 T_BTUSB_SOFTC *sc = ic->sc;
455 T_NET_BUF *input;
456
457 if (sc->over_flow) {
458 sc->over_flow = false;
459 }
460
461 loc_cpu();
462
463 input = btstack_network_input[btstack_network_input_rpos];
464 btstack_network_input[btstack_network_input_rpos] = NULL;
465 btstack_network_input_rpos++;
466 if (btstack_network_input_rpos == NUM_IF_BTUSB_RXBUF)
467 btstack_network_input_rpos = 0;
468
469 unl_cpu();
470
471 if (input == NULL) {
472 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_IN_ERR_PACKETS], 1);
473 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_NO_BUFS], 1);
474 }
475
476 return input;
477}
478
479/*
480 * btusb_start -- 送信フレームをバッファリングする。
481 */
482
483void
484btusb_start (T_IF_SOFTC *ic, T_NET_BUF *output)
485{
486 T_BTUSB_SOFTC *sc = ic->sc;
487 bool_t send = (btstack_network_output_spos == btstack_network_output_rpos)
488 && (btstack_network_output[btstack_network_output_rpos] == NULL);
489
490 if ((btstack_network_send_packet_callback == NULL)
491 || !bt_can_send_packet()) {
492 sig_sem(if_softc.semid_txb_ready);
493 return;
494 }
495
496 output->flags |= NB_FLG_NOREL_IFOUT;
497
498 loc_cpu();
499
500 btstack_network_output[btstack_network_output_spos] = output;
501 btstack_network_output_spos++;
502 if (btstack_network_output_spos == NUM_IF_BTUSB_TXBUF)
503 btstack_network_output_spos = 0;
504
505 unl_cpu();
506
507 if (send)
508 btstack_network_send_packet_callback(sc->bnep_cid, output->buf, output->len);
509}
510
511/*
512 * btstack_network_packet_sent -- バッファした送信フレームの送信が完了する。
513 */
514
515void
516btstack_network_packet_sent(uint16_t bnep_cid)
517{
518 T_BTUSB_SOFTC *sc = if_softc.sc;
519 T_NET_BUF *rel, *output;
520
521 if (sc->bnep_cid != bnep_cid)
522 log_info("btstack_network_packet_sent(bnep_cid=%d)", bnep_cid);
523
524 loc_cpu();
525
526 rel = btstack_network_output[btstack_network_output_rpos];
527 btstack_network_output[btstack_network_output_rpos] = NULL;
528 btstack_network_output_rpos++;
529 if (btstack_network_output_rpos == NUM_IF_BTUSB_TXBUF)
530 btstack_network_output_rpos = 0;
531
532 output = btstack_network_output[btstack_network_output_rpos];
533
534 unl_cpu();
535
536 if (rel != NULL)
537 rel_net_buf(rel);
538
539 sig_sem(if_softc.semid_txb_ready);
540
541 if (output != NULL)
542 btstack_network_send_packet_callback(sc->bnep_cid, output->buf, output->len);
543}
544
545static void dummy_handler(void) {};
546static void(*tick_handler)(void) = &dummy_handler;
547void hal_tick_handler();
548
549void hal_tick_init(void)
550{
551 // timer_regist_userfunc(hal_tick_handler);
552}
553
554void hal_tick_set_handler(void(*handler)(void))
555{
556 if (handler == NULL) {
557 tick_handler = &dummy_handler;
558 return;
559 }
560 tick_handler = handler;
561}
562
563int hal_tick_get_tick_period_in_ms(void)
564{
565 return 1;
566}
567
568void hal_tick_handler()
569{
570 tick_handler();
571}
572
573uint32_t hal_time_ms(void)
574{
575 SYSTIM time;
576 get_tim(&time);
577 return time / 1000;
578}
579
580void hal_cpu_disable_irqs(void)
581{
582 loc_cpu();
583}
584
585void hal_cpu_enable_irqs(void)
586{
587 unl_cpu();
588}
589
590int btstack_sleep = 0;
591
592void hal_cpu_enable_irqs_and_sleep(void)
593{
594 unl_cpu();
595 btstack_sleep = 1;
596}
597
598//#define PACKET_DUMP
599static void usb_dummy_handler(uint8_t packet_type, uint8_t *packet, uint16_t size);
600static void(*usb_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size) = usb_dummy_handler;
601
602void usb_bt_callback(uint8_t event_type, uint8_t *data, int size)
603{
604#ifdef PACKET_DUMP
605 int len = size;
606
607 switch (event_type) {
608 case HCI_EVENT_PACKET:
609 printf("EVT <= ");
610 break;
611 case HCI_ACL_DATA_PACKET:
612 printf("ACL <= ");
613 break;
614 default:
615 printf("??? <= ");
616 break;
617 }
618
619 if (len > 256)
620 len = 256;
621 printf_hexdump(data, len);
622#endif
623 usb_packet_handler(event_type, data, size);
624}
625
626static void usb_init(const void *transport_config)
627{
628
629}
630
631static int usb_open(void *transport_config)
632{
633 return 0;
634}
635
636static int usb_close(void *transport_config)
637{
638 return 0;
639}
640
641static int usb_send_packet(uint8_t packet_type, uint8_t *packet, int size)
642{
643 int r;
644#ifdef PACKET_DUMP
645 int len = size;
646 if (len > 256)
647 len = 256;
648#endif
649 switch (packet_type) {
650 case HCI_COMMAND_DATA_PACKET:
651#ifdef PACKET_DUMP
652 printf("CMD => ");
653 printf_hexdump(packet, len);
654#endif
655 r = bt_usb_hbth_control_write(packet, size);
656 if (r < 0 || r != size) {
657 log_error("Error submitting control transfer %d", r);
658 return -1;
659 }
660 return 0;
661 case HCI_ACL_DATA_PACKET:
662#ifdef PACKET_DUMP
663 printf("ACL => ");
664 printf_hexdump(packet, len);
665#endif
666 if (size >= 1024)
667 printf("HCI_ACL_DATA_PACKET size=%d\n", size);
668 r = bt_usb_hbth_bulk_write(packet, size);
669 if (r < 0) {
670 log_error("Error submitting data transfer, %d", r);
671 return -1;
672 }
673 return 0;
674 default:
675 return -1;
676 }
677}
678
679static void usb_register_packet_handler(void(*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size))
680{
681 log_info("registering packet handler.");
682 usb_packet_handler = handler;
683}
684
685static const char * usb_get_transport_name(void){
686 return "USB";
687}
688
689static void usb_dummy_handler(uint8_t packet_type, uint8_t *packet, uint16_t size)
690{
691}
692
693// single instance
694static const hci_transport_t hci_transport_usb =
695{
696 /*.open =*/ usb_open,
697 /*.close =*/ usb_close,
698 /*.send_packet =*/ usb_send_packet,
699 /*.register_packet_handler =*/ usb_register_packet_handler,
700 /*.get_transport_name =*/ usb_get_transport_name,
701 /*.set_baudrate =*/ NULL,
702 /*.can_send_packet_now =*/ NULL
703};
704
705// get usb singleton
706const hci_transport_t *hci_transport_usb_instance()
707{
708 return &hci_transport_usb;
709}
Note: See TracBrowser for help on using the repository browser.