The Bluetooth services on the QNX CAR platform depend on several system services that must be
started in a certain sequence as outlined below.
Starting the required services
Note:
The following commands assume a Texas Instruments OMAP5432 EVM board.
- Make sure the following general system services are running. Note that Bluetooth as
well as many applications throughout the system rely on these services:
- pps
- qdb
- io-acoustic (for HFP)
- mm-player (for AVRCP)
For more information on starting these services and their dependencies, see the
/etc/slm-config-all.xml file on your target.
Note:
To find out if a particular process is already running on your target, you can use the
pidin utility (which displays information for all process IDs) and
pipe the output through
grep, specifying the process you're interested in. For example,
to see if
io-acoustic is running, use this command:
# pidin | grep io-acoustic
- Make sure the devc-seromap_hci driver (for HCI shared transport) is
running. Here's the command line:
devc-seromap_hci -E -f -a -g 0x4805b000,142 -c48000000/16 0x48066000^2,137
- Start the io-bluetooth service. Note that this command specifies the BTS file for the
OMAP5432 board:
io-bluetooth -vvvvv -s /etc/system/config/bluetooth/WL18xx_2.x_SP2.8.bts
- Start the pps-bluetooth service:
pps-bluetooth –vvvv
- Start the following services, if you need them:
bluetooth-map-initiator –vv (for syncing messages)
bluetooth-pbap-initiator –vv (for syncing the phonebook)
ifwatchd -A /scripts/ifarrv.sh -D /scripts/ifdepart.sh pan0 (PAN scripts)
Note:
If the io-bluetooth service isn't starting up, check the system log for multiple
instances of HCC_RESET failure. If you find such errors, you'll need to slay and
then restart the devc-seromap_hci driver. If you don't see those HCC-related
errors, then make sure that the pps-bluetooth service is running, since it's
the service that initializes io-bluetooth.
Command-line options for devc-seromap_hci
CAUTION:
Although many general options are available for the
devc-seromap_hci driver
(because it's one of several drivers that rely on the
io-char library), not all
options make sense in the context of HCI. You
must use the options as shown in
Step 2
above to enable these specific features, but
not their counterparts:
- raw input mode (-E)
- hardware flow control (-f)
- auto-RTS (-a)
For instance, don't use edited mode—this would break HCI packet handling!
Here are the command-line options you can use when starting the devc-seromap_hci
driver:
devc-seromap_hci [options] [port[^shift][,irq][,k]] &
- -a
- Use auto-RTS when hardware flow control is enabled.
- -b number
- Define initial baud rate (default is 115200).
Note:
Always start the driver with the default baud rate (115200). The BT chip
will default to this rate when it comes out of reset, so the UART must be
configured for this rate to issue the initial commands. If you want to
increase the baud rate, the commands should be sent by the BT stack
after
the driver has reported CARRIER. The sequence is as follows:
- The BT stack writes the HCI commands for a change in baud rate to the BT chip via the HCI
driver.
- The stack waits for the acknowledgment.
- The stack then changes the local HCI driver baud rate via the
tcsetattr() call.
This sequence can be included in the
*.bts file
so that the value of the new baud rate won't need to be hard-coded into the
BT stack.
- -c clk[/div]
- Set input clock rate (in hertz) and divisor.
- -C number
- Set size of canonical input buffer (default is 256 bytes).
- -e
- Set options to edited mode.
- -E
- Set options to raw mode (default).
- -f
- Enable hardware flow control (default).
- -F
- Disable hardware flow control.
- -g gpio_base,gpio_pin
- GPIO base and GPIO pin used for Bluetooth Enable. On driver initialization or UART transmit/receive error, the driver will toggle
the GPIO connected to the chip's BT_EN or BT_RST pin and then issue the HCC_RESET command.
- -I number
- Set size of raw input buffer (default is 2048 bytes).
- -l (0|1)
- ("el") Enable loopback mode (1=on, 0=off).
- -n
- Name of Bluetooth Script. If you use the -n option,
the driver will follow up the HCC_RESET
command by uploading the provided file (*.bts). Note that the
-n is optional since the Bluetooth stack sitting above the HCI
UART driver can open the file directly and write the encoded HCI
commands down to the driver via regular write() calls.
The driver will use the CD (Carrier Detect) line status to communicate when the interfaces are
"ready" to be used, i.e., the driver will report CARRIER to the client, then the
HCC_RESET and script load will be successfully completed. If the -n option isn't used to enable script load, then
CARRIER is reported after the HCC_RESET. Note that the carrier signal is reported as
dropped/lost when we reset the chip by toggling the GPIO pin.
- -O number
- Set size of output buffer (default is 2048 bytes).
- -s
- Enable software flow control.
- -S
- Disable software flow control (default).
- -t number
- Set receive FIFO trigger level (default is 16).
- -T number
- Set transmit FIFO trigger level (default is 8).
- -u unit
- Set serial unit number (default is 1).
- -U uid:gid
- Set the user ID and group ID.
- -v
- Be verbose. Use multiple v's to increase verbosity (see sloginfo data).
- port
- Hex I/O address of serial port.
- shift
- The spacing of the device registers as a power of 2 (e.g., 0 means
registers are 1 byte apart, 1 means registers are 2 bytes apart, etc.). The default
shift is 0.
- irq
- Interrupt used by the port. To specify in hex, prefix with 0x.
- k
- Place this after the irq value to indicate that a Maxim RS-232
transceiver is used on this port, which requires sending it a null character to wake it up after
going into Autoshutdown Plus mode.
Note:
By default, the CREAD terminal flag will be disabled for all HCI
interfaces (serbtX, sergpsX, and serfmX). The
Bluetooth stack (or whatever app wants to use these interfaces) must set the CREAD flag to enable receive
functionality (on a per-interface basis). For proper functionality, the client app must clear the
flag when finished with the device/interface. This is because all interfaces share the same UART hardware—we don't want
to get stuck in a flow-controlled state because there's no client reading
from one of the interfaces. Flow control will be asserted when any of the
device buffers reaches the defined high-water mark and won't be cleared
until there's room in all interface buffers to receive more data. In other words, if the
system doesn't care about GPS and there's no client reading from
the sergpsX interface, we don't want the driver to buffer GPS data, which would
eventually fill the buffer and assert the flow-controlled state.
Command-line options for io-bluetooth
Here are the command-line options you can use when starting the io-bluetooth
service:
io-bluetooth [-d path][-f FD][-r file][-s path][-v]
- -d path
-
Set the path to the serial driver (default is /dev/serbt1).
- -f FD
- Specify the file descriptor for the log destination (e.g., 2 for stderr).
- -r file
- Dump raw data to the specified text file. The relevant profile will be added to your filename after an underscore
(i.e., file_profile.txt). For example, if you use -r /mydata,
the result will create /mydata_map.txt and /mydata_pbap.txt.
- -s path
-
Set the path to the BTS file (default is /etc/system/config/bluetooth/WL127x_2.0_SP1.bts).
This file informs the hardware of the low-level parameters of the Bluetooth exchange, including the line numbers to use and the baud rate.
- -v
- Be verbose. Use multiple v's to increase verbosity (see sloginfo data).
Command-line options for pps-bluetooth
Here are the command-line options you can use when starting the pps-bluetooth
service:
pps-bluetooth [-f FD][-n name] [-U euid:egid][-v]
- -f FD
- Specify the file descriptor for the log destination (e.g., 2 for stderr).
- -n name
- Set the local name of the Bluetooth device.
- -U euid:egid
- Specify the effective user ID and group ID of the pps-bluetooth
process.
- -v
- Be verbose. Use multiple v's to increase verbosity (see sloginfo data).
Command line for bluetooth-map-initiator
The bluetooth-map-initiator executable (for syncing messages) takes only one
option:
bluetooth-map-initiator [-v]
- -v
- Be verbose. Use multiple v's to increase verbosity (see sloginfo data).
Command line for bluetooth-pbap-initiator
The bluetooth-pbap-initiator executable (for syncing the phonebook) takes only one
option:
bluetooth-pbap-initiator [-v]
- -v
- Be verbose. Use multiple v's to increase verbosity (see sloginfo data).
Automated startup via SLM
The System Launch and Monitor (SLM) is a utility used for automating the startup sequence of
processes and any interprocess dependencies. SLM itself is started early in the boot sequence (from
startup.sh) to launch complex applications consisting of many processes that
must be started in a specific order. For more information, see the entry for slm in the OS Utilities Reference.
Here are the relevant sections from the /etc/slm-config-platform.xml
configuration file for starting variant-specific processes (in this case for an OMAP5432 board):
HCI shared transport serial driver:
<SLM:component name="hci">
<SLM:command>devc-seromap_hci</SLM:command>
<SLM:args>-E -f -a -g 0x4805b000,142 -c48000000/16 0x48066000^2,137</SLM:args>
<SLM:waitfor wait="pathname">/dev/serbt1</SLM:waitfor>
<SLM:stop stop="signal">SIGTERM</SLM:stop>
</SLM:component>
The io-bluetooth service:
<SLM:component name="bluetooth">
<SLM:command>io-bluetooth</SLM:command>
<SLM:args>-vvvvv -s /etc/system/config/bluetooth/WL18xx_2.x_SP2.8.bts</SLM:args>
<SLM:waitfor wait="pathname">/dev/io-bluetooth/btmgr</SLM:waitfor>
<SLM:stdout>/var/log/io-bluetooth/stdout</SLM:stdout>
<SLM:stderr>/var/log/io-bluetooth/stderr</SLM:stderr>
<SLM:stop stop="signal">SIGTERM</SLM:stop>
<SLM:depend>hci</SLM:depend>
<SLM:depend>ioacoustic</SLM:depend>
<SLM:depend>qdb</SLM:depend>
</SLM:component>
The pps-bluetooth service:
<SLM:component name="pps-bluetooth">
<SLM:command>pps-bluetooth</SLM:command>
<SLM:args>-vvvvv</SLM:args>
<SLM:stop stop="signal">SIGTERM</SLM:stop>
<SLM:depend>bluetooth</SLM:depend>
<SLM:depend>pps</SLM:depend>
</SLM:component>
Phonebook sync automator:
<SLM:component name="pps-pbap-initiator">
<SLM:command>bluetooth-pbap-initiator</SLM:command>
<SLM:args>-vv</SLM:args>
<SLM:stop stop="signal">SIGTERM</SLM:stop>
<SLM:depend>pps</SLM:depend>
</SLM:component>
Messages sync automator:
<SLM:component name="pps-map-initiator">
<SLM:command>bluetooth-map-initiator</SLM:command>
<SLM:args>-vv</SLM:args>
<SLM:stop stop="signal">SIGTERM</SLM:stop>
<SLM:depend>pps</SLM:depend>
<SLM:depend>qdb</SLM:depend>
</SLM:component>
PAN scripts to start and stop dhcp.client to get an IP from the phone:
<SLM:component name="pan-if-monitor">
<SLM:command>ifwatchd</SLM:command>
<SLM:args>-A /scripts/ifarrv.sh -D /scripts/ifdepart.sh pan0</SLM:args>
<SLM:stop stop="signal">SIGTERM</SLM:stop>
</SLM:component>