meta-digi/meta-digi-dey/recipes-connectivity/bluez/bluez5-init/ccimx93/bluetooth-init

82 lines
2.0 KiB
Bash

#!/bin/sh
#===============================================================================
#
# Copyright (C) 2023 by Digi International Inc.
# All rights reserved.
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 as published by
# the Free Software Foundation.
#
#
# !Description: Initialize bluetooth hardware
#
#===============================================================================
HCI_IFACE="hci0"
log() {
printf "<3>iw612-bluetooth: %s\n" "${1}" >/dev/kmsg
}
set_btaddr() {
bt_addr=$(echo $(fw_printenv -n btaddr) | awk -F ":" '{ for(i=NF;i>=1;i--) printf "0x%s ", $i }')
hcitool -i ${HCI_IFACE} cmd 0x3f 0x0022 0xfe 0x06 ${bt_addr}
}
bluetooth_start() {
if ! [ -e "/proc/device-tree/bluetooth/mac-address" ]; then
log "[ERROR] Bluetooth mac-address not found"
return
fi
# If there is a hciattach process running, just do nothing
pidof hciattach > /dev/null && log "Bluetooth already activated" && return
# If port speed is 3M, assume that FW has been modified to run at that speed
if [ "$(stty -F /dev/ttyBt speed)" != "3000000" ]; then
hciattach -t5 /dev/ttyBt any 115200 flow nosleep && \
hciconfig ${HCI_IFACE} up && \
sleep 0.2 && \
set_btaddr && \
# Change rate to 3M using a custom vendor command
hcitool -i ${HCI_IFACE} cmd 0x3f 0x0009 0xc0 0xc6 0x2d 0x00 && \
sleep 0.2 && \
killall hciattach && \
sleep 0.2
fi
hciattach -t5 /dev/ttyBt any -s 3000000 3000000 flow && \
log "Bluetooth activated" && return
log "[ERROR] Cannot initialize Bluetooth"
return 1
}
bluetooth_stop() {
if [ -e "/sys/class/bluetooth/${HCI_IFACE}" ]; then
killall hciattach > /dev/null
sleep 1
# send a raw hci reset to set the chip in a good state
echo -e -n \\x01\\x03\\x0c\\x00 > /dev/ttyBt
fi
}
case "$1" in
start)
bluetooth_start
;;
stop)
bluetooth_stop
;;
restart)
$0 stop
sleep 1
$0 start
;;
*)
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac