From: Nguyen Hoang Date: Wed, 28 Jun 2006 13:20:00 +0000 (+0000) Subject: Initial import of Petr's work. X-Git-Tag: Kovacik's_version~6 X-Git-Url: https://rtime.felk.cvut.cz/gitweb/mirosot.git/commitdiff_plain/4e0cc103d87913972586c05e1161553493b9428b Initial import of Petr's work. darcs-hash:20060628132006-5a954-7245443a2ba8d39662c9f6e830f96519c1d14e75.gz --- 4e0cc103d87913972586c05e1161553493b9428b diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f595272 --- /dev/null +++ b/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/Makefile.omk b/Makefile.omk new file mode 100644 index 0000000..ec0f5ba --- /dev/null +++ b/Makefile.omk @@ -0,0 +1 @@ +SUBDIRS = bluetooth testapp \ No newline at end of file diff --git a/bluetooth/Makefile b/bluetooth/Makefile new file mode 100644 index 0000000..f595272 --- /dev/null +++ b/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/bluetooth/Makefile.omk b/bluetooth/Makefile.omk new file mode 100644 index 0000000..aac9b8e --- /dev/null +++ b/bluetooth/Makefile.omk @@ -0,0 +1,17 @@ +# -*- 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 = bluetooth + +bluetooth_SOURCES = bth_command.c bth_event_acc.c bth_error.c bth_cmd_complete_ev.c l2cap.c bth_inface.c bth_main.c h2638_pkt_controll.c +include_HEADERS = bth_inface.h bth_fce_out.h bth_h8s2638.h + diff --git a/bluetooth/Makefile.win b/bluetooth/Makefile.win new file mode 100644 index 0000000..c9bd031 --- /dev/null +++ b/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/bluetooth/bth_cmd_complete_ev.c b/bluetooth/bth_cmd_complete_ev.c new file mode 100644 index 0000000..05ce701 --- /dev/null +++ b/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 +#ifdef BTH_LX +#include +#include +//#include +#endif +#include "types.h" +#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; + store16(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_pole_adrr_check_packet[index]); + bth_pole_adrr_check_packet[index]=NULL; + return 0; //prikaz probehl bez komplikaci + } + else + { + /*status neni OK */ + free(bth_pole_adrr_check_packet[index]); + bth_pole_adrr_check_packet[index]=NULL; + return((int)*((uint8_t*)bth_p+READ_BD_ADDR_RP____status)); //NOTE asi jsem tam pripisoval hvezdicku, uz nevim jiste, bylo to vcera >-] + }; + }; +}; diff --git a/bluetooth/bth_command.c b/bluetooth/bth_command.c new file mode 100644 index 0000000..c9b221c --- /dev/null +++ b/bluetooth/bth_command.c @@ -0,0 +1,408 @@ +/******************************************************************* + bluetooth library + + bth_command.c - command fce (bth specification) - build command + packet + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + +#include +#include +#ifdef BTH_LX +#include +#include +#include +#include +#include + +#else +#include "types.h" +#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 *Pomocna; + if(dyn_chan!=NULL) + { + Pomocna=dyn_chan; + while (Pomocna->next!=NULL) + { + Pomocna=Pomocna->next; /*dam command prikaz do fronty*/ + }; + return Pomocna; + } + 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; //pocitani v cyklu +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+INQUIRY_CP_SIZE); + + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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=(inquiry_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_INQUIRY))); + store16(*((uint8_t*)hci_headr+HCI_COMMAND_HDR____plen),INQUIRY_CP_SIZE); + + /*pokud neni uvedeno lap zvoli se univerzlni*/ + 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));}; + }; + +/*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; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+SET_CONN_PTYPE_CP_SIZE); + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=HCI_PKT_SIZE+HCI_COMMAND_HDR_SIZE+DISCONNECT_CP_SIZE; + + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=HCI_PKT_SIZE+HCI_COMMAND_HDR_SIZE+WRITE_LINK_POLICY_CP_SIZE; + + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=HCI_PKT_SIZE+HCI_COMMAND_HDR_SIZE; + + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; + hci_command_hdr *hci_headr; + accept_conn_req_cp *bth_cmd_packet; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+ACCEPT_CONN_REQ_CP_SIZE); + + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+WRITE_PAGE_ACTIVITY_CP_SIZE); + + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+WRITE_PAGE_ACTIVITY_CP_SIZE); + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE); + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; + +/*-------------------------------------------------------------------------------*/ +/*-- urceni potreb. velikostipro command prikaz v buff. a zjisteni zda se vejde--*/ + + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; +/*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + int hp_size=(sizeof(uint8_t)+HCI_COMMAND_HDR_SIZE+WRITE_SCAN_ENABLE_SIZE); + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=malloc(hp_size); + typ_hci_paket=(uint8_t*)bth_pole_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; +}; + diff --git a/bluetooth/bth_error.c b/bluetooth/bth_error.c new file mode 100644 index 0000000..99dfb25 --- /dev/null +++ b/bluetooth/bth_error.c @@ -0,0 +1,105 @@ +#ifdef BTH_LX +#include +#include +#include +#include +#include +#else +#include "types.h" +#endif + +#include +#include "hci.h" +#include "hci_error.h" + + +/** + * chyby generovane bth zarizenim +*/ + +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" }, +}; + +/** +* vypis chyby na terminal pres RS232 +*/ +void bth_error_detect_status(uint8_t status_num) +{ + uint8_t *message; + int i=0; + if(status_num +#include +#include "types.h" +#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])) + + + +/*********************************************************************************/ + +/*navratove hodnoty + 0 = OK - prikaz odstranen z fronty + -1 = fronta prohledana, ale nebyl tam nalezen hledany OBCOD + +num = index overovane polozky v poli "bth_pole_adrr_check_packet" s hledanym obcodem +*/ +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*/ + + store16(bth_q->link_type,*((uint8_t*)bth_p+EVT_CONN_COMPLETE____link_type)); + store16(bth_q->encr_mode,*((uint8_t*)bth_p+EVT_CONN_COMPLETE____encr_mode)); + + bth_cmd_write_link_policy_settings(bth_q->handle,htobs(0x000f)); //odpoved + 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 adresa zadajiciho zarizeni*/ + 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; + + store16(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) /*jedna se pouze o potvrzeni - status*/ + { + if(*((uint8_t*)bth_p+3)==0) + { + free(bth_pole_adrr_check_packet[index]); + bth_pole_adrr_check_packet[index]=NULL; + bth_local_info.busy=0; + return 0; //prikaz probehl bez komplikaci + } + else + { + /*status neni OK - nastala chyba - odeslany comand prikaz je stale ve fronte k potvrzeni*/ + free(bth_pole_adrr_check_packet[index]); + bth_pole_adrr_check_packet[index]=NULL; + bth_local_info.busy=0; + return((int)*((uint8_t*)bth_p+EVT_CMD_COMPLETE_SIZE)); + }; + } + else + { + /*rozdelim obcode na OGF a OCF a prevedu na jednobytovou promenou*/ +// 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); + + /*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; - localni info o paketech +// Change_Connection_Packet_Type - cmd prikaz, kterym 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)); + + /*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/bluetooth/bth_fce_out.h b/bluetooth/bth_fce_out.h new file mode 100644 index 0000000..fe27d41 --- /dev/null +++ b/bluetooth/bth_fce_out.h @@ -0,0 +1,18 @@ +/******************************************************************* + bluetooth library + + bth_fce_out.h - list of fce for using in aplication + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + + + +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/bluetooth/bth_h8s2638.h b/bluetooth/bth_h8s2638.h new file mode 100644 index 0000000..36061d1 --- /dev/null +++ b/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/bluetooth/bth_inface.c b/bluetooth/bth_inface.c new file mode 100644 index 0000000..0167c26 --- /dev/null +++ b/bluetooth/bth_inface.c @@ -0,0 +1,119 @@ +/******************************************************************* + 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 + + *******************************************************************/ +#ifdef BTH_LX +#include + +#else +#include "types.h" +#include +#endif + +#include +#include "bth_inface.h" +#include "bth_inface.h" + +#include + +/*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); +} + +/** + * fce write one char to out-buffer. Fce return a code of char. If a value is -1 its signal for error +*/ +int bth_inface_sendch(int val, int chan) +{ + if(bth_inface_que_put(&(bth_inface_chan_array[chan].bth_inface_que_out),val)<0) + {return (-1);}; + return (val); +}; + + +/** + * fce read one char of in-buffer. Fce return a code of char. If is a value -1 than is not new char +*/ +int bth_inface_recch(int chan) +{ + short val; + if((val=bth_inface_que_get(&(bth_inface_chan_array[chan].bth_inface_que_in)))>=0) + { + sci_rs232_sendch(val,sci_rs232_chan_default); + 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]); //mnozstvi komunikacnich rozhranni 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/bluetooth/bth_inface.h b/bluetooth/bth_inface.h new file mode 100644 index 0000000..2ff1528 --- /dev/null +++ b/bluetooth/bth_inface.h @@ -0,0 +1,75 @@ + +/******************************************************************* + 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_ + +#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); +/* HACK: Include machine specific definitions */ + +#endif /* _ID_BTH_INFACE_H_ */ + diff --git a/bluetooth/bth_main.c b/bluetooth/bth_main.c new file mode 100644 index 0000000..b48e8de --- /dev/null +++ b/bluetooth/bth_main.c @@ -0,0 +1,541 @@ +/******************************************************************* + bluetooth library + + bth_main.c - API bth library (recieve, send ...) + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ +#ifdef BTH_LX +#include +#include +#include +#include +#include +#include +#else +#include "types.h" +#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" +#include + +/*--------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 -----------------------------*/ +uint8_t bth_pole_char_in[SCI_BTH_BUF_LEN]; +bth_que_t bth_rs232_que_in; +uint8_t bth_rs232_buf_in[SCI_BTH_BUF_LEN]; +//-- --- ----- ----- ---- ------ ----- -- ---- -- +//-- --- ----- ----- ---- ------ ----- -- ---- -- +bth_que_t bth_inface_que_in; +bth_que_t bth_inface_que_out; + + + +void *bth_pole_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_pole_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}; +/***********************************************************************************/ + +/*kontroluje synchoronizaci prijimanych dat pomoci TPU jednotky*/ +uint8_t bth_controll_flag=0; + + +/**-------------------------------------------------------------------------------*/ +/*----- odeslani command prikazu, pokud je local bluetooth volny k odeslani------*/ +/* 0 = data presunuta do SCI bufferu = budou odeslana, bluetooth zarizeni je volne + 1 = prikaz se nepovedlo presunout do SCI bufferu, ale bluet device je volne + 2 = bluetooth zarizeni je zamestnane, tj. data se nepresunula do bufferu + 3 = v potvrzovacim zasobniku neni uz misto*/ + +/** + * 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;}; //zarizeni neni volne + 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_pole_adrr_comm_packet[bth_com_buf_info.sent+1]==NULL) + {return 1;}; //URCITE neni co odesilat + } + else + { + if(bth_pole_adrr_comm_packet[0]==NULL) + {return 1;}; //URCITE neni co odesilat + }; + }; + + /*bth_send_packet(AdrOdkud,kolikBytu;)*/ + switch(*(uint8_t*)bth_pole_adrr_comm_packet[bth_com_buf_info.sent]) + { + case HCI_ACLDATA_PKT: + __bthtomc16((uint8_t*)&(hp_size),((uint8_t*)bth_pole_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_pole_adrr_comm_packet[bth_com_buf_info.sent],hp_size))) + { + free(bth_pole_adrr_comm_packet[bth_com_buf_info.sent]); + bth_pole_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_pole_adrr_comm_packet[bth_com_buf_info.sent]); + bth_pole_adrr_comm_packet[bth_com_buf_info.sent]=NULL; + return (-6); + case HCI_COMMAND_PKT: + hp_size=((uint16_t)*(((uint8_t*)bth_pole_adrr_comm_packet[bth_com_buf_info.sent])+HCI_PKT_SIZE+2)+HCI_COMMAND_HDR_SIZE+HCI_PKT_SIZE); + if(!(bth_send_packet(bth_pole_adrr_comm_packet[bth_com_buf_info.sent],hp_size))) + {/*odeslano - zaradim prikaz k moznosti potvrzeni*/ + for(i=0; i>4; +#ifdef BTH_LX + 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; +}; + + + +/** + *Funkce odesle data o velikosti hp_size od adresy hp do bth (UART) + */ +int bth_send_packet(uint8_t *hp, uint16_t hp_size) +{ + int zn,i; + /*je bluetooth zarizeni volne, nebo zamestnano predchozim prikazem?*/ + if(bth_local_info.busy==0) + { +#ifndef BTH_LX + VypisHexa(hp,hp_size); +#else + + for(i=0; iip; //nastav se na aktual pozici v souboru + *(p++)=c; //na nasledujici pam. bunku uloz znak + if(p==q->buf_end) return -1;//buffer neni kruhovy p=q->buf_beg; +// if(p==q->op) return -1; + q->ip=p; + return 0; //pokud nejsou problemy, vrat znak, jinak -1 +} + + +/** + *prijaty HCI datovy paket je zaslan jako 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); + }; + /*skutecna nefalcovana data ...*/ + /*musim najit kanal s cislem cid pro zarizeni bth_dev_num*/ + if(bth_find_chanal(bth_dev_num, bth_l2cap_packet.cid)>-1) + { + /*TADY JSOU DOSLA DATA, KTERA UZ NEJSOU KONFIGURACNI*/ + + + 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 + { + /*zasobnik plny, 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*/ /*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); +}; + + +/** + *prijaty HCI datovy paket je zaslan jako broadcast (nedopsana funkce) + */ +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); +}; + + + +/** + *prijaty HCI datovy paket je zaslan vramci picosite (nedopsana funkce) + */ +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); +}; + + + +/** + *budouci vyuziti (nedopsana funkce) + */ +int bth_pkt_type_reserved(uint16_t handle, uint8_t bound_flag, uint8_t *bth_p, uint16_t size) +{ + return(-3); +}; + + +/****************************************************************************/ +/****************************************************************************/ + +/** + *pointry na funkce. Funkce jsou volany podle prijateho datoveho HCI peketu + */ +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])) + + +/** + *pointry na funkce. Funkce jsou volany podle event codu, dekodovaneho z prijateho event HCI peketu + */ +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])) + + +/** + *Hlavni funkce, ktera ulozi prijaty znak "c" (od bth) ulozi ho do vstupni fronty, zkontroluje zda-li + * je paekt cely a pokud ano, tak zavola funkce pro jeho zpracovani (pro ACL HCI a pro 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); //ulozim prijaty znak do zasobniku + typ_paket=((uint8_t*)bth_rs232_que_in.buf_beg); //zjistim tzp paketu ACL, Even, SCO ... + switch(*typ_paket) + { + case HCI_EVENT_PKT: + /*naplnim strukturu "hci_event_hdr" ze zasobniku - po bytech*/ + store16(bth_event_packet.evt, *(((uint8_t*)bth_rs232_que_in.buf_beg)+HCI_PKT_SIZE)); + store16(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 na fci prislusenijici even codu*/ + if(bth_event_packet.evt=0) + { + // bth_error_detect_status((uint8_t)error_code); //error vypisy + } + else + {//bth_error_detect_event((uint8_t)(-error_code)); //error vypisy + }; + }; + }; + 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)) + { + + /* **** kontrola sousednosti dvou znaku 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; + + /*prom 'char_acl_pkt' vyjadruje vlastnosti paketu, if point to point nebo broadcast, or char. L2CAP*/ + store16(char_acl_pkt, (0xf0&*(((uint8_t*)bth_rs232_que_in.buf_beg)+HCI_PKT_SIZE+HCI_ACL_HDR____handle+1))); + + /*rozhodnuti o jaky paket se jedna (PtP,Piconet,broat...) a o jaky typ komunikace se zarizenim (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; +}; + + +/** + * nastaveni zasobniku - inicializacni funkce +*/ +void bth_init(void) +{ +// bth_check_command_for_send=NULL; + + bth_rs232_que_in.buf_end=(uint8_t*)bth_pole_char_in+SCI_RS232_BUF_LEN; + bth_rs232_que_in.buf_beg=bth_pole_char_in; + bth_rs232_que_in.ip=bth_pole_char_in; +}; + +/****************************************************************************/ +/****************************************************************************/ + +/** + * Pomocna funce, ktera slouzi k prevodum znaku an tisknutelne znaky +*/ +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); //do PC + sci_rs232_sendch(tisk[(zn&0x0f)],sci_rs232_chan_default); //do PC +#endif + }; + + return 0; +}; + diff --git a/bluetooth/bth_receive.h b/bluetooth/bth_receive.h new file mode 100644 index 0000000..cd30f36 --- /dev/null +++ b/bluetooth/bth_receive.h @@ -0,0 +1,22 @@ +/******************************************************************* + 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 + +#define SCI_BTH_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; // not use +} bth_que_t; + + +#endif diff --git a/bluetooth/h2638_pkt_controll.c b/bluetooth/h2638_pkt_controll.c new file mode 100644 index 0000000..0793d34 --- /dev/null +++ b/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; + +/** + * obsluha preruseni, inkrementuje promennou timer a blika diodami + */ +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) +}; + + +/** + * spusteni TPU casovace kanalu 1 +*/ +void bth_start_TPU_counter(void) +{ + *TPU_TSTR|=(1<<1); /* Start channel 1 */ +}; + + +/** + * zastaveni TPU casovace kanalu 1 + */ +void bth_stop_TPU_counter(void) +{ + *TPU_TSTR&=~(1<<1); /* Stop channel 1 */ +}; + + +/** + * vynulovani TPU casovace kanalu 1 + */ +void bth_clear_TPU_counter(void) +{ + *TPU_TCNT1=0; +}; + + +/** + * funkce vraci pocet presuseni casovace + */ +long int bth_get_timer(void) +{ + return timer; +}; + +/** + * nulovani poctu preruseni casovace + */ +void bth_nul_timer(void) +{ + timer=0; +}; + + +/** + * inicializace casovace - HW 1-preteceni citace; 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/bluetooth/hci.h b/bluetooth/hci.h new file mode 100644 index 0000000..9cab25f --- /dev/null +++ b/bluetooth/hci.h @@ -0,0 +1,288 @@ +/******************************************************************* + bluetooth library + + hci.h - main structures for keeping an information about a queie, 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 + +/* 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 store16(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[]; + +/*---------------- queue prikazova a potvrzovaci-----------------------*/ +#define LENCOMMAND 10 +extern void *bth_pole_adrr_comm_packet[LENCOMMAND]; +extern bths_command_buf_info bth_com_buf_info; + +extern void *bth_pole_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/bluetooth/hci_command.h b/bluetooth/hci_command.h new file mode 100644 index 0000000..340d7af --- /dev/null +++ b/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/bluetooth/hci_error.h b/bluetooth/hci_error.h new file mode 100644 index 0000000..89ac29a --- /dev/null +++ b/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/bluetooth/hci_event.h b/bluetooth/hci_event.h new file mode 100644 index 0000000..c87d481 --- /dev/null +++ b/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/bluetooth/inface_bth.h b/bluetooth/inface_bth.h new file mode 100644 index 0000000..bfbe05d --- /dev/null +++ b/bluetooth/inface_bth.h @@ -0,0 +1,50 @@ +/******************************************************************* + bluetooth library + + inface_bth.h - list of fce inface_bth.c and definition structurs for keeping information + about data queue + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ + +#ifndef _ID_RS232_H_ +#define _ID_RS232_H_ + +#include +//************************************************************* +#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/bluetooth/inline_fce.h b/bluetooth/inline_fce.h new file mode 100644 index 0000000..c813b3e --- /dev/null +++ b/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 + +/**/ +/*funkce hlada v seznamu bdadres ba2 velikosti num bdadresu ba1, pokud ji najde, vrati jeji poradi*/ + +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) //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_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/bluetooth/l2cap.c b/bluetooth/l2cap.c new file mode 100644 index 0000000..b2e2944 --- /dev/null +++ b/bluetooth/l2cap.c @@ -0,0 +1,444 @@ +/******************************************************************* + 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 +#ifdef BTH_LX +#include +#include +#include +#include +#include + +#else +#include "types.h" +#endif + +#include "hci.h" +#include "l2cap.h" + +#include "inline_fce.h" +#include "bth_inface.h" +#include "bth_fce_out.h" + + +/** + * pointery na funkce, ktere se vykonavaji v zavislosti na parametru + */ +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])) + + +/*----------------------- funkce zavisle na code -----------------------------------*/ + +/** +* funkce prohledava kanaly pripoj. zazizeni dev_num a hleda zadany kanal +*/ +inline int l2cap_find_dcid(int dcid, int dev_num ) +{ + int i; + for(i=1;idcid[i]==dcid) + { + return(-3); + }; + }; + return (0); +}; + + +/*------------------------------ pomocne funkce --------------------------------*/ + +int l2cap_add_to_send_buffer(uint8_t *bth_p) +{ + if(bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]!=NULL) + {return 1;}; + bth_pole_adrr_comm_packet[bth_com_buf_info.aktual]=bth_p; + + /*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; + +}; +/** +* neexistujici funkce - nemeli by nikdy nastat +*/ +int l2cap_none(uint8_t *bth_p, uint16_t size, int dev_num, int pos_chan) +{ + return (-3); +}; + + + +/** + * dekodovani signaling paketu a volani vyse napsanych fci (pointery na fce) + */ +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) //kanal daneho zarizeni, jeste neexistuje, tj. zalozim ho + { + (bth_connected[dev_num])->scid[pos_chan]=(0x0040+pos_chan+1); + /*dcin - vzdal. zarizeni, ktere */ + 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) //prohledam vsechna DCID (SCID vzdaleneho zarizeni, jeslti uz ho nepouziva) + { + 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//zarizeni uz kanal pouziva, tj. odrekni spojeni s prislusnzym chyb. kodem + { + 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); + }; + /*pripravim data do vysilaciho bufferu*/ + return(l2cap_add_to_send_buffer(bth_r)); + } + else + { + /*lok. zarizeni vysila vzdalenemu zarizeni paket 0x03 - zada o kanal*/ + }; + 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)); + //jeste nejaka data .... - v nasem pripade se zadna nezpracovavaji + /*------*/ + pos_chan=bth_find_chanal_scid(dev_num, bth_q.dcid); + l2cap_cod_conf_rsp(NULL, 0, dev_num, pos_chan); //0x05 + + /***************sestavim paket, kterym posilam responce kod = 0x04 masterovi*************/ + /*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + 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 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_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); + //posledni polozka jsou data - nebubu posilat v tomto paketu + + /******************* umisteni do vysilaciho bufferu **************************/ + 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) + { + /*sestavim paket, kterym odpovidam*/ + /*nastaveni adres pro casti paketu + naplneni jednotlivych polozek*/ + 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 + + + /******************* 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); + + /*cteni z vysilaciho zasobniku, skusmo 1 znak*/ + 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]; + + /*vytvoreni prostoru pro paket + prideleni adres pro jednotlive casti L2CAP paketu*/ + 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++; + /*cyklicke cteni dalsich znaku a skladani do paketu*/ + while ((zn=bth_inface_t_isr(0))>=0) + { + *((uint8_t*)data+size)=(uint8_t)zn; + size++; + }; + } + else {return (0);}; //data nejsou v zasobniku + +/*sestavim zbytek paketu, kterym odpovidam tj. naplneni jednotlivych polozek*/ + 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/bluetooth/l2cap.h b/bluetooth/l2cap.h new file mode 100644 index 0000000..b1a91bb --- /dev/null +++ b/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 */ diff --git a/bluetooth/types.h b/bluetooth/types.h new file mode 100644 index 0000000..6df3557 --- /dev/null +++ b/bluetooth/types.h @@ -0,0 +1,70 @@ +#ifndef _H8S_TYPES_H +#define _H8S_TYPES_H + + +typedef unsigned short umode_t; + +/* + * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the + * header files exported to user space + */ + +typedef __signed__ char __s8; +typedef unsigned char __u8; + +typedef __signed__ short __s16; +typedef unsigned short __u16; + +#if __INT_MAX__ == 32767 +typedef __signed__ long __s32; +typedef unsigned long __u32; +#else +typedef int __s32; +typedef unsigned int __u32; +#endif + +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +typedef __signed__ long long __s64; +typedef unsigned long long __u64; +#endif + +#ifndef __BIT_TYPES_DEFINED__ +#define __BIT_TYPES_DEFINED__ + +typedef __u8 uint8_t; +typedef __s8 int8_t; +typedef __u16 uint16_t; +typedef __s16 int16_t; +typedef __u32 uint32_t; +typedef __s32 int32_t; + +#if defined(__GNUC__) && !defined(__STRICT_ANSI__) +typedef __s64 int64_t; +typedef __u64 uint64_t; +#endif + +#endif /* !(__BIT_TYPES_DEFINED__) */ + + +/* + * These aren't exported outside the kernel to avoid name space clashes + */ +#ifdef __KERNEL__ + +typedef __s8 s8; +typedef __u8 u8; + +typedef __s16 s16; +typedef __u16 u16; + +typedef __s32 s32; +typedef __u32 u32; + +typedef __s64 s64; +typedef __s64 u64; + +#define BITS_PER_LONG 32 + +#endif /* __KERNEL__ */ + +#endif /* _H8S_TYPES_H */ diff --git a/testapp/Makefile b/testapp/Makefile new file mode 100644 index 0000000..f595272 --- /dev/null +++ b/testapp/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/testapp/Makefile.omk b/testapp/Makefile.omk new file mode 100644 index 0000000..b103163 --- /dev/null +++ b/testapp/Makefile.omk @@ -0,0 +1,19 @@ +# -*- 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 = bluetooth + +#bluetooth_SOURCES = bth_command.c bth_event_acc.c bth_error.c bth_cmd_complete_ev.c l2cap.c bth_inface.c bth_main.c h2638_pkt_controll.c +#include_HEADERS = bth_inface.h bth_fce_out.h bth_h8s2638.h + diff --git a/testapp/main.c b/testapp/main.c new file mode 100644 index 0000000..8b2a98e --- /dev/null +++ b/testapp/main.c @@ -0,0 +1,121 @@ +/******************************************************************* + bluetooth test aplication - bth chat + + bth_h8s2638.h - bth chat - write a recieve data to RS232 link + as recieve data include char is 'a' aplication + send 'ahoj' + + Copyright (C) 2006 by Petr Kovacik petr_kovacik@gmail.com + + *******************************************************************/ +#ifdef BTH_LX +#include +#include +#include +#include +#include +#include +#include +#include "bth_h8s2638.h" + + +#else +#include "types.h" +#include +#endif + +#include "bth_inface.h" +#include "bth_fce_out.h" + +#ifdef BTH_LX +//******************************************************* + +void unhandled_exception(void) __attribute__ ((interrupt_handler)); +/** + * init - shaddow registers, outputs.. + * + * Initializes P1 and P3 shaddow registers, + * sets PJ.1, PJ.2, PJ.3 LED as outputs, + * initialises interrupt vector. + */ +void init() +{ + /* initialises interrupt vector */ + excptvec_initfill(unhandled_exception, 0); +} + +/*Interrupt routines*/ +void unhandled_exception(void) +{ +}; +//***************************************#define _USE_EXR_LEVELS 1***************** +#endif + + + +int main() +{ + int zz,zn_bth; + + + /********************************************************************************/ +#ifdef BTH_LX +// *SYS_SYSCR|=(SYSCR_INTM1m); +// *INT_IPRH=0x34; +// *INT_IPRK=0x67; /*highest priority SCI 1 and 2*/ + + *DIO_PEDDR=0xff; /*output gate*/ + *DIO_PEDR=0x60; /*0x0-LED - light all; 0x6 -ENA,ENB=1, LE33CD=0*/ + + cli(); + init(); + sti(); + + sci_rs232_setmode(115200, 0, 0, 2); //bth + sci_rs232_setmode(19200, 0, 0, sci_rs232_chan_default); //PC + +#endif + bth_inface_setup(0); /*init I/O data buffer for bluetooth*/ + bth_init(); /*init bth device*/ + + + bth_init_pkt_controll(); + bth_parametr_slave(); /* set up bluetooth device to slave*/ + bth_start_TPU_counter(); + + do{ + zn_bth=sci_rs232_recch(2); + }while(bth_get_timer()<3); + bth_start(); + + /* + do{ + zn=sci_rs232_recch(sci_rs232_chan_default); + zn_bth=sci_rs232_recch(2); + }while (zn==-1); + */ + + + do{ + zn_bth=sci_rs232_recch(2); + if(zn_bth!=-1) + { + bth_conv_char_text(zn_bth); + bth_recieve_packet(zn_bth); + }; + + if((zz=bth_inface_recch(0))>-1) + { + if(zz=='a') + { + bth_inface_sendch('a',0); bth_inface_sendch('h',0); bth_inface_sendch('o',0); + bth_inface_sendch('j',0); bth_inface_sendch('\n',0); + }; + l2cap_send_data(0, 0); + sci_rs232_sendch(zz,sci_rs232_chan_default); + }; + bth_send_queue(); +// sci_rs232_sendch('.',sci_rs232_chan_default); + }while(1); + return 0; +};