本帖最后由 linzhao789 于 2020-6-11 10:43 编辑
目录 目录........................................................................................................................................... 1 1.1 概述.................................................................................................................................. 1 1.2 硬件相关部分 .................................................................................................................. 2 1.3 Kernel ............................................................................................................................... 4 1.3.1 概述......................................................................................................................... 4 1.3.2 代码修改 ................................................................................................................. 5 1.4 用户态空间 ...................................................................................................................... 8 1.5 HAL 层移植 ...................................................................................................................... 9 1.5.1 Bluedroid ............................................................................................................. 10 1.5.2 init.connectivity.rc 文件 ..................................................................................... 12 1.5 总结 ................................................................................................................................. 12 1.1 概述 近期需要把 Bluetooth 移植到 iTOP-4412 开发平台,查阅了相关资料,经过一段时间 的研究、调试,终于成功的将蓝牙功能移植到了开发板上面,这里笔者记录移植过程及注意 事项,方便以后工作需要。 iTOP-4412 开发板的 Bletooth 模块与板卡之间的连接采用 UART 接口,Bletooth 硬件模块 使用的是MTK的MT6620芯片,MTK提供了Android4.0及Android4.4的driver, Porting Guid, 有了这些就为我们的移植工作做了总体性的指导。 但是仅仅有 MTK 提供的文档还是远远不够的,毕竟硬件接口定义不同,kernel 版本也 不同,Android层与MTK提供的代码也有差异,这就需要我们在MTK文档的指导下, Step byStep 进行 Porting 工作.
移植环境: 1 iTOP-4412 精英版 + MT6620 Bletooth 模块 2 kernel 3.0.15 version 3 Android4.4. 4 Ubuntu12.04 64BIt 开发环境
1.2 硬件相关部分 由于 MT6620 芯片集成了 Bluetooth,WiFi, FM,GPS 功能,所以 Bluetooth 的原理图可查看 MT6620 WiFi 原理图部分,下图为 Bletooth 模块与开发板连接的引脚定义,通过该接口可以 知道 Bluetooth 模块与 CPU 的交互接口.
1.2 硬件相关部分 由于 MT6620 芯片集成了 Bluetooth,WiFi, FM,GPS 功能,所以 Bluetooth 的原理图可查看 MT6620 WiFi 原理图部分,下图为 Bletooth 模块与开发板连接的引脚定义,通过该接口可以 知道 Bluetooth 模块与 CPU 的交互接口.
▆ UART 串口: Bluetooth 与 CPU 之间的通信接口,命令和数据的传输都是经过串** 换的。另外 MT6620 固件补丁的下载也是通过串口进行的,所以说串口是必不可少的硬件接 口。上图中 Pin8,Pin10 为串口部分,与 CPU 的串口 0 连接. ▆ MT6620 芯片使能引脚: Pin16 PMU_EN , 使能引脚,默认低电平状态,高电平有效, 启用蓝牙功能之前需要先使能该引脚,这样 MT6620 才开始工作。 ▆ 中断引脚:Pin 14 BGF_INT , Blutooh, GPS,FM 共用的中断引脚,用于告知 CPU 有数 据来了,或者说有请求到了. ▆ 复位引脚: Pin15 WiFi_RESET ,该引脚与 MT6620 的 SYSRST_B 连接,用于芯片的复位 操作. ▆ 芯片工作电压:Pin12 提供 1.8V 的电压输入,Pin19 提供 3.3V,Pin20 提供 5V 电压输入. 下图为 MT6620 模块原理图部分: MT6620 的 引 脚 定 义 如 下 : 以上是进行 Porting 前的准备工作,当然需要万用表,示波器工具进行辅助的检测,查看 Bluetooth 模块的工作电压是否正常,GPIO 的当前状态,串口的数据波形. 另外需要强调的是,MT6620 Bluetootch 支持蓝牙 4.0 规范,蓝牙 4.0 规范包括常规蓝牙, 高速蓝牙,还有很重要的低功耗蓝牙,即 BLE 的支持,下面是 MT6620 蓝牙特性: ▆ 支 持 Bluetooth V2.1 +EDR ▆ 支 持 Bluetooth 3.0+HS compliance ▆ 支 持 Bluetooth V4.0 Low Energy (LE) ▆ 使用 UART / PCM 接口 ▆ 模組包含 PA with 13 dBm (class 1) transmit power ▆ Better WiFi/BT coexistence performance ▆ Low power scan function to reduce the power consumption in scan modes 关于 MT6620 的更多硬件特性,请参考 MTK 官方发布的 MT6620 硬件使用指导相关文档. 1.3 Kernel 1.3.1 概述 iTOP4412 开发板采用的内核是 Linux 3.0.15 版本,MTK 官方给的移植 Porting 没有说明 针对具体的 kernel 版本,由于是 Android4.4,所以 kernel 应该是 3.0 以后的版本或者更高支 持; 首先按照 PoringGuid 的指导说明,把 New 和 Modify 文件夹下面关于 kernel 部分的修改 放到我们的 kernel 代码里面, 把 MT6620 的驱动放在 driver/misc/目录下面,文件夹名称 mediatek,里面存放的是 WMT,既 wireless manage tools, 里面提供了与 MT6620 download firmware patch ,enable /disable MT6620 芯片,power on, power off 操作的相关驱动部分, 及 SDIO 总线设备接口驱动 Host Interface drivers. 蓝牙驱动 mtk_stp_bt.ko 的源码也在这个目录 下面,我们以驱动库 .ko 的形式编译驱动模块. driver/misc/mediatek/ 库文件列表如下:: mtk_hif_sdio.ko ----mmc 总线相关接口,mmc 总线发现 SDIO 设备,分配总线地址后,会与该 驱动进行适配.适配成功后该驱动会调用 WiFi 网络驱动,另外 Bluetooth 也使用了该驱动库文 件提供的相应接口; mtk_stp_uart.ko-----串口相关驱动,通过串口下载固件补丁,设置芯片参数; mtk_stp_wmt.ko-----core 部分,提供 Bluetooth 上电,断电,PSM 省电管理操作等 mtk_stp_bt.ko ----字符设备驱动,创建 Bluetooth 设备节点用于与用户空间交互; 另外这里附一张 Blutooth Kernel 层驱动层次图: 上图红色部分 BlueZ, Hci_stp.ko 为 Android4.0 Bluetooth 使用的蓝牙协议栈与 Kernel 库文 件。蓝色部分 Bluedroid, mtk_stp.bt.ko 为 Android4.4 版本使用的蓝牙协议栈与 kernel 库文 件。Android4.0 与 Android4.4 关于 Bluetooth 部分变化比较大,请大家移植过程中注意这一 点,他们之间的具体差异这里不再讲解。 从上图可以看到 bluetooth 驱动调用关系: mtk_stp_bt.ko -> mtk_stp_wmt.ko -> mtk_stp_uart.ko -> uart driver 最后最底层的串口驱动负责蓝牙命令,数据的发送与接收. 1.3.2 代码修改 1 根据硬件连接情况配置必要的平台资源 修改文件: kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c 关键函数: 该函数配置 MT6620 相关的 GPIO 引脚为初始化输出状态,或者配置为中断状态, Bluetooth 驱动会改变这些引脚的状态,这里仅仅是初始化. static void __init mtk_combo_init(void) { //MT66XX PMUEN if(gpio_request(EXYNOS4_GPC1(0), "GPC1_0")) { printk(KERN_ERR "failed to request GPC1_0 for MT6620 PMUEN control\n"); } //MT66XX SYSRST if(gpio_request(EXYNOS4_GPC1(1), "GPC1_1")) { printk(KERN_ERR "failed to request GPC1_1 for MT6620 SYSRST control\n"); } s3c_gpio_cfgpin(EXYNOS4_GPC1(0), S3C_GPIO_OUTPUT); s3c_gpio_cfgpin(EXYNOS4_GPC1(1), S3C_GPIO_OUTPUT); gpio_direction_output(EXYNOS4_GPC1(0), 0); gpio_direction_output(EXYNOS4_GPC1(1), 0); gpio_free(EXYNOS4_GPC1(0)); gpio_free(EXYNOS4_GPC1(1)); mdelay(5); //need config eint models for Wifi & BGA Interupt if (gpio_request(EXYNOS4_GPX2(5), "WiFi INT")) printk(KERN_WARNING "MT6620 WiFi INT(GPX2.5) Port request error!!!\n"); else { s3c_gpio_setpull(EXYNOS4_GPX2(5), S3C_GPIO_PULL_NONE); s3c_gpio_cfgpin(EXYNOS4_GPX2(5), S3C_GPIO_SFN(0xF)); gpio_free(EXYNOS4_GPX2(5)); } if (gpio_request(EXYNOS4_GPX2(4), "BGF INT")) printk(KERN_WARNING "MT6620 BGA INT(GPX2.4) Port request error!!!\n"); else { s3c_gpio_setpull(EXYNOS4_GPX2(4), S3C_GPIO_PULL_NONE); s3c_gpio_cfgpin(EXYNOS4_GPX2(4), S3C_GPIO_SFN(0xF)); gpio_free(EXYNOS4_GPX2(4)); } //normal it is high level if (gpio_request(EXYNOS4_GPX3(2), "6260_GPIO2")!=0) { printk("[mt6620] ERROR:Cannot request 6260_GPIO2\n"); } else { gpio_direction_output(EXYNOS4_GPX3(2), 1);/* WLAN_CHIP_PWD */ gpio_set_value(EXYNOS4_GPX3(2), 1); mdelay(100); gpio_free(EXYNOS4_GPX3(2)); } return; } 关键结构体: 该结构体告诉 MT6620 驱动相关部分使用了平台的哪些 GPIO 资源. 结构体所属文件: kernel/iTop4412_Kernel_3.0/arch/arm/mach-exynos/mach-itop4412.c static struct mtk_wmt_platform_data mtk_wmt_pdata = { .pmu =EXYNOS4_GPC1(0), //RK30SDK_WIFI_GPIO_POWER_N,//RK30_PIN0_PB5, //MUST set to pin num in target system .rst = EXYNOS4_GPC1(1),//RK30SDK_WIFI_GPIO_RESET_N,//RK30_PIN3_PD0, //MUST set to pin num in target system .bgf_int=EXYNOS4_GPX2(4), //IRQ_EINT(20),//RK30SDK_WIFI_GPIO_BGF_INT_B,//RK30_PIN0_PA5,//MUST set to pin num in target system if use UART interface. .urt_cts = -EINVAL, // set it to the correct GPIO num if use common SDIO, otherwise set it to -EINVAL. .rtc = -EINVAL, //Optipnal. refer to HW design. .gps_sync = -EINVAL, //Optional. refer to HW design. .gps_lna = -EINVAL, //Optional. refer to HW design. }; static struct mtk_sdio_eint_platform_data mtk_sdio_eint_pdata = { .sdio_eint = EXYNOS4_GPX2(5),//IRQ_EINT(21) ,//RK30SDK_WIFI_GPIO_WIFI_INT_B,//53, //MUST set pin num in target system. }; static struct platform_device mtk_wmt_dev = { .name = "mtk_wmt", .id = 1, .dev = { .platform_data = &mtk_wmt_pdata, }, }; static struct platform_device mtk_sdio_eint_dev = { .name = "mtk_sdio_eint", .id = 1, .dev = { .platform_data = &mtk_sdio_eint_pdata, }, }; MTK 官方移植文档中会告诉我们需要在原始内核代码里面增加哪些文件,如何在 make menuconfig 中配置相关部分,这里就不再详细描述. 注意:蓝牙驱动虽然没有使用到 mmc 总线,但是 mtp_hif_sdio.ko 驱动导出了接口函数, mtk_stp_wmt.ko 核心驱动库 会调用导出函数以 ,所以 mtp_hif_sdio.ko 需要加载到内核空间, 有 如果您的产品中不含有 WiFi , 仅仅需要 Bluetooth 功能,那么完全可以不用配置 MMC 总 线部分,不影响蓝牙的使用 ,但是务必加载 mtp_hif_sdio.ko 文件。 另外 MT6620 具备功耗控制功能,默认情况下如果 MT6620 处于 idle 空闲状态,空闲时 间大于 60 秒后,会自动进入 sleep 状态,有中断触发时会唤醒,继续工作,您可以使用 "echo 0 0 > /proc/driver/wmt_dbg "命令关闭功耗控制,这样MT6620会始终不会进入sleep状态。 另外也可以修改 MT6620 mtk_stp_wmt.ko 驱动中的参数,更改 ide to sleep 的时间. MTK 官方提供的驱动代码中芯片默认 idle 5 秒后会进入 sleep 状态,使用蓝牙接 收文件时,如果用户响应时间超过了 5 秒(用户没有单击接收或者拒绝按钮),MT6620 会 休眠,驱动会导致 MT6620 会进入 RESET 状态,从而 Bluetooth 服务会出现问题,Bluetooth 功能不可使用,为了避免这样的问题发生,我们把休眠时间由默认的 5 秒调整到了 60 秒, 给用户足够多的响应时间,用户在 60 秒内 接收或者拒绝蓝牙手机发给板卡的文件,另外文 件接收完成后,需要单击状态栏中的文件接收完成提示,尽量在 Android4.4 状态栏中不含 有关于蓝牙消息的提醒。 u 1.4 用户态空间 下面我们描述一下采用 Linux 系统和 Android 系统的用户都需要注意的地方: 驱动层移植完成后, MTK 的 Porting Guid 会告诉你需要在用户态运行 wmt_launcher 工 具,作为后台的一个服务程序运行,该服务会配置串口的工作参数,下载固件补丁到 MT6620 中,他的源代码相对比较简单,只有一个.c 文件: 原始文件位于 MTK 发布包: APEX_Android_4.4_MP_SW_package_V2.0/APEX_Android_4.4_MP_001_panda_combo_mt66xx _Package_Common/New/hardware/mediatek/wmt/stp_uart_launcher.c 修改后的文件位于 iTOP-4412 Android4.4 发布包: iTop4412_KK4.4/hardware/mediatek/wmt/stp_uart_launcher.c 修改点主要在串口参数配置上,由于内核版本不同,串口设置参数也略有不同. 具体修改可以使用代码比对工具进行比较。 另外需要说明的是运行 wmt_launcher 的运行参数 跟 MTK 给的移植文档有点不同, Porting Guid 里面推荐串口波特率使用 921600, 而在 iTOP-4412 的板子上面采用该值会工作不 正常,导致固件补丁无法下载,开始怀疑板卡不支持该波特率,后使用串口测试工具专门针对这 个串口进行 921600 测试,也没发现问题,后没有继续查找,而是运行 wmt_launcher 时采用 115200 波特率: wmt_launcher -b 115200 -d /dev/ttySAC0 -p /system/etc/firmware & 注意: 如果您的操作系统使用的是 Linux 而不是 Android,需要修改 stp_uart_launcher.c 原始代码里面有 Android 特有的属性相关部分,Linux 系统不具有这个特性,我们提供了修改好 的 文 件 : stp_uart_launcher-linux-ok.c , 用 户 可 以 作 为 参 考 , 该 文 件 与 原 始 文 件 stp_uart_launcher-ori.c,及正常工作的文件 stp_uart_launcher.c 位于相同目录下面. 无论是 Linux 系统还是 Android 系统,挂载根文件系统以后需要运行 wmt_launcher 服务,该 服务在后台运行,打开 /dev/ttySAC0 串口,监控着串口上报的事件,对事件进行响应,比如内 核上报 "下载固件补丁" 事件,那么 wmt_launcher 会打开 /system/etc/firmware 下面的固件补 丁,然后下载到 MT6620 模块中,该服务不可以被用户终止运行. 连接-iTOP-4412开发板-Android4.4-Bluetooth移植文档(二)
|