Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
f13bc35a
Commit
f13bc35a
authored
May 17, 2010
by
Dean Camera
Browse files
Begin processing code for Service Discovery Protocol attributes.
parent
ff61dfa5
Changes
6
Hide whitespace changes
Inline
Side-by-side
Demos/Host/Incomplete/BluetoothHost/Lib/BluetoothStack.c
View file @
f13bc35a
...
...
@@ -59,6 +59,9 @@ void Bluetooth_Stack_Init(void)
*/
void
Bluetooth_Stack_USBTask
(
void
)
{
if
(
USB_HostState
!=
HOST_STATE_Configured
)
return
;
Bluetooth_HCITask
();
Bluetooth_ACLTask
();
}
...
...
Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.c
View file @
f13bc35a
...
...
@@ -31,25 +31,25 @@
#define INCLUDE_FROM_SERVICEDISCOVERYPROTOCOL_C
#include "ServiceDiscoveryProtocol.h"
SERVICE_ATTRIBUTE_TEXT
(
SDP_Attribute_Name
,
"SDP"
);
SERVICE_ATTRIBUTE_TEXT
(
SDP_Attribute_Description
,
"BT Service Discovery"
);
SERVICE_ATTRIBUTE_
8BIT_
LEN
(
SDP_Attribute_Availability
,
SDP_DATATYPE_UNSIGNED_INT
,
1
,
{
0xFF
});
SERVICE_ATTRIBUTE_TEXT
(
SDP_Attribute_Name
,
"SDP"
);
SERVICE_ATTRIBUTE_TEXT
(
SDP_Attribute_Description
,
"BT Service Discovery"
);
SERVICE_ATTRIBUTE_LEN
8
(
SDP_Attribute_Availability
,
SDP_DATATYPE_UNSIGNED_INT
,
1
,
{
0xFF
});
const
ServiceAttributeTable_t
SDP_Attribute_Table
[]
PROGMEM
=
{
{.
Attribute
ID
=
SDP_ATTRIBUTE_NAME
,
.
Attribute
Data
=
&
SDP_Attribute_Name
},
{.
Attribute
ID
=
SDP_ATTRIBUTE_DESCRIPTION
,
.
Attribute
Data
=
&
SDP_Attribute_Description
},
{.
Attribute
ID
=
SDP_ATTRIBUTE_AVAILABILITY
,
.
Attribute
Data
=
&
SDP_Attribute_Availability
},
{.
ID
=
SDP_ATTRIBUTE_NAME
,
.
Data
=
&
SDP_Attribute_Name
},
{.
ID
=
SDP_ATTRIBUTE_DESCRIPTION
,
.
Data
=
&
SDP_Attribute_Description
},
{.
ID
=
SDP_ATTRIBUTE_AVAILABILITY
,
.
Data
=
&
SDP_Attribute_Availability
},
SERVICE_ATTRIBUTE_TABLE_TERMINATOR
};
SERVICE_ATTRIBUTE_TEXT
(
RFCOMM_Attribute_Name
,
"RFCOMM"
);
SERVICE_ATTRIBUTE_TEXT
(
RFCOMM_Attribute_Description
,
"Virtual Serial"
);
SERVICE_ATTRIBUTE_
8BIT_
LEN
(
RFCOMM_Attribute_Availability
,
SDP_DATATYPE_UNSIGNED_INT
,
1
,
{
0xFF
});
SERVICE_ATTRIBUTE_TEXT
(
RFCOMM_Attribute_Name
,
"RFCOMM"
);
SERVICE_ATTRIBUTE_TEXT
(
RFCOMM_Attribute_Description
,
"Virtual Serial"
);
SERVICE_ATTRIBUTE_LEN
8
(
RFCOMM_Attribute_Availability
,
SDP_DATATYPE_UNSIGNED_INT
,
1
,
{
0xFF
});
const
ServiceAttributeTable_t
RFCOMM_Attribute_Table
[]
PROGMEM
=
{
{.
Attribute
ID
=
SDP_ATTRIBUTE_NAME
,
.
Attribute
Data
=
&
RFCOMM_Attribute_Name
},
{.
Attribute
ID
=
SDP_ATTRIBUTE_DESCRIPTION
,
.
Attribute
Data
=
&
RFCOMM_Attribute_Description
},
{.
Attribute
ID
=
SDP_ATTRIBUTE_AVAILABILITY
,
.
Attribute
Data
=
&
RFCOMM_Attribute_Availability
},
{.
ID
=
SDP_ATTRIBUTE_NAME
,
.
Data
=
&
RFCOMM_Attribute_Name
},
{.
ID
=
SDP_ATTRIBUTE_DESCRIPTION
,
.
Data
=
&
RFCOMM_Attribute_Description
},
{.
ID
=
SDP_ATTRIBUTE_AVAILABILITY
,
.
Data
=
&
RFCOMM_Attribute_Availability
},
SERVICE_ATTRIBUTE_TABLE_TERMINATOR
};
...
...
@@ -106,8 +106,6 @@ static void ServiceDiscovery_ProcessServiceSearchAttribute(SDP_PDUHeader_t* SDPH
const
void
*
CurrentParameter
=
((
void
*
)
SDPHeader
+
sizeof
(
SDP_PDUHeader_t
));
BT_SDP_DEBUG
(
1
,
"<< Service Search Attribute"
);
uint8_t
ElementHeaderSize
;
uint8_t
UUIDList
[
12
][
16
];
uint8_t
TotalUUIDs
=
ServiceDiscovery_GetUUIDList
(
UUIDList
,
&
CurrentParameter
);
...
...
@@ -116,32 +114,75 @@ static void ServiceDiscovery_ProcessServiceSearchAttribute(SDP_PDUHeader_t* SDPH
uint16_t
MaxAttributeSize
=
ServiceDiscovery_Read16BitParameter
(
&
CurrentParameter
);
BT_SDP_DEBUG
(
2
,
"-- Max Return Attribute Bytes: 0x%04X"
,
MaxAttributeSize
);
uint16_t
AttributeIDListLength
=
ServiceDiscovery_GetDataElementSize
(
&
CurrentParameter
,
&
ElementHeaderSize
);
struct
{
SDP_PDUHeader_t
SDPHeader
;
uint8_t
ResponseData
[
100
];
}
ResponsePacket
;
ResponsePacket
.
SDPHeader
.
PDU
=
SDP_PDU_SERVICESEARCHATTRIBUTERESPONSE
;
ResponsePacket
.
SDPHeader
.
TransactionID
=
SDPHeader
->
TransactionID
;
if
(
MaxAttributeSize
>
sizeof
(
ResponsePacket
.
ResponseData
))
MaxAttributeSize
=
sizeof
(
ResponsePacket
.
ResponseData
);
ResponsePacket
.
SDPHeader
.
ParameterLength
=
ServiceDiscovery_ProcessAttributes
(
UUIDList
,
TotalUUIDs
,
ResponsePacket
.
ResponseData
,
MaxAttributeSize
,
&
CurrentParameter
);
Bluetooth_SendPacket
(
&
ResponsePacket
,
(
sizeof
(
ResponsePacket
.
SDPHeader
)
+
ResponsePacket
.
SDPHeader
.
ParameterLength
),
Channel
);
}
static
uint8_t
ServiceDiscovery_ProcessAttributes
(
uint8_t
UUIDList
[
12
][
16
],
const
uint8_t
TotalUUIDs
,
uint8_t
*
ResponseBuffer
,
uint8_t
MaxResponseSize
,
const
void
**
CurrentParameter
)
{
uint8_t
ElementHeaderSize
;
uint8_t
TotalResponseSize
=
0
;
uint16_t
AttributeIDListLength
=
ServiceDiscovery_GetDataElementSize
(
CurrentParameter
,
&
ElementHeaderSize
);
BT_SDP_DEBUG
(
2
,
"-- Total Attribute Length: 0x%04X"
,
AttributeIDListLength
);
while
(
AttributeIDListLength
)
{
uint8_t
AttributeLength
=
ServiceDiscovery_GetDataElementSize
(
&
CurrentParameter
,
&
ElementHeaderSize
);
uint8_t
AttributeLength
=
ServiceDiscovery_GetDataElementSize
(
CurrentParameter
,
&
ElementHeaderSize
);
uint32_t
Attribute
=
0
;
memcpy
(
&
Attribute
,
CurrentParameter
,
AttributeLength
);
BT_SDP_DEBUG
(
2
,
"-- Attribute(%d): 0x%08lX"
,
AttributeLength
,
Attribute
);
uint8_t
TotalBytesAdded
=
ServiceDiscovery_GetAttribute
(
UUIDList
,
TotalUUIDs
,
Attribute
,
&
ResponseBuffer
,
MaxResponseSize
);
TotalResponseSize
+=
TotalBytesAdded
;
MaxResponseSize
-=
TotalBytesAdded
;
AttributeIDListLength
-=
(
AttributeLength
+
ElementHeaderSize
);
CurrentParameter
+=
AttributeLength
;
}
struct
return
TotalResponseSize
;
}
static
uint8_t
ServiceDiscovery_GetAttribute
(
uint8_t
UUIDList
[
12
][
16
],
const
uint8_t
TotalUUIDs
,
const
uint32_t
Attribute
,
uint8_t
**
DataBuffer
,
uint8_t
BufferLen
)
{
for
(
uint8_t
CurrTableItem
=
0
;
CurrTableItem
<
(
sizeof
(
SDP_Services_Table
)
/
sizeof
(
ServiceTable_t
));
CurrTableItem
++
)
{
SDP_PDUHeader_t
SDPHeader
;
uint8_t
ResponseData
[
100
];
}
ResponsePacket
;
ResponsePacket
.
SDPHeader
.
PDU
=
SDP_PDU_SERVICESEARCHATTRIBUTERESPONSE
;
ResponsePacket
.
SDPHeader
.
TransactionID
=
SDPHeader
->
TransactionID
;
Bluetooth_SendPacket
(
&
ResponsePacket
,
(
sizeof
(
ResponsePacket
.
SDPHeader
)
+
ResponsePacket
.
SDPHeader
.
ParameterLength
),
Channel
);
for
(
uint8_t
CurrUUIDIndex
=
0
;
CurrUUIDIndex
<
TotalUUIDs
;
CurrUUIDIndex
++
)
{
if
(
!
(
memcmp
(
SDP_Services_Table
[
CurrTableItem
].
UUID
,
UUIDList
[
CurrUUIDIndex
],
sizeof
(
BaseUUID
))))
{
const
ServiceAttributeTable_t
*
AttributeTable
=
SDP_Services_Table
[
CurrTableItem
].
AttributeTable
;
// Process attribute table
BT_SDP_DEBUG
(
2
,
"FOUND UUID IN TABLE"
);
break
;
}
}
}
return
0
;
}
static
uint8_t
ServiceDiscovery_GetUUIDList
(
uint8_t
UUIDList
[
12
][
16
],
const
void
**
CurrentParameter
)
...
...
@@ -154,15 +195,10 @@ static uint8_t ServiceDiscovery_GetUUIDList(uint8_t UUIDList[12][16], const void
while
(
ServicePatternLength
)
{
uint8_t
*
CurrentUUID
=
UUIDList
[
TotalUUIDs
++
];
uint8_t
UUIDLength
=
ServiceDiscovery_GetDataElementSize
(
CurrentParameter
,
&
ElementHeaderSize
);
uint8_t
UUIDLength
=
ServiceDiscovery_GetDataElementSize
(
CurrentParameter
,
&
ElementHeaderSize
);
memcpy
(
CurrentUUID
,
BaseUUID
,
sizeof
(
BaseUUID
));
if
(
UUIDLength
<=
32
)
memcpy
(
&
CurrentUUID
[
sizeof
(
BaseUUID
)
-
sizeof
(
uint32_t
)],
*
CurrentParameter
,
UUIDLength
);
else
memcpy
(
CurrentUUID
,
*
CurrentParameter
,
UUIDLength
);
memcpy
(
&
CurrentUUID
[(
UUIDLength
<=
32
)
?
(
sizeof
(
BaseUUID
)
-
32
)
:
0
],
*
CurrentParameter
,
UUIDLength
);
BT_SDP_DEBUG
(
2
,
"-- UUID (%d): 0x%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X"
,
UUIDLength
,
...
...
@@ -180,11 +216,13 @@ static uint8_t ServiceDiscovery_GetUUIDList(uint8_t UUIDList[12][16], const void
static
uint32_t
ServiceDiscovery_GetDataElementSize
(
const
void
**
DataElementHeader
,
uint8_t
*
ElementHeaderSize
)
{
/* Fetch the size of the Data Element structure from the header, increment the current buffer pos */
uint8_t
SizeIndex
=
(
*
((
uint8_t
*
)
*
DataElementHeader
)
&
0x07
);
*
DataElementHeader
+=
sizeof
(
uint8_t
);
uint32_t
ElementValue
;
/* Convert the Data Element size index into a size in bytes */
switch
(
SizeIndex
)
{
case
5
:
...
...
Demos/Host/Incomplete/BluetoothHost/Lib/ServiceDiscoveryProtocol.h
View file @
f13bc35a
...
...
@@ -71,12 +71,12 @@
#define BASE_96BIT_UUID 0xFB, 0x34, 0x9B, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x00, 0x10, 0x00, 0x00
#define SERVICE_ATTRIBUTE_TEXT(name, string) SERVICE_ATTRIBUTE_
8BIT_
LEN(name, SDP_DATATYPE_TEXT, sizeof(string), string)
#define SERVICE_ATTRIBUTE_
8BIT_
LEN(name, type, size, ...) const ServiceAttributeData8Bit_t name PROGMEM = \
#define SERVICE_ATTRIBUTE_TEXT(name, string) SERVICE_ATTRIBUTE_LEN
8
(name, SDP_DATATYPE_TEXT, sizeof(string), string)
#define SERVICE_ATTRIBUTE_LEN
8
(name, type, size, ...) const ServiceAttributeData8Bit_t name PROGMEM = \
{.Header = (type | 5), .Size = size, .Data = __VA_ARGS__}
#define SERVICE_ATTRIBUTE_
16BIT_
LEN(name, type, size, ...) const ServiceAttributeData16Bit_t name PROGMEM = \
#define SERVICE_ATTRIBUTE_LEN
16
(name, type, size, ...) const ServiceAttributeData16Bit_t name PROGMEM = \
{.Header = (type | 5), .Size = size, .Data = __VA_ARGS__}
#define SERVICE_ATTRIBUTE_
32BIT_
LEN(name, type, size, ...) const ServiceAttributeData32Bit_t name PROGMEM = \
#define SERVICE_ATTRIBUTE_LEN
32
(name, type, size, ...) const ServiceAttributeData32Bit_t name PROGMEM = \
{.Header = (type | 5), .Size = size, .Data = __VA_ARGS__}
#define SERVICE_ATTRIBUTE_TABLE_TERMINATOR {.AttributeData = NULL}
...
...
@@ -90,8 +90,8 @@
typedef
struct
{
uint16_t
Attribute
ID
;
const
void
*
Attribute
Data
;
uint16_t
ID
;
const
void
*
Data
;
}
ServiceAttributeTable_t
;
typedef
struct
...
...
@@ -142,7 +142,12 @@
return
ParamValue
;
}
static
uint8_t
ServiceDiscovery_GetUUIDList
(
uint8_t
UUIDList
[
12
][
16
],
const
void
**
CurrentParameter
);
static
uint8_t
ServiceDiscovery_ProcessAttributes
(
uint8_t
UUIDList
[
12
][
16
],
const
uint8_t
TotalUUIDs
,
uint8_t
*
ResponseBuffer
,
uint8_t
MaxResponseSize
,
const
void
**
CurrentParameter
);
static
uint8_t
ServiceDiscovery_GetAttribute
(
uint8_t
UUIDList
[
12
][
16
],
const
uint8_t
TotalUUIDs
,
const
uint32_t
Attribute
,
uint8_t
**
DataBuffer
,
uint8_t
BufferLen
);
static
uint8_t
ServiceDiscovery_GetUUIDList
(
uint8_t
UUIDList
[
12
][
16
],
const
void
**
CurrentParameter
);
static
uint32_t
ServiceDiscovery_GetDataElementSize
(
const
void
**
AttributeHeader
,
uint8_t
*
ElementHeaderSize
);
#endif
...
...
Demos/Host/Incomplete/BluetoothHost/makefile
View file @
f13bc35a
...
...
@@ -60,7 +60,7 @@
# MCU name
MCU
=
at90usb
64
7
MCU
=
at90usb
128
7
# Target board (see library "Board Types" documentation, NONE for projects not requiring
...
...
@@ -87,7 +87,7 @@ BOARD = USBKEY
# F_CPU = 16000000
# F_CPU = 18432000
# F_CPU = 20000000
F_CPU
=
8
000000
F_CPU
=
16
000000
# Input clock frequency.
...
...
LUFA/ManPages/FutureChanges.txt
View file @
f13bc35a
...
...
@@ -17,6 +17,7 @@
* -# Add ability to get number of bytes not written with pipe/endpoint write routines after an error
* -# Add standardized descriptor names to class driver structures
* -# Correct mishandling of error cases in Mass Storage demos
* -# Fix AVRISP-MKII clone project's XMEGA EEPROM section erase command
* - Documentation/Support
* -# Remake AVRStudio project files
* -# Add detailed overviews of how each demo works
...
...
Projects/AVRISP-MKII/AVRISP.txt
View file @
f13bc35a
...
...
@@ -57,6 +57,7 @@
* - Minimum ISP target clock speed of 500KHz due to hardware SPI module prescaler limitations
* - No reversed/shorted target connector detection and notification
* - A seperate header is required for each of the ISP, PDI and TPI programming protocols that the user wishes to use
* - XMEGA EEPROM erase section command does not work (but EEPROM read/write and chip erase does)
*
* On AVR models with an ADC converter, AVCC should be tied to 5V (e.g. VBUS) and the VTARGET_ADC_CHANNEL token should be
* set to an appropriate ADC channel number in the project makefile for VTARGET detection to operate correctly. On models
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment