https://blog.csdn.net/xiaojsj111/article/details/43447437

mtk8127 bt sco 路径

2015年02月03日 19:26:40 阅读数:2770 标签: bluetoothandroid 更多

个人分类: audioandroid linux bluetooth

1 mtk8127做蓝牙耳机时的系统框图

下面是bt sco的音频通道、音频codec、ap、modem等模块的连接框图。

下图是当mtk8127做handfree client时,bt sco的音频数据流走向(红色的中空箭头表示down link的语音数据流,紫色的中空箭头表示up link的语音数据流,)

\

bt sco音频设备在内核空间对应的设备节点为:/dev/ebc.通过misc_register系统函数来注册struct miscdevice设备。

代码路径:

2 数据结构

接收循环buffer对应的数据结构,其中蓝牙mcu子系统往这个循环buffer队列中写,对应的写下标为:iPacket_w;而驱动上层read接口,则是从这个循环buffer队列中读,对应的读下标为:iPacket_r,并且这个读写下标都不是反卷的,都是线性增长,当需要使用反卷的效果时,只需要执行如下操作即可:btsco.pRX->iPacket_w/iPacket_r & SCO_RX_PACKET_MASK

  1. typedef struct

  2. {

  3. kal_uint8 PacketBuf[SCO_RX_PACKER_BUF_NUM][SCO_RX_PLC_SIZE + BTSCO_CVSD_PACKET_VALID_SIZE];

  4. kal_bool PacketValid[SCO_RX_PACKER_BUF_NUM];

  5. kal_int32 iPacket_w;

  6. kal_int32 iPacket_r;

  7. kal_uint8 TempPacketBuf[BT_SCO_PACKET_180];

  8. kal_bool fOverflow;

  9. kal_uint32 u4BufferSize; //RX packetbuf size

  10. } BT_SCO_RX_T;

由于驱动read是在应用所在的线程,而蓝牙mcu子系统往这个循环buffer队列中写(对应函数:AudDrv_BTCVSD_ReadFromBT)则是在中断线程中,所以他们存在同步和竞争的关系。驱动通过如下成员来控制

  • 自旋锁:auddrv_BTCVSDRX_lock
  • 等待队列:BTCVSD_Read_Wait_Queue/BTCVSD_read_wait_queue_flag

由于是在中断中,所以必须使用spin_lock_irqsave、spin_unlock_irqrestore形式来锁住和释放该自旋锁。

类似的发送循环buffer对应的数据结构为:

  1. typedef struct

  2. {

  3. kal_uint8 PacketBuf[SCO_TX_PACKER_BUF_NUM][SCO_TX_ENCODE_SIZE];

  4. kal_int32 iPacket_w;

  5. kal_int32 iPacket_r;

  6. kal_uint8 TempPacketBuf[BT_SCO_PACKET_180];

  7. kal_bool fUnderflow;

  8. kal_uint32 u4BufferSize; //TX packetbuf size

  9. } BT_SCO_TX_T;

其中蓝牙的mcu子系统往这个循环buffer队列中读,对应的读下标为:iPacket_r;而驱动上层的write接口,则是从这个循环buffer队列中写,对应的写下表为:iPacket_w,同样这个读写下标都是线性增长的。当需要使用反卷的效果时,只需要执行如下操作即可:btsco.pTX->iPacket_w/iPacket_r & & SCO_TX_PACKET_MASK

由于驱动write是在应用所在的线程,而蓝牙mcu子系统从这个循环buffer队列中读(对应函数:AudDrv_BTCVSD_WriteToBT)则是在中断线程中,所以他们也存在同步和竞争的关系。驱动通过如下成员来控制

  • 自旋锁:auddrv_BTCVSDTX_lock
  • 等待队列:BTCVSD_Write_Wait_Queue/BTCVSD_write_wait_queue_flag

同样由于是在中断中,所以必须使用spin_lock_irqsave、spin_unlock_irqrestore形式来锁住和释放该自旋锁。

3 sco的接收流程

如下为read系统调用涉及的模块的数据流图,注意从receive package address register读出的地址只是一个偏移量,需要加上物理内存的开始地址对应的虚拟地址。

read的调用流程如下:

  1. AudDrv_btcvsd_read

  2. |------>read_size:(btsco.pRX->iPacket_w - btsco.pRX->iPacket_r) * (SCO_RX_PLC_SIZE + BTSCO_CVSD_PACKET_VALID_SIZE);

  3. |------>BTSCORX_ReadIdx_tmp:(btsco.pRX->iPacket_r & SCO_RX_PACKET_MASK) * (SCO_RX_PLC_SIZE + BTSCO_CVSD_PACKET_VALID_SIZE);

  4. |------>copy_to_user((void __user *)Read_Data_Ptr, (void *)((kal_uint8 *)btsco.pRX->PacketBuf + BTSCORX_ReadIdx_tmp), read_size)

  5. |--->wait_event_interruptible_timeout(BTCVSD_Read_Wait_Queue, BTCVSD_read_wait_queue_flag...) // if have not enough data available to read,then sleep on wait queue

中断处理中对应的read 系统调用对应的循环buffer的处理

  1. AudDrv_BTCVSD_IRQ_handler

  2. |---->uControl = *bt_hw_REG_CONTROL;

  3. |----> uPacketType = (uControl >> 18) & 0x7;

  4. |----> uPacketLength = (kal_uint32)btsco_PacketInfo[uPacketType][0];

  5. |---->uPacketNumber = (kal_uint32)btsco_PacketInfo[uPacketType][1];

  6. |---->uBufferCount_TX = (kal_uint32)btsco_PacketInfo[uPacketType][2];

  7. |---->uBufferCount_RX = (kal_uint32)btsco_PacketInfo[uPacketType][3];

  8. |---->AudDrv_BTCVSD_ReadFromBT(uPacketType, uPacketLength, uPacketNumber, uBufferCount_RX, uControl);

  9. |------>connsys_addr_rx = *bt_hw_REG_PACKET_R;

  10. |------>ap_addr_rx = (kal_uint32)BTSYS_SRAM_BANK2_BASE_ADDRESS + (connsys_addr_rx & 0xFFFF);

  11. |------>AudDrv_BTCVSD_DataTransfer(BT_SCO_DIRECT_BT2ARM, pSrc, btsco.pRX->TempPacketBuf, uPacketLength, uPacketNumber, btsco.uRXState);

  12. |------>memcpy(btsco.pRX->PacketBuf[btsco.pRX->iPacket_w & SCO_RX_PACKET_MASK], btsco.pRX->TempPacketBuf + (SCO_RX_PLC_SIZE * i), SCO_RX_PLC_SIZE);

  13. |------>btsco.pRX->iPacket_w++;

  14. |---->*bt_hw_REG_CONTROL &= ~BT_CVSD_CLEAR;

  15. |---->BTCVSD_read_wait_queue_flag = 1;

  16. |---->wake_up_interruptible(&BTCVSD_Read_Wait_Queue);//alread received data from BT chip, so wake up read system call function to fetch data

4 sco的发送流程

write的调用流程如下:

  1. AudDrv_btcvsd_write

  2. |------>copy_size = btsco.pTX->u4BufferSize - (btsco.pTX->iPacket_w - btsco.pTX->iPacket_r) * SCO_TX_ENCODE_SIZE; // free space of TX packet buffer

  3. |------>BTSCOTX_WriteIdx = (btsco.pTX->iPacket_w & SCO_TX_PACKET_MASK) * SCO_TX_ENCODE_SIZE;

  4. |------>copy_from_user((void *)((kal_uint8 *)btsco.pTX->PacketBuf + BTSCOTX_WriteIdx), (const void __user *)data_w_ptr, copy_size)

  5. |------>btsco.pTX->iPacket_w += copy_size / SCO_TX_ENCODE_SIZE;

  6. |------>BTCVSD_write_wait_queue_flag = 0;

  7. |------>wait_event_interruptible_timeout(BTCVSD_Write_Wait_Queue, BTCVSD_write_wait_queue_flag, ...)//if have not enough space available to write,then sleep on wait queue

中断处理中对应的write系统调用对应的循环buffer的处理

  1. AudDrv_BTCVSD_IRQ_handler

  2. |---->uControl = *bt_hw_REG_CONTROL;

  3. |---->uPacketType = (uControl >> 18) & 0x7;

  4. |---->uPacketLength = (kal_uint32)btsco_PacketInfo[uPacketType][0];

  5. |---->uPacketNumber = (kal_uint32)btsco_PacketInfo[uPacketType][1];

  6. |---->uBufferCount_TX = (kal_uint32)btsco_PacketInfo[uPacketType][2];

  7. |---->uBufferCount_RX = (kal_uint32)btsco_PacketInfo[uPacketType][3];

  8. |---->AudDrv_BTCVSD_WriteToBT

  9. |--->memcpy((void *)(btsco.pTX->TempPacketBuf + (SCO_TX_ENCODE_SIZE * i)), (void *)(btsco.pTX->PacketBuf[btsco.pTX->iPacket_r & SCO_TX_PACKET_MASK]), SCO_TX_ENCODE_SIZE);

  10. |--->btsco.pTX->iPacket_r++;

  11. |--->connsys_addr_tx = *bt_hw_REG_PACKET_W;

  12. |--->pDst= (kal_uint32)BTSYS_SRAM_BANK2_BASE_ADDRESS + (connsys_addr_tx & 0xFFFF);

  13. |--->AudDrv_BTCVSD_DataTransfer(BT_SCO_DIRECT_ARM2BT, btsco.pTX->TempPacketBuf, pDst, uPacketLength, uPacketNumber, btsco.uTXState);

  14. |----> *bt_hw_REG_CONTROL &= ~BT_CVSD_CLEAR;

  15. |---->BTCVSD_write_wait_queue_flag = 1;

  16. |---->wake_up_interruptible(&BTCVSD_Write_Wait_Queue);//already have free space for write syscall, so w

mtk8127 bt sco 路径相关推荐

  1. 【简易搭建个人博客】------- 基于BT面板的个人博客搭建

    第三天笔记 时间:1月10日 BT面板 CentOs下载BT面板 yum install -y wget && wget -O install.sh http://download.b ...

  2. 全志XR829 WIFI和BT模块在T7 Android8.1上调试

    1.电路图兼容速鼎WIFI和BT模块 2.涉及到的接口和管脚如下: WIFI涉及到的管脚: power管脚: VCC_WIFI(wlan_power)<---->aldo1 IO_VDD( ...

  3. BT功耗问题--连接蓝牙耳机后待机电流大

    问题描述: 在连接任意一款蓝牙耳机后, 平均电流20-30mA. 理清问题: 该问题从UART1 sleep log一直没有看到有效信息. sleep handler在发生问题时, 有全部释放. 但是 ...

  4. 理解 Audio 音频系统二 之 audioserver AudioPolicyService

    理解 Audio 音频系统二 之 AudioPolicyService 二.audioserver & AudioPolicyService + AudioPolicy 启动流程总结 1. A ...

  5. Android录音下————AudioRecord源码分析

    Android录音下----AudioRecord源码分析 文章目录 Android录音下----AudioRecord源码分析 一.概述 1.主要分析点 2.储备知识 二.getMinBufferS ...

  6. BlueDroid源码详细分析

    1.整体架构 1.1 名词解释 HAL :HardwareAbstraction Layer Btif :Bluetoothinterface Bta :Bluetoothapplication Bt ...

  7. Android Audio代码分析(2): AudioPoilicyService 启动

    policy: 设备的选择 https://www.cxyzjd.com/article/VNanyesheshou/115659838 Android 音频源码分析--AudioTrack设备选择_ ...

  8. 8.0audio设置

    作者:m0_37437363 来源:CSDN 原文:https://blog.csdn.net/m0_37437363/article/details/78923588 最近Android8.0,遇到 ...

  9. Android音频框架之一 详解audioPolicy流程及HAL驱动加载与配置

    前言 此音频架构梳理笔记.主要是因工作上需要在 Android8.1 以上版本中,增加 snd-aloop 虚拟声卡做前期准备工作, 本篇文章提纲挈领的把音频框架主线梳理清晰,通过这篇文章能够清晰如下 ...

最新文章

  1. 数据结构基础温故-6.查找(下):哈希表
  2. 字节跳动 EB 级 HDFS 实践
  3. AB1601移植二维码编码库注意事项
  4. SNF平台从sql server兼容oracle的处理方式和开发方式
  5. invoke 按钮点击_h5+ app内点击按钮实现复制功能 实现方法
  6. 又是一种用于JavaScript的前端国际化方案
  7. c# mysql 中文,c#操作mysql中文乱码的解决方案_c#应用
  8. Linux学习笔记1-在CentOS 7中安装配置JDK8
  9. 如何高级地对抗恶意程序的糖衣炮弹?
  10. oki5530sc打印错误_OKI5530sc调整方法
  11. julia的安装以及三个报错解决(包安装、dot函数无定义、定义变量无法在循环中使用)
  12. mysql查询时间监控_监控长时间运行的查询(监控数据库性能的SQL )
  13. apply update from sdcard
  14. Django-(6)
  15. Linux文件加密系统-eCryptfs
  16. Ambari界面介绍
  17. 企业挖角 AI 教授是不是「原罪」?
  18. 数字后端概念——Via
  19. 关键词优化-关键词优化工具-关键词优化软件免费
  20. 视频文件格式解析之 3GP/MP4 .

热门文章

  1. Solver 配置详解
  2. java 微信定位到市_java 微信公众号地理位置获取
  3. 手机内存跟电脑内存的区别
  4. 【CXY】JAVA基础 之 Runtime
  5. python爬虫--爬取链家租房信息
  6. 搜索凑单页大促显示延迟方案设计
  7. js+css3实现鼠标控制图片旋转实现方向舵效果
  8. mac电脑使用普通键盘截图,全选,拷贝(复制),移动文件的快捷键是什么?
  9. linux temp文件夹在哪_手机文件夹是英文不敢乱删?找出这5个文件夹,手机瞬间轻松6个G...
  10. 【方便的Opencv】实现图片合成视频+附带图片生成gif