内核中line discipline的注册流程以及BT hciattach进程的启动

2023-10-27

以hci_ldisc.c为例,梳理内核中线路规程的注册流程
我们的N_HCI的注册过程如下:
bluetooth/hci_ldisc.c
     module_init(hci_uart_init);
           tty_register_ldisc(N_HCI, &hci_uart_ldisc) //hci_uart_ldisc包含N_HCI线路规程的一系列回调
drivers/tty/tty_ldisc.c
int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)
     tty_ldiscs[disc] = new_ldisc;  //将线路规程操作,保存到全局数组
     new_ldisc->num = disc;
     new_ldisc->refcount = 0;
这样,用户就可以通过调用IOCTL的TIOSETD命令,来设置该规程
以hciattach为例:
hciattach进程的启动
以a20 4.1 realtek为例:
init.sun6i.rc:
# 3. realtek rtl8723as bt hciattach
service hciattach /system/bin/logwrapper /system/bin/hciattach -n -s 115200 /dev/ttyS1 rtk_h5 1500000
   user root
   group bluetooth net_bt_admin
   disabled
   oneshot
hciattach的代码位于:
external/bluetooth/bluez/tools/hciattach.c
external/bluetooth/bluez/tools/hciattach_rtk.c
hciattach.c
      main
          首先,解析参数,这个参数决定了用那一套uart接口。
          { "rtk_h5",     0x0000, 0x0000, HCI_UART_3WIRE, 115200, 1500000, FLOW_CTL,0, NULL, realtek_init, realtek_post},
          n = init_uart(dev, u, send_break, raw); // 初始化uart dev=/dev/ttyS1 u为rtk_h5这套参数,
               int fd = open(dev, O_RDWR | O_NOCTTY);  //打开串口
               u->init(fd, u, &ti);//调用回调初始化函数
                    rtk_init_h5(fd, ti); //做下载firmware的准备工作
                    rtk_config(fd, proto, speed, ti); //下载蓝牙firmware
               set_speed(fd, &ti, u->init_speed);//设置初始波特率 115200
               int i = N_HCI;
               ioctl(fd, TIOCSETD, &i);//设置tty为N_HCI线路规程
               ioctl(fd, HCIUARTSETPROTO, u->proto); //设置为HCI_UART_3WIRE
               u->post(fd, u, &ti);//调用回调函数post,//设置高速模式
内核对TIOSETD的处理
在drivers/tty/tty_io.c种,处理TIOSETD
long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)  //tty设备的IOCTL回调处理函数
     return tiocsetd(tty, p);   //设置线路规程
          return tty_set_ldisc(tty, ldisc);  //tty = N_HCI
drivers/tty/tty_ldisc.c
int tty_set_ldisc(struct tty_struct *tty, int ldisc)
     struct tty_ldisc *new_ldisc = tty_ldisc_get(ldisc); //讲N_HCI转换为tty_ldisc的数据结构,其中包含ops回调,其实就是通过N_HCI作为索引在一个tty_ldisc数组中取出相应的item,这个tty_ldisc数组,就是hci_uart_ldisc,上面讲了,是通过通过int tty_register_ldisc(int disc, struct tty_ldisc_ops *new_ldisc)注册。
     work = tty_ldisc_halt(tty);//终止原来线路规
     tty_ldisc_assign(tty, new_ldisc);
     tty_set_termios_ldisc(tty, ldisc);  //设置新的线路规程
     tty_ldisc_open(tty, new_ldisc);  //调用hci_uart_ldisc的open回调,做一些清空buffer等初始化工作
     tty->ops->set_ldisc(tty);  //调用hci_uart_ldisc设置到tty_struct中去
对HCIUARTSETPROTO的处理
现在,刚刚的串口设备已经使用了新的线路规程,它将处理HCIUARTSETPROTO命令,但是在/drivers/tty/tty_io.c中,如果发现该CMD处理不了,就调用对应线路规程的ops中的ioctl来处理:
long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
     ld->ops->ioctl(tty, file, cmd, arg); //调用到hci_uart_ldisc中的hci_uart_tty_ioctl函数
hci_ldisc.c
hci_uart_tty_ioctl
     hci_uart_set_proto(hu, arg);//arg = HCI_UART_3WIRE
          struct hci_uart_proto *p = hci_uart_get_proto(id);//获取hci协议,里面包含一系列open等回调。
               其实这里,就是根据id作为索引,获取hci_uart_proto数组的一个item,这些item,通过hci_uart_register_proto来注册填充。
          p->open(hu);  //调用对应open接口,将对应的proto回调保存到hci_uart结构中
          hci_uart_register_dev(hu);//注册该hci设备
               struct hci_dev *hdev; 构造一个hci_dev结构,填入hci_uart相关回调。
               hci_register_dev(hdev);//注册设备
                    //首先遍历当前所有hci设备,这些设备都保存到一个全局数组hci_dev_list,获取hci设备的后缀id
                    sprintf(hdev->name, "hci%d", id);//保存名字
                    hci_register_sysfs(hdev);//在sys文件系统中,注册一个设备节点。
                         
                    hdev->rfkill = rfkill_alloc(hdev->name, &hdev->dev,
                           RFKILL_TYPE_BLUETOOTH, &hci_rfkill_ops, hdev); 
                    rfkill_register(hdev->rfkill); //注册rfkill节点
到目前为止,hci0已经注册好了,android层的bluez可以通过AF_BLUETOOTH访问,获取HCI信息了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内核中line discipline的注册流程以及BT hciattach进程的启动 的相关文章

  • 运行低于 Lollipop 的设备上的 CameraManager

    我遇到一个问题 我同时使用 Camera 低于 Lollipop 设备 和 CameraManager 类 Lollipop 及以上设备 运行低于 Lollipop 的设备会崩溃 我相信这是因为 import android hardwar
  • 如何获取firebase数据库中所有孩子的数据?

    我有这个 firebase 数据库 我需要获取用户的所有电话号码 我应该使用哪个侦听器来获取所有孩子 每个用户都作为一个对象添加 其中用户 ID 作为该对象的名称 我需要在不知道用户 ID 的情况下检索该对象 我搜索了文档 它与DataSn
  • 使用意图过滤器从 URL 打开 Android 应用程序不起作用

    我有一个 Android 应用程序 人们用它来替代网站 因此 当用户遇到网站的 URL 时 我想为他们提供在我的应用程序中而不是在浏览器中 打开 URL 的选项 换句话说 我希望出现弹出窗口 让他们在我的应用程序和浏览器 可能还有其他应用程
  • android 无法解析方法 setcontentview

    今天在android studio 中遇到了一个错误 我正在尝试在应用程序中创建一个关于我们的屏幕 布局 xml 文件已创建 任何帮助表示赞赏 谢谢 错误 无法解析方法 setcontentview int package example
  • Android studio总是乱码

    I have change the encode to UTF 8 so I got this problem who can help me I reinstalled it twice but android studio1 4 Alw
  • Android:如何检测双击?

    我在实现双击时遇到问题 好吧 我实施了onGestureListener我有gestureDetector 但我不确定问题出在哪里 这是我的代码 public class home extends TabActivity implement
  • 向 Android 操作栏添加按钮

    我如何制作带有文本的按钮 在操作栏中带有图像 如下所示 是否可以使用内置的 android 按钮或图像按钮在操作栏中执行如下操作 我正在使用 appcompat 来使用操作栏 是的 如果需要 您可以膨胀自定义操作栏 Override pro
  • 如何判断手机是否有刘海

    如果存在缺口 我需要修改应用程序的工具栏 现在 该凹口隐藏了工具栏中的一些内容 if Build VERSION SDK INT Build VERSION CODES LOLLIPOP Build VERSION SDK INT Buil
  • 使用 Android 解析 JSON 的最有效方法

    我编写了一些代码来解析我的 Android 程序收到的 Google 距离矩阵 JSON 响应 我唯一感兴趣的数据是 距离 值 节点 我的代码可以工作 但似乎必须有一种更简单的方法来做到这一点 距离值节点在 JSON 中嵌套得很深 但是真的
  • Android - 使用 Intent 打开 PDF 文档关闭后不保存

    我面临的问题是 当尝试保存对使用此 URI 打开的 PDF 文档的更改时内容 xx xxx xxx fileprovider external Download Sync FileName pdf 我所做的任何更改在关闭文档后都不会保存 但
  • 在 Android 中启用展开布局时,如何默认使用折叠布局显示自定义通知

    当用户折叠或展开通知时 我想通过支持小型和大型布局来显示我的自定义通知 如上面的屏幕截图所示 但结果它默认显示扩展通知 我想默认将其显示为折叠通知 并且仅在用户展开时显示展开通知 请检查我的代码如下 private fun initCust
  • Java 内存错误:无法创建新的本机线程

    运行 java 服务器时 我在 UNIX 服务器上收到此错误 Exception in thread Thread 0 java lang OutOfMemoryError unable to create new native threa
  • Android 视图可见性消失

    如果我设置了一个视图可见性 它被夸大了 消失了 它会加快我的 UI 速度吗 它将加快 UI 的实际绘制速度 因为 好吧 您不必再绘制它 但它仍然会膨胀 并且膨胀过程不会更快
  • SpannableString 中的 URLSpan

    我正在使用这个例子SpannableString http developer android com resources samples ApiDemos src com example android apis text Link ht
  • 在linux中将包含word的行从一个文件复制到另一个文件

    我想复制包含某些单词的行file1 to file2 Suppose file1 ram 100 ct 50 gopal 200 bc 40 ravi 50 ct 40 krishna 200 ct 100 file2应该只有包含 ct 的
  • 选择活动时运行时崩溃

    首先我想说我几乎没有 Android 经验 这是我在 Android 中的第一个项目 而且我的老师不太擅长教学 所以我对任何过度的无知表示歉意 在进一步讨论之前先解释一下 我的应用程序的目标本质上是能够记录您在某些活动上花费了多少时间 记录
  • 我可以在“com.android.vending.BILLING”中使用“uses-feature”而不是“uses-permission”吗?

    在我的应用程序的 AndroidManifest xml 中 我目前有
  • RecyclerView 来自 Firebase 的部分和数据

    您好 我正在开发一个应用程序 在其中我必须使用 Firebase 填充数据回收器视图 准备就绪 现在我想做的是用 data firebase 填写一个 recyclerview 但有一些部分将成为托管 data firebase 的父级 我
  • 如何在 Android 中通过 gradle 列出 buildConfig 中的所有类型

    这是一个简单的 gradle 具有三种风格 apply plugin com android application android compileSdkVersion 23 buildToolsVersion 23 0 2 default
  • Android 通知上有按钮

    我正在尝试使用 2 个按钮发出通知 一个带我回到活动 另一个将其关闭 有谁知道如何捕获按钮单击事件 请记住活动已暂停 我很高兴发布它 经过一夜的工作 我发现了一些东西 那么 我们开始吧 1 为您的通知创建 xml 布局文件 2 使用Noti

随机推荐

  • centos7编译源码安装nginx

    1 安装依赖 yum y install gcc zlib zlib devel pcre devel openssl openssl devel 下面说说这些依赖 gcc 因为nginx是由c编写的 GCC GNU Compiler Co
  • MDST研究(Python代码实现)

    个人主页 研学社的博客 欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现 1 概述 本文讲解MDST及
  • 程序翻译的过程,linux环境下处理,生成 .i、.s、.o 文件(预处理、编译、汇编、链接)

    1 程序翻译的过程有四个步骤 预处理 gt 编译 gt 汇编 gt 链接 那么每个步骤是干什么 预处理阶段 处理 gt 头文件 宏替换 条件编译等等 我用 linux 环境查看一下 如下 首先写一个简单的 c 文件 里面包含宏替换 头文件
  • CUDA 内存不足如何解决?

    很多小伙伴在跑pytorch的项目的时候可能会出现CUDA内存不足的情况 或者在使用GPU的时候明明显存充足却一直显示显存不足的情况 这个时候我们要怎么解决呢 接下来就来看看小编是怎么解决的吧 小编复现大佬project发现GPU跑不动 出
  • 10大主流压力/负载/性能测试工具推荐

    在移动应用和Web服务正式发布之前 除了进行必要的功能测试和安全测试 为了保证互联网产品的服务交付质量 往往还需要做压力 负载 性能测试 然而很多传统企业在试水互联网 的过程中 往往由于资源或产品迭代速度等原因忽视了这一块工作 导致新产品上
  • GCP Compute Logging and Montioring, Lab

    最后更新2022 03 18 这个lab是实现logging的 起始依然是创建engine 一个是vm 另一个是gke cluster 创建gke cluster时需要设置enable logging 没看到 有时间时再再创建一遍 找一下位
  • 开平方算法的C++实现

    开方算法的设计与实现 问题 求解非线性方程 x 2 c
  • 如何防止http请求数据被篡改

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 故事的开始 面试官问了我一个问题 如何防止http请求中数据被篡改 回答 1 设置客户端IP黑 白名单 1 1 客户端所有请求 请求到代理服务器 nginx 代理服务器维护
  • 永恒之蓝 ms17_010漏洞

    复现环境 攻击机 Linux kali 192 168 119 128 靶机 Windows 7 x64 192 168 119 129 实验条件 两台机子可以相互ping通 并且靶机 无补丁 开启了445端口 防火墙是关闭的 关闭防火墙
  • TOP10. 合成复用原则——面向对象设计原则

    合成复用原则是面向对象设计原则的 7 条原则中剩下的最后一条 下面我们将对其进行详细地介绍 合成复用原则的定义 合成复用原则 Composite Reuse Principle CRP 又叫组合 聚合复用原则 Composition Agg
  • java延迟周期循环定时器样例

    package util import java text NumberFormat import java text ParseException import java text SimpleDateFormat import java
  • SmartFusion从FPGA到ARM(二)——MSS_GPIO外部中断和输入

    文章目录 前言 预期效果 0 MSS GPIO相关的函数 1 MSS GPIO模式配置 2 GPIO检测和控制实现 3 FPGA工程编译和运行 系列教程 SmartFusion从FPGA到ARM系列教程 前言 关于片上MCU基本外设的使用
  • oracle insert into values 多条_干货

    数据库技术 前言 一 数据库发展史 1 1 程序管理阶段 1 2 文件系统阶段 1 3 数据库系统阶段 二 数据库专业术语 2 1 关系 2 2 元组 2 3 属性 三 数据库及连接工具介绍 3 1 Oracle数据库介绍 3 2 连接工具
  • C++采用Daemon进行后台程序的部署

    文章目录 一 如何采用Daemon进行后台程序的部署 1 创建子进程 2 终止父进程 3 创建新的会话 4 改变当前工作目录 5 重设文件权限掩码 6 关闭不需要的文件描述 二 代码示例 一 如何采用Daemon进行后台程序的部署 在C 中
  • 了解新的GPT4代码生成器Cursor

    Cursor so 一个MIT大佬的作品 匆匆上线 我使用时版本是0 1 3 可以预见这样的软件将在未来产生巨大的影响 不禁让人思考程序员的可替代性在哪里 国内速度极快 生成代码的速度几乎比一些主流SEO搜索引擎还要快 不需要科学工具即可使
  • 网络编程面试题

    转载自 https blog csdn net ThinkWon article details 104903925 TCP IP网络模型 计算机与网络设备要相互通信 双方就必须基于相同的方法 比如 如何探测到通信目标 由哪一边先发起通信
  • 【小程序案例】支付宝小程序-MQTT模器,IoT设备通过WSS接入阿里云IoT物联网平台——设备接入类

    支付宝小程序 MQTT模拟器通过WSS接入阿里云IoT物联网平台 小程序效果 1 准备工作 1 1 注册阿里云账号 开通阿里云账号 并通过支付宝实名认证 https www aliyun com 1 2 免费开通IoT物联网套件 产品官网
  • Allegro如何制作封装

    非常详细的Allegro封装制作步骤 这里以制作SOP8封装为例进行讲解 1 利用PadDesigner制作焊盘 在Parameters选项卡输入焊盘的参数 输入各参数如下图所示 在Layers选项卡输入所要建立焊盘的参数 完成后点击保存
  • linux查看服务依赖关系,服务管理(1)

    原标题 服务管理 1 服务管理 什么是服务 在linux系统中 有一些特殊程序 启动后就会持续在后台执行 等待用户或者其他软件调用使用 这种程序我们称为服务 systemV与init systemV systemV当中有一个叫init的程序
  • 内核中line discipline的注册流程以及BT hciattach进程的启动

    以hci ldisc c为例 梳理内核中线路规程的注册流程 我们的N HCI的注册过程如下 bluetooth hci ldisc c module init hci uart init tty register ldisc N HCI h