精华内容
下载资源
问答
  • USB ID 传输数据原理

    千次阅读 2019-08-05 16:19:56
    USB引脚一般四根线,定义如下: 为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚) A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时 B设备端ID脚悬空,默认上拉为高电平,则初始...

    转载请标注原文地址:http://blog.csdn.net/uranus_wm/article/details/9838847

     

    一 USB引脚一般四根线,定义如下:


    为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚)

    A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时

    B设备端ID脚悬空,默认上拉为高电平,则初始状态为Device,例如U盘和支持OTG设备做从设备时

    1. 移动设备如需支持OTG,内部ID引脚需要默认上拉为高

    2. VBUS是输入输出双向引脚。对于Device是power supply输入脚;对于Host需要串一个5V电源输出给device。


    二 USB插入检测过程,看下面一个简单电路,Samsung Exynos4412平台:


    电路描述:CON1为micro usb连接器,VBUS连接系统XuotgVBUS脚,同时提供一个中断输出脚到XEINT28

    同时外部一个DC5V经过控制芯片也输出到XuotgVBUS,作为host时需要用到给外部供电

    ID脚上拉1.8V作为Host/Slave检测,同时提供另一个中断输入脚到XEINT29

     

    该设备支持OTG,下面说下设备的发现过程:

    作为从设备插入PC端口时:

    1.  系统检测到VBUS上的XEINT28上升沿触发中断,因为PC端会有一个5V从VBUS给过来,进入中断处理函数进一步确认ID脚状态,ID脚为低则状态错误,ID脚为高表示设备应该切换到从设备模式

    2. 通知usb gadget使能vbus,按照device模式使能PHY。gadget在probe时注册了一个SPI软中断IRQ_USB_HSOTG,用于响应数据接收

    3. 开启usb clk,使能PHY,此时外部5V电源供给系统XuotgVBUS,gadget收到IRQ_USB_HSOTG中断要求重启OTG core

    4. USB DP(高速设备为DP,低速设备为DM)上产生一个高电平脉冲,此时PC识别到一个USB设备插入,windows会提示用户

    5. 后续就是SETUP,GET DISCRIPTOR的过程

     

    作为主设备发现设备插入时:

    1. 系统检测到ID脚上XEINT29下降沿触发中断(实际是插入的usb公口第四脚直接连接到第五脚地上面),进入中断处理,切换到主设备模式

    2. 关中断,使能DC5V给VBUS上电,唤醒ehci与ohci

    3. usb core在内核初始化时注册了一个名为khubd的内核线程,由khubd监控port event。(实际过程我理解是从设别由VUBS供电后,会在DP或DM上产生一个高电平脉冲

    ehci在接收到脉冲信号后识别到设备插入,仅仅是理解,这一点未验证)

    3. khubd获取port,speed后交给ehci,接下来就是usb的SETUP,GET DISCRIPTOR过程


    @[TOC](这里写自定义目录标题)

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    新的改变

    我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

    1. 全新的界面设计 ,将会带来全新的写作体验;
    2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
    3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
    4. 全新的 KaTeX数学公式 语法;
    5. 增加了支持甘特图的mermaid语法1 功能;
    6. 增加了 多屏幕编辑 Markdown文章功能;
    7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
    8. 增加了 检查列表 功能。

    功能快捷键

    撤销:Ctrl/Command + Z
    重做:Ctrl/Command + Y
    加粗:Ctrl/Command + B
    斜体:Ctrl/Command + I
    标题:Ctrl/Command + Shift + H
    无序列表:Ctrl/Command + Shift + U
    有序列表:Ctrl/Command + Shift + O
    检查列表:Ctrl/Command + Shift + C
    插入代码:Ctrl/Command + Shift + K
    插入链接:Ctrl/Command + Shift + L
    插入图片:Ctrl/Command + Shift + G

    合理的创建标题,有助于目录的生成

    直接输入1次#,并按下space后,将生成1级标题。
    输入2次#,并按下space后,将生成2级标题。
    以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

    如何改变文本的样式

    强调文本 强调文本

    加粗文本 加粗文本

    标记文本

    删除文本

    引用文本

    H2O is是液体。

    210 运算结果是 1024.

    插入链接与图片

    链接: link.

    图片: Alt

    带尺寸的图片: Alt

    居中的图片: Alt

    居中并且带尺寸的图片: Alt

    当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

    如何插入一段漂亮的代码片

    博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

    // An highlighted block
    var foo = 'bar';
    

    生成一个适合你的列表

    • 项目
      • 项目
        • 项目
    1. 项目1
    2. 项目2
    3. 项目3
    • 一 USB引脚一般四根线,定义如下:

    为支持OTG功能,mini/micro usb接口扩展了一个ID引脚(第4脚)

    A设备端ID脚接地,则初始状态为Host,例如PC和支持OTG设备做主设备时

    B设备端ID脚悬空,默认上拉为高电平,则初始状态为Device,例如U盘和支持OTG设备做从设备时

    1. 移动设备如需支持OTG,内部ID引脚需要默认上拉为高

    2. VBUS是输入输出双向引脚。对于Device是power supply输入脚;对于Host需要串一个5V电源输出给device。

    二 USB插入检测过程,看下面一个简单电路,Samsung Exynos4412平台:

    电路描述:CON1为micro usb连接器,VBUS连接系统XuotgVBUS脚,同时提供一个中断输出脚到XEINT28

    同时外部一个DC5V经过控制芯片也输出到XuotgVBUS,作为host时需要用到给外部供电

    ID脚上拉1.8V作为Host/Slave检测,同时提供另一个中断输入脚到XEINT29

    该设备支持OTG,下面说下设备的发现过程:

    作为从设备插入PC端口时:

    1. 系统检测到VBUS上的XEINT28上升沿触发中断,因为PC端会有一个5V从VBUS给过来,进入中断处理函数进一步确认ID脚状态,ID脚为低则状态错误,ID脚为高表示设备应该切换到从设备模式

    2. 通知usb gadget使能vbus,按照device模式使能PHY。gadget在probe时注册了一个SPI软中断IRQ_USB_HSOTG,用于响应数据接收

    3. 开启usb clk,使能PHY,此时外部5V电源供给系统XuotgVBUS,gadget收到IRQ_USB_HSOTG中断要求重启OTG core

    4. USB DP(高速设备为DP,低速设备为DM)上产生一个高电平脉冲,此时PC识别到一个USB设备插入,windows会提示用户

    5. 后续就是SETUP,GET DISCRIPTOR的过程

    作为主设备发现设备插入时:

    1. 系统检测到ID脚上XEINT29下降沿触发中断(实际是插入的usb公口第四脚直接连接到第五脚地上面),进入中断处理,切换到主设备模式

    2. 关中断,使能DC5V给VBUS上电,唤醒ehci与ohci

    3. usb core在内核初始化时注册了一个名为khubd的内核线程,由khubd监控port event。(实际过程我理解是从设别由VUBS供电后,会在DP或DM上产生一个高电平脉冲

    ehci在接收到脉冲信号后识别到设备插入,仅仅是理解,这一点未验证)

    1. khubd获取port,speed后交给ehci,接下来就是usb的SETUP,GET DISCRIPTOR过程[ ] 计划任务
    • 完成任务

    创建一个表格

    一个简单的表格是这么创建的:

    项目 Value
    电脑 $1600
    手机 $12
    导管 $1

    设定内容居中、居左、居右

    使用:---------:居中
    使用:----------居左
    使用----------:居右

    第一列 第二列 第三列
    第一列文本居中 第二列文本居右 第三列文本居左

    SmartyPants

    SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

    TYPE ASCII HTML
    Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
    Quotes "Isn't this fun?" “Isn’t this fun?”
    Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

    创建一个自定义列表

    Markdown
    Text-to-HTML conversion tool
    Authors
    John
    Luke

    如何创建一个注脚

    一个具有注脚的文本。2

    注释也是必不可少的

    Markdown将文本转换为 HTML

    KaTeX数学公式

    您可以使用渲染LaTeX数学表达式 KaTeX:

    Gamma公式展示 Γ(n)=(n1)!nN\Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通过欧拉积分

    Γ(z)=0tz1etdt . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

    你可以找到更多关于的信息 LaTeX 数学表达式here.

    新的甘特图功能,丰富你的文章

    Mon 06Mon 13Mon 20已完成 进行中 计划一 计划二 现有任务Adding GANTT diagram functionality to mermaid
    • 关于 甘特图 语法,参考 这儿,

    UML 图表

    可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

    张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

    这将产生一个流程图。:

    链接
    长方形
    圆角长方形
    菱形
    • 关于 Mermaid 语法,参考 这儿,

    FLowchart流程图

    我们依旧会支持flowchart的流程图:

    Created with Raphaël 2.2.0开始我的操作确认?结束yesno
    • 关于 Flowchart流程图 语法,参考 这儿.

    导出与导入

    导出

    如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

    导入

    如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
    继续你的创作。


    1. mermaid语法说明 ↩︎

    2. 注脚的解释 ↩︎

    展开全文
  • Android使用usb线传输大文件笔记

    千次阅读 2019-04-21 00:54:46
    使用USB数据线连接PC端和Android端进行数据的交互 安卓设备通过USB接口实现与pc端的简单数据通信 Socket TCP/IP协议数据传输过程中的粘包和分包问题 【Android学习】socket长连接,数据粘包问题   由于客户应用...

    使用usb线传输大文件

    参考资料:

    1. 使用USB数据线连接PC端和Android端进行数据的交互
    2. 安卓设备通过USB接口实现与pc端的简单数据通信
    3. Socket TCP/IP协议数据传输过程中的粘包和分包问题
    4. 【Android学习】socket长连接,数据粘包问题

      由于客户应用使用的场景比较特殊。明确要求不能使用网络进行数据交互,所以不得不研究了一下使用usb通信这方面。原理就是当连上usb线后,通过socket进行数据通信。只不过android设备作为socket服务端,pc作为socket的客户端。pc端在与服务端建立连接之前需要使用adb命令设置转发端口(具体可参考参考资料1和参考资料2)。
      端口这玩意随便填,不跟别人冲突就行。

    adb shell am broadcast -a NotifyServiceStop
    adb forward tcp:9999 tcp:9000
    adb shell am broadcast -a NotifyServiceStart

    ##使用代码调用命令行
      如果想要完善android通过usb先进行数据交互,这里应该有不少的命令能用到,这里先记录一下调用命令的基本使用。

    import java.io.BufferedReader
    import java.io.InputStreamReader
    
    fun main() {
    
      //读取连接设备
      val process = Runtime.getRuntime().exec("adb devices")
      val devices = BufferedReader(InputStreamReader(process.inputStream))
      val stringBuilder = StringBuilder()
      var line: String? = null
      while (devices.readLine().apply { line = this } != null) {
        stringBuilder.append("$line\n")
      }
      println(stringBuilder.toString())
    
      //读取安装的应用
      val process2 = Runtime.getRuntime().exec("adb shell pm list packages")
      val packages = BufferedReader(InputStreamReader(process2.inputStream))
      val sb = StringBuilder()
      var line2: String? = null
      while (packages.readLine().apply { line2 = this } != null) {
        sb.append("$line2\n")
      }
      println(sb.toString())
    
    }
    

      打印结果如下图所示:
    在这里插入图片描述
      上面运行结果不错就是代码量有点多,用python简化一下就清晰不少。

    import subprocess
    
    if __name__ == '__main__':
        # 读取连接设备
        subprocess.call("adb devices", shell=True)
        # 读取安装的应用
        subprocess.call("adb shell pm list packages", shell=True)
    
    

    Android端

      Android端作为Socket的服务端,用来接收文件。为了防止分包的问题这里我定义了一个封包和解包方式。
    在这里插入图片描述
      在文件传输的时候,数据的收发都会以这种结构去发送或者接收。(实际情况下肯定跟这个不一样,我这为了方便携带参数用的就是json格式的数据)。理论上就是每次读取的字节大小都在携带信息中。如果在循环读取中有一次没有读满,那就把它应当读取的字节都读取出来,再循环下一次数据读取,省着出现粘包的现象。(byte也别设太大,要不内存溢出)

    package com.lyan.usbtestphone
    
    import android.annotation.SuppressLint
    import android.support.v7.app.AppCompatActivity
    import android.os.Bundle
    import android.os.Environment
    import android.os.Handler
    import com.blankj.utilcode.constant.PermissionConstants
    import com.blankj.utilcode.util.GsonUtils
    import com.blankj.utilcode.util.LogUtils
    import com.blankj.utilcode.util.PermissionUtils
    import com.blankj.utilcode.util.ToastUtils
    import kotlinx.android.synthetic.main.activity_main.*
    import java.io.*
    import java.net.ServerSocket
    import java.net.Socket
    
    class MainActivity : AppCompatActivity() {
    
        @SuppressLint("SetTextI18n")
        private val handler = Handler(Handler.Callback {
            when (it.what) {
                1 -> progressTv.text = "${it.obj}%"
            }
            false
        })
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            testBtn.setOnClickListener {
                startSocketServer { LogUtils.i("${Thread.currentThread().name} : $it") }
            }
        }
    
        private fun startSocketServer(callback: (name: Socket) -> Unit) = Thread {
            val file = File(Environment.getExternalStorageDirectory(), "copy.db3")
            if (file.exists()) {
                if (file.delete()) {
                    file.createNewFile()
                }
            } else {
                file.createNewFile()
            }
            ServerSocket(9000).apply {
                logI("移动服务端等待客户端的连接...")
                val client = this.accept()
                callback.invoke(client)
                val bufferedOutputStream = BufferedOutputStream(DataOutputStream(FileOutputStream(file)))
                val bufferedInputStream = BufferedInputStream(DataInputStream(client.getInputStream()))
                val tagBytes = ByteArray(6)
                val infoBytes = ByteArray(4)
                var hTag: String//标记头
                var fTag: String//标记尾
                var infoSize: Int//携带数据的一些信息
                var jsonBytes: ByteArray//携带数据的byte数组
                var sendInfoData: SendInfoData//解析后的携带信息
                var readBytes: ByteArray//真正传输的数据的byte数组
                var readSize: Int//真正传输的数据的byte长度
                while (true) {
    
                    val len = bufferedInputStream.read(tagBytes)
                    if (len == -1) {
                        break
                    }
                    hTag = String(tagBytes, 0, len)//标记头
                    //读取进度信息
                    infoSize = bufferedInputStream.read(infoBytes).run { bytesToInt(infoBytes) }
                    jsonBytes = ByteArray(infoSize)
                    sendInfoData = bufferedInputStream.read(jsonBytes).run {
                        val infoJson = when (infoSize) {
                            this -> {//读取数据完整
                                LogUtils.i("读取数据完整")
                                String(jsonBytes, 0, this)
                            }
                            else -> {//读取数据不完整(此处只要将分包处理后、粘包的问题自然就不会出现了)
                                LogUtils.i("读取数据不完整")
                                bufferedInputStream.read(jsonBytes, this, infoSize - this).run {
                                    String(jsonBytes, 0, infoSize)
                                }
                            }
                        }
                        LogUtils.i("其他信息 ------> $infoJson")
                        GsonUtils.getGson().fromJson(infoJson, SendInfoData::class.java)
                    }
                    handler.obtainMessage(1, sendInfoData.percent).sendToTarget()
                    //读取数据信息 传输数据大小 解析数据长度
                    readBytes = ByteArray(sendInfoData.sendSize)
                    readSize = bufferedInputStream.read(readBytes)//已读数据大小
                    LogUtils.i("读流的长度:$readSize")
                    if (readSize < sendInfoData.sendSize) {
                        LogUtils.w("读取数据不完整!已读数据少于应读取数据的大小……",
                                "应读:${sendInfoData.sendSize}", "实读:$readSize")
                        bufferedInputStream.read(readBytes, readSize, sendInfoData.sendSize - readSize)
                    }
                    fTag = bufferedInputStream.read(tagBytes).run { String(tagBytes, 0, this) }
                    LogUtils.w("header:$hTag", "携带信息的字节数:$infoSize", "携带信息内容:$sendInfoData",
                            "每次应读取的数据字节数量:${sendInfoData.sendSize}", "footer:$fTag")
                    bufferedOutputStream.write(readBytes)
                    bufferedOutputStream.flush()
                }
            }
        }.start()
    
        //请求权限(文件读写权限)
        override fun onResume() {
            super.onResume()
            PermissionUtils.permission(PermissionConstants.STORAGE).callback(object : PermissionUtils.SimpleCallback {
                override fun onGranted() {
                    ToastUtils.showShort("获取文件读写权限成功!")
                }
    
                override fun onDenied() {
                }
            }).request()
        }
    
        private fun bytesToInt(bytes: ByteArray): Int {
            return (0 until bytes.size).sumBy { (bytes[it].toInt() and 0xFF) shl it * 8 }
        }
    
        //每次接收数据的信息 进度 和 要保存的数据字节大小
        data class SendInfoData(val percent: String, val sendSize: Int)
    }
    
    

    pc端(正常应该是后台)

      在这种情况下后台就成客户端了。这里为了减少socket客户端的代码量,所以使用ptyhon来写:

    import subprocess
    import socket
    import time
    import copy
    import json
    import os
    
    
    class SendInfoData(object):
    
        def __init__(self, percent="", sendSize=0):
            self.__percent = percent
            self.__sendSize = sendSize
    
        def toJson(self):
            return json.dumps({
                "percent": self.__percent,
                "sendSize": self.__sendSize,
            })
    
    
    # int转byte数组
    def intToBytes(intNumber=0): return intNumber.to_bytes(4, "little")
    
    
    # str转utf-8 byte数组
    def strToUtf8Bytes(value): return bytes(value, encoding="utf-8")
    
    
    if __name__ == '__main__':
    
        subprocess.call("adb shell am broadcast -a NotifyServiceStop", shell=True)
        subprocess.call("adb forward tcp:9999 tcp:9000", shell=True)
        subprocess.call("adb shell am broadcast -a NotifyServiceStart", shell=True)
    
        client = socket.socket()
        result = client.connect(("127.0.0.1", 9999))
    
        # 文件路径
        filePath = "/Users/apple/Downloads/base.db3"
    
        # 文件大小
        allSize = os.path.getsize(filePath)
        fileSize = copy.deepcopy(allSize)
        print("%s\n" % fileSize)
        defaultReadSize = 1024 * 10
        progress = 0
    
        h = time.time()
        # 读取 文件
        with open(filePath, mode="rb") as readFile:
            while True:
                if fileSize <= 0: break
                readSize = defaultReadSize if fileSize > defaultReadSize else fileSize
                progress += readSize
                percent = '{: .2f}'.format(progress * 1.0 / allSize * 100)
                print("进度:%s" % percent)
                # 读取内容
                readBytes = readFile.read(readSize)
                if not readBytes: break
                tagH = strToUtf8Bytes("@tag:h")
                tagF = strToUtf8Bytes("@tag:f")
                # 携带信息
                infoJson = SendInfoData(percent, readSize).toJson()
                print("json:%s\n" % infoJson)
                infoBytes = strToUtf8Bytes(infoJson)
                infoSize = intToBytes(len(infoBytes))
                # 包裹传输数据
                client.send(tagH)  # 标记开头
                client.send(infoSize)  # 携带参数byte数据长度
                client.send(infoBytes)  # 携带参数内容
                client.send(readBytes)  # 真实传输的内容
                client.send(tagF)  # 标记结尾
                fileSize -= readSize
    
        client.close()
    
        f = time.time()
        print("用时:{: .0f}s".format((f - h)))
    
    

      这个例子的界面比较简单,就一个按钮和一个文本。手上测试的文件是一个900多兆的文件,在单位的时候试过一个4个多G的sqlite文件。而且文件在传输后一样可以正常使用。说明这个方式还是可行的。(当然在实际项目中这个例子仅仅是证明这个方式可行而已,具体优化部分肯定不带少的)
    在这里插入图片描述
    在这里插入图片描述

    笔记:byte[]未写满,补全的方式

      目的是验证,这里以读取文件的内容为例,文件是txt格式的这里放了一段字符串“一二三四五六七八九十”。一共是10字符(一个字符2个字节,也就是20个字节)。定义一个byte数组长度为20。先读一半,然后再读剩下的一半。

    import java.io.File
    import java.io.FileInputStream
    import java.nio.charset.Charset
    
    fun main() {
    
        val path = "/Users/apple/Downloads/O.txt"
        val file = File(path)
        val inputStream = FileInputStream(file)
        //available()这个方法本质的意义是 剩余未被读取的字节数量
        println("文件的字节总数:${inputStream.available()}")
    
        val byte = ByteArray(20)
    
        val read1 = inputStream.read(byte, 0, 10)
        println(read1)
        println("read1后剩余字节数量:${inputStream.available()}")
        val read1Msg = String(byte, 0, read1, Charset.forName("GBk"))
        println(read1Msg)
    
        inputStream.read(byte, 10, 20 - read1)
        println("read2后剩余字节数量:${inputStream.available()}")
        val read2Msg = String(byte, 0, byte.size, Charset.forName("GBk"))
        println(read2Msg)
    
    }
    

      这块结合Android端那段代码看正好(一旦索引那想不明白,真不如运行代码来的实在),运行结果如下。
    在这里插入图片描述

    展开全文
  • 有线投屏 通过usb数据线能实现设备间稳定的连接, 可以高速传输数据, 延迟低, 画面清晰, 适合游戏, 直播等场景iOS 有线镜像投屏原理MAC系统自带的 QuickTime Player 在插入Lighting 数据线时, 能实现iOS 屏幕...

    有线镜像投屏简介

    手机投屏到电脑分为无线和有线两种方式
    无线通过WiFi投屏,基本能实现高清,但是受限于网络速度, 延迟会比较高, 不适合玩游戏这种使用场景.
    有线投屏 通过usb数据线能实现设备间稳定的连接, 可以高速传输数据, 延迟低, 画面清晰, 适合游戏, 直播等场景

    iOS 有线镜像投屏原理

    MAC系统自带的 QuickTime Player 在插入Lighting 数据线时, 能实现iOS 屏幕镜像和录制, 如图所示:

    02164da25f91b0c6e78663193db4644b.png

    可以此为基础研究有线投屏的协议, 根据抓包并分析, 可以初步得到协议实现, 分成3个步骤:

    1. 启动投屏

    1. 启用隐藏设备配置
    2. 声明结束端点
    3. 等待接收 PING 数据包
    4. 使用 PING 数据包进行响应
    5. 等待 SYNC CWPA 数据包接收设备音频时钟的时钟
    6. 创建本地时钟,将时钟ref作为回复SYNC CWPA并发送
    7. 发送ASYN_HPD1
    8. 发送ASYN_HPA1与步骤 6 中收到的设备音频时钟
    9. 接收 SYNC AFMT,并回复零错误代码
    10. 使用设备视频时钟Ref接收 SYNC CVRP
    11. 使用本地视频时钟Ref进行回复
    12. 使用设备的视频时钟Ref开始发送 ASYN 需求
    13. 接收两个 ASYN 集属性
    14. 接收同步 Clok,并回复新创建的时钟
    15. 接收两个 SYNC 时间,并回复两个 CMTimes

    2. 接收数据

    视频和音频的数据包将由设备发送。我们需要定期发送视频的 NEED 数据包

    3. 关闭投屏

    1. 从 cwpa 同步数据包发送带有设备时钟ref 的 asyn hpa0,告诉设备停止发送音频
    2. 发送 hpd0 与空时钟Ref 停止视频
    3. 接收同步停止包,我们创建的视频时钟时,cvrp发送给我们,这是在每个馈送数据包
    4. 回复以 8 个零字节同步停止
    5. 接收本地视频时钟Ref的 ASYN RELS(在 FEED 数据包中找到的 ASYN RELS)
    6. 接收 SYNC CLOCK 后创建的本地时钟的 ASYN RELS
    7. 释放 usb 终结点
    8. 将设备活动配置设置为仅 usbmux

    具体的镜像协议细节点击访问 quicktime_video_hack , 包括一个go 语言的协议实现, 可以运行在Ubuntu 和 MacOS 平台.

    Android 有线镜像投屏原理

    Android系统的有线投屏有2种实现方式, 使用ADB 和 USBAccessory 方式. 缺点是, 不管哪种方式, 目前都不能投屏系统声音.

    使用 ADB 镜像投屏

    这种方式有个优秀代表 - scrcpy, 是genymobile开源的利用ADB工具实现画面投屏的项目:

    1. 打开手机的usb 调试即可投屏
    2. 可达到60fps 的镜像帧率
    3. 35-70ms 的低延时
    4. 可在电脑反向控制手机

    使用 USBAccessory 镜像投屏

    此方式的技术实现和adb 完全不一样, 主要基于 Android USBAccessory , 在两个设备间建立usb 传输通道, 手机端运行app 录屏传输数据至电脑

    展望

    投屏技术极大改进了设备互联互通, 华为和苹果都在此领域发力, 未来肯定会有更长远的发展.
    我们团队深耕投屏领域, 不仅实现了miracast 和airplay 无线投屏, 目前也完美实现了 iOS和android 的有线投屏.
    分享本文的技术资料, 只为了让有兴趣的人深入研究 , 实现低延时, 高可用, 秒级设备发现的投屏技术, 提升每个人的数字生活体验.

    展开全文
  • USB接口对于智能设备非常重要,其肩负着进行电能传输数据交换的任务。本文将为大家介绍USB端口中电源电路的原理,感兴趣的朋友快来看一看吧。  每台PC都有一个USB(通用串行 总线 )端口,它可以为外设提供500 ...
  • USB PCB布线经验

    千次阅读 2018-03-30 14:24:21
    由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题比如通讯不稳定或是无法...
    二维码是我创建的QQ群,欢迎新朋友加入。

    USB是一种快速、双向、同步传输、廉价、方便使用的可热拔插的串行接口。由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题

    比如通讯不稳定或是无法通讯,检查原理图和焊接都无问题,或许这个时候就需怀疑PCB设计不合理。绘制满足USB2.0数据传输要求的PCB对产品的性能及可靠性有着极为重要的作用。

    USB协议定义由两根差分信号线(D+、D-)传输数字信号,若要USB设备工作稳定差分信号线就必须严格按照差分信号的规则来布局布线。根据笔者多年USB相关产品设计与调试经验,总结以下注意要点:
    1. 在元件布局时,尽量使差分线路最短,以缩短差分线走线距离(√为合理的方式,×为不合理方式);
     

    2. 优先绘制差分线,一对差分线上尽量不要超过两对过孔(过孔会增加线路的寄生电感,从而影响线路的信号完整性),且需对称放置(√为合理的方式,×为不合理方式);
     

    3. 对称平行走线,这样能保证两根线紧耦合,避免90°走线,弧形或45°均是较好的走线方式(√为合理的方式,×为不合理方式);
     

    4. 差分串接阻容,测试点,上下拉电阻的摆放(√为合理的方式,×为不合理方式);

     


    5. 由于管脚分布、过孔、以及走线空间等因素存在使得差分线长易不匹配,而线长一旦不匹配,时序会发生偏移,还会引入共模干扰,降低信号质量。所以,相应的要对差分对不匹配的情况作出补偿,使其线长匹配,长度差通常控制在5mil以内,补偿原则是哪里出现长度差补偿哪里;
     
    展开全文
  • 由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题比如通讯不稳定或是无法...
  • 第五章 USB2.0布线及注意事项

    千次阅读 2019-07-04 10:22:09
    由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题,比如通讯不稳定或是...
  • 本文介绍USB4主机和USB设备的内部组成。USB4系统分为USB4主机和USB4设备...USB4数据依靠路由器来选择路径和传输,可以抽象成下图的模型。路由器分为主机路由器和设备路由器。 USB4数据传输结构 二、USB4系统架构 .
  • 2.7.5 关于USB 数据传输类型的说明 25-27 3 USB 协议分析 27-41 3.1 USB 传输的基本单元——包 27-37 3.1.1 包的组成——字段 27-30 3.1.2 包的类型 30-37 3.2 事务处理 37-41 3.2.1 IN 处理 37-39 ...
  • 由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题,比如通讯不稳定或是...
  • USB接口图和工作原理

    万次阅读 多人点赞 2017-06-10 16:31:19
    它只有4根线,两个电源(5V,地线),两个数据线(D+,D-)。,故信号是串行传输的,即按照传输时钟脉冲的节奏一位一位的传输usb接口也称为串行口。 usb接口的4根线一般是下面这样分配的,需要注意的是千万不要把正...
  • 由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题,比如通讯不稳定或是...
  • 2条用来传输数据(D+、D-) 1条是电源线(VBUS) 1条则是接地线(GND) 1条是ID线。ID线用于识别不同的电缆端点,当OTG设备检测到接地的ID引脚时,表示默认的是A设备(主机),而检测到ID引脚浮空的设备则认为是B...
  • 这里先简单列举USB2.0几个特性:双绞线、带电源、数据速率与传输频率无关、自同步(不需要单独传输时钟)、Token(令牌)轮询特性[1]。双绞线的特性使得USB天生具有抗共模干扰的能力,带供电使得它带的设备可以不...
  • 如果是自己画的原理和PCB要注意HREF等高频信号线的布局,尽量与数据线隔离,否则容易出现干扰;在原理设计上,HREF等高频信号尽量不要乱加电容,否则容易导致时序延时,收到的数据不对花屏。在不同STM单片机上移植时...
  • 有线投屏 通过usb数据线能实现设备间稳定的连接, 可以高速传输数据, 延迟低, 画面清晰, 适合游戏, 直播等场景 iOS 有线镜像投屏原理 MAC系统自带的 QuickTime Player 在插入Lighting 数据线时, 能实现iOS 屏幕镜像和...
  • USB是一种快速、双向、...USB协议定义由两根差分信号线(D+、D-)传输数字信号,若要USB设备工作稳定差分信号线就必须严格按照差分信号的规则来布局布线。根据笔者多年USB相关产品设计与调试经验,总结以下注意要点:
  • USB2.0 PCB布线关键与经验教训

    千次阅读 2015-09-07 13:14:09
    由于数据传输快,接口方便,支持热插拔等优点使USB设备得到广泛应用。目前,市场上以USB2.0为接口的产品居多,但很多硬件新手在USB应用中遇到很多困扰,往往PCB装配完之后USB接口出现各种问题,比如通讯不稳定或是...
  • 最近在开发板,操作过程中,领导说要把usb端口去掉,内心波动不止… 好在基础扎实,在同wifi情况下,已经搞过文件自动传输原理 同一WiFi情况下,数据可通过路由进行传递,并且不耗费流量,所以有时候可以远程给...
  • IIC、SPI、UART、USART、USB、CAN等通讯协议原理及区别

    千次阅读 多人点赞 2019-04-06 13:48:15
    Inter-Integrated Circuit ,它为两线式串行总线(SDA数据线、SCL时钟线),用于连接微控制器和外围设备、传输速度100-400kHz=400kbps(48.8KB/s),高速模式最高可达4MHz(488KB/s),非全双工 注意KB和kbps的区别:...
  • USB3.0简介3

    千次阅读 2012-10-11 13:34:49
    USB 2.0基于半双工二线制总线,只能提供单向数据传输,而USB 3.0采用了对偶单纯形四线制差分信号线,故而支持双向并发数据传输,也就是全双工总线模式,这是USB3.0传输速度猛增的关键原因。除此之外,USB 3.0还...
  • 高速模式下,USB支持实时的视频、音频和压缩的视频数据传输。  在视频会议和可视电话等多媒体应用中,具有数字接口摄像系统(CAMERA)是其关键的部件。它完成视频图像的采集、处理,并通过数字接口把信号送进...
  • 群控系统原理

    2021-01-09 10:25:31
    微信群控系统是通过usb线传输数据控制手机进行模拟操作的,而微信云控系统则是通过网络传输数据操作手机端。也就是从服务器下发命令到手机上,手机端执行各种模拟操作。 微信云控系统主要用到的技术有服务器推送...
  • 资料可了解基于FPGA和CYUSB3014组成USB3.0采集传输系统的一般电路原理,其充分发挥USB3.0芯片的特性,特将CYUSB3014芯片的所有数字IO与FPGA连接,包括32根数据线,13根控制线、4根I2S信号线以及UART线。CYUSB3014...
  • 而D+、D-用于USB数据传输。  D+、D-是一组差分信号,差分阻抗为90欧,具有极强的抗干扰性;若遭受外界强烈干扰,两条线路对应的电平会同时出现大幅度提升或降低的情况,但二者的电平改变方向和幅度几乎相同,所以...
  • 总线:即类似于USB线那样的传输数据线 一般很多设备连接到一条总线上,共用这一条总线传输数据 总线又分为片内总线和系统总线 片内总线即连接设备之间,让设备互相通信的线 系统总线即 即多个设备都连接的线 ...
  • rs232串口通信原理

    2010-07-25 09:13:48
    这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备...
  • 片内总线::芯片内部的总线,寄存器、运算器、控制器之间的信息传输线。 系统总线: 数据总线、地址总线、控制总线。 数据总线: 其中数据总线一般和cpu位数相同,数据总线是32位表示数据总线 一次可以传输32位的4个...
  • 本文阐述从分立逻辑器件测量炮口初速改装为应用CPLD测量炮速,提高了测量系统的集成度,且传输接口采用的是目前流行的串行高速数据传输接口USB 2.O接口技术。该接口具有操作方便、速度快的特点,其理论最大传输速度...

空空如也

空空如也

1 2 3 4 5
收藏数 87
精华内容 34
关键字:

usb数据线传输数据原理