source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/tinet/netdev/if_enbt/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: 16.9 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#define CAST(type, val) ((type)(val))
72
73#include <kernel.h>
74#include <sil.h>
75#include <t_syslog.h>
76#include "kernel_cfg.h"
77#include "kernel/kernel_impl.h"
78#include "btstack/utils.h"
79#include "bt_main.h"
80#include "usb_hbth.h"
81//#include "hal_cpu.h"
82//#include "hal_tick.h"
83#include "hci.h"
84#include "debug.h"
85
86#include <tinet_defs.h>
87#include <tinet_config.h>
88
89#include <net/if.h>
90#include <net/ethernet.h>
91#include <net/if_arp.h>
92#include <net/net.h>
93#include <net/net_timer.h>
94#include <net/net_count.h>
95#include <net/net_buf.h>
96#include "if_mbed.h"
97#include "if_btusb.h"
98
99#include <string.h>
100
101#ifdef _MSC_VER
102#include <stdlib.h>
103#endif
104
105#ifndef TMO_IF_BTUSB_GET_NET_BUF
106#define TMO_IF_BTUSB_GET_NET_BUF ULONG_C(1000000) /* [us] */
107#endif
108
109static void (*btstack_network_send_packet_callback)(uint16_t bnep_cid, const uint8_t * packet, uint16_t size);
110
111int btstack_network_output_spos = 0;
112int btstack_network_output_rpos = 0;
113T_NET_BUF *btstack_network_output[NUM_IF_BTUSB_TXBUF];
114
115/*
116 * ネットワークインタフェースのソフトウェア情報
117 */
118
119/* ネットワークインタフェースに依存するソフトウェア情報 */
120
121//static int connection_count;
122
123
124/*
125 * 局所変数
126 */
127
128static void btusb_stop (T_BTUSB_SOFTC *sc);
129static void btusb_init_sub (T_IF_SOFTC *ic);
130
131#ifdef SUPPORT_INET6
132
133static uint32_t ds_crc (uint8_t *addr);
134static void ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf);
135
136/*
137 * ds_crc -- イーサネットアドレスの CRC を計算する。
138 */
139
140#define POLYNOMIAL 0x04c11db6
141
142static uint32_t
143ds_crc (uint8_t *addr)
144{
145 uint32_t crc = ULONG_C(0xffffffff);
146 int_t carry, len, bit;
147 uint8_t byte;
148
149 for (len = ETHER_ADDR_LEN; len -- > 0; ) {
150 byte = *addr ++;
151 for (bit = 8; bit -- > 0; ) {
152 carry = ((crc & ULONG_C(0x80000000)) ? 1 : 0) ^ (byte & UINT_C(0x01));
153 crc <<= 1;
154 byte >>= 1;
155 if (carry)
156 crc = (crc ^ POLYNOMIAL) | carry;
157 }
158 }
159 return crc;
160}
161
162#undef POLYNOMIAL
163
164/*
165 * ds_getmcaf -- マルチキャストアドレスのリストからマルチキャストアドレス
166 * フィルタを計算する。
167 */
168
169static void
170ds_getmcaf (T_IF_SOFTC *ic, uint32_t *mcaf)
171{
172 uint32_t count, index;
173 uint8_t *af = (uint8_t*)mcaf;
174
175 mcaf[0] = mcaf[1] = 0;
176
177 for (count = MAX_IF_MADDR_CNT; count -- > 0; ) {
178 index = ds_crc(ic->maddrs[count].lladdr) >> 26;
179 af[index >> 3] |= 1 << (index & 7);
180 }
181}
182
183/*
184 * btusb_setrcr -- 受信構成レジスタ (RCR) を設定する。
185 */
186
187static void
188btusb_setrcr (T_IF_SOFTC *ic)
189{
190}
191
192/*
193 * btusb_addmulti -- マルチキャストアドレスを追加する。
194 */
195
196ER
197btusb_addmulti (T_IF_SOFTC *ic)
198{
199 btusb_setrcr(ic);
200 return E_OK;
201}
202
203#endif /* of #ifdef SUPPORT_INET6 */
204
205T_BTUSB_SOFTC *get_softc(T_IF_SOFTC *ic, uint16_t bnep_cid)
206{
207 T_BTUSB_SOFTC *sc = ic->sc->btusb;
208
209 for (int i = 0; i < MAX_PAN_CONNECTIONS; i++) {
210 if (sc->bnep_cid == bnep_cid)
211 return sc;
212 sc++;
213 }
214
215 return NULL;
216}
217
218void btstack_network_init(void (*send_packet_callback)(uint16_t bnep_cid, const uint8_t * packet, uint16_t size))
219{
220 btstack_network_send_packet_callback = send_packet_callback;
221}
222
223void btstack_network_up(uint16_t bnep_cid, bd_addr_t local_addr, bd_addr_t remote_addr)
224{
225 T_IF_SOFTC *ic = &if_softc;
226 T_BTUSB_SOFTC *sc = get_softc(ic, 0);
227
228 if (sc == NULL) {
229 log_info("btstack_network_up no space");
230 return;
231 }
232
233 sc->bnep_cid = bnep_cid;
234
235 /* MACアドレスを更新 */
236 memcpy(sc->bd_addr, remote_addr, sizeof(sc->bd_addr));
237
238 snprintf(sc->bnep_name, sizeof(sc->bnep_name), "BNEP%04x", bnep_cid);
239
240 //connection_count++;
241 //if (connection_count == 1)
242 // ether_set_link_up(ic);
243}
244
245const char * btstack_network_get_name(uint16_t bnep_cid)
246{
247 T_IF_SOFTC *ic = &if_softc;
248 T_BTUSB_SOFTC *sc = get_softc(ic, bnep_cid);
249
250 if (sc == NULL) {
251 return "???";
252 }
253
254 return sc->bnep_name;
255}
256
257int btstack_network_down(uint16_t bnep_cid)
258{
259 T_IF_SOFTC *ic = &if_softc;
260 T_BTUSB_SOFTC *sc = get_softc(ic, bnep_cid);
261
262 if (sc == NULL) {
263 log_info("btstack_network_down(bnep_cid=%d)", bnep_cid);
264 return -1;
265 }
266
267 //connection_count--;
268 //if (connection_count == 0)
269 // ether_set_link_down(ic);
270
271 sc->bnep_cid = 0;
272
273 return 0;
274}
275
276/*
277 * btusb_stop -- ネットワークインタフェースを停止する。
278 *
279 * 注意: NIC 割り込み禁止状態で呼び出すこと。
280 */
281
282static void
283btusb_stop (T_BTUSB_SOFTC *sc)
284{
285}
286
287void btusb_bus_init() {}
288void btusb_inter_init() {}
289
290/*
291 * btusb_init_sub -- ネットワークインタフェースの初期化
292 *
293 * 注意: NIC 割り込み禁止状態で呼び出すこと。
294 */
295
296static void
297btusb_init_sub (T_IF_SOFTC *ic)
298{
299 /* ターゲット依存部の割込み初期化 */
300 btusb_inter_init();
301}
302
303/*
304 * btusb_reset -- ネットワークインタフェースをリセットする。
305 */
306
307void
308btusb_reset (T_IF_SOFTC *ic)
309{
310 T_BTUSB_SOFTC *sc = ic->sc->btusb;
311
312 NET_COUNT_ETHER_NIC(net_count_ether_nic[NC_ETHER_NIC_RESETS], 1);
313
314 for (int i = 0; i < MAX_PAN_CONNECTIONS; i++) {
315 if (sc->bnep_cid != 0)
316 btusb_stop(sc);
317 sc++;
318 }
319
320 btusb_init_sub(ic);
321}
322
323/*
324 * btusb_watchdog -- ネットワークインタフェースのワッチドッグタイムアウト
325 */
326
327void
328btusb_watchdog (T_IF_SOFTC *ic)
329{
330 btusb_reset(ic);
331}
332
333/*
334 * btusb_probe -- ネットワークインタフェースの検出
335 */
336
337void
338btusb_probe (T_IF_SOFTC *ic)
339{
340 /* ターゲット依存部のバスの初期化 */
341 btusb_bus_init();
342}
343
344/*
345 * btusb_init -- ネットワークインタフェースの初期化
346 */
347
348void
349btusb_init (T_IF_SOFTC *ic)
350{
351 /* btusb_init 本体を呼び出す。*/
352 btusb_init_sub(ic);
353}
354
355/*
356 * btstack_network_process_packet -- btstackからフレームの受信
357 */
358
359void
360btstack_network_process_packet(uint16_t bnep_cid, const uint8_t * packet, uint16_t size)
361{
362 T_IF_SOFTC *ic = &if_softc;
363 T_BTUSB_SOFTC *sc = get_softc(ic, bnep_cid);
364 T_NET_BUF *input = NULL;
365 uint16_t align;
366 uint8_t *dst;
367 ER error;
368
369 if (sc == NULL) {
370 log_info("btstack_network_process_packet(bnep_cid=%d)", bnep_cid);
371 return;
372 }
373
374 /*
375 * +-----------+--------+---------+---------+
376 * | Ehter HDR | IP HDR | TCP HDR | TCP SDU |
377 * +-----------+--------+---------+---------+
378 * 14 20 20 n
379 * <----------------- len ---------------->
380 * ^
381 * t_net_buf で 4 オクテット境界にアラインされている。
382 *
383 * tcp_input と udp_input では、擬似ヘッダと SDU でチェックサムを
384 * 計算するが、n が 4 オクテット境界になるように SDU の後ろに 0 を
385 * パッディングする。その分を考慮して net_buf を獲得しなければならない。
386 */
387 align = ((((size - sizeof(T_IF_HDR)) + 3) >> 2) << 2) + sizeof(T_IF_HDR);
388
389 if ((error = tget_net_buf(&input, align, TMO_IF_BTUSB_GET_NET_BUF)) == E_OK && input != NULL) {
390 dst = input->buf + IF_ETHER_NIC_HDR_ALIGN;
391 memcpy(dst, (void *)packet, size);
392
393 if_mbed_start(ic, input);
394
395 rel_net_buf(input);
396 }
397
398 /* BMEP側にも転送(マルチキャストと宛先MACアドレスがあるもの) */
399 if ((error = tget_net_buf(&input, align, TMO_IF_BTUSB_GET_NET_BUF)) == E_OK && input != NULL) {
400 dst = input->buf + IF_ETHER_NIC_HDR_ALIGN;
401 memcpy(dst, (void *)packet, size);
402
403 int rel = btusb_start(ic, input);
404 if (rel) {
405 rel_net_buf(input);
406 }
407 }
408}
409
410/*
411 * btusb_start -- 送信フレームをバッファリングする。
412 */
413
414int
415btusb_start (T_IF_SOFTC *ic, T_NET_BUF *output)
416{
417 T_BTUSB_SOFTC *sc = ic->sc->btusb;
418 T_ETHER_HDR *eth = GET_ETHER_HDR(output);
419 bool_t send = (btstack_network_output_spos == btstack_network_output_rpos)
420 && (btstack_network_output[btstack_network_output_rpos] == NULL);
421 bool_t enqueue = false;
422
423 if ((btstack_network_send_packet_callback == NULL)
424 || ((btstack_network_output_spos == btstack_network_output_rpos)
425 && (btstack_network_output[btstack_network_output_rpos] != NULL))) {
426 sig_sem(ic->semid_rxb_ready);
427 return 1;
428 }
429
430 output->conn_pos = 0;
431
432 if (send) {
433 while (output->conn_pos < MAX_PAN_CONNECTIONS) {
434 if ((sc->bnep_cid != 0)
435 && ((*eth->dhost & ETHER_MCAST_ADDR) || memcmp(eth->dhost, sc->bd_addr, sizeof(eth->dhost)) == 0)) {
436 enqueue = true;
437 break;
438 }
439 output->conn_pos++;
440 sc++;
441 }
442 }
443 else
444 enqueue = true;
445
446 if (enqueue) {
447 loc_cpu();
448
449 btstack_network_output[btstack_network_output_spos] = output;
450 btstack_network_output_spos++;
451 if (btstack_network_output_spos == NUM_IF_BTUSB_TXBUF)
452 btstack_network_output_spos = 0;
453
454 unl_cpu();
455 }
456 else {
457 sig_sem(ic->semid_rxb_ready);
458 return 1;
459 }
460
461 if (!send)
462 return 0;
463
464 btstack_network_send_packet_callback(sc->bnep_cid, output->buf, output->len);
465
466 return 0;
467}
468
469/*
470 * btstack_network_packet_sent -- バッファした送信フレームの送信が完了する。
471 */
472
473void
474btstack_network_packet_sent(uint16_t bnep_cid)
475{
476 T_IF_SOFTC *ic = &if_softc;
477 T_NET_BUF *output = btstack_network_output[btstack_network_output_rpos];
478 T_BTUSB_SOFTC *sc;
479 T_ETHER_HDR *eth;
480
481 while (output != NULL) {
482 sc = &ic->sc->btusb[output->conn_pos];
483 eth = GET_ETHER_HDR(output);
484
485 for (;;) {
486 output->conn_pos++;
487 sc++;
488 if (output->conn_pos >= MAX_PAN_CONNECTIONS)
489 break;
490 if ((sc->bnep_cid != 0)
491 && ((*eth->dhost & ETHER_MCAST_ADDR) || memcmp(eth->dhost, sc->bd_addr, sizeof(eth->dhost)) == 0)) {
492 btstack_network_send_packet_callback(sc->bnep_cid, output->buf, output->len);
493 return;
494 }
495 }
496
497 rel_net_buf(output);
498
499 loc_cpu();
500
501 btstack_network_output[btstack_network_output_rpos] = NULL;
502 btstack_network_output_rpos++;
503 if (btstack_network_output_rpos == NUM_IF_BTUSB_TXBUF)
504 btstack_network_output_rpos = 0;
505
506 output = btstack_network_output[btstack_network_output_rpos];
507
508 unl_cpu();
509
510 sig_sem(ic->semid_rxb_ready);
511 }
512}
513
514static void dummy_handler(void) {};
515static void(*tick_handler)(void) = &dummy_handler;
516void hal_tick_handler();
517
518void hal_tick_init(void)
519{
520 // timer_regist_userfunc(hal_tick_handler);
521}
522
523void hal_tick_set_handler(void(*handler)(void))
524{
525 if (handler == NULL) {
526 tick_handler = &dummy_handler;
527 return;
528 }
529 tick_handler = handler;
530}
531
532int hal_tick_get_tick_period_in_ms(void)
533{
534 return 1;
535}
536
537void hal_tick_handler()
538{
539 tick_handler();
540}
541
542uint32_t hal_time_ms(void)
543{
544 SYSTIM time;
545 get_tim(&time);
546 return time / 1000;
547}
548
549void hal_cpu_disable_irqs(void)
550{
551 loc_cpu();
552}
553
554void hal_cpu_enable_irqs(void)
555{
556 unl_cpu();
557}
558
559int btstack_sleep = 0;
560
561void hal_cpu_enable_irqs_and_sleep(void)
562{
563 unl_cpu();
564 btstack_sleep = 1;
565}
566
567//#define PACKET_DUMP
568static void usb_dummy_handler(uint8_t packet_type, uint8_t *packet, uint16_t size);
569static void(*usb_packet_handler)(uint8_t packet_type, uint8_t *packet, uint16_t size) = usb_dummy_handler;
570
571void usb_bt_callback(uint8_t event_type, uint8_t *data, int size)
572{
573#ifdef PACKET_DUMP
574 int len = size;
575
576 switch (event_type) {
577 case HCI_EVENT_PACKET:
578 printf("EVT <= ");
579 break;
580 case HCI_ACL_DATA_PACKET:
581 printf("ACL <= ");
582 break;
583 default:
584 printf("??? <= ");
585 break;
586 }
587
588 if (len > 256)
589 len = 256;
590 printf_hexdump(data, len);
591#endif
592 usb_packet_handler(event_type, data, size);
593}
594
595static void usb_init(const void *transport_config)
596{
597
598}
599
600static int usb_open(void *transport_config)
601{
602 return 0;
603}
604
605static int usb_close(void *transport_config)
606{
607 return 0;
608}
609
610static int usb_send_packet(uint8_t packet_type, uint8_t *packet, int size)
611{
612 int r;
613#ifdef PACKET_DUMP
614 int len = size;
615 if (len > 256)
616 len = 256;
617#endif
618 switch (packet_type) {
619 case HCI_COMMAND_DATA_PACKET:
620#ifdef PACKET_DUMP
621 printf("CMD => ");
622 printf_hexdump(packet, len);
623#endif
624 r = bt_usb_hbth_control_write(packet, size);
625 if (r < 0 || r != size) {
626 log_error("Error submitting control transfer %d", r);
627 return -1;
628 }
629 return 0;
630 case HCI_ACL_DATA_PACKET:
631#ifdef PACKET_DUMP
632 printf("ACL => ");
633 printf_hexdump(packet, len);
634#endif
635 if (size >= 1024)
636 printf("HCI_ACL_DATA_PACKET size=%d\n", size);
637 r = bt_usb_hbth_bulk_write(packet, size);
638 if (r < 0) {
639 log_error("Error submitting data transfer, %d", r);
640 return -1;
641 }
642 return 0;
643 default:
644 return -1;
645 }
646}
647
648static void usb_register_packet_handler(void(*handler)(uint8_t packet_type, uint8_t *packet, uint16_t size))
649{
650 log_info("registering packet handler.");
651 usb_packet_handler = handler;
652}
653
654static const char * usb_get_transport_name(void){
655 return "USB";
656}
657
658static void usb_dummy_handler(uint8_t packet_type, uint8_t *packet, uint16_t size)
659{
660}
661
662static int usb_acl_out_active = 0;
663static int usb_command_active = 0;
664
665static int usb_can_send_packet_now(uint8_t packet_type)
666{
667 switch (packet_type) {
668 case HCI_COMMAND_DATA_PACKET:
669 return !usb_command_active;
670 case HCI_ACL_DATA_PACKET:
671 return !usb_acl_out_active;
672 default:
673 return 0;
674 }
675}
676
677// single instance
678static const hci_transport_t hci_transport_usb =
679{
680 /*.open =*/ usb_open,
681 /*.close =*/ usb_close,
682 /*.send_packet =*/ usb_send_packet,
683 /*.register_packet_handler =*/ usb_register_packet_handler,
684 /*.get_transport_name =*/ usb_get_transport_name,
685 /*.set_baudrate =*/ NULL,
686 /*.can_send_packet_now =*/ NULL
687};
688
689// get usb singleton
690const hci_transport_t *hci_transport_usb_instance()
691{
692 return &hci_transport_usb;
693}
Note: See TracBrowser for help on using the repository browser.