From 0be5c211c2ecdb742e73f6c342039561191a3036 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Mon, 13 Nov 2006 08:57:00 +0000 Subject: [PATCH] Added bth_test application. Not finished. The aim of this app is to test (and find bugs in) mirobt library under Linux. darcs-hash:20061113085737-f2ef6-4b7fc181518a742813566641ab312846f88cd79f.gz --- bth_tests/bluetooth/.emacs-dirvars | 11 + bth_tests/bluetooth/Makefile | 14 + bth_tests/bluetooth/Makefile.omk | 29 + bth_tests/bluetooth/Makefile.win | 51 + bth_tests/bluetooth/bth_cmd_complete_ev.c | 513 +++++++++ bth_tests/bluetooth/bth_command.c | 419 +++++++ bth_tests/bluetooth/bth_error.c | 103 ++ bth_tests/bluetooth/bth_event_acc.c | 524 +++++++++ bth_tests/bluetooth/bth_fce_out.h | 20 + bth_tests/bluetooth/bth_h8s2638.h | 23 + bth_tests/bluetooth/bth_inface.c | 99 ++ bth_tests/bluetooth/bth_inface.h | 79 ++ bth_tests/bluetooth/bth_main.c | 518 +++++++++ bth_tests/bluetooth/bth_receive.h | 21 + bth_tests/bluetooth/fake_pkt_controll.c | 63 ++ bth_tests/bluetooth/h2638_pkt_controll.c | 121 ++ bth_tests/bluetooth/hci.h | 294 +++++ bth_tests/bluetooth/hci_bluez.c | 21 + bth_tests/bluetooth/hci_command.h | 1254 +++++++++++++++++++++ bth_tests/bluetooth/hci_error.h | 18 + bth_tests/bluetooth/hci_event.h | 864 ++++++++++++++ bth_tests/bluetooth/hci_sci.c | 28 + bth_tests/bluetooth/inface_bth.h | 50 + bth_tests/bluetooth/inline_fce.h | 184 +++ bth_tests/bluetooth/l2cap.c | 446 ++++++++ bth_tests/bluetooth/l2cap.h | 272 +++++ 26 files changed, 6039 insertions(+) create mode 100644 bth_tests/bluetooth/.emacs-dirvars create mode 100644 bth_tests/bluetooth/Makefile create mode 100644 bth_tests/bluetooth/Makefile.omk create mode 100644 bth_tests/bluetooth/Makefile.win create mode 100644 bth_tests/bluetooth/bth_cmd_complete_ev.c create mode 100644 bth_tests/bluetooth/bth_command.c create mode 100644 bth_tests/bluetooth/bth_error.c create mode 100644 bth_tests/bluetooth/bth_event_acc.c create mode 100644 bth_tests/bluetooth/bth_fce_out.h create mode 100644 bth_tests/bluetooth/bth_h8s2638.h create mode 100644 bth_tests/bluetooth/bth_inface.c create mode 100644 bth_tests/bluetooth/bth_inface.h create mode 100644 bth_tests/bluetooth/bth_main.c create mode 100644 bth_tests/bluetooth/bth_receive.h create mode 100644 bth_tests/bluetooth/fake_pkt_controll.c create mode 100644 bth_tests/bluetooth/h2638_pkt_controll.c create mode 100644 bth_tests/bluetooth/hci.h create mode 100644 bth_tests/bluetooth/hci_bluez.c create mode 100644 bth_tests/bluetooth/hci_command.h create mode 100644 bth_tests/bluetooth/hci_error.h create mode 100644 bth_tests/bluetooth/hci_event.h create mode 100644 bth_tests/bluetooth/hci_sci.c create mode 100644 bth_tests/bluetooth/inface_bth.h create mode 100644 bth_tests/bluetooth/inline_fce.h create mode 100644 bth_tests/bluetooth/l2cap.c create mode 100644 bth_tests/bluetooth/l2cap.h diff --git a/bth_tests/bluetooth/.emacs-dirvars b/bth_tests/bluetooth/.emacs-dirvars new file mode 100644 index 0000000..346c0d8 --- /dev/null +++ b/bth_tests/bluetooth/.emacs-dirvars @@ -0,0 +1,11 @@ +;; -*- emacs-lisp -*- +;; +;; This file is processed by the dirvars emacs package. Each variable +;; setting below is performed when this dirvars file is loaded. +;; +c-basic-offset: 2 +indent-tabs-mode: nil +tab-width: 2 +;show-trailing-whitespace: t +;indicate-empty-lines: t + diff --git a/bth_tests/bluetooth/Makefile b/bth_tests/bluetooth/Makefile new file mode 100644 index 0000000..f595272 --- /dev/null +++ b/bth_tests/bluetooth/Makefile @@ -0,0 +1,14 @@ +# Generic directory or leaf node makefile for OCERA make framework + +ifndef MAKERULES_DIR +MAKERULES_DIR := $(shell ( old_pwd="" ; while [ ! -e Makefile.rules ] ; do if [ "$$old_pwd" == `pwd` ] ; then exit 1 ; else old_pwd=`pwd` ; cd -L .. 2>/dev/null ; fi ; done ; pwd ) ) +endif + +ifeq ($(MAKERULES_DIR),) +all : default +.DEFAULT:: + @echo -e "\nThe Makefile.rules has not been found in this or partent directory\n" +else +include $(MAKERULES_DIR)/Makefile.rules +endif + diff --git a/bth_tests/bluetooth/Makefile.omk b/bth_tests/bluetooth/Makefile.omk new file mode 100644 index 0000000..ae33731 --- /dev/null +++ b/bth_tests/bluetooth/Makefile.omk @@ -0,0 +1,29 @@ +# -*- makefile -*- + +#bin_PROGRAMS = bth_comp2 bth_comp1 + +#bth_comp1_SOURCES = main.c bth_main.c bth_command.c bth_event_acc.c bth_error.c bth_cmd_complete_ev.c l2cap.c bth_inface.c h2638_pkt_controll.c +#bth_comp1_LIBS = boot_fn arch_drivers excptvec misc pxmc m sci_channels +#bth_comp1_MOREOBJS = $(USER_LIB_DIR)/system_stub.o + +#bth_comp2_SOURCES = main.c +#bth_comp2_LIBS = boot_fn arch_drivers excptvec misc pxmc m sci_channels bluetooth +#bth_comp2_MOREOBJS = $(USER_LIB_DIR)/system_stub.o + +lib_LIBRARIES = mirobt + +mirobt_SOURCES = bth_command.c bth_event_acc.c bth_error.c \ +bth_cmd_complete_ev.c l2cap.c bth_inface.c bth_main.c + +ifeq ($(CONFIG_BLUETOOTH_LINUX),y) +mirobt_SOURCES += hci_bluez.c fake_pkt_controll.c +else +mirobt_SOURCES += hci_sci.c h2638_pkt_controll.c +endif +include_HEADERS = bth_inface.h bth_fce_out.h bth_h8s2638.h + +default_CONFIG += CONFIG_BLUETOOTH=y +default_CONFIG += CONFIG_BLUETOOTH_LINUX=n + +config_include_HEADERS = bth_config.h +bth_config_DEFINES = $(default_CONFIG) diff --git a/bth_tests/bluetooth/Makefile.win b/bth_tests/bluetooth/Makefile.win new file mode 100644 index 0000000..c9bd031 --- /dev/null +++ b/bth_tests/bluetooth/Makefile.win @@ -0,0 +1,51 @@ +# Project: bluetooth +# Makefile created by Dev-C++ 4.9.9.2 + +CPP = g++.exe -D__DEBUG__ +CC = gcc.exe -D__DEBUG__ +WINDRES = windres.exe +RES = +OBJ = Main.o bth_command.o bth_event_acc.o bth_error.o bth_cmd_complete_ev.o l2cap.o bth_inface.o bth_main.o $(RES) +LINKOBJ = Main.o bth_command.o bth_event_acc.o bth_error.o bth_cmd_complete_ev.o l2cap.o bth_inface.o bth_main.o $(RES) +LIBS = -L"C:/Dev-Cpp/lib" -g3 +INCS = -I"C:/Dev-Cpp/include" +CXXINCS = -I"C:/Dev-Cpp/lib/gcc/mingw32/3.4.2/include" -I"C:/Dev-Cpp/include/c++/3.4.2/backward" -I"C:/Dev-Cpp/include/c++/3.4.2/mingw32" -I"C:/Dev-Cpp/include/c++/3.4.2" -I"C:/Dev-Cpp/include" +BIN = bluetooth.exe +CXXFLAGS = $(CXXINCS) -g3 +CFLAGS = $(INCS) -g3 +RM = rm -f + +.PHONY: all all-before all-after clean clean-custom + +all: all-before bluetooth.exe all-after + + +clean: clean-custom + ${RM} $(OBJ) $(BIN) + +$(BIN): $(OBJ) + $(CC) $(LINKOBJ) -o "bluetooth.exe" $(LIBS) + +Main.o: Main.c + $(CC) -c Main.c -o Main.o $(CFLAGS) + +bth_command.o: bth_command.c + $(CC) -c bth_command.c -o bth_command.o $(CFLAGS) + +bth_event_acc.o: bth_event_acc.c + $(CC) -c bth_event_acc.c -o bth_event_acc.o $(CFLAGS) + +bth_error.o: bth_error.c + $(CC) -c bth_error.c -o bth_error.o $(CFLAGS) + +bth_cmd_complete_ev.o: bth_cmd_complete_ev.c + $(CC) -c bth_cmd_complete_ev.c -o bth_cmd_complete_ev.o $(CFLAGS) + +l2cap.o: l2cap.c + $(CC) -c l2cap.c -o l2cap.o $(CFLAGS) + +bth_inface.o: bth_inface.c + $(CC) -c bth_inface.c -o bth_inface.o $(CFLAGS) + +bth_main.o: bth_main.c + $(CC) -c bth_main.c -o bth_main.o $(CFLAGS) diff --git a/bth_tests/bluetooth/bth_cmd_complete_ev.c b/bth_tests/bluetooth/bth_cmd_complete_ev.c new file mode 100644 index 0000000..538edfd --- /dev/null +++ b/bth_tests/bluetooth/bth_cmd_complete_ev.c @@ -0,0 +1,513 @@ +/******************************************************************* + bluetooth library + + bth_cmd_complete_ev.c - fce for reading packet event command complet + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#include +#include +#include +#ifdef BTH_LX +#include +//#include +#endif +#include +#include "hci.h" +#include "inline_fce.h" +#include "hci_event.h" +#include "hci_command.h" + + + +int cmd_ev_none(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/********************************************************************/ +/*********************** OGF = 0x01 ****************************/ +/*-------------------LINK CONTROL COMMANDS--------------------------*/ +/********************************************************************/ +/*--- OCF = 0x0001 --- Inquiry */ +//NONE + +/*--- OCF = 0x0002 --- Inquiry_Cancel ---*/ +//STATUS + +/*--- OCF = 0x0003 --- Periodic_Inquiry_Mode ---*/ +//STATUS + +/*--- OCF = 0x0004 --- Exit_Periodic_Inquiry_Mode ---*/ +//STATUS + +/*--- OCF = 0x0005 --- Create_Connection ---*/ +//NONE + +/*--- OCF = 0x0006 --- Disconnect ---*/ +//NONE + +/*--- OCF = 0x0007 --- Add_SCO_Connection ---*/ +//NONE + +/*--- OCF = 0x0009 --- Accept_Connection_Request ---*/ +//NONE + +/*--- OCF = 0x000A --- Reject_Connection_Request ---*/ +//NONE + +/*--- OCF = 0x000B --- Link_Key_Request_Reply ---*/ +//STATUS, BD_ADDR +int cmd_ev_01x000b(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x000D --- PIN_Code_Request_Reply ---*/ +//STATUS, BD_ADDR +int cmd_ev_01x000d(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x000E --- PIN_Code_Request_Negative_Reply ---*/ +//STATUS, BD_ADDR +int cmd_ev_01x000e(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x000F --- Change_Connection_Packet_Type ---*/ +//NONE + +/*--- OCF = 0x0011 --- Authentication_Requested ---*/ +//NONE + +/*--- OCF = 0x0013 --- Set_Connection_Encryption ---*/ +//NONE + +/*--- OCF = 0x0015 --- Change_Connection_Link_Key ---*/ +//NONE + +/*--- OCF = 0x0017 --- Master_Link_Key ---*/ +//NONE + +/*--- OCF = 0x0019 --- Remote_Name_Request ---*/ +//NONE + +/*--- OCF = 0x001B --- Read_Remote_Supported_Features ---*/ +//NONE + +/*--- OCF = 0x001F --- Read_Clock_Offset ---*/ +//NONE + + + +/********************************************************************/ +/*********************** OGF = 0x02 ****************************/ +/*-------------------LINK POLICY COMMANDS--------------------------*/ +/********************************************************************/ +/*--- OCF = 0x0001 --- Hold_Mode ---*/ +//NONE + +/*--- OCF = 0x0003 --- Sniff_Mode ---*/ +//NONE + +/*--- OCF = 0x0004 --- Exit_Sniff_Mode ---*/ +//NONE + +/*--- OCF = 0x0005 --- Park_Mode ---*/ +//NONE + +/*--- OCF = 0x0006 --- Exit_Park_Mode ---*/ +//NONE + +/*--- OCF = 0x0007 --- QoS_Setup ---*/ +//NONE + +/*--- OCF = 0x0009 --- Role_Discovery ---*/ +//Status, Connection_Handle, Current_Role +int cmd_ev_02x0009(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x000b --- Switch_Role ---*/ +//NONE + +/*--- OCF = 0x000C --- Read_Link_Policy_Settings ---*/ +//Status, Connection_Handle, Link_Policy_Settings/ +int cmd_ev_02x000C(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x000D --- Write_Link_Policy_Settings ---*/ +//Link_Policy_Settings, Status, Connection_Handle +int cmd_ev_02x000D(uint8_t *bth_p, uint8_t size) +{ + write_link_policy_rp bth_q; + int i; +// store16(bth_q.status,*((uint8_t*)bth_p+WRITE_LINK_POLICY_RP____status)); + __bthtomc16((uint8_t*)&bth_q.status,((uint8_t*)bth_p+WRITE_LINK_POLICY_RP____status)); + __bthtomc16((uint8_t*)&bth_q.handle,((uint8_t*)bth_p+WRITE_LINK_POLICY_RP____handle)); +// store_le16(&bth_q.handle,*((uint16_t*)((uint8_t*)bth_p+WRITE_LINK_POLICY_RP____handle))); +/*prohledam vsechna zarizeni, se kterymi mam uzavrenou komunikaci*/ + for(i=0;i<8;i++) + { + if(bth_connected[i]!=NULL) + { + if(bth_connected[i]->handle==bth_q.handle) + { + if(bth_q.status!=0) + { + //problehla chyba, u domluvi s timto zarizenim - tj. + return (bth_q.status); + }else + { + change_connection_packet_type(bth_q.handle,btohs(0xcc18)); + return 0; +// return ((int)*((uint8_t*)bth_p+WRITE_LINK_POLICY_RP____status)); + }; + }; + }; + }; + return(-1); +}; + + +/********************************************************************/ +/*********************** OGF = 0x03 ****************************/ +/*--------------HOST CONTROLLER & BASEBAND COMMANDS-----------------*/ +/********************************************************************/ +/*--- OCF = 0x0001 --- Set_Event_Mask ---*/ +//STATUS + +/*--- OCF = 0x0003 --- Reset ---*/ +//STATUS + +/*--- OCF = 0x0005 --- Set_Event_Filter ---*/ +//STATUS + +/*--- OCF = 0x0008 --- Flush ---*/ +//STATUS, Connection_Handle +int cmd_ev_03x0008(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0009 --- Read_PIN_Type ---*/ +//STATUS, PIN_Type +int cmd_ev_03x0009(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x000a --- Write_PIN_Type ---*/ +//STATUS + +/*--- OCF = 0x000b --- Create_New_Unit_Key ---*/ +//STATUS + +/*--- OCF = 0x000d --- Read_Stored_Link_Key ---*/ +//STATUS, Max_Num_Keys, Num_Keys_Read +int cmd_ev_03x000d(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0011 --- Write_Stored_Link_Key ---*/ +//STATUS, Num_Keys_Written +int cmd_ev_03x0011(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0012 --- Delete_Stored_Link_Key ---*/ +//STATUS, Num_Keys_Deleted +int cmd_ev_03x0012(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0013 --- Change_Local_Name ---*/ +//STATUS + +/*--- OCF = 0x0014 --- Read_Local_Name ---*/ +//Status, Name +int cmd_ev_03x0014(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0015 --- Read_Connection_Accept_Timeout ---*/ +//STATUS,Conn_Accept_Timeout +int cmd_ev_03x0015(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0016 --- Write_Connection_Accept_Timeout ---*/ +//STATUS + +/*--- OCF = 0x0017 --- Read_Page_Timeout ---*/ +//STATUS,Page_Timeout +int cmd_ev_03x0017(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0018 --- Write_Page_Timeout ---*/ +//STATUS + +/*--- OCF = 0x0019 --- Read_Scan_Enable ---*/ +//STATUS, Scan_Enable +int cmd_ev_03x0019(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x001a --- Write_Scan_Enable ---*/ +//STATUS + +/*--- OCF = 0x001b --- Read_Page_Scan_Activity ---*/ +//STATUS, Page_Scan_Interval, Page_Scan_Window +int cmd_ev_03x001b(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x001c --- Write_Page_Scan_Activity ---*/ +//STATUS + +/*--- OCF = 0x001d --- Read_Inquiry_Scan_Activity ---*/ +//STATUS,Inquiry_Scan_Interval, Inquiry_Scan_Window +int cmd_ev_03x001d(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x001e --- Write_Inquiry_Scan_Activity ---*/ +//STATUS + +/*--- OCF = 0x001f --- Read_Authentication_Enable ---*/ +//STATUS, Authentication_Enable +int cmd_ev_03x001f(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0020 --- Write_Authentication_Enable ---*/ +//STATUS + +/*--- OCF = 0x0021 --- Read_Encryption_Mode ---*/ +//STATUS,Encryption_Mode +int cmd_ev_03x0021(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0022 --- Write_Encryption_Mode ---*/ +//STATUS + +/*--- OCF = 0x0023 --- Read_Class_of_Device ---*/ +//STATUS,Class_of_Device +int cmd_ev_03x0023(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0024 --- Write_Class_of_Device ---*/ +//STATUS + + +/*--- OCF = 0x0025 --- Read_Voice_Setting ---*/ +//STATUS,Voice_Setting +int cmd_ev_03x0025(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0026 --- Write_Voice_Setting ---*/ +//STATUS + + +/*--- OCF = 0x0027 --- Read_Automatic_Flush_Timeout ---*/ +//STATUS, Connection_Handle, Flush_Timeout +int cmd_ev_03x0027(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0028 --- Write_Automatic_Flush_Timeout ---*/ +//STATUS,Connection_Handle +int cmd_ev_03x0028(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0029 --- Read_Num_Broadcast_Retransmissions ---*/ +//STATUS,Num_Broadcast_Retran +int cmd_ev_03x0029(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x002a --- Write_Num_Broadcast_Retransmissions ---*/ +//STATUS + +/*--- OCF = 0x002b --- Read_Hold_Mode_Activity ---*/ +//STATUS, Hold_Mode_Activity +int cmd_ev_03x002b(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x002c --- Write_Hold_Mode_Activity ---*/ +//STATUS + +/*--- OCF = 0x002d --- Read_Transmit_Power_Level ---*/ +//STATUS,Connection_Handle,Transmit_Power_Level +int cmd_ev_03x002d(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x002e --- Read_SCO_Flow_Control_Enable ---*/ +//STATUS, SCO_Flow_Control_Enable +int cmd_ev_03x002e(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x002f --- Write_SCO_Flow_Control_Enable ---*/ +/*STATUS*/ + +/*--- OCF = 0x0031 --- Set_Host_Controller_To_Host_Flow_Control*/ +/*STATUS*/ + +/*--- OCF = 0x0033 --- Host_Buffer_Size ---*/ +/*STATUS*/ + +/*--- OCF = 0x0035 --- Host_Number_Of_Completed_Packets ---*/ +/*NONE*/ + +/*--- OCF = 0x0036 --- Read_Link_Supervision_Timeout ---*/ +/*STATUS,Connection_Handle, Link_Supervision_Timeout*/ +int cmd_ev_03x0036(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0037 --- Write_Link_Supervision_Timeout ---*/ +//STATUS,Connection_Handle +int cmd_ev_03x0037(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0038 --- Read_Number_Of_Supported_IAC ---*/ +//STATUS,Num_Support_IAC +int cmd_ev_03x0038(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0039 --- Read_Current_IAC_LAP ---*/ +//STATUS,Num_Current_IAC, IAC_LAP[i] +int cmd_ev_03x0039(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x003a --- Write_Current_IAC_LAP*/ +/*STATUS*/ + +/*--- OCF = 0x003b --- Read_Page_Scan_Period_Mode ---*/ +/*STATUS,Page_Scan_Period_Mode*/ +int cmd_ev_03x003b(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x003c --- Write_Page_Scan_Period_Mode ---*/ +//STATUS + +/*--- OCF = 0x003d --- Read_Page_Scan_Mode ---*/ +//STATUS,Page_Scan_Mode +int cmd_ev_03x003d(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + + +/********************************************************************/ +/*********************** OGF = 0x04 ****************************/ +/*-------------------INFORMATIONAL PARAMETERS-----------------------*/ +/********************************************************************/ + +/*--- OCF = 0x0001 --- Read_Local_Version_Information ---*/ +//STATUS, HCI Version, HCI Revision, LMP Version, Manufacturer_Name, LMP Subversion +int cmd_ev_04x0001(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0003 --- Read_Local_Supported_Features ---*/ +//STATUS, LMP_Features +int cmd_ev_04x0003(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0005 --- Read_Buffer_Size ---*/ +//STATUS, HC_ACL_Data_Packet_Length, HC_SCO_Data_Packet_Length, HC_Total_Num_ACL_Data_Packets, +//HC_Total_Num_SCO_Data_Packets +int cmd_ev_04x0005(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + + +/*--- OCF = 0x0007 --- Read_Country_Code ---*/ +//STATUS, Country_Code +int cmd_ev_04x0007(uint8_t *bth_p, uint8_t size) +{ + return -1; +}; + +/*--- OCF = 0x0009 --- Read_BD_ADDR ---*/ +//STATUS, BD_ADDR +int cmd_ev_04x0009(uint8_t *bth_p, uint8_t size) +{ + read_bd_addr_rp bth_q; + + int index; + store8(bth_q.status,*((uint8_t*)bth_p+READ_BD_ADDR_RP____status)); + memcpy(&bth_local_info.bdaddr,((uint8_t*)bth_p+READ_BD_ADDR_RP____bdaddr),6); + index=bth_del_event(btohs(0x0910)); //obcode read_bd_addr + if(index==-1) + { + return -1; + } + + else + { +// assert(index >= 0 && index < LANCOMMAND); + if(*((uint8_t*)bth_p+READ_BD_ADDR_RP____status)==0) + { + free(bth_array_adrr_check_packet[index]); + bth_array_adrr_check_packet[index]=NULL; + return 0; //prikaz probehl bez komplikaci + } + else + { + /*status is not OK */ + free(bth_array_adrr_check_packet[index]); + bth_array_adrr_check_packet[index]=NULL; + return((int)*((uint8_t*)bth_p+READ_BD_ADDR_RP____status)); //NOTE probably I put * here, but I don't remember it. It was yesterday >-] + }; + }; +}; diff --git a/bth_tests/bluetooth/bth_command.c b/bth_tests/bluetooth/bth_command.c new file mode 100644 index 0000000..f275b10 --- /dev/null +++ b/bth_tests/bluetooth/bth_command.c @@ -0,0 +1,419 @@ +/******************************************************************* + bluetooth library + + bth_command.c - command functions (bth specification) - build command + packet + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + +#include +#include +#include +#ifdef BTH_LX +#include +#include +#include +#include +#endif + +#include "hci.h" +#include "hci_event.h" +#include "hci_command.h" +#include "inline_fce.h" + + +bths_check_command *bth_find_end(bths_check_command *dyn_chan) +{ + bths_check_command *temp; + if(dyn_chan!=NULL) + { + temp=dyn_chan; + while (temp->next!=NULL) + { + temp=temp->next; /*put the command to the queue*/ + }; + return temp; + } + else + { + return NULL; + }; +}; + + +/********************************************************************/ +/*********************** OGF = 0x01 ****************************/ +/*-------------------LINK CONTROL COMMANDS--------------------------*/ +/********************************************************************/ + +int bth_cmd_inqury(uint8_t length, uint8_t rsp, uint8_t *lap) +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; + inquiry_cp *bth_cmd_packet; + uint16_t i; //used in loops +/*-------------------------------------------------------------------------------*/ +/*-- determine the size of memory needed for command in buff and determine if it fit there */ + + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+INQUIRY_CP_SIZE); + + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //possition in buff, which is assigned to the packet + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer to head + bth_cmd_packet=(inquiry_cp *)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer to parametrs + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_LINK_CTL, OCF_INQUIRY))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),INQUIRY_CP_SIZE); + + /*pokud neni uvedeno lap zvoli se univerzlni*/ + /*if lap is not specified, the universal one is chosen*/ + store_le16((uint8_t*)bth_cmd_packet+INQUIRY_CP____length,length); + store_le16((uint8_t*)bth_cmd_packet+INQUIRY_CP____num_rsp,rsp); + + if(lap==NULL) + { + uint8_t lap_univ[]={0x33,0x8b,0x9e}; + memcpy(((uint8_t*)bth_cmd_packet+INQUIRY_CP____lap),&lap_univ,3); + } + else{ + for(i=0; i<3; i++) {store_le16((uint8_t*)bth_cmd_packet+INQUIRY_CP____lap+i,*(lap+2-i));}; + }; + +/*setup position in command array for the next command. Possibility of writing there (address in array = NULL) is checked when writing is realy done.*/ +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return -1; +}; + +/*--- 0x01 - 0x000F --- Change_Connection_Packet_Type ---*/ +int change_connection_packet_type(uint16_t handle, uint16_t ptype) +{ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; + set_conn_ptype_cp *bth_cmd_packet; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+SET_CONN_PTYPE_CP_SIZE); + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + bth_cmd_packet=(set_conn_ptype_cp *)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer on parametrs + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_LINK_CTL, OCF_SET_CONN_PTYPE))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),SET_CONN_PTYPE_CP_SIZE); + store_le16((uint8_t*)bth_cmd_packet+SET_CONN_PTYPE_CP____handle,handle); + store_le16((uint8_t*)bth_cmd_packet+SET_CONN_PTYPE_CP____pkt_type,ptype); + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return(-1); +}; + + + +int bth_cmd_disconnect(uint16_t handle, uint8_t reason) +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; + disconnect_cp *bth_cmd_packet; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=HCI_PKT_SIZE+HCI_COMMAND_HDR_SIZE+DISCONNECT_CP_SIZE; + + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + bth_cmd_packet=(disconnect_cp *)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer on parametrs + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_LINK_POLICY, OCF_DISCONNECT))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),WRITE_PAGE_ACTIVITY_CP_SIZE); + store_le16((uint16_t*)((uint8_t*)bth_cmd_packet+DISCONNECT_CP____handle),handle); + store16(*((uint8_t*)bth_cmd_packet+DISCONNECT_CP____reason),reason); + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return -1; +}; + +//-------------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------------- + + + +/********************************************************************/ +/*********************** OGF = 0x02 ****************************/ +/*-------------------LINK POLICY COMMANDS--------------------------*/ +/********************************************************************/ +int bth_cmd_write_link_policy_settings(uint16_t handle, uint16_t policy) /*obcode=0x0D08; 0x02--0x000D*/ +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; + write_link_policy_cp *bth_cmd_packet; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=HCI_PKT_SIZE+HCI_COMMAND_HDR_SIZE+WRITE_LINK_POLICY_CP_SIZE; + + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + bth_cmd_packet=(write_link_policy_cp *)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer on parametrs + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_LINK_POLICY, OCF_WRITE_LINK_POLICY))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),WRITE_PAGE_ACTIVITY_CP_SIZE); + store_le16((uint16_t*)((uint8_t*)bth_cmd_packet+WRITE_LINK_POLICY_CP____handle),handle); + store_le16((uint16_t*)((uint8_t*)bth_cmd_packet+WRITE_LINK_POLICY_CP____policy),policy); + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return -1; +}; + + + + +/********************************************************************/ +/*********************** OGF = 0x03 ****************************/ +/*--------------HOST CONTROLLER & BASEBAND COMMANDS-----------------*/ +/********************************************************************/ +int bth_cmd_reset(void) /*opcode=0x0C03 OCF = 0x0003, OGF = 0x03*/ +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=HCI_PKT_SIZE+HCI_COMMAND_HDR_SIZE; + + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16(((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode),htobs(cmd_opcode_pack(OGF_HOST_CTL,OCF_RESET ))); + + + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),0); + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return -1; +}; + + + +/********************************************************************/ +/*********************** OGF = 0x04 ****************************/ +/*-------------------INFORMATIONAL PARAMETERS-----------------------*/ +/********************************************************************/ + + + +int bth_accept_conn_req_cp(bdaddr_t *bdaddr) /*0x01 - 0x0009*/ +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; //FIXME: hjkhjkh + hci_command_hdr *hci_headr; + accept_conn_req_cp *bth_cmd_packet; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+ACCEPT_CONN_REQ_CP_SIZE); + + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + bth_cmd_packet=(accept_conn_req_cp*)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer on parametrs + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_LINK_CTL, OCF_ACCEPT_CONN_REQ))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),ACCEPT_CONN_REQ_CP_SIZE); + memcpy((uint8_t*)bth_cmd_packet+ACCEPT_CONN_REQ_CP____bdaddr,bdaddr,sizeof(bdaddr_t)); + store16(*((uint8_t*)bth_cmd_packet+ACCEPT_CONN_REQ_CP____role), 0x01); //ACL + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return 0; +}; + +int bth_cmd_write_page_scan(uint16_t interval, uint16_t window) /*obcode=1C0C OGF = 0x001C OCF=0x03*/ +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; + write_page_activity_cp *bth_cmd_packet; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+WRITE_PAGE_ACTIVITY_CP_SIZE); + + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + bth_cmd_packet=(write_page_activity_cp *)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer on parametrs + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_PAGE_ACTIVITY))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),WRITE_PAGE_ACTIVITY_CP_SIZE); + store_le16((uint8_t*)bth_cmd_packet+WRITE_PAGE_ACTIVITY_CP____interval,interval); + store_le16((uint8_t*)bth_cmd_packet+WRITE_PAGE_ACTIVITY_CP____window,window); + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return -1; +}; + + + +//-------------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------------- +//-------------------------------------------------------------------------------------------- +int bth_cmd_write_inquiry_scan_activity(uint16_t interval, uint16_t window) //0x001E +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; + write_inq_activity_cp *bth_cmd_packet; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+WRITE_PAGE_ACTIVITY_CP_SIZE); + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + bth_cmd_packet=(write_inq_activity_cp *)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer on parametrs + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_INQ_ACTIVITY))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),WRITE_INQ_ACTIVITY_CP_SIZE); + store_le16((uint8_t*)bth_cmd_packet+WRITE_INQ_ACTIVITY_CP____interval,interval); + store_le16((uint8_t*)bth_cmd_packet+WRITE_INQ_ACTIVITY_CP____window,window); + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return(-1); +}; + +int bth_cmd_read_bd_addr(void) /*opcode=0x0910 OCF = 0x0009, OGF = 0x04*/ +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE); + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_INFO_PARAM, OCF_READ_BD_ADDR))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),0); + +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return -1; +}; + +int bth_cmd_write_scan_enable(uint8_t set_ing_scan) //0x001A +{ +/*------------------------ parts of packet-----------------------*/ + uint8_t *typ_hci_paket; + hci_command_hdr *hci_headr; + uint8_t *bth_cmd_packet; + +/*-- determine the size of memory needed for command in buff and determine if it fit there */ +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*setup adresses for packet parts + filling of inidividual fields*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+WRITE_SCAN_ENABLE_SIZE); + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.aktual]; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_command_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + bth_cmd_packet=(uint8_t *)(((uint8_t*)hci_headr)+HCI_COMMAND_HDR_SIZE); //pointer on parametrs + + + store16(*typ_hci_paket, HCI_COMMAND_PKT); + store_le16((uint8_t*)hci_headr+HCI_COMMAND_HDR____opcode,htobs(cmd_opcode_pack(OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),WRITE_SCAN_ENABLE_SIZE); + store16(*bth_cmd_packet,set_ing_scan); +/*nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) +se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return -1; +}; + +//FIXME: All the czech comments are the same as in the first function. + diff --git a/bth_tests/bluetooth/bth_error.c b/bth_tests/bluetooth/bth_error.c new file mode 100644 index 0000000..2996a22 --- /dev/null +++ b/bth_tests/bluetooth/bth_error.c @@ -0,0 +1,103 @@ +#include +#ifdef BTH_LX +#include +#include +#include +#include +#endif + +#include +#include "hci.h" +#include "hci_error.h" + + +/** + * Errors generated by a bluetooth device +*/ + +static struct { + uint8_t error_code; + char *error_doc; +} status_command[] = { + { 0x00, "Status OK" }, + { 0x01, "Unknown HCI Command" }, + { 0x02, "No Connection" }, + { 0x03, "Hardware Failure" }, + { 0x04, "Page Timeout" }, + { 0x05, "Authentication Failure" }, + { 0x06, "Key Missing" }, + { 0x07, "Memory Full" }, + { 0x08, "Connection Timeout" }, + { 0x09, "Max Number Of Connections" }, + { 0x0A, "Max Number Of SCO Connections To A Device"}, + { 0x0B, "ACL connection already exists" }, + { 0x0C, "Command Disallowed" }, + { 0x0D, "Host Rejected due to limited resources" }, + { 0x0E, "Host Rejected due to security reasons" }, + { 0x0F, "Host Rejected due to remote device is only a personal device" }, + { 0x10, "Host Timeout" }, + { 0x11, "Unsupported Feature or Parameter Value" }, + { 0x12, "Invalid HCI Command Parameters" }, + { 0x13, "Other End Terminated Connection: User Ended Connection" }, + { 0x14, "Other End Terminated Connection: Low Resources" }, + { 0x15, "Other End Terminated Connection: About to Power Off" }, + { 0x16, "Connection Terminated by Local Host" }, + { 0x17, "Repeated Attempts" }, +}; + +/** +* Output an error to a terminal unsing rs232 +*/ +void bth_error_detect_status(uint8_t status_num) +{ + char *message; + int i=0; + if(status_num +#include +#include +#include "hci.h" +#include "l2cap.h" +#include "hci_event.h" +#include "hci_command.h" + +#ifdef BTH_LX +#include +#endif +#include "inline_fce.h" + + + +typedef int (*bth_info_fce_def)(uint8_t *bth_p, uint8_t size); + +bth_info_fce_def bth_info_fce_ogf_01[]={ + cmd_ev_none, cmd_ev_none,cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, + cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_01x000b, cmd_ev_none, cmd_ev_01x000d, cmd_ev_01x000e, + cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, + cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, + cmd_ev_none}; +#define BTH_OGF_01_FC (sizeof(bth_info_fce_ogf_01)/sizeof(bth_info_fce_ogf_01[0])) + + +bth_info_fce_def bth_info_fce_ogf_02[]={ + cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, + cmd_ev_none, cmd_ev_02x0009, cmd_ev_none, cmd_ev_none, cmd_ev_02x000C, cmd_ev_02x000D}; +#define BTH_OGF_02_FC (sizeof(bth_info_fce_ogf_02)/sizeof(bth_info_fce_ogf_02[0])) + + +bth_info_fce_def bth_info_fce_ogf_03[]={ + cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, + cmd_ev_03x0008, cmd_ev_03x0009, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_03x000d, cmd_ev_none, cmd_ev_none, + cmd_ev_none, cmd_ev_03x0011, cmd_ev_03x0012, cmd_ev_none, cmd_ev_03x0014, cmd_ev_03x0015, + cmd_ev_none, cmd_ev_03x0017, cmd_ev_none, cmd_ev_03x0019, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_03x001d, + cmd_ev_none, cmd_ev_03x001f, cmd_ev_none, cmd_ev_03x0021, cmd_ev_none, cmd_ev_03x0023, cmd_ev_none, cmd_ev_03x0025, + cmd_ev_none, cmd_ev_03x0027, cmd_ev_03x0028, cmd_ev_03x0029, cmd_ev_none, cmd_ev_03x002b, cmd_ev_none, cmd_ev_03x002d, + cmd_ev_03x002e, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_none, cmd_ev_03x0036, + cmd_ev_none, cmd_ev_03x0038, cmd_ev_03x0039, cmd_ev_none, cmd_ev_03x003b, + cmd_ev_none, cmd_ev_03x003d}; +#define BTH_OGF_03_FC (sizeof(bth_info_fce_ogf_03)/sizeof(bth_info_fce_ogf_03[0])) + + +bth_info_fce_def bth_info_fce_ogf_04[]={ + cmd_ev_none, cmd_ev_04x0001, cmd_ev_none, cmd_ev_04x0003, cmd_ev_none, cmd_ev_04x0005, cmd_ev_none, cmd_ev_04x0007, + cmd_ev_none, cmd_ev_04x0009}; +#define BTH_OGF_04_FC (sizeof(bth_info_fce_ogf_04)/sizeof(bth_info_fce_ogf_04[0])) + + + +/*********************************************************************************/ + +/*return values + 0 = OK - command removed from the queue + -1 = the queue was searched but the OPCODE was not found + +num = an index of verified item in array "bth_pole_adrr_check_packet" with the searched opcode +*/ +int bth_del_event(uint16_t opcode) +{ + int i; + uint16_t opcode_pkt; + for(i=0;ibdaddr),(uint8_t*)bth_p+EVT_CONN_COMPLETE____bdaddr,sizeof(bdaddr_t)); +// store_le16(&(bth_q->handle),(uint16_t)*(uint16_t*)((uint8_t*)bth_p+EVT_CONN_COMPLETE____handle)); + __bthtomc16((uint8_t*)&(bth_q->handle),((uint8_t*)bth_p+EVT_CONN_COMPLETE____handle)); +/* sci_rs232_sendch('c',sci_rs232_chan_default); //do PC + VypisHexa((void*)&(((bths_connect_bluet*)bth_connected[j])->handle),2); + sci_rs232_sendch('c',sci_rs232_chan_default); //do PC*/ + + store8(bth_q->link_type,*((uint8_t*)bth_p+EVT_CONN_COMPLETE____link_type)); + store8(bth_q->encr_mode,*((uint8_t*)bth_p+EVT_CONN_COMPLETE____encr_mode)); + + bth_cmd_write_link_policy_settings(bth_q->handle,htobs(0x000f)); //reply + return (*((uint8_t*)bth_p+EVT_CONN_COMPLETE____status)); +}; + +int bth_evt_conn_request(uint8_t *bth_p, uint8_t size) //0x04 +{ + bdaddr_t bdaddr; +// evt_conn_request bth_q; + /*BD address of requesting device*/ + memcpy(&bdaddr,(uint8_t*)bth_p+EVT_CONN_REQUEST____bdaddr,sizeof(bdaddr_t)); +// if(bth_seach_bdaddr(&bdaddr,&(bth_accept_bd_addr[0]),1)); + bth_accept_conn_req_cp(&bdaddr); + return 0; +}; + + + +int bth_evt_disconn_complete(uint8_t *bth_p, uint8_t size) //0x05 +{ + int i; + evt_disconn_complete bth_q; +// store_le16(&bth_q.handle,*((uint16_t*)((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____status))); + __bthtomc16((uint8_t*)&(bth_q.handle),((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____status)); + i=bth_find_conected_dev(bth_q.handle); + free(bth_connected[i]); bth_connected[i]=NULL; +// bth_local_info.busy=0; + if(*((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____reason)==0) + return (*((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____status)); + else + return (*((uint8_t*)bth_p+EVT_DISCONN_COMPLETE____reason)); +}; + +int bth_evt_auth_complete(uint8_t *bth_p, uint8_t size) //0x06 +{ + return (-3); +}; + +int bth_remote_name_req_complete(uint8_t *bth_p, uint8_t size) //0x07 +{ + return (-3); +}; + +int bth_evt_encrypt_cahnge(uint8_t *bth_p, uint8_t size) //0x08 +{ + return (-3); +}; + +int bth_evt_change_conn_link_key_complete(uint8_t *bth_p, uint8_t size) //0x09 +{ + return (-3); +}; + +int bth_evt_master_link_key_complete(uint8_t *bth_p, uint8_t size) //0x0A +{ + return (-3); +}; + +int bth_evt_read_remote_features_complete(uint8_t *bth_p, uint8_t size) //0x0B +{ + return (-3); +}; + +int bth_evt_read_remote_version_complete(uint8_t *bth_p, uint8_t size) //0x0C +{ + return (-3); +}; + +int bth_evt_qos_setup_complete(uint8_t *bth_p, uint8_t size) //0x0D +{ + return (-3); +}; + +int bth_evt_cmd_complete(uint8_t *bth_p, uint8_t size) //0x0E +{ + evt_cmd_complete bth_q; + uint16_t opcode,ogf,ocf; + int index=-1; + + store8(bth_q.ncmd,*((uint8_t*)bth_p+EVT_CMD_COMPLETE____ncmd)); +// store_le16(&bth_q.opcode,*((uint16_t*)((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode))); + __bthtomc16(&bth_q.opcode,(((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode))); + index=bth_del_event(bth_q.opcode); + if(index==-1) + { + return -1; + } + else + { + if(size-EVT_CMD_COMPLETE_SIZE==1) /* this is just a confirmation - status*/ + { + if(*((uint8_t*)bth_p+3)==0) + { + free(bth_array_adrr_check_packet[index]); + bth_array_adrr_check_packet[index]=NULL; + bth_local_info.busy=0; + return 0; //no complications was encountered during command execution + } + else + { + /*status is not OK - an error occured - the sent command is still in the confirmation queue */ + free(bth_array_adrr_check_packet[index]); + bth_array_adrr_check_packet[index]=NULL; + bth_local_info.busy=0; + return((int)*((uint8_t*)bth_p+EVT_CMD_COMPLETE_SIZE)); + }; + } + else + { + /*I split to obcode to OGF and OCF and convert it to an one-byte variable*/ +// store_le16(&opcode,*(uint16_t*)((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode)); + __bthtomc16((uint8_t*)&(opcode),((uint8_t*)bth_p+EVT_CMD_COMPLETE____opcode)); + + ogf=(uint8_t)cmd_opcode_ogf(opcode); + ocf=(uint8_t)cmd_opcode_ocf(opcode); + + switch(ogf) + { + case 0x01 : + bth_local_info.busy=0; + if(ocfhandle==handle) + { +// sci_rs232_sendch(';',sci_rs232_chan_default); //do PC +// VypisHexa((void*)&(handle),2); +// sci_rs232_sendch(';',sci_rs232_chan_default); //do PC + break; + }; + }; + }; + }; + bth_local_info.busy=0; + return(0); +}; + +int bth_evt_mode_change(uint8_t *bth_p, uint8_t size) //0x14 +{ + return (-3); +}; + +int bth_evt_return_link_keys(uint8_t *bth_p, uint8_t size) //0x15 +{ + return(-3); +}; + +int bth_evt_pin_code_req(uint8_t *bth_p, uint8_t size) //0x16 +{ + return (-3); +}; + +int bth_evt_link_key_req(uint8_t *bth_p, uint8_t size) //0x17 +{ + return (-3); +}; + +int bth_evt_link_key_notify(uint8_t *bth_p, uint8_t size) //0x18 +{ + return (-3); +}; + +int bth_evt_loopback_command(uint8_t *bth_p, uint8_t size) //0x19 +{ + return (-3); +}; + +int bth_evt_data_buffer_overflow(uint8_t *bth_p, uint8_t size) //0x1A +{ + return (-3); +}; + +int bth_evt_max_slots_change(uint8_t *bth_p, uint8_t size) //0x1B +{ + evt_max_slots_change bth_q; + int i; +// store_le16(&bth_q.handle,*((uint16_t*)((uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____handle))); + __bthtomc16((uint8_t*)&(bth_q.handle),(uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____handle); + +// store_le16(&bth_q.max_slots,*((uint16_t*)((uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____max_slots))); + __bthtomc16((uint8_t*)&(bth_q.max_slots),(uint8_t*)bth_p+EVT_MAX_SLOTS_CHANGE____max_slots); + +/*Search through all devices with which the communications was started???*/ + /*prohledam vsechna zarizeni, se kterymi mam uzavrenou komunikaci*/ + for(i=0;i<8;i++) + { +/* sci_rs232_sendch('j',sci_rs232_chan_default); //do PC + VypisHexa((void*)&(((bths_connect_bluet*)bth_connected[i])->handle),2); + sci_rs232_sendch('j',sci_rs232_chan_default); //do PC*/ + if(bth_connected[i]!=NULL) + { + +/* sci_rs232_sendch('k',sci_rs232_chan_default); //do PC + VypisHexa((void*)&(bth_q.handle),2); + sci_rs232_sendch('k',sci_rs232_chan_default); //do PC*/ + + if(bth_connected[i]->handle==bth_q.handle) + { + + bth_connected[i]->max_slots=bth_q.max_slots; + return (0); + }; + }; + }; + return(-1); +}; + +int bth_evt_read_clock_offset_complete(uint8_t *bth_p, uint8_t size) //0x1C +{ + return (-3); +}; + +int bth_evt_conn_ptype_changed(uint8_t *bth_p, uint8_t size) //0x1D +{ + evt_conn_ptype_changed bth_q; +// uint16_t local_ptype; + int dev_num; + store16(bth_q.status,*((uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____status)); +// store_le16(&bth_q.handle,*((uint16_t*)((uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____handle))); + __bthtomc16((uint8_t*)&(bth_q.handle),(uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____handle); + +// store_le16(&bth_q.ptype,*((uint16_t*)((uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____ptype))); + __bthtomc16((uint8_t*)&(bth_q.ptype),(uint8_t*)bth_p+EVT_CONN_PTYPE_CHANGED____ptype); + + dev_num=bth_find_conected_dev(bth_q.handle); +//bth_local_info.pkt_type; - local info on packets +// Change_Connection_Packet_Type - command, which can in case of need setup its packets +//skterym se pripadne daji nastavit svoje packety + if(dev_num>-1); + { + bth_connected[dev_num]->ptype=bth_q.ptype; + return(bth_q.status); + }; + return(-1); + +}; + +int bth_evt_qos_violation(uint8_t *bth_p, uint8_t size) //0x1E +{ + return (-3); + +}; + +int bth_evt_page_scan_mode_change(uint8_t *bth_p, uint8_t size) //0x1F +{ + return (-3); + + +}; + +int bth_evt_pscan_rep_mode_change(uint8_t *bth_p, uint8_t size) //0x20 +{ + evt_pscan_rep_mode_change bth_q; + memcpy(&(bth_q.bdaddr),(uint8_t*)bth_p+EVT_PSCAN_REP_MODE_CHANGE____bdaddr,sizeof(bdaddr_t)); + store16(bth_q.pscan_rep_mode,*((uint8_t*)bth_p+EVT_PSCAN_REP_MODE_CHANGE____pscan_rep_mode)); + + /*Search through all devices with which the communications was started, needs to be written up */ + /*prohledam vsechna zarizeni dle BDADDR, se kterymi mam uzavrenou komunikaci -NUTNO DOPSAT NOTE*/ + //memcpy + + return(-1); +}; + +int bth_evt_flow_spec_complete(uint8_t *bth_p, uint8_t size) //0x21 +{ + return (-3); +}; + +int bth_evt_inquiry_result_with_rssi(uint8_t *bth_p, uint8_t size) //0x22 +{ + return (-3); + +}; diff --git a/bth_tests/bluetooth/bth_fce_out.h b/bth_tests/bluetooth/bth_fce_out.h new file mode 100644 index 0000000..d03967d --- /dev/null +++ b/bth_tests/bluetooth/bth_fce_out.h @@ -0,0 +1,20 @@ +/******************************************************************* + bluetooth library + + bth_fce_out.h - list of fce for using in aplication + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#include + + + +int bth_send_queue(void); +void bth_parametr_slave(void); +void bth_init(void); +void bth_start(void); +int l2cap_send_data(int inx_handle, int inx_chanal); +int bth_recieve_packet(int c); +void bth_conv_char_text(uint8_t zn); diff --git a/bth_tests/bluetooth/bth_h8s2638.h b/bth_tests/bluetooth/bth_h8s2638.h new file mode 100644 index 0000000..36061d1 --- /dev/null +++ b/bth_tests/bluetooth/bth_h8s2638.h @@ -0,0 +1,23 @@ +/******************************************************************* + bluetooth library + + bth_h8s2638.h - list of function for TPU direction + fce are using for h8s2638 + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + + +#ifndef BTH_H82638H_H +#define BTH_H82638H_H + +void bth_init_pkt_controll(void); +void bth_inruppt_pkt_controll(void); +void bth_clear_TPU_counter(void); +void bth_stop_TPU_counter(void); +void bth_start_TPU_counter(void); +long int bth_get_timer(void); +void bth_nul_timer(void); +#endif diff --git a/bth_tests/bluetooth/bth_inface.c b/bth_tests/bluetooth/bth_inface.c new file mode 100644 index 0000000..c3ce8df --- /dev/null +++ b/bth_tests/bluetooth/bth_inface.c @@ -0,0 +1,99 @@ +/******************************************************************* + bluetooth library + + bth_inface.c - fce for reading and getting and putting chars to a data queue + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#include +#ifdef BTH_LX +#include + +#else +#include "types.h" +#include +#endif + +#include +#include "bth_inface.h" +#include "bth_inface.h" + +#ifndef CONFIG_BLUETOOTH_LINUX +#include +#endif + +/* the number of communication structures i.e. how many channels can be used for communication. It alse specifies howmany + independent couples of I/O buffers is here.*/ +/*pocet komunikacnich struktur - tj. pres kolik kanalu je mozno komunikovat, + to zaroven znamena, kolik je nezavislych dvojic I/O bufferu*/ + bth_inface_info_t bth_inface_chan_array[BTH_INFACE_CHANAL]; + +//-- --- ----- ----- ---- ------ ----- -- ---- -- +//-- --- ----- ----- ---- ------ ----- -- ---- -- + +/** + * fce write one char to in-buffer. Fce return a code of char. If a value is -1 its signal for error +*/ +int bth_inface_r_isr(int chan, int val) +{ + if(bth_inface_que_put(&(bth_inface_chan_array[chan].bth_inface_que_in),val)<0) + {return (-1);}; + return (val); +} + +/** + * fce read one char of out-buffer. Fce return a code of char. If is a value -1 than is not new char +*/ +int bth_inface_t_isr(int chan) +{ + short val; + if((val=bth_inface_que_get(&(bth_inface_chan_array[chan].bth_inface_que_out)))>=0) + { + return val; + } + return (-1); +} + +/** + * init buffer for first chanal - 0 (nm. is index of array) +*/ +int bth_inface_setup(int chan) +{ + bth_inface_info_t *bth_inface; + bth_inface = &(bth_inface_chan_array[chan]); // the number of communication interfaces bth - PC + bth_inface->bth_inface_que_in.buf_beg = bth_inface->bth_inface_buff_in; + bth_inface->bth_inface_que_in.buf_end = bth_inface->bth_inface_que_in.buf_beg+BTH_INFACE_BUF_LEN; + bth_inface->bth_inface_que_in.ip = bth_inface->bth_inface_que_in.buf_beg; + bth_inface->bth_inface_que_in.op = bth_inface->bth_inface_que_in.buf_beg; + + bth_inface->bth_inface_que_out.buf_beg = bth_inface->bth_inface_buff_out; + bth_inface->bth_inface_que_out.buf_end = bth_inface->bth_inface_que_out.buf_beg+BTH_INFACE_BUF_LEN; + bth_inface->bth_inface_que_out.ip = bth_inface->bth_inface_que_out.buf_beg; + bth_inface->bth_inface_que_out.op = bth_inface->bth_inface_que_out.buf_beg; + + return 1; +} + + +/****************************************************************************/ +/****************************************************************************/ + + +/** + * init using in your program +*/ +/* +int main() +{ + bth_inface_setup(0); + bth_inface_r_isr(&bth_inface_chan_array[0],'c'); //internal-fce + bth_inface_recch(0); //read one char of buffer + bth_inface_sendch('a', 0); //write one char to out buffer for chanal 0 + bth_inface_t_isr(&bth_inface_chan_array[0]); //internal-fce + + return 0; +}; +*/ + diff --git a/bth_tests/bluetooth/bth_inface.h b/bth_tests/bluetooth/bth_inface.h new file mode 100644 index 0000000..02d1f58 --- /dev/null +++ b/bth_tests/bluetooth/bth_inface.h @@ -0,0 +1,79 @@ + +/******************************************************************* + bluetooth library + + bth_inface.h - inline fce for data queue operation + list of fce + bth_inface.c + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#ifndef _ID_BTH_INFACE_H_ +#define _ID_BTH_INFACE_H_ + +#include +#include +#ifdef CONFIG_BLUETOOTH_LINUX +#endif + +#define BTH_INFACE_CHANAL (1) +#define BTH_INFACE_BUF_LEN (70) + +typedef struct{ + uint8_t *buf_beg; //start of adress structur + uint8_t *buf_end; //end of adress structur - beg+sizeof(struct) + uint8_t *ip; //actual position at queue + uint8_t *op; //position first unread char of queue +} bth_inface_que_t; + +typedef struct bth_inface_info { + /* Queues */ + bth_inface_que_t bth_inface_que_in; + bth_inface_que_t bth_inface_que_out; + + uint8_t bth_inface_buff_in[BTH_INFACE_BUF_LEN]; + uint8_t bth_inface_buff_out[BTH_INFACE_BUF_LEN]; +} bth_inface_info_t; + + +static inline int bth_inface_que_put(bth_inface_que_t *q, int c) +{ + __u8 *p; + p=q->ip; + *(p++)=c; + if(p==q->buf_end) p=q->buf_beg; + if(p==q->op) return -1; + q->ip=p; + return c; +} + +/* get character from queue, if empty return -1 */ +static inline int bth_inface_que_get(bth_inface_que_t *q) +{ + __u8 *p; + int c; + p=q->op; + if(p==q->ip) return -1; + c=*(p++); + if(p==q->buf_end) p=q->buf_beg; + q->op=p; + return c; +} + +bth_inface_info_t bth_inface_chan_array[BTH_INFACE_CHANAL]; + +int bth_inface_setup(int chan); +int bth_inface_sendch(int c, int chan); +int bth_inface_recch(int chan); +int bth_inface_sendstr(const char *s, int chan); + +//int bth_inface_que_out_free(int chan); +//int bth_inface_que_in_ready(int chan); +//int bth_inface_setup(int chan); + +int bth_inface_r_isr(int chan, int val); +int bth_inface_t_isr(int chan); + +#endif /* _ID_BTH_INFACE_H_ */ + diff --git a/bth_tests/bluetooth/bth_main.c b/bth_tests/bluetooth/bth_main.c new file mode 100644 index 0000000..4a049ca --- /dev/null +++ b/bth_tests/bluetooth/bth_main.c @@ -0,0 +1,518 @@ +/******************************************************************* + bluetooth library + + bth_main.c - API bth library (recieve, send ...) + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ +#include +#include +#ifdef BTH_LX +#include +#include +#include +#include +#include +#else +#include +#endif + +#include + +#include "hci.h" +#include "l2cap.h" +#include "hci_event.h" +#include "hci_command.h" +#include "hci_error.h" + +//#include "hci_lib.h" +#include "bth_receive.h" +#include "inline_fce.h" +#include "bth_inface.h" +#include "bth_fce_out.h" +#include "bth_h8s2638.h" + + +#define BTH_BUF_LEN 300 + +/*--------BD address whitch are accept for connection-------------*/ +bdaddr_t bth_accept_bd_addr[]={}; + +/*----------------local device info (master) -----------------------*/ +bths_dev_info bth_local_info;//={0,{0,0,0,0,0,0,0,0},{0,0,0},0,{0,0,0},0}; + +/*----------------conect device info (slave) -----------------------*/ +bths_connect_bluet* bth_connected[8]; + +/*-------------------------------- recieve data buffer -----------------------------*/ +bth_que_t bth_rs232_que_in; +//bth_que_t bth_inface_que_in; +//bth_que_t bth_inface_que_out; + + + +void *bth_array_adrr_comm_packet[LENCOMMAND]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; +bths_command_buf_info bth_com_buf_info={LENCOMMAND,0,0}; +/***********************************************************************************/ +void *bth_array_adrr_check_packet[LENCOMMAND]={NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL}; +bths_command_buf_info bth_check_buf_info={LENCOMMAND,0,0}; +/***********************************************************************************/ + +/*FIXME this check synchronisation of received data using TPU unit of CPU*/ +uint8_t bth_controll_flag=0; + + +/**-------------------------------------------------------------------------------*/ +/*FIXME ----- sending of command, if the local bluetooth is free (ready to send)------*/ +/* 0 = data moved to SCI buffer = they will be sent, bluetooth device is free + 1 = it wasn't possible to move tha command to SCI bufferu, but bluet device is free + 2 = bluetooth device is busy, ie. data were not moved to the bufferu + 3 = there is no space left in confirmation queue*/ + +/** + * After this function is called, the packet, which is in the command queue, is sent. If there is no new + * packet or the device is busy, nothing is done. + * + * Po zavolani funkce, se odesle paket, ktery je zarazen ve fronte paketu k odeslani (bth zazizeni je + * volne), pokud neni novy paket nebo zazizeni neni volne, nic se nevykona +*/ +int bth_send_queue(void) +{ + int i; + int hp_size; + if(bth_local_info.busy!=0) + {return 1;}; //device is busy + if(bth_com_buf_info.aktual==bth_com_buf_info.sent) //PRAVDEPODOBNE neni co odesilat + { + if(bth_com_buf_info.sent<(LENCOMMAND-2)) + { + if(bth_array_adrr_comm_packet[bth_com_buf_info.sent+1]==NULL) + {return 1;}; //There is certainly nothing to send + } + else + { + if(bth_array_adrr_comm_packet[0]==NULL) + {return 1;}; //There is certainly nothing to send + }; + }; + + /*bth_send_packet(AdrFrom,howmanyBytes;)*/ + switch(*(uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.sent]) + { + case HCI_ACLDATA_PKT: + __bthtomc16((uint8_t*)&(hp_size),((uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.sent])+HCI_PKT_SIZE+HCI_ACL_HDR____dlen); + hp_size=hp_size+HCI_ACL_HDR_SIZE+HCI_PKT_SIZE; + if(!(bth_send_packet(bth_array_adrr_comm_packet[bth_com_buf_info.sent],hp_size))) + { + free(bth_array_adrr_comm_packet[bth_com_buf_info.sent]); + bth_array_adrr_comm_packet[bth_com_buf_info.sent]=NULL; + if(bth_com_buf_info.sent<(LENCOMMAND-2)){bth_com_buf_info.sent++;} + else{ bth_com_buf_info.sent=0;}; + return(0); + }; + free(bth_array_adrr_comm_packet[bth_com_buf_info.sent]); + bth_array_adrr_comm_packet[bth_com_buf_info.sent]=NULL; + return (-6); + case HCI_COMMAND_PKT: + hp_size=((uint16_t)*(((uint8_t*)bth_array_adrr_comm_packet[bth_com_buf_info.sent])+HCI_PKT_SIZE+2)+HCI_COMMAND_HDR_SIZE+HCI_PKT_SIZE); + if(!(bth_send_packet(bth_array_adrr_comm_packet[bth_com_buf_info.sent],hp_size))) + {/*sent - add the command to allow confirmation*/ + for(i=0; i>4; +#ifdef BTH_LX + uint8_t map_leters[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + sci_rs232_sendch(map_leters[val],sci_rs232_chan_default); + val=(zn&0x0f); + sci_rs232_sendch(map_leters[val],sci_rs232_chan_default); +#endif + return; +}; + + + +/** + *Inserts a character to the queue + */ + +static inline int bth_que_put(bth_que_t *q, int c) +{ + uint8_t *p; + p=q->ip; //FIXME set us to the actual position in the file + *(p++)=c; //store the character to the next byte + if(p==q->buf_end) return -1;//this is not the ring buffer p=q->buf_beg; +// if(p==q->op) return -1; + q->ip=p; + return 0; //in case of success return the character, otherwise -1 +} + + +/** +//FIXME + *received HCI data packet is sent as point to point +*/ + +int bth_pkt_type_pointopoint(uint16_t handle, uint8_t bound_flag, uint8_t *bth_p, uint16_t size) +{ + l2cap_hdr bth_l2cap_packet; + int bth_dev_num; + int bth_size_data; + uint8_t *bth_data; + int flag; + + switch(bound_flag) + { + case 0x20:/*first data packet L2CAP*/ + bth_dev_num=bth_find_conected_dev(handle); + __bthtomc16((uint8_t*)&(bth_l2cap_packet.len),(uint8_t*)bth_p+L2CAP_HDR____len); + __bthtomc16((uint8_t*)&(bth_l2cap_packet.cid),(uint8_t*)bth_p+L2CAP_HDR____cid); + + + if(bth_dev_num>-1) + { + switch((uint8_t)(bth_l2cap_packet.cid)) + { + case 0x00: + return(-3); + case 0x01: + l2cap_signaling(((uint8_t*)bth_p+L2CAP_CMD_HDR_SIZE),(size+L2CAP_HDR____len),bth_dev_num); + return(0); + case 0x02: + return(0); + }; + /*FIXME real data ...*/ + /*We have to find the channel with the CID number for device bth_dev_num*/ + if(bth_find_chanal(bth_dev_num, bth_l2cap_packet.cid)>-1) + { + /*here are the received data, which are not used for confguration */ + + + bth_data=(uint8_t*)bth_p+L2CAP_HDR_SIZE; + bth_size_data=size-L2CAP_HDR_SIZE; + int i; +// uint8_t odesli[]={'a','h','o','j'}; + for(i=0; i=0){ +// sci_rs232_sendch(*((uint8_t*)bth_data+i),sci_rs232_chan_default); //do PC +// VypisHexa((void*)((uint8_t*)bth_data+i),1); + }else + { + /*queue is full, neni schopen prijmout dalsi znaky*/ +// sci_rs232_sendch('.',sci_rs232_chan_default); //do PC + }; + }; + +// VypisHexa(bth_data,bth_size_data); + return (0); + }; + return(-5); + }; + return(-1); + case 0x40: return(-3); /*next data packet L2CAP*/ /*function is not written, I receive only one pakcet of the message*/ + case 0x30: return (-4); /*Reserved for future use*/ + case 0x00: return (-4); /*Reserved for future use*/ + }; + return(-1); +}; + + +/** + *Received HCI data packet is sent as broadcast (not finished function) + */ +int bth_pkt_type_broadcast(uint16_t handle, uint8_t bound_flag, uint8_t *bth_p, uint16_t size) +{ + switch(bound_flag) + { + case 0x20:/*first data packet L2CAP*/ + return(-3); /*neni napsano pro prijem znaku broadcast cestou*/ + case 0x40: return(-3); /*next data packet L2CAP*/ /*funkce neni rozepsana, prijmam jen 1pkt zpravy*/ + case 0x30: return (-4); /*Reserved for future use*/ + case 0x00: return (-4); /*Reserved for future use*/ + }; + return(-1); +}; + + + +/** + *Received HCI data packet is send to piconet (not finished function) + */ +int bth_pkt_type_piconet(uint16_t handle, uint8_t bound_flag, uint8_t *bth_p, uint16_t size) +{ + switch(bound_flag) + { + case 0x20:/*first data packet L2CAP*/ + return(-3); /*neni napsano pro prijem znaku piconet cestou*/ + case 0x40: return(-3); /*next data packet L2CAP*/ /*funkce neni rozepsana, prijmam jen 1pkt zpravy*/ + case 0x30: return (-4); /*Reserved for future use*/ + case 0x00: return (-4); /*Reserved for future use*/ + }; + return(-1); +}; + + + +/** + *Reserved for future (not finished) + */ +int bth_pkt_type_reserved(uint16_t handle, uint8_t bound_flag, uint8_t *bth_p, uint16_t size) +{ + return(-3); +}; + + +/****************************************************************************/ +/****************************************************************************/ + +/** + *pointers to functions. Functions are called according to the received HCI pakcet + */ +typedef int (*bth_kind_pkt)(uint16_t handle, uint8_t bound_flag, uint8_t *bth_p, uint16_t size); +bth_kind_pkt bth_char_pkt_fce[]={ + bth_pkt_type_pointopoint, bth_pkt_type_broadcast, bth_pkt_type_piconet, bth_pkt_type_reserved}; +#define COM_PROT_SUM_FC (sizeof(bth_char_pkt_fce)/sizeof(bth_char_pkt_fce[0])) + + +/** + *pointrs to functions. Functions are called according to the event code, decoded from the received HCI packet + */ +typedef int (*bth_p_ivent_fce)(uint8_t *bth_p, uint8_t size); +bth_p_ivent_fce bth_event_array_fce[]={bth_evt_none,bth_evt_inquiry_complete, bth_evt_inquiry_result, + bth_evt_conn_complete, bth_evt_conn_request, bth_evt_disconn_complete, + bth_evt_auth_complete, bth_remote_name_req_complete, + bth_evt_encrypt_cahnge, bth_evt_change_conn_link_key_complete, + bth_evt_master_link_key_complete, bth_evt_read_remote_features_complete, + bth_evt_read_remote_version_complete, bth_evt_qos_setup_complete, + bth_evt_cmd_complete, bth_evt_cmd_status, bth_evt_hardware_error, + bth_evt_flush_occurred, bth_evt_role_cahage, bth_evt_num_comp_pkts, + bth_evt_mode_change, bth_evt_return_link_keys, bth_evt_pin_code_req, + bth_evt_link_key_req, bth_evt_link_key_notify, bth_evt_loopback_command, + bth_evt_data_buffer_overflow, bth_evt_max_slots_change, + bth_evt_read_clock_offset_complete, bth_evt_conn_ptype_changed, + bth_evt_qos_violation, bth_evt_page_scan_mode_change, + bth_evt_pscan_rep_mode_change, bth_evt_flow_spec_complete, + bth_evt_inquiry_result_with_rssi}; + +#define EV_SUM_FC (sizeof(bth_event_array_fce)/sizeof(bth_event_array_fce[0])) + + +/** + *The main function, which stores the received character "c" (from bth) to the input queue, checks if there is the whole pakcet in the queue and if so, it calls functions for processing the packet. (for ACL HCI and for Event HCI) + */ +int bth_recieve_packet(int c) +{ + hci_event_hdr bth_event_packet; + hci_acl_hdr bth_acl_packet; + uint8_t *typ_paket; + int error_code; + uint8_t char_acl_pkt; + uint8_t *data_ad; + uint8_t com_pr; + + if(bth_controll_flag!=0) + { + bth_stop_TPU_counter(); + bth_clear_TPU_counter(); + bth_start_TPU_counter(); + if(bth_get_timer()>0) + { + bth_rs232_que_in.ip=bth_rs232_que_in.buf_beg; + bth_nul_timer(); + }; + }; + + +#ifndef BTH_LX + VypisHexa((uint8_t*)&c,1); +#endif + //VypisHexa((uint8_t*)&c,1); + bth_que_put(&bth_rs232_que_in, c); //store the received character to the queue + typ_paket=((uint8_t*)bth_rs232_que_in.buf_beg); //determine the type of the pakcet ACL, Even, SCO ... + switch(*typ_paket) + { + case HCI_EVENT_PKT: + /*fill in structure "hci_event_hdr" from the queue (bye by byte)*/ + store8(bth_event_packet.evt, *(((uint8_t*)bth_rs232_que_in.buf_beg)+HCI_PKT_SIZE)); + store8(bth_event_packet.plen, *(((uint8_t*)bth_rs232_que_in.buf_beg)+HCI_PKT_SIZE+1)); + + if(bth_rs232_que_in.ip-bth_rs232_que_in.buf_beg>3) + { + if((bth_rs232_que_in.ip-bth_rs232_que_in.buf_beg) == (bth_event_packet.plen+HCI_EVENT_HDR_SIZE+HCI_PKT_SIZE)) + { + /*****/ + if(bth_controll_flag!=0) + { + bth_stop_TPU_counter(); + }; + /*******/ + + /*pointer to the function matching the event code*/ + if(bth_event_packet.evt=0) + { + // bth_error_detect_status((uint8_t)error_code); //error msg + } + else + {//bth_error_detect_event((uint8_t)(-error_code)); //error msg + }; + }; + }; + return 0; + case HCI_ACLDATA_PKT: + if(bth_rs232_que_in.ip-bth_rs232_que_in.buf_beg>5) + { + __bthtomc16((uint8_t*)&(bth_acl_packet.dlen),(((uint8_t*)bth_rs232_que_in.buf_beg)+HCI_PKT_SIZE+HCI_ACL_HDR____dlen)); + + + if((bth_rs232_que_in.ip-bth_rs232_que_in.buf_beg) == ((bth_acl_packet.dlen)+HCI_ACL_HDR_SIZE+HCI_PKT_SIZE)) + { + + /* **** check the adjacency of two characters TPU3 **** */ + if(bth_controll_flag!=0) + { + bth_stop_TPU_counter(); + }; + /*****************************************************/ + + __bthtomc16((uint8_t*)&(bth_acl_packet.handle),(((uint8_t*)bth_rs232_que_in.buf_beg)+HCI_PKT_SIZE+HCI_ACL_HDR____handle)); + bth_acl_packet.handle=bth_acl_packet.handle & 0x0fff; + + /*variable 'char_acl_pkt' stores the properties of the packet, if it is point to point or broadcast, or char. L2CAP*/ + store8(char_acl_pkt, (0xf0&*(((uint8_t*)bth_rs232_que_in.buf_beg)+HCI_PKT_SIZE+HCI_ACL_HDR____handle+1))); + + /*decide which packet is this (PtP,Piconet,broat...) and the type of communication (L2CAP, HCI)*/ + data_ad=(uint8_t*)bth_rs232_que_in.buf_beg+HCI_PKT_SIZE+HCI_ACL_HDR_SIZE; + com_pr=char_acl_pkt&0xc0; + if(com_pr0) + { + + bth_controll_flag=10; + bth_stop_TPU_counter(); + bth_clear_TPU_counter(); + bth_nul_timer(); + }; + + bth_local_info.busy=0; +}; + + +/** + * Setting of the queue - initialization function +*/ +void bth_init(void) +{ + static uint8_t bth_array_char_in[70]; +// bth_check_command_for_send=NULL; + + bth_rs232_que_in.buf_end=(uint8_t*)bth_array_char_in+BTH_BUF_LEN; + bth_rs232_que_in.buf_beg=bth_array_char_in; + bth_rs232_que_in.ip=bth_array_char_in; +}; + +/****************************************************************************/ +/****************************************************************************/ + +/** + * Auxiliary function, which converts characetrs to the printable form +*/ +int VypisHexa(uint8_t *s, int delka) +{ + + uint8_t tisk[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + uint8_t i,zn; + for(i=0; i>4)&0x000F)]); + printf("%c",tisk[zn & 0x000F]); +#else + sci_rs232_sendch(tisk[(zn&0xf0)>>4],sci_rs232_chan_default); //to PC + sci_rs232_sendch(tisk[(zn&0x0f)],sci_rs232_chan_default); //to PC +#endif + }; + + return 0; +}; + diff --git a/bth_tests/bluetooth/bth_receive.h b/bth_tests/bluetooth/bth_receive.h new file mode 100644 index 0000000..0064dcc --- /dev/null +++ b/bth_tests/bluetooth/bth_receive.h @@ -0,0 +1,21 @@ +/******************************************************************* + bluetooth library + + bth_receive.h - definition of a check structur for enter queue. + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#ifndef BTH_RECEIVE_H +#define BTH_RECEIVE_H + +typedef struct{ + uint8_t *buf_beg; //start of adress structur + uint8_t *buf_end; //end of adress structur - beg+sizeof(struct) + uint8_t *ip; //actual position at queue + uint8_t *op; // not use +} bth_que_t; + + +#endif diff --git a/bth_tests/bluetooth/fake_pkt_controll.c b/bth_tests/bluetooth/fake_pkt_controll.c new file mode 100644 index 0000000..05a80f1 --- /dev/null +++ b/bth_tests/bluetooth/fake_pkt_controll.c @@ -0,0 +1,63 @@ +/******************************************************************* + bluetooth library + + h2638_pkt_control.c - fce for TPU operation + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#include +#include "hci.h" +#include "bth_h8s2638.h" + + +long int timer; + +/** + * Starts TPU channel 1 +*/ +void bth_start_TPU_counter(void) +{ +}; + + +/** + * Stop TPU 1 + */ +void bth_stop_TPU_counter(void) +{ +}; + + +/** + * Reset TPU 1 + */ +void bth_clear_TPU_counter(void) +{ +}; + +/** + * Returns the number of timer interrupts + */ +long int bth_get_timer(void) +{ + return timer; +}; + +/** + * Zeroes the timer variable + */ +void bth_nul_timer(void) +{ + timer=0; +}; + + +/** + * Timer initialization - HW 1-timer overflow; 2-???Dosazeni citace hodnoty TIER1_TGIEAm + */ +void bth_init_pkt_controll(void) +{ +}; + diff --git a/bth_tests/bluetooth/h2638_pkt_controll.c b/bth_tests/bluetooth/h2638_pkt_controll.c new file mode 100644 index 0000000..2046382 --- /dev/null +++ b/bth_tests/bluetooth/h2638_pkt_controll.c @@ -0,0 +1,121 @@ +/******************************************************************* + bluetooth library + + h2638_pkt_control.c - fce for TPU operation + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#include +#include +#include +#include +#include +#include "hci.h" +#include "bth_h8s2638.h" + + +long int timer; + +/** + * interrupt hanlder, increments the timer variable and blinks LEDs + */ +void bth_inruppt_pkt_controll(void) __attribute__ ((interrupt_handler)); + +void bth_inruppt_pkt_controll(void) +{ + static char count = 0; + count++; + if (count%2) DEB_LED_ON(0); + else DEB_LED_OFF(0); + + + //*TPU_TSR1 &= ~TSR1_TCFVm ; //reset overflow flag (clear interrupt) + *TPU_TSR1 &= ~TSR1_TGFAm; + timer++; +// *TPU_TSR1 &= ~TSR1_TCFVm ; //reset overflow flag (clear interrupt) +}; + + +/** + * Starts TPU channel 1 +*/ +void bth_start_TPU_counter(void) +{ + *TPU_TSTR|=(1<<1); /* Start channel 1 */ +}; + + +/** + * Stop TPU 1 + */ +void bth_stop_TPU_counter(void) +{ + *TPU_TSTR&=~(1<<1); /* Stop channel 1 */ +}; + + +/** + * Reset TPU 1 + */ +void bth_clear_TPU_counter(void) +{ + *TPU_TCNT1=0; +}; + + +/** + * Returns the number of timer interrupts + */ +long int bth_get_timer(void) +{ + return timer; +}; + +/** + * Zeroes the timer variable + */ +void bth_nul_timer(void) +{ + timer=0; +}; + + +/** + * Timer initialization - HW 1-timer overflow; 2-???Dosazeni citace hodnoty TIER1_TGIEAm + */ +void bth_init_pkt_controll(void) +{ + +#if 0 + *SYS_MSTPCRA &= ~MSTPCRA_TPUm; // power TPU unit + + *TPU_TCR1 =0x00 | 0x06; //rising edge, f divided by 256 + *TPU_TMDR1 =0x00; // normal mode + *TPU_TSR1 &= ~TSR1_TCFVm ; //reset overflow flag + *TPU_TIER1 |=TIER1_TCIEVm; //enable overflow interrupt + + excptvec_set(42,bth_inruppt_pkt_controll); + + *TPU_TSTR |=TSTR_CST1m; //start timer +#endif + +#if 1 + /* TPU initialization */ + *SYS_MSTPCRA&=~MSTPCRA_TPUm; + // *TPU_TSTR&=~(1<<1); /* Stop channel 4 */ + /* system clock/1 ,rising edge, clearing source TGRA */ + *TPU_TCR1=(TPCR_TPSC_F64 | TPCR_CKEG_RIS | TPCR_CCLR_TGRA); + /* normal mode */ + *TPU_TMDR1=TPMDR_MD_NORMAL; + /* TGRA initiates interrupt */ + *TPU_TIER1|=TIER1_TGIEAm; + excptvec_set(EXCPTVEC_TGI1A,bth_inruppt_pkt_controll); + + *TPU_TGR1A=(10000); + *TPU_TSTR |=TSTR_CST1m; //start timer +#endif + bth_controll_flag=10; +}; + diff --git a/bth_tests/bluetooth/hci.h b/bth_tests/bluetooth/hci.h new file mode 100644 index 0000000..70ce944 --- /dev/null +++ b/bth_tests/bluetooth/hci.h @@ -0,0 +1,294 @@ +/******************************************************************* + bluetooth library + + hci.h - main structures for keeping an information about a queue, + definition of global val, and any macros and inline fce + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + + + +#ifndef HCI_H_H +#define HCI_H_H + +#include +#include +#ifdef CONFIG_BLUETOOTH_LINUX +#include +#endif + +/* Byte order conversions */ +#if __BYTE_ORDER == __LITTLE_ENDIAN +#define htobs(d) (d) +#define htobl(d) (d) +#define btohs(d) (d) +#define btohl(d) (d) +#elif __BYTE_ORDER == __BIG_ENDIAN +#define htobs(d) bswap_16(d) +#define htobl(d) bswap_32(d) +#define btohs(d) bswap_16(d) +#define btohl(d) bswap_32(d) +#else +#error "Unknown byte order" +#endif + + +/* BD Address */ +typedef struct { + uint8_t b[6]; +} bdaddr_t; + + +#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}}) +#define BDADDR_ALL (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}) +#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}}) + +/* Copy, swap, convert BD Address */ +// static inline int bacmp(const bdaddr_t *ba1, const bdaddr_t *ba2) +// { +// return memcmp(ba1, ba2, sizeof(bdaddr_t)); +// } +// static inline void bacpy(bdaddr_t *dst, const bdaddr_t *src) +// { +// memcpy(dst, src, sizeof(bdaddr_t)); +// } + +/*pro typ char (nikoliv u16)*/ +#define store8(field, val) field=val; + + +// Returns an offset of a field in a structure +#define OFFSETOF(struct_type, field) \ + ((int)&(((struct_type *)0)->field)) + +/********************************************************************************/ +/*----------------------------- DEFINICE MAKER -----------------------------*/ +#define cmd_opcode_pack(ogf, ocf) (uint16_t)((ocf & 0x03ff)|(ogf << 10)) +#define cmd_opcode_ogf(op) (op >> 10) +#define cmd_opcode_ocf(op) (op & 0x03ff) +/********************************************************************************/ + +#define BDADDR_ANY (&(bdaddr_t) {{0, 0, 0, 0, 0, 0}}) +#define BDADDR_ALL (&(bdaddr_t) {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}) +#define BDADDR_LOCAL (&(bdaddr_t) {{0, 0, 0, 0xff, 0xff, 0xff}}) + +/*pocet L2cap spojeni, ktere muze byt navazano s jednim BT zarizenim*/ +#define L2CAP_NUM_OF_CANAL 2 + + +/* HCI Packet types */ +#define HCI_PKT_SIZE 0x01 + +#define HCI_COMMAND_PKT 0x01 +#define HCI_ACLDATA_PKT 0x02 +#define HCI_SCODATA_PKT 0x03 +#define HCI_EVENT_PKT 0x04 +#define HCI_VENDOR_PKT 0xff +/*----------------------------- check command by event -----------------------------*/ + +typedef struct bth_ch_com { + uint16_t obcod; + int len; + void *position; + struct bth_ch_com *next; +} bths_check_command; + +/*-----------------------------buffer info -----------------------------*/ +typedef struct { + int len; + uint8_t aktual; + uint8_t sent; +} bths_command_buf_info; +/*------------------------- local device info -------------------------*/ +typedef struct { + char name[8]; + bdaddr_t bdaddr; + uint32_t flags; + uint8_t type; + uint8_t features[8]; + uint32_t pkt_type; + uint32_t link_policy; + uint32_t link_mode; + uint16_t acl_mtu; + uint16_t acl_pkts; + uint8_t sco_mtu; + uint16_t sco_pkts; + uint8_t busy; +}bths_dev_info; + +/*------------------------- connect device info -------------------------*/ +typedef struct con_bluet { + bdaddr_t bdaddr; + uint8_t grupe[8]; + uint16_t handle; + uint8_t link_type; + uint8_t encr_mode; + uint16_t max_slots; + uint16_t ptype; + uint16_t ident; + uint16_t scid[L2CAP_NUM_OF_CANAL]; + uint16_t dcid[L2CAP_NUM_OF_CANAL]; +}bths_connect_bluet; + + + +/* -------- HCI Packet structures -------- */ +/*--------------------------------*/ +typedef struct { + uint16_t opcode; /* OCF & OGF */ + uint8_t plen; +} hci_command_hdr; + #define HCI_COMMAND_HDR____opcode 0 + #define HCI_COMMAND_HDR____plen 2 +/*--------------------------------*/ +#define HCI_COMMAND_HDR_SIZE 3 +/****************************************************************/ +/****************************************************************/ +/*--------------------------------*/ +typedef struct{ + uint8_t evt; //event kod + uint8_t plen; //delka dat +} hci_event_hdr; + #define HCI_EVENT_HDR____evt 0 + #define HCI_EVENT_HDR____plen 1 +/*--------------------------------*/ +#define HCI_EVENT_HDR_SIZE 2 +/****************************************************************/ +/****************************************************************/ + +/*--------------------------------*/ +typedef struct { + uint16_t handle; /* Handle & Flags(PB, BC) */ + uint16_t dlen; +} hci_acl_hdr; + #define HCI_ACL_HDR____handle 0 + #define HCI_ACL_HDR____dlen 2 +/*--------------------------------*/ +#define HCI_ACL_HDR_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t dlen; +} hci_sco_hdr; + #define HCI_SCO_HDR____handle 0 + #define HCI_SCO_HDR____dlen 2 +/*--------------------------------*/ +#define HCI_SCO_HDR_SIZE 3 +/****************************************************************/ +/****************************************************************/ + +/*--------------------------------*/ +typedef struct { + uint16_t device; + uint16_t type; + uint16_t plen; +} hci_msg_hdr; + #define HCI_MSG_HDR____device 0 + #define HCI_MSG_HDR____type 2 + #define HCI_MSG_HDR____plen 4 +/*--------------------------------*/ +/****************************************************************/ +/****************************************************************/ + + +/*----------------local device info (master) -----------------------*/ +extern bths_dev_info bth_local_info; + +/*----------------conect device info (slave) -----------------------*/ +extern bths_connect_bluet *bth_connected[]; +//extern void *bth_for_connecting[]; + +/*---------------- command and acknowledge queues -----------------------*/ +#define LENCOMMAND 10 +extern void *bth_array_adrr_comm_packet[LENCOMMAND]; +extern bths_command_buf_info bth_com_buf_info; + +extern void *bth_array_adrr_check_packet[LENCOMMAND]; +extern bths_command_buf_info bth_check_buf_info; + +extern uint8_t bth_controll_flag; + +/*--------BD address whitch are accept for connection-------------*/ +extern bdaddr_t bth_accept_bd_addr[]; //for future use + + +inline static int bth_find_conected_dev(uint16_t handle) +{ + int j; + + for(j=0; j<8;j++) //8 moznych zarizeni, se kterymi lze komunikovat + { + if(bth_connected[j]!=NULL) + { + if(bth_connected[j]->handle==handle) + {return (j);}; + }; + } + return(-1); +}; + +inline static int bth_find_chanal(uint16_t num_dev, uint16_t chanal) +{ + int j; + for(j=0; jscid[j]==chanal) + { + return(j); + }; + } + return(-1); +}; + +inline static int bth_add_chanal_dcid(uint16_t num_dev, uint16_t chanal) +{ + int j; + for(j=0; jdcid[j]==0) + { + (bth_connected[num_dev])->dcid[j]=chanal; + return(j); + }; + } + return(-1); +}; + +inline static int bth_find_chanal_dcid(uint16_t num_dev, uint16_t chanal) +{ + int j; + for(j=0; jdcid[j]==chanal) + { + return(j); + }; + } + return(-1); +}; + +inline static int bth_find_chanal_scid(uint16_t num_dev, uint16_t chanal) +{ + int j; + for(j=0; jscid[j]==chanal) + { + return(j); + }; + } + return(-1); +}; + +/*-----------funkce ---------------*/ +int bth_send_packet(uint8_t *hp, uint16_t hp_size); +int VypisHexa(uint8_t *s, int delka); +void bth_conv_char_text(uint8_t zn); + +#endif diff --git a/bth_tests/bluetooth/hci_bluez.c b/bth_tests/bluetooth/hci_bluez.c new file mode 100644 index 0000000..e856c1c --- /dev/null +++ b/bth_tests/bluetooth/hci_bluez.c @@ -0,0 +1,21 @@ +#include "hci.h" +#include +int hci_socket; +/** + //FIXME + *Sends data of the size hp_size from address hp to the bluetooth device (UART) + */ +int bth_send_packet(uint8_t *hp, uint16_t hp_size) +{ + /*is bluetooth device free, or is it busy by the previous command?*/ + if(bth_local_info.busy==0) { + + write(hci_socket, hp, hp_size); + + bth_local_info.busy=1; + return(0); //everything sent ==== OK ===== + } else { + return 2; //busy + }; +}; + diff --git a/bth_tests/bluetooth/hci_command.h b/bth_tests/bluetooth/hci_command.h new file mode 100644 index 0000000..340d7af --- /dev/null +++ b/bth_tests/bluetooth/hci_command.h @@ -0,0 +1,1254 @@ +/******************************************************************* + bluetooth library + + hci_command.h - list of Command packet structures + + list of Command fce + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + +#ifndef HCI_COMMAND_H +#define HCI_COMMAND_H + +/****************************************************************/ +/* --------------------- Link Control ------------------------ */ +/****************************************************************/ +/****************************************************************/ + +#define OGF_LINK_CTL 0x01 + + +/****************************************************************/ +#define OCF_INQUIRY 0x0001 +/*--------------------------------*/ +typedef struct { + uint8_t lap[3]; + uint8_t length; /* 1.28s units */ + uint8_t num_rsp; +} inquiry_cp; + #define INQUIRY_CP____lap 0 + #define INQUIRY_CP____length 3 + #define INQUIRY_CP____num_rsp 4 +/*--------------------------------*/ +#define INQUIRY_CP_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +/*--------------------------------*/ +typedef struct { + uint8_t status; + bdaddr_t bdaddr; +} status_bdaddr_rp; + #define STATUS_BDADDR_RP____status 0 + #define STATUS_BDADDR_RP____bdaddr 1 +/*--------------------------------*/ +#define STATUS_BDADDR_RP_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_INQUIRY_CANCEL 0x0002 + +#define OCF_PERIODIC_INQUIRY 0x0003 +/*--------------------------------*/ +typedef struct { + uint16_t max_period; /* 1.28s units */ + uint16_t min_period; /* 1.28s units */ + uint8_t lap[3]; + uint8_t length; /* 1.28s units */ + uint8_t num_rsp; +} periodic_inquiry_cp; + #define PERIODIC_INQUIRY_CP____max_period 0 + #define PERIODIC_INQUIRY_CP____min_period 2 + #define PERIODIC_INQUIRY_CP____lap 4 + #define PERIODIC_INQUIRY_CP____length 7 +#define PERIODIC_INQUIRY_CP____num_rsp 8 +/*--------------------------------*/ +#define PERIODIC_INQUIRY_CP_SIZE 9 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_EXIT_PERIODIC_INQUIRY 0x0004 + +#define OCF_CREATE_CONN 0x0005 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint16_t pkt_type; + uint8_t pscan_rep_mode; + uint8_t pscan_mode; + uint16_t clock_offset; + uint8_t role_switch; +} create_conn_cp; + #define CREATE_CONN_CP____bdaddr 0 + #define CREATE_CONN_CP____pkt_type 6 + #define CREATE_CONN_CP____pscan_rep_mode 8 + #define CREATE_CONN_CP____pscan_mode 9 + #define CREATE_CONN_CP____clock_offset 10 + #define CREATE_CONN_CP____role_switch 12 +/*--------------------------------*/ +#define CREATE_CONN_CP_SIZE 13 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_DISCONNECT 0x0006 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t reason; +} disconnect_cp; + #define DISCONNECT_CP____handle 0 + #define DISCONNECT_CP____reason 2 +/*--------------------------------*/ +#define DISCONNECT_CP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_ADD_SCO 0x0007 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint16_t pkt_type; +} add_sco_cp; + #define ADD_SCO_CP____handle 0 + #define ADD_SCO_CP____pkt_type 2 +/*--------------------------------*/ +#define ADD_SCO_CP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_CREATE_CONN_CANCEL 0x0008 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; +} create_conn_cancel_cp; + #define CREATE_CONN_CANCEL_CP____bdaddr 0 +/*--------------------------------*/ +#define CREATE_CONN_CANCEL_CP_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_ACCEPT_CONN_REQ 0x0009 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t role; +} accept_conn_req_cp; + #define ACCEPT_CONN_REQ_CP____bdaddr 0 + #define ACCEPT_CONN_REQ_CP____role 6 +/*--------------------------------*/ +#define ACCEPT_CONN_REQ_CP_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_REJECT_CONN_REQ 0x000A +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t reason; +} reject_conn_req_cp; + #define REJECT_CONN_REQ_CP____bdaddr 0 + #define REJECT_CONN_REQ_CP____reason 6 +/*--------------------------------*/ +#define REJECT_CONN_REQ_CP_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_LINK_KEY_REPLY 0x000B +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t link_key[16]; +} link_key_reply_cp; + #define LINK_KEY_REPLY_CP____bdaddr 0 + #define LINK_KEY_REPLY_CP____link_key 6 +/*--------------------------------*/ +#define LINK_KEY_REPLY_CP_SIZE 22 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_LINK_KEY_NEG_REPLY 0x000C + +#define OCF_PIN_CODE_REPLY 0x000D +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t pin_len; + uint8_t pin_code[16]; +} pin_code_reply_cp; + #define PIN_CODE_REPLY_CP____bdaddr 0 + #define PIN_CODE_REPLY_CP____pin_len 6 + #define PIN_CODE_REPLY_CP____pin_code 7 +/*--------------------------------*/ +#define PIN_CODE_REPLY_CP_SIZE 23 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_PIN_CODE_NEG_REPLY 0x000E + +#define OCF_SET_CONN_PTYPE 0x000F +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint16_t pkt_type; +} set_conn_ptype_cp; + #define SET_CONN_PTYPE_CP____handle 0 + #define SET_CONN_PTYPE_CP____pkt_type 2 +/*--------------------------------*/ +#define SET_CONN_PTYPE_CP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_AUTH_REQUESTED 0x0011 +/*--------------------------------*/ +typedef struct { + uint16_t handle; +} auth_requested_cp; + #define AUTH_REQUESTED_CP____handle 0 +/*--------------------------------*/ +#define AUTH_REQUESTED_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_SET_CONN_ENCRYPT 0x0013 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t encrypt; +} set_conn_encrypt_cp; + #define SET_CONN_ENCRYPT_CP____handle 0 + #define SET_CONN_ENCRYPT_CP____encrypt 2 +/*--------------------------------*/ +#define SET_CONN_ENCRYPT_CP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_CHANGE_CONN_LINK_KEY 0x0015 +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}change_conn_link_key_cp; + #define CHANGE_CONN_LINK_KEY_CP____handle 0 +/*--------------------------------*/ +#define CHANGE_CONN_LINK_KEY_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_MASTER_LINK_KEY 0x0017 +/*--------------------------------*/ +typedef struct { + uint8_t key_flag; +}master_link_key_cp; + #define MASTER_LINK_KEY_CP____key_flag 0 +/*--------------------------------*/ +#define MASTER_LINK_KEY_CP_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_REMOTE_NAME_REQ 0x0019 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t pscan_rep_mode; + uint8_t pscan_mode; + uint16_t clock_offset; +}remote_name_req_cp; + #define REMOTE_NAME_REQ_CP____bdaddr 0 + #define REMOTE_NAME_REQ_CP____pscan_rep_mode 6 + #define REMOTE_NAME_REQ_CP____pscan_mode 7 + #define REMOTE_NAME_REQ_CP____clock_offset 8 +/*--------------------------------*/ +#define REMOTE_NAME_REQ_CP_SIZE 10 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_REMOTE_NAME_REQ_CANCEL 0x001A +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; +}remote_name_req_cancel_cp; + #define REMOTE_NAME_REQ_CANCEL_CP____bdaddr 0 +/*--------------------------------*/ +#define REMOTE_NAME_REQ_CANCEL_CP_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_REMOTE_FEATURES 0x001B +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}read_remote_features_cp; + #define READ_REMOTE_FEATURES_CP____handle 0 +/*--------------------------------*/ +#define READ_REMOTE_FEATURES_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_REMOTE_EXT_FEATURES 0x001C +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t page_num; +}read_remote_ext_features_cp; + #define READ_REMOTE_EXT_FEATURES_CP____handle 0 + #define READ_REMOTE_EXT_FEATURES_CP____page_num 2 +/*--------------------------------*/ +#define READ_REMOTE_EXT_FEATURES_CP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_REMOTE_VERSION 0x001D +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}read_remote_version_cp; + #define READ_REMOTE_VERSION_CP____handle 0 +/*--------------------------------*/ +#define READ_REMOTE_VERSION_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_CLOCK_OFFSET 0x001F +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}read_clock_offset_cp; + #define READ_CLOCK_OFFSET_CP____handle 0 +/*--------------------------------*/ +#define READ_CLOCK_OFFSET_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LMP_HANDLE 0x0020 + +#define OCF_SETUP_SYNC_CONN 0x0028 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint32_t tx_bandwith; + uint32_t rx_bandwith; + uint16_t max_latency; + uint16_t voice_setting; + uint8_t retrans_effort; + uint16_t pkt_type; +}setup_sync_conn_cp; + #define SETUP_SYNC_CONN_CP____handle 0 + #define SETUP_SYNC_CONN_CP____tx_bandwith 2 + #define SETUP_SYNC_CONN_CP____rx_bandwith 6 + #define SETUP_SYNC_CONN_CP____max_latency 10 + #define SETUP_SYNC_CONN_CP____voice_setting 12 + #define SETUP_SYNC_CONN_CP____retrans_effort 14 + #define SETUP_SYNC_CONN_CP____pkt_type 15 +/*--------------------------------*/ +#define SETUP_SYNC_CONN_CP_SIZE 17 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_ACCEPT_SYNC_CONN_REQ 0x0029 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint32_t tx_bandwith; + uint32_t rx_bandwith; + uint16_t max_latency; + uint16_t voice_setting; + uint8_t retrans_effort; + uint16_t pkt_type; +}accept_sync_conn_req_cp; + #define ACCEPT_SYNC_CONN_REQ_CP____bdaddr 0 + #define ACCEPT_SYNC_CONN_REQ_CP____tx_bandwith 6 + #define ACCEPT_SYNC_CONN_REQ_CP____rx_bandwith 10 + #define ACCEPT_SYNC_CONN_REQ_CP____max_latency 14 + #define ACCEPT_SYNC_CONN_REQ_CP____voice_setting 16 + #define ACCEPT_SYNC_CONN_REQ_CP____retrans_effort 18 + #define ACCEPT_SYNC_CONN_REQ_CP____pkt_type 19 +/*--------------------------------*/ +#define ACCEPT_SYNC_CONN_REQ_CP_SIZE 21 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_REJECT_SYNC_CONN_REQ 0x002A +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t reason; +}reject_sync_conn_req_cp; + #define REJECT_SYNC_CONN_REQ_CP____bdaddr 0 + #define REJECT_SYNC_CONN_REQ_CP____reason 6 +/*--------------------------------*/ +#define REJECT_SYNC_CONN_REQ_CP_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + + + +/****************************************************************/ +/* --------------------- Link Policy ------------------------ */ +/****************************************************************/ +/****************************************************************/ + +#define OGF_LINK_POLICY 0x02 + +#define OCF_HOLD_MODE 0x0001 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint16_t max_interval; + uint16_t min_interval; +}hold_mode_cp; + #define HOLD_MODE_CP____handle 0 + #define HOLD_MODE_CP____max_interval 2 + #define HOLD_MODE_CP____min_interval 4 +/*--------------------------------*/ +#define HOLD_MODE_CP_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_SNIFF_MODE 0x0003 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint16_t max_interval; + uint16_t min_interval; + uint16_t attempt; + uint16_t timeout; +}sniff_mode_cp; + #define SNIFF_MODE_CP____handle 0 + #define SNIFF_MODE_CP____max_interval 2 + #define SNIFF_MODE_CP____min_interval 4 + #define SNIFF_MODE_CP____attempt 6 + #define SNIFF_MODE_CP____timeout 8 +/*--------------------------------*/ +#define SNIFF_MODE_CP_SIZE 10 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_EXIT_SNIFF_MODE 0x0004 +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}exit_sniff_mode_cp; + #define EXIT_SNIFF_MODE_CP____handle 0 +/*--------------------------------*/ +#define EXIT_SNIFF_MODE_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_PARK_MODE 0x0005 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint16_t max_interval; + uint16_t min_interval; +}park_mode_cp; + #define PARK_MODE_CP____handle 0 + #define PARK_MODE_CP____max_interval 2 + #define PARK_MODE_CP____min_interval 4 +/*--------------------------------*/ +#define PARK_MODE_CP_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_EXIT_PARK_MODE 0x0006 +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}exit_park_mode_cp; + #define EXIT_PARK_MODE_CP____handle 0 +/*--------------------------------*/ +#define EXIT_PARK_MODE_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_QOS_SETUP 0x0007 +/*--------------------------------*/ +typedef struct { + uint8_t service_type; /* 1 = best effort */ + uint32_t token_rate; /* Byte per seconds */ + uint32_t peak_bandwidth; /* Byte per seconds */ + uint32_t latency; /* Microseconds */ + uint32_t delay_variation; /* Microseconds */ +}hci_qos; + #define DELAY_VARIATION____service_type 0 + #define DELAY_VARIATION____token_rate 1 + #define DELAY_VARIATION____peak_bandwidth 5 + #define DELAY_VARIATION____latency 9 + #define DELAY_VARIATION____delay_variation 13 +/*--------------------------------*/ +#define HCI_QOS_CP_SIZE 17 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t flags; /* Reserved */ + hci_qos qos; /*POZOR POLOZKA MA TYP STRUKTURY!!!!!!!!!!*/ +}qos_setup_cp; + #define QOS_SETUP_CP____handle 0 + #define QOS_SETUP_CP____flags 2 + #define QOS_SETUP_CP____qos 3 +/*--------------------------------*/ +#define QOS_SETUP_CP_SIZE (3 + HCI_QOS_CP_SIZE) +/****************************************************************/ +/****************************************************************/ + + +#define OCF_ROLE_DISCOVERY 0x0009 +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}role_discovery_cp; +#define ROLE_DISCOVERY_CP____handle 0 +/*--------------------------------*/ +#define ROLE_DISCOVERY_CP_SIZE 2 + +/*--------------------------------*/ /*NAVRATOVE PARAMETRY*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t role; +}role_discovery_rp; + #define ROLE_DISCOVERY_RP____status 0 + #define ROLE_DISCOVERY_RP____handle 1 + #define ROLE_DISCOVERY_RP____role 3 +/*--------------------------------*/ +#define ROLE_DISCOVERY_RP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_SWITCH_ROLE 0x000B + +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t role; +}switch_role_cp; + #define SWITCH_ROLE_CP____bdaddr 0 + #define SWITCH_ROLE_CP____role 6 +/*--------------------------------*/ +#define SWITCH_ROLE_CP_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LINK_POLICY 0x000C +/*--------------------------------*/ +typedef struct { + uint16_t handle; +}read_link_policy_cp; + #define READ_LINK_POLICY_CP____handle 0 +/*--------------------------------*/ +#define READ_LINK_POLICY_CP_SIZE 2 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint16_t policy; +}read_link_policy_rp; + #define READ_LINK_POLICY_RP____status 0 + #define READ_LINK_POLICY_RP____handle 1 + #define READ_LINK_POLICY_RP____policy 3 +/*--------------------------------*/ +#define READ_LINK_POLICY_RP_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_LINK_POLICY 0x000D +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint16_t policy; +}write_link_policy_cp; + #define WRITE_LINK_POLICY_CP____handle 0 + #define WRITE_LINK_POLICY_CP____policy 2 +/*--------------------------------*/ +#define WRITE_LINK_POLICY_CP_SIZE 4 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; +}write_link_policy_rp; + #define WRITE_LINK_POLICY_RP____status 0 + #define WRITE_LINK_POLICY_RP____handle 1 +/*--------------------------------*/ +#define WRITE_LINK_POLICY_RP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + + + +/****************************************************************/ +/*--------------- Host Controller and Baseband -----------------*/ +/****************************************************************/ +/****************************************************************/ + +#define OGF_HOST_CTL 0x03 + +#define OCF_SET_EVENT_MASK 0x0001 +/*--------------------------------*/ +typedef struct { + uint8_t mask[8]; +}set_event_mask_cp; + #define SET_EVENT_MASK_CP____mask 0 +/*--------------------------------*/ +#define SET_EVENT_MASK_CP_SIZE 8 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_RESET 0x0003 + +#define OCF_SET_EVENT_FLT 0x0005 +/*--------------------------------*/ +typedef struct { + uint8_t flt_type; + uint8_t cond_type; + uint8_t condition[0]; +}set_event_flt_cp; + #define SET_EVENT_FLT_CP____flt_type 0 + #define SET_EVENT_FLT_CP____cond_type 1 + #define SET_EVENT_FLT_CP____condition 2 +/*--------------------------------*/ +#define SET_EVENT_FLT_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +/* Filter types */ +#define FLT_CLEAR_ALL 0x00 +#define FLT_INQ_RESULT 0x01 +#define FLT_CONN_SETUP 0x02 +/* INQ_RESULT Condition types */ +#define INQ_RESULT_RETURN_ALL 0x00 +#define INQ_RESULT_RETURN_CLASS 0x01 +#define INQ_RESULT_RETURN_BDADDR 0x02 +/* CONN_SETUP Condition types */ +#define CONN_SETUP_ALLOW_ALL 0x00 +#define CONN_SETUP_ALLOW_CLASS 0x01 +#define CONN_SETUP_ALLOW_BDADDR 0x02 +/* CONN_SETUP Conditions */ +#define CONN_SETUP_AUTO_OFF 0x01 +#define CONN_SETUP_AUTO_ON 0x02 + +#define OCF_FLUSH 0x0008 + +#define OCF_READ_PIN_TYPE 0x0009 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t pin_type; +}read_pin_type_rp; + #define READ_PIN_TYPE_RP____status 0 + #define READ_PIN_TYPE_RP____pin_type 1 +/*--------------------------------*/ +#define READ_PIN_TYPE_RP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_PIN_TYPE 0x000A +/*--------------------------------*/ +typedef struct { + uint8_t pin_type; +}write_pin_type_cp; + #define WRITE_PIN_TYPE_CP____pin_type 0 +/*--------------------------------*/ +#define WRITE_PIN_TYPE_CP_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_CREATE_NEW_UNIT_KEY 0x000B + +#define OCF_READ_STORED_LINK_KEY 0x000D +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t read_all; +}read_stored_link_key_cp; + #define READ_STORED_LINK_KEY_CP____bdaddr 0 + #define READ_STORED_LINK_KEY_CP____read_all 6 +/*--------------------------------*/ +#define READ_STORED_LINK_KEY_CP_SIZE 7 + +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t max_keys; + uint16_t num_keys; +}read_stored_link_key_rp; + #define READ_STORED_LINK_KEY_RP____status 0 + #define READ_STORED_LINK_KEY_RP____max_keys 1 + #define READ_STORED_LINK_KEY_RP____num_keys 3 +/*--------------------------------*/ +#define READ_STORED_LINK_KEY_RP_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + + +#define OCF_WRITE_STORED_LINK_KEY 0x0011 +/*--------------------------------*/ +typedef struct { + uint8_t num_keys; + /* variable length part */ +}write_stored_link_key_cp; + #define WRITE_STORED_LINK_KEY_CP____num_keys 0 +/*--------------------------------*/ +#define WRITE_STORED_LINK_KEY_CP_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t num_keys; +}write_stored_link_key_rp; + #define WRITE_STORED_LINK_KEY_RP____status 0 + #define WRITE_STORED_LINK_KEY_RP____num_keys 1 +/*--------------------------------*/ +#define READ_WRITE_LINK_KEY_RP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_DELETE_STORED_LINK_KEY 0x0012 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t delete_all; +}delete_stored_link_key_cp; + #define DELETE_STORED_LINK_KEY_CP____bdaddr 0 + #define DELETE_STORED_LINK_KEY_CP____delete_all 6 +/*--------------------------------*/ +#define DELETE_STORED_LINK_KEY_CP_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t num_keys; +}delete_stored_link_key_rp; + #define DELETE_STORED_LINK_KEY_RP____status 0 + #define DELETE_STORED_LINK_KEY_RP____num_keys 1 +/*--------------------------------*/ +#define DELETE_STORED_LINK_KEY_RP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_CHANGE_LOCAL_NAME 0x0013 +/*--------------------------------*/ +typedef struct { + uint8_t name[248]; +} change_local_name_cp; + #define CHANGE_LOCAL_NAME_CP____name 0 +/*--------------------------------*/ +#define CHANGE_LOCAL_NAME_CP_SIZE 248 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LOCAL_NAME 0x0014 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t name[248]; +}read_local_name_rp; + #define READ_LOCAL_NAME_RP____status 0 + #define READ_LOCAL_NAME_RP____name 1 +/*--------------------------------*/ +#define READ_LOCAL_NAME_RP_SIZE 249 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_CONN_ACCEPT_TIMEOUT 0x0015 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t timeout; +}read_conn_accept_timeout_rp; + #define READ_CONN_ACCEPT_TIMEOUT_RP____status 1 + #define READ_CONN_ACCEPT_TIMEOUT_RP____timeout 0 +/*--------------------------------*/ +#define READ_CONN_ACCEPT_TIMEOUT_RP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_CONN_ACCEPT_TIMEOUT 0x0016 +/*--------------------------------*/ +typedef struct { + uint16_t timeout; +}write_conn_accept_timeout_cp; + #define WRITE_CONN_ACCEPT_TIMEOUT_CP____timeout 0 +/*--------------------------------*/ +#define WRITE_CONN_ACCEPT_TIMEOUT_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_PAGE_TIMEOUT 0x0017 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t timeout; +}read_page_timeout_rp; + #define READ_PAGE_TIMEOUT_RP____status 0 + #define READ_PAGE_TIMEOUT_RP____timeout 1 +/*--------------------------------*/ +#define READ_PAGE_TIMEOUT_RP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_PAGE_TIMEOUT 0x0018 +/*--------------------------------*/ +typedef struct { + uint16_t timeout; +}write_page_timeout_cp; + #define WRITE_PAGE_TIMEOUT_CP____timeout 0 +/*--------------------------------*/ +#define WRITE_PAGE_TIMEOUT_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_SCAN_ENABLE 0x0019 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t enable; +}read_scan_enable_rp; + #define READ_SCAN_ENABLE_RP____status 1 + #define READ_SCAN_ENABLE_RP____enable 0 +/*--------------------------------*/ +#define READ_SCAN_ENABLE_RP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_SCAN_ENABLE 0x001A + #define SCAN_DISABLED 0x00 + #define SCAN_INQUIRY 0x01 + #define SCAN_PAGE 0x02 + #define SCAN_PAGE_INQ 0x03 +/*--------------------------------*/ +#define WRITE_SCAN_ENABLE_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_PAGE_ACTIVITY 0x001B +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t interval; + uint16_t window; +}read_page_activity_rp; + #define READ_PAGE_ACTIVITY_RP____status 0 + #define READ_PAGE_ACTIVITY_RP____interval 1 + #define READ_PAGE_ACTIVITY_RP____window 3 +/*--------------------------------*/ +#define READ_PAGE_ACTIVITY_RP_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_PAGE_ACTIVITY 0x001C +/*--------------------------------*/ +typedef struct { + uint16_t interval; + uint16_t window; +}write_page_activity_cp; + #define WRITE_PAGE_ACTIVITY_CP____interval 0 + #define WRITE_PAGE_ACTIVITY_CP____window 2 +/*--------------------------------*/ +#define WRITE_PAGE_ACTIVITY_CP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_INQ_ACTIVITY 0x001D +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t interval; + uint16_t window; +}read_inq_activity_rp; + #define READ_INQ_ACTIVITY_RP____status 0 + #define READ_INQ_ACTIVITY_RP____interval 1 + #define READ_INQ_ACTIVITY_RP____window 3 +/*--------------------------------*/ +#define READ_INQ_ACTIVITY_RP_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_INQ_ACTIVITY 0x001E +/*--------------------------------*/ +typedef struct { + uint16_t interval; + uint16_t window; +}write_inq_activity_cp; + #define WRITE_INQ_ACTIVITY_CP____interval 0 + #define WRITE_INQ_ACTIVITY_CP____window 2 +/*--------------------------------*/ +#define WRITE_INQ_ACTIVITY_CP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_AUTH_ENABLE 0x001F + +#define OCF_WRITE_AUTH_ENABLE 0x0020 + #define AUTH_DISABLED 0x00 + #define AUTH_ENABLED 0x01 + +#define OCF_READ_ENCRYPT_MODE 0x0021 + +#define OCF_WRITE_ENCRYPT_MODE 0x0022 + #define ENCRYPT_DISABLED 0x00 + #define ENCRYPT_P2P 0x01 + #define ENCRYPT_BOTH 0x02 + +#define OCF_READ_CLASS_OF_DEV 0x0023 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t dev_class[3]; +}read_class_of_dev_rp; + #define READ_CLASS_OF_DEV_RP____status 0 + #define READ_CLASS_OF_DEV_RP____dev_class 1 +/*--------------------------------*/ +#define READ_CLASS_OF_DEV_RP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_CLASS_OF_DEV 0x0024 +/*--------------------------------*/ +typedef struct { + uint8_t dev_class[3]; +}write_class_of_dev_cp; + #define WRITE_CLASS_OF_DEV_CP____dev_class 0 +/*--------------------------------*/ +#define WRITE_CLASS_OF_DEV_CP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_VOICE_SETTING 0x0025 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t voice_setting; +}read_voice_setting_rp; + #define READ_VOICE_SETTING_RP____status 0 + #define READ_VOICE_SETTING_RP____voice_setting 1 +/*--------------------------------*/ +#define READ_VOICE_SETTING_RP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_VOICE_SETTING 0x0026 +/*--------------------------------*/ +typedef struct { + uint16_t voice_setting; +}write_voice_setting_cp; + #define WRITE_VOICE_SETTING_CP____voice_setting 0 +/*--------------------------------*/ +#define WRITE_VOICE_SETTING_CP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_TRANSMIT_POWER_LEVEL 0x002D +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t type; +}read_transmit_power_level_cp; + #define READ_TRANSMIT_POWER_LEVEL_CP____handle 0 + #define READ_TRANSMIT_POWER_LEVEL_CP____type 2 +/*--------------------------------*/ +#define READ_TRANSMIT_POWER_LEVEL_CP_SIZE 3 + +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + int8_t level; +}read_transmit_power_level_rp; + #define READ_TRANSMIT_POWER_LEVEL_RP____status 0 + #define READ_TRANSMIT_POWER_LEVEL_RP____handle 1 + #define READ_TRANSMIT_POWER_LEVEL_RP____level 3 +/*--------------------------------*/ +#define READ_TRANSMIT_POWER_LEVEL_RP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_HOST_BUFFER_SIZE 0x0033 +/*--------------------------------*/ +typedef struct { + uint16_t acl_mtu; + uint8_t sco_mtu; + uint16_t acl_max_pkt; + uint16_t sco_max_pkt; +}host_buffer_size_cp; + #define HOST_BUFFER_SIZE_CP____acl_mtu 0 + #define HOST_BUFFER_SIZE_CP____sco_mtu 2 + #define HOST_BUFFER_SIZE_CP____acl_max_pkt 3 + #define HOST_BUFFER_SIZE_CP____sco_max_pkt 5 +/*--------------------------------*/ +#define HOST_BUFFER_SIZE_CP_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LINK_SUPERVISION_TIMEOUT 0x0036 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint16_t link_sup_to; +}read_link_supervision_timeout_rp; + #define READ_LINK_SUPERVISION_TIMEOUT_RP____status 0 + #define READ_LINK_SUPERVISION_TIMEOUT_RP____handle 1 + #define READ_LINK_SUPERVISION_TIMEOUT_RP____link_sup_to 3 +/*--------------------------------*/ +#define READ_LINK_SUPERVISION_TIMEOUT_RP_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_LINK_SUPERVISION_TIMEOUT 0x0037 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint16_t link_sup_to; +}write_link_supervision_timeout_cp; + #define WRITE_LINK_SUPERVISION_TIMEOUT_CP____handle 0 + #define WRITE_LINK_SUPERVISION_TIMEOUT_CP____link_sup_to 2 +/*--------------------------------*/ +#define WRITE_LINK_SUPERVISION_TIMEOUT_CP_SIZE 4 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; +}write_link_supervision_timeout_rp; + #define WRITE_LINK_SUPERVISION_TIMEOUT_RP____status 0 + #define WRITE_LINK_SUPERVISION_TIMEOUT_RP____handle 1 +/*--------------------------------*/ +#define WRITE_LINK_SUPERVISION_TIMEOUT_RP_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define MAX_IAC_LAP 0x40 +#define OCF_READ_CURRENT_IAC_LAP 0x0039 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t num_current_iac; + uint8_t lap[MAX_IAC_LAP][3]; +}read_current_iac_lap_rp; + #define READ_CURRENT_IAC_LAP_RP____status 0 + #define READ_CURRENT_IAC_LAP_RP____num_current_iac 1 + #define READ_CURRENT_IAC_LAP_RP____lap 2 +/*--------------------------------*/ +#define READ_CURRENT_IAC_LAP_RP_SIZE 2+3*MAX_IAC_LAP +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_CURRENT_IAC_LAP 0x003A +/*--------------------------------*/ +typedef struct { + uint8_t num_current_iac; + uint8_t lap[MAX_IAC_LAP][3]; +}write_current_iac_lap_cp; + #define WRITE_CURRENT_IAC_LAP_CP____num_current_iac 0 + #define WRITE_CURRENT_IAC_LAP_CP____lap 1 +/*--------------------------------*/ +#define WRITE_CURRENT_IAC_LAP_CP_SIZE 1+3*MAX_IAC_LAP +/****************************************************************/ +/****************************************************************/ + + +#define OCF_SET_AFH_CLASSIFICATION 0x003F +/*--------------------------------*/ +typedef struct { + uint8_t map[10]; +}set_afh_classification_cp; + #define SET_AFH_CLASSIFICATION_CP____map 0 +/*--------------------------------*/ +#define SET_AFH_CLASSIFICATION_CP_SIZE 10 +/*--------------------------------*/ +typedef struct { + uint8_t status; +}set_afh_classification_rp; + #define SET_AFH_CLASSIFICATION_RP____status 0 +/*--------------------------------*/ +#define SET_AFH_CLASSIFICATION_RP_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_INQUIRY_SCAN_TYPE 0x0042 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t type; +}read_inquiry_scan_type_rp; + #define READ_INQUIRY_SCAN_TYPE_RP____status 0 + #define READ_INQUIRY_SCAN_TYPE_RP____type 1 +/*--------------------------------*/ +#define READ_INQUIRY_SCAN_TYPE_RP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_INQUIRY_SCAN_TYPE 0x0043 +/*--------------------------------*/ +typedef struct { + uint8_t type; +}write_inquiry_scan_type_cp; + #define WRITE_INQUIRY_SCAN_TYPE_CP____type 0 +/*--------------------------------*/ +#define WRITE_INQUIRY_SCAN_TYPE_CP_SIZE 1 +/*--------------------------------*/ +typedef struct { + uint8_t status; +}write_inquiry_scan_type_rp; + #define WRITE_INQUIRY_SCAN_TYPE_RP____status 0 +/*--------------------------------*/ +#define WRITE_INQUIRY_SCAN_TYPE_RP_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_INQUIRY_MODE 0x0044 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t mode; +}read_inquiry_mode_rp; + #define READ_INQUIRY_MODE_RP____status 0 + #define READ_INQUIRY_MODE_RP____mode 1 +/*--------------------------------*/ +#define READ_INQUIRY_MODE_RP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_INQUIRY_MODE 0x0045 +/*--------------------------------*/ +typedef struct { + uint8_t mode; +}write_inquiry_mode_cp; + #define WRITE_INQUIRY_MODE_CP____mode 0 +/*--------------------------------*/ +#define WRITE_INQUIRY_MODE_CP_SIZE 1 +/*--------------------------------*/ +typedef struct { + uint8_t status; +}write_inquiry_mode_rp; + #define WRITE_INQUIRY_MODE_RP____status 0 +/*--------------------------------*/ +#define WRITE_INQUIRY_MODE_RP_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_AFH_MODE 0x0048 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t mode; +}read_afh_mode_rp; + #define READ_AFH_MODE_RP____status 0 + #define READ_AFH_MODE_RP____mode 1 +/*--------------------------------*/ +#define READ_AFH_MODE_RP_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_WRITE_AFH_MODE 0x0049 +/*--------------------------------*/ +typedef struct { + uint8_t mode; +}write_afh_mode_cp; + #define WRITE_AFH_MODE_CP____mode 0 +/*--------------------------------*/ +#define WRITE_AFH_MODE_CP_SIZE 1 +/*--------------------------------*/ +typedef struct { + uint8_t status; +}write_afh_mode_rp; + #define WRITE_AFH_MODE_RP____status 0 +/*--------------------------------*/ +#define WRITE_AFH_MODE_RP_SIZE 1 +/****************************************************************/ +/*---------------------funkce------------------------------*/ +//bths_check_command *bth_find_end(bths_check_command *dyn_chan); + + +/*********************** OGF = 0x01 ****************************/ +/*-------------------LINK CONTROL COMMANDS--------------------------*/ +int bth_cmd_inqury(uint8_t length, uint8_t rsp, uint8_t *lap); //0x0001 +int bth_cmd_Disconnect(uint16_t handle, uint8_t reason); //0x0006 + + + +int change_connection_packet_type(uint16_t handle, uint16_t ptype); +int bth_accept_conn_req_cp(bdaddr_t *bdaddr); /*0x01 - 0x0009*/ +int bth_cmd_write_page_scan(uint16_t interval, uint16_t window); +int bth_cmd_write_inquiry_scan_activity(uint16_t interval, uint16_t window); //0x001E +int bth_cmd_read_bd_addr(void); +int bth_cmd_write_scan_enable(uint8_t set_ing_scan); //0x001A +int bth_cmd_write_link_policy_settings(uint16_t handle, uint16_t policy); +int bth_cmd_reset(void); + +#endif + + diff --git a/bth_tests/bluetooth/hci_error.h b/bth_tests/bluetooth/hci_error.h new file mode 100644 index 0000000..89ac29a --- /dev/null +++ b/bth_tests/bluetooth/hci_error.h @@ -0,0 +1,18 @@ +/******************************************************************* + bluetooth library + + error.h - list of error fce + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + +#ifndef HCI_ERROR_H +#define HCI_ERROR_H +void bth_error_detect_status(uint8_t status_num); +void bth_error_detect_event(uint8_t status_num); + + + +#endif diff --git a/bth_tests/bluetooth/hci_event.h b/bth_tests/bluetooth/hci_event.h new file mode 100644 index 0000000..c87d481 --- /dev/null +++ b/bth_tests/bluetooth/hci_event.h @@ -0,0 +1,864 @@ +/******************************************************************* + bluetooth library + + hci_event.h - list of Event packet structures + list of event fce + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#ifndef HCI_EVENT_H +#define HCI_EVENT_H + +/* ---- HCI Events ---- */ + +#define EVT_INQUIRY_COMPLETE 0x01 + +#define EVT_INQUIRY_RESULT 0x02 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t pscan_rep_mode; + uint8_t pscan_period_mode; + uint8_t pscan_mode; + uint8_t dev_class[3]; + uint16_t clock_offset; +}inquiry_info; + #define INQUIRY_INFO____bdaddr 0 + #define INQUIRY_INFO____pscan_rep_mode 6 + #define INQUIRY_INFO____pscan_period_mode 7 + #define INQUIRY_INFO____pscan_mode 8 + #define INQUIRY_INFO____dev_class 9 + #define INQUIRY_INFO____clock_offset 10 +/*--------------------------------*/ +#define INQUIRY_INFO_SIZE 14 +/****************************************************************/ +/****************************************************************/ + + + +#define EVT_CONN_COMPLETE 0x03 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + bdaddr_t bdaddr; + uint8_t link_type; + uint8_t encr_mode; +} evt_conn_complete; + #define EVT_CONN_COMPLETE____status 0 + #define EVT_CONN_COMPLETE____handle 1 + #define EVT_CONN_COMPLETE____bdaddr 3 + #define EVT_CONN_COMPLETE____link_type 9 + #define EVT_CONN_COMPLETE____encr_mode 10 +/*--------------------------------*/ +#define EVT_CONN_COMPLETE_SIZE 11 //puvodne 13 asi jejich chyba +/****************************************************************/ +/****************************************************************/ + + +#define EVT_CONN_REQUEST 0x04 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t dev_class[3]; + uint8_t link_type; +} evt_conn_request; + #define EVT_CONN_REQUEST____bdaddr 0 + #define EVT_CONN_REQUEST____dev_class 6 + #define EVT_CONN_REQUEST____link_type 9 +/*--------------------------------*/ +#define EVT_CONN_REQUEST_SIZE 10 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_DISCONN_COMPLETE 0x05 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t reason; +} evt_disconn_complete; + #define EVT_DISCONN_COMPLETE____status 0 + #define EVT_DISCONN_COMPLETE____handle 1 + #define EVT_DISCONN_COMPLETE____reason 3 +/*--------------------------------*/ +#define EVT_DISCONN_COMPLETE_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_AUTH_COMPLETE 0x06 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; +} evt_auth_complete; + #define EVT_AUTH_COMPLETE____status 0 + #define EVT_AUTH_COMPLETE____handle 1 +/*--------------------------------*/ +#define EVT_AUTH_COMPLETE_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + + +#define EVT_REMOTE_NAME_REQ_COMPLETE 0x07 +/*--------------------------------*/ +typedef struct { + uint8_t status; + bdaddr_t bdaddr; + uint8_t name[248]; +} evt_remote_name_req_complete; + #define EVT_REMOTE_NAME_REQ_COMPLETE____status 0 + #define EVT_REMOTE_NAME_REQ_COMPLETE____bdaddr 1 + #define EVT_REMOTE_NAME_REQ_COMPLETE____name 7 +/*--------------------------------*/ +#define EVT_REMOTE_NAME_REQ_COMPLETE_SIZE 255 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_ENCRYPT_CHANGE 0x08 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t encrypt; +} evt_encrypt_change; + #define EVT_ENCRYPT_CHANGE____status 0 + #define EVT_ENCRYPT_CHANGE____handle 1 + #define EVT_ENCRYPT_CHANGE____encrypt 3 +/*--------------------------------*/ +#define EVT_ENCRYPT_CHANGE_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_CHANGE_CONN_LINK_KEY_COMPLETE 0x09 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; +} evt_change_conn_link_key_complete; + #define EVT_CHANGE_CONN_LINK_KEY_COMPLETE____status 0 + #define EVT_CHANGE_CONN_LINK_KEY_COMPLETE____handle 1 +/*--------------------------------*/ +#define EVT_CHANGE_CONN_LINK_KEY_COMPLETE_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_MASTER_LINK_KEY_COMPLETE 0x0A +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t key_flag; +} evt_master_link_key_complete; + #define EVT_MASTER_LINK_KEY_COMPLETE____status 0 + #define EVT_MASTER_LINK_KEY_COMPLETE____handle 1 + #define EVT_MASTER_LINK_KEY_COMPLETE____key_flag 3 +/*--------------------------------*/ +#define EVT_MASTER_LINK_KEY_COMPLETE_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_READ_REMOTE_FEATURES_COMPLETE 0x0B +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t features[8]; +} evt_read_remote_features_complete; + #define EVT_READ_REMOTE_FEATURES_COMPLETE____status 0 + #define EVT_READ_REMOTE_FEATURES_COMPLETE____handle 1 + #define EVT_READ_REMOTE_FEATURES_COMPLETE____features 3 +/*--------------------------------*/ +#define EVT_READ_REMOTE_FEATURES_COMPLETE_SIZE 11 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_READ_REMOTE_VERSION_COMPLETE 0x0C +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t lmp_ver; + uint16_t manufacturer; + uint16_t lmp_subver; +} evt_read_remote_version_complete; + #define EVT_READ_REMOTE_VERSION_COMPLETE____status 0 + #define EVT_READ_REMOTE_VERSION_COMPLETE____handle 1 + #define EVT_READ_REMOTE_VERSION_COMPLETE____lmp_ver 3 + #define EVT_READ_REMOTE_VERSION_COMPLETE____manufacturer 4 + #define EVT_READ_REMOTE_VERSION_COMPLETE____lmp_subver 6 +/*--------------------------------*/ +#define EVT_READ_REMOTE_VERSION_COMPLETE_SIZE 8 + +//#define EVT_QOS_SETUP_COMPLETE 0x0D +//typedef struct { +// uint8_t status; +// uint16_t handle; +// uint8_t flags; /* Reserved */ +// hci_qos qos; +//}evt_qos_setup_complete; + #define EVT_QOS_SETUP_COMPLETE____status 0 + #define EVT_QOS_SETUP_COMPLETE____handle 1 + #define EVT_QOS_SETUP_COMPLETE____flags 3 + #define EVT_QOS_SETUP_COMPLETE____qos 4 +/*--------------------------------*/ +//#define EVT_QOS_SETUP_COMPLETE_SIZE (4 + HCI_QOS_CP_SIZE) +/****************************************************************/ +/****************************************************************/ + + +#define EVT_CMD_COMPLETE 0x0E +/*--------------------------------*/ +typedef struct { + uint8_t ncmd; + uint16_t opcode; +} evt_cmd_complete; + #define EVT_CMD_COMPLETE____ncmd 0 + #define EVT_CMD_COMPLETE____opcode 1 +/*--------------------------------*/ +/*--------------------------------*/ +#define EVT_CMD_COMPLETE_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_CMD_STATUS 0x0F +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t ncmd; + uint16_t opcode; +} evt_cmd_status; + #define EVT_CMD_STATUS____status 0 + #define EVT_CMD_STATUS____ncmd 1 + #define EVT_CMD_STATUS____opcode 2 +/*--------------------------------*/ +#define EVT_CMD_STATUS_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_HARDWARE_ERROR 0x10 +/*--------------------------------*/ +typedef struct { + uint8_t code; +} evt_hardware_error; + #define EVT_HARDWARE_ERROR____code 0 +/*--------------------------------*/ +#define EVT_HARDWARE_ERROR_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_FLUSH_OCCURRED 0x11 +/*--------------------------------*/ +typedef struct { + uint16_t handle; +} evt_flush_occured; + #define EVT_FLUSH_OCCURED____handle 0 +/*--------------------------------*/ +#define EVT_FLUSH_OCCURRED_SIZE 2 + +#define EVT_ROLE_CHANGE 0x12 +/*--------------------------------*/ +typedef struct { + uint8_t status; + bdaddr_t bdaddr; + uint8_t role; +} evt_role_change; + #define EVT_ROLE_CHANGE____status 0 + #define EVT_ROLE_CHANGE____bdaddr 1 + #define EVT_ROLE_CHANGE____role 7 +/*--------------------------------*/ +#define EVT_ROLE_CHANGE_SIZE 8 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_NUM_COMP_PKTS 0x13 +/*--------------------------------*/ +typedef struct { + uint8_t num_hndl; + /* variable length part */ +} evt_num_comp_pkts; + #define EVT_NUM_COMP_PKTS____num_hndl 0 +/*--------------------------------*/ +#define EVT_NUM_COMP_PKTS_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_MODE_CHANGE 0x14 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t mode; + uint16_t interval; +} evt_mode_change; + #define EVT_MODE_CHANGE____status 0 + #define EVT_MODE_CHANGE____handle 1 + #define EVT_MODE_CHANGE____mode 3 + #define EVT_MODE_CHANGE____interval 4 +/*--------------------------------*/ +#define EVT_MODE_CHANGE_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_RETURN_LINK_KEYS 0x15 +/*--------------------------------*/ +typedef struct { + uint8_t num_keys; + /* variable length part */ +} evt_return_link_keys; + #define EVT_RETURN_LINK_KEYS____num_keys 0 +/*--------------------------------*/ +#define EVT_RETURN_LINK_KEYS_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_PIN_CODE_REQ 0x16 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; +} evt_pin_code_req; + #define EVT_PIN_CODE_REQ____bdaddr 0 +/*--------------------------------*/ +#define EVT_PIN_CODE_REQ_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_LINK_KEY_REQ 0x17 +typedef struct { + bdaddr_t bdaddr; +} evt_link_key_req; + #define EVT_LINK_KEY_REQ____bdaddr 0 +/*--------------------------------*/ +#define EVT_LINK_KEY_REQ_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_LINK_KEY_NOTIFY 0x18 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t link_key[16]; + uint8_t key_type; +} evt_link_key_notify; + #define EVT_LINK_KEY_NOTIFY____bdaddr 0 + #define EVT_LINK_KEY_NOTIFY____link_key 6 + #define EVT_LINK_KEY_NOTIFY____key_type 22 +/*--------------------------------*/ +#define EVT_LINK_KEY_NOTIFY_SIZE 23 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_LOOPBACK_COMMAND 0x19 + +#define EVT_DATA_BUFFER_OVERFLOW 0x1A +/*--------------------------------*/ +typedef struct { + uint8_t link_type; +} evt_data_buffer_overflow; + #define EVT_DATA_BUFFER_OVERFLOW____link_type 0 +/*--------------------------------*/ +#define EVT_DATA_BUFFER_OVERFLOW_SIZE 1 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_MAX_SLOTS_CHANGE 0x1B +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t max_slots; +} evt_max_slots_change; + #define EVT_MAX_SLOTS_CHANGE____handle 0 + #define EVT_MAX_SLOTS_CHANGE____max_slots 2 +/*--------------------------------*/ +#define EVT_MAX_SLOTS_CHANGE_SIZE 3 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_READ_CLOCK_OFFSET_COMPLETE 0x1C +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint16_t clock_offset; +} evt_read_clock_offset_complete; + #define EVT_READ_CLOCK_OFFSET_COMPLETE____status 0 + #define EVT_READ_CLOCK_OFFSET_COMPLETE____handle 1 + #define EVT_READ_CLOCK_OFFSET_COMPLETE____clock_offset 3 +/*--------------------------------*/ +#define EVT_READ_CLOCK_OFFSET_COMPLETE_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_CONN_PTYPE_CHANGED 0x1D +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint16_t ptype; +} evt_conn_ptype_changed; + #define EVT_CONN_PTYPE_CHANGED____status 0 + #define EVT_CONN_PTYPE_CHANGED____handle 1 + #define EVT_CONN_PTYPE_CHANGED____ptype 3 +/*--------------------------------*/ +#define EVT_CONN_PTYPE_CHANGED_SIZE 5 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_QOS_VIOLATION 0x1E +/*--------------------------------*/ +typedef struct { + uint16_t handle; +} evt_qos_violation; + #define EVT_QOS_VIOLATION____handle 0 +/*--------------------------------*/ +#define EVT_QOS_VIOLATION_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_PSCAN_REP_MODE_CHANGE 0x20 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t pscan_rep_mode; +} evt_pscan_rep_mode_change; + #define EVT_PSCAN_REP_MODE_CHANGE____bdaddr 0 + #define EVT_PSCAN_REP_MODE_CHANGE____pscan_rep_mode 6 +/*--------------------------------*/ +#define EVT_PSCAN_REP_MODE_CHANGE_SIZE 7 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_FLOW_SPEC_COMPLETE 0x21 +/*--------------------------------*/ +//typedef struct { +// uint8_t status; +// uint16_t handle; +// uint8_t flags; +// uint8_t direction; +// hci_qos qos; /*PREDELAT NESMI BYT TYP PROMENNE STRUKTURA!!!!!!*/ +//} evt_flow_spec_complete; + #define EVT_FLOW_SPEC_COMPLETE____status 0 + #define EVT_FLOW_SPEC_COMPLETE____handle 1 + #define EVT_FLOW_SPEC_COMPLETE____flags 3 + #define EVT_FLOW_SPEC_COMPLETE____direction 4 + #define EVT_FLOW_SPEC_COMPLETE____qos 5 +/*--------------------------------*/ +#define EVT_FLOW_SPEC_COMPLETE_SIZE (5 + HCI_QOS_CP_SIZE) + +/****************************************************************************/ +/****************************************************************************/ +/*------------------------------- RSSI -------------------------------------*/ +#define EVT_INQUIRY_RESULT_WITH_RSSI 0x22 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t pscan_rep_mode; + uint8_t pscan_period_mode; + uint8_t dev_class[3]; + uint16_t clock_offset; + int8_t rssi; +} inquiry_info_with_rssi; + #define INQUIRY_INFO_WITH_RSSI____bdaddr 0 + #define INQUIRY_INFO_WITH_RSSI____pscan_rep_mode 6 + #define INQUIRY_INFO_WITH_RSSI____pscan_period_mode 7 + #define INQUIRY_INFO_WITH_RSSI____dev_class 8 + #define INQUIRY_INFO_WITH_RSSI____clock_offset 11 + #define INQUIRY_INFO_WITH_RSSI____rssi 13 +/*--------------------------------*/ +#define INQUIRY_INFO_WITH_RSSI_SIZE 14 +/*--------------------------------*/ +typedef struct { + bdaddr_t bdaddr; + uint8_t pscan_rep_mode; + uint8_t pscan_period_mode; + uint8_t pscan_mode; + uint8_t dev_class[3]; + uint16_t clock_offset; + int8_t rssi; +} inquiry_info_with_rssi_and_pscan_mode; + #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE____bdaddr 0 + #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE____pscan_rep_mode 6 + #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE____pscan_period_mode 7 + #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE____pscan_mode 8 + #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE____dev_class 9 + #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE____clock_offset 12 + #define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE____rssi 14 +/*--------------------------------*/ +#define INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE 15 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE 0x23 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t page_num; + uint8_t max_page_num; + uint8_t features[8]; +} evt_read_remote_ext_features_complete; + #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE____status 0 + #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE____handle 1 + #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE____page_num 3 + #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE____max_page_num 4 + #define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE____features 5 +/*--------------------------------*/ +#define EVT_READ_REMOTE_EXT_FEATURES_COMPLETE_SIZE 13 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_SYNC_CONN_COMPLETE 0x2C +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + bdaddr_t bdaddr; + uint8_t link_type; + uint8_t trans_interval; + uint8_t retrans_window; + uint16_t rx_pkt_len; + uint16_t tx_pkt_len; + uint8_t air_mode; +} evt_sync_conn_complete; + #define EVT_SYNC_CONN_COMPLETE____status 0 + #define EVT_SYNC_CONN_COMPLETE____handle 1 + #define EVT_SYNC_CONN_COMPLETE____bdaddr 3 + #define EVT_SYNC_CONN_COMPLETE____link_type 9 + #define EVT_SYNC_CONN_COMPLETE____trans_interval 10 + #define EVT_SYNC_CONN_COMPLETE____retrans_window 11 + #define EVT_SYNC_CONN_COMPLETE____rx_pkt_len 12 + #define EVT_SYNC_CONN_COMPLETE____tx_pkt_len 14 + #define EVT_SYNC_CONN_COMPLETE____air_mode 16 +/*--------------------------------*/ +#define EVT_SYNC_CONN_COMPLETE_SIZE 17 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_SYNC_CONN_CHANGED 0x2D +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t trans_interval; + uint8_t retrans_window; + uint16_t rx_pkt_len; + uint16_t tx_pkt_len; +} evt_sync_conn_changed; + #define EVT_SYNC_CONN_CHANGED____status 0 + #define EVT_SYNC_CONN_CHANGED____handle 1 + #define EVT_SYNC_CONN_CHANGED____trans_interval 3 + #define EVT_SYNC_CONN_CHANGED____retrans_window 4 + #define EVT_SYNC_CONN_CHANGED____rx_pkt_len 5 + #define EVT_SYNC_CONN_CHANGED____tx_pkt_len 7 +/*--------------------------------*/ +#define EVT_SYNC_CONN_CHANGED_SIZE 9 +/****************************************************************/ +/****************************************************************/ + + +#define EVT_TESTING 0xFE + +#define EVT_VENDOR 0xFF + +/********************************************************************************/ +/********************************************************************************/ +/* Informational Parameters */ +#define OGF_INFO_PARAM 0x04 + +#define OCF_READ_LOCAL_VERSION 0x0001 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t hci_ver; + uint16_t hci_rev; + uint8_t lmp_ver; + uint16_t manufacturer; + uint16_t lmp_subver; +}read_local_version_rp; + #define READ_LOCAL_VERSION_RP____status 0 + #define READ_LOCAL_VERSION_RP____hci_ver 1 + #define READ_LOCAL_VERSION_RP____hci_rev 2 + #define READ_LOCAL_VERSION_RP____lmp_ver 4 + #define READ_LOCAL_VERSION_RP____manufacturer 5 + #define READ_LOCAL_VERSION_RP____lmp_subver 7 +/*--------------------------------*/ +#define READ_LOCAL_VERSION_RP_SIZE 9 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LOCAL_COMMANDS 0x0002 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t commands[64]; +}read_local_commands_rp; + #define READ_LOCAL_COMMANDS_RP____status 0 + #define READ_LOCAL_COMMANDS_RP____commands 1 +/*--------------------------------*/ +#define READ_LOCAL_COMMANDS_RP_SIZE 65 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LOCAL_FEATURES 0x0003 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t features[8]; +}read_local_features_rp; + #define READ_LOCAL_FEATURES_RP____status 0 + #define READ_LOCAL_FEATURES_RP____features 1 +/*--------------------------------*/ +#define READ_LOCAL_FEATURES_RP_SIZE 9 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LOCAL_EXT_FEATURES 0x0004 +/*--------------------------------*/ +typedef struct { + uint8_t page_num; +}read_local_ext_features_cp; + #define READ_LOCAL_EXT_FEATURES_CP____page_num 0 +/*--------------------------------*/ +#define READ_LOCAL_EXT_FEATURES_CP_SIZE 1 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint8_t page_num; + uint8_t max_page_num; + uint8_t features[8]; +}read_local_ext_features_rp; + #define READ_LOCAL_EXT_FEATURES_RP____status 0 + #define READ_LOCAL_EXT_FEATURES_RP____page_num 1 + #define READ_LOCAL_EXT_FEATURES_RP____max_page_num 2 + #define READ_LOCAL_EXT_FEATURES_RP____features 3 +/*--------------------------------*/ +#define READ_LOCAL_EXT_FEATURES_RP_SIZE 11 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_BUFFER_SIZE 0x0005 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t acl_mtu; + uint8_t sco_mtu; + uint16_t acl_max_pkt; + uint16_t sco_max_pkt; +}read_buffer_size_rp; + #define READ_BUFFER_SIZE_RP____status 0 + #define READ_BUFFER_SIZE_RP____acl_mtu 1 + #define READ_BUFFER_SIZE_RP____sco_mtu 3 + #define READ_BUFFER_SIZE_RP____acl_max_pkt 4 + #define READ_BUFFER_SIZE_RP____sco_max_pkt 6 +/*--------------------------------*/ +#define READ_BUFFER_SIZE_RP_SIZE 8 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_BD_ADDR 0x0009 +/*--------------------------------*/ +typedef struct { + uint8_t status; + bdaddr_t bdaddr; +}read_bd_addr_rp; + #define READ_BD_ADDR_RP____status 0 + #define READ_BD_ADDR_RP____bdaddr 1 +/*--------------------------------*/ +#define READ_BD_ADDR_RP_SIZE 7 + + +/********************************************************************************/ +/********************************************************************************/ +/********************************************************************************/ +/* Status params */ +#define OGF_STATUS_PARAM 0x05 + +#define OCF_READ_FAILED_CONTACT_COUNTER 0x0001 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t counter; +} read_failed_contact_counter_rp; + #define READ_FAILED_CONTACT_COUNTER_RP____status 0 + #define READ_FAILED_CONTACT_COUNTER_RP____handle 1 + #define READ_FAILED_CONTACT_COUNTER_RP____counter 3 +/*--------------------------------*/ +#define READ_FAILED_CONTACT_COUNTER_RP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_RESET_FAILED_CONTACT_COUNTER 0x0002 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; +} reset_failed_contact_counter_rp; + #define RESET_FAILED_CONTACT_COUNTER_RP____status 0 + #define RESET_FAILED_CONTACT_COUNTER_RP____handle 1 +/*--------------------------------*/ +#define RESET_FAILED_CONTACT_COUNTER_RP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_LINK_QUALITY 0x0003 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t link_quality; +} read_link_quality_rp; + #define READ_LINK_QUALITY_RP____status 0 + #define READ_LINK_QUALITY_RP____handle 1 + #define READ_LINK_QUALITY_RP____link_quality 3 +/*--------------------------------*/ +#define READ_LINK_QUALITY_RP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_RSSI 0x0005 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + int8_t rssi; +} read_rssi_rp; + #define READ_RSSI_RP____status 0 + #define READ_RSSI_RP____handle 1 + #define READ_RSSI_RP____rssi 3 +/*--------------------------------*/ +#define READ_RSSI_RP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_AFH_MAP 0x0006 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint8_t mode; + uint8_t map[10]; +} read_afh_map_rp; + #define READ_AFH_MAP_RP____status 0 + #define READ_AFH_MAP_RP____handle 2 + #define READ_AFH_MAP_RP____mode 3 + #define READ_AFH_MAP_RP____map 4 +/*--------------------------------*/ +#define READ_AFH_MAP_RP_SIZE 14 +/****************************************************************/ +/****************************************************************/ + + +#define OCF_READ_CLOCK 0x0007 +/*--------------------------------*/ +typedef struct { + uint16_t handle; + uint8_t which_clock; +} read_clock_cp; + #define READ_CLOCK_CP____handle 0 + #define READ_CLOCK_CP____which_clock 2 +/*--------------------------------*/ +#define READ_CLOCK_CP_SIZE 3 +/*--------------------------------*/ +typedef struct { + uint8_t status; + uint16_t handle; + uint32_t clock; + uint16_t accuracy; +}read_clock_rp; + #define READ_CLOCK_RP____status 0 + #define READ_CLOCK_RP____handle 1 + #define READ_CLOCK_RP____clock 3 + #define READ_CLOCK_RP____accuracy 7 +/*--------------------------------*/ +#define READ_CLOCK_RP_SIZE 9 + +/* Testing commands */ +#define OGF_TESTING_CMD 0x3e + +/* Vendor specific commands */ +#define OGF_VENDOR_CMD 0x3f + + + +//funkce +int bth_del_event(uint16_t opcode); +inline int bth_find_if_bdaddr_accept(bdaddr_t *bdaddr); +/**********/ +int bth_evt_none(uint8_t *bth_p, uint8_t size); //fce s neex. indexem evt codu +int bth_evt_inquiry_complete(uint8_t *bth_p, uint8_t size); //0x01 +int bth_evt_inquiry_result(uint8_t *bth_p, uint8_t size); //0x02 +int bth_evt_conn_complete(uint8_t *bth_p, uint8_t size); //0x03 +int bth_evt_conn_request(uint8_t *bth_p, uint8_t size); //0x04 +int bth_evt_disconn_complete(uint8_t *bth_p, uint8_t size); //0x05 +int bth_evt_auth_complete(uint8_t *bth_p, uint8_t size); //0x06 +int bth_remote_name_req_complete(uint8_t *bth_p, uint8_t size); //0x07 +int bth_evt_encrypt_cahnge(uint8_t *bth_p, uint8_t size); //0x08 +int bth_evt_change_conn_link_key_complete(uint8_t *bth_p, uint8_t size); //0x09 +int bth_evt_master_link_key_complete(uint8_t *bth_p, uint8_t size); //0x0A +int bth_evt_read_remote_features_complete(uint8_t *bth_p, uint8_t size); //0x0B +int bth_evt_read_remote_version_complete(uint8_t *bth_p, uint8_t size); //0x0C +int bth_evt_qos_setup_complete(uint8_t *bth_p, uint8_t size); //0x0D +int bth_evt_cmd_complete(uint8_t *bth_p, uint8_t size); //0x0E +int bth_evt_cmd_status(uint8_t *bth_p, uint8_t size); //0x0F +int bth_evt_hardware_error(uint8_t *bth_p, uint8_t size); //0x10 +int bth_evt_flush_occurred(uint8_t *bth_p, uint8_t size); //0x11 +int bth_evt_role_cahage(uint8_t *bth_p, uint8_t size); //0x12 +int bth_evt_num_comp_pkts(uint8_t *bth_p, uint8_t size); //0x13 +int bth_evt_mode_change(uint8_t *bth_p, uint8_t size); //0x14 +int bth_evt_return_link_keys(uint8_t *bth_p, uint8_t size); //0x15 +int bth_evt_pin_code_req(uint8_t *bth_p, uint8_t size); //0x16 +int bth_evt_link_key_req(uint8_t *bth_p, uint8_t size); //0x17 +int bth_evt_link_key_notify(uint8_t *bth_p, uint8_t size); //0x18 +int bth_evt_loopback_command(uint8_t *bth_p, uint8_t size); //0x19 +int bth_evt_data_buffer_overflow(uint8_t *bth_p, uint8_t size); //0x1A +int bth_evt_max_slots_change(uint8_t *bth_p, uint8_t size); //0x1B +int bth_evt_read_clock_offset_complete(uint8_t *bth_p, uint8_t size); //0x1C +int bth_evt_conn_ptype_changed(uint8_t *bth_p, uint8_t size); //0x1D +int bth_evt_qos_violation(uint8_t *bth_p, uint8_t size); //0x1E +int bth_evt_page_scan_mode_change(uint8_t *bth_p, uint8_t size); //0x1F +int bth_evt_pscan_rep_mode_change(uint8_t *bth_p, uint8_t size); //0x20 +int bth_evt_flow_spec_complete(uint8_t *bth_p, uint8_t size); //0x21 +int bth_evt_inquiry_result_with_rssi(uint8_t *bth_p, uint8_t size);; //0x22 + + +#endif + + diff --git a/bth_tests/bluetooth/hci_sci.c b/bth_tests/bluetooth/hci_sci.c new file mode 100644 index 0000000..114b5e7 --- /dev/null +++ b/bth_tests/bluetooth/hci_sci.c @@ -0,0 +1,28 @@ +#include + +/** + //FIXME + *Sends data of the size hp_size from address hp to the bluetooth device (UART) + */ +int bth_send_packet(uint8_t *hp, uint16_t hp_size) +{ + /*is bluetooth device free, or is it busy by the previous command?*/ + if(bth_local_info.busy==0) { +#ifndef BTH_LX + VypisHexa(hp,hp_size); +#else + int zn,i; + + for(i=0; i +//************************************************************* +#define BTH_INFACE_BUF_LEN (70) +#define BTH_INFACE_BUF_FULLTG (50) + + +typedef struct{ + __u8 *buf_beg; //start of adress structur + __u8 *buf_end; //end of adress structur - beg+sizeof(struct) + __u8 *ip; //actual position at queue + __u8 *op; //position first unread char of queue +} bth_inface_que_t; + + + /* Queues */ +typedef struct bth_inface_info { + bth_inface_que_t bth_inface_que_in; + bth_inface_que_t bth_inface_que_out; + + __u8 bth_inface_buf_in[BTH_INFACE_BUF_LEN]; + __u8 bth_inface_buf_out[BTH_INFACE_BUF_LEN]; +} bth_inface_info_t; + +int bth_inface_sendch(int c); +int bth_inface_bth_recch(void); +int bth_inface_sendstr(const char *s); + +int bth_inface_que_out_free(int chan); +int bth_inface_que_in_ready(int chan); +int bth_inface_setmode(long int baud, int mode, int flowc, int chan); + + +#endif /* _ID_RS232_H_ */ + +/* Local variables: */ +/* c-basic-offset:2 */ +/* End: */ diff --git a/bth_tests/bluetooth/inline_fce.h b/bth_tests/bluetooth/inline_fce.h new file mode 100644 index 0000000..ee08505 --- /dev/null +++ b/bth_tests/bluetooth/inline_fce.h @@ -0,0 +1,184 @@ +/******************************************************************* + bluetooth library + + l2cap.c - any inline fce for bth library and list of fce calling + from event complete + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#ifndef INLINE_FCE_H +#define INLINE_FCE_H + #include + +/**/ +/*Search the list ba1 of the size num for bdadres ba2, if it is found, it's index is returned*/ + +static inline int bth_seach_bdaddr(bdaddr_t *ba1, const bdaddr_t *ba2, int num) +{ + int i; + for(i=0; i>8)&0x00ff; + return(value|pomoc); +}; + +static inline uint16_t __cpu_to_be16(uint16_t value) +{ + uint16_t pomoc=0; + pomoc=(value<<8)&0xff00; + value=(value>>8)&0x00ff; + return(value|pomoc); +}; + +static inline void store_le16(void *address, uint16_t value) //for u16 big endian +{ + uint16_t be; + be = __cpu_to_le16(value); +// be = htobs(value); + memcpy(address, &be, sizeof(uint16_t)); +} + +static inline void store_be16(void *address, uint16_t value) //for u16 big endian + { + uint16_t be; + be = __cpu_to_be16(value); + memcpy(address, &be, sizeof(uint16_t)); + } + + + static inline void __bthtomc16(void *address, void *value) + { + memcpy(address, value+1, 1); + memcpy((uint8_t*)address+1, (uint8_t*)value, 1); + }; + + +#else +static inline uint16_t __cpu_to_le16(uint16_t value) +{ + uint16_t pomoc=0; + return(value|pomoc); +}; + + +static inline uint16_t __cpu_to_be16(uint16_t value) +{ + uint16_t pomoc=0; + pomoc=(value<<8)&0xff00; + value=(value>>8)&0x00ff; + return(value|pomoc); +}; + +static inline void store_le16(void *address, uint16_t value) //pro u16 s vyuzitim bigindianu +{ + uint16_t be; + be = __cpu_to_le16(value); +// be = htobs(value); + memcpy(address, &be, sizeof(uint16_t)); +} + +static inline void store_be16(void *address, uint16_t value) //pro u16 s vyuzitim bigindianu + { + uint16_t be; + be = __cpu_to_le16(value); + memcpy(address, &be, sizeof(uint16_t)); + } + + static inline void __bthtomc16(void *address, void *value) + { +// (uint16_t*)address=(uint16_t)*(uint16_t*)value; + memcpy(address, value, 2); +// memcpy((uint8_t*)address+1, (uint8_t*)value, 1); + }; + + +#endif + +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +/********************************************************************/ +// ------------- COMMAND COMPLETE EVENT ---------------------------/ + +int cmd_ev_none(uint8_t *bth_p, uint8_t size); +/********************************************************************/ +/*********************** OGF = 0x01 ****************************/ +/*-------------------LINK CONTROL COMMANDS--------------------------*/ +/********************************************************************/ +int cmd_ev_01x000b(uint8_t *bth_p, uint8_t size); +int cmd_ev_01x000d(uint8_t *bth_p, uint8_t size); +int cmd_ev_01x000e(uint8_t *bth_p, uint8_t size); + +/********************************************************************/ +/*********************** OGF = 0x02 ****************************/ +/*-------------------LINK POLICY COMMANDS--------------------------*/ +/********************************************************************/ +int cmd_ev_02x0009(uint8_t *bth_p, uint8_t size); +int cmd_ev_02x000C(uint8_t *bth_p, uint8_t size); +int cmd_ev_02x000D(uint8_t *bth_p, uint8_t size); + +/********************************************************************/ +/*********************** OGF = 0x03 ****************************/ +/*--------------HOST CONTROLLER & BASEBAND COMMANDS-----------------*/ +/********************************************************************/ +int cmd_ev_03x0008(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0009(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x000d(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0011(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0012(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0014(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0015(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0017(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0019(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x001b(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x001d(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x001f(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0021(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0023(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0025(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0027(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0028(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0029(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x002b(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x002d(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x002e(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0036(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0037(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0038(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x0039(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x003b(uint8_t *bth_p, uint8_t size); +int cmd_ev_03x003d(uint8_t *bth_p, uint8_t size); + +/********************************************************************/ +/*********************** OGF = 0x04 ****************************/ +/*-------------------INFORMATIONAL PARAMETERS-----------------------*/ +/********************************************************************/ +int cmd_ev_04x0001(uint8_t *bth_p, uint8_t size); +int cmd_ev_04x0003(uint8_t *bth_p, uint8_t size); +int cmd_ev_04x0005(uint8_t *bth_p, uint8_t size); +int cmd_ev_04x0007(uint8_t *bth_p, uint8_t size); +int cmd_ev_04x0009(uint8_t *bth_p, uint8_t size); + + +#endif diff --git a/bth_tests/bluetooth/l2cap.c b/bth_tests/bluetooth/l2cap.c new file mode 100644 index 0000000..1153006 --- /dev/null +++ b/bth_tests/bluetooth/l2cap.c @@ -0,0 +1,446 @@ +/******************************************************************* + bluetooth library + + l2cap.c - fce for operation L2CAP protocol (build L2CAP packet) + and for saving data to data queue + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + + +#include +#include +#include +#ifdef BTH_LX +#include +#include +#include +#include +#endif + +#include "hci.h" +#include "l2cap.h" + +#include "inline_fce.h" +#include "bth_inface.h" +#include "bth_fce_out.h" + + +/** + * pointers to functions, which are executed depending on a parameter + */ +typedef int (*l2cap_code_fce_def)(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); +l2cap_code_fce_def l2cap_code_fce[]={ + l2cap_none,l2cap_cod_command_rej,l2cap_cod_conn_req, l2cap_cod_conn_rsp, l2cap_cod_conf_req, l2cap_cod_conf_rsp, + l2cap_cod_disconn_req, l2cap_cod_disconn_rsp, l2cap_cod_echo_req, l2cap_cod_echo_rsp, l2cap_cod_info_req, + l2cap_cod_info_rsp}; +#define L2CAP_SUM_FC (sizeof(l2cap_code_fce)/sizeof(l2cap_code_fce[0])) + + +/*----------------------- function depending on code -----------------------------------*/ + +/** +* Search the cannels of the connected device dev_num and search the channel dcid +*/ +static inline int l2cap_find_dcid(int dcid, int dev_num ) +{ + int i; + for(i=1;idcid[i]==dcid) + { + return(-3); + }; + }; + return (0); +}; + + +/*------------------------------ auxiliary functions --------------------------------*/ + +int l2cap_add_to_send_buffer(uint8_t *bth_p) +{ + if(bth_array_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; + bth_array_adrr_comm_packet[bth_com_buf_info.aktual]=bth_p; + + /*set the position in command array for the next command. If it is possible to write there (if the pointer = NULL) is checked by the writer. . + + nastaveni pozice v poli command prikazu pro pristi prikaz. Moznost zapisu (adresa v poli = NULL) + se overuje, az pri samotnem ukladani */ + if(bth_com_buf_info.aktual<(LENCOMMAND-2)){bth_com_buf_info.aktual++;} + else{ bth_com_buf_info.aktual=0;}; + return 0; + +}; +/** +* Nonexisting function - should never happend +*/ +int l2cap_none(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) +{ + return (-3); +}; + + + +/** + * decoding of the signaling packet and calling of the above functions + */ +int l2cap_signaling(uint8_t *bth_p, uint16_t size,int dev_num) +{ + l2cap_cmd_hdr bth_q; + + store16(bth_q.code,*((uint8_t*)bth_p+L2CAP_CMD_HDR____code)); + store16(bth_connected[dev_num]->ident,*((uint8_t*)bth_p+L2CAP_CMD_HDR____ident)); + __bthtomc16((uint8_t*)&(bth_q.len),((uint8_t*)bth_p+L2CAP_CMD_HDR____len)); + + if(bth_q.codehandle)); + store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,htobs(L2CAP_CMD_HDR_SIZE+L2CAP_CONN_RSP_SIZE+L2CAP_CMD_HDR_SIZE)); + + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len), htobs(L2CAP_CONN_RSP_SIZE+L2CAP_CMD_HDR_SIZE)); + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),htobs(0x0001)); + store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____code), L2CAP_CONN_RSP); + + + if(pos_chan>-1) //the channel of that device don't exists. We will create it + { + (bth_connected[dev_num])->scid[pos_chan]=(0x0040+pos_chan+1); + /*dcin - remote device, which */ + store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____dcid),(0x0040+pos_chan+1)); + } + else{ + result=htobs(L2CAP_CR_PEND); status=htobs(L2CAP_CS_NO_INFO); + store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____dcid),0); + }; + + store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____ident),((bths_connect_bluet*)bth_connected[dev_num])->ident); + store_le16((uint16_t*)((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____len),L2CAP_CONN_RSP_SIZE); + store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____scid),((bths_connect_bluet*)bth_connected[dev_num])->dcid[pos_chan]); + + if(l2cap_find_dcid(bth_q.scid, dev_num)>=0) //search all the DCID (SCID of remote device, if it is not used) + { + store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____result),htobs(L2CAP_CR_SUCCESS)); + store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____status),htobs(L2CAP_CS_NO_INFO)); + } + else//the device uses the channel, se reply with an apropriate error code + { + store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____result),result); + store_le16((uint16_t*)((uint8_t*)l2cap_conn_response+L2CAP_CONN_RSP____status),status); + }; + /*prepare data to sending buffer*/ + return(l2cap_add_to_send_buffer(bth_r)); + } + else + { + /*local device sends to the remote device paket 0x03 - apply for a channel*/ + }; + return (-1); +}; + +/** + Configure request + */ +int l2cap_cod_conf_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x04 +{ + l2cap_conf_req bth_q; + uint8_t *bth_r; + uint8_t *typ_hci_paket; + hci_acl_hdr *hci_headr; + l2cap_hdr *l2cap_headr; + l2cap_cmd_hdr *l2cap_cmd_headr; + l2cap_conf_req *l2cap_conf_request; + + if(bth_p==NULL) + { + } + else + { + __bthtomc16((uint8_t*)&(bth_q.dcid),((uint8_t*)bth_p+L2CAP_CONF_REQ____dcid)); + __bthtomc16((uint8_t*)&(bth_q.flags),((uint8_t*)bth_p+L2CAP_CONF_REQ____flags)); + //yet some data .... - in our case, nothing is processed + /*------*/ + pos_chan=bth_find_chanal_scid(dev_num, bth_q.dcid); + l2cap_cod_conf_rsp(NULL, 0, dev_num, pos_chan); //0x05 + + /***************build the packet, by which we send response code = 0x04 to the master*************/ + /*setting of addresses for the parts of the packet + filling of inidividual fields*/ + int hp_size=(HCI_PKT_SIZE+HCI_ACL_HDR_SIZE+L2CAP_HDR_SIZE+L2CAP_CMD_HDR_SIZE+L2CAP_CONF_REQ_SIZE); + bth_r=malloc(hp_size); + + typ_hci_paket=(uint8_t*)bth_r; + hci_headr=(hci_acl_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer to head + l2cap_headr=(l2cap_hdr *)(((uint8_t*)hci_headr)+HCI_ACL_HDR_SIZE); //pointer to parametrs + l2cap_cmd_headr=(l2cap_cmd_hdr *)(((uint8_t*)l2cap_headr)+L2CAP_HDR_SIZE); + l2cap_conf_request=(l2cap_conf_req *)(((uint8_t*)l2cap_cmd_headr)+L2CAP_CMD_HDR_SIZE); + /*------*/ + + store16(*typ_hci_paket, HCI_ACLDATA_PKT); + store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____handle,(htobs(0x2000)|(bth_connected[dev_num])->handle)); + store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,htobs(L2CAP_CMD_HDR_SIZE+L2CAP_CONF_REQ_SIZE+L2CAP_CMD_HDR_SIZE)); + + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len), htobs(L2CAP_CONF_REQ_SIZE+L2CAP_CMD_HDR_SIZE)); + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),htobs(0x0001)); + + store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____code), L2CAP_CONF_REQ); + store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____ident),(bth_connected[dev_num])->ident); + store_le16((uint16_t*)((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____len),htobs(L2CAP_CONF_REQ_SIZE)); + + store_le16((uint16_t*)((uint8_t*)l2cap_conf_request+L2CAP_CONF_REQ____dcid),(bth_connected[dev_num])->dcid[pos_chan]); + store_le16((uint16_t*)((uint8_t*)l2cap_conf_request+L2CAP_CONF_REQ____flags),0); + //the last item are data - they are not sent in this packet + + /******************* put it to send buffer **************************/ + l2cap_add_to_send_buffer(bth_r); + return 0; + }; + return (-1); +}; + + +/** + Configure response + */ +int l2cap_cod_conf_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x05 +{ + l2cap_conf_rsp bth_q; + uint8_t *bth_r; + uint8_t *typ_hci_paket; + hci_acl_hdr *hci_headr; + l2cap_hdr *l2cap_headr; + l2cap_cmd_hdr *l2cap_cmd_headr; + l2cap_conf_rsp *l2cap_conf_response; + + if(bth_p==NULL) + { + /*build the response packet*/ + /*setup the adresses for parts of the packet + filling of individual fields*/ + int hp_size=(HCI_PKT_SIZE+HCI_ACL_HDR_SIZE+L2CAP_HDR_SIZE+L2CAP_CMD_HDR_SIZE+L2CAP_CONF_RSP_SIZE); + bth_r=malloc(hp_size); + + typ_hci_paket=(uint8_t*)bth_r; + hci_headr=(hci_acl_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + l2cap_headr=(l2cap_hdr *)(((uint8_t*)hci_headr)+HCI_ACL_HDR_SIZE); //pointer on parametrs + l2cap_cmd_headr=(l2cap_cmd_hdr *)(((uint8_t*)l2cap_headr)+L2CAP_HDR_SIZE); + l2cap_conf_response=(l2cap_conf_rsp *)(((uint8_t*)l2cap_cmd_headr)+L2CAP_CMD_HDR_SIZE); + /*------*/ + store16(*typ_hci_paket, HCI_ACLDATA_PKT); + store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____handle,(htobs(0x2000)|(bth_connected[dev_num])->handle)); + store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,htobs(L2CAP_CMD_HDR_SIZE+L2CAP_CONF_RSP_SIZE+L2CAP_CMD_HDR_SIZE)); + + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len), htobs(L2CAP_CONF_RSP_SIZE+L2CAP_CMD_HDR_SIZE)); + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),htobs(0x0001)); + + store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____code), L2CAP_CONF_RSP); + (bth_connected[dev_num])->ident++; + store16(*((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____ident),(bth_connected[dev_num])->ident); + store_le16((uint16_t*)((uint8_t*)l2cap_cmd_headr+L2CAP_CMD_HDR____len),htobs(L2CAP_CONF_RSP_SIZE)); + + store_le16((uint16_t*)((uint8_t*)l2cap_conf_response+L2CAP_CONF_RSP____scid),(bth_connected[dev_num])->dcid[pos_chan]); + store_le16((uint16_t*)((uint8_t*)l2cap_conf_response+L2CAP_CONF_RSP____flags),0); + store_le16((uint16_t*)((uint8_t*)l2cap_conf_response+L2CAP_CONF_RSP____result),0); + //posledni polozka jsou data - nebubu posilat v tomto paketu //same as in previous func + + + /******************* umisteni do vysilaciho bufferu **************************/ + return(l2cap_add_to_send_buffer(bth_r)); + } + else + { + __bthtomc16((uint8_t*)&(bth_q.scid),((uint8_t*)bth_p+L2CAP_CONF_RSP____scid)); + __bthtomc16((uint8_t*)&(bth_q.flags),((uint8_t*)bth_p+L2CAP_CONF_RSP____flags)); + __bthtomc16((uint8_t*)&(bth_q.result),((uint8_t*)bth_p+L2CAP_CONF_RSP____result)); + return (bth_q.result);; + }; +}; + +/** + Disconnection request + */ +int l2cap_cod_disconn_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x06 +{ + return (-3); +}; + +/** + Disconnection response + */ +int l2cap_cod_disconn_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x07 +{ + return (-3); +}; + + +/** + Configure response + */ +int l2cap_cod_echo_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x08 +{ + return (-3); +}; + + +/** + Echo request + */ +int l2cap_cod_echo_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x09 +{ + return (-3); +}; + +/** + Echo response + */ +int l2cap_cod_info_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x0a +{ + return (-3); +}; + +/** + Information request + */ +int l2cap_cod_info_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) //0x0b +{ + return (-3); +}; + +/*----------------------- send data ----------------------------*/ + +/** + * zabali data z dat. zasobniku do peketu a da k odeslani +*/ +int l2cap_send_data(int inx_handle, int inx_chanal) + +{ + uint8_t *typ_hci_paket; + hci_acl_hdr *hci_headr; + l2cap_hdr *l2cap_headr; + uint8_t *data; + uint8_t *bth_r; + int zn; + int hp_size,size=0; + uint16_t handle, chanal; + + + if(bth_connected[inx_handle]==NULL) return (-1); + if((bth_connected[inx_handle])->dcid[inx_chanal]==0) return (-1); + + /*reading from sending buffer, try 1 character*/ + zn=bth_inface_t_isr(0); + if(zn>=0) + { + handle = ((bths_connect_bluet*)bth_connected[inx_handle])->handle; + handle=(handle | htobs(0x2000)); + chanal = (bth_connected[inx_handle])->dcid[inx_chanal]; + + /*make space for the packer + assign adresses for individual parts of L2CAP packet*/ + hp_size=(HCI_PKT_SIZE+HCI_ACL_HDR_SIZE+L2CAP_HDR_SIZE+BTH_INFACE_BUF_LEN); + bth_r=malloc(hp_size); + + typ_hci_paket=bth_r; //pozice v buff, ktera je prirazena paketu + hci_headr=(hci_acl_hdr *)(((uint8_t*)typ_hci_paket)+HCI_PKT_SIZE); //pointer on head + l2cap_headr=(l2cap_hdr *)(((uint8_t*)hci_headr)+HCI_ACL_HDR_SIZE); //pointer on parametrs + data=((uint8_t*)l2cap_headr+L2CAP_HDR_SIZE); //pointer na data + +/*-----------------------------DATA FOR SENDING TO PC --------------------------*/ + *((uint8_t*)data+size)=(uint8_t)zn; + size++; + /*cyclic reading of the folowing characters and building of the packet*/ + while ((zn=bth_inface_t_isr(0))>=0) + { + *((uint8_t*)data+size)=(uint8_t)zn; + size++; + }; + } + else {return (0);}; //data are not in the queue + +/*build the rest of the response packet ie. fill the fields*/ + store16(*typ_hci_paket, HCI_ACLDATA_PKT); + store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____handle,handle); + store_le16((uint8_t*)hci_headr+HCI_ACL_HDR____dlen,(htobs(L2CAP_CMD_HDR_SIZE)+size)); + + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____len),size); + store_le16((uint16_t*)((uint8_t*)l2cap_headr+L2CAP_HDR____cid),chanal); + +// VypisHexa((void*)typ_hci_paket,16); +// bth_local_info.busy=0; + return(l2cap_add_to_send_buffer(bth_r)); +}; diff --git a/bth_tests/bluetooth/l2cap.h b/bth_tests/bluetooth/l2cap.h new file mode 100644 index 0000000..b1a91bb --- /dev/null +++ b/bth_tests/bluetooth/l2cap.h @@ -0,0 +1,272 @@ +/******************************************************************* + bluetooth library + + l2cap.h - list of fce for operation L2CAP protocol and + list of L2CAP structures + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#ifndef __L2CAP_H +#define __L2CAP_H + + +/* L2CAP defaults */ +#define L2CAP_DEFAULT_MTU 672 +#define L2CAP_DEFAULT_FLUSH_TO 0xFFFF + +#define L2CAP_CONN_TIMEOUT (HZ * 40) + +/* L2CAP socket address */ +//struct sockaddr_l2 { +// sa_family_t l2_family; +// unsigned short l2_psm; +// bdaddr_t l2_bdaddr; +//}; + +/* L2CAP socket options */ +//#define L2CAP_OPTIONS 0x01 +//struct l2cap_options { +// uint16_t omtu; +// uint16_t imtu; +// uint16_t flush_to; +// uint8_t mode; +//}; + + +//#define L2CAP_CONNINFO 0x02 +//struct l2cap_conninfo { +// uint16_t hci_handle; +// uint8_t dev_class[3]; +//}; + +#define L2CAP_LM 0x03 +#define L2CAP_LM_MASTER 0x0001 +#define L2CAP_LM_AUTH 0x0002 +#define L2CAP_LM_ENCRYPT 0x0004 +#define L2CAP_LM_TRUSTED 0x0008 +#define L2CAP_LM_RELIABLE 0x0010 +#define L2CAP_LM_SECURE 0x0020 + +/* L2CAP command codes */ +#define L2CAP_COMMAND_REJ 0x01 +#define L2CAP_CONN_REQ 0x02 +#define L2CAP_CONN_RSP 0x03 +#define L2CAP_CONF_REQ 0x04 +#define L2CAP_CONF_RSP 0x05 +#define L2CAP_DISCONN_REQ 0x06 +#define L2CAP_DISCONN_RSP 0x07 +#define L2CAP_ECHO_REQ 0x08 +#define L2CAP_ECHO_RSP 0x09 +#define L2CAP_INFO_REQ 0x0a +#define L2CAP_INFO_RSP 0x0b + +/* L2CAP structures */ +typedef struct { + uint16_t len; + uint16_t cid; +} l2cap_hdr; +#define L2CAP_HDR____len 0 +#define L2CAP_HDR____cid 2 +/*--------------------------------*/ +#define L2CAP_HDR_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +typedef struct { + uint8_t code; + uint8_t ident; + uint16_t len; +} l2cap_cmd_hdr; +#define L2CAP_CMD_HDR____code 0 +#define L2CAP_CMD_HDR____ident 1 +#define L2CAP_CMD_HDR____len 2 +/*--------------------------------*/ +#define L2CAP_CMD_HDR_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +typedef struct { + uint16_t reason; +}l2cap_cmd_rej; +#define L2CAP_CMD_REJ____reason 0 +/*--------------------------------*/ +#define L2CAP_CMD_REJ_SIZE 2 +/****************************************************************/ +/****************************************************************/ + +typedef struct { //0x02 + uint16_t psm; + uint16_t scid; +} l2cap_conn_req; + +#define L2CAP_CONN_REQ____psm 0 +#define L2CAP_CONN_REQ____scid 2 +/*--------------------------------*/ +#define L2CAP_CONN_REQ_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +typedef struct { //0x03 + uint16_t dcid; + uint16_t scid; + uint16_t result; + uint16_t status; +} l2cap_conn_rsp; +#define L2CAP_CONN_RSP____dcid 0 +#define L2CAP_CONN_RSP____scid 2 +#define L2CAP_CONN_RSP____result 4 +#define L2CAP_CONN_RSP____status 6 +/*--------------------------------*/ +#define L2CAP_CONN_RSP_SIZE 8 +/****************************************************************/ +/****************************************************************/ + +/* connect result */ +#define L2CAP_CR_SUCCESS 0x0000 +#define L2CAP_CR_PEND 0x0001 +#define L2CAP_CR_BAD_PSM 0x0002 +#define L2CAP_CR_SEC_BLOCK 0x0003 +#define L2CAP_CR_NO_MEM 0x0004 + +/* connect status */ +#define L2CAP_CS_NO_INFO 0x0000 +#define L2CAP_CS_AUTHEN_PEND 0x0001 +#define L2CAP_CS_AUTHOR_PEND 0x0002 + +typedef struct { //0x04 + uint16_t dcid; + uint16_t flags; + uint8_t data[0]; +} l2cap_conf_req; +#define L2CAP_CONF_REQ____dcid 0 +#define L2CAP_CONF_REQ____flags 2 +#define L2CAP_CONF_REQ____data 4 +/*--------------------------------*/ +#define L2CAP_CONF_REQ_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +typedef struct { //0x05 + uint16_t scid; + uint16_t flags; + uint16_t result; + uint8_t data[0]; +} l2cap_conf_rsp; +#define L2CAP_CONF_RSP____scid 0 +#define L2CAP_CONF_RSP____flags 2 +#define L2CAP_CONF_RSP____result 4 +#define L2CAP_CONF_RSP____data 6 +/*--------------------------------*/ +#define L2CAP_CONF_RSP_SIZE 6 +/****************************************************************/ +/****************************************************************/ + + + +#define L2CAP_CONF_SUCCESS 0x0000 +#define L2CAP_CONF_UNACCEPT 0x0001 +#define L2CAP_CONF_REJECT 0x0002 +#define L2CAP_CONF_UNKNOWN 0x0003 + +typedef struct { + uint8_t type; + uint8_t len; + uint8_t val[0]; +} l2cap_conf_opt; +#define L2CAP_CONF_OPT____type 0 +#define L2CAP_CONF_OPT____len 1 +#define L2CAP_CONF_OPT____val 2 +/*--------------------------------*/ +#define L2CAP_CONF_OPT_SIZE 2 +/****************************************************************/ +/****************************************************************/ + + +#define L2CAP_CONF_MTU 0x01 +#define L2CAP_CONF_FLUSH_TO 0x02 +#define L2CAP_CONF_QOS 0x03 +#define L2CAP_CONF_RFC 0x04 +#define L2CAP_CONF_RFC_MODE 0x04 + +#define L2CAP_CONF_MAX_SIZE 22 + +typedef struct { + uint16_t dcid; + uint16_t scid; +} l2cap_disconn_req; +#define L2CAP_DISCONN_REQ____dcid 0 +#define L2CAP_DISCONN_REQ____scid 2 +/*--------------------------------*/ +#define L2CAP_DISCONN_REQ_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +typedef struct { + uint16_t dcid; + uint16_t scid; +} l2cap_disconn_rsp; +#define L2CAP_DISCONN_RSP____dcid 0 +#define L2CAP_DISCONN_RSP____scid 2 +/*--------------------------------*/ +#define L2CAP_DISCONN_RSP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +typedef struct { + uint16_t type; + uint8_t data[0]; +} l2cap_info_req; +#define L2CAP_INFO_REQ____type 0 +#define L2CAP_INFO_REQ____data 2 +/*--------------------------------*/ +#define L2CAP_INFO_REQ_SIZE 2 +/****************************************************************/ +/****************************************************************/ + +typedef struct { + uint16_t type; + uint16_t result; + uint8_t data[0]; +} l2cap_info_rsp; +#define L2CAP_INFO_RSP____type 0 +#define L2CAP_INFO_RSP____result 2 +#define L2CAP_INFO_RSP____data 4 +/*--------------------------------*/ +#define L2CAP_INFO_RSP_SIZE 4 +/****************************************************************/ +/****************************************************************/ + +/* info type */ +#define L2CAP_IT_CL_MTU 0x0001 +#define L2CAP_IT_FEAT_MASK 0x0002 + +/* info result */ +#define L2CAP_IR_SUCCESS 0x0000 +#define L2CAP_IR_NOTSUPP 0x0001 + + + + + + + +/*----------------------- funkce zavisle na code -----------------------------------*/ +int l2cap_signaling(uint8_t *bth_p, uint16_t size, int dev_num); + +int l2cap_none(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); +int l2cap_cod_command_rej(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x01 +int l2cap_cod_conn_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x02 +int l2cap_cod_conn_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x03 +int l2cap_cod_conf_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x04 +int l2cap_cod_conf_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x05 +int l2cap_cod_disconn_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x06 +int l2cap_cod_disconn_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x07 +int l2cap_cod_echo_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x08 +int l2cap_cod_echo_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x09 +int l2cap_cod_info_req(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x0a +int l2cap_cod_info_rsp(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan); //0x0b +//int l2cap_send_data(int inx_handle, int inx_chanal); + +#endif /* __L2CAP_H */ -- 2.39.2