1:平台 imx6
2:蓝牙模块为AP6255
原理图部分:
配置UART4
static iomux_v3_cfg_t mx6sl_uart4_pads[] = {
MX6SL_PAD_KEY_COL6__UART4_RXD,
MX6SL_PAD_KEY_COL7__UART4_RTS,
MX6SL_PAD_KEY_ROW6__UART4_TXD,
MX6SL_PAD_KEY_ROW7__UART4_CTS,
};
然后make menuconfig
CONFIG_BT=y
CONFIG_BT_RFCOMM=y
CONFIG_BT_RFCOMM_TTY=y
CONFIG_BT_BNEP=y
CONFIG_BT_BNEP_MC_FILTER=y
CONFIG_BT_BNEP_PROTO_FILTER=y
CONFIG_BT_HIDP=y
CONFIG_BT_HCIBTUSB=y
CONFIG_BT_HCIUART=y
CONFIG_BT_HCIUART_H4=y
配置
#define MX6_BRD_FEC_BT_REG_ON IMX_GPIO_NR(3, 25)
根据蓝牙模块的上电时序,上电
3:主要修改hal层:
hardware\broadcom\libbt\conf\AP6255:
bd_addr.txt 11:22:33:44:55:66
bt_vendor.conf:
# UART device port where Bluetooth controller is attached
UartPort = /dev/ttymxc3
# Firmware patch file location
FwPatchFilePath = /system/etc/firmware/
#
# #Firmware name
FwPatchFileName = BCM4345C0.hcd
#
使用第4个串口,为/dev/ttymxc3, 固件位置FwPatchFilePath = /system/etc/firmware/
固件名字:FwPatchFileName = BCM4345C0.hcd
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := bt_vendor.conf
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/bluetooth
LOCAL_MODULE_TAGS := eng
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)
配置:BoardConfig.mk
BOARD_HAVE_BLUETOOTH:True
BOARD_HAVE_BLUETOOTH_BCM:True
修改:hardware/broadcom/libbt/include/bt_vendor_brcm.h
UART_TARGET_BAUD_RATE 3000000
LPM_SLEEP_MODE 0
4:rfkill 主要控制蓝牙的上电与下电
static struct platform_device mxc_bt_rfkill = {
.name = "mxc_bt_rfkill",
};
static struct imx_bt_rfkill_platform_data mxc_bt_rfkill_data = {
.power_change = mx6sl_evk_bt_power_change,
};
mxc_register_device(&mxc_bt_rfkill, &mxc_bt_rfkill_data);
static struct platform_driver mxc_bt_rfkill_driver = {
.driver = {
.name = "mxc_bt_rfkill",
},
.probe = mxc_bt_rfkill_probe,
.remove = __devexit_p(mxc_bt_rfkill_remove),
};
static int mxc_bt_set_block(void *rfkdata, bool blocked)
{
struct imx_bt_rfkill_platform_data *data = rfkdata;
int ret;
/* Bluetooth stack will reset the bluetooth chip during
* resume, since we keep bluetooth's power during suspend,
* don't let rfkill to actually reset the chip. */
if (system_in_suspend)
return 0;
pr_info("rfkill: BT RF going to : %s\n", blocked ? "off" : "on");
if (!blocked)
ret = data->power_change(1);
else
ret = data->power_change(0);
return ret;
}
static const struct rfkill_ops mxc_bt_rfkill_ops = {
.set_block = mxc_bt_set_block,
};
通过power_change,打开关闭蓝牙
int mx6sl_evk_bt_power_change(int status)
{
if (status)
mx6sl_evk_bt_reset();
else
mx6sl_evk_bt_off();
return 0;
}
操作gpio实现,上电与下电。